diff options
169 files changed, 27186 insertions, 19945 deletions
@@ -1,6 +1,129 @@ + --- 9.5.0rc1 released --- + +2368. [port] Linux: use libcap for capability management if + possible. [RT# 18026] + +2367. [bug] Improve counting of dns_resstatscounter_retry + [RT #18030] + +2366. [bug] Adb shutdown race. [RT #18021] + +2365. [bug] Fix a bug that caused dns_acl_isany() to return + spurious results. [RT #18000] + +2364. [bug] named could trigger a assertion when serving a + malformed signed zone. [RT #17828] + +2363. [port] sunos: pre-set "lt_cv_sys_max_cmd_len=4096;". + [RT #17513] + +2362. [cleanup] Make "rrset-order fixed" a compile-time option. + settable by "./configure --enable-fixed-rrset". + Disabled by default. [RT #17977] + +2361. [bug] "recursion" statistics counter could be counted + multiple times for a single query. [RT #17990] + + --- 9.5.0b3 released --- + +2360. [bug] Fix a condition where we release a database version + (which may acquire a lock) while holding the lock. + +2359. [bug] Fix NSID bug. [RT #17942] + +2358. [doc] Update host's default query description. [RT #17934] + +2356. [bug] Builtin mutex profiler was not scalable enough. + [RT #17436] + +2355. [func] Extend the number statistics counters available. + [RT #17590] + +2354. [bug] Failed to initialise sone rdatasetheader_t elements. + [RT #17927] + +2353. [func] Add support for Name Server ID (RFC 5001). + 'dig +nsid' requests NSID from server. + 'request-nsid yes;' causes recursive server to send + NSID requests to upstream servers. Server responds + to NSID requests with the string configured by + 'server-id' option. [RT #17091] + +2352. [bug] Various GSS_API fixups. [RT #17729] + +2351. [bug] convertxsl.pl generated very long lines. [RT #17906] + +2350. [port] win32: IPv6 support. [RT #17797] + +2347. [bug] Delete now traverses the RB tree in the canonical + order. [RT #17451] + +2346. [func] Memory statistics now cover all active memory contexts + in increased detail. [RT #17580] + +2345. [bug] named-checkconf failed to detect when forwarders + were set at both the options/view level and in + a root zone. [RT #17671] + +2344. [bug] Improve "logging{ file ...; };" documentation. + [RT #17888] + +2343. [bug] (Seemingly) duplicate IPv6 entries could be + created in ADB. [RT #17837] + +2341. [bug] libbind: add missing -I../include for off source + tree builds. [RT #17606] + +2340. [port] openbsd: interface configuration. [RT #17700] + +2339. [port] tru64: support for libbind. [RT #17589] + +2338. [bug] check_ds() could be called with a non DS rdataset. + [RT #17598] + +2337. [bug] BUILD_LDFLAGS was not being correctly set. [RT #17614] + +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] + +2332. [contrib] query-loc-0.4.0. [RT #17602] + +2331. [bug] Failure to regenerate any signatures was not being + reported nor being past back to the UPDATE client. + [RT #17570] + +2330. [bug] Remove potential race condition when handling + over memory events. [RT #17572] + + WARNING: API CHANGE: over memory callback + function now needs to call isc_mem_waterack(). + See <isc/mem.h> for details. + +2329. [bug] Clearer help text for dig's '-x' and '-i' options. + +2328. [maint] Add AAAA addresses for A.ROOT-SERVERS.NET, + F.ROOT-SERVERS.NET, H.ROOT-SERVERS.NET, + J.ROOT-SERVERS.NET, K.ROOT-SERVERS.NET and + M.ROOT-SERVERS.NET. + +2327. [bug] It was possible to dereference a NULL pointer in + rbtdb.c. Implement deadnode processing in zones as + we do for caches. [RT #17312] + +2326. [bug] It was possible to trigger a INSIST in the acache + processing. + +2325. [port] Linux: use capset() function if available. [RT #17557] + --- 9.5.0b2 released --- -2324. [bug] Fix IPv6 matching against "any;" [RT #17533] +2324. [bug] Fix IPv6 matching against "any;". [RT #17533] 2323. [port] tru64: namespace clash. [RT #17547] @@ -133,7 +256,7 @@ 2275. [func] Add support to dig to perform IXFR queries over UDP. [RT #17235] -2274. [func] Log zone transfer statistics. [RT #17161] +2274. [func] Log zone transfer statistics. [RT #17336] 2273. [bug] Adjust log level to WARNING when saving inconsistant stub/slave master and journal files. [RT# 17279] @@ -189,7 +312,7 @@ 2256. [bug] win32: Correctly register the installation location of bindevt.dll. [RT #17159] -2255. [bug] L.ROOT-SERVERS.NET is now 199.7.83.42. +2255. [maint] L.ROOT-SERVERS.NET is now 199.7.83.42. 2254. [bug] timer.c:dispatch() failed to lock timer->lock when reading timer->idle allowing it to see @@ -2284,7 +2407,7 @@ 1568. [bug] nsupdate now reports that the update failed in interactive mode. [RT# 10236] -1567. [bug] B.ROOT-SERVERS.NET is now 192.228.79.201. +1567. [maint] B.ROOT-SERVERS.NET is now 192.228.79.201. 1566. [port] Support for the cmsg framework on Solaris and HP/UX. This also solved the problem that match-destinations @@ -2787,7 +2910,7 @@ 1398. [doc] ARM: notify-also should have been also-notify. [RT #4345] -1397. [bug] J.ROOT-SERVERS.NET is now 192.58.128.30. +1397. [maint] J.ROOT-SERVERS.NET is now 192.58.128.30. 1396. [func] dnssec-signzone: adjust the default signing time by 1 hour to allow for clock skew. @@ -1,6 +1,6 @@ Frequently Asked Questions about BIND 9 -Copyright © 2004-2007 Internet Systems Consortium, Inc. ("ISC") +Copyright © 2004-2008 Internet Systems Consortium, Inc. ("ISC") Copyright © 2000-2003 Internet Software Consortium. @@ -594,7 +594,12 @@ Q: I get the error message "named: capset failed: Operation not permitted" when starting named. A: The capability module, part of "Linux Security Modules/LSM", has not - been loaded into the kernel. See insmod(8). + been loaded into the kernel. See insmod(8), modprobe(8). + + The relevant modules can be loaded by running: + + modprobe commoncap + modprobe capability Q: I'm running BIND on Red Hat Enterprise Linux or Fedora Core - @@ -699,6 +704,18 @@ 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: Listening on individual IPv6 interfaces does not work. + +A: This is usually due to "/proc/net/if_inet6" not being available in the + chroot file system. Mount another instance of "proc" in the chroot file + system. + + This can be be made permanent by adding a second instance to /etc/ + fstab. + + proc /proc proc defaults 0 0 + proc /var/named/proc proc defaults 0 0 + 4.3. Windows Q: Zone transfers from my BIND 9 master to my Windows 2000 slave fail. @@ -1,7 +1,7 @@ <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" []> <!-- - - Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + - Copyright (C) 2004-2008 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,7 +17,7 @@ - PERFORMANCE OF THIS SOFTWARE. --> -<!-- $Id: FAQ.xml,v 1.30 2007/11/02 00:25:41 marka Exp $ --> +<!-- $Id: FAQ.xml,v 1.30.26.3 2008/02/25 05:08:10 marka Exp $ --> <article class="faq"> <title>Frequently Asked Questions about BIND 9</title> @@ -27,6 +27,7 @@ <year>2005</year> <year>2006</year> <year>2007</year> + <year>2008</year> <holder>Internet Systems Consortium, Inc. ("ISC")</holder> </copyright> <copyright> @@ -1064,7 +1065,13 @@ client: UDP client handler shutting down due to fatal receive error: unexpected <answer> <para> The capability module, part of "Linux Security Modules/LSM", - has not been loaded into the kernel. See insmod(8). + has not been loaded into the kernel. See insmod(8), modprobe(8). + </para> + <para> + The relevant modules can be loaded by running: +<programlisting> +modprobe commoncap +modprobe capability</programlisting> </para> </answer> </qandaentry> @@ -1233,6 +1240,30 @@ named_cache_t: for files modifiable by named - $ROOTDIR/var/{tmp,named/{slaves,d </para> </answer> </qandaentry> + + <qandaentry> + <question> + <para> + Listening on individual IPv6 interfaces does not work. + </para> + </question> + <answer> + <para> + This is usually due to "/proc/net/if_inet6" not being available + in the chroot file system. Mount another instance of "proc" + in the chroot file system. + </para> + <para> + This can be be made permanent by adding a second instance to + /etc/fstab. + <informalexample> + <programlisting> +proc /proc proc defaults 0 0 +proc /var/named/proc proc defaults 0 0</programlisting> + </informalexample> + </para> + </answer> + </qandaentry> </qandadiv> <!-- Linux --> @@ -54,12 +54,16 @@ BIND 9.5.0 Experimental http server and statistics support for named via xml. + More detailed statistics counters including those supported in BIND 8. + Faster ACL processing. - Use Doxygen to generate internal documention. + Use Doxygen to generate internal documentation. Efficient LRU cache-cleaning mechanism. + NSID support (RFC 5001). + BIND 9.4.0 BIND 9.4.0 has a number of new features over 9.3, @@ -429,8 +433,6 @@ Building -DDIG_SIGCHASE_BU=1) Disable dropping queries from particular well known ports. -DNS_CLIENT_DROPPORT=0 - Disable support for "rrset-order fixed". - -DDNS_RDATASET_FIXED=0 LDFLAGS Linker flags. Defaults to empty string. @@ -466,6 +468,11 @@ Building on the configure command line. The default is operating system dependent. + Support for the "fixed" rrset-order option can be enabled + or disabled by specifying "--enable-fixed-rrset" or + "--disable-fixed-rrset" on the configure command line. + The default is "disabled", to reduce memory footprint. + If your operating system has integrated support for IPv6, it will be used automatically. If you have installed KAME IPv6 separately, use "--with-kame[=PATH]" to specify its location. @@ -508,6 +515,9 @@ Building on your system, and some require Perl; see bin/tests/system/README for details. + SunOS 4 requires "printf" to be installed to make the shared + libraries. sh-utils-1.16 provides a "printf" which compiles + on SunOS 4. Documentation diff --git a/bin/dig/dig.c b/bin/dig/dig.c index f4b43890..9866fa1a 100644 --- a/bin/dig/dig.c +++ b/bin/dig/dig.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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: dig.c,v 1.218 2007/12/03 00:21:48 marka Exp $ */ +/* $Id: dig.c,v 1.218.12.3 2008/04/03 02:12:21 marka Exp $ */ /*! \file */ @@ -50,7 +50,7 @@ #define ADD_STRING(b, s) { \ if (strlen(s) >= isc_buffer_availablelength(b)) \ - return (ISC_R_NOSPACE); \ + return (ISC_R_NOSPACE); \ else \ isc_buffer_putstr(b, s); \ } @@ -144,8 +144,8 @@ help(void) { " q-type is one of (a,any,mx,ns,soa,hinfo,axfr,txt,...) [default:a]\n" " (Use ixfr=version for type ixfr)\n" " q-opt is one of:\n" -" -x dot-notation (shortcut for in-addr lookups)\n" -" -i (IP6.INT reverse IPv6 lookups)\n" +" -x dot-notation (shortcut for reverse lookups)\n" +" -i (use IP6.INT for IPv6 reverse lookups)\n" " -f filename (batch mode)\n" " -b address[#port] (bind to source address/port)\n" " -p port (specify port number)\n" @@ -194,6 +194,7 @@ help(void) { " +[no]identify (ID responders in short answers)\n" " +[no]trace (Trace delegation down from root)\n" " +[no]dnssec (Request DNSSEC records)\n" +" +[no]nsid (Request Name Server ID)\n" #ifdef DIG_SIGCHASE " +[no]sigchase (Chase DNSSEC signatures)\n" " +trusted-key=#### (Trusted Key when chasing DNSSEC sigs)\n" @@ -383,7 +384,7 @@ printrdataset(dns_name_t *owner_name, dns_rdataset_t *rdataset, else if (nottl || noclass) result = dns_master_stylecreate(&style, styleflags, 24, 24, 32, 40, 80, 8, mctx); - else + else result = dns_master_stylecreate(&style, styleflags, 24, 32, 40, 48, 80, 8, mctx); check_result(result, "dns_master_stylecreate"); @@ -392,7 +393,7 @@ printrdataset(dns_name_t *owner_name, dns_rdataset_t *rdataset, if (style != NULL) dns_master_styledestroy(&style, mctx); - + return(result); } #endif @@ -429,7 +430,7 @@ printmessage(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers) { else if (nottl || noclass) result = dns_master_stylecreate(&style, styleflags, 24, 24, 32, 40, 80, 8, mctx); - else + else result = dns_master_stylecreate(&style, styleflags, 24, 32, 40, 48, 80, 8, mctx); check_result(result, "dns_master_stylecreate"); @@ -638,7 +639,7 @@ printgreeting(int argc, char **argv, dig_lookup_t *lookup) { strncat(lookup->cmdline, append, remaining); } if (first) { - snprintf(append, sizeof(append), + snprintf(append, sizeof(append), ";; global options: %s %s\n", short_form ? "short_form" : "", printcmd ? "printcmd" : ""); @@ -716,7 +717,7 @@ plus_option(char *option, isc_boolean_t is_batchfile, FULLCHECK2("aaonly", "aaflag"); lookup->aaonly = state; break; - case 'd': + case 'd': switch (cmd[2]) { case 'd': /* additional */ FULLCHECK("additional"); @@ -801,13 +802,13 @@ plus_option(char *option, isc_boolean_t is_batchfile, FULLCHECK("defname"); usesearch = state; break; - case 'n': /* dnssec */ + case 'n': /* dnssec */ FULLCHECK("dnssec"); if (state && lookup->edns == -1) lookup->edns = 0; lookup->dnssec = state; break; - case 'o': /* domain */ + case 'o': /* domain */ FULLCHECK("domain"); if (value == NULL) goto need_value; @@ -860,28 +861,40 @@ plus_option(char *option, isc_boolean_t is_batchfile, goto invalid_option; ndots = parse_uint(value, "ndots", MAXNDOTS); break; - case 's': /* nssearch */ - FULLCHECK("nssearch"); - lookup->ns_search_only = state; - if (state) { - lookup->trace_root = ISC_TRUE; - lookup->recurse = ISC_TRUE; - lookup->identify = ISC_TRUE; - lookup->stats = ISC_FALSE; - lookup->comments = ISC_FALSE; - lookup->section_additional = ISC_FALSE; - lookup->section_authority = ISC_FALSE; - lookup->section_question = ISC_FALSE; - lookup->rdtype = dns_rdatatype_ns; - lookup->rdtypeset = ISC_TRUE; - short_form = ISC_TRUE; + case 's': + switch (cmd[2]) { + case 'i': /* nsid */ + FULLCHECK("nsid"); + if (state && lookup->edns == -1) + lookup->edns = 0; + lookup->nsid = state; + break; + case 's': /* nssearch */ + FULLCHECK("nssearch"); + lookup->ns_search_only = state; + if (state) { + lookup->trace_root = ISC_TRUE; + lookup->recurse = ISC_TRUE; + lookup->identify = ISC_TRUE; + lookup->stats = ISC_FALSE; + lookup->comments = ISC_FALSE; + lookup->section_additional = ISC_FALSE; + lookup->section_authority = ISC_FALSE; + lookup->section_question = ISC_FALSE; + lookup->rdtype = dns_rdatatype_ns; + lookup->rdtypeset = ISC_TRUE; + short_form = ISC_TRUE; + } + break; + default: + goto invalid_option; } break; default: goto invalid_option; } break; - case 'q': + case 'q': switch (cmd[1]) { case 'r': /* qr */ FULLCHECK("qr"); @@ -957,11 +970,11 @@ plus_option(char *option, isc_boolean_t is_batchfile, break; #ifdef DIG_SIGCHASE case 'i': /* sigchase */ - FULLCHECK("sigchase"); + FULLCHECK("sigchase"); lookup->sigchase = state; if (lookup->sigchase) lookup->dnssec = ISC_TRUE; - break; + break; #endif case 't': /* stats */ FULLCHECK("stats"); @@ -989,7 +1002,7 @@ plus_option(char *option, isc_boolean_t is_batchfile, timeout = 1; break; #if DIG_SIGCHASE_TD - case 'o': /* topdown */ + case 'o': /* topdown */ FULLCHECK("topdown"); lookup->do_topdown = state; break; @@ -1024,7 +1037,7 @@ plus_option(char *option, isc_boolean_t is_batchfile, #ifdef DIG_SIGCHASE case 'u': /* trusted-key */ FULLCHECK("trusted-key"); - if (value == NULL) + if (value == NULL) goto need_value; if (!state) goto invalid_option; @@ -1158,7 +1171,7 @@ dash_option(char *option, char *next, dig_lookup_t **lookup, hash = strchr(value, '#'); if (hash != NULL) { srcport = (in_port_t) - parse_uint(hash + 1, + parse_uint(hash + 1, "port number", MAXPORT); *hash = '\0'; } else @@ -1211,7 +1224,7 @@ dash_option(char *option, char *next, dig_lookup_t **lookup, (*lookup) = clone_lookup(default_lookup, ISC_TRUE); *need_clone = ISC_TRUE; - strncpy((*lookup)->textname, value, + strncpy((*lookup)->textname, value, sizeof((*lookup)->textname)); (*lookup)->textname[sizeof((*lookup)->textname)-1]=0; (*lookup)->trace_root = ISC_TF((*lookup)->trace || @@ -1250,7 +1263,7 @@ dash_option(char *option, char *next, dig_lookup_t **lookup, (*lookup)->rdtypeset = ISC_TRUE; (*lookup)->ixfr_serial = parse_uint(&value[5], "serial number", - MAXSERIAL); + MAXSERIAL); (*lookup)->section_question = plusquest; (*lookup)->comments = pluscomm; (*lookup)->tcp_mode = ISC_TRUE; @@ -1277,7 +1290,7 @@ dash_option(char *option, char *next, dig_lookup_t **lookup, if (ptr2 == NULL) usage(); ptr3 = next_token(&value,":"); /* secret or NULL */ - if (ptr3 != NULL) { + if (ptr3 != NULL) { if (strcasecmp(ptr, "hmac-md5") == 0) { hmacname = DNS_TSIG_HMACMD5_NAME; digestbits = 0; @@ -1426,7 +1439,7 @@ getaddresses(dig_lookup_t *lookup, const char *host) { char tmp[ISC_NETADDR_FORMATSIZE]; result = bind9_getaddresses(host, 0, sockaddrs, - DIG_MAX_ADDRESSES, &count); + DIG_MAX_ADDRESSES, &count); if (result != ISC_R_SUCCESS) fatal("couldn't get address for '%s': %s", host, isc_result_totext(result)); @@ -1488,7 +1501,7 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only, if (homedir != NULL) { unsigned int n; n = snprintf(rcfile, sizeof(rcfile), "%s/.digrc", - homedir); + homedir); if (n < sizeof(rcfile)) batchfp = fopen(rcfile, "r"); } @@ -1568,7 +1581,7 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only, tr.base = rv[0]; tr.length = strlen(rv[0]); result = dns_rdatatype_fromtext(&rdtype, - (isc_textregion_t *)&tr); + (isc_textregion_t *)&tr); if (result == ISC_R_SUCCESS && rdtype == dns_rdatatype_ixfr) { result = DNS_R_UNKNOWN; @@ -1589,8 +1602,8 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only, lookup->rdtypeset = ISC_TRUE; lookup->ixfr_serial = parse_uint(&rv[0][5], - "serial number", - MAXSERIAL); + "serial number", + MAXSERIAL); lookup->section_question = plusquest; lookup->comments = pluscomm; @@ -1626,7 +1639,7 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only, lookup = clone_lookup(default_lookup, ISC_TRUE); need_clone = ISC_TRUE; - strncpy(lookup->textname, rv[0], + strncpy(lookup->textname, rv[0], sizeof(lookup->textname)); lookup->textname[sizeof(lookup->textname)-1]=0; lookup->trace_root = ISC_TF(lookup->trace || diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index e83736d5..5419fc7a 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dighost.c,v 1.304.12.4 2008/01/17 23:46:35 tbox Exp $ */ +/* $Id: dighost.c,v 1.304.12.5 2008/04/03 02:12:21 marka Exp $ */ /*! \file * \note @@ -724,6 +724,7 @@ make_empty_lookup(void) { looknew->servfail_stops = ISC_TRUE; looknew->besteffort = ISC_TRUE; looknew->dnssec = ISC_FALSE; + looknew->nsid = ISC_FALSE; #ifdef DIG_SIGCHASE looknew->sigchase = ISC_FALSE; #if DIG_SIGCHASE_TD @@ -803,6 +804,7 @@ clone_lookup(dig_lookup_t *lookold, isc_boolean_t servers) { looknew->servfail_stops = lookold->servfail_stops; looknew->besteffort = lookold->besteffort; looknew->dnssec = lookold->dnssec; + looknew->nsid = lookold->nsid; #ifdef DIG_SIGCHASE looknew->sigchase = lookold->sigchase; #if DIG_SIGCHASE_TD @@ -1155,11 +1157,11 @@ setup_libs(void) { /*% * Add EDNS0 option record to a message. Currently, the only supported - * options are UDP buffer size and the DO bit. + * options are UDP buffer size, the DO bit, and NSID request. */ static void add_opt(dns_message_t *msg, isc_uint16_t udpsize, isc_uint16_t edns, - isc_boolean_t dnssec) + isc_boolean_t dnssec, isc_boolean_t nsid) { dns_rdataset_t *rdataset = NULL; dns_rdatalist_t *rdatalist = NULL; @@ -1182,8 +1184,19 @@ add_opt(dns_message_t *msg, isc_uint16_t udpsize, isc_uint16_t edns, rdatalist->ttl = edns << 16; if (dnssec) rdatalist->ttl |= DNS_MESSAGEEXTFLAG_DO; - rdata->data = NULL; - rdata->length = 0; + if (nsid) { + unsigned char data[4]; + isc_buffer_t buf; + + isc_buffer_init(&buf, data, sizeof(data)); + isc_buffer_putuint16(&buf, DNS_OPT_NSID); + isc_buffer_putuint16(&buf, 0); + rdata->data = data; + rdata->length = sizeof(data); + } else { + rdata->data = NULL; + rdata->length = 0; + } ISC_LIST_INIT(rdatalist->rdata); ISC_LIST_APPEND(rdatalist->rdata, rdata, link); dns_rdatalist_tordataset(rdatalist, rdataset); @@ -1998,7 +2011,7 @@ setup_lookup(dig_lookup_t *lookup) { if (lookup->edns < 0) lookup->edns = 0; add_opt(lookup->sendmsg, lookup->udpsize, - lookup->edns, lookup->dnssec); + lookup->edns, lookup->dnssec, lookup->nsid); } result = dns_message_rendersection(lookup->sendmsg, diff --git a/bin/dig/host.1 b/bin/dig/host.1 index 97d2a27e..d985a95a 100644 --- a/bin/dig/host.1 +++ b/bin/dig/host.1 @@ -1,4 +1,4 @@ -.\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") +.\" Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2000-2002 Internet Software Consortium. .\" .\" Permission to use, copy, modify, and 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: host.1,v 1.28 2007/05/09 03:33:50 marka Exp $ +.\" $Id: host.1,v 1.28.164.2 2008/04/06 01:41:39 tbox Exp $ .\" .hy 0 .ad l @@ -154,7 +154,7 @@ option is used to select the query type. \fItype\fR can be any recognized query type: CNAME, NS, SOA, SIG, KEY, AXFR, etc. When no query type is specified, \fBhost\fR -automatically selects an appropriate query type. By default it looks for A records, but if the +automatically selects an appropriate query type. By default it looks for A, AAAA, and MX records, but if the \fB\-C\fR option was given, queries will be made for SOA records, and if \fIname\fR @@ -213,7 +213,7 @@ runs. \fBdig\fR(1), \fBnamed\fR(8). .SH "COPYRIGHT" -Copyright \(co 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") +Copyright \(co 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") .br Copyright \(co 2000\-2002 Internet Software Consortium. .br diff --git a/bin/dig/host.docbook b/bin/dig/host.docbook index ffdec1bc..c2951283 100644 --- a/bin/dig/host.docbook +++ b/bin/dig/host.docbook @@ -2,7 +2,7 @@ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [<!ENTITY mdash "—">]> <!-- - - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + - Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000-2002 Internet Software Consortium. - - Permission to use, copy, modify, and/or distribute this software for any @@ -18,7 +18,7 @@ - PERFORMANCE OF THIS SOFTWARE. --> -<!-- $Id: host.docbook,v 1.16 2007/06/18 23:47:17 tbox Exp $ --> +<!-- $Id: host.docbook,v 1.16.130.2 2008/04/05 23:46:39 tbox Exp $ --> <refentry id="man.host"> <refentryinfo> @@ -41,6 +41,7 @@ <year>2004</year> <year>2005</year> <year>2007</year> + <year>2008</year> <holder>Internet Systems Consortium, Inc. ("ISC")</holder> </copyright> <copyright> @@ -199,7 +200,7 @@ NS, SOA, SIG, KEY, AXFR, etc. When no query type is specified, <command>host</command> automatically selects an appropriate query - type. By default it looks for A records, but if the + type. By default it looks for A, AAAA, and MX records, but if the <option>-C</option> option was given, queries will be made for SOA records, and if <parameter>name</parameter> is a dotted-decimal IPv4 diff --git a/bin/dig/host.html b/bin/dig/host.html index 3caafc1a..1d1c1898 100644 --- a/bin/dig/host.html +++ b/bin/dig/host.html @@ -1,5 +1,5 @@ <!-- - - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + - Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") - Copyright (C) 2000-2002 Internet Software Consortium. - - Permission to use, copy, modify, and distribute this software for any @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> -<!-- $Id: host.html,v 1.27 2007/05/09 03:33:50 marka Exp $ --> +<!-- $Id: host.html,v 1.27.164.2 2008/04/06 01:41:39 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -32,7 +32,7 @@ <div class="cmdsynopsis"><p><code class="command">host</code> [<code class="option">-aCdlnrsTwv</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-N <em class="replaceable"><code>ndots</code></em></code>] [<code class="option">-R <em class="replaceable"><code>number</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-W <em class="replaceable"><code>wait</code></em></code>] [<code class="option">-m <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-4</code>] [<code class="option">-6</code>] {name} [server]</p></div> </div> <div class="refsect1" lang="en"> -<a name="id2543428"></a><h2>DESCRIPTION</h2> +<a name="id2543431"></a><h2>DESCRIPTION</h2> <p><span><strong class="command">host</strong></span> is a simple utility for performing DNS lookups. It is normally used to convert names to IP addresses and vice versa. @@ -148,7 +148,7 @@ NS, SOA, SIG, KEY, AXFR, etc. When no query type is specified, <span><strong class="command">host</strong></span> automatically selects an appropriate query - type. By default it looks for A records, but if the + type. By default it looks for A, AAAA, and MX records, but if the <code class="option">-C</code> option was given, queries will be made for SOA records, and if <em class="parameter"><code>name</code></em> is a dotted-decimal IPv4 @@ -184,7 +184,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2543725"></a><h2>IDN SUPPORT</h2> +<a name="id2543797"></a><h2>IDN SUPPORT</h2> <p> If <span><strong class="command">host</strong></span> has been built with IDN (internationalized domain name) support, it can accept and display non-ASCII domain names. @@ -198,12 +198,12 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2543748"></a><h2>FILES</h2> +<a name="id2543819"></a><h2>FILES</h2> <p><code class="filename">/etc/resolv.conf</code> </p> </div> <div class="refsect1" lang="en"> -<a name="id2543828"></a><h2>SEE ALSO</h2> +<a name="id2543831"></a><h2>SEE ALSO</h2> <p><span class="citerefentry"><span class="refentrytitle">dig</span>(1)</span>, <span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>. </p> diff --git a/bin/dig/include/dig/dig.h b/bin/dig/include/dig/dig.h index 4c4608df..262a4e5b 100644 --- a/bin/dig/include/dig/dig.h +++ b/bin/dig/include/dig/dig.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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: dig.h,v 1.105 2007/06/18 23:47:17 tbox Exp $ */ +/* $Id: dig.h,v 1.105.130.2 2008/04/03 06:08:26 tbox Exp $ */ #ifndef DIG_H #define DIG_H @@ -102,7 +102,7 @@ typedef struct dig_searchlist dig_searchlist_t; /*% The dig_lookup structure */ struct dig_lookup { isc_boolean_t - pending, /*%< Pending a successful answer */ + pending, /*%< Pending a successful answer */ waiting_connect, doing_xfr, ns_search_only, /*%< dig +nssearch, host -C */ @@ -129,27 +129,28 @@ struct dig_lookup { need_search, done_as_is, besteffort, - dnssec; + dnssec, + nsid; /*% Name Server ID (RFC 5001) */ #ifdef DIG_SIGCHASE isc_boolean_t sigchase; #if DIG_SIGCHASE_TD - isc_boolean_t do_topdown, - trace_root_sigchase, - rdtype_sigchaseset, - rdclass_sigchaseset; + isc_boolean_t do_topdown, + trace_root_sigchase, + rdtype_sigchaseset, + rdclass_sigchaseset; /* Name we are going to validate RRset */ - char textnamesigchase[MXNAME]; + char textnamesigchase[MXNAME]; #endif #endif - + char textname[MXNAME]; /*% Name we're going to be looking up */ char cmdline[MXNAME]; dns_rdatatype_t rdtype; dns_rdatatype_t qrdtype; #if DIG_SIGCHASE_TD - dns_rdatatype_t rdtype_sigchase; - dns_rdatatype_t qrdtype_sigchase; - dns_rdataclass_t rdclass_sigchase; + dns_rdatatype_t rdtype_sigchase; + dns_rdatatype_t qrdtype_sigchase; + dns_rdataclass_t rdclass_sigchase; #endif dns_rdataclass_t rdclass; isc_boolean_t rdtypeset; @@ -231,7 +232,7 @@ struct dig_searchlist { }; #ifdef DIG_SIGCHASE struct dig_message { - dns_message_t *msg; + dns_message_t *msg; ISC_LINK(dig_message_t) link; }; #endif @@ -249,7 +250,7 @@ extern dig_searchlistlist_t search_list; extern unsigned int extrabytes; extern isc_boolean_t check_ra, have_ipv4, have_ipv6, specified_source, - usesearch, showsearch, qr; + usesearch, showsearch, qr; extern in_port_t port; extern unsigned int timeout; extern isc_mem_t *mctx; diff --git a/bin/named/Makefile.in b/bin/named/Makefile.in index 6655cb19..5f61cdf3 100644 --- a/bin/named/Makefile.in +++ b/bin/named/Makefile.in @@ -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.96.130.3 2008/01/22 22:51:26 marka Exp $ +# $Id: Makefile.in,v 1.96.130.4 2008/03/31 05:06:47 marka Exp $ srcdir = @srcdir@ VPATH = @srcdir@ @@ -134,7 +134,7 @@ bind9.xsl.h: bind9.xsl convertxsl.pl ${PERL} ${srcdir}/convertxsl.pl < ${srcdir}/bind9.xsl > bind9.xsl.h depend: bind9.xsl.h -server.@O@: bind9.xsl.h +statschannel.@O@: bind9.xsl.h installdirs: $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${sbindir} diff --git a/bin/named/bind9.xsl b/bin/named/bind9.xsl index 25f72738..edc10ece 100644 --- a/bin/named/bind9.xsl +++ b/bin/named/bind9.xsl @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - - Copyright (C) 2006, 2007 Internet Systems Consortium, Inc. ("ISC") + - Copyright (C) 2006-2008 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 @@ -15,7 +15,7 @@ - PERFORMANCE OF THIS SOFTWARE. --> -<!-- $Id: bind9.xsl,v 1.13 2007/06/18 23:47:18 tbox Exp $ --> +<!-- $Id: bind9.xsl,v 1.13.130.4 2008/04/09 22:49:37 jinmei Exp $ --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" @@ -55,6 +55,11 @@ tr.lrow { color: #ffffff; } +td, th { + padding-right: 5px; + padding-left: 5px; +} + .header { background-color: teal; color: #ffffff; @@ -99,21 +104,293 @@ tr.lrow { <br/> <table> - <tr class="rowh"><th colspan="2">Server statistics</th></tr> - <xsl:for-each select="server/counters/*"> + <tr class="rowh"><th colspan="2">Incoming Requests</th></tr> + <xsl:for-each select="server/requests/opcode"> <tr class="lrow"> - <td><xsl:value-of select="name()"/></td> - <td><xsl:value-of select="."/></td> + <td><xsl:value-of select="name"/></td> + <td><xsl:value-of select="counter"/></td> </tr> </xsl:for-each> </table> - <br/> + <br/> + + <table> + <tr class="rowh"><th colspan="2">Incoming Queries</th></tr> + <xsl:for-each select="server/queries-in/rdtype"> + <tr class="lrow"> + <td><xsl:value-of select="name"/></td> + <td><xsl:value-of select="counter"/></td> + </tr> + </xsl:for-each> + </table> + + <br/> + + <xsl:for-each select="views/view"> + <table> + <tr class="rowh"> + <th colspan="2">Outgoing Queries from View <xsl:value-of select="name"/></th> + </tr> + <xsl:for-each select="rdtype"> + <tr class="lrow"> + <td><xsl:value-of select="name"/></td> + <td><xsl:value-of select="counter"/></td> + </tr> + </xsl:for-each> + </table> + <br/> + </xsl:for-each> + + <br/> + + <table> + <tr class="rowh"><th colspan="10">Server Statistics</th></tr> + <tr class="rowh"> + <!-- The ordering of the following items must be consistent + with dns_nsstatscounter_xxx --> + <th>Requestv4</th> + <th>Requestv6</th> + <th>ReqEdns0</th> + <th>ReqBadEDNSVer</th> + <th>ReqTSIG</th> + <th>ReqSIG0</th> + <th>ReqBadSIG</th> + <th>ReqTCP</th> + <th>AuthQryRej</th> + <th>RecQryRej</th> + </tr> + <tr class="lrow"> + <td><xsl:value-of select="server/nsstats/Requestv4"/></td> + <td><xsl:value-of select="server/nsstats/Requestv6"/></td> + <td><xsl:value-of select="server/nsstats/ReqEdns0"/></td> + <td><xsl:value-of select="server/nsstats/ReqBadEDNSVer"/></td> + <td><xsl:value-of select="server/nsstats/ReqTSIG"/></td> + <td><xsl:value-of select="server/nsstats/ReqSIG0"/></td> + <td><xsl:value-of select="server/nsstats/ReqBadSIG"/></td> + <td><xsl:value-of select="server/nsstats/ReqTCP"/></td> + <td><xsl:value-of select="server/nsstats/AuthQryRej"/></td> + <td><xsl:value-of select="server/nsstats/RecQryRej"/></td> + </tr> + <tr class="rowh"> + <th>XfrRej</th> + <th>UpdateRej</th> + <th>Response</th> + <th>RespTruncated</th> + <th>RespEDNS0</th> + <th>RespTSIG</th> + <th>RespSIG0</th> + <th>QrySuccess</th> + <th>QryAuthAns</th> + <th>QryNoauthAns</th> + </tr> + <tr class="lrow"> + <td><xsl:value-of select="server/nsstats/XfrRej"/></td> + <td><xsl:value-of select="server/nsstats/UpdateRej"/></td> + <td><xsl:value-of select="server/nsstats/Response"/></td> + <td><xsl:value-of select="server/nsstats/TruncatedResp"/></td> + <td><xsl:value-of select="server/nsstats/RespEDNS0"/></td> + <td><xsl:value-of select="server/nsstats/RespTSIG"/></td> + <td><xsl:value-of select="server/nsstats/RespSIG0"/></td> + <td><xsl:value-of select="server/nsstats/QrySuccess"/></td> + <td><xsl:value-of select="server/nsstats/QryAuthAns"/></td> + <td><xsl:value-of select="server/nsstats/QryNoauthAns"/></td> + </tr> + <tr class="rowh"> + <th>QryReferral</th> + <th>QryNxrrset</th> + <th>QrySERVFAIL</th> + <th>QryFORMERR</th> + <th>QryNXDOMAIN</th> + <th>QryRecursion</th> + <th>QryDuplicate</th> + <th>QryDropped</th> + <th>QryFailure</th> + <th>XfrReqDone</th> + </tr> + <tr class="lrow"> + <td><xsl:value-of select="server/nsstats/QryReferral"/></td> + <td><xsl:value-of select="server/nsstats/QryNxrrset"/></td> + <td><xsl:value-of select="server/nsstats/QrySERVFAIL"/></td> + <td><xsl:value-of select="server/nsstats/QryFORMERR"/></td> + <td><xsl:value-of select="server/nsstats/QryNXDOMAIN"/></td> + <td><xsl:value-of select="server/nsstats/QryRecursion"/></td> + <td><xsl:value-of select="server/nsstats/QryDuplicate"/></td> + <td><xsl:value-of select="server/nsstats/QryDropped"/></td> + <td><xsl:value-of select="server/nsstats/QryFailure"/></td> + <td><xsl:value-of select="server/nsstats/XfrReqDone"/></td> + </tr> + <tr class="rowh"> + <th>UpdateReqFwd</th> + <th>UpdateRespFwd</th> + <th>UpdateFwdFail</th> + <th>UpdateDone</th> + <th>UpdateFail</th> + <th>UpdateBadPrereq</th> + <th>RespMismatch</th> + <th /> + <th /> + <th /> + </tr> + <tr class="lrow"> + <td><xsl:value-of select="server/nsstats/UpdateReqFwd"/></td> + <td><xsl:value-of select="server/nsstats/UpdateRespFwd"/></td> + <td><xsl:value-of select="server/nsstats/UpdateFwdFail"/></td> + <td><xsl:value-of select="server/nsstats/UpdateDone"/></td> + <td><xsl:value-of select="server/nsstats/UpdateFail"/></td> + <td><xsl:value-of select="server/nsstats/UpdateBadPrereq"/></td> + <td><xsl:value-of select="server/resstats/Mismatch"/></td> + <td /> + <td /> + <td /> + </tr> + </table> + + <br/> + + <table> + <tr class="rowh"><th colspan="10">Zone Maintenance Statistics</th></tr> + <tr class="rowh"> + <!-- The ordering of the following items must be consistent + with dns_zonestatscounter_xxx --> + <th>NotifyOutv4</th> + <th>NotifyOutv6</th> + <th>NotifyInv4</th> + <th>NotifyInv6</th> + <th>NotifyRej</th> + <th>SOAOutv4</th> + <th>SOAOutv6</th> + <th>AXFRReqv4</th> + <th>AXFRReqv6</th> + <th>IXFRReqv4</th> + </tr> + <tr class="lrow"> + <td><xsl:value-of select="server/zonestats/NotifyOutv4"/></td> + <td><xsl:value-of select="server/zonestats/NotifyOutv6"/></td> + <td><xsl:value-of select="server/zonestats/NotifyInv4"/></td> + <td><xsl:value-of select="server/zonestats/NotifyInv6"/></td> + <td><xsl:value-of select="server/zonestats/NotifyRej"/></td> + <td><xsl:value-of select="server/zonestats/SOAOutv4"/></td> + <td><xsl:value-of select="server/zonestats/SOAOutv6"/></td> + <td><xsl:value-of select="server/zonestats/AXFRReqv4"/></td> + <td><xsl:value-of select="server/zonestats/AXFRReqv6"/></td> + <td><xsl:value-of select="server/zonestats/IXFRReqv4"/></td> + </tr> + <tr class="rowh"> + <th>IXFRReqv6</th> + <th>XfrSuccess</th> + <th>XfrFail</th> + <th/> + <th/> + <th/> + <th/> + <th/> + <th/> + <th/> + </tr> + <tr class="lrow"> + <td><xsl:value-of select="server/zonestats/IXFRReqv6"/></td> + <td><xsl:value-of select="server/zonestats/XfrSuccess"/></td> + <td><xsl:value-of select="server/zonestats/XfrFail"/></td> + <td/> + <td/> + <td/> + <td/> + <td/> + <td/> + <td/> + </tr> + </table> + + <br/> + + <xsl:for-each select="views/view"> + <table> + <tr class="rowh"> + <th colspan="10">Resolver Statistics for View <xsl:value-of select="name"/></th> + </tr> + <tr class="rowh"> + <!-- The ordering of the following items must be consistent + with dns_resstatscounter_xxx --> + <th>Queryv4</th> + <th>Queryv6</th> + <th>Responsev4</th> + <th>Responsev6</th> + <th>NXDOMAIN</th> + <th>SERVFAIL</th> + <th>FORMERR</th> + <th>OtherError</th> + <th>EDNS0Fail</th> + <!-- this counter is not applicable to per-view stat, + but keep it for generating the description table used in + the statschannel.c. + <th>Mismatch</th> --> + <th>Truncated</th> + </tr> + <tr class="lrow"> + <td><xsl:value-of select="resstats/Queryv4"/></td> + <td><xsl:value-of select="resstats/Queryv6"/></td> + <td><xsl:value-of select="resstats/Responsev4"/></td> + <td><xsl:value-of select="resstats/Responsev6"/></td> + <td><xsl:value-of select="resstats/NXDOMAIN"/></td> + <td><xsl:value-of select="resstats/SERVFAIL"/></td> + <td><xsl:value-of select="resstats/FORMERR"/></td> + <td><xsl:value-of select="resstats/OtherError"/></td> + <td><xsl:value-of select="resstats/EDNS0Fail"/></td> + <!-- <td><xsl:value-of select="resstats/Mismatch"/></td> --> + <td><xsl:value-of select="resstats/Truncated"/></td> + </tr> + <tr class="rowh"> + <th>Lame</th> + <th>Retry</th> + <th>GlueFetchv4</th> + <th>GlueFetchv6</th> + <th>GlueFetchv4Fail</th> + <th>GlueFetchv6Fail</th> + <th>ValAttempt</th> + <th>ValOk</th> + <th>ValNegOk</th> + <th>ValFail</th> + </tr> + <tr class="lrow"> + <td><xsl:value-of select="resstats/Lame"/></td> + <td><xsl:value-of select="resstats/Retry"/></td> + <td><xsl:value-of select="resstats/GlueFetchv4"/></td> + <td><xsl:value-of select="resstats/GlueFetchv6"/></td> + <td><xsl:value-of select="resstats/GlueFetchv4Fail"/></td> + <td><xsl:value-of select="resstats/GlueFetchv6Fail"/></td> + <td><xsl:value-of select="resstats/ValAttempt"/></td> + <td><xsl:value-of select="resstats/ValOk"/></td> + <td><xsl:value-of select="resstats/ValNegOk"/></td> + <td><xsl:value-of select="resstats/ValFail"/></td> + </tr> + </table> + <br/> + </xsl:for-each> + + <br/> + + <xsl:for-each select="views/view"> + <table> + <tr class="rowh"> + <th colspan="2">Cache DB RRsets for View <xsl:value-of select="name"/></th> + </tr> + <xsl:for-each select="cache/rrset"> + <tr class="lrow"> + <td><xsl:value-of select="name"/></td> + <td><xsl:value-of select="counter"/></td> + </tr> + </xsl:for-each> + </table> + <br/> + </xsl:for-each> + + <br/> <xsl:for-each select="views/view"> <table> <tr class="rowh"> - <th colspan="11">Zones for View <xsl:value-of select="name"/></th> + <th colspan="10">Zones for View <xsl:value-of select="name"/></th> </tr> <tr class="rowh"> <th>Name</th> @@ -123,10 +400,9 @@ tr.lrow { <th>Referral</th> <th>NXRRSET</th> <th>NXDOMAIN</th> - <th>Recursion</th> <th>Failure</th> - <th>Duplicate</th> - <th>Dropped</th> + <th>XfrReqDone</th> + <th>XfrRej</th> </tr> <xsl:for-each select="zones/zone"> <tr class="lrow"> @@ -140,28 +416,25 @@ tr.lrow { <xsl:value-of select="serial"/> </td> <td> - <xsl:value-of select="counters/success"/> - </td> - <td> - <xsl:value-of select="counters/referral"/> + <xsl:value-of select="counters/QrySuccess"/> </td> <td> - <xsl:value-of select="counters/nxrrset"/> + <xsl:value-of select="counters/QryReferral"/> </td> <td> - <xsl:value-of select="counters/nxdomain"/> + <xsl:value-of select="counters/QryNxrrset"/> </td> <td> - <xsl:value-of select="counters/recursion"/> + <xsl:value-of select="counters/QryNXDOMAIN"/> </td> <td> - <xsl:value-of select="counters/failure"/> + <xsl:value-of select="counters/QryFailure"/> </td> <td> - <xsl:value-of select="counters/duplicate"/> + <xsl:value-of select="counters/XfrReqDone"/> </td> <td> - <xsl:value-of select="counters/dropped"/> + <xsl:value-of select="counters/XfrRej"/> </td> </tr> </xsl:for-each> @@ -274,6 +547,70 @@ tr.lrow { </tr> </xsl:for-each> </table> + <br /> + <table> + <tr class="rowh"> + <th colspan="4">Memory Usage Summary</th> + </tr> + <xsl:for-each select="memory/summary/*"> + <tr class="lrow"> + <td><xsl:value-of select="name()"/></td> + <td><xsl:value-of select="."/></td> + </tr> + </xsl:for-each> + </table> + <br /> + <table> + <tr class="rowh"> + <th colspan="10">Memory Contexts</th> + </tr> + <tr class="rowh"> + <th>ID</th> + <th>Name</th> + <th>References</th> + <th>TotalUse</th> + <th>InUse</th> + <th>MaxUse</th> + <th>BlockSize</th> + <th>Pools</th> + <th>HiWater</th> + <th>LoWater</th> + </tr> + <xsl:for-each select="memory/contexts/context"> + <tr class="lrow"> + <td> + <xsl:value-of select="id"/> + </td> + <td> + <xsl:value-of select="name"/> + </td> + <td> + <xsl:value-of select="references"/> + </td> + <td> + <xsl:value-of select="total"/> + </td> + <td> + <xsl:value-of select="inuse"/> + </td> + <td> + <xsl:value-of select="maxinuse"/> + </td> + <td> + <xsl:value-of select="blocksize"/> + </td> + <td> + <xsl:value-of select="pools"/> + </td> + <td> + <xsl:value-of select="hiwater"/> + </td> + <td> + <xsl:value-of select="lowater"/> + </td> + </tr> + </xsl:for-each> + </table> </body> </html> diff --git a/bin/named/bind9.xsl.h b/bin/named/bind9.xsl.h index 3d4cabd1..80788f8c 100644 --- a/bin/named/bind9.xsl.h +++ b/bin/named/bind9.xsl.h @@ -1,5 +1,698 @@ /* - * Generated by convertxsl.pl 1.9 2007/09/14 06:14:44 marka Exp - * From bind9.xsl 1.13 2007/06/18 23:47:18 tbox Exp + * Generated by convertxsl.pl 1.9.60.4 2008/04/03 10:51:01 marka Exp + * From bind9.xsl 1.13.130.4 2008/04/09 22:49:37 jinmei Exp */ -static char msg[] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!-- - Copyright (C) 2006, 2007 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.--><!-- \045Id: bind9.xsl,v 1.13 2007/06/18 23:47:18 tbox Exp \045 --><xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns=\"http://www.w3.org/1999/xhtml\"><xsl:template match=\"isc/bind/statistics\"><html><head><style type=\"text/css\">body { font-family: sans-serif; background-color: #ffffff; color: #000000;}table { border-collapse: collapse;}tr.rowh { text-align: center; border: 1px solid #000000; background-color: #8080ff; color: #ffffff;}tr.row { text-align: right; border: 1px solid #000000; background-color: teal; color: #ffffff;}tr.lrow { text-align: left; border: 1px solid #000000; background-color: teal; color: #ffffff;}.header { background-color: teal; color: #ffffff; padding: 4px;}.content { background-color: #ffffff; color: #000000; padding: 4px;}.item { padding: 4px; align: right;}.value { padding: 4px; font-weight: bold;} </style><title>BIND 9 Statistics</title></head><body><div class=\"header\">Bind 9 Configuration and Statistics</div><br/><table><tr class=\"rowh\"><th colspan=\"2\">Times</th></tr><tr class=\"lrow\"><td>boot-time</td><td><xsl:value-of select=\"server/boot-time\"/></td></tr><tr class=\"lrow\"><td>current-time</td><td><xsl:value-of select=\"server/current-time\"/></td></tr></table><br/><table><tr class=\"rowh\"><th colspan=\"2\">Server statistics</th></tr><xsl:for-each select=\"server/counters/*\"><tr class=\"lrow\"><td><xsl:value-of select=\"name()\"/></td><td><xsl:value-of select=\".\"/></td></tr></xsl:for-each></table><br/><xsl:for-each select=\"views/view\"><table><tr class=\"rowh\"><th colspan=\"11\">Zones for View <xsl:value-of select=\"name\"/></th></tr><tr class=\"rowh\"><th>Name</th><th>Class</th><th>Serial</th><th>Success</th><th>Referral</th><th>NXRRSET</th><th>NXDOMAIN</th><th>Recursion</th><th>Failure</th><th>Duplicate</th><th>Dropped</th></tr><xsl:for-each select=\"zones/zone\"><tr class=\"lrow\"><td><xsl:value-of select=\"name\"/></td><td><xsl:value-of select=\"rdataclass\"/></td><td><xsl:value-of select=\"serial\"/></td><td><xsl:value-of select=\"counters/success\"/></td><td><xsl:value-of select=\"counters/referral\"/></td><td><xsl:value-of select=\"counters/nxrrset\"/></td><td><xsl:value-of select=\"counters/nxdomain\"/></td><td><xsl:value-of select=\"counters/recursion\"/></td><td><xsl:value-of select=\"counters/failure\"/></td><td><xsl:value-of select=\"counters/duplicate\"/></td><td><xsl:value-of select=\"counters/dropped\"/></td></tr></xsl:for-each></table><br/></xsl:for-each><br/><table><tr class=\"rowh\"><th colspan=\"7\">Network Status</th></tr><tr class=\"rowh\"><th>ID</th><th>Name</th><th>Type</th><th>References</th><th>LocalAddress</th><th>PeerAddress</th><th>State</th></tr><xsl:for-each select=\"socketmgr/sockets/socket\"><tr class=\"lrow\"><td><xsl:value-of select=\"id\"/></td><td><xsl:value-of select=\"name\"/></td><td><xsl:value-of select=\"type\"/></td><td><xsl:value-of select=\"references\"/></td><td><xsl:value-of select=\"local-address\"/></td><td><xsl:value-of select=\"peer-address\"/></td><td><xsl:for-each select=\"states\"><xsl:value-of select=\".\"/></xsl:for-each></td></tr></xsl:for-each></table><br/><table><tr class=\"rowh\"><th colspan=\"2\">Task Manager Configuration</th></tr><tr class=\"lrow\"><td>Thread-Model</td><td><xsl:value-of select=\"taskmgr/thread-model/type\"/></td></tr><tr class=\"lrow\"><td>Worker Threads</td><td><xsl:value-of select=\"taskmgr/thread-model/worker-threads\"/></td></tr><tr class=\"lrow\"><td>Default Quantum</td><td><xsl:value-of select=\"taskmgr/thread-model/default-quantum\"/></td></tr><tr class=\"lrow\"><td>Tasks Running</td><td><xsl:value-of select=\"taskmgr/thread-model/tasks-running\"/></td></tr></table><br/><table><tr class=\"rowh\"><th colspan=\"5\">Tasks</th></tr><tr class=\"rowh\"><th>ID</th><th>Name</th><th>References</th><th>State</th><th>Quantum</th></tr><xsl:for-each select=\"taskmgr/tasks/task\"><tr class=\"lrow\"><td><xsl:value-of select=\"id\"/></td><td><xsl:value-of select=\"name\"/></td><td><xsl:value-of select=\"references\"/></td><td><xsl:value-of select=\"state\"/></td><td><xsl:value-of select=\"quantum\"/></td></tr></xsl:for-each></table></body></html></xsl:template></xsl:stylesheet>\n"; +static char xslmsg[] = + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<!--\n" + " - Copyright (C) 2006-2008 Internet Systems Consortium, Inc. (\"ISC\")\n" + " -\n" + " - Permission to use, copy, modify, and/or distribute this software for any\n" + " - purpose with or without fee is hereby granted, provided that the above\n" + " - copyright notice and this permission notice appear in all copies.\n" + " -\n" + " - THE SOFTWARE IS PROVIDED \"AS IS\" AND ISC DISCLAIMS ALL WARRANTIES WITH\n" + " - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n" + " - AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,\n" + " - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n" + " - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE\n" + " - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n" + " - PERFORMANCE OF THIS SOFTWARE.\n" + "-->\n" + "\n" + "<!-- \045Id: bind9.xsl,v 1.13.130.4 2008/04/09 22:49:37 jinmei Exp \045 -->\n" + "\n" + "<xsl:stylesheet version=\"1.0\"\n" + " xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n" + " xmlns=\"http://www.w3.org/1999/xhtml\">\n" + " <xsl:template match=\"isc/bind/statistics\">\n" + " <html>\n" + " <head>\n" + " <style type=\"text/css\">\n" + "body {\n" + " font-family: sans-serif;\n" + " background-color: #ffffff;\n" + " color: #000000;\n" + "}\n" + "\n" + "table {\n" + " border-collapse: collapse;\n" + "}\n" + "\n" + "tr.rowh {\n" + " text-align: center;\n" + " border: 1px solid #000000;\n" + " background-color: #8080ff;\n" + " color: #ffffff;\n" + "}\n" + "\n" + "tr.row {\n" + " text-align: right;\n" + " border: 1px solid #000000;\n" + " background-color: teal;\n" + " color: #ffffff;\n" + "}\n" + "\n" + "tr.lrow {\n" + " text-align: left;\n" + " border: 1px solid #000000;\n" + " background-color: teal;\n" + " color: #ffffff;\n" + "}\n" + "\n" + "td, th {\n" + " padding-right: 5px;\n" + " padding-left: 5px;\n" + "}\n" + "\n" + ".header {\n" + " background-color: teal;\n" + " color: #ffffff;\n" + " padding: 4px;\n" + "}\n" + "\n" + ".content {\n" + " background-color: #ffffff;\n" + " color: #000000;\n" + " padding: 4px;\n" + "}\n" + "\n" + ".item {\n" + " padding: 4px;\n" + " align: right;\n" + "}\n" + "\n" + ".value {\n" + " padding: 4px;\n" + " font-weight: bold;\n" + "}\n" + " </style>\n" + " <title>BIND 9 Statistics</title>\n" + " </head>\n" + " <body>\n" + " <div class=\"header\">Bind 9 Configuration and Statistics</div>\n" + "\n" + " <br/>\n" + "\n" + " <table>\n" + " <tr class=\"rowh\"><th colspan=\"2\">Times</th></tr>\n" + " <tr class=\"lrow\">\n" + " <td>boot-time</td>\n" + " <td><xsl:value-of select=\"server/boot-time\"/></td>\n" + " </tr>\n" + " <tr class=\"lrow\">\n" + " <td>current-time</td>\n" + " <td><xsl:value-of select=\"server/current-time\"/></td>\n" + " </tr>\n" + " </table>\n" + "\n" + " <br/>\n" + "\n" + " <table>\n" + " <tr class=\"rowh\"><th colspan=\"2\">Incoming Requests</th></tr>\n" + " <xsl:for-each select=\"server/requests/opcode\">\n" + " <tr class=\"lrow\">\n" + " <td><xsl:value-of select=\"name\"/></td>\n" + " <td><xsl:value-of select=\"counter\"/></td>\n" + " </tr>\n" + " </xsl:for-each>\n" + " </table>\n" + "\n" + " <br/>\n" + "\n" + " <table>\n" + " <tr class=\"rowh\"><th colspan=\"2\">Incoming Queries</th></tr>\n" + " <xsl:for-each select=\"server/queries-in/rdtype\">\n" + " <tr class=\"lrow\">\n" + " <td><xsl:value-of select=\"name\"/></td>\n" + " <td><xsl:value-of select=\"counter\"/></td>\n" + " </tr>\n" + " </xsl:for-each>\n" + " </table>\n" + "\n" + " <br/>\n" + "\n" + " <xsl:for-each select=\"views/view\">\n" + " <table>\n" + " <tr class=\"rowh\">\n" + " <th colspan=\"2\">Outgoing Queries from View <xsl:value-of select=\"name\"/></th>\n" + " </tr>\n" + " <xsl:for-each select=\"rdtype\">\n" + " <tr class=\"lrow\">\n" + " <td><xsl:value-of select=\"name\"/></td>\n" + " <td><xsl:value-of select=\"counter\"/></td>\n" + " </tr>\n" + " </xsl:for-each>\n" + " </table>\n" + " <br/>\n" + " </xsl:for-each>\n" + "\n" + " <br/>\n" + "\n" + " <table>\n" + " <tr class=\"rowh\"><th colspan=\"10\">Server Statistics</th></tr>\n" + " <tr class=\"rowh\">\n" + " <!-- The ordering of the following items must be consistent\n" + " with dns_nsstatscounter_xxx -->\n" + " <th>Requestv4</th>\n" + " <th>Requestv6</th>\n" + " <th>ReqEdns0</th>\n" + " <th>ReqBadEDNSVer</th>\n" + " <th>ReqTSIG</th>\n" + " <th>ReqSIG0</th>\n" + " <th>ReqBadSIG</th>\n" + " <th>ReqTCP</th>\n" + " <th>AuthQryRej</th>\n" + " <th>RecQryRej</th>\n" + " </tr>\n" + " <tr class=\"lrow\">\n" + " <td><xsl:value-of select=\"server/nsstats/Requestv4\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/Requestv6\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/ReqEdns0\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/ReqBadEDNSVer\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/ReqTSIG\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/ReqSIG0\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/ReqBadSIG\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/ReqTCP\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/AuthQryRej\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/RecQryRej\"/></td>\n" + " </tr>\n" + " <tr class=\"rowh\">\n" + " <th>XfrRej</th>\n" + " <th>UpdateRej</th>\n" + " <th>Response</th>\n" + " <th>RespTruncated</th>\n" + " <th>RespEDNS0</th>\n" + " <th>RespTSIG</th>\n" + " <th>RespSIG0</th>\n" + " <th>QrySuccess</th>\n" + " <th>QryAuthAns</th>\n" + " <th>QryNoauthAns</th>\n" + " </tr>\n" + " <tr class=\"lrow\">\n" + " <td><xsl:value-of select=\"server/nsstats/XfrRej\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/UpdateRej\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/Response\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/TruncatedResp\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/RespEDNS0\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/RespTSIG\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/RespSIG0\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/QrySuccess\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/QryAuthAns\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/QryNoauthAns\"/></td>\n" + " </tr>\n" + " <tr class=\"rowh\">\n" + " <th>QryReferral</th>\n" + " <th>QryNxrrset</th>\n" + " <th>QrySERVFAIL</th>\n" + " <th>QryFORMERR</th>\n" + " <th>QryNXDOMAIN</th>\n" + " <th>QryRecursion</th>\n" + " <th>QryDuplicate</th>\n" + " <th>QryDropped</th>\n" + " <th>QryFailure</th>\n" + " <th>XfrReqDone</th>\n" + " </tr>\n" + " <tr class=\"lrow\">\n" + " <td><xsl:value-of select=\"server/nsstats/QryReferral\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/QryNxrrset\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/QrySERVFAIL\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/QryFORMERR\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/QryNXDOMAIN\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/QryRecursion\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/QryDuplicate\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/QryDropped\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/QryFailure\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/XfrReqDone\"/></td>\n" + " </tr>\n" + " <tr class=\"rowh\">\n" + " <th>UpdateReqFwd</th>\n" + " <th>UpdateRespFwd</th>\n" + " <th>UpdateFwdFail</th>\n" + " <th>UpdateDone</th>\n" + " <th>UpdateFail</th>\n" + " <th>UpdateBadPrereq</th>\n" + " <th>RespMismatch</th>\n" + " <th />\n" + " <th />\n" + " <th />\n" + " </tr>\n" + " <tr class=\"lrow\">\n" + " <td><xsl:value-of select=\"server/nsstats/UpdateReqFwd\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/UpdateRespFwd\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/UpdateFwdFail\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/UpdateDone\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/UpdateFail\"/></td>\n" + " <td><xsl:value-of select=\"server/nsstats/UpdateBadPrereq\"/></td>\n" + " <td><xsl:value-of select=\"server/resstats/Mismatch\"/></td>\n" + " <td />\n" + " <td />\n" + " <td />\n" + " </tr>\n" + " </table>\n" + "\n" + " <br/>\n" + "\n" + " <table>\n" + " <tr class=\"rowh\"><th colspan=\"10\">Zone Maintenance Statistics</th></tr>\n" + " <tr class=\"rowh\">\n" + " <!-- The ordering of the following items must be consistent\n" + " with dns_zonestatscounter_xxx -->\n" + " <th>NotifyOutv4</th>\n" + " <th>NotifyOutv6</th>\n" + " <th>NotifyInv4</th>\n" + " <th>NotifyInv6</th>\n" + " <th>NotifyRej</th>\n" + " <th>SOAOutv4</th>\n" + " <th>SOAOutv6</th>\n" + " <th>AXFRReqv4</th>\n" + " <th>AXFRReqv6</th>\n" + " <th>IXFRReqv4</th>\n" + " </tr>\n" + " <tr class=\"lrow\">\n" + " <td><xsl:value-of select=\"server/zonestats/NotifyOutv4\"/></td>\n" + " <td><xsl:value-of select=\"server/zonestats/NotifyOutv6\"/></td>\n" + " <td><xsl:value-of select=\"server/zonestats/NotifyInv4\"/></td>\n" + " <td><xsl:value-of select=\"server/zonestats/NotifyInv6\"/></td>\n" + " <td><xsl:value-of select=\"server/zonestats/NotifyRej\"/></td>\n" + " <td><xsl:value-of select=\"server/zonestats/SOAOutv4\"/></td>\n" + " <td><xsl:value-of select=\"server/zonestats/SOAOutv6\"/></td>\n" + " <td><xsl:value-of select=\"server/zonestats/AXFRReqv4\"/></td>\n" + " <td><xsl:value-of select=\"server/zonestats/AXFRReqv6\"/></td>\n" + " <td><xsl:value-of select=\"server/zonestats/IXFRReqv4\"/></td>\n" + " </tr>\n" + " <tr class=\"rowh\">\n" + " <th>IXFRReqv6</th>\n" + " <th>XfrSuccess</th>\n" + " <th>XfrFail</th>\n" + " <th/>\n" + " <th/>\n" + " <th/>\n" + " <th/>\n" + " <th/>\n" + " <th/>\n" + " <th/>\n" + " </tr>\n" + " <tr class=\"lrow\">\n" + " <td><xsl:value-of select=\"server/zonestats/IXFRReqv6\"/></td>\n" + " <td><xsl:value-of select=\"server/zonestats/XfrSuccess\"/></td>\n" + " <td><xsl:value-of select=\"server/zonestats/XfrFail\"/></td>\n" + " <td/>\n" + " <td/>\n" + " <td/>\n" + " <td/>\n" + " <td/>\n" + " <td/>\n" + " <td/>\n" + " </tr>\n" + " </table>\n" + "\n" + " <br/>\n" + "\n" + " <xsl:for-each select=\"views/view\">\n" + " <table>\n" + " <tr class=\"rowh\">\n" + " <th colspan=\"10\">Resolver Statistics for View <xsl:value-of select=\"name\"/></th>\n" + " </tr>\n" + " <tr class=\"rowh\">\n" + " <!-- The ordering of the following items must be consistent\n" + " with dns_resstatscounter_xxx -->\n" + " <th>Queryv4</th>\n" + " <th>Queryv6</th>\n" + " <th>Responsev4</th>\n" + " <th>Responsev6</th>\n" + " <th>NXDOMAIN</th>\n" + " <th>SERVFAIL</th>\n" + " <th>FORMERR</th>\n" + " <th>OtherError</th>\n" + " <th>EDNS0Fail</th>\n" + " <!-- this counter is not applicable to per-view stat,\n" + " but keep it for generating the description table used in\n" + " the statschannel.c.\n" + " <th>Mismatch</th> -->\n" + " <th>Truncated</th>\n" + " </tr>\n" + " <tr class=\"lrow\">\n" + " <td><xsl:value-of select=\"resstats/Queryv4\"/></td>\n" + " <td><xsl:value-of select=\"resstats/Queryv6\"/></td>\n" + " <td><xsl:value-of select=\"resstats/Responsev4\"/></td>\n" + " <td><xsl:value-of select=\"resstats/Responsev6\"/></td>\n" + " <td><xsl:value-of select=\"resstats/NXDOMAIN\"/></td>\n" + " <td><xsl:value-of select=\"resstats/SERVFAIL\"/></td>\n" + " <td><xsl:value-of select=\"resstats/FORMERR\"/></td>\n" + " <td><xsl:value-of select=\"resstats/OtherError\"/></td>\n" + " <td><xsl:value-of select=\"resstats/EDNS0Fail\"/></td>\n" + " <!-- <td><xsl:value-of select=\"resstats/Mismatch\"/></td> -->\n" + " <td><xsl:value-of select=\"resstats/Truncated\"/></td>\n" + " </tr>\n" + " <tr class=\"rowh\">\n" + " <th>Lame</th>\n" + " <th>Retry</th>\n" + " <th>GlueFetchv4</th>\n" + " <th>GlueFetchv6</th>\n" + " <th>GlueFetchv4Fail</th>\n" + " <th>GlueFetchv6Fail</th>\n" + " <th>ValAttempt</th>\n" + " <th>ValOk</th>\n" + " <th>ValNegOk</th>\n" + " <th>ValFail</th>\n" + " </tr>\n" + " <tr class=\"lrow\">\n" + " <td><xsl:value-of select=\"resstats/Lame\"/></td>\n" + " <td><xsl:value-of select=\"resstats/Retry\"/></td>\n" + " <td><xsl:value-of select=\"resstats/GlueFetchv4\"/></td>\n" + " <td><xsl:value-of select=\"resstats/GlueFetchv6\"/></td>\n" + " <td><xsl:value-of select=\"resstats/GlueFetchv4Fail\"/></td>\n" + " <td><xsl:value-of select=\"resstats/GlueFetchv6Fail\"/></td>\n" + " <td><xsl:value-of select=\"resstats/ValAttempt\"/></td>\n" + " <td><xsl:value-of select=\"resstats/ValOk\"/></td>\n" + " <td><xsl:value-of select=\"resstats/ValNegOk\"/></td>\n" + " <td><xsl:value-of select=\"resstats/ValFail\"/></td>\n" + " </tr>\n" + " </table>\n" + " <br/>\n" + " </xsl:for-each>\n" + "\n" + " <br/>\n" + "\n" + " <xsl:for-each select=\"views/view\">\n" + " <table>\n" + " <tr class=\"rowh\">\n" + " <th colspan=\"2\">Cache DB RRsets for View <xsl:value-of select=\"name\"/></th>\n" + " </tr>\n" + " <xsl:for-each select=\"cache/rrset\">\n" + " <tr class=\"lrow\">\n" + " <td><xsl:value-of select=\"name\"/></td>\n" + " <td><xsl:value-of select=\"counter\"/></td>\n" + " </tr>\n" + " </xsl:for-each>\n" + " </table>\n" + " <br/>\n" + " </xsl:for-each>\n" + "\n" + " <br/>\n" + "\n" + " <xsl:for-each select=\"views/view\">\n" + " <table>\n" + " <tr class=\"rowh\">\n" + " <th colspan=\"10\">Zones for View <xsl:value-of select=\"name\"/></th>\n" + " </tr>\n" + " <tr class=\"rowh\">\n" + " <th>Name</th>\n" + " <th>Class</th>\n" + " <th>Serial</th>\n" + " <th>Success</th>\n" + " <th>Referral</th>\n" + " <th>NXRRSET</th>\n" + " <th>NXDOMAIN</th>\n" + " <th>Failure</th>\n" + " <th>XfrReqDone</th>\n" + " <th>XfrRej</th>\n" + " </tr>\n" + " <xsl:for-each select=\"zones/zone\">\n" + " <tr class=\"lrow\">\n" + " <td>\n" + " <xsl:value-of select=\"name\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"rdataclass\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"serial\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"counters/QrySuccess\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"counters/QryReferral\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"counters/QryNxrrset\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"counters/QryNXDOMAIN\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"counters/QryFailure\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"counters/XfrReqDone\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"counters/XfrRej\"/>\n" + " </td>\n" + " </tr>\n" + " </xsl:for-each>\n" + " </table>\n" + " <br/>\n" + " </xsl:for-each>\n" + "\n" + " <br/>\n" + "\n" + " <table>\n" + " <tr class=\"rowh\">\n" + " <th colspan=\"7\">Network Status</th>\n" + " </tr>\n" + " <tr class=\"rowh\">\n" + " <th>ID</th>\n" + " <th>Name</th>\n" + " <th>Type</th>\n" + " <th>References</th>\n" + " <th>LocalAddress</th>\n" + " <th>PeerAddress</th>\n" + " <th>State</th>\n" + " </tr>\n" + " <xsl:for-each select=\"socketmgr/sockets/socket\">\n" + " <tr class=\"lrow\">\n" + " <td>\n" + " <xsl:value-of select=\"id\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"name\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"type\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"references\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"local-address\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"peer-address\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:for-each select=\"states\">\n" + " <xsl:value-of select=\".\"/>\n" + " </xsl:for-each>\n" + " </td>\n" + " </tr>\n" + " </xsl:for-each>\n" + " </table>\n" + " <br/>\n" + " <table>\n" + " <tr class=\"rowh\">\n" + " <th colspan=\"2\">Task Manager Configuration</th>\n" + " </tr>\n" + " <tr class=\"lrow\">\n" + " <td>Thread-Model</td>\n" + " <td>\n" + " <xsl:value-of select=\"taskmgr/thread-model/type\"/>\n" + " </td>\n" + " </tr>\n" + " <tr class=\"lrow\">\n" + " <td>Worker Threads</td>\n" + " <td>\n" + " <xsl:value-of select=\"taskmgr/thread-model/worker-threads\"/>\n" + " </td>\n" + " </tr>\n" + " <tr class=\"lrow\">\n" + " <td>Default Quantum</td>\n" + " <td>\n" + " <xsl:value-of select=\"taskmgr/thread-model/default-quantum\"/>\n" + " </td>\n" + " </tr>\n" + " <tr class=\"lrow\">\n" + " <td>Tasks Running</td>\n" + " <td>\n" + " <xsl:value-of select=\"taskmgr/thread-model/tasks-running\"/>\n" + " </td>\n" + " </tr>\n" + " </table>\n" + " <br/>\n" + " <table>\n" + " <tr class=\"rowh\">\n" + " <th colspan=\"5\">Tasks</th>\n" + " </tr>\n" + " <tr class=\"rowh\">\n" + " <th>ID</th>\n" + " <th>Name</th>\n" + " <th>References</th>\n" + " <th>State</th>\n" + " <th>Quantum</th>\n" + " </tr>\n" + " <xsl:for-each select=\"taskmgr/tasks/task\">\n" + " <tr class=\"lrow\">\n" + " <td>\n" + " <xsl:value-of select=\"id\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"name\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"references\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"state\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"quantum\"/>\n" + " </td>\n" + " </tr>\n" + " </xsl:for-each>\n" + " </table>\n" + " <br />\n" + " <table>\n" + " <tr class=\"rowh\">\n" + " <th colspan=\"4\">Memory Usage Summary</th>\n" + " </tr>\n" + " <xsl:for-each select=\"memory/summary/*\">\n" + " <tr class=\"lrow\">\n" + " <td><xsl:value-of select=\"name()\"/></td>\n" + " <td><xsl:value-of select=\".\"/></td>\n" + " </tr>\n" + " </xsl:for-each>\n" + " </table>\n" + " <br />\n" + " <table>\n" + " <tr class=\"rowh\">\n" + " <th colspan=\"10\">Memory Contexts</th>\n" + " </tr>\n" + " <tr class=\"rowh\">\n" + " <th>ID</th>\n" + " <th>Name</th>\n" + " <th>References</th>\n" + " <th>TotalUse</th>\n" + " <th>InUse</th>\n" + " <th>MaxUse</th>\n" + " <th>BlockSize</th>\n" + " <th>Pools</th>\n" + " <th>HiWater</th>\n" + " <th>LoWater</th>\n" + " </tr>\n" + " <xsl:for-each select=\"memory/contexts/context\">\n" + " <tr class=\"lrow\">\n" + " <td>\n" + " <xsl:value-of select=\"id\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"name\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"references\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"total\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"inuse\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"maxinuse\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"blocksize\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"pools\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"hiwater\"/>\n" + " </td>\n" + " <td>\n" + " <xsl:value-of select=\"lowater\"/>\n" + " </td>\n" + " </tr>\n" + " </xsl:for-each>\n" + " </table>\n" + "\n" + " </body>\n" + " </html>\n" + " </xsl:template>\n" + "</xsl:stylesheet>\n"; +#ifdef HAVE_LIBXML2 +static const char *nsstats_xmldesc[] = { "Requestv4", + "Requestv6", + "ReqEdns0", + "ReqBadEDNSVer", + "ReqTSIG", + "ReqSIG0", + "ReqBadSIG", + "ReqTCP", + "AuthQryRej", + "RecQryRej", + "XfrRej", + "UpdateRej", + "Response", + "TruncatedResp", + "RespEDNS0", + "RespTSIG", + "RespSIG0", + "QrySuccess", + "QryAuthAns", + "QryNoauthAns", + "QryReferral", + "QryNxrrset", + "QrySERVFAIL", + "QryFORMERR", + "QryNXDOMAIN", + "QryRecursion", + "QryDuplicate", + "QryDropped", + "QryFailure", + "XfrReqDone", + "UpdateReqFwd", + "UpdateRespFwd", + "UpdateFwdFail", + "UpdateDone", + "UpdateFail", + "UpdateBadPrereq" +}; +static const char *zonestats_xmldesc[] = { "NotifyOutv4", + "NotifyOutv6", + "NotifyInv4", + "NotifyInv6", + "NotifyRej", + "SOAOutv4", + "SOAOutv6", + "AXFRReqv4", + "AXFRReqv6", + "IXFRReqv4", + "IXFRReqv6", + "XfrSuccess", + "XfrFail" +}; +static const char *resstats_xmldesc[] = { "Queryv4", + "Queryv6", + "Responsev4", + "Responsev6", + "NXDOMAIN", + "SERVFAIL", + "FORMERR", + "OtherError", + "EDNS0Fail", + "Mismatch", + "Truncated", + "Lame", + "Retry", + "GlueFetchv4", + "GlueFetchv6", + "GlueFetchv4Fail", + "GlueFetchv6Fail", + "ValAttempt", + "ValOk", + "ValNegOk", + "ValFail" +}; +#endif diff --git a/bin/named/client.c b/bin/named/client.c index df98201c..0f076d81 100644 --- a/bin/named/client.c +++ b/bin/named/client.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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.250 2007/11/26 04:47:17 marka Exp $ */ +/* $Id: client.c,v 1.250.16.5 2008/04/03 06:20:33 tbox Exp $ */ #include <config.h> @@ -41,6 +41,7 @@ #include <dns/rdatalist.h> #include <dns/rdataset.h> #include <dns/resolver.h> +#include <dns/stats.h> #include <dns/tsig.h> #include <dns/view.h> #include <dns/zone.h> @@ -48,6 +49,7 @@ #include <named/interfacemgr.h> #include <named/log.h> #include <named/notify.h> +#include <named/os.h> #include <named/server.h> #include <named/update.h> @@ -132,7 +134,7 @@ struct ns_clientmgr { #define MANAGER_MAGIC ISC_MAGIC('N', 'S', 'C', 'm') #define VALID_MANAGER(m) ISC_MAGIC_VALID(m, MANAGER_MAGIC) -/*! +/*! * Client object states. Ordering is significant: higher-numbered * states are generally "more active", meaning that the client can * have more dynamically allocated data, outstanding events, etc. @@ -286,7 +288,7 @@ exit_check(ns_client_t *client) { * * Keep the view attached until any outstanding updates complete. */ - if (client->nupdates == 0 && + if (client->nupdates == 0 && client->newstate == NS_CLIENTSTATE_FREED && client->view != NULL) dns_view_detach(&client->view); @@ -834,7 +836,7 @@ client_sendpkg(ns_client_t *client, isc_buffer_t *buffer) { isc_buffer_usedregion(buffer, &r); CTRACE("sendto"); - + result = isc_socket_sendto2(socket, &r, client->task, address, pktinfo, client->sendevent, sockflags); @@ -906,6 +908,7 @@ ns_client_send(ns_client_t *client) { unsigned char sendbuf[SEND_BUFFER_SIZE]; unsigned int dnssec_opts; unsigned int preferred_glue; + isc_boolean_t opt_included = ISC_FALSE; REQUIRE(NS_CLIENT_VALID(client)); @@ -943,11 +946,10 @@ ns_client_send(ns_client_t *client) { result = dns_message_renderbegin(client->message, &cctx, &buffer); if (result != ISC_R_SUCCESS) goto done; + if (client->opt != NULL) { result = dns_message_setopt(client->message, client->opt); - /* - * XXXRTH dns_message_setopt() should probably do this... - */ + opt_included = ISC_TRUE; client->opt = NULL; if (result != ISC_R_SUCCESS) goto done; @@ -1003,6 +1005,26 @@ ns_client_send(ns_client_t *client) { result = client_sendpkg(client, &tcpbuffer); } else result = client_sendpkg(client, &buffer); + + /* update statistics (XXXJT: is it okay to access message->xxxkey?) */ + dns_generalstats_increment(ns_g_server->nsstats, + dns_nsstatscounter_response); + if (opt_included) { + dns_generalstats_increment(ns_g_server->nsstats, + dns_nsstatscounter_edns0out); + } + if (client->message->tsigkey != NULL) { + dns_generalstats_increment(ns_g_server->nsstats, + dns_nsstatscounter_tsigout); + } + if (client->message->sig0key != NULL) { + dns_generalstats_increment(ns_g_server->nsstats, + dns_nsstatscounter_sig0out); + } + if ((client->message->flags & DNS_MESSAGEFLAG_TC) != 0) + dns_generalstats_increment(ns_g_server->nsstats, + dns_nsstatscounter_truncatedresp); + if (result == ISC_R_SUCCESS) return; @@ -1108,8 +1130,8 @@ ns_client_error(ns_client_t *client, isc_result_t result) { /* * FORMERR loop avoidance: If we sent a FORMERR message * with the same ID to the same client less than two - * seconds ago, assume that we are in an infinite error - * packet dialog with a server for some protocol whose + * seconds ago, assume that we are in an infinite error + * packet dialog with a server for some protocol whose * error responses look enough like DNS queries to * elicit a FORMERR response. Drop a packet to break * the loop. @@ -1179,11 +1201,46 @@ client_addopt(ns_client_t *client) { */ rdatalist->ttl = (client->extflags & DNS_MESSAGEEXTFLAG_REPLYPRESERVE); - /* - * No EDNS options in the default case. - */ - rdata->data = NULL; - rdata->length = 0; + /* Set EDNS options if applicable */ + if (client->attributes & NS_CLIENTATTR_WANTNSID && + (ns_g_server->server_id != NULL || + ns_g_server->server_usehostname)) { + /* + * Space required for NSID data: + * 2 bytes for opt code + * + 2 bytes for NSID length + * + NSID itself + */ + char nsid[BUFSIZ]; + isc_buffer_t *buffer = NULL; + + if (ns_g_server->server_usehostname) { + isc_result_t result; + result = ns_os_gethostname(nsid, sizeof(nsid)); + if (result != ISC_R_SUCCESS) { + goto no_nsid; + } + } else { + strncpy(nsid, ns_g_server->server_id, sizeof(nsid)); + } + + rdata->length = strlen(nsid) + 4; + result = isc_buffer_allocate(client->mctx, &buffer, + rdata->length); + if (result != ISC_R_SUCCESS) + goto no_nsid; + + isc_buffer_putuint16(buffer, DNS_OPT_NSID); + isc_buffer_putuint16(buffer, strlen(nsid)); + isc_buffer_putstr(buffer, nsid); + rdata->data = buffer->base; + dns_message_takebuffer(client->message, &buffer); + } else { +no_nsid: + rdata->data = NULL; + rdata->length = 0; + } + rdata->rdclass = rdatalist->rdclass; rdata->type = rdatalist->type; rdata->flags = 0; @@ -1284,6 +1341,7 @@ client_request(isc_task_t *task, isc_event_t *event) { isc_buffer_t tbuffer; dns_view_t *view; dns_rdataset_t *opt; + dns_name_t *signame; isc_boolean_t ra; /* Recursion available. */ isc_netaddr_t netaddr; isc_netaddr_t destaddr; @@ -1291,6 +1349,8 @@ client_request(isc_task_t *task, isc_event_t *event) { dns_messageid_t id; unsigned int flags; isc_boolean_t notimp; + dns_rdata_t rdata; + isc_uint16_t optcode; REQUIRE(event != NULL); client = event->ev_arg; @@ -1440,6 +1500,20 @@ client_request(isc_task_t *task, isc_event_t *event) { } /* + * Update some statistics counters. Don't count responses. + */ + if (isc_sockaddr_pf(&client->peeraddr) == PF_INET) { + dns_generalstats_increment(ns_g_server->nsstats, + dns_nsstatscounter_requestv4); + } else { + dns_generalstats_increment(ns_g_server->nsstats, + dns_nsstatscounter_requestv6); + } + if (TCP_CLIENT(client)) + dns_generalstats_increment(ns_g_server->nsstats, + dns_nsstatscounter_tcp); + + /* * Hash the incoming request here as it is after * dns_dispatch_importrecv(). */ @@ -1460,6 +1534,8 @@ client_request(isc_task_t *task, isc_event_t *event) { goto cleanup; } + dns_opcodestats_increment(ns_g_server->opcodestats, + client->message->opcode); switch (client->message->opcode) { case dns_opcode_query: case dns_opcode_update: @@ -1507,12 +1583,35 @@ client_request(isc_task_t *task, isc_event_t *event) { */ client->ednsversion = (opt->ttl & 0x00FF0000) >> 16; if (client->ednsversion > 0) { + dns_generalstats_increment(ns_g_server->nsstats, + dns_nsstatscounter_badednsver); result = client_addopt(client); if (result == ISC_R_SUCCESS) result = DNS_R_BADVERS; ns_client_error(client, result); goto cleanup; } + + /* Check for NSID request */ + result = dns_rdataset_first(opt); + if (result == ISC_R_SUCCESS) { + dns_rdata_init(&rdata); + dns_rdataset_current(opt, &rdata); + if (rdata.length >= 2) { + isc_buffer_t nsidbuf; + isc_buffer_init(&nsidbuf, + rdata.data, rdata.length); + isc_buffer_add(&nsidbuf, rdata.length); + optcode = isc_buffer_getuint16(&nsidbuf); + if (optcode == DNS_OPT_NSID) + client->attributes |= + NS_CLIENTATTR_WANTNSID; + } + } + + dns_generalstats_increment(ns_g_server->nsstats, + dns_nsstatscounter_edns0in); + /* * Create an OPT for our reply. */ @@ -1542,7 +1641,7 @@ client_request(isc_task_t *task, isc_event_t *event) { * For IPv6 UDP queries, we get this from the pktinfo structure (if * supported). * If all the attempts fail (this can happen due to memory shortage, - * etc), we regard this as an error for safety. + * etc), we regard this as an error for safety. */ if ((client->interface->flags & NS_INTERFACEFLAG_ANYADDR) == 0) isc_netaddr_fromsockaddr(&destaddr, &client->interface->addr); @@ -1657,6 +1756,17 @@ client_request(isc_task_t *task, isc_event_t *event) { client->signer = NULL; dns_name_init(&client->signername, NULL); result = dns_message_signer(client->message, &client->signername); + if (result != ISC_R_NOTFOUND) { + signame = NULL; + if (dns_message_gettsig(client->message, &signame) != NULL) { + dns_generalstats_increment(ns_g_server->nsstats, + dns_nsstatscounter_tsigin); + } else { + dns_generalstats_increment(ns_g_server->nsstats, + dns_nsstatscounter_sig0in); + } + + } if (result == ISC_R_SUCCESS) { ns_client_log(client, DNS_LOGCATEGORY_SECURITY, NS_LOGMODULE_CLIENT, ISC_LOG_DEBUG(3), @@ -1673,15 +1783,17 @@ client_request(isc_task_t *task, isc_event_t *event) { } else { char tsigrcode[64]; isc_buffer_t b; - dns_name_t *name = NULL; dns_rcode_t status; isc_result_t tresult; /* There is a signature, but it is bad. */ - if (dns_message_gettsig(client->message, &name) != NULL) { + dns_generalstats_increment(ns_g_server->nsstats, + dns_nsstatscounter_invalidsig); + signame = NULL; + if (dns_message_gettsig(client->message, &signame) != NULL) { char namebuf[DNS_NAME_FORMATSIZE]; char cnamebuf[DNS_NAME_FORMATSIZE]; - dns_name_format(name, namebuf, sizeof(namebuf)); + dns_name_format(signame, namebuf, sizeof(namebuf)); status = client->message->tsigstatus; isc_buffer_init(&b, tsigrcode, sizeof(tsigrcode) - 1); tresult = dns_tsigrcode_totext(status, &b); @@ -1851,6 +1963,7 @@ get_clientmctx(ns_clientmgr_t *manager, isc_mem_t **mctxp) { result = isc_mem_create(0, 0, &clientmctx); if (result != ISC_R_SUCCESS) return (result); + isc_mem_setname(clientmctx, "client", NULL); manager->mctxpool[manager->nextmctx] = clientmctx; } @@ -2490,12 +2603,12 @@ ns_client_checkaclsilent(ns_client_t *client, isc_sockaddr_t *sockaddr, goto deny; } - + if (sockaddr == NULL) isc_netaddr_fromsockaddr(&netaddr, &client->peeraddr); else isc_netaddr_fromsockaddr(&netaddr, sockaddr); - + result = dns_acl_match(&netaddr, client->signer, acl, &ns_g_server->aclenv, &match, NULL); @@ -2521,7 +2634,7 @@ ns_client_checkacl(ns_client_t *client, isc_sockaddr_t *sockaddr, isc_result_t result = ns_client_checkaclsilent(client, sockaddr, acl, default_allow); - if (result == ISC_R_SUCCESS) + if (result == ISC_R_SUCCESS) ns_client_log(client, DNS_LOGCATEGORY_SECURITY, NS_LOGMODULE_CLIENT, ISC_LOG_DEBUG(3), "%s approved", opname); @@ -2577,7 +2690,7 @@ ns_client_log(ns_client_t *client, isc_logcategory_t *category, void ns_client_aclmsg(const char *msg, dns_name_t *name, dns_rdatatype_t type, - dns_rdataclass_t rdclass, char *buf, size_t len) + dns_rdataclass_t rdclass, char *buf, size_t len) { char namebuf[DNS_NAME_FORMATSIZE]; char typebuf[DNS_RDATATYPE_FORMATSIZE]; diff --git a/bin/named/config.c b/bin/named/config.c index efc67966..ac1074b4 100644 --- a/bin/named/config.c +++ b/bin/named/config.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: config.c,v 1.82.38.2 2008/01/22 23:27:35 tbox Exp $ */ +/* $Id: config.c,v 1.82.38.4 2008/05/01 18:32:31 jinmei Exp $ */ /*! \file */ @@ -99,6 +99,7 @@ options {\n\ use-ixfr true;\n\ edns-udp-size 4096;\n\ max-udp-size 4096;\n\ + request-nsid false;\n\ \n\ /* view */\n\ allow-notify {none;};\n\ @@ -123,7 +124,7 @@ options {\n\ query-source-v6 address *;\n\ notify-source *;\n\ notify-source-v6 *;\n\ - cleaning-interval 60;\n\ + cleaning-interval 0; /* now meaningless */\n\ min-roots 2;\n\ lame-ttl 600;\n\ max-ncache-ttl 10800; /* 3 hours */\n\ diff --git a/bin/named/convertxsl.pl b/bin/named/convertxsl.pl index b6ea4bd9..3ac071a9 100755 --- a/bin/named/convertxsl.pl +++ b/bin/named/convertxsl.pl @@ -1,6 +1,6 @@ #!/usr/bin/env perl # -# Copyright (C) 2006, 2007 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2006-2008 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,19 +14,19 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: convertxsl.pl,v 1.9 2007/09/14 06:14:44 marka Exp $ +# $Id: convertxsl.pl,v 1.9.60.4 2008/04/03 10:51:01 marka Exp $ use strict; use warnings; -my $rev = '$Id: convertxsl.pl,v 1.9 2007/09/14 06:14:44 marka Exp $'; +my $rev = '$Id: convertxsl.pl,v 1.9.60.4 2008/04/03 10:51:01 marka Exp $'; $rev =~ s/\$//g; $rev =~ s/,v//g; $rev =~ s/Id: //; my $xsl = "unknown"; - my $lines = ''; +my (@nsstatsdesc, @zonestatsdesc, @resstatsdesc); while (<>) { chomp; @@ -34,7 +34,23 @@ while (<>) { $xsl = $_ if (/<!-- .Id:.* -->/); # convert Id string to a form not recognisable by cvs. $_ =~ s/<!-- .Id:(.*). -->/<!-- \\045Id: $1\\045 -->/; - $lines .= $_; + if (/server\/nsstats\/(\w+)\"/) { + push(@nsstatsdesc, $1); + } elsif (/server\/zonestats\/(\w+)\"/) { + push(@zonestatsdesc, $1); + } elsif (/\"resstats\/(\w+)\"/) { + push(@resstatsdesc, $1); + } + s/[\ \t]+/ /g; + s/\>\ \</\>\</g; + s/\"/\\\"/g; + s/^/\t\"/; + s/$/\\n\"/; + if ($lines eq "") { + $lines .= $_; + } else { + $lines .= "\n" . $_; + } } $xsl =~ s/\$//g; @@ -42,12 +58,34 @@ $xsl =~ s/<!-- Id: //; $xsl =~ s/ -->.*//; $xsl =~ s/,v//; -$lines =~ s/[\ \t]+/ /g; -$lines =~ s/\>\ \</\>\</g; -$lines =~ s/\"/\\\"/g; - print "/*\n * Generated by $rev \n * From $xsl\n */\n"; -print 'static char msg[] = "'; +print 'static char xslmsg[] =',"\n"; print $lines; -print '\\n";', "\n"; +print ';', "\n"; + +print '#ifdef HAVE_LIBXML2', "\n"; +print "static const char *nsstats_xmldesc[] = {"; +while (my $desc = shift(@nsstatsdesc)) { + print "\t\"$desc\""; + print "," if (@nsstatsdesc); + print "\n"; +} +print "};\n"; + +print "static const char *zonestats_xmldesc[] = {"; +while (my $desc = shift(@zonestatsdesc)) { + print "\t\"$desc\""; + print "," if (@zonestatsdesc); + print "\n"; +} +print "};\n"; + +print "static const char *resstats_xmldesc[] = {"; +while (my $desc = shift(@resstatsdesc)) { + print "\t\"$desc\""; + print "," if (@resstatsdesc); + print "\n"; +} +print "};\n"; +print '#endif', "\n"; diff --git a/bin/named/include/named/client.h b/bin/named/include/named/client.h index 44c800d1..58df59d1 100644 --- a/bin/named/include/named/client.h +++ b/bin/named/include/named/client.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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.h,v 1.82 2007/06/18 23:47:19 tbox Exp $ */ +/* $Id: client.h,v 1.82.128.2 2008/04/03 06:08:26 tbox Exp $ */ #ifndef NAMED_CLIENT_H #define NAMED_CLIENT_H 1 @@ -24,7 +24,7 @@ ***** Module Info *****/ -/*! \file +/*! \file * \brief * This module defines two objects, ns_client_t and ns_clientmgr_t. * @@ -159,6 +159,7 @@ struct ns_client { #define NS_CLIENTATTR_PKTINFO 0x04 /*%< pktinfo is valid */ #define NS_CLIENTATTR_MULTICAST 0x08 /*%< recv'd from multicast */ #define NS_CLIENTATTR_WANTDNSSEC 0x10 /*%< include dnssec records */ +#define NS_CLIENTATTR_WANTNSID 0x20 /*%< include nameserver ID */ extern unsigned int ns_client_requests; @@ -358,8 +359,8 @@ ns_client_qnamereplace(ns_client_t *client, dns_name_t *name); isc_boolean_t ns_client_isself(dns_view_t *myview, dns_tsigkey_t *mykey, - isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr, - dns_rdataclass_t rdclass, void *arg); + isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr, + dns_rdataclass_t rdclass, void *arg); /*% * Isself callback. */ diff --git a/bin/named/include/named/server.h b/bin/named/include/named/server.h index 362f9721..f1b23edb 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.88.10.3 2008/01/24 02:29:56 jinmei Exp $ */ +/* $Id: server.h,v 1.88.10.4 2008/04/03 06:10:19 marka Exp $ */ #ifndef NAMED_SERVER_H #define NAMED_SERVER_H 1 @@ -91,7 +91,11 @@ struct ns_server { isc_boolean_t flushonshutdown; isc_boolean_t log_queries; /*%< For BIND 8 compatibility */ - dns_stats_t * querystats; /*%< Query statistics counters */ + dns_stats_t * nsstats; /*%< Server statistics */ + dns_stats_t * rcvquerystats; /*% Incoming query statistics */ + dns_stats_t * opcodestats; /*%< Incoming message statistics */ + dns_stats_t * zonestats; /*% Zone management statistics */ + dns_stats_t * resolverstats; /*% Resolver statistics */ ns_controls_t * controls; /*%< Control channels */ unsigned int dispatchgen; @@ -105,6 +109,55 @@ struct ns_server { #define NS_SERVER_MAGIC ISC_MAGIC('S','V','E','R') #define NS_SERVER_VALID(s) ISC_MAGIC_VALID(s, NS_SERVER_MAGIC) +/*% + * Server statistics counters. Used as dns_statscounter_t values. + */ +enum { + dns_nsstatscounter_requestv4 = 0, + dns_nsstatscounter_requestv6 = 1, + dns_nsstatscounter_edns0in = 2, + dns_nsstatscounter_badednsver = 3, + dns_nsstatscounter_tsigin = 4, + dns_nsstatscounter_sig0in = 5, + dns_nsstatscounter_invalidsig = 6, + dns_nsstatscounter_tcp = 7, + + dns_nsstatscounter_authrej = 8, + dns_nsstatscounter_recurserej = 9, + dns_nsstatscounter_xfrrej = 10, + dns_nsstatscounter_updaterej = 11, + + dns_nsstatscounter_response = 12, + dns_nsstatscounter_truncatedresp = 13, + dns_nsstatscounter_edns0out = 14, + dns_nsstatscounter_tsigout = 15, + dns_nsstatscounter_sig0out = 16, + + dns_nsstatscounter_success = 17, + dns_nsstatscounter_authans = 18, + dns_nsstatscounter_nonauthans = 19, + dns_nsstatscounter_referral = 20, + dns_nsstatscounter_nxrrset = 21, + dns_nsstatscounter_servfail = 22, + dns_nsstatscounter_formerr = 23, + dns_nsstatscounter_nxdomain = 24, + dns_nsstatscounter_recursion = 25, + dns_nsstatscounter_duplicate = 26, + dns_nsstatscounter_dropped = 27, + dns_nsstatscounter_failure = 28, + + dns_nsstatscounter_xfrdone = 29, + + dns_nsstatscounter_updatereqfwd = 30, + dns_nsstatscounter_updaterespfwd = 31, + dns_nsstatscounter_updatefwdfail = 32, + dns_nsstatscounter_updatedone = 33, + dns_nsstatscounter_updatefail = 34, + dns_nsstatscounter_updatebadprereq = 35, + + dns_nsstatscounter_max = 36 +}; + void ns_server_create(isc_mem_t *mctx, ns_server_t **serverp); /*%< diff --git a/bin/named/include/named/statschannel.h b/bin/named/include/named/statschannel.h index 9b51dfdf..da89423d 100644 --- a/bin/named/include/named/statschannel.h +++ b/bin/named/include/named/statschannel.h @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: statschannel.h,v 1.2.2.1 2008/01/17 00:24:31 jinmei Exp $ */ +/* $Id: statschannel.h,v 1.2.2.2 2008/04/03 06:10:19 marka Exp $ */ #ifndef NAMED_STATSCHANNEL_H #define NAMED_STATSCHANNEL_H 1 @@ -52,4 +52,10 @@ ns_statschannels_shutdown(ns_server_t *server); * Initiate shutdown of all the statistics channel listeners. */ +isc_result_t +ns_stats_dump(ns_server_t *server, FILE *fp); +/*%< + * Dump statistics counters managed by the server to the file fp. + */ + #endif /* NAMED_STATSCHANNEL_H */ diff --git a/bin/named/main.c b/bin/named/main.c index f2a3e74a..cd6e9f74 100644 --- a/bin/named/main.c +++ b/bin/named/main.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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.158 2007/09/26 03:22:43 marka Exp $ */ +/* $Id: main.c,v 1.158.48.2 2008/04/03 23:46:30 tbox Exp $ */ /*! \file */ @@ -356,7 +356,7 @@ parse_command_line(int argc, char *argv[]) { isc_commandline_errprint = ISC_FALSE; while ((ch = isc_commandline_parse(argc, argv, - "46c:C:d:fgi:lm:n:N:p:P:st:u:vx:")) != -1) { + "46c:C:d:fgi:lm:n:N:p:P:st:u:vx:")) != -1) { switch (ch) { case '4': if (disable4) @@ -667,7 +667,7 @@ setup(void) { sizeof(absolute_conffile)); if (result != ISC_R_SUCCESS) ns_main_earlyfatal("could not construct absolute path of " - "configuration file: %s", + "configuration file: %s", isc_result_totext(result)); ns_g_conffile = absolute_conffile; } @@ -767,7 +767,7 @@ ns_smf_get_instance(char **ins_name, int debug, isc_mem_t *mctx) { if (debug) UNEXPECTED_ERROR(__FILE__, __LINE__, "scf_handle_create() failed: %s", - scf_strerror(scf_error())); + scf_strerror(scf_error())); return (ISC_R_FAILURE); } @@ -867,6 +867,7 @@ main(int argc, char *argv[]) { if (result != ISC_R_SUCCESS) ns_main_earlyfatal("isc_mem_create() failed: %s", isc_result_totext(result)); + isc_mem_setname(ns_g_mctx, "main", NULL); setup(); diff --git a/bin/named/query.c b/bin/named/query.c index 843b5540..eb6e580c 100644 --- a/bin/named/query.c +++ b/bin/named/query.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: query.c,v 1.298.48.4 2008/01/24 02:29:56 jinmei Exp $ */ +/* $Id: query.c,v 1.298.48.7 2008/04/29 00:56:50 marka Exp $ */ /*! \file */ @@ -128,35 +128,37 @@ static inline void inc_stats(ns_client_t *client, dns_statscounter_t counter) { dns_zone_t *zone = client->query.authzone; - REQUIRE(counter < DNS_STATS_NCOUNTERS); - - dns_stats_incrementcounter(ns_g_server->querystats, counter); + dns_generalstats_increment(ns_g_server->nsstats, counter); if (zone != NULL) { - dns_stats_t *zonestats = dns_zone_getstats(zone); + dns_stats_t *zonestats = dns_zone_getrequeststats(zone); if (zonestats != NULL) - dns_stats_incrementcounter(zonestats, counter); + dns_generalstats_increment(zonestats, counter); } } static void query_send(ns_client_t *client) { dns_statscounter_t counter; + if ((client->message->flags & DNS_MESSAGEFLAG_AA) == 0) + inc_stats(client, dns_nsstatscounter_nonauthans); + else + inc_stats(client, dns_nsstatscounter_authans); if (client->message->rcode == dns_rcode_noerror) { if (ISC_LIST_EMPTY(client->message->sections[DNS_SECTION_ANSWER])) { if (client->query.isreferral) { - counter = dns_statscounter_referral; + counter = dns_nsstatscounter_referral; } else { - counter = dns_statscounter_nxrrset; + counter = dns_nsstatscounter_nxrrset; } } else { - counter = dns_statscounter_success; + counter = dns_nsstatscounter_success; } } else if (client->message->rcode == dns_rcode_nxdomain) { - counter = dns_statscounter_nxdomain; + counter = dns_nsstatscounter_nxdomain; } else { /* We end up here in case of YXDOMAIN, and maybe others */ - counter = dns_statscounter_failure; + counter = dns_nsstatscounter_failure; } inc_stats(client, counter); ns_client_send(client); @@ -164,18 +166,28 @@ query_send(ns_client_t *client) { static void query_error(ns_client_t *client, isc_result_t result) { - inc_stats(client, dns_statscounter_failure); + switch (result) { + case DNS_R_SERVFAIL: + inc_stats(client, dns_nsstatscounter_servfail); + break; + case DNS_R_FORMERR: + inc_stats(client, dns_nsstatscounter_formerr); + break; + default: + inc_stats(client, dns_nsstatscounter_failure); + break; + } ns_client_error(client, result); } static void query_next(ns_client_t *client, isc_result_t result) { if (result == DNS_R_DUPLICATE) - inc_stats(client, dns_statscounter_duplicate); + inc_stats(client, dns_nsstatscounter_duplicate); else if (result == DNS_R_DROP) - inc_stats(client, dns_statscounter_dropped); + inc_stats(client, dns_nsstatscounter_dropped); else - inc_stats(client, dns_statscounter_failure); + inc_stats(client, dns_nsstatscounter_failure); ns_client_next(client, result); } @@ -2758,6 +2770,13 @@ query_addwildcardproof(ns_client_t *client, dns_db_t *db, &olabels); (void)dns_name_fullcompare(name, &nsec.next, &order, &nlabels); + /* + * Check for a pathological condition created when + * serving some malformed signed zones and bail out. + */ + if (dns_name_countlabels(name) == nlabels) + goto cleanup; + if (olabels > nlabels) dns_name_split(name, olabels, NULL, wname); else @@ -2925,13 +2944,14 @@ query_resume(isc_task_t *task, isc_event_t *event) { static isc_result_t query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qdomain, - dns_rdataset_t *nameservers) + dns_rdataset_t *nameservers, isc_boolean_t resuming) { isc_result_t result; dns_rdataset_t *rdataset, *sigrdataset; isc_sockaddr_t *peeraddr; - inc_stats(client, dns_statscounter_recursion); + if (!resuming) + inc_stats(client, dns_nsstatscounter_recursion); /* * We are about to recurse, which means that this client will @@ -3336,6 +3356,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) unsigned int options; isc_boolean_t empty_wild; dns_rdataset_t *noqname; + isc_boolean_t resuming; CTRACE("query_find"); @@ -3361,6 +3382,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) need_wildcardproof = ISC_FALSE; empty_wild = ISC_FALSE; options = 0; + resuming = ISC_FALSE; if (event != NULL) { /* @@ -3403,6 +3425,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) } result = event->result; + resuming = ISC_TRUE; goto resume; } @@ -3490,6 +3513,11 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) } if (result != ISC_R_SUCCESS) { if (result == DNS_R_REFUSED) { + if (WANTRECURSION(client)) { + inc_stats(client, + dns_nsstatscounter_recurserej); + } else + inc_stats(client, dns_nsstatscounter_authrej); if (!PARTIALANSWER(client)) QUERY_ERROR(DNS_R_REFUSED); } else @@ -3603,7 +3631,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) */ if (RECURSIONOK(client)) { result = query_recurse(client, qtype, - NULL, NULL); + NULL, NULL, resuming); if (result == ISC_R_SUCCESS) client->query.attributes |= NS_QUERYATTR_RECURSING; @@ -3774,10 +3802,12 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) */ if (dns_rdatatype_atparent(type)) result = query_recurse(client, qtype, - NULL, NULL); + NULL, NULL, + resuming); else result = query_recurse(client, qtype, - fname, rdataset); + fname, rdataset, + resuming); if (result == ISC_R_SUCCESS) client->query.attributes |= NS_QUERYATTR_RECURSING; @@ -4221,7 +4251,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) result = query_recurse(client, qtype, NULL, - NULL); + NULL, + resuming); if (result == ISC_R_SUCCESS) client->query.attributes |= NS_QUERYATTR_RECURSING; @@ -4531,6 +4562,7 @@ ns_query_start(ns_client_t *client) { rdataset = ISC_LIST_HEAD(client->query.qname->list); INSIST(rdataset != NULL); qtype = rdataset->type; + dns_rdatatypestats_increment(ns_g_server->rcvquerystats, qtype); if (dns_rdatatype_ismeta(qtype)) { switch (qtype) { case dns_rdatatype_any: diff --git a/bin/named/server.c b/bin/named/server.c index 08973564..d0037d92 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: server.c,v 1.495.10.6 2008/01/24 02:29:56 jinmei Exp $ */ +/* $Id: server.c,v 1.495.10.10 2008/04/03 06:20:33 tbox Exp $ */ /*! \file */ @@ -730,6 +730,11 @@ configure_peer(const cfg_obj_t *cpeer, isc_mem_t *mctx, dns_peer_t **peerp) { CHECK(dns_peer_setrequestixfr(peer, cfg_obj_asboolean(obj))); obj = NULL; + (void)cfg_map_get(cpeer, "request-nsid", &obj); + if (obj != NULL) + CHECK(dns_peer_setrequestnsid(peer, cfg_obj_asboolean(obj))); + + obj = NULL; (void)cfg_map_get(cpeer, "edns", &obj); if (obj != NULL) CHECK(dns_peer_setsupportedns(peer, cfg_obj_asboolean(obj))); @@ -937,6 +942,24 @@ check_dbtype(dns_zone_t **zonep, unsigned int dbtypec, const char **dbargv, isc_mem_free(mctx, argv); } +static isc_result_t +setquerystats(dns_zone_t *zone, isc_mem_t *mctx, isc_boolean_t on) { + isc_result_t result; + dns_stats_t *zoneqrystats; + + zoneqrystats = NULL; + if (on) { + result = dns_generalstats_create(mctx, &zoneqrystats, + dns_nsstatscounter_max); + if (result != ISC_R_SUCCESS) + return (result); + } + dns_zone_setrequeststats(zone, zoneqrystats); + if (zoneqrystats != NULL) + dns_stats_detach(&zoneqrystats); + + return (ISC_R_SUCCESS); +} /* * Configure 'view' according to 'vconfig', taking defaults from 'config' @@ -993,6 +1016,8 @@ configure_view(dns_view_t *view, const cfg_obj_t *config, isc_boolean_t empty_zones_enable; const cfg_obj_t *disablelist = NULL; isc_uint32_t nqports, qports_updateinterval; + dns_stats_t *resstats = NULL; + dns_stats_t *resquerystats = NULL; REQUIRE(DNS_VIEW_VALID(view)); @@ -1042,6 +1067,7 @@ configure_view(dns_view_t *view, const cfg_obj_t *config, CHECK(isc_mem_create(0, 0, &cmctx)); CHECK(dns_acache_create(&view->acache, cmctx, ns_g_taskmgr, ns_g_timermgr)); + isc_mem_setname(cmctx, "acache", NULL); isc_mem_detach(&cmctx); } if (view->acache != NULL) { @@ -1136,6 +1162,8 @@ configure_view(dns_view_t *view, const cfg_obj_t *config, * Configure the view's cache. Try to reuse an existing * cache if possible, otherwise create a new cache. * Note that the ADB is not preserved in either case. + * When a matching view is found, the associated statistics are + * also retrieved and reused. * * XXX Determining when it is safe to reuse a cache is * tricky. When the view's configuration changes, the cached @@ -1157,11 +1185,14 @@ configure_view(dns_view_t *view, const cfg_obj_t *config, "reusing existing cache"); reused_cache = ISC_TRUE; dns_cache_attach(pview->cache, &cache); + dns_view_getresstats(pview, &resstats); + dns_view_getresquerystats(pview, &resquerystats); dns_view_detach(&pview); } else { CHECK(isc_mem_create(0, 0, &cmctx)); CHECK(dns_cache_create(cmctx, ns_g_taskmgr, ns_g_timermgr, view->rdclass, "rbt", 0, NULL, &cache)); + isc_mem_setname(cmctx, "cache", NULL); } dns_view_setcache(view, cache); @@ -1337,6 +1368,15 @@ configure_view(dns_view_t *view, const cfg_obj_t *config, * 60)); } + if (resstats == NULL) { + CHECK(dns_generalstats_create(mctx, &resstats, + dns_resstatscounter_max)); + } + dns_view_setresstats(view, resstats); + if (resquerystats == NULL) + CHECK(dns_rdatatypestats_create(mctx, &resquerystats)); + dns_view_setresquerystats(view, resquerystats); + /* * Set the ADB cache size to 1/8th of the max-cache-size. */ @@ -1655,6 +1695,11 @@ configure_view(dns_view_t *view, const cfg_obj_t *config, view->provideixfr = cfg_obj_asboolean(obj); obj = NULL; + result = ns_config_get(maps, "request-nsid", &obj); + INSIST(result == ISC_R_SUCCESS); + view->requestnsid = cfg_obj_asboolean(obj); + + obj = NULL; result = ns_config_get(maps, "max-clients-per-query", &obj); INSIST(result == ISC_R_SUCCESS); max_clients_per_query = cfg_obj_asuint32(obj); @@ -1823,6 +1868,7 @@ configure_view(dns_view_t *view, const cfg_obj_t *config, const char *empty_dbtype[4] = { "_builtin", "empty", NULL, NULL }; int empty_dbtypec = 4; + isc_boolean_t zonestats_on; dns_fixedname_init(&fixed); name = dns_fixedname_name(&fixed); @@ -1857,6 +1903,11 @@ configure_view(dns_view_t *view, const cfg_obj_t *config, } else empty_dbtype[3] = "."; + obj = NULL; + result = ns_config_get(maps, "zone-statistics", &obj); + INSIST(result == ISC_R_SUCCESS); + zonestats_on = cfg_obj_asboolean(obj); + logit = ISC_TRUE; for (empty = empty_zones[empty_zone].zone; empty != NULL; @@ -1881,6 +1932,7 @@ configure_view(dns_view_t *view, const cfg_obj_t *config, */ (void)dns_view_findzone(view, name, &zone); if (zone != NULL) { + CHECK(setquerystats(zone, mctx, zonestats_on)); dns_zone_detach(&zone); continue; } @@ -1931,6 +1983,8 @@ configure_view(dns_view_t *view, const cfg_obj_t *config, if (zone != NULL) { dns_zone_setview(zone, view); CHECK(dns_view_addzone(view, zone)); + CHECK(setquerystats(zone, mctx, + zonestats_on)); dns_zone_detach(&zone); continue; } @@ -1942,6 +1996,7 @@ configure_view(dns_view_t *view, const cfg_obj_t *config, CHECK(dns_zonemgr_managezone(ns_g_server->zonemgr, zone)); dns_zone_setclass(zone, view->rdclass); dns_zone_settype(zone, dns_zone_master); + dns_zone_setstats(zone, ns_g_server->zonestats); CHECK(dns_zone_setdbtype(zone, empty_dbtypec, empty_dbtype)); if (view->queryacl != NULL) @@ -1952,6 +2007,7 @@ configure_view(dns_view_t *view, const cfg_obj_t *config, dns_zone_setnotifytype(zone, dns_notifytype_no); dns_zone_setoption(zone, DNS_ZONEOPT_NOCHECKNS, ISC_TRUE); + CHECK(setquerystats(zone, mctx, zonestats_on)); CHECK(dns_view_addzone(view, zone)); isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER, ISC_LOG_INFO, @@ -1970,6 +2026,10 @@ configure_view(dns_view_t *view, const cfg_obj_t *config, dns_dispatch_detach(&dispatch4); if (dispatch6 != NULL) dns_dispatch_detach(&dispatch6); + if (resstats != NULL) + dns_stats_detach(&resstats); + if (resquerystats != NULL) + dns_stats_detach(&resquerystats); if (order != NULL) dns_order_detach(&order); if (cmctx != NULL) @@ -2418,6 +2478,7 @@ configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig, if (view->acache != NULL) dns_zone_setacache(zone, view->acache); CHECK(dns_zonemgr_managezone(ns_g_server->zonemgr, zone)); + dns_zone_setstats(zone, ns_g_server->zonestats); } /* @@ -3461,8 +3522,12 @@ load_configuration(const char *filename, ns_server_t *server, result = ns_config_get(maps, "server-id", &obj); server->server_usehostname = ISC_FALSE; if (result == ISC_R_SUCCESS && cfg_obj_isboolean(obj)) { - server->server_usehostname = ISC_TRUE; + /* The parser translates "hostname" to ISC_TRUE */ + server->server_usehostname = cfg_obj_asboolean(obj); + result = setstring(server, &server->server_id, NULL); + RUNTIME_CHECK(result == ISC_R_SUCCESS); } else if (result == ISC_R_SUCCESS) { + /* Found a quoted string */ CHECKM(setoptstring(server, &server->server_id, obj), "strdup"); } else { result = setstring(server, &server->server_id, NULL); @@ -3595,6 +3660,8 @@ run_server(isc_task_t *task, isc_event_t *event) { &ns_g_dispatchmgr), "creating dispatch manager"); + dns_dispatchmgr_setstats(ns_g_dispatchmgr, server->resolverstats); + CHECKFATAL(ns_interfacemgr_create(ns_g_mctx, ns_g_taskmgr, ns_g_socketmgr, ns_g_dispatchmgr, &server->interfacemgr), @@ -3783,7 +3850,11 @@ ns_server_create(isc_mem_t *mctx, ns_server_t **serverp) { server->statsfile = isc_mem_strdup(server->mctx, "named.stats"); CHECKFATAL(server->statsfile == NULL ? ISC_R_NOMEMORY : ISC_R_SUCCESS, "isc_mem_strdup"); - server->querystats = NULL; + server->nsstats = NULL; + server->rcvquerystats = NULL; + server->opcodestats = NULL; + server->zonestats = NULL; + server->resolverstats = NULL; server->dumpfile = isc_mem_strdup(server->mctx, "named_dump.db"); CHECKFATAL(server->dumpfile == NULL ? ISC_R_NOMEMORY : ISC_R_SUCCESS, @@ -3800,8 +3871,24 @@ ns_server_create(isc_mem_t *mctx, ns_server_t **serverp) { server->server_usehostname = ISC_FALSE; server->server_id = NULL; - CHECKFATAL(dns_stats_create(ns_g_mctx, &server->querystats), - "dns_stats_create"); + CHECKFATAL(dns_generalstats_create(ns_g_mctx, &server->nsstats, + dns_nsstatscounter_max), + "dns_stats_create (server)"); + + CHECKFATAL(dns_rdatatypestats_create(ns_g_mctx, + &server->rcvquerystats), + "dns_stats_create (rcvquery)"); + + CHECKFATAL(dns_opcodestats_create(ns_g_mctx, &server->opcodestats), + "dns_stats_create (opcode)"); + + CHECKFATAL(dns_generalstats_create(ns_g_mctx, &server->zonestats, + dns_zonestatscounter_max), + "dns_stats_create (zone)"); + + CHECKFATAL(dns_generalstats_create(ns_g_mctx, &server->resolverstats, + dns_resstatscounter_max), + "dns_stats_create (resolver)"); server->flushonshutdown = ISC_FALSE; server->log_queries = ISC_FALSE; @@ -3825,7 +3912,11 @@ ns_server_destroy(ns_server_t **serverp) { ns_controls_destroy(&server->controls); - dns_stats_destroy(server->mctx, &server->querystats); + dns_stats_detach(&server->nsstats); + dns_stats_detach(&server->rcvquerystats); + dns_stats_detach(&server->opcodestats); + dns_stats_detach(&server->zonestats); + dns_stats_detach(&server->resolverstats); isc_mem_free(server->mctx, server->statsfile); isc_mem_free(server->mctx, server->dumpfile); @@ -4389,60 +4480,14 @@ ns_listenelt_fromconfig(const cfg_obj_t *listener, const cfg_obj_t *config, isc_result_t ns_server_dumpstats(ns_server_t *server) { isc_result_t result; - dns_zone_t *zone, *next; - isc_stdtime_t now; FILE *fp = NULL; - int i; - int ncounters; - isc_uint64_t counters[DNS_STATS_NCOUNTERS]; - - isc_stdtime_get(&now); CHECKMF(isc_stdio_open(server->statsfile, "a", &fp), "could not open statistics dump file", server->statsfile); - ncounters = DNS_STATS_NCOUNTERS; - fprintf(fp, "+++ Statistics Dump +++ (%lu)\n", (unsigned long)now); - - dns_stats_copy(server->querystats, counters); - for (i = 0; i < ncounters; i++) - fprintf(fp, "%s %" ISC_PRINT_QUADFORMAT "u\n", - dns_statscounter_names[i], counters[i]); - - zone = NULL; - for (result = dns_zone_first(server->zonemgr, &zone); - result == ISC_R_SUCCESS; - next = NULL, result = dns_zone_next(zone, &next), zone = next) - { - dns_stats_t *zonestats = dns_zone_getstats(zone); - if (zonestats != NULL) { - char zonename[DNS_NAME_FORMATSIZE]; - dns_view_t *view; - char *viewname; - - dns_stats_copy(zonestats, counters); - dns_name_format(dns_zone_getorigin(zone), - zonename, sizeof(zonename)); - view = dns_zone_getview(zone); - viewname = view->name; - for (i = 0; i < ncounters; i++) { - fprintf(fp, "%s %" ISC_PRINT_QUADFORMAT - "u %s", - dns_statscounter_names[i], - counters[i], - zonename); - if (strcmp(viewname, "_default") != 0) - fprintf(fp, " %s", viewname); - fprintf(fp, "\n"); - } - } - } - if (result == ISC_R_NOMORE) - result = ISC_R_SUCCESS; + result = ns_stats_dump(server, fp); CHECK(result); - fprintf(fp, "--- Statistics Dump --- (%lu)\n", (unsigned long)now); - cleanup: if (fp != NULL) (void)isc_stdio_close(fp); diff --git a/bin/named/statschannel.c b/bin/named/statschannel.c index 3b4bd831..e5b7c338 100644 --- a/bin/named/statschannel.c +++ b/bin/named/statschannel.c @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: statschannel.c,v 1.2.2.4 2008/01/24 02:29:56 jinmei Exp $ */ +/* $Id: statschannel.c,v 1.2.2.9 2008/04/09 22:53:06 tbox Exp $ */ /*! \file */ @@ -23,17 +23,25 @@ #include <isc/buffer.h> #include <isc/httpd.h> #include <isc/mem.h> +#include <isc/once.h> #include <isc/print.h> #include <isc/socket.h> #include <isc/task.h> +#include <dns/db.h> +#include <dns/opcode.h> +#include <dns/rdataclass.h> +#include <dns/rdatatype.h> #include <dns/stats.h> #include <dns/view.h> +#include <dns/zt.h> #include <named/log.h> #include <named/server.h> #include <named/statschannel.h> +#include "bind9.xsl.h" + struct ns_statschannel { /* Unlocked */ isc_httpdmgr_t *httpdmgr; @@ -51,6 +59,190 @@ struct ns_statschannel { ISC_LINK(struct ns_statschannel) link; }; +typedef enum { statsformat_file, statsformat_xml } statsformat_t; + +typedef struct +stats_dumparg { + statsformat_t type; + void *arg; /* type dependent argument */ + const char **desc; /* used for general statistics */ + int ncounters; /* used for general statistics */ +} stats_dumparg_t; + +static isc_once_t once = ISC_ONCE_INIT; + +static void +generalstat_dump(dns_statscounter_t counter, isc_uint64_t val, void *arg) { + stats_dumparg_t *dumparg = arg; + FILE *fp; +#ifdef HAVE_LIBXML2 + xmlTextWriterPtr writer; +#endif + + REQUIRE(counter < dumparg->ncounters); + + switch (dumparg->type) { + case statsformat_file: + fp = dumparg->arg; + fprintf(fp, "%20" ISC_PRINT_QUADFORMAT "u %s\n", val, + dumparg->desc[counter]); + break; + case statsformat_xml: +#ifdef HAVE_LIBXML2 + writer = dumparg->arg; + + xmlTextWriterStartElement(writer, ISC_XMLCHAR + dumparg->desc[counter]); + xmlTextWriterWriteFormatString(writer, + "%" ISC_PRINT_QUADFORMAT "u", + val); + xmlTextWriterEndElement(writer); +#endif + break; + } +} + +static void +rdtypestat_dump(dns_rdatastatstype_t type, isc_uint64_t val, void *arg) { + char typebuf[64]; + const char *typestr; + stats_dumparg_t *dumparg = arg; + FILE *fp; +#ifdef HAVE_LIBXML2 + xmlTextWriterPtr writer; +#endif + + if ((DNS_RDATASTATSTYPE_ATTR(type) & DNS_RDATASTATSTYPE_ATTR_OTHERTYPE) + == 0) { + dns_rdatatype_format(DNS_RDATASTATSTYPE_BASE(type), typebuf, + sizeof(typebuf)); + typestr = typebuf; + } else + typestr = "Others"; + + switch (dumparg->type) { + case statsformat_file: + fp = dumparg->arg; + fprintf(fp, "%20" ISC_PRINT_QUADFORMAT "u %s\n", val, typestr); + break; + case statsformat_xml: +#ifdef HAVE_LIBXML2 + writer = dumparg->arg; + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "rdtype"); + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"); + xmlTextWriterWriteString(writer, ISC_XMLCHAR typestr); + xmlTextWriterEndElement(writer); /* name */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "counter"); + xmlTextWriterWriteFormatString(writer, + "%" ISC_PRINT_QUADFORMAT "u", + val); + xmlTextWriterEndElement(writer); /* counter */ + + xmlTextWriterEndElement(writer); /* rdtype */ +#endif + break; + } +} + +static void +rdatasetstats_dump(dns_rdatastatstype_t type, isc_uint64_t val, void *arg) { + stats_dumparg_t *dumparg = arg; + FILE *fp; + char typebuf[64]; + const char *typestr; + isc_boolean_t nxrrset = ISC_FALSE; +#ifdef HAVE_LIBXML2 + xmlTextWriterPtr writer; +#endif + + if ((DNS_RDATASTATSTYPE_ATTR(type) & DNS_RDATASTATSTYPE_ATTR_NXDOMAIN) + != 0) { + typestr = "NXDOMAIN"; + } else if ((DNS_RDATASTATSTYPE_ATTR(type) & + DNS_RDATASTATSTYPE_ATTR_OTHERTYPE) != 0) { + typestr = "Others"; + } else { + dns_rdatatype_format(DNS_RDATASTATSTYPE_BASE(type), typebuf, + sizeof(typebuf)); + typestr = typebuf; + } + + if ((DNS_RDATASTATSTYPE_ATTR(type) & DNS_RDATASTATSTYPE_ATTR_NXRRSET) + != 0) + nxrrset = ISC_TRUE; + + switch (dumparg->type) { + case statsformat_file: + fp = dumparg->arg; + fprintf(fp, "%20" ISC_PRINT_QUADFORMAT "u %s%s\n", val, + nxrrset ? "!" : "", typestr); + break; + case statsformat_xml: +#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 */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "counter"); + xmlTextWriterWriteFormatString(writer, + "%" ISC_PRINT_QUADFORMAT "u", + val); + xmlTextWriterEndElement(writer); /* counter */ + + xmlTextWriterEndElement(writer); /* rrset */ +#endif + break; + } +} + +static void +opcodestat_dump(dns_opcode_t code, isc_uint64_t val, void *arg) { + FILE *fp = arg; + isc_buffer_t b; + char codebuf[64]; + stats_dumparg_t *dumparg = arg; +#ifdef HAVE_LIBXML2 + xmlTextWriterPtr writer; +#endif + + isc_buffer_init(&b, codebuf, sizeof(codebuf) - 1); + dns_opcode_totext(code, &b); + codebuf[isc_buffer_usedlength(&b)] = '\0'; + + switch (dumparg->type) { + case statsformat_file: + fp = dumparg->arg; + fprintf(fp, "%20" ISC_PRINT_QUADFORMAT "u %s\n", val, codebuf); + break; + case statsformat_xml: +#ifdef HAVE_LIBXML2 + writer = dumparg->arg; + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "opcode"); + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"); + xmlTextWriterWriteString(writer, ISC_XMLCHAR codebuf); + xmlTextWriterEndElement(writer); /* name */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "counter"); + xmlTextWriterWriteFormatString(writer, + "%" ISC_PRINT_QUADFORMAT "u", + val); + xmlTextWriterEndElement(writer); /* counter */ + + xmlTextWriterEndElement(writer); /* opcode */ +#endif + break; + } +} + #ifdef HAVE_LIBXML2 /* XXXMLG below here sucks. */ @@ -58,8 +250,50 @@ struct ns_statschannel { #define TRY(a) do { result = (a); INSIST(result == ISC_R_SUCCESS); } while(0); #define TRY0(a) do { xmlrc = (a); INSIST(xmlrc >= 0); } while(0); -#define NODES 8 -#define SPACES 3 +static isc_result_t +zone_xmlrender(dns_zone_t *zone, void *arg) { + char buf[1024 + 32]; /* sufficiently large for zone name and class */ + dns_rdataclass_t rdclass; + isc_uint32_t serial; + xmlTextWriterPtr writer = arg; + stats_dumparg_t dumparg; + dns_stats_t *zonestats; + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "zone"); + + dns_zone_name(zone, buf, sizeof(buf)); + xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"); + xmlTextWriterWriteString(writer, ISC_XMLCHAR buf); + 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); + + serial = dns_zone_getserial(zone); + xmlTextWriterStartElement(writer, ISC_XMLCHAR "serial"); + xmlTextWriterWriteFormatString(writer, "%u", serial); + xmlTextWriterEndElement(writer); + + dumparg.type = statsformat_xml; + dumparg.arg = writer; + dumparg.desc = nsstats_xmldesc; + dumparg.ncounters = dns_nsstatscounter_max; + + zonestats = dns_zone_getrequeststats(zone); + if (zonestats != NULL) { + xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"); + dns_generalstats_dump(zonestats, generalstat_dump, + &dumparg, DNS_STATSDUMP_VERBOSE); + xmlTextWriterEndElement(writer); /* counters */ + } + + xmlTextWriterEndElement(writer); /* zone */ + + return (ISC_R_SUCCESS); +} static void generatexml(ns_server_t *server, int *buflen, xmlChar **buf) { @@ -70,8 +304,8 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) { xmlDocPtr doc; int xmlrc; dns_view_t *view; - int i; - isc_uint64_t counters[DNS_STATS_NCOUNTERS]; + stats_dumparg_t dumparg; + dns_stats_t *cachestats; isc_time_now(&now); isc_time_formatISO8601(&ns_g_boottime, boottime, sizeof boottime); @@ -90,6 +324,10 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) { TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "version", ISC_XMLCHAR "1.0")); + /* Set common fields for statistics dump */ + dumparg.type = statsformat_xml; + dumparg.arg = writer; + /* * Start by rendering the views we know of here. For each view we * know of, call its rendering function. @@ -97,7 +335,43 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) { view = ISC_LIST_HEAD(server->viewlist); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "views")); while (view != NULL) { - dns_view_xmlrender(view, writer, ISC_XML_RENDERALL); + xmlTextWriterStartElement(writer, ISC_XMLCHAR "view"); + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"); + xmlTextWriterWriteString(writer, ISC_XMLCHAR view->name); + xmlTextWriterEndElement(writer); + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "zones"); + dns_zt_apply(view->zonetable, ISC_FALSE, zone_xmlrender, + writer); + xmlTextWriterEndElement(writer); + + if (view->resquerystats != NULL) { + dns_rdatatypestats_dump(view->resquerystats, + rdtypestat_dump, &dumparg, 0); + } + + if (view->resstats != NULL) { + xmlTextWriterStartElement(writer, + ISC_XMLCHAR "resstats"); + dumparg.ncounters = dns_resstatscounter_max; + dumparg.desc = resstats_xmldesc; /* auto-generated */ + dns_generalstats_dump(view->resstats, generalstat_dump, + &dumparg, DNS_STATSDUMP_VERBOSE); + xmlTextWriterEndElement(writer); /* resstats */ + } + + cachestats = dns_db_getrrsetstats(view->cachedb); + if (cachestats != NULL) { + xmlTextWriterStartElement(writer, + ISC_XMLCHAR "cache"); + dns_rdatasetstats_dump(cachestats, rdatasetstats_dump, + &dumparg, 0); + xmlTextWriterEndElement(writer); /* cache */ + } + + xmlTextWriterEndElement(writer); /* view */ + view = ISC_LIST_NEXT(view, link); } TRY0(xmlTextWriterEndElement(writer)); /* views */ @@ -117,21 +391,42 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) { xmlTextWriterStartElement(writer, ISC_XMLCHAR "current-time"); xmlTextWriterWriteString(writer, ISC_XMLCHAR nowstr); xmlTextWriterEndElement(writer); - TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters")); - dns_stats_copy(server->querystats, counters); - for (i = 0; i < DNS_STATS_NCOUNTERS; i++) { - xmlTextWriterStartElement(writer, - ISC_XMLCHAR dns_statscounter_names[i]); - xmlTextWriterWriteFormatString(writer, - "%" ISC_PRINT_QUADFORMAT "u", - counters[i]); - xmlTextWriterEndElement(writer); - } - xmlTextWriterEndElement(writer); /* counters */ + + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "requests")); + dns_opcodestats_dump(server->opcodestats, opcodestat_dump, &dumparg, + 0); + xmlTextWriterEndElement(writer); /* requests */ + + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "queries-in")); + dns_rdatatypestats_dump(server->rcvquerystats, rdtypestat_dump, + &dumparg, 0); + xmlTextWriterEndElement(writer); /* queries-in */ + + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "nsstats")); + dumparg.desc = nsstats_xmldesc; /* auto-generated in bind9.xsl.h */ + dumparg.ncounters = dns_nsstatscounter_max; + dns_generalstats_dump(server->nsstats, generalstat_dump, &dumparg, + DNS_STATSDUMP_VERBOSE); + xmlTextWriterEndElement(writer); /* nsstats */ + + TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "zonestats")); + dumparg.desc = zonestats_xmldesc; /* auto-generated in bind9.xsl.h */ + dumparg.ncounters = dns_zonestatscounter_max; + dns_generalstats_dump(server->zonestats, generalstat_dump, &dumparg, + DNS_STATSDUMP_VERBOSE); + xmlTextWriterEndElement(writer); /* zonestats */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "resstats"); + dumparg.ncounters = dns_resstatscounter_max; + dumparg.desc = resstats_xmldesc; + dns_generalstats_dump(server->resolverstats, generalstat_dump, + &dumparg, DNS_STATSDUMP_VERBOSE); + xmlTextWriterEndElement(writer); /* resstats */ + xmlTextWriterEndElement(writer); /* server */ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "memory")); - isc_mem_renderxml(server->mctx, writer); + isc_mem_renderxml(writer); TRY0(xmlTextWriterEndElement(writer)); /* memory */ TRY0(xmlTextWriterEndElement(writer)); /* statistics */ @@ -187,8 +482,6 @@ render_xsl(const char *url, const char *querystring, void *args, isc_buffer_t *b, isc_httpdfree_t **freecb, void **freecb_args) { -#include "bind9.xsl.h" - UNUSED(url); UNUSED(querystring); UNUSED(args); @@ -196,8 +489,8 @@ render_xsl(const char *url, const char *querystring, void *args, *retcode = 200; *retmsg = "OK"; *mimetype = "text/xslt+xml"; - isc_buffer_reinit(b, msg, strlen(msg)); - isc_buffer_add(b, strlen(msg)); + isc_buffer_reinit(b, xslmsg, strlen(xslmsg)); + isc_buffer_add(b, strlen(xslmsg)); *freecb = NULL; *freecb_args = NULL; @@ -249,7 +542,7 @@ destroy_listener(void *arg) { REQUIRE(listener != NULL); REQUIRE(!ISC_LINK_LINKED(listener, link)); - /* We don't to have acquire the lock here since it's already unlinked */ + /* We don't have to acquire the lock here since it's already unlinked */ dns_acl_detach(&listener->acl); DESTROYLOCK(&listener->lock); @@ -533,3 +826,302 @@ ns_statschannels_shutdown(ns_server_t *server) { shutdown_listener(listener); } } + +/*% + * Statistics descriptions. These could be statistically initialized at + * compile time, but we configure them run time in the init_desc() function + * below so that they'll be less susceptible to counter name changes. + * Note that bind9.xsl must still be updated consistently with the counter + * numbering. + */ +static const char *nsstats_desc[dns_nsstatscounter_max]; +static const char *resstats_desc[dns_resstatscounter_max]; +static const char *zonestats_desc[dns_zonestatscounter_max]; + +static inline void +set_desc(int counter, int maxcounter, const char *desc, const char **descs) { + REQUIRE(counter < maxcounter); + REQUIRE(descs[counter] == NULL); + + descs[counter] = desc; +} + +static void +init_desc() { + int i; + + /* Initialize name server statistics */ + memset(nsstats_desc, 0, + dns_nsstatscounter_max * sizeof(nsstats_desc[0])); + set_desc(dns_nsstatscounter_requestv4, dns_nsstatscounter_max, + "IPv4 requests received", nsstats_desc); + set_desc(dns_nsstatscounter_requestv6, dns_nsstatscounter_max, + "IPv6 requests received", nsstats_desc); + set_desc(dns_nsstatscounter_edns0in, dns_nsstatscounter_max, + "requests with EDNS(0) received", nsstats_desc); + set_desc(dns_nsstatscounter_badednsver, dns_nsstatscounter_max, + "requests with unsupported EDNS version received", + nsstats_desc); + set_desc(dns_nsstatscounter_tsigin, dns_nsstatscounter_max, + "requests with TSIG received", nsstats_desc); + set_desc(dns_nsstatscounter_sig0in, dns_nsstatscounter_max, + "requests with SIG(0) received", nsstats_desc); + set_desc(dns_nsstatscounter_invalidsig, dns_nsstatscounter_max, + "requests with invalid signature", nsstats_desc); + set_desc(dns_nsstatscounter_tcp, dns_nsstatscounter_max, + "TCP requests received", nsstats_desc); + set_desc(dns_nsstatscounter_authrej, dns_nsstatscounter_max, + "auth queries rejected", nsstats_desc); + set_desc(dns_nsstatscounter_recurserej, dns_nsstatscounter_max, + "recursive queries rejected", nsstats_desc); + set_desc(dns_nsstatscounter_xfrrej, dns_nsstatscounter_max, + "transfer requests rejected", nsstats_desc); + set_desc(dns_nsstatscounter_updaterej, dns_nsstatscounter_max, + "update requests rejected", nsstats_desc); + set_desc(dns_nsstatscounter_response, dns_nsstatscounter_max, + "responses sent", nsstats_desc); + set_desc(dns_nsstatscounter_truncatedresp, dns_nsstatscounter_max, + "truncated responses sent", nsstats_desc); + set_desc(dns_nsstatscounter_edns0out, dns_nsstatscounter_max, + "responses with EDNS(0) sent", nsstats_desc); + set_desc(dns_nsstatscounter_tsigout, dns_nsstatscounter_max, + "responses with TSIG sent", nsstats_desc); + set_desc(dns_nsstatscounter_sig0out, dns_nsstatscounter_max, + "responses with SIG(0) sent", nsstats_desc); + set_desc(dns_nsstatscounter_success, dns_nsstatscounter_max, + "queries resulted in successful answer", nsstats_desc); + set_desc(dns_nsstatscounter_authans, dns_nsstatscounter_max, + "queries resulted in authoritative answer", nsstats_desc); + set_desc(dns_nsstatscounter_nonauthans, dns_nsstatscounter_max, + "queries resulted in non authoritative answer", nsstats_desc); + set_desc(dns_nsstatscounter_referral, dns_nsstatscounter_max, + "queries resulted in referral answer", nsstats_desc); + set_desc(dns_nsstatscounter_nxrrset, dns_nsstatscounter_max, + "queries resulted in nxrrset", nsstats_desc); + set_desc(dns_nsstatscounter_servfail, dns_nsstatscounter_max, + "queries resulted in SERVFAIL", nsstats_desc); + set_desc(dns_nsstatscounter_formerr, dns_nsstatscounter_max, + "queries resulted in FORMERR", nsstats_desc); + set_desc(dns_nsstatscounter_nxdomain, dns_nsstatscounter_max, + "queries resulted in NXDOMAIN", nsstats_desc); + set_desc(dns_nsstatscounter_recursion, dns_nsstatscounter_max, + "queries caused recursion", nsstats_desc); + set_desc(dns_nsstatscounter_duplicate, dns_nsstatscounter_max, + "duplicate queries received", nsstats_desc); + set_desc(dns_nsstatscounter_dropped, dns_nsstatscounter_max, + "queries dropped", nsstats_desc); + set_desc(dns_nsstatscounter_failure, dns_nsstatscounter_max, + "other query failures", nsstats_desc); + set_desc(dns_nsstatscounter_xfrdone, dns_nsstatscounter_max, + "requested transfers completed", nsstats_desc); + set_desc(dns_nsstatscounter_updatereqfwd, dns_nsstatscounter_max, + "update requests forwarded", nsstats_desc); + set_desc(dns_nsstatscounter_updaterespfwd, dns_nsstatscounter_max, + "update responses forwarded", nsstats_desc); + set_desc(dns_nsstatscounter_updatefwdfail, dns_nsstatscounter_max, + "update forward failed", nsstats_desc); + set_desc(dns_nsstatscounter_updatedone, dns_nsstatscounter_max, + "updates completed", nsstats_desc); + set_desc(dns_nsstatscounter_updatefail, dns_nsstatscounter_max, + "updates failed", nsstats_desc); + set_desc(dns_nsstatscounter_updatebadprereq, dns_nsstatscounter_max, + "updates rejected due to prerequisite failure", nsstats_desc); + + /* Initialize resolver statistics */ + memset(resstats_desc, 0, + dns_resstatscounter_max * sizeof(resstats_desc[0])); + set_desc(dns_resstatscounter_queryv4, dns_resstatscounter_max, + "IPv4 queries sent", resstats_desc); + set_desc(dns_resstatscounter_queryv6, dns_resstatscounter_max, + "IPv6 queries sent", resstats_desc); + set_desc(dns_resstatscounter_responsev4, dns_resstatscounter_max, + "IPv4 responses received", resstats_desc); + set_desc(dns_resstatscounter_responsev6, dns_resstatscounter_max, + "IPv6 responses received", resstats_desc); + set_desc(dns_resstatscounter_nxdomain, dns_resstatscounter_max, + "NXDOMAIN received", resstats_desc); + set_desc(dns_resstatscounter_servfail, dns_resstatscounter_max, + "SERVFAIL received", resstats_desc); + set_desc(dns_resstatscounter_formerr, dns_resstatscounter_max, + "FORMERR received", resstats_desc); + set_desc(dns_resstatscounter_othererror, dns_resstatscounter_max, + "other errors received", resstats_desc); + set_desc(dns_resstatscounter_edns0fail, dns_resstatscounter_max, + "EDNS(0) query failures", resstats_desc); + set_desc(dns_resstatscounter_mismatch, dns_resstatscounter_max, + "mismatch responses received", resstats_desc); + set_desc(dns_resstatscounter_truncated, dns_resstatscounter_max, + "truncated responses received", resstats_desc); + set_desc(dns_resstatscounter_lame, dns_resstatscounter_max, + "lame delegations received", resstats_desc); + set_desc(dns_resstatscounter_retry, dns_resstatscounter_max, + "query retries", resstats_desc); + set_desc(dns_resstatscounter_gluefetchv4, dns_resstatscounter_max, + "IPv4 NS address fetches", resstats_desc); + set_desc(dns_resstatscounter_gluefetchv6, dns_resstatscounter_max, + "IPv6 NS address fetches", resstats_desc); + set_desc(dns_resstatscounter_gluefetchv4fail, dns_resstatscounter_max, + "IPv4 NS address fetch failed", resstats_desc); + set_desc(dns_resstatscounter_gluefetchv6fail, dns_resstatscounter_max, + "IPv6 NS address fetch failed", resstats_desc); + set_desc(dns_resstatscounter_val, dns_resstatscounter_max, + "DNSSEC validation attempted", resstats_desc); + set_desc(dns_resstatscounter_valsuccess, dns_resstatscounter_max, + "DNSSEC validation succeeded", resstats_desc); + set_desc(dns_resstatscounter_valnegsuccess, dns_resstatscounter_max, + "DNSSEC NX validation succeeded", resstats_desc); + set_desc(dns_resstatscounter_valfail, dns_resstatscounter_max, + "DNSSEC validation failed", resstats_desc); + + /* Initialize zone statistics */ + memset(zonestats_desc, 0, + dns_zonestatscounter_max * sizeof(zonestats_desc[0])); + set_desc(dns_zonestatscounter_notifyoutv4, dns_zonestatscounter_max, + "IPv4 notifies sent", zonestats_desc); + set_desc(dns_zonestatscounter_notifyoutv6, dns_zonestatscounter_max, + "IPv6 notifies sent", zonestats_desc); + set_desc(dns_zonestatscounter_notifyinv4, dns_zonestatscounter_max, + "IPv4 notifies received", zonestats_desc); + set_desc(dns_zonestatscounter_notifyinv6, dns_zonestatscounter_max, + "IPv6 notifies received", zonestats_desc); + set_desc(dns_zonestatscounter_notifyrej, dns_zonestatscounter_max, + "notifies rejected", zonestats_desc); + set_desc(dns_zonestatscounter_soaoutv4, dns_zonestatscounter_max, + "IPv4 SOA queries sent", zonestats_desc); + set_desc(dns_zonestatscounter_soaoutv6, dns_zonestatscounter_max, + "IPv6 SOA queries sent", zonestats_desc); + set_desc(dns_zonestatscounter_axfrreqv4, dns_zonestatscounter_max, + "IPv4 AXFR requested", zonestats_desc); + set_desc(dns_zonestatscounter_axfrreqv6, dns_zonestatscounter_max, + "IPv6 AXFR requested", zonestats_desc); + set_desc(dns_zonestatscounter_ixfrreqv4, dns_zonestatscounter_max, + "IPv4 IXFR requested", zonestats_desc); + set_desc(dns_zonestatscounter_ixfrreqv6, dns_zonestatscounter_max, + "IPv6 IXFR requested", zonestats_desc); + set_desc(dns_zonestatscounter_xfrsuccess, dns_zonestatscounter_max, + "transfer requests succeeded", zonestats_desc); + set_desc(dns_zonestatscounter_xfrfail, dns_zonestatscounter_max, + "transfer requests failed", zonestats_desc); + + /* Sanity check */ + for (i = 0; i < dns_nsstatscounter_max; i++) + INSIST(nsstats_desc[i] != NULL); + for (i = 0; i < dns_resstatscounter_max; i++) + INSIST(resstats_desc[i] != NULL); + for (i = 0; i < dns_zonestatscounter_max; i++) + INSIST(zonestats_desc[i] != NULL); +} + +isc_result_t +ns_stats_dump(ns_server_t *server, FILE *fp) { + isc_stdtime_t now; + isc_result_t result; + dns_view_t *view; + dns_zone_t *zone, *next; + stats_dumparg_t dumparg; + + RUNTIME_CHECK(isc_once_do(&once, init_desc) == ISC_R_SUCCESS); + + /* Set common fields */ + dumparg.type = statsformat_file; + dumparg.arg = fp; + + isc_stdtime_get(&now); + fprintf(fp, "+++ Statistics Dump +++ (%lu)\n", (unsigned long)now); + + fprintf(fp, "++ Incoming Requests ++\n"); + dns_opcodestats_dump(server->opcodestats, opcodestat_dump, &dumparg, 0); + + fprintf(fp, "++ Incoming Queries ++\n"); + dns_rdatatypestats_dump(server->rcvquerystats, rdtypestat_dump, + &dumparg, 0); + + fprintf(fp, "++ Outgoing Queries ++\n"); + for (view = ISC_LIST_HEAD(server->viewlist); + view != NULL; + view = ISC_LIST_NEXT(view, link)) { + if (view->resquerystats == NULL) + continue; + if (strcmp(view->name, "_default") == 0) + fprintf(fp, "[View: default]\n"); + else + fprintf(fp, "[View: %s]\n", view->name); + dns_rdatatypestats_dump(view->resquerystats, rdtypestat_dump, + &dumparg, 0); + } + + fprintf(fp, "++ Name Server Statistics ++\n"); + dumparg.desc = nsstats_desc; + dumparg.ncounters = dns_nsstatscounter_max; + dns_generalstats_dump(server->nsstats, generalstat_dump, &dumparg, 0); + fprintf(fp, "++ Zone Maintenance Statistics ++\n"); + dumparg.desc = zonestats_desc; + dumparg.ncounters = dns_zonestatscounter_max; + dns_generalstats_dump(server->zonestats, generalstat_dump, &dumparg, 0); + + fprintf(fp, "++ Resolver Statistics ++\n"); + fprintf(fp, "[Common]\n"); + dumparg.desc = resstats_desc; + dumparg.ncounters = dns_resstatscounter_max; + dns_generalstats_dump(server->resolverstats, generalstat_dump, &dumparg, + 0); + for (view = ISC_LIST_HEAD(server->viewlist); + view != NULL; + view = ISC_LIST_NEXT(view, link)) { + if (view->resstats == NULL) + continue; + if (strcmp(view->name, "_default") == 0) + fprintf(fp, "[View: default]\n"); + else + fprintf(fp, "[View: %s]\n", view->name); + dns_generalstats_dump(view->resstats, generalstat_dump, + &dumparg, 0); + } + + fprintf(fp, "++ Cache DB RRsets ++\n"); + for (view = ISC_LIST_HEAD(server->viewlist); + view != NULL; + view = ISC_LIST_NEXT(view, link)) { + dns_stats_t *cachestats; + + cachestats = dns_db_getrrsetstats(view->cachedb); + if (cachestats == NULL) + continue; + if (strcmp(view->name, "_default") == 0) + fprintf(fp, "[View: default]\n"); + else + fprintf(fp, "[View: %s]\n", view->name); + dns_rdatasetstats_dump(cachestats, rdatasetstats_dump, &dumparg, + 0); + } + + fprintf(fp, "++ Per Zone Query Statistics ++\n"); + zone = NULL; + for (result = dns_zone_first(server->zonemgr, &zone); + result == ISC_R_SUCCESS; + next = NULL, result = dns_zone_next(zone, &next), zone = next) + { + dns_stats_t *zonestats = dns_zone_getrequeststats(zone); + if (zonestats != NULL) { + char zonename[DNS_NAME_FORMATSIZE]; + + dns_name_format(dns_zone_getorigin(zone), + zonename, sizeof(zonename)); + view = dns_zone_getview(zone); + + fprintf(fp, "[%s", zonename); + if (strcmp(view->name, "_default") != 0) + fprintf(fp, " (view: %s)", view->name); + fprintf(fp, "]\n"); + + dumparg.desc = nsstats_desc; + dumparg.ncounters = dns_nsstatscounter_max; + dns_generalstats_dump(zonestats, generalstat_dump, + &dumparg, 0); + } + } + + fprintf(fp, "--- Statistics Dump --- (%lu)\n", (unsigned long)now); + + return (ISC_R_SUCCESS); /* this function currently always succeeds */ +} diff --git a/bin/named/unix/os.c b/bin/named/unix/os.c index b12470d6..16a4272a 100644 --- a/bin/named/unix/os.c +++ b/bin/named/unix/os.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: os.c,v 1.79.128.3 2008/01/17 23:46:36 tbox Exp $ */ +/* $Id: os.c,v 1.79.128.5 2008/05/06 01:32:51 each Exp $ */ /*! \file */ @@ -69,7 +69,7 @@ static int devnullfd = -1; /* * Linux defines: * (T) HAVE_LINUXTHREADS - * (C) HAVE_LINUX_CAPABILITY_H + * (C) HAVE_SYS_CAPABILITY_H (or HAVE_LINUX_CAPABILITY_H) * (P) HAVE_SYS_PRCTL_H * The possible cases are: * none: setuid() normally @@ -116,6 +116,9 @@ static int dfd[2] = { -1, -1 }; static isc_boolean_t non_root = ISC_FALSE; static isc_boolean_t non_root_caps = ISC_FALSE; +#ifdef HAVE_SYS_CAPABILITY_H +#include <sys/capability.h> +#else /*% * We define _LINUX_FS_H to prevent it from being included. We don't need * anything from it, and the files it includes cause warnings with 2.2 @@ -123,9 +126,15 @@ static isc_boolean_t non_root_caps = ISC_FALSE; * and <string.h>) on 2.3 kernels. */ #define _LINUX_FS_H - -#include <sys/syscall.h> /* Required for syscall(). */ -#include <linux/capability.h> /* Required for _LINUX_CAPABILITY_VERSION. */ +#include <linux/capability.h> +#include <syscall.h> +#ifndef SYS_capset +#ifndef __NR_capset +#include <asm/unistd.h> /* Slackware 4.0 needs this. */ +#endif /* __NR_capset */ +#define SYS_capset __NR_capset +#endif /* SYS_capset */ +#endif /* HAVE_SYS_CAPABILITY_H */ #ifdef HAVE_SYS_PRCTL_H #include <sys/prctl.h> /* Required for prctl(). */ @@ -142,22 +151,24 @@ static isc_boolean_t non_root_caps = ISC_FALSE; #endif /* HAVE_SYS_PRCTL_H */ -#ifndef SYS_capset -#ifndef __NR_capset -#include <asm/unistd.h> /* Slackware 4.0 needs this. */ -#endif -#define SYS_capset __NR_capset -#endif +#ifdef HAVE_LIBCAP +#define SETCAPS_FUNC "cap_set_proc " +#else +typedef unsigned int cap_t; +#define SETCAPS_FUNC "syscall(capset) " +#endif /* HAVE_LIBCAP */ static void -linux_setcaps(unsigned int caps) { +linux_setcaps(cap_t caps) { +#ifndef HAVE_LIBCAP struct __user_cap_header_struct caphead; struct __user_cap_data_struct cap; +#endif char strbuf[ISC_STRERRORSIZE]; if ((getuid() != 0 && !non_root_caps) || non_root) return; - +#ifndef HAVE_LIBCAP memset(&caphead, 0, sizeof(caphead)); caphead.version = _LINUX_CAPABILITY_VERSION; caphead.pid = 0; @@ -165,36 +176,74 @@ linux_setcaps(unsigned int caps) { cap.effective = caps; cap.permitted = caps; cap.inheritable = 0; +#endif +#ifdef HAVE_LIBCAP + if (cap_set_proc(caps) < 0) { +#else if (syscall(SYS_capset, &caphead, &cap) < 0) { +#endif isc__strerror(errno, strbuf, sizeof(strbuf)); - ns_main_earlyfatal("capset failed: %s:" + ns_main_earlyfatal(SETCAPS_FUNC "failed: %s:" " please ensure that the capset kernel" " module is loaded. see insmod(8)", strbuf); } } +#ifdef HAVE_LIBCAP +#define SET_CAP(flag) \ + do { \ + capval = (flag); \ + err = cap_set_flag(caps, CAP_EFFECTIVE, 1, &capval, CAP_SET); \ + if (err == -1) { \ + isc__strerror(errno, strbuf, sizeof(strbuf)); \ + ns_main_earlyfatal("cap_set_proc failed: %s", strbuf); \ + } \ + \ + err = cap_set_flag(caps, CAP_PERMITTED, 1, &capval, CAP_SET); \ + if (err == -1) { \ + isc__strerror(errno, strbuf, sizeof(strbuf)); \ + ns_main_earlyfatal("cap_set_proc failed: %s", strbuf); \ + } \ + } while (0) +#define INIT_CAP \ + do { \ + caps = cap_init(); \ + if (caps == NULL) { \ + isc__strerror(errno, strbuf, sizeof(strbuf)); \ + ns_main_earlyfatal("cap_init failed: %s", strbuf); \ + } \ + } while (0) +#else +#define SET_CAP(flag) { caps |= (1 << (flag)); } +#define INIT_CAP { caps = 0; } +#endif /* HAVE_LIBCAP */ + static void linux_initialprivs(void) { - unsigned int caps; + cap_t caps; +#ifdef HAVE_LIBCAP + cap_value_t capval; + char strbuf[ISC_STRERRORSIZE]; + int err; +#endif /*% * We don't need most privileges, so we drop them right away. * Later on linux_minprivs() will be called, which will drop our * capabilities to the minimum needed to run the server. */ - - caps = 0; + INIT_CAP; /* * We need to be able to bind() to privileged ports, notably port 53! */ - caps |= (1 << CAP_NET_BIND_SERVICE); + SET_CAP(CAP_NET_BIND_SERVICE); /* * We need chroot() initially too. */ - caps |= (1 << CAP_SYS_CHROOT); + SET_CAP(CAP_SYS_CHROOT); #if defined(HAVE_SYS_PRCTL_H) || !defined(HAVE_LINUXTHREADS) /* @@ -203,19 +252,19 @@ linux_initialprivs(void) { * tried) or we're not using threads. If either of these is * true, we want the setuid capability. */ - caps |= (1 << CAP_SETUID); + SET_CAP(CAP_SETUID); #endif /* * Since we call initgroups, we need this. */ - caps |= (1 << CAP_SETGID); + SET_CAP(CAP_SETGID); /* * Without this, we run into problems reading a configuration file * owned by a non-root user and non-world-readable on startup. */ - caps |= (1 << CAP_DAC_READ_SEARCH); + SET_CAP(CAP_DAC_READ_SEARCH); /* * XXX We might want to add CAP_SYS_RESOURCE, though it's not @@ -224,15 +273,21 @@ linux_initialprivs(void) { * of files, the stack size, data size, and core dump size to * support named.conf options, this is now being added to test. */ - caps |= (1 << CAP_SYS_RESOURCE); + SET_CAP(CAP_SYS_RESOURCE); linux_setcaps(caps); } static void linux_minprivs(void) { - unsigned int caps; + cap_t caps; +#ifdef HAVE_LIBCAP + cap_value_t capval; + char strbuf[ISC_STRERRORSIZE]; + int err; +#endif + INIT_CAP; /*% * Drop all privileges except the ability to bind() to privileged * ports. @@ -241,8 +296,7 @@ linux_minprivs(void) { * chroot() could be used to escape from the chrooted area. */ - caps = 0; - caps |= (1 << CAP_NET_BIND_SERVICE); + SET_CAP(CAP_NET_BIND_SERVICE); /* * XXX We might want to add CAP_SYS_RESOURCE, though it's not @@ -251,7 +305,7 @@ linux_minprivs(void) { * of files, the stack size, data size, and core dump size to * support named.conf options, this is now being added to test. */ - caps |= (1 << CAP_SYS_RESOURCE); + SET_CAP(CAP_SYS_RESOURCE); linux_setcaps(caps); } diff --git a/bin/named/update.c b/bin/named/update.c index 4b2a06ce..0c6e44bb 100644 --- a/bin/named/update.c +++ b/bin/named/update.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: update.c,v 1.138.2.2 2008/01/17 23:46:36 tbox Exp $ */ +/* $Id: update.c,v 1.138.2.4 2008/04/03 06:10:19 marka Exp $ */ #include <config.h> @@ -41,12 +41,14 @@ #include <dns/rdatatype.h> #include <dns/soa.h> #include <dns/ssu.h> +#include <dns/stats.h> #include <dns/view.h> #include <dns/zone.h> #include <dns/zt.h> #include <named/client.h> #include <named/log.h> +#include <named/server.h> #include <named/update.h> /*! \file @@ -117,6 +119,11 @@ msg, isc_result_totext(result)); \ if (result != ISC_R_SUCCESS) goto failure; \ } while (0) +#define PREREQFAILC(code, msg) \ + do { \ + inc_stats(zone, dns_nsstatscounter_updatebadprereq); \ + FAILC(code, msg); \ + } while (0) #define FAILN(code, name, msg) \ do { \ @@ -138,6 +145,11 @@ } \ if (result != ISC_R_SUCCESS) goto failure; \ } while (0) +#define PREREQFAILN(code, name, msg) \ + do { \ + inc_stats(zone, dns_nsstatscounter_updatebadprereq); \ + FAILN(code, name, msg); \ + } while (0) #define FAILNT(code, name, type, msg) \ do { \ @@ -162,6 +174,12 @@ } \ if (result != ISC_R_SUCCESS) goto failure; \ } while (0) +#define PREREQFAILNT(code, name, type, msg) \ + do { \ + inc_stats(zone, dns_nsstatscounter_updatebadprereq); \ + FAILNT(code, name, type, msg); \ + } while (0) + /*% * Fail unconditionally and log as a server error. * The test against ISC_R_SUCCESS is there to keep the Solaris compiler @@ -241,6 +259,20 @@ update_log(ns_client_t *client, dns_zone_t *zone, } /*% + * Increment updated-related statistics counters. + */ +static inline void +inc_stats(dns_zone_t *zone, dns_statscounter_t counter) { + dns_generalstats_increment(ns_g_server->nsstats, counter); + + if (zone != NULL) { + dns_stats_t *zonestats = dns_zone_getrequeststats(zone); + if (zonestats != NULL) + dns_generalstats_increment(zonestats, counter); + } +} + +/*% * Override the default acl logging when checking whether a client * can update the zone or whether we can forward the request to the * master based on IP address. @@ -1653,10 +1685,11 @@ ksk_sanity(dns_db_t *db, dns_dbversion_t *ver) { * Add RRSIG records for an RRset, recording the change in "diff". */ static isc_result_t -add_sigs(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name, - dns_rdatatype_t type, dns_diff_t *diff, dst_key_t **keys, - unsigned int nkeys, isc_mem_t *mctx, isc_stdtime_t inception, - isc_stdtime_t expire, isc_boolean_t check_ksk) +add_sigs(ns_client_t *client, dns_zone_t *zone, dns_db_t *db, + dns_dbversion_t *ver, dns_name_t *name, dns_rdatatype_t type, + dns_diff_t *diff, dst_key_t **keys, unsigned int nkeys, + isc_mem_t *mctx, isc_stdtime_t inception, isc_stdtime_t expire, + isc_boolean_t check_ksk) { isc_result_t result; dns_dbnode_t *node = NULL; @@ -1665,6 +1698,7 @@ add_sigs(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name, isc_buffer_t buffer; unsigned char data[1024]; /* XXX */ unsigned int i; + isc_boolean_t added_sig = ISC_FALSE; dns_rdataset_init(&rdataset); isc_buffer_init(&buffer, data, sizeof(data)); @@ -1694,6 +1728,13 @@ add_sigs(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name, CHECK(update_one_rr(db, ver, diff, DNS_DIFFOP_ADD, name, rdataset.ttl, &sig_rdata)); dns_rdata_reset(&sig_rdata); + added_sig = ISC_TRUE; + } + if (!added_sig) { + update_log(client, zone, ISC_LOG_ERROR, + "found no private keys, " + "unable to generate any signatures"); + result = ISC_R_NOTFOUND; } failure: @@ -1825,9 +1866,9 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db, */ CHECK(rrset_exists(db, newver, name, type, 0, &flag)); if (flag) { - CHECK(add_sigs(db, newver, name, type, - &sig_diff, zone_keys, nkeys, - client->mctx, inception, + CHECK(add_sigs(client, zone, db, newver, name, + type, &sig_diff, zone_keys, + nkeys, client->mctx, inception, expire, check_ksk)); } skip: @@ -2011,10 +2052,10 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db, dns_rdatatype_rrsig, dns_rdatatype_nsec, NULL, &sig_diff)); } else if (t->op == DNS_DIFFOP_ADD) { - CHECK(add_sigs(db, newver, &t->name, dns_rdatatype_nsec, - &sig_diff, zone_keys, nkeys, - client->mctx, inception, expire, - check_ksk)); + CHECK(add_sigs(client, zone, db, newver, &t->name, + dns_rdatatype_nsec, &sig_diff, + zone_keys, nkeys, client->mctx, + inception, expire, check_ksk)); } else { INSIST(0); } @@ -2167,6 +2208,10 @@ ns_update_start(ns_client_t *client, isc_result_t sigresult) { return; failure: + if (result == DNS_R_REFUSED) { + INSIST(dns_zone_gettype(zone) == dns_zone_slave); + inc_stats(zone, dns_nsstatscounter_updaterej); + } /* * We failed without having sent an update event to the zone. * We are still in the client task context, so we can @@ -2371,54 +2416,59 @@ update_action(isc_task_t *task, isc_event_t *event) { &name, &rdata, &covers, &ttl, &update_class); if (ttl != 0) - FAILC(DNS_R_FORMERR, "prerequisite TTL is not zero"); + PREREQFAILC(DNS_R_FORMERR, + "prerequisite TTL is not zero"); if (! dns_name_issubdomain(name, zonename)) - FAILN(DNS_R_NOTZONE, name, - "prerequisite name is out of zone"); + PREREQFAILN(DNS_R_NOTZONE, name, + "prerequisite name is out of zone"); if (update_class == dns_rdataclass_any) { if (rdata.length != 0) - FAILC(DNS_R_FORMERR, + PREREQFAILC(DNS_R_FORMERR, "class ANY prerequisite " "RDATA is not empty"); if (rdata.type == dns_rdatatype_any) { CHECK(name_exists(db, ver, name, &flag)); if (! flag) { - FAILN(DNS_R_NXDOMAIN, name, - "'name in use' prerequisite " - "not satisfied"); + PREREQFAILN(DNS_R_NXDOMAIN, name, + "'name in use' " + "prerequisite not " + "satisfied"); } } else { CHECK(rrset_exists(db, ver, name, rdata.type, covers, &flag)); if (! flag) { /* RRset does not exist. */ - FAILNT(DNS_R_NXRRSET, name, rdata.type, + PREREQFAILNT(DNS_R_NXRRSET, name, rdata.type, "'rrset exists (value independent)' " "prerequisite not satisfied"); } } } else if (update_class == dns_rdataclass_none) { if (rdata.length != 0) - FAILC(DNS_R_FORMERR, - "class NONE prerequisite " - "RDATA is not empty"); + PREREQFAILC(DNS_R_FORMERR, + "class NONE prerequisite " + "RDATA is not empty"); if (rdata.type == dns_rdatatype_any) { CHECK(name_exists(db, ver, name, &flag)); if (flag) { - FAILN(DNS_R_YXDOMAIN, name, - "'name not in use' prerequisite " - "not satisfied"); + PREREQFAILN(DNS_R_YXDOMAIN, name, + "'name not in use' " + "prerequisite not " + "satisfied"); } } else { CHECK(rrset_exists(db, ver, name, rdata.type, covers, &flag)); if (flag) { /* RRset exists. */ - FAILNT(DNS_R_YXRRSET, name, rdata.type, - "'rrset does not exist' " - "prerequisite not satisfied"); + PREREQFAILNT(DNS_R_YXRRSET, name, + rdata.type, + "'rrset does not exist' " + "prerequisite not " + "satisfied"); } } } else if (update_class == zoneclass) { @@ -2431,7 +2481,7 @@ update_action(isc_task_t *task, isc_event_t *event) { FAIL(ISC_R_UNEXPECTED); } } else { - FAILC(DNS_R_FORMERR, "malformed prerequisite"); + PREREQFAILC(DNS_R_FORMERR, "malformed prerequisite"); } } if (result != ISC_R_NOMORE) @@ -2880,6 +2930,9 @@ 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. */ @@ -2902,11 +2955,10 @@ update_action(isc_task_t *task, isc_event_t *event) { if (ssutable != NULL) dns_ssutable_detach(&ssutable); - if (zone != NULL) - dns_zone_detach(&zone); - isc_task_detach(&task); uev->result = result; + if (zone != NULL) + INSIST(uev->zone == zone); /* we use this later */ uev->ev_type = DNS_EVENT_UPDATEDONE; uev->ev_action = updatedone_action; isc_task_send(client->task, &event); @@ -2924,6 +2976,19 @@ updatedone_action(isc_task_t *task, isc_event_t *event) { INSIST(task == client->task); INSIST(client->nupdates > 0); + switch (uev->result) { + case ISC_R_SUCCESS: + inc_stats(uev->zone, dns_nsstatscounter_updatedone); + break; + case DNS_R_REFUSED: + inc_stats(uev->zone, dns_nsstatscounter_updaterej); + break; + default: + inc_stats(uev->zone, dns_nsstatscounter_updatefail); + break; + } + if (uev->zone != NULL) + dns_zone_detach(&uev->zone); client->nupdates--; respond(client, uev->result); isc_event_free(&event); @@ -2952,17 +3017,21 @@ static void forward_callback(void *arg, isc_result_t result, dns_message_t *answer) { update_event_t *uev = arg; ns_client_t *client = uev->ev_arg; + dns_zone_t *zone = uev->zone; if (result != ISC_R_SUCCESS) { INSIST(answer == NULL); uev->ev_type = DNS_EVENT_UPDATEDONE; uev->ev_action = forward_fail; + inc_stats(zone, dns_nsstatscounter_updatefwdfail); } else { uev->ev_type = DNS_EVENT_UPDATEDONE; uev->ev_action = forward_done; uev->answer = answer; + inc_stats(zone, dns_nsstatscounter_updaterespfwd); } isc_task_send(client->task, ISC_EVENT_PTR(&uev)); + dns_zone_detach(&zone); } static void @@ -2993,8 +3062,10 @@ forward_action(isc_task_t *task, isc_event_t *event) { uev->ev_type = DNS_EVENT_UPDATEDONE; uev->ev_action = forward_fail; isc_task_send(client->task, &event); - } - dns_zone_detach(&zone); + inc_stats(zone, dns_nsstatscounter_updatefwdfail); + dns_zone_detach(&zone); + } else + inc_stats(zone, dns_nsstatscounter_updatereqfwd); isc_task_detach(&task); } diff --git a/bin/named/xfrout.c b/bin/named/xfrout.c index 6cc8f706..fb531cc7 100644 --- a/bin/named/xfrout.c +++ b/bin/named/xfrout.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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: xfrout.c,v 1.126 2007/06/18 23:47:19 tbox Exp $ */ +/* $Id: xfrout.c,v 1.126.128.2 2008/04/03 06:20:33 tbox Exp $ */ #include <config.h> @@ -40,6 +40,7 @@ #include <dns/rdatasetiter.h> #include <dns/result.h> #include <dns/soa.h> +#include <dns/stats.h> #include <dns/timer.h> #include <dns/tsig.h> #include <dns/view.h> @@ -51,7 +52,7 @@ #include <named/server.h> #include <named/xfrout.h> -/*! \file +/*! \file * \brief * Outgoing AXFR and IXFR. */ @@ -86,7 +87,7 @@ ns_client_log(client, DNS_LOGCATEGORY_XFER_OUT, \ NS_LOGMODULE_XFER_OUT, ISC_LOG_INFO, \ "bad zone transfer request: %s (%s)", \ - msg, isc_result_totext(code)); \ + msg, isc_result_totext(code)); \ if (result != ISC_R_SUCCESS) goto failure; \ } while (0) @@ -100,12 +101,12 @@ ns_client_log(client, DNS_LOGCATEGORY_XFER_OUT, \ NS_LOGMODULE_XFER_OUT, ISC_LOG_INFO, \ "bad zone transfer request: '%s/%s': %s (%s)", \ - _buf1, _buf2, msg, isc_result_totext(code)); \ + _buf1, _buf2, msg, isc_result_totext(code)); \ if (result != ISC_R_SUCCESS) goto failure; \ } while (0) #define CHECK(op) \ - do { result = (op); \ + do { result = (op); \ if (result != ISC_R_SUCCESS) goto failure; \ } while (0) @@ -121,12 +122,12 @@ typedef struct db_rr_iterator db_rr_iterator_t; struct db_rr_iterator { isc_result_t result; dns_db_t *db; - dns_dbiterator_t *dbit; + dns_dbiterator_t *dbit; dns_dbversion_t *ver; isc_stdtime_t now; dns_dbnode_t *node; dns_fixedname_t fixedname; - dns_rdatasetiter_t *rdatasetit; + dns_rdatasetiter_t *rdatasetit; dns_rdataset_t rdataset; dns_rdata_t rdata; }; @@ -148,6 +149,16 @@ db_rr_iterator_current(db_rr_iterator_t *it, dns_name_t **name, static void db_rr_iterator_destroy(db_rr_iterator_t *it); +static inline void +inc_stats(dns_zone_t *zone, dns_statscounter_t counter) { + dns_generalstats_increment(ns_g_server->nsstats, counter); + if (zone != NULL) { + dns_stats_t *zonestats = dns_zone_getrequeststats(zone); + if (zonestats != NULL) + dns_generalstats_increment(zonestats, counter); + } +} + static isc_result_t db_rr_iterator_init(db_rr_iterator_t *it, dns_db_t *db, dns_dbversion_t *ver, isc_stdtime_t now) @@ -326,7 +337,7 @@ log_rr(dns_name_t *name, dns_rdata_t *rdata, isc_uint32_t ttl) { INSIST(buf.used >= 1 && ((char *) buf.base)[buf.used - 1] == '\n'); buf.used--; - + isc_log_write(XFROUT_RR_LOGARGS, "%.*s", (int)isc_buffer_usedlength(&buf), (char *)isc_buffer_base(&buf)); @@ -818,6 +829,7 @@ typedef struct { dns_name_t *qname; /* Question name of request */ dns_rdatatype_t qtype; /* dns_rdatatype_{a,i}xfr */ dns_rdataclass_t qclass; + dns_zone_t *zone; /* (necessary for stats) */ dns_db_t *db; dns_dbversion_t *ver; isc_quota_t *quota; @@ -841,7 +853,7 @@ typedef struct { static isc_result_t xfrout_ctx_create(isc_mem_t *mctx, ns_client_t *client, unsigned int id, dns_name_t *qname, dns_rdatatype_t qtype, - dns_rdataclass_t qclass, + dns_rdataclass_t qclass, dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver, isc_quota_t *quota, rrstream_t *stream, dns_tsigkey_t *tsigkey, isc_buffer_t *lasttsig, @@ -969,7 +981,7 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) { /* * Normal zone table does not have a match. Try the DLZ database */ - if (client->view->dlzdatabase != NULL) { + if (client->view->dlzdatabase != NULL) { result = dns_dlzallowzonexfr(client->view, question_name, &client->peeraddr, &db); @@ -1006,7 +1018,7 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) { } else { /* - * not DLZ and not in normal zone table, we are + * not DLZ and not in normal zone table, we are * not authoritative */ FAILQ(DNS_R_NOTAUTH, "non-authoritative zone", @@ -1210,26 +1222,28 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) { #ifdef DLZ if (is_dlz) - CHECK(xfrout_ctx_create(mctx, client, request->id, question_name, - reqtype, question_class, db, ver, quota, - stream, dns_message_gettsigkey(request), - tsigbuf, - 3600, - 3600, - (format == dns_many_answers) ? - ISC_TRUE : ISC_FALSE, - &xfr)); - else + CHECK(xfrout_ctx_create(mctx, client, request->id, question_name, + reqtype, question_class, zone, db, ver, + quota, stream, + dns_message_gettsigkey(request), + tsigbuf, + 3600, + 3600, + (format == dns_many_answers) ? + ISC_TRUE : ISC_FALSE, + &xfr)); + else #endif - CHECK(xfrout_ctx_create(mctx, client, request->id, question_name, - reqtype, question_class, db, ver, quota, - stream, dns_message_gettsigkey(request), - tsigbuf, - dns_zone_getmaxxfrout(zone), - dns_zone_getidleout(zone), - (format == dns_many_answers) ? - ISC_TRUE : ISC_FALSE, - &xfr)); + CHECK(xfrout_ctx_create(mctx, client, request->id, question_name, + reqtype, question_class, zone, db, ver, + quota, stream, + dns_message_gettsigkey(request), + tsigbuf, + dns_zone_getmaxxfrout(zone), + dns_zone_getidleout(zone), + (format == dns_many_answers) ? + ISC_TRUE : ISC_FALSE, + &xfr)); xfr->mnemonic = mnemonic; stream = NULL; @@ -1261,6 +1275,8 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) { result = ISC_R_SUCCESS; failure: + if (result == DNS_R_REFUSED) + inc_stats(zone, dns_nsstatscounter_xfrrej); if (quota != NULL) isc_quota_detach("a); if (current_soa_tuple != NULL) @@ -1291,7 +1307,7 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) { static isc_result_t xfrout_ctx_create(isc_mem_t *mctx, ns_client_t *client, unsigned int id, dns_name_t *qname, dns_rdatatype_t qtype, - dns_rdataclass_t qclass, + dns_rdataclass_t qclass, dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver, isc_quota_t *quota, rrstream_t *stream, dns_tsigkey_t *tsigkey, isc_buffer_t *lasttsig, unsigned int maxtime, @@ -1314,8 +1330,10 @@ xfrout_ctx_create(isc_mem_t *mctx, ns_client_t *client, unsigned int id, xfr->qname = qname; xfr->qtype = qtype; xfr->qclass = qclass; + xfr->zone = NULL; xfr->db = NULL; xfr->ver = NULL; + dns_zone_attach(zone, &xfr->zone); dns_db_attach(db, &xfr->db); dns_db_attachversion(db, ver, &xfr->ver); xfr->end_of_stream = ISC_FALSE; @@ -1663,7 +1681,7 @@ sendstream(xfrout_ctx_t *xfr) { * iterators before returning from the event handler. */ xfr->stream->methods->pause(xfr->stream); - + if (result == ISC_R_SUCCESS) return; @@ -1691,6 +1709,8 @@ xfrout_ctx_destroy(xfrout_ctx_t **xfrp) { isc_quota_detach(&xfr->quota); if (xfr->ver != NULL) dns_db_closeversion(xfr->db, &xfr->ver, ISC_FALSE); + if (xfr->zone != NULL) + dns_zone_detach(&xfr->zone); if (xfr->db != NULL) dns_db_detach(&xfr->db); @@ -1724,6 +1744,7 @@ xfrout_senddone(isc_task_t *task, isc_event_t *event) { sendstream(xfr); } else { /* End of zone transfer stream. */ + inc_stats(xfr->zone, dns_nsstatscounter_xfrdone); xfrout_log(xfr, ISC_LOG_INFO, "%s ended", xfr->mnemonic); ns_client_next(xfr->client, ISC_R_SUCCESS); xfrout_ctx_destroy(&xfr); diff --git a/bin/named/zoneconf.c b/bin/named/zoneconf.c index 4f53a8f1..2ee22bd0 100644 --- a/bin/named/zoneconf.c +++ b/bin/named/zoneconf.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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: zoneconf.c,v 1.139 2007/09/18 00:22:30 marka Exp $ */ +/* $Id: zoneconf.c,v 1.139.56.2 2008/04/03 06:20:33 tbox Exp $ */ /*% */ @@ -34,6 +34,7 @@ #include <dns/name.h> #include <dns/rdatatype.h> #include <dns/ssu.h> +#include <dns/stats.h> #include <dns/view.h> #include <dns/zone.h> @@ -60,7 +61,7 @@ static isc_result_t configure_zone_acl(const cfg_obj_t *zconfig, const cfg_obj_t *vconfig, const cfg_obj_t *config, const char *aclname, - cfg_aclconfctx_t *actx, dns_zone_t *zone, + cfg_aclconfctx_t *actx, dns_zone_t *zone, void (*setzacl)(dns_zone_t *, dns_acl_t *), void (*clearzacl)(dns_zone_t *)) { @@ -272,11 +273,11 @@ strtoargvsub(isc_mem_t *mctx, char *s, unsigned int *argcp, char ***argvp, unsigned int n) { isc_result_t result; - + /* Discard leading whitespace. */ while (*s == ' ' || *s == '\t') s++; - + if (*s == '\0') { /* We have reached the end of the string. */ *argcp = n; @@ -361,6 +362,8 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, isc_boolean_t warn = ISC_FALSE, ignore = ISC_FALSE; isc_boolean_t ixfrdiff; dns_masterformat_t masterformat; + dns_stats_t *zoneqrystats; + isc_boolean_t zonestats_on; i = 0; if (zconfig != NULL) { @@ -488,7 +491,15 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = ns_config_get(maps, "zone-statistics", &obj); INSIST(result == ISC_R_SUCCESS); - RETERR(dns_zone_setstatistics(zone, cfg_obj_asboolean(obj))); + zonestats_on = cfg_obj_asboolean(obj); + zoneqrystats = NULL; + if (zonestats_on) { + RETERR(dns_generalstats_create(mctx, &zoneqrystats, + dns_nsstatscounter_max)); + } + dns_zone_setrequeststats(zone, zoneqrystats); + if (zoneqrystats != NULL) + dns_stats_detach(&zoneqrystats); /* * Configure master functionality. This applies @@ -628,7 +639,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = ns_config_get(maps, "check-sibling", &obj); INSIST(result == ISC_R_SUCCESS); - dns_zone_setoption(zone, DNS_ZONEOPT_CHECKSIBLING, + dns_zone_setoption(zone, DNS_ZONEOPT_CHECKSIBLING, cfg_obj_asboolean(obj)); obj = NULL; @@ -647,7 +658,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, "allow-update", ac, zone, dns_zone_setupdateacl, dns_zone_clearupdateacl)); - + updateacl = dns_zone_getupdateacl(zone); if (updateacl != NULL && dns_acl_isinsecure(updateacl)) isc_log_write(ns_g_lctx, DNS_LOGCATEGORY_SECURITY, @@ -655,7 +666,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, "zone '%s' allows updates by IP " "address, which is insecure", zname); - + RETERR(configure_zone_ssutable(zoptions, zone)); obj = NULL; @@ -703,7 +714,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = ns_config_get(maps, "check-integrity", &obj); INSIST(obj != NULL); - dns_zone_setoption(zone, DNS_ZONEOPT_CHECKINTEGRITY, + dns_zone_setoption(zone, DNS_ZONEOPT_CHECKINTEGRITY, cfg_obj_asboolean(obj)); obj = NULL; @@ -739,7 +750,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = ns_config_get(maps, "update-check-ksk", &obj); INSIST(result == ISC_R_SUCCESS); - dns_zone_setoption(zone, DNS_ZONEOPT_UPDATECHECKKSK, + dns_zone_setoption(zone, DNS_ZONEOPT_UPDATECHECKKSK, cfg_obj_asboolean(obj)); } @@ -753,7 +764,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, "allow-update", ac, zone, dns_zone_setupdateacl, dns_zone_clearupdateacl)); - + updateacl = dns_zone_getupdateacl(zone); if (updateacl != NULL && dns_acl_isinsecure(updateacl)) isc_log_write(ns_g_lctx, DNS_LOGCATEGORY_SECURITY, @@ -761,7 +772,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, "zone '%s' allows updates by IP " "address, which is insecure", zname); - + RETERR(configure_zone_ssutable(zoptions, zone)); obj = NULL; diff --git a/bin/tests/system/ifconfig.sh b/bin/tests/system/ifconfig.sh index 2e041015..0cecbf16 100755 --- a/bin/tests/system/ifconfig.sh +++ b/bin/tests/system/ifconfig.sh @@ -1,6 +1,6 @@ #!/bin/sh # -# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004, 2007, 2008 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 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: ifconfig.sh,v 1.51 2007/06/19 23:47:00 tbox Exp $ +# $Id: ifconfig.sh,v 1.51.128.2 2008/03/03 23:46:26 tbox Exp $ # # Set up interface aliases for bind9 system tests. @@ -85,6 +85,9 @@ case "$1" in *-unknown-netbsd*) ifconfig lo0 10.53.0.$ns alias netmask 255.255.255.0 ;; + *-unknown-openbsd*) + ifconfig lo0 10.53.0.$ns alias netmask 255.255.255.0 + ;; *-*-bsdi[3-5].*) ifconfig lo0 add 10.53.0.$ns netmask 255.255.255.0 ;; @@ -145,6 +148,9 @@ case "$1" in *-unknown-netbsd*) ifconfig lo0 10.53.0.$ns delete ;; + *-unknown-openbsd*) + ifconfig lo0 10.53.0.$ns delete + ;; *-*-bsdi[3-5].*) ifconfig lo0 remove 10.53.0.$ns ;; diff --git a/bin/tests/system/ixfr/ns1/.exists b/bin/tests/system/ixfr/ns1/.exists deleted file mode 100644 index e69de29b..00000000 --- a/bin/tests/system/ixfr/ns1/.exists +++ /dev/null diff --git a/bin/tests/system/rrsetorder/clean.sh b/bin/tests/system/rrsetorder/clean.sh index 0cb15620..dd2dc114 100644 --- a/bin/tests/system/rrsetorder/clean.sh +++ b/bin/tests/system/rrsetorder/clean.sh @@ -1,6 +1,6 @@ #!/bin/sh # -# Copyright (C) 2006, 2007 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2006-2008 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,9 +14,10 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: clean.sh,v 1.6 2007/09/26 03:22:44 marka Exp $ +# $Id: clean.sh,v 1.6.46.2 2008/04/24 23:46:29 tbox Exp $ rm -f dig.out.cyclic dig.out.fixed dig.out.random +rm -f dig.out.0 dig.out.1 dig.out.2 dig.out.3 rm -f ns2/root.bk rm -f ns?/named.run ns?/named.core rm -f */named.memstats diff --git a/bin/tests/system/rrsetorder/dig.out.cyclic.good1 b/bin/tests/system/rrsetorder/dig.out.cyclic.good1 deleted file mode 100644 index d2ca6fc3..00000000 --- a/bin/tests/system/rrsetorder/dig.out.cyclic.good1 +++ /dev/null @@ -1,4 +0,0 @@ -1.2.3.1 -1.2.3.4 -1.2.3.3 -1.2.3.2 diff --git a/bin/tests/system/rrsetorder/dig.out.cyclic.good2 b/bin/tests/system/rrsetorder/dig.out.cyclic.good2 deleted file mode 100644 index c25c7560..00000000 --- a/bin/tests/system/rrsetorder/dig.out.cyclic.good2 +++ /dev/null @@ -1,4 +0,0 @@ -1.2.3.4 -1.2.3.3 -1.2.3.2 -1.2.3.1 diff --git a/bin/tests/system/rrsetorder/dig.out.cyclic.good3 b/bin/tests/system/rrsetorder/dig.out.cyclic.good3 deleted file mode 100644 index e8deb671..00000000 --- a/bin/tests/system/rrsetorder/dig.out.cyclic.good3 +++ /dev/null @@ -1,4 +0,0 @@ -1.2.3.3 -1.2.3.2 -1.2.3.1 -1.2.3.4 diff --git a/bin/tests/system/rrsetorder/dig.out.cyclic.good4 b/bin/tests/system/rrsetorder/dig.out.cyclic.good4 deleted file mode 100644 index 3b276939..00000000 --- a/bin/tests/system/rrsetorder/dig.out.cyclic.good4 +++ /dev/null @@ -1,4 +0,0 @@ -1.2.3.2 -1.2.3.1 -1.2.3.4 -1.2.3.3 diff --git a/bin/tests/system/rrsetorder/tests.sh b/bin/tests/system/rrsetorder/tests.sh index de9136e9..cf38a703 100644 --- a/bin/tests/system/rrsetorder/tests.sh +++ b/bin/tests/system/rrsetorder/tests.sh @@ -1,6 +1,6 @@ #!/bin/sh # -# Copyright (C) 2006, 2007 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2006-2008 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,54 +14,60 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: tests.sh,v 1.5 2007/06/19 23:47:05 tbox Exp $ +# $Id: tests.sh,v 1.5.128.2 2008/04/24 23:46:29 tbox Exp $ SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh status=0 +if grep -q "^#define DNS_RDATASET_FIXED" $TOP/config.h; then + test_fixed=true +else + echo "I: Order 'fixed' disabled at compile time" + test_fixed=false +fi + # # # -echo "I: Checking order fixed (master)" -ret=0 -for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 -do -$DIG +nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm +nostat +short \ - -p 5300 @10.53.0.1 fixed.example > dig.out.fixed || ret=1 -cmp -s dig.out.fixed dig.out.fixed.good || ret=1 -done -if [ $ret != 0 ]; then echo "I:failed"; fi -status=`expr $status + $ret` +if $test_fixed; then + echo "I: Checking order fixed (master)" + ret=0 + for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + do + $DIG +nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm +nostat +short \ + -p 5300 @10.53.0.1 fixed.example > dig.out.fixed || ret=1 + cmp -s dig.out.fixed dig.out.fixed.good || ret=1 + done + if [ $ret != 0 ]; then echo "I:failed"; fi + status=`expr $status + $ret` +fi # # # echo "I: Checking order cyclic (master)" ret=0 -match1=0 -match2=0 -match3=0 -match4=0 -for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 +matches=0 +for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 do -$DIG +nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm +nostat +short \ - -p 5300 @10.53.0.1 cyclic.example > dig.out.cyclic || ret=1 -cmp -s dig.out.cyclic dig.out.cyclic.good1 || \ -cmp -s dig.out.cyclic dig.out.cyclic.good2 || \ -cmp -s dig.out.cyclic dig.out.cyclic.good3 || \ -cmp -s dig.out.cyclic dig.out.cyclic.good4 || \ -ret=1 - -cmp -s dig.out.cyclic dig.out.cyclic.good1 && match1=1 -cmp -s dig.out.cyclic dig.out.cyclic.good2 && match2=1 -cmp -s dig.out.cyclic dig.out.cyclic.good3 && match3=1 -cmp -s dig.out.cyclic dig.out.cyclic.good4 && match4=1 - + j=`expr $i % 4` + $DIG +nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm +nostat +short \ + -p 5300 @10.53.0.1 cyclic.example > dig.out.cyclic || ret=1 + if [ $i -le 4 ]; then + cp dig.out.cyclic dig.out.$j + else + cmp -s dig.out.cyclic dig.out.$j && matches=`expr $matches + 1` + fi done -match=`expr $match1 + $match2 + $match3 + $match4` -if [ $match != 4 ]; then ret=1; fi +cmp -s dig.out.0 dig.out.1 && ret=1 +cmp -s dig.out.0 dig.out.2 && ret=1 +cmp -s dig.out.0 dig.out.3 && ret=1 +cmp -s dig.out.1 dig.out.2 && ret=1 +cmp -s dig.out.1 dig.out.3 && ret=1 +cmp -s dig.out.2 dig.out.3 && ret=1 +if [ $matches -ne 16 ]; then ret=1; fi if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` @@ -96,44 +102,43 @@ status=`expr $status + $ret` # # # -echo "I: Checking order fixed (slave)" -ret=0 -for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 -do -$DIG +nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm +nostat +short \ - -p 5300 @10.53.0.2 fixed.example > dig.out.fixed || ret=1 -cmp -s dig.out.fixed dig.out.fixed.good || ret=1 -done -if [ $ret != 0 ]; then echo "I:failed"; fi -status=`expr $status + $ret` +if $test_fixed; then + echo "I: Checking order fixed (slave)" + ret=0 + for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + do + $DIG +nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm +nostat +short \ + -p 5300 @10.53.0.2 fixed.example > dig.out.fixed || ret=1 + cmp -s dig.out.fixed dig.out.fixed.good || ret=1 + done + if [ $ret != 0 ]; then echo "I:failed"; fi + status=`expr $status + $ret` +fi # # # echo "I: Checking order cyclic (slave)" ret=0 -match1=0 -match2=0 -match3=0 -match4=0 -for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 +matches=0 +for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 do -$DIG +nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm +nostat +short \ - -p 5300 @10.53.0.2 cyclic.example > dig.out.cyclic || ret=1 -cmp -s dig.out.cyclic dig.out.cyclic.good1 || \ -cmp -s dig.out.cyclic dig.out.cyclic.good2 || \ -cmp -s dig.out.cyclic dig.out.cyclic.good3 || \ -cmp -s dig.out.cyclic dig.out.cyclic.good4 || \ -ret=1 - -cmp -s dig.out.cyclic dig.out.cyclic.good1 && match1=1 -cmp -s dig.out.cyclic dig.out.cyclic.good2 && match2=1 -cmp -s dig.out.cyclic dig.out.cyclic.good3 && match3=1 -cmp -s dig.out.cyclic dig.out.cyclic.good4 && match4=1 - + j=`expr $i % 4` + $DIG +nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm +nostat +short \ + -p 5300 @10.53.0.2 cyclic.example > dig.out.cyclic || ret=1 + if [ $i -le 4 ]; then + cp dig.out.cyclic dig.out.$j + else + cmp -s dig.out.cyclic dig.out.$j && matches=`expr $matches + 1` + fi done -match=`expr $match1 + $match2 + $match3 + $match4` -if [ $match != 4 ]; then ret=1; fi +cmp -s dig.out.0 dig.out.1 && ret=1 +cmp -s dig.out.0 dig.out.2 && ret=1 +cmp -s dig.out.0 dig.out.3 && ret=1 +cmp -s dig.out.1 dig.out.2 && ret=1 +cmp -s dig.out.1 dig.out.3 && ret=1 +cmp -s dig.out.2 dig.out.3 && ret=1 +if [ $matches -ne 16 ]; then ret=1; fi if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` @@ -184,44 +189,43 @@ echo "I: Re-starting slave" # # # -echo "I: Checking order fixed (slave loaded from disk)" -ret=0 -for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 -do -$DIG +nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm +nostat +short \ - -p 5300 @10.53.0.2 fixed.example > dig.out.fixed || ret=1 -cmp -s dig.out.fixed dig.out.fixed.good || ret=1 -done -if [ $ret != 0 ]; then echo "I:failed"; fi -status=`expr $status + $ret` +if $test_fixed; then + echo "I: Checking order fixed (slave loaded from disk)" + ret=0 + for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + do + $DIG +nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm +nostat +short \ + -p 5300 @10.53.0.2 fixed.example > dig.out.fixed || ret=1 + cmp -s dig.out.fixed dig.out.fixed.good || ret=1 + done + if [ $ret != 0 ]; then echo "I:failed"; fi + status=`expr $status + $ret` +fi # # # echo "I: Checking order cyclic (slave loaded from disk)" ret=0 -match1=0 -match2=0 -match3=0 -match4=0 -for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 +matches=0 +for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 do -$DIG +nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm +nostat +short \ - -p 5300 @10.53.0.2 cyclic.example > dig.out.cyclic || ret=1 -cmp -s dig.out.cyclic dig.out.cyclic.good1 || \ -cmp -s dig.out.cyclic dig.out.cyclic.good2 || \ -cmp -s dig.out.cyclic dig.out.cyclic.good3 || \ -cmp -s dig.out.cyclic dig.out.cyclic.good4 || \ -ret=1 - -cmp -s dig.out.cyclic dig.out.cyclic.good1 && match1=1 -cmp -s dig.out.cyclic dig.out.cyclic.good2 && match2=1 -cmp -s dig.out.cyclic dig.out.cyclic.good3 && match3=1 -cmp -s dig.out.cyclic dig.out.cyclic.good4 && match4=1 - + j=`expr $i % 4` + $DIG +nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm +nostat +short \ + -p 5300 @10.53.0.2 cyclic.example > dig.out.cyclic || ret=1 + if [ $i -le 4 ]; then + cp dig.out.cyclic dig.out.$j + else + cmp -s dig.out.cyclic dig.out.$j && matches=`expr $matches + 1` + fi done -match=`expr $match1 + $match2 + $match3 + $match4` -if [ $match != 4 ]; then ret=1; fi +cmp -s dig.out.0 dig.out.1 && ret=1 +cmp -s dig.out.0 dig.out.2 && ret=1 +cmp -s dig.out.0 dig.out.3 && ret=1 +cmp -s dig.out.1 dig.out.2 && ret=1 +cmp -s dig.out.1 dig.out.3 && ret=1 +cmp -s dig.out.2 dig.out.3 && ret=1 +if [ $matches -ne 16 ]; then ret=1; fi if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` @@ -256,44 +260,43 @@ status=`expr $status + $ret` # # # -echo "I: Checking order fixed (cache)" -ret=0 -for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 -do -$DIG +nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm +nostat +short \ - -p 5300 @10.53.0.3 fixed.example > dig.out.fixed || ret=1 -cmp -s dig.out.fixed dig.out.fixed.good || ret=1 -done -if [ $ret != 0 ]; then echo "I:failed"; fi -status=`expr $status + $ret` +if $test_fixed; then + echo "I: Checking order fixed (cache)" + ret=0 + for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + do + $DIG +nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm +nostat +short \ + -p 5300 @10.53.0.3 fixed.example > dig.out.fixed || ret=1 + cmp -s dig.out.fixed dig.out.fixed.good || ret=1 + done + if [ $ret != 0 ]; then echo "I:failed"; fi + status=`expr $status + $ret` +fi # # # echo "I: Checking order cyclic (cache)" ret=0 -match1=0 -match2=0 -match3=0 -match4=0 -for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 +matches=0 +for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 do -$DIG +nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm +nostat +short \ - -p 5300 @10.53.0.3 cyclic.example > dig.out.cyclic || ret=1 -cmp -s dig.out.cyclic dig.out.cyclic.good1 || \ -cmp -s dig.out.cyclic dig.out.cyclic.good2 || \ -cmp -s dig.out.cyclic dig.out.cyclic.good3 || \ -cmp -s dig.out.cyclic dig.out.cyclic.good4 || \ -ret=1 - -cmp -s dig.out.cyclic dig.out.cyclic.good1 && match1=1 -cmp -s dig.out.cyclic dig.out.cyclic.good2 && match2=1 -cmp -s dig.out.cyclic dig.out.cyclic.good3 && match3=1 -cmp -s dig.out.cyclic dig.out.cyclic.good4 && match4=1 - + j=`expr $i % 4` + $DIG +nosea +nocomm +nocmd +noquest +noadd +noauth +nocomm +nostat +short \ + -p 5300 @10.53.0.3 cyclic.example > dig.out.cyclic || ret=1 + if [ $i -le 4 ]; then + cp dig.out.cyclic dig.out.$j + else + cmp -s dig.out.cyclic dig.out.$j && matches=`expr $matches + 1` + fi done -match=`expr $match1 + $match2 + $match3 + $match4` -if [ $match != 4 ]; then ret=1; fi +cmp -s dig.out.0 dig.out.1 && ret=1 +cmp -s dig.out.0 dig.out.2 && ret=1 +cmp -s dig.out.0 dig.out.3 && ret=1 +cmp -s dig.out.1 dig.out.2 && ret=1 +cmp -s dig.out.1 dig.out.3 && ret=1 +cmp -s dig.out.2 dig.out.3 && ret=1 +if [ $matches -ne 16 ]; then ret=1; fi if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` diff --git a/config.h.in b/config.h.in index fdbe1923..e0fbcfc9 100644 --- a/config.h.in +++ b/config.h.in @@ -16,7 +16,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: config.h.in,v 1.90.60.4 2008/01/24 02:41:47 marka Exp $ */ +/* $Id: config.h.in,v 1.90.60.8 2008/05/06 01:32:51 each Exp $ */ /*! \file */ @@ -157,6 +157,9 @@ int sigwait(const unsigned int *set, int *sig); /* Define if you cannot bind() before connect() for TCP sockets. */ #undef BROKEN_TCP_BIND_BEFORE_CONNECT +/* Define to enable "rrset-order fixed" syntax. */ +#undef DNS_RDATASET_FIXED + /* Define to 1 if you have the <dlfcn.h> header file. */ #undef HAVE_DLFCN_H @@ -175,6 +178,9 @@ int sigwait(const unsigned int *set, int *sig); /* Define to 1 if you have the `c' library (-lc). */ #undef HAVE_LIBC +/* Define to 1 if you have the `cap' library (-lcap). */ +#undef HAVE_LIBCAP + /* Define to 1 if you have the `c_r' library (-lc_r). */ #undef HAVE_LIBC_R @@ -223,6 +229,9 @@ int sigwait(const unsigned int *set, int *sig); /* Define to 1 if you have the <string.h> header file. */ #undef HAVE_STRING_H +/* Define to 1 if you have the <sys/capability.h> header file. */ +#undef HAVE_SYS_CAPABILITY_H + /* Define to 1 if you have the <sys/param.h> header file. */ #undef HAVE_SYS_PARAM_H diff --git a/config.h.win32 b/config.h.win32 index 31226de5..7e77ba93 100644 --- a/config.h.win32 +++ b/config.h.win32 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2006, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2006-2008 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-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: config.h.win32,v 1.16 2007/06/19 23:46:59 tbox Exp $ */ +/* $Id: config.h.win32,v 1.16.130.2 2008/04/02 23:46:28 tbox Exp $ */ /* * win32 configuration file @@ -123,9 +123,7 @@ /* Define if you have DH_generate_parameters(). */ #define HAVE_DH_GENERATE_PARAMETERS -#define ISC_PLATFORM_NEEDSTRLCAT - -#define ISC_PLATFORM_NEEDSTRLCPY +#define WANT_IPV6 #define S_IFMT _S_IFMT /* file type mask */ #define S_IFDIR _S_IFDIR /* directory */ @@ -146,7 +144,7 @@ /* open() under unix allows setting of read/write permissions * at the owner, group and other levels. These don't exist in NT - * We'll just map them all to the NT equivalent + * We'll just map them all to the NT equivalent */ #define S_IRUSR _S_IREAD /* Owner read permission */ @@ -196,7 +194,7 @@ typedef long off_t; */ #include <versions.h> -/* We actually are using the CryptAPI and not a device */ +/* We actually are using the CryptAPI and not a device */ #define PATH_RANDOMDEV "CryptAPI" #include <stddef.h> @@ -14,7 +14,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # -# $Id: configure,v 1.418.60.4 2008/01/24 02:41:48 marka Exp $ +# $Id: configure,v 1.418.60.8 2008/05/06 01:33:33 each Exp $ # # Portions Copyright (C) 1996-2001 Nominum, Inc. # @@ -29,7 +29,7 @@ # 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. -# From configure.in Revision: 1.432.60.5 . +# From configure.in Revision: 1.432.60.9 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61. # @@ -1638,6 +1638,8 @@ Optional Features: --disable-linux-caps disable linux capabilities --enable-atomic enable machine specific atomic operations [default=autodetect] + --enable-fixed-rrset enable fixed rrset ordering + [default=no] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -9045,6 +9047,14 @@ esac # # GNU libtool support # +case $host 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 + # Check whether --with-libtool was given. if test "${with_libtool+set}" = set; then @@ -9581,7 +9591,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 9584 "configure"' > conftest.$ac_ext + echo '#line 9594 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -11703,11 +11713,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11706: $lt_compile\"" >&5) + (eval echo "\"\$as_me:11716: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:11710: \$? = $ac_status" >&5 + echo "$as_me:11720: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -11946,11 +11956,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11949: $lt_compile\"" >&5) + (eval echo "\"\$as_me:11959: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:11953: \$? = $ac_status" >&5 + echo "$as_me:11963: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -12006,11 +12016,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12009: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12019: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:12013: \$? = $ac_status" >&5 + echo "$as_me:12023: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -14154,7 +14164,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<EOF -#line 14157 "configure" +#line 14167 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -14252,7 +14262,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<EOF -#line 14255 "configure" +#line 14265 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -16445,11 +16455,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:16448: $lt_compile\"" >&5) + (eval echo "\"\$as_me:16458: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:16452: \$? = $ac_status" >&5 + echo "$as_me:16462: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -16505,11 +16515,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:16508: $lt_compile\"" >&5) + (eval echo "\"\$as_me:16518: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:16512: \$? = $ac_status" >&5 + echo "$as_me:16522: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -17833,7 +17843,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<EOF -#line 17836 "configure" +#line 17846 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -17931,7 +17941,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<EOF -#line 17934 "configure" +#line 17944 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -18768,11 +18778,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:18771: $lt_compile\"" >&5) + (eval echo "\"\$as_me:18781: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:18775: \$? = $ac_status" >&5 + echo "$as_me:18785: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -18828,11 +18838,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:18831: $lt_compile\"" >&5) + (eval echo "\"\$as_me:18841: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:18835: \$? = $ac_status" >&5 + echo "$as_me:18845: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -20862,11 +20872,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:20865: $lt_compile\"" >&5) + (eval echo "\"\$as_me:20875: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:20869: \$? = $ac_status" >&5 + echo "$as_me:20879: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -21105,11 +21115,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:21108: $lt_compile\"" >&5) + (eval echo "\"\$as_me:21118: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:21112: \$? = $ac_status" >&5 + echo "$as_me:21122: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -21165,11 +21175,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:21168: $lt_compile\"" >&5) + (eval echo "\"\$as_me:21178: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:21172: \$? = $ac_status" >&5 + echo "$as_me:21182: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -23313,7 +23323,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<EOF -#line 23316 "configure" +#line 23326 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -23411,7 +23421,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<EOF -#line 23414 "configure" +#line 23424 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -27490,7 +27500,8 @@ fi case "$enable_linux_caps" in yes|'') -for ac_header in linux/capability.h + +for ac_header in linux/capability.h sys/capability.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then @@ -27629,6 +27640,77 @@ fi done + +{ echo "$as_me:$LINENO: checking for cap_set_proc in -lcap" >&5 +echo $ECHO_N "checking for cap_set_proc in -lcap... $ECHO_C" >&6; } +if test "${ac_cv_lib_cap_cap_set_proc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcap $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char cap_set_proc (); +int +main () +{ +return cap_set_proc (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_lib_cap_cap_set_proc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_cap_cap_set_proc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_cap_cap_set_proc" >&5 +echo "${ECHO_T}$ac_cv_lib_cap_cap_set_proc" >&6; } +if test $ac_cv_lib_cap_cap_set_proc = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBCAP 1 +_ACEOF + + LIBS="-lcap $LIBS" + +fi + ;; no) ;; @@ -29213,6 +29295,30 @@ ISC_ARCH_DIR=$arch # +# Activate "rrset-order fixed" or not? +# +# Check whether --enable-fixed-rrset was given. +if test "${enable_fixed_rrset+set}" = set; then + enableval=$enable_fixed_rrset; enable_fixed="$enableval" +else + enable_fixed="no" +fi + +case "$enable_fixed" in + yes) + +cat >>confdefs.h <<\_ACEOF +#define DNS_RDATASET_FIXED 1 +_ACEOF + + ;; + no) + ;; + *) + ;; +esac + +# # The following sets up how non-blocking i/o is established. # Sunos, cygwin and solaris 2.x (x<5) require special handling. # diff --git a/configure.in b/configure.in index 1e991c55..4ffa8d7b 100644 --- a/configure.in +++ b/configure.in @@ -18,7 +18,7 @@ AC_DIVERT_PUSH(1)dnl esyscmd([sed "s/^/# /" COPYRIGHT])dnl AC_DIVERT_POP()dnl -AC_REVISION($Revision: 1.432.60.5 $) +AC_REVISION($Revision: 1.432.60.9 $) AC_INIT(lib/dns/name.c) AC_PREREQ(2.59) @@ -1097,6 +1097,14 @@ AC_SUBST(PURIFY) # # GNU libtool support # +case $host 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)], use_libtool="$withval", use_libtool="no") @@ -1875,7 +1883,8 @@ AC_ARG_ENABLE(linux-caps, [ --disable-linux-caps disable linux capabilities]) case "$enable_linux_caps" in yes|'') - AC_CHECK_HEADERS(linux/capability.h) + AC_CHECK_HEADERS(linux/capability.h sys/capability.h) + AC_CHECK_LIB(cap, cap_set_proc) ;; no) ;; @@ -2254,6 +2263,25 @@ ISC_ARCH_DIR=$arch 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="$enableval", + enable_fixed="no") +case "$enable_fixed" in + yes) + AC_DEFINE(DNS_RDATASET_FIXED, 1, + [Define to enable "rrset-order fixed" syntax.]) + ;; + no) + ;; + *) + ;; +esac + +# # The following sets up how non-blocking i/o is established. # Sunos, cygwin and solaris 2.x (x<5) require special handling. # diff --git a/contrib/query-loc-0.3.0/install-sh b/contrib/query-loc-0.3.0/install-sh deleted file mode 100755 index e9de2384..00000000 --- a/contrib/query-loc-0.3.0/install-sh +++ /dev/null @@ -1,251 +0,0 @@ -#!/bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5 (mit/util/scripts/install.sh). -# -# Copyright 1991 by the Massachusetts Institute of Technology -# -# Permission to use, copy, modify, distribute, and sell this software and its -# documentation for any purpose is hereby granted without fee, provided that -# the above copyright notice appear in all copies and that both that -# copyright notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in advertising or -# publicity pertaining to distribution of the software without specific, -# written prior permission. M.I.T. makes no representations about the -# suitability of this software for any purpose. It is provided "as is" -# without express or implied warranty. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. It can only install one file at a time, a restriction -# shared with many OS's install programs. - - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -transformbasename="" -transform_arg="" -instcmd="$mvprog" -chmodcmd="$chmodprog 0755" -chowncmd="" -chgrpcmd="" -stripcmd="" -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src="" -dst="" -dir_arg="" - -while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd="$stripprog" - shift - continue;; - - -t=*) transformarg=`echo $1 | sed 's/-t=//'` - shift - continue;; - - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; - esac -done - -if [ x"$src" = x ] -then - echo "install: no input file specified" - exit 1 -else - true -fi - -if [ x"$dir_arg" != x ]; then - dst=$src - src="" - - if [ -d $dst ]; then - instcmd=: - chmodcmd="" - else - instcmd=mkdir - fi -else - -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - true - else - echo "install: $src does not exist" - exit 1 - fi - - if [ x"$dst" = x ] - then - echo "install: no destination specified" - exit 1 - else - true - fi - -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - - if [ -d $dst ] - then - dst="$dst"/`basename $src` - else - true - fi -fi - -## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - -# Make sure that the destination directory exists. -# this part is taken from Noah Friedman's mkinstalldirs script - -# Skip lots of stat calls in the usual case. -if [ ! -d "$dstdir" ]; then -defaultIFS=' -' -IFS="${IFS-${defaultIFS}}" - -oIFS="${IFS}" -# Some sh's can't handle IFS=/ for some reason. -IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" - -pathcomp='' - -while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" - shift - - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" - else - true - fi - - pathcomp="${pathcomp}/" -done -fi - -if [ x"$dir_arg" != x ] -then - $doit $instcmd $dst && - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi -else - -# If we're going to rename the final executable, determine the name now. - - if [ x"$transformarg" = x ] - then - dstfile=`basename $dst` - else - dstfile=`basename $dst $transformbasename | - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" = x ] - then - dstfile=`basename $dst` - else - true - fi - -# Make a temp file name in the proper directory. - - dsttmp=$dstdir/#inst.$$# - -# Move or copy the file name to the temp name - - $doit $instcmd $src $dsttmp && - - trap "rm -f ${dsttmp}" 0 && - -# and set any options; do chmod last to preserve setuid bits - -# If any of these fail, we abort the whole thing. If we want to -# ignore errors from any of these, just make sure not to ignore -# errors from the above "$doit $instcmd $src $dsttmp" command. - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && - -# Now rename the file to the real destination. - - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile - -fi && - - -exit 0 diff --git a/contrib/query-loc-0.3.0/ADDRESSES b/contrib/query-loc-0.4.0/ADDRESSES index 370fde06..522967eb 100644 --- a/contrib/query-loc-0.3.0/ADDRESSES +++ b/contrib/query-loc-0.4.0/ADDRESSES @@ -1,12 +1,10 @@ The following machines, at least today seem to have LOC records: -*.cpod.fr (for instance www.cpod.fr) +147.210.73.0/24 (note the two /25 have different LOC, inherited differently) 130.104.3.* -195.202.193.* Melanie.Tolna.Net 204.92.254.* -mail.vitts.com alink.net caida.org ckdhr.com @@ -15,4 +13,4 @@ nikhef.nl yahoo.com nic.af -$Id: ADDRESSES,v 1.1 2005/04/01 05:34:59 marka Exp $ +$Id: ADDRESSES,v 1.1.2.1 2008/02/15 02:11:57 marka Exp $ diff --git a/contrib/query-loc-0.3.0/ALGO b/contrib/query-loc-0.4.0/ALGO index 4695dc14..4695dc14 100644 --- a/contrib/query-loc-0.3.0/ALGO +++ b/contrib/query-loc-0.4.0/ALGO diff --git a/contrib/query-loc-0.3.0/INSTALL b/contrib/query-loc-0.4.0/INSTALL index 5f31e7bd..3b398fb4 100644 --- a/contrib/query-loc-0.3.0/INSTALL +++ b/contrib/query-loc-0.4.0/INSTALL @@ -6,4 +6,4 @@ which I provide, if not found. Tested on Linux (i386 and Alpha), Solaris (Sparc) and Digital Unix (Alpha). -$Id: INSTALL,v 1.1 2005/04/01 05:34:59 marka Exp $ +$Id: INSTALL,v 1.1.2.1 2008/02/15 02:11:57 marka Exp $ diff --git a/contrib/query-loc-0.3.0/Makefile.in b/contrib/query-loc-0.4.0/Makefile.in index 82075c30..e7fc6cff 100644 --- a/contrib/query-loc-0.3.0/Makefile.in +++ b/contrib/query-loc-0.4.0/Makefile.in @@ -1,11 +1,11 @@ -# $Id: Makefile.in,v 1.1 2005/04/01 05:34:59 marka Exp $ +# $Id: Makefile.in,v 1.1.2.1 2008/02/15 02:11:57 marka Exp $ CC=@CC@ CFLAGS=@CFLAGS@ LIBS=@LIBS@ DESTDIR=@prefix@ BINDIR=@prefix@/bin MANDIR=@prefix@/share/man/man1 -DISTRIB= README INSTALL ALGO USAGE ADDRESSES Makefile.in configure configure.in config.h.in install-sh loc.h loc.c query-loc.c loc_ntoa.c query-loc.1 +DISTRIB= README INSTALL ALGO USAGE ADDRESSES Makefile.in configure configure.in config.h.in install-sh loc.h loc.c query-loc.c loc_ntoa.c query-loc.1 reconf OBJS=query-loc.o loc.o @LOC_NTOA@ VERSION=`grep VERSION loc.h | cut -d ' ' -f 3 | sed s/\"//g` @@ -23,6 +23,8 @@ clean: distclean: clean rm -f config.h config.cache config.log config.status Makefile +dist: distrib + distrib: clean ./reconf @(echo Query-Loc is version ${VERSION}; \ diff --git a/contrib/query-loc-0.3.0/README b/contrib/query-loc-0.4.0/README index fc49c739..360091c7 100644 --- a/contrib/query-loc-0.3.0/README +++ b/contrib/query-loc-0.4.0/README @@ -9,12 +9,13 @@ It is under the General Public Licence (GPL, which you can fetch from <http://www.gnu.org/copyleft/gpl.html>. - Copyright Stéphane Bortzmeyer <bortzmeyer@debian.org>, 1998. + Copyright Stéphane Bortzmeyer <bortzmeyer@sources.org>, 1998-2007. Thanks to Paul Vixie for the RFC and its encouragements. Thanks to Björn Augustsson for the xtraceroute program - <http://www.dtek.chalmers.se/~d3august/xt/>. + <http://www.dtek.chalmers.se/~d3august/xt/>. Thanks to Roland + Dirlewanger for extensive patching. -$Id: README,v 1.1 2005/04/01 05:34:59 marka Exp $ +$Id: README,v 1.1.2.1 2008/02/15 02:11:57 marka Exp $ diff --git a/contrib/query-loc-0.3.0/USAGE b/contrib/query-loc-0.4.0/USAGE index 233d6ca1..d3ee4c06 100644 --- a/contrib/query-loc-0.3.0/USAGE +++ b/contrib/query-loc-0.4.0/USAGE @@ -3,6 +3,5 @@ query-loc [-v] [-d nnn] host-name-or-address Examples of hosts with LOCation info (quite uncommon, if you know more, please tell me): -- Everything in the 193.105.79.0 network, such as www.humanite.presse.fr -- Everything in the 192.88.144 network, such as www.kei.com +See the ADDRESSES file diff --git a/contrib/query-loc-0.3.0/config.h.in b/contrib/query-loc-0.4.0/config.h.in index d90187ce..e41250c9 100644 --- a/contrib/query-loc-0.3.0/config.h.in +++ b/contrib/query-loc-0.4.0/config.h.in @@ -1,5 +1,5 @@ /* config.h.in. Generated from configure.in by autoheader. */ -/* $Id: config.h.in,v 1.1 2005/04/01 05:35:00 marka Exp $ */ +/* $Id: config.h.in,v 1.1.2.1 2008/02/15 02:11:57 marka Exp $ */ /* Define to 1 if you have the <inttypes.h> header file. */ diff --git a/contrib/query-loc-0.3.0/configure b/contrib/query-loc-0.4.0/configure index d77cf76c..d77cf76c 100755 --- a/contrib/query-loc-0.3.0/configure +++ b/contrib/query-loc-0.4.0/configure diff --git a/contrib/query-loc-0.3.0/configure.in b/contrib/query-loc-0.4.0/configure.in index f25a6a25..10966c50 100644 --- a/contrib/query-loc-0.3.0/configure.in +++ b/contrib/query-loc-0.4.0/configure.in @@ -1,5 +1,5 @@ dnl Process this file with autoconf to produce a configure script. -AC_RELEASE("$Id: configure.in,v 1.1 2005/04/01 05:35:00 marka Exp $") +AC_RELEASE("$Id: configure.in,v 1.1.2.1 2008/02/15 02:11:57 marka Exp $") AC_INIT(query-loc.c) dnl Checks for programs. diff --git a/contrib/query-loc-0.4.0/install-sh b/contrib/query-loc-0.4.0/install-sh new file mode 100755 index 00000000..1a835340 --- /dev/null +++ b/contrib/query-loc-0.4.0/install-sh @@ -0,0 +1,323 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2005-02-02.21 + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +chmodcmd="$chmodprog 0755" +chowncmd= +chgrpcmd= +stripcmd= +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src= +dst= +dir_arg= +dstarg= +no_target_directory= + +usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: +-c (ignored) +-d create directories instead of installing files. +-g GROUP $chgrpprog installed files to GROUP. +-m MODE $chmodprog installed files to MODE. +-o USER $chownprog installed files to USER. +-s $stripprog installed files. +-t DIRECTORY install into DIRECTORY. +-T report an error if DSTFILE is a directory. +--help display this help and exit. +--version display version info and exit. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG +" + +while test -n "$1"; do + case $1 in + -c) shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + --help) echo "$usage"; exit $?;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -s) stripcmd=$stripprog + shift + continue;; + + -t) dstarg=$2 + shift + shift + continue;; + + -T) no_target_directory=true + shift + continue;; + + --version) echo "$0 $scriptversion"; exit $?;; + + *) # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + test -n "$dir_arg$dstarg" && break + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dstarg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dstarg" + shift # fnord + fi + shift # arg + dstarg=$arg + done + break;; + esac +done + +if test -z "$1"; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src ;; + esac + + if test -n "$dir_arg"; then + dst=$src + src= + + if test -d "$dst"; then + mkdircmd=: + chmodcmd= + else + mkdircmd=$mkdirprog + fi + else + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dstarg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dstarg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst ;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dstarg: Is a directory" >&2 + exit 1 + fi + dst=$dst/`basename "$src"` + fi + fi + + # This sed command emulates the dirname command. + dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` + + # Make sure that the destination directory exists. + + # Skip lots of stat calls in the usual case. + if test ! -d "$dstdir"; then + defaultIFS=' + ' + IFS="${IFS-$defaultIFS}" + + oIFS=$IFS + # Some sh's can't handle IFS=/ for some reason. + IFS='%' + set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` + shift + IFS=$oIFS + + pathcomp= + + while test $# -ne 0 ; do + pathcomp=$pathcomp$1 + shift + if test ! -d "$pathcomp"; then + $mkdirprog "$pathcomp" + # mkdir can fail with a `File exist' error in case several + # install-sh are creating the directory concurrently. This + # is OK. + test -d "$pathcomp" || exit + fi + pathcomp=$pathcomp/ + done + fi + + if test -n "$dir_arg"; then + $doit $mkdircmd "$dst" \ + && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } + + else + dstfile=`basename "$dst"` + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + trap '(exit $?); exit' 1 2 13 15 + + # Copy the file name to the temp name. + $doit $cpprog "$src" "$dsttmp" && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && + + # Now rename the file to the real destination. + { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ + || { + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + if test -f "$dstdir/$dstfile"; then + $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ + || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ + || { + echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 + (exit 1); exit 1 + } + else + : + fi + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" + } + } + fi || { (exit 1); exit 1; } +done + +# The final little trick to "correctly" pass the exit status to the exit trap. +{ + (exit 0); exit 0 +} + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/contrib/query-loc-0.3.0/loc.c b/contrib/query-loc-0.4.0/loc.c index 502ed11b..7d62089c 100644 --- a/contrib/query-loc-0.3.0/loc.c +++ b/contrib/query-loc-0.4.0/loc.c @@ -1,6 +1,6 @@ #include "loc.h" -/* $Id: loc.c,v 1.1 2005/04/01 05:35:00 marka Exp $ */ +/* $Id: loc.c,v 1.1.2.1 2008/02/15 02:11:57 marka Exp $ */ /* Global variables */ @@ -175,20 +175,24 @@ getlocbyaddr (addr, mask) if (IN_CLASSA (a)) { netaddr.s_addr = htonl (a & IN_CLASSA_NET); + themask.s_addr = htonl(IN_CLASSA_NET); } else if (IN_CLASSB (a)) { netaddr.s_addr = htonl (a & IN_CLASSB_NET); + themask.s_addr = htonl(IN_CLASSB_NET); } else if (IN_CLASSC (a)) { netaddr.s_addr = htonl (a & IN_CLASSC_NET); + themask.s_addr = htonl(IN_CLASSC_NET); } else { /* Error */ + return NULL; } - return getlocbynet (in_addr_arpa (inet_ntoa (netaddr)), addr, mask); + return getlocbynet (in_addr_arpa (inet_ntoa (netaddr)), addr, &themask); } else { @@ -209,10 +213,49 @@ getlocbynet (name, addr, mask) struct in_addr *mask; { char *network; - char *result, *result_int; + char *result; struct list_in_addr *list; + struct in_addr newmask; + u_int32_t a; + char newname[4 * 4 + sizeof (ARPA_ROOT) + 2]; + if (debug >= 2) - printf ("Testing network %s\n", name); + printf ("Testing network %s with mask %s\n", name, inet_ntoa(*mask)); + + /* Check if this network has an A RR */ + list = findA (name); + if (list != NULL) + { + /* Yes, it does. This A record will be used as the + * new mask for recursion if it is longer than + * the actual mask. */ + if (mask != NULL && mask->s_addr < list->addr.s_addr) + { + /* compute the new arguments for recursion + * - compute the new network by applying the new mask + * to the address and get the in_addr_arpa representation + * of it. + * - the address remains unchanged + * - the new mask is the one given in the A record + */ + a = ntohl(addr.s_addr); /* start from host address */ + a &= ntohl(list->addr.s_addr); /* apply new mask */ + newname[sizeof newname - 1] = 0; + strncpy( + newname, + in_addr_arpa(inet_ntoa(inet_makeaddr(a, 0))), + sizeof newname); + newmask = inet_makeaddr(ntohl(list->addr.s_addr), 0); + result = getlocbynet (newname, addr, &newmask); + if (result != NULL) + { + return result; + } + } + /* couldn't find a LOC. Fall through and try with name */ + } + + /* Check if this network has a name */ network = findRR (name, T_PTR); if (network == NULL) { @@ -222,26 +265,7 @@ getlocbynet (name, addr, mask) } else { - result = getlocbyname (network, TRUE); - list = findA (network); - if (list == NULL) - { - return result; - } - else if ((mask != NULL) && - ((mask->s_addr) == (list->addr.s_addr))) - { - /* Already checked */ - return result; - } - else - { - result_int = getlocbyaddr (addr, &list->addr); - if (result_int == NULL) - return result; - else - return result_int; - } + return getlocbyname (network, TRUE); } } @@ -414,7 +438,7 @@ int responseLen; /* buffer length */ if (dn_expand (response.buf, /* Start of the packet */ endOfMsg, /* End of the packet */ cp, /* Position in the packet */ - (u_char *) ptrList[ptrNum], /* Result */ + (char *) ptrList[ptrNum], /* Result */ MAXDNAME) /* size of ptrList buffer */ < 0) { /* Negative: error */ diff --git a/contrib/query-loc-0.3.0/loc.h b/contrib/query-loc-0.4.0/loc.h index f794acbe..73901653 100644 --- a/contrib/query-loc-0.3.0/loc.h +++ b/contrib/query-loc-0.4.0/loc.h @@ -1,6 +1,6 @@ -/* $Id: loc.h,v 1.1 2005/04/01 05:35:00 marka Exp $ */ +/* $Id: loc.h,v 1.1.2.1 2008/02/15 02:11:57 marka Exp $ */ -#define VERSION "0.3.0" +#define VERSION "0.4.0" #include "config.h" diff --git a/contrib/query-loc-0.3.0/loc_ntoa.c b/contrib/query-loc-0.4.0/loc_ntoa.c index 21eada3e..21eada3e 100644 --- a/contrib/query-loc-0.3.0/loc_ntoa.c +++ b/contrib/query-loc-0.4.0/loc_ntoa.c diff --git a/contrib/query-loc-0.3.0/query-loc.1 b/contrib/query-loc-0.4.0/query-loc.1 index 97eb4362..87b1c0e9 100644 --- a/contrib/query-loc-0.3.0/query-loc.1 +++ b/contrib/query-loc-0.4.0/query-loc.1 @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH QUERY-LOC SECTION "January 11, 2005" +.TH QUERY-LOC 1 "January 11, 2005" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -52,4 +52,4 @@ Very few hosts have location information. This manual page was written by Stephane Bortzmeyer <bortzmeyer@debian.org>. -.\" $Id: query-loc.1,v 1.1 2005/04/01 05:35:01 marka Exp $ +.\" $Id: query-loc.1,v 1.1.2.1 2008/02/15 02:11:57 marka Exp $ diff --git a/contrib/query-loc-0.3.0/query-loc.c b/contrib/query-loc-0.4.0/query-loc.c index 6af57d42..4af15b5f 100644 --- a/contrib/query-loc-0.3.0/query-loc.c +++ b/contrib/query-loc-0.4.0/query-loc.c @@ -1,6 +1,6 @@ #include "loc.h" -/* $Id: query-loc.c,v 1.1 2005/04/01 05:35:01 marka Exp $ */ +/* $Id: query-loc.c,v 1.1.2.1 2008/02/15 02:11:57 marka Exp $ */ /* Global variables */ char *progname; diff --git a/contrib/query-loc-0.4.0/reconf b/contrib/query-loc-0.4.0/reconf new file mode 100755 index 00000000..0a3c822f --- /dev/null +++ b/contrib/query-loc-0.4.0/reconf @@ -0,0 +1,8 @@ +#!/bin/sh + +# $Id: reconf,v 1.1.2.1 2008/02/15 02:16:03 marka Exp $ + +autoreconf +# We do not use automake but we need its install-sh file. We do not +# care about the exit code. +automake --add-missing || true diff --git a/doc/arm/Bv9ARM-book.xml b/doc/arm/Bv9ARM-book.xml index cb7674b7..d332c569 100644 --- a/doc/arm/Bv9ARM-book.xml +++ b/doc/arm/Bv9ARM-book.xml @@ -18,7 +18,7 @@ - PERFORMANCE OF THIS SOFTWARE. --> -<!-- File: $Id: Bv9ARM-book.xml,v 1.340.24.3 2008/01/18 02:18:45 jinmei Exp $ --> +<!-- File: $Id: Bv9ARM-book.xml,v 1.340.24.9 2008/05/05 22:38:15 each Exp $ --> <book xmlns:xi="http://www.w3.org/2001/XInclude"> <title>BIND 9 Administrator Reference Manual</title> @@ -67,7 +67,7 @@ </para> <para> - This version of the manual corresponds to BIND version 9.4. + This version of the manual corresponds to BIND version 9.5. </para> </sect1> @@ -6858,11 +6858,14 @@ query-source-v6 address * port *; <term><command>cleaning-interval</command></term> <listitem> <para> - The server will remove expired resource records + This interval is effectively obsolete. Previously, + the server would remove expired resource records from the cache every <command>cleaning-interval</command> minutes. - The default is 60 minutes. The maximum value is 28 days - (40320 minutes). - If set to 0, no periodic cleaning will occur. + <acronym>BIND</acronym> 9 now manages cache + memory in a more sophisticated manner and does not + rely on the periodic cleaning any more. + Specifying this option therefore has no effect on + the server's behavior. </para> </listitem> </varlistentry> @@ -7144,8 +7147,13 @@ query-source-v6 address * port *; </entry> <entry colname="2"> <para> - Records are returned in a round-robin - order. + Records are returned in a cyclic round-robin order. + </para> + <para> + If <acronym>BIND</acronym> is configured with the + "--enable-fixed-rrset" option at compile time, then + the initial ordering of the RRset will match the + one specified in the zone file. </para> </entry> </row> @@ -7176,9 +7184,11 @@ query-source-v6 address * port *; <note> <simpara> - The <command>rrset-order</command> statement - is not yet fully implemented in <acronym>BIND</acronym> 9. - BIND 9 currently does not fully support "fixed" ordering. + In this release of <acronym>BIND</acronym> 9, the + <command>rrset-order</command> statement does not support + "fixed" ordering by default. Fixed ordering can be enabled + at compile time by specifying "--enable-fixed-rrset" on + the "configure" command line. </simpara> </note> </sect3> @@ -7467,9 +7477,10 @@ query-source-v6 address * port *; <term><command>server-id</command></term> <listitem> <para> - The ID of the server should report via a query of - the name <filename>ID.SERVER</filename> - with type <command>TXT</command>, class <command>CHAOS</command>. + The ID the server should report when receiving a Name + Server Identifier (NSID) query, or a query of the name + <filename>ID.SERVER</filename> with type + <command>TXT</command>, class <command>CHAOS</command>. The primary purpose of such queries is to identify which of a group of anycast servers is actually answering your queries. Specifying <command>server-id none;</command> @@ -7605,162 +7616,6 @@ query-source-v6 address * port *; </varlistentry> </variablelist> </sect3> - - <sect3 id="statsfile"> - <title>The Statistics File</title> - - <para> - The statistics file generated by <acronym>BIND</acronym> 9 - is similar, but not identical, to that - generated by <acronym>BIND</acronym> 8. - </para> - <para> - The statistics dump begins with a line, like: - </para> - <para> - <command>+++ Statistics Dump +++ (973798949)</command> - </para> - <para> - The number in parentheses is a standard - Unix-style timestamp, measured as seconds since January 1, 1970. - Following - that line are a series of lines containing a counter type, the - value of the - counter, optionally a zone name, and optionally a view name. - The lines without view and zone listed are global statistics for - the entire server. - Lines with a zone and view name for the given view and zone (the - view name is - omitted for the default view). - </para> - <para> - The statistics dump ends with the line where the - number is identical to the number in the beginning line; for example: - </para> - <para> - <command>--- Statistics Dump --- (973798949)</command> - </para> - <para> - The following statistics counters are maintained: - </para> - <informaltable colsep="0" rowsep="0"> - <tgroup cols="2" colsep="0" rowsep="0" tgroupstyle="4Level-table"> - <colspec colname="1" colnum="1" colsep="0" colwidth="1.150in"/> - <colspec colname="2" colnum="2" colsep="0" colwidth="3.350in"/> - <tbody> - <row rowsep="0"> - <entry colname="1"> - <para><command>success</command></para> - </entry> - <entry colname="2"> - <para> - The number of - successful queries made to the server or zone. A - successful query - is defined as query which returns a NOERROR response - with at least - one answer RR. - </para> - </entry> - </row> - <row rowsep="0"> - <entry colname="1"> - <para><command>referral</command></para> - </entry> - <entry colname="2"> - <para> - The number of queries which resulted - in referral responses. - </para> - </entry> - </row> - <row rowsep="0"> - <entry colname="1"> - <para><command>nxrrset</command></para> - </entry> - <entry colname="2"> - <para> - The number of queries which resulted in - NOERROR responses with no data. - </para> - </entry> - </row> - <row rowsep="0"> - <entry colname="1"> - <para><command>nxdomain</command></para> - </entry> - <entry colname="2"> - <para> - The number - of queries which resulted in NXDOMAIN responses. - </para> - </entry> - </row> - <row rowsep="0"> - <entry colname="1"> - <para><command>failure</command></para> - </entry> - <entry colname="2"> - <para> - The number of queries which resulted in a - failure response other than those above. - </para> - </entry> - </row> - <row rowsep="0"> - <entry colname="1"> - <para><command>recursion</command></para> - </entry> - <entry colname="2"> - <para> - The number of queries which caused the server - to perform recursion in order to find the final answer. - </para> - </entry> - </row> - <row rowsep="0"> - <entry colname="1"> - <para><command>duplicate</command></para> - </entry> - <entry colname="2"> - <para> - The number of queries which the server attempted to - recurse but discover a existing query with the same - IP address, port, query id, name, type and class - already being processed. - </para> - </entry> - </row> - <row rowsep="0"> - <entry colname="1"> - <para><command>dropped</command></para> - </entry> - <entry colname="2"> - <para> - The number of queries for which the server - discovered a excessive number of existing - recursive queries for the same name, type and - class and were subsequently dropped. - </para> - </entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para> - Each query received by the server will cause exactly one of - <command>success</command>, - <command>referral</command>, - <command>nxrrset</command>, - <command>nxdomain</command>, or - <command>failure</command> - to be incremented, and may additionally cause the - <command>recursion</command> counter to be - incremented. - </para> - - </sect3> <sect3 id="acache"> <title>Additional Section Caching</title> @@ -7879,7 +7734,7 @@ query-source-v6 address * port *; </sect2> - <sect2> + <sect2 id="statschannels"> <title><command>statistics-channels</command> Statement Grammar</title> <programlisting><command>statistics-channels</command> { @@ -10758,7 +10613,7 @@ $GENERATE 1-127 $ CNAME $.0</programlisting> is equivalent to </para> -<programlisting>0.0.0.192.IN-ADDR.ARPA NS SERVER1.EXAMPLE. +<programlisting>0.0.0.192.IN-ADDR.ARPA. NS SERVER1.EXAMPLE. 0.0.0.192.IN-ADDR.ARPA. NS SERVER2.EXAMPLE. 1.0.0.192.IN-ADDR.ARPA. CNAME 1.0.0.0.192.IN-ADDR.ARPA. 2.0.0.192.IN-ADDR.ARPA. CNAME 2.0.0.0.192.IN-ADDR.ARPA. @@ -10937,6 +10792,1275 @@ $GENERATE 1-127 $ CNAME $.0</programlisting> </para> </sect2> </sect1> + + <sect1> + <title>BIND9 Statistics</title> + <para> + <acronym>BIND</acronym> 9 maintains lots of statistics + information and provides several interfaces for users to + get access to the statistics. + The available statistics include all statistics counters + that were available in <acronym>BIND</acronym> 8 and + are meaningful in <acronym>BIND</acronym> 9, + and other information that is considered useful. + </para> + + <para> + The statistics information is categorized into the following + sections. + </para> + + <informaltable frame="all"> + <tgroup cols="2"> + <colspec colname="1" colnum="1" colsep="0" colwidth="3.300in"/> + <colspec colname="2" colnum="2" colsep="0" colwidth="2.625in"/> + <tbody> + + <row rowsep="0"> + <entry colname="1"> + <para>Incoming Requests</para> + </entry> + <entry colname="2"> + <para> + The number of incoming DNS requests for each OPCODE. + </para> + </entry> + </row> + + <row rowsep="0"> + <entry colname="1"> + <para>Incoming Queries</para> + </entry> + <entry colname="2"> + <para> + The number of incoming queries for each RR type. + </para> + </entry> + </row> + + <row rowsep="0"> + <entry colname="1"> + <para>Outgoing Queries</para> + </entry> + <entry colname="2"> + <para> + The number of outgoing queries for each RR + type sent from the internal resolver. + Maintained per view. + </para> + </entry> + </row> + + <row rowsep="0"> + <entry colname="1"> + <para>Name Server Statistics</para> + </entry> + <entry colname="2"> + <para> + Statistics counters about incoming request processing. + </para> + </entry> + </row> + + <row rowsep="0"> + <entry colname="1"> + <para>Zone Maintenance Statistics</para> + </entry> + <entry colname="2"> + <para> + Statistics counters regarding zone maintenance + operations such as zone transfers. + </para> + </entry> + </row> + + <row rowsep="0"> + <entry colname="1"> + <para>Resolver Statistics</para> + </entry> + <entry colname="2"> + <para> + Statistics counters about name resolution + performed in the internal resolver. + Maintained per view. + </para> + </entry> + </row> + + <row rowsep="0"> + <entry colname="1"> + <para>Cache DB RRsets</para> + </entry> + <entry colname="2"> + <para> + The number of RRsets per RR type (positive + or negative) and nonexistent names stored in the + cache database. + Maintained per view. + </para> + </entry> + </row> + + </tbody> + </tgroup> + </informaltable> + + <para> + A subset of Name Server Statistics is collected and shown + per zone for which the server has the authority when + <command>zone-statistics</command> is set to + <userinput>yes</userinput>. + These statistics counters are shown with their zone and view + names. + In some cases the view names are omitted for the default view. + </para> + + <para> + There are currently two user interfaces to get access to the + statistics. + One is in the plain text format dumped to the file specified + by the <command>statistics-file</command> configuration option. + The other is remotely accessible via a statistics channel + when the <command>statistics-channels</command> statement + is specified in the configuration file + (see <xref linkend="statschannels"/>.) + </para> + + <sect3 id="statsfile"> + <title>The Statistics File</title> + <para> + The text format statistics dump begins with a line, like: + </para> + <para> + <command>+++ Statistics Dump +++ (973798949)</command> + </para> + <para> + The number in parentheses is a standard + Unix-style timestamp, measured as seconds since January 1, 1970. + + Following + that line is a set of statistics information, which is categorized + as described above. + Each section begins with a line, like: + </para> + + <para> + <command>++ Name Server Statistics ++</command> + </para> + + <para> + Each section consists of lines, each containing the statistics + counter value followed by its textual description. + See below for available counters. + For brevity, counters that have a value of 0 are not shown + in the statistics file. + </para> + + <para> + The statistics dump ends with the line where the + number is identical to the number in the beginning line; for example: + </para> + <para> + <command>--- Statistics Dump --- (973798949)</command> + </para> + </sect3> + + <sect2> + <title>Statistics Counters</title> + <para> + The following tables summarize statistics counters that + <acronym>BIND</acronym> 9 provides. + For each row of the tables, the leftmost column is the + abbreviated symbol name of that counter. + These symbols are shown in the statistics information + accessed via an HTTP statistics channel. + The rightmost column gives the description of the counter, + which is also shown in the statistics file + (but, in this document, possibly with slight modification + for better readability). + Additional notes may also be provided in this column. + When a middle column exists between these two columns, + it gives the corresponding counter name of the + <acronym>BIND</acronym> 8 statistics, if applicable. + </para> + + <sect3> + <title>Name Server Statistics Counters</title> + + <informaltable colsep="0" rowsep="0"> + <tgroup cols="3" colsep="0" rowsep="0" tgroupstyle="4Level-table"> + <colspec colname="1" colnum="1" colsep="0" colwidth="1.150in"/> + <colspec colname="2" colnum="2" colsep="0" colwidth="1.150in"/> + <colspec colname="3" colnum="3" colsep="0" colwidth="3.350in"/> + <tbody> + <row> + <entry colname="1"> + <para> + <emphasis>Symbol</emphasis> + </para> + </entry> + <entry colname="2"> + <para> + <emphasis>BIND8 Symbol</emphasis> + </para> + </entry> + <entry colname="3"> + <para> + <emphasis>Description</emphasis> + </para> + </entry> + </row> + + <row rowsep="0"> + <entry colname="1"> + <para><command>Requestv4</command></para> + </entry> + <entry colname="2"> + <para><command>RQ</command></para> + </entry> + <entry colname="3"> + <para> + IPv4 requests received. + Note: this also counts non query requests. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>Requestv6</command></para> + </entry> + <entry colname="2"> + <para><command>RQ</command></para> + </entry> + <entry colname="3"> + <para> + IPv6 requests received. + Note: this also counts non query requests. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>ReqEdns0</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Requests with EDNS(0) received. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>ReqBadEDNSVer</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Requests with unsupported EDNS version received. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>ReqTSIG</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Requests with TSIG received. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>ReqSIG0</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Requests with SIG(0) received. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>ReqBadSIG</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Requests with invalid (TSIG or SIG(0)) signature. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>ReqTCP</command></para> + </entry> + <entry colname="2"> + <para><command>RTCP</command></para> + </entry> + <entry colname="3"> + <para> + TCP requests received. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>AuthQryRej</command></para> + </entry> + <entry colname="2"> + <para><command>RUQ</command></para> + </entry> + <entry colname="3"> + <para> + Authoritative (non recursive) queries rejected. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>RecQryRej</command></para> + </entry> + <entry colname="2"> + <para><command>RURQ</command></para> + </entry> + <entry colname="3"> + <para> + Recursive queries rejected. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>XfrRej</command></para> + </entry> + <entry colname="2"> + <para><command>RUXFR</command></para> + </entry> + <entry colname="3"> + <para> + Zone transfer requests rejected. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>UpdateRej</command></para> + </entry> + <entry colname="2"> + <para><command>RUUpd</command></para> + </entry> + <entry colname="3"> + <para> + Dynamic update requests rejected. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>Response</command></para> + </entry> + <entry colname="2"> + <para><command>SAns</command></para> + </entry> + <entry colname="3"> + <para> + Responses sent. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>RespTruncated</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Truncated responses sent. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>RespEDNS0</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Responses with EDNS(0) sent. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>RespTSIG</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Responses with TSIG sent. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>RespSIG0</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Responses with SIG(0) sent. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>QrySuccess</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Queries resulted in a successful answer. + This means the query which returns a NOERROR response + with at least one answer RR. + This corresponds to the + <command>success</command> counter + of previous versions of + <acronym>BIND</acronym> 9. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>QryAuthAns</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Queries resulted in authoritative answer. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>QryNoauthAns</command></para> + </entry> + <entry colname="2"> + <para><command>SNaAns</command></para> + </entry> + <entry colname="3"> + <para> + Queries resulted in non authoritative answer. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>QryReferral</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Queries resulted in referral answer. + This corresponds to the + <command>referral</command> counter + of previous versions of + <acronym>BIND</acronym> 9. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>QryNxrrset</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Queries resulted in NOERROR responses with no data. + This corresponds to the + <command>nxrrset</command> counter + of previous versions of + <acronym>BIND</acronym> 9. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>QrySERVFAIL</command></para> + </entry> + <entry colname="2"> + <para><command>SFail</command></para> + </entry> + <entry colname="3"> + <para> + Queries resulted in SERVFAIL. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>QryFORMERR</command></para> + </entry> + <entry colname="2"> + <para><command>SFErr</command></para> + </entry> + <entry colname="3"> + <para> + Queries resulted in FORMERR. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>QryNXDOMAIN</command></para> + </entry> + <entry colname="2"> + <para><command>SNXD</command></para> + </entry> + <entry colname="3"> + <para> + Queries resulted in NXDOMAIN. + This corresponds to the + <command>nxdomain</command> counter + of previous versions of + <acronym>BIND</acronym> 9. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>QryRecursion</command></para> + </entry> + <entry colname="2"> + <para><command>RFwdQ</command></para> + </entry> + <entry colname="3"> + <para> + Queries which caused the server + to perform recursion in order to find the final answer. + This corresponds to the + <command>recursion</command> counter + of previous versions of + <acronym>BIND</acronym> 9. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>QryDuplicate</command></para> + </entry> + <entry colname="2"> + <para><command>RDupQ</command></para> + </entry> + <entry colname="3"> + <para> + Queries which the server attempted to + recurse but discovered an existing query with the same + IP address, port, query ID, name, type and class + already being processed. + This corresponds to the + <command>duplicate</command> counter + of previous versions of + <acronym>BIND</acronym> 9. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>QryDropped</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Queries for which the server + discovered an excessive number of existing + recursive queries for the same name, type and + class and were subsequently dropped. + This corresponds to the + <command>dropped</command> counter + of previous versions of + <acronym>BIND</acronym> 9. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>QryFailure</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Other query failures. + This corresponds to the + <command>failure</command> counter + of previous versions of + <acronym>BIND</acronym> 9. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>XfrReqDone</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Requested zone transfers completed. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>UpdateReqFwd</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Update requests forwarded. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>UpdateRespFwd</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Update responses forwarded. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>UpdateFwdFail</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Dynamic update forward failed. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>UpdateDone</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Dynamic updates completed. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>UpdateFail</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Dynamic updates failed. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>UpdateBadPrereq</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Dynamic updates rejected due to prerequisite failure. + </para> + </entry> + </row> + </tbody> + </tgroup> + </informaltable> + </sect3> + + <sect3> + <title>Zone Maintenance Statistics Counters</title> + + <informaltable colsep="0" rowsep="0"> + <tgroup cols="2" colsep="0" rowsep="0" tgroupstyle="4Level-table"> + <colspec colname="1" colnum="1" colsep="0" colwidth="1.150in"/> + <colspec colname="2" colnum="2" colsep="0" colwidth="3.350in"/> + <tbody> + <row> + <entry colname="1"> + <para> + <emphasis>Symbol</emphasis> + </para> + </entry> + <entry colname="2"> + <para> + <emphasis>Description</emphasis> + </para> + </entry> + </row> + + <row rowsep="0"> + <entry colname="1"> + <para><command>NotifyOutv4</command></para> + </entry> + <entry colname="2"> + <para> + IPv4 notifies sent. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>NotifyOutv6</command></para> + </entry> + <entry colname="2"> + <para> + IPv6 notifies sent. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>NotifyInv4</command></para> + </entry> + <entry colname="2"> + <para> + IPv4 notifies received. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>NotifyInv6</command></para> + </entry> + <entry colname="2"> + <para> + IPv6 notifies received. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>NotifyRej</command></para> + </entry> + <entry colname="2"> + <para> + Incoming notifies rejected. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>SOAOutv4</command></para> + </entry> + <entry colname="2"> + <para> + IPv4 SOA queries sent. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>SOAOutv6</command></para> + </entry> + <entry colname="2"> + <para> + IPv6 SOA queries sent. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>AXFRReqv4</command></para> + </entry> + <entry colname="2"> + <para> + IPv4 AXFR requested. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>AXFRReqv6</command></para> + </entry> + <entry colname="2"> + <para> + IPv6 AXFR requested. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>IXFRReqv4</command></para> + </entry> + <entry colname="2"> + <para> + IPv4 IXFR requested. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>IXFRReqv6</command></para> + </entry> + <entry colname="2"> + <para> + IPv6 IXFR requested. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>XfrSuccess</command></para> + </entry> + <entry colname="2"> + <para> + Zone transfer requests succeeded. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>XfrFail</command></para> + </entry> + <entry colname="2"> + <para> + Zone transfer requests failed. + </para> + </entry> + </row> + </tbody> + </tgroup> + </informaltable> + </sect3> + + <sect3> + <title>Resolver Statistics Counters</title> + + <informaltable colsep="0" rowsep="0"> + <tgroup cols="3" colsep="0" rowsep="0" tgroupstyle="4Level-table"> + <colspec colname="1" colnum="1" colsep="0" colwidth="1.150in"/> + <colspec colname="2" colnum="2" colsep="0" colwidth="1.150in"/> + <colspec colname="3" colnum="3" colsep="0" colwidth="3.350in"/> + <tbody> + <row> + <entry colname="1"> + <para> + <emphasis>Symbol</emphasis> + </para> + </entry> + <entry colname="2"> + <para> + <emphasis>BIND8 Symbol</emphasis> + </para> + </entry> + <entry colname="3"> + <para> + <emphasis>Description</emphasis> + </para> + </entry> + </row> + + + <row rowsep="0"> + <entry colname="1"> + <para><command>Queryv4</command></para> + </entry> + <entry colname="2"> + <para><command>SFwdQ</command></para> + </entry> + <entry colname="3"> + <para> + IPv4 queries sent. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>Queryv6</command></para> + </entry> + <entry colname="2"> + <para><command>SFwdQ</command></para> + </entry> + <entry colname="3"> + <para> + IPv6 queries sent. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>Responsev4</command></para> + </entry> + <entry colname="2"> + <para><command>RR</command></para> + </entry> + <entry colname="3"> + <para> + IPv4 responses received. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>Responsev6</command></para> + </entry> + <entry colname="2"> + <para><command>RR</command></para> + </entry> + <entry colname="3"> + <para> + IPv6 responses received. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>NXDOMAIN</command></para> + </entry> + <entry colname="2"> + <para><command>RNXD</command></para> + </entry> + <entry colname="3"> + <para> + NXDOMAIN received. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>SERVFAIL</command></para> + </entry> + <entry colname="2"> + <para><command>RFail</command></para> + </entry> + <entry colname="3"> + <para> + SERVFAIL received. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>FORMERR</command></para> + </entry> + <entry colname="2"> + <para><command>RFErr</command></para> + </entry> + <entry colname="3"> + <para> + FORMERR received. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>OtherError</command></para> + </entry> + <entry colname="2"> + <para><command>RErr</command></para> + </entry> + <entry colname="3"> + <para> + Other errors received. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>EDNS0Fail</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + EDNS(0) query failures. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>Mismatch</command></para> + </entry> + <entry colname="2"> + <para><command>RDupR</command></para> + </entry> + <entry colname="3"> + <para> + Mismatch responses received. + When shown via an HTTP statistics channel, + this counter is shown in the + Name Server Statistics section for brevity. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>Truncated</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + Truncated responses received. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>Lame</command></para> + </entry> + <entry colname="2"> + <para><command>RLame</command></para> + </entry> + <entry colname="3"> + <para> + Lame delegations received. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>Retry</command></para> + </entry> + <entry colname="2"> + <para><command>SDupQ</command></para> + </entry> + <entry colname="3"> + <para> + Query retries performed. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>GlueFetchv4</command></para> + </entry> + <entry colname="2"> + <para><command>SSysQ</command></para> + </entry> + <entry colname="3"> + <para> + IPv4 NS address fetches invoked. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>GlueFetchv6</command></para> + </entry> + <entry colname="2"> + <para><command>SSysQ</command></para> + </entry> + <entry colname="3"> + <para> + IPv6 NS address fetches invoked. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>GlueFetchv4Fail</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + IPv4 NS address fetch failed. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>GlueFetchv6Fail</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + IPv6 NS address fetch failed. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>ValAttempt</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + DNSSEC validation attempted. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>ValOk</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + DNSSEC validation succeeded. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>ValNegOk</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + DNSSEC validation on negative information succeeded. + </para> + </entry> + </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>ValFail</command></para> + </entry> + <entry colname="2"> + <para><command></command></para> + </entry> + <entry colname="3"> + <para> + DNSSEC validation failed. + </para> + </entry> + </row> + + </tbody> + </tgroup> + </informaltable> + + </sect3> + + <sect3> + <title>Compatibility with <emphasis>BIND</emphasis> 8 Counters</title> + <para> + Most statistics counters that were available + in <command>BIND</command> 8 are also supported in + <command>BIND</command> 9 as shown in the above tables. + Here are notes about other counters that do not appear + in these tables. + </para> + + <variablelist> + <varlistentry> + <term><command>RFwdR,SFwdR</command></term> + <listitem> + <para> + These counters are not supported + because <command>BIND</command> 9 does not adopt + the notion of <emphasis>forwarding</emphasis> + as <command>BIND</command> 8 did. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term><command>RAXFR</command></term> + <listitem> + <para> + This counter is accessible in the Incoming Queries section. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term><command>RIQ</command></term> + <listitem> + <para> + This counter is accessible in the Incoming Requests section. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term><command>ROpts</command></term> + <listitem> + <para> + This counter is not supported + because <command>BIND</command> 9 does not care + about IP options in the first place. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term><command>SErr</command></term> + <listitem> + <para> + This counter could be implemented, but is not yet + supported. + </para> + </listitem> + </varlistentry> + + </variablelist> + </sect3> + </sect2> + </sect1> + </chapter> <chapter id="Bv9ARM.ch07"> <title><acronym>BIND</acronym> 9 Security Considerations</title> diff --git a/doc/arm/Bv9ARM.ch01.html b/doc/arm/Bv9ARM.ch01.html index a41798b5..cf83c2e8 100644 --- a/doc/arm/Bv9ARM.ch01.html +++ b/doc/arm/Bv9ARM.ch01.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> -<!-- $Id: Bv9ARM.ch01.html,v 1.38.18.1 2008/01/18 01:44:53 marka Exp $ --> +<!-- $Id: Bv9ARM.ch01.html,v 1.38.18.3 2008/04/09 23:37:47 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -45,17 +45,17 @@ <div class="toc"> <p><b>Table of Contents</b></p> <dl> -<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564109">Scope of Document</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564133">Organization of This Document</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2563474">Conventions Used in This Document</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564816">The Domain Name System (<acronym class="acronym">DNS</acronym>)</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2563405">Scope of Document</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564385">Organization of This Document</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564524">Conventions Used in This Document</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564637">The Domain Name System (<acronym class="acronym">DNS</acronym>)</a></span></dt> <dd><dl> -<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564837">DNS Fundamentals</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564871">Domains and Domain Names</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567208">Zones</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567285">Authoritative Name Servers</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567526">Caching Name Servers</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567588">Name Servers in Multiple Roles</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564659">DNS Fundamentals</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564693">Domains and Domain Names</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564845">Zones</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567243">Authoritative Name Servers</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567416">Caching Name Servers</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567546">Name Servers in Multiple Roles</a></span></dt> </dl></dd> </dl> </div> @@ -71,7 +71,7 @@ </p> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2564109"></a>Scope of Document</h2></div></div></div> +<a name="id2563405"></a>Scope of Document</h2></div></div></div> <p> The Berkeley Internet Name Domain (<acronym class="acronym">BIND</acronym>) implements a @@ -82,12 +82,12 @@ system administrators. </p> <p> - This version of the manual corresponds to BIND version 9.4. + This version of the manual corresponds to BIND version 9.5. </p> </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2564133"></a>Organization of This Document</h2></div></div></div> +<a name="id2564385"></a>Organization of This Document</h2></div></div></div> <p> In this document, <span class="emphasis"><em>Section 1</em></span> introduces the basic <acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym> concepts. <span class="emphasis"><em>Section 2</em></span> @@ -116,7 +116,7 @@ </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2563474"></a>Conventions Used in This Document</h2></div></div></div> +<a name="id2564524"></a>Conventions Used in This Document</h2></div></div></div> <p> In this document, we use the following general typographic conventions: @@ -243,7 +243,7 @@ </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2564816"></a>The Domain Name System (<acronym class="acronym">DNS</acronym>)</h2></div></div></div> +<a name="id2564637"></a>The Domain Name System (<acronym class="acronym">DNS</acronym>)</h2></div></div></div> <p> The purpose of this document is to explain the installation and upkeep of the <acronym class="acronym">BIND</acronym> (Berkeley Internet @@ -253,7 +253,7 @@ </p> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2564837"></a>DNS Fundamentals</h3></div></div></div> +<a name="id2564659"></a>DNS Fundamentals</h3></div></div></div> <p> The Domain Name System (DNS) is a hierarchical, distributed database. It stores information for mapping Internet host names to @@ -273,7 +273,7 @@ </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2564871"></a>Domains and Domain Names</h3></div></div></div> +<a name="id2564693"></a>Domains and Domain Names</h3></div></div></div> <p> The data stored in the DNS is identified by <span class="emphasis"><em>domain names</em></span> that are organized as a tree according to organizational or administrative boundaries. Each node of the tree, @@ -319,7 +319,7 @@ </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2567208"></a>Zones</h3></div></div></div> +<a name="id2564845"></a>Zones</h3></div></div></div> <p> To properly operate a name server, it is important to understand the difference between a <span class="emphasis"><em>zone</em></span> @@ -372,7 +372,7 @@ </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2567285"></a>Authoritative Name Servers</h3></div></div></div> +<a name="id2567243"></a>Authoritative Name Servers</h3></div></div></div> <p> Each zone is served by at least one <span class="emphasis"><em>authoritative name server</em></span>, @@ -389,7 +389,7 @@ </p> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2567308"></a>The Primary Master</h4></div></div></div> +<a name="id2567267"></a>The Primary Master</h4></div></div></div> <p> The authoritative server where the master copy of the zone data is maintained is called the @@ -409,7 +409,7 @@ </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2567338"></a>Slave Servers</h4></div></div></div> +<a name="id2567297"></a>Slave Servers</h4></div></div></div> <p> The other authoritative servers, the <span class="emphasis"><em>slave</em></span> servers (also known as <span class="emphasis"><em>secondary</em></span> servers) @@ -425,7 +425,7 @@ </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2567360"></a>Stealth Servers</h4></div></div></div> +<a name="id2567386"></a>Stealth Servers</h4></div></div></div> <p> Usually all of the zone's authoritative servers are listed in NS records in the parent zone. These NS records constitute @@ -460,7 +460,7 @@ </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2567526"></a>Caching Name Servers</h3></div></div></div> +<a name="id2567416"></a>Caching Name Servers</h3></div></div></div> <p> The resolver libraries provided by most operating systems are <span class="emphasis"><em>stub resolvers</em></span>, meaning that they are not @@ -487,7 +487,7 @@ </p> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2567561"></a>Forwarding</h4></div></div></div> +<a name="id2567520"></a>Forwarding</h4></div></div></div> <p> Even a caching name server does not necessarily perform the complete recursive lookup itself. Instead, it can @@ -514,7 +514,7 @@ </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2567588"></a>Name Servers in Multiple Roles</h3></div></div></div> +<a name="id2567546"></a>Name Servers in Multiple Roles</h3></div></div></div> <p> The <acronym class="acronym">BIND</acronym> name server can simultaneously act as diff --git a/doc/arm/Bv9ARM.ch02.html b/doc/arm/Bv9ARM.ch02.html index c8a87f31..0905f90d 100644 --- a/doc/arm/Bv9ARM.ch02.html +++ b/doc/arm/Bv9ARM.ch02.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> -<!-- $Id: Bv9ARM.ch02.html,v 1.35.18.1 2008/01/18 01:44:53 marka Exp $ --> +<!-- $Id: Bv9ARM.ch02.html,v 1.35.18.2 2008/03/15 01:41:35 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -45,16 +45,16 @@ <div class="toc"> <p><b>Table of Contents</b></p> <dl> -<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567622">Hardware requirements</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567649">CPU Requirements</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567661">Memory Requirements</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567688">Name Server Intensive Environment Issues</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567699">Supported Operating Systems</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567580">Hardware requirements</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567607">CPU Requirements</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567620">Memory Requirements</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567851">Name Server Intensive Environment Issues</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567862">Supported Operating Systems</a></span></dt> </dl> </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2567622"></a>Hardware requirements</h2></div></div></div> +<a name="id2567580"></a>Hardware requirements</h2></div></div></div> <p> <acronym class="acronym">DNS</acronym> hardware requirements have traditionally been quite modest. @@ -73,7 +73,7 @@ </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2567649"></a>CPU Requirements</h2></div></div></div> +<a name="id2567607"></a>CPU Requirements</h2></div></div></div> <p> CPU requirements for <acronym class="acronym">BIND</acronym> 9 range from i486-class machines @@ -84,7 +84,7 @@ </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2567661"></a>Memory Requirements</h2></div></div></div> +<a name="id2567620"></a>Memory Requirements</h2></div></div></div> <p> The memory of the server has to be large enough to fit the cache and zones loaded off disk. The <span><strong class="command">max-cache-size</strong></span> @@ -107,7 +107,7 @@ </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2567688"></a>Name Server Intensive Environment Issues</h2></div></div></div> +<a name="id2567851"></a>Name Server Intensive Environment Issues</h2></div></div></div> <p> For name server intensive environments, there are two alternative configurations that may be used. The first is where clients and @@ -124,7 +124,7 @@ </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2567699"></a>Supported Operating Systems</h2></div></div></div> +<a name="id2567862"></a>Supported Operating Systems</h2></div></div></div> <p> ISC <acronym class="acronym">BIND</acronym> 9 compiles and runs on a large number diff --git a/doc/arm/Bv9ARM.ch03.html b/doc/arm/Bv9ARM.ch03.html index 74c963b5..699f93d6 100644 --- a/doc/arm/Bv9ARM.ch03.html +++ b/doc/arm/Bv9ARM.ch03.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> -<!-- $Id: Bv9ARM.ch03.html,v 1.67.18.1 2008/01/18 01:44:53 marka Exp $ --> +<!-- $Id: Bv9ARM.ch03.html,v 1.67.18.2 2008/03/15 01:41:35 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -47,14 +47,14 @@ <dl> <dt><span class="sect1"><a href="Bv9ARM.ch03.html#sample_configuration">Sample Configurations</a></span></dt> <dd><dl> -<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2568004">A Caching-only Name Server</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2568020">An Authoritative-only Name Server</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567894">A Caching-only Name Server</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567910">An Authoritative-only Name Server</a></span></dt> </dl></dd> -<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568042">Load Balancing</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568465">Name Server Operations</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568001">Load Balancing</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568423">Name Server Operations</a></span></dt> <dd><dl> -<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2568470">Tools for Use With the Name Server Daemon</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2570184">Signals</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2568428">Tools for Use With the Name Server Daemon</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2570142">Signals</a></span></dt> </dl></dd> </dl> </div> @@ -68,7 +68,7 @@ <a name="sample_configuration"></a>Sample Configurations</h2></div></div></div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2568004"></a>A Caching-only Name Server</h3></div></div></div> +<a name="id2567894"></a>A Caching-only Name Server</h3></div></div></div> <p> 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" { </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2568020"></a>An Authoritative-only Name Server</h3></div></div></div> +<a name="id2567910"></a>An Authoritative-only Name Server</h3></div></div></div> <p> This sample configuration is for an authoritative-only server that is the master server for "<code class="filename">example.com</code>" @@ -137,7 +137,7 @@ zone "eng.example.com" { </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2568042"></a>Load Balancing</h2></div></div></div> +<a name="id2568001"></a>Load Balancing</h2></div></div></div> <p> A primitive form of load balancing can be achieved in the <acronym class="acronym">DNS</acronym> by using multiple records @@ -280,10 +280,10 @@ zone "eng.example.com" { </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2568465"></a>Name Server Operations</h2></div></div></div> +<a name="id2568423"></a>Name Server Operations</h2></div></div></div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2568470"></a>Tools for Use With the Name Server Daemon</h3></div></div></div> +<a name="id2568428"></a>Tools for Use With the Name Server Daemon</h3></div></div></div> <p> This section describes several indispensable diagnostic, administrative and monitoring tools available to the system @@ -739,7 +739,7 @@ controls { </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2570184"></a>Signals</h3></div></div></div> +<a name="id2570142"></a>Signals</h3></div></div></div> <p> 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 73c4c43e..a5d213ba 100644 --- a/doc/arm/Bv9ARM.ch04.html +++ b/doc/arm/Bv9ARM.ch04.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> -<!-- $Id: Bv9ARM.ch04.html,v 1.81.18.1 2008/01/18 01:44:53 marka Exp $ --> +<!-- $Id: Bv9ARM.ch04.html,v 1.81.18.2 2008/03/15 01:41:35 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -49,29 +49,29 @@ <dt><span class="sect1"><a href="Bv9ARM.ch04.html#dynamic_update">Dynamic Update</a></span></dt> <dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#journal">The journal file</a></span></dt></dl></dd> <dt><span class="sect1"><a href="Bv9ARM.ch04.html#incremental_zone_transfers">Incremental Zone Transfers (IXFR)</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2570658">Split DNS</a></span></dt> -<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2570676">Example split DNS setup</a></span></dt></dl></dd> +<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2570616">Split DNS</a></span></dt> +<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2570634">Example split DNS setup</a></span></dt></dl></dd> <dt><span class="sect1"><a href="Bv9ARM.ch04.html#tsig">TSIG</a></span></dt> <dd><dl> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571111">Generate Shared Keys for Each Pair of Hosts</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571185">Copying the Shared Secret to Both Machines</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571195">Informing the Servers of the Key's Existence</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571235">Instructing the Server to Use the Key</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571429">TSIG Key Based Access Control</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571474">Errors</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571069">Generate Shared Keys for Each Pair of Hosts</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571143">Copying the Shared Secret to Both Machines</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571154">Informing the Servers of the Key's Existence</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571193">Instructing the Server to Use the Key</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571319">TSIG Key Based Access Control</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571432">Errors</a></span></dt> </dl></dd> -<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571488">TKEY</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571673">SIG(0)</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571446">TKEY</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571563">SIG(0)</a></span></dt> <dt><span class="sect1"><a href="Bv9ARM.ch04.html#DNSSEC">DNSSEC</a></span></dt> <dd><dl> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571741">Generating Keys</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571811">Signing the Zone</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571890">Configuring Servers</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571700">Generating Keys</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571769">Signing the Zone</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571848">Configuring Servers</a></span></dt> </dl></dd> -<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2572033">IPv6 Support in <acronym class="acronym">BIND</acronym> 9</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571923">IPv6 Support in <acronym class="acronym">BIND</acronym> 9</a></span></dt> <dd><dl> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572231">Address Lookups Using AAAA Records</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572252">Address to Name Lookups Using Nibble Format</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572189">Address Lookups Using AAAA Records</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572211">Address to Name Lookups Using Nibble Format</a></span></dt> </dl></dd> </dl> </div> @@ -210,7 +210,7 @@ </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2570658"></a>Split DNS</h2></div></div></div> +<a name="id2570616"></a>Split DNS</h2></div></div></div> <p> Setting up different views, or visibility, of the DNS space to internal and external resolvers is usually referred to as a @@ -240,7 +240,7 @@ </p> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2570676"></a>Example split DNS setup</h3></div></div></div> +<a name="id2570634"></a>Example split DNS setup</h3></div></div></div> <p> Let's say a company named <span class="emphasis"><em>Example, Inc.</em></span> (<code class="literal">example.com</code>) @@ -486,7 +486,7 @@ nameserver 172.16.72.4 </p> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2571111"></a>Generate Shared Keys for Each Pair of Hosts</h3></div></div></div> +<a name="id2571069"></a>Generate Shared Keys for Each Pair of Hosts</h3></div></div></div> <p> A shared secret is generated to be shared between <span class="emphasis"><em>host1</em></span> and <span class="emphasis"><em>host2</em></span>. An arbitrary key name is chosen: "host1-host2.". The key name must @@ -494,7 +494,7 @@ nameserver 172.16.72.4 </p> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2571128"></a>Automatic Generation</h4></div></div></div> +<a name="id2571086"></a>Automatic Generation</h4></div></div></div> <p> The following command will generate a 128-bit (16 byte) HMAC-MD5 key as described above. Longer keys are better, but shorter keys @@ -519,7 +519,7 @@ nameserver 172.16.72.4 </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2571166"></a>Manual Generation</h4></div></div></div> +<a name="id2571125"></a>Manual Generation</h4></div></div></div> <p> 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 +534,7 @@ nameserver 172.16.72.4 </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2571185"></a>Copying the Shared Secret to Both Machines</h3></div></div></div> +<a name="id2571143"></a>Copying the Shared Secret to Both Machines</h3></div></div></div> <p> This is beyond the scope of DNS. A secure transport mechanism should be used. This could be secure FTP, ssh, telephone, etc. @@ -542,7 +542,7 @@ nameserver 172.16.72.4 </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2571195"></a>Informing the Servers of the Key's Existence</h3></div></div></div> +<a name="id2571154"></a>Informing the Servers of the Key's Existence</h3></div></div></div> <p> Imagine <span class="emphasis"><em>host1</em></span> and <span class="emphasis"><em>host 2</em></span> are @@ -571,7 +571,7 @@ key host1-host2. { </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2571235"></a>Instructing the Server to Use the Key</h3></div></div></div> +<a name="id2571193"></a>Instructing the Server to Use the Key</h3></div></div></div> <p> 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 <code class="filename">named.conf</code> file @@ -603,7 +603,7 @@ server 10.1.2.3 { </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2571429"></a>TSIG Key Based Access Control</h3></div></div></div> +<a name="id2571319"></a>TSIG Key Based Access Control</h3></div></div></div> <p> <acronym class="acronym">BIND</acronym> allows IP addresses and ranges to be specified in ACL @@ -631,7 +631,7 @@ allow-update { key host1-host2. ;}; </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2571474"></a>Errors</h3></div></div></div> +<a name="id2571432"></a>Errors</h3></div></div></div> <p> The processing of TSIG signed messages can result in several errors. If a signed message is sent to a non-TSIG aware @@ -657,7 +657,7 @@ allow-update { key host1-host2. ;}; </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2571488"></a>TKEY</h2></div></div></div> +<a name="id2571446"></a>TKEY</h2></div></div></div> <p><span><strong class="command">TKEY</strong></span> is a mechanism for automatically generating a shared secret between two hosts. There are several "modes" of @@ -693,7 +693,7 @@ allow-update { key host1-host2. ;}; </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2571673"></a>SIG(0)</h2></div></div></div> +<a name="id2571563"></a>SIG(0)</h2></div></div></div> <p> <acronym class="acronym">BIND</acronym> 9 partially supports DNSSEC SIG(0) transaction signatures as specified in RFC 2535 and RFC2931. @@ -754,7 +754,7 @@ allow-update { key host1-host2. ;}; </p> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2571741"></a>Generating Keys</h3></div></div></div> +<a name="id2571700"></a>Generating Keys</h3></div></div></div> <p> The <span><strong class="command">dnssec-keygen</strong></span> program is used to generate keys. @@ -805,7 +805,7 @@ allow-update { key host1-host2. ;}; </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2571811"></a>Signing the Zone</h3></div></div></div> +<a name="id2571769"></a>Signing the Zone</h3></div></div></div> <p> The <span><strong class="command">dnssec-signzone</strong></span> program is used to @@ -849,7 +849,7 @@ allow-update { key host1-host2. ;}; </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2571890"></a>Configuring Servers</h3></div></div></div> +<a name="id2571848"></a>Configuring Servers</h3></div></div></div> <p> To enable <span><strong class="command">named</strong></span> to respond appropriately to DNS requests from DNSSEC aware clients, @@ -937,7 +937,7 @@ options { </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2572033"></a>IPv6 Support in <acronym class="acronym">BIND</acronym> 9</h2></div></div></div> +<a name="id2571923"></a>IPv6 Support in <acronym class="acronym">BIND</acronym> 9</h2></div></div></div> <p> <acronym class="acronym">BIND</acronym> 9 fully supports all currently defined forms of IPv6 @@ -976,7 +976,7 @@ options { </p> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2572231"></a>Address Lookups Using AAAA Records</h3></div></div></div> +<a name="id2572189"></a>Address Lookups Using AAAA Records</h3></div></div></div> <p> The IPv6 AAAA record is a parallel to the IPv4 A record, and, unlike the deprecated A6 record, specifies the entire @@ -995,7 +995,7 @@ host 3600 IN AAAA 2001:db8::1 </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2572252"></a>Address to Name Lookups Using Nibble Format</h3></div></div></div> +<a name="id2572211"></a>Address to Name Lookups Using Nibble Format</h3></div></div></div> <p> 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 49890d3c..42a64ec0 100644 --- a/doc/arm/Bv9ARM.ch05.html +++ b/doc/arm/Bv9ARM.ch05.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> -<!-- $Id: Bv9ARM.ch05.html,v 1.66.18.1 2008/01/18 01:44:53 marka Exp $ --> +<!-- $Id: Bv9ARM.ch05.html,v 1.66.18.2 2008/03/15 01:41:35 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -45,13 +45,13 @@ <div class="toc"> <p><b>Table of Contents</b></p> <dl> -<dt><span class="sect1"><a href="Bv9ARM.ch05.html#id2572285">The Lightweight Resolver Library</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch05.html#id2572244">The Lightweight Resolver Library</a></span></dt> <dt><span class="sect1"><a href="Bv9ARM.ch05.html#lwresd">Running a Resolver Daemon</a></span></dt> </dl> </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2572285"></a>The Lightweight Resolver Library</h2></div></div></div> +<a name="id2572244"></a>The Lightweight Resolver Library</h2></div></div></div> <p> 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 ca3e742e..a7f0d1ee 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. --> -<!-- $Id: Bv9ARM.ch06.html,v 1.168.18.4 2008/01/18 09:37:04 marka Exp $ --> +<!-- $Id: Bv9ARM.ch06.html,v 1.168.18.10 2008/05/06 01:41:46 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -48,57 +48,59 @@ <dt><span class="sect1"><a href="Bv9ARM.ch06.html#configuration_file_elements">Configuration File Elements</a></span></dt> <dd><dl> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#address_match_lists">Address Match Lists</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2573587">Comment Syntax</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2573477">Comment Syntax</a></span></dt> </dl></dd> <dt><span class="sect1"><a href="Bv9ARM.ch06.html#Configuration_File_Grammar">Configuration File Grammar</a></span></dt> <dd><dl> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574157"><span><strong class="command">acl</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574116"><span><strong class="command">acl</strong></span> Statement Grammar</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#acl"><span><strong class="command">acl</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574347"><span><strong class="command">controls</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574306"><span><strong class="command">controls</strong></span> Statement Grammar</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#controls_statement_definition_and_usage"><span><strong class="command">controls</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574776"><span><strong class="command">include</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574793"><span><strong class="command">include</strong></span> Statement Definition and +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574734"><span><strong class="command">include</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574752"><span><strong class="command">include</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574817"><span><strong class="command">key</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574840"><span><strong class="command">key</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574999"><span><strong class="command">logging</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575193"><span><strong class="command">logging</strong></span> Statement Definition and +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574775"><span><strong class="command">key</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574798"><span><strong class="command">key</strong></span> Statement Definition and Usage</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575026"><span><strong class="command">logging</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575152"><span><strong class="command">logging</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576505"><span><strong class="command">lwres</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576579"><span><strong class="command">lwres</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576643"><span><strong class="command">masters</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576686"><span><strong class="command">masters</strong></span> Statement Definition and +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576464"><span><strong class="command">lwres</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576537"><span><strong class="command">lwres</strong></span> Statement Definition and Usage</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576601"><span><strong class="command">masters</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576645"><span><strong class="command">masters</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576701"><span><strong class="command">options</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576660"><span><strong class="command">options</strong></span> Statement Grammar</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#options"><span><strong class="command">options</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2585163"><span><strong class="command">statistics-channels</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2585181"><span><strong class="command">statistics-channels</strong></span> Statement Definition and +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#statschannels"><span><strong class="command">statistics-channels</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2584781"><span><strong class="command">statistics-channels</strong></span> Statement Definition and Usage</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#server_statement_grammar"><span><strong class="command">server</strong></span> Statement Grammar</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#server_statement_definition_and_usage"><span><strong class="command">server</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2585865"><span><strong class="command">trusted-keys</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2585916"><span><strong class="command">trusted-keys</strong></span> Statement Definition +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2585533"><span><strong class="command">trusted-keys</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2585585"><span><strong class="command">trusted-keys</strong></span> Statement Definition and Usage</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#view_statement_grammar"><span><strong class="command">view</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2585998"><span><strong class="command">view</strong></span> Statement Definition and Usage</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2585667"><span><strong class="command">view</strong></span> Statement Definition and Usage</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#zone_statement_grammar"><span><strong class="command">zone</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2587559"><span><strong class="command">zone</strong></span> Statement Definition and Usage</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2587159"><span><strong class="command">zone</strong></span> Statement Definition and Usage</a></span></dt> </dl></dd> -<dt><span class="sect1"><a href="Bv9ARM.ch06.html#id2589906">Zone File</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch06.html#id2589437">Zone File</a></span></dt> <dd><dl> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#types_of_resource_records_and_when_to_use_them">Types of Resource Records and When to Use Them</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2591927">Discussion of MX Records</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2591459">Discussion of MX Records</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#Setting_TTLs">Setting TTLs</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2592547">Inverse Mapping in IPv4</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2592674">Other Zone File Directives</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2592862"><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2592147">Inverse Mapping in IPv4</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2592342">Other Zone File Directives</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2592599"><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#zonefile_format">Additional File Formats</a></span></dt> </dl></dd> +<dt><span class="sect1"><a href="Bv9ARM.ch06.html#id2593067">BIND9 Statistics</a></span></dt> +<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2593348">Statistics Counters</a></span></dt></dl></dd> </dl> </div> <p> @@ -432,7 +434,7 @@ <a name="address_match_lists"></a>Address Match Lists</h3></div></div></div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2573365"></a>Syntax</h4></div></div></div> +<a name="id2573323"></a>Syntax</h4></div></div></div> <pre class="programlisting"><code class="varname">address_match_list</code> = address_match_list_element ; [<span class="optional"> address_match_list_element; ... </span>] <code class="varname">address_match_list_element</code> = [<span class="optional"> ! </span>] (ip_address [<span class="optional">/length</span>] | @@ -441,7 +443,7 @@ </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2573393"></a>Definition and Usage</h4></div></div></div> +<a name="id2573351"></a>Definition and Usage</h4></div></div></div> <p> Address match lists are primarily used to determine access control for various server operations. They are also used in @@ -525,7 +527,7 @@ </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2573587"></a>Comment Syntax</h3></div></div></div> +<a name="id2573477"></a>Comment Syntax</h3></div></div></div> <p> The <acronym class="acronym">BIND</acronym> 9 comment syntax allows for comments to appear @@ -535,7 +537,7 @@ </p> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2573602"></a>Syntax</h4></div></div></div> +<a name="id2573492"></a>Syntax</h4></div></div></div> <p> </p> <pre class="programlisting">/* This is a <acronym class="acronym">BIND</acronym> comment as in C */</pre> @@ -550,7 +552,7 @@ </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2573632"></a>Definition and Usage</h4></div></div></div> +<a name="id2573590"></a>Definition and Usage</h4></div></div></div> <p> Comments may appear anywhere that whitespace may appear in a <acronym class="acronym">BIND</acronym> configuration file. @@ -795,7 +797,7 @@ </p> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2574157"></a><span><strong class="command">acl</strong></span> Statement Grammar</h3></div></div></div> +<a name="id2574116"></a><span><strong class="command">acl</strong></span> Statement Grammar</h3></div></div></div> <pre class="programlisting"><span><strong class="command">acl</strong></span> acl-name { address_match_list }; @@ -877,7 +879,7 @@ </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2574347"></a><span><strong class="command">controls</strong></span> Statement Grammar</h3></div></div></div> +<a name="id2574306"></a><span><strong class="command">controls</strong></span> Statement Grammar</h3></div></div></div> <pre class="programlisting"><span><strong class="command">controls</strong></span> { [ inet ( ip_addr | * ) [ port ip_port ] allow { <em class="replaceable"><code> address_match_list </code></em> } keys { <em class="replaceable"><code>key_list</code></em> }; ] @@ -999,12 +1001,12 @@ </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2574776"></a><span><strong class="command">include</strong></span> Statement Grammar</h3></div></div></div> +<a name="id2574734"></a><span><strong class="command">include</strong></span> Statement Grammar</h3></div></div></div> <pre class="programlisting"><span><strong class="command">include</strong></span> <em class="replaceable"><code>filename</code></em>;</pre> </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2574793"></a><span><strong class="command">include</strong></span> Statement Definition and +<a name="id2574752"></a><span><strong class="command">include</strong></span> Statement Definition and Usage</h3></div></div></div> <p> The <span><strong class="command">include</strong></span> statement inserts the @@ -1019,7 +1021,7 @@ </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2574817"></a><span><strong class="command">key</strong></span> Statement Grammar</h3></div></div></div> +<a name="id2574775"></a><span><strong class="command">key</strong></span> Statement Grammar</h3></div></div></div> <pre class="programlisting"><span><strong class="command">key</strong></span> <em class="replaceable"><code>key_id</code></em> { algorithm <em class="replaceable"><code>string</code></em>; secret <em class="replaceable"><code>string</code></em>; @@ -1028,7 +1030,7 @@ </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2574840"></a><span><strong class="command">key</strong></span> Statement Definition and Usage</h3></div></div></div> +<a name="id2574798"></a><span><strong class="command">key</strong></span> Statement Definition and Usage</h3></div></div></div> <p> The <span><strong class="command">key</strong></span> statement defines a shared secret key for use with TSIG (see <a href="Bv9ARM.ch04.html#tsig" title="TSIG">the section called “TSIG”</a>) @@ -1075,7 +1077,7 @@ </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2574999"></a><span><strong class="command">logging</strong></span> Statement Grammar</h3></div></div></div> +<a name="id2575026"></a><span><strong class="command">logging</strong></span> Statement Grammar</h3></div></div></div> <pre class="programlisting"><span><strong class="command">logging</strong></span> { [ <span><strong class="command">channel</strong></span> <em class="replaceable"><code>channel_name</code></em> { ( <span><strong class="command">file</strong></span> <em class="replaceable"><code>path name</code></em> @@ -1099,7 +1101,7 @@ </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2575193"></a><span><strong class="command">logging</strong></span> Statement Definition and +<a name="id2575152"></a><span><strong class="command">logging</strong></span> Statement Definition and Usage</h3></div></div></div> <p> The <span><strong class="command">logging</strong></span> statement configures a @@ -1133,7 +1135,7 @@ </p> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2575245"></a>The <span><strong class="command">channel</strong></span> Phrase</h4></div></div></div> +<a name="id2575204"></a>The <span><strong class="command">channel</strong></span> Phrase</h4></div></div></div> <p> All log output goes to one or more <span class="emphasis"><em>channels</em></span>; you can make as many of them as you want. @@ -1689,7 +1691,7 @@ category notify { null; }; </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2576505"></a><span><strong class="command">lwres</strong></span> Statement Grammar</h3></div></div></div> +<a name="id2576464"></a><span><strong class="command">lwres</strong></span> Statement Grammar</h3></div></div></div> <p> This is the grammar of the <span><strong class="command">lwres</strong></span> statement in the <code class="filename">named.conf</code> file: @@ -1704,7 +1706,7 @@ category notify { null; }; </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2576579"></a><span><strong class="command">lwres</strong></span> Statement Definition and Usage</h3></div></div></div> +<a name="id2576537"></a><span><strong class="command">lwres</strong></span> Statement Definition and Usage</h3></div></div></div> <p> The <span><strong class="command">lwres</strong></span> statement configures the name @@ -1755,14 +1757,14 @@ category notify { null; }; </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2576643"></a><span><strong class="command">masters</strong></span> Statement Grammar</h3></div></div></div> +<a name="id2576601"></a><span><strong class="command">masters</strong></span> Statement Grammar</h3></div></div></div> <pre class="programlisting"> <span><strong class="command">masters</strong></span> <em class="replaceable"><code>name</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] { ( <em class="replaceable"><code>masters_list</code></em> | <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] [<span class="optional">key <em class="replaceable"><code>key</code></em></span>] ) ; [<span class="optional">...</span>] }; </pre> </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2576686"></a><span><strong class="command">masters</strong></span> Statement Definition and +<a name="id2576645"></a><span><strong class="command">masters</strong></span> Statement Definition and Usage</h3></div></div></div> <p><span><strong class="command">masters</strong></span> lists allow for a common set of masters to be easily used by @@ -1771,7 +1773,7 @@ category notify { null; }; </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2576701"></a><span><strong class="command">options</strong></span> Statement Grammar</h3></div></div></div> +<a name="id2576660"></a><span><strong class="command">options</strong></span> Statement Grammar</h3></div></div></div> <p> This is the grammar of the <span><strong class="command">options</strong></span> statement in the <code class="filename">named.conf</code> file: @@ -2886,7 +2888,7 @@ options { </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2580914"></a>Forwarding</h4></div></div></div> +<a name="id2580872"></a>Forwarding</h4></div></div></div> <p> The forwarding facility can be used to create a large site-wide cache on a few servers, reducing traffic over links to external @@ -2930,7 +2932,7 @@ options { </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2580972"></a>Dual-stack Servers</h4></div></div></div> +<a name="id2580931"></a>Dual-stack Servers</h4></div></div></div> <p> Dual-stack servers are used as servers of last resort to work around @@ -3126,7 +3128,7 @@ options { </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2581537"></a>Interfaces</h4></div></div></div> +<a name="id2581495"></a>Interfaces</h4></div></div></div> <p> The interfaces and ports that the server will answer queries from may be specified using the <span><strong class="command">listen-on</strong></span> option. <span><strong class="command">listen-on</strong></span> takes @@ -3510,7 +3512,7 @@ query-source-v6 address * port *; </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2582571"></a>Bad UDP Port Lists</h4></div></div></div> +<a name="id2582530"></a>Bad UDP Port Lists</h4></div></div></div> <p><span><strong class="command">avoid-v4-udp-ports</strong></span> and <span><strong class="command">avoid-v6-udp-ports</strong></span> specify a list of IPv4 and IPv6 UDP ports that will not be used as system @@ -3524,7 +3526,7 @@ query-source-v6 address * port *; </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2582586"></a>Operating System Resource Limits</h4></div></div></div> +<a name="id2582545"></a>Operating System Resource Limits</h4></div></div></div> <p> The server's usage of many system resources can be limited. Scaled values are allowed when specifying resource limits. For @@ -3583,7 +3585,7 @@ query-source-v6 address * port *; </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2582770"></a>Server Resource Limits</h4></div></div></div> +<a name="id2582660"></a>Server Resource Limits</h4></div></div></div> <p> The following options set limits on the server's resource consumption that are enforced internally by the @@ -3659,15 +3661,18 @@ query-source-v6 address * port *; </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2582903"></a>Periodic Task Intervals</h4></div></div></div> +<a name="id2582861"></a>Periodic Task Intervals</h4></div></div></div> <div class="variablelist"><dl> <dt><span class="term"><span><strong class="command">cleaning-interval</strong></span></span></dt> <dd><p> - The server will remove expired resource records + This interval is effectively obsolete. Previously, + the server would remove expired resource records from the cache every <span><strong class="command">cleaning-interval</strong></span> minutes. - The default is 60 minutes. The maximum value is 28 days - (40320 minutes). - If set to 0, no periodic cleaning will occur. + <acronym class="acronym">BIND</acronym> 9 now manages cache + memory in a more sophisticated manner and does not + rely on the periodic cleaning any more. + Specifying this option therefore has no effect on + the server's behavior. </p></dd> <dt><span class="term"><span><strong class="command">heartbeat-interval</strong></span></span></dt> <dd><p> @@ -3924,8 +3929,13 @@ query-source-v6 address * port *; </td> <td> <p> - Records are returned in a round-robin - order. + Records are returned in a cyclic round-robin order. + </p> + <p> + If <acronym class="acronym">BIND</acronym> is configured with the + "--enable-fixed-rrset" option at compile time, then + the initial ordering of the RRset will match the + one specified in the zone file. </p> </td> </tr> @@ -3953,9 +3963,11 @@ query-source-v6 address * port *; <div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"> <h3 class="title">Note</h3> <p> - The <span><strong class="command">rrset-order</strong></span> statement - is not yet fully implemented in <acronym class="acronym">BIND</acronym> 9. - BIND 9 currently does not fully support "fixed" ordering. + In this release of <acronym class="acronym">BIND</acronym> 9, the + <span><strong class="command">rrset-order</strong></span> statement does not support + "fixed" ordering by default. Fixed ordering can be enabled + at compile time by specifying "--enable-fixed-rrset" on + the "configure" command line. </p> </div> </div> @@ -4178,9 +4190,10 @@ query-source-v6 address * port *; </p></dd> <dt><span class="term"><span><strong class="command">server-id</strong></span></span></dt> <dd><p> - The ID of the server should report via a query of - the name <code class="filename">ID.SERVER</code> - with type <span><strong class="command">TXT</strong></span>, class <span><strong class="command">CHAOS</strong></span>. + The ID the server should report when receiving a Name + Server Identifier (NSID) query, or a query of the name + <code class="filename">ID.SERVER</code> with type + <span><strong class="command">TXT</strong></span>, class <span><strong class="command">CHAOS</strong></span>. The primary purpose of such queries is to identify which of a group of anycast servers is actually answering your queries. Specifying <span><strong class="command">server-id none;</strong></span> @@ -4300,159 +4313,6 @@ query-source-v6 address * port *; </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="statsfile"></a>The Statistics File</h4></div></div></div> -<p> - The statistics file generated by <acronym class="acronym">BIND</acronym> 9 - is similar, but not identical, to that - generated by <acronym class="acronym">BIND</acronym> 8. - </p> -<p> - The statistics dump begins with a line, like: - </p> -<p> - <span><strong class="command">+++ Statistics Dump +++ (973798949)</strong></span> - </p> -<p> - The number in parentheses is a standard - Unix-style timestamp, measured as seconds since January 1, 1970. - Following - that line are a series of lines containing a counter type, the - value of the - counter, optionally a zone name, and optionally a view name. - The lines without view and zone listed are global statistics for - the entire server. - Lines with a zone and view name for the given view and zone (the - view name is - omitted for the default view). - </p> -<p> - The statistics dump ends with the line where the - number is identical to the number in the beginning line; for example: - </p> -<p> - <span><strong class="command">--- Statistics Dump --- (973798949)</strong></span> - </p> -<p> - The following statistics counters are maintained: - </p> -<div class="informaltable"><table border="1"> -<colgroup> -<col> -<col> -</colgroup> -<tbody> -<tr> -<td> - <p><span><strong class="command">success</strong></span></p> - </td> -<td> - <p> - The number of - successful queries made to the server or zone. A - successful query - is defined as query which returns a NOERROR response - with at least - one answer RR. - </p> - </td> -</tr> -<tr> -<td> - <p><span><strong class="command">referral</strong></span></p> - </td> -<td> - <p> - The number of queries which resulted - in referral responses. - </p> - </td> -</tr> -<tr> -<td> - <p><span><strong class="command">nxrrset</strong></span></p> - </td> -<td> - <p> - The number of queries which resulted in - NOERROR responses with no data. - </p> - </td> -</tr> -<tr> -<td> - <p><span><strong class="command">nxdomain</strong></span></p> - </td> -<td> - <p> - The number - of queries which resulted in NXDOMAIN responses. - </p> - </td> -</tr> -<tr> -<td> - <p><span><strong class="command">failure</strong></span></p> - </td> -<td> - <p> - The number of queries which resulted in a - failure response other than those above. - </p> - </td> -</tr> -<tr> -<td> - <p><span><strong class="command">recursion</strong></span></p> - </td> -<td> - <p> - The number of queries which caused the server - to perform recursion in order to find the final answer. - </p> - </td> -</tr> -<tr> -<td> - <p><span><strong class="command">duplicate</strong></span></p> - </td> -<td> - <p> - The number of queries which the server attempted to - recurse but discover a existing query with the same - IP address, port, query id, name, type and class - already being processed. - </p> - </td> -</tr> -<tr> -<td> - <p><span><strong class="command">dropped</strong></span></p> - </td> -<td> - <p> - The number of queries for which the server - discovered a excessive number of existing - recursive queries for the same name, type and - class and were subsequently dropped. - </p> - </td> -</tr> -</tbody> -</table></div> -<p> - Each query received by the server will cause exactly one of - <span><strong class="command">success</strong></span>, - <span><strong class="command">referral</strong></span>, - <span><strong class="command">nxrrset</strong></span>, - <span><strong class="command">nxdomain</strong></span>, or - <span><strong class="command">failure</strong></span> - to be incremented, and may additionally cause the - <span><strong class="command">recursion</strong></span> counter to be - incremented. - </p> -</div> -<div class="sect3" lang="en"> -<div class="titlepage"><div><div><h4 class="title"> <a name="acache"></a>Additional Section Caching</h4></div></div></div> <p> The additional section cache, also called <span><strong class="command">acache</strong></span>, @@ -4545,7 +4405,7 @@ query-source-v6 address * port *; </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2585163"></a><span><strong class="command">statistics-channels</strong></span> Statement Grammar</h3></div></div></div> +<a name="statschannels"></a><span><strong class="command">statistics-channels</strong></span> Statement Grammar</h3></div></div></div> <pre class="programlisting"><span><strong class="command">statistics-channels</strong></span> { [ inet ( ip_addr | * ) [ port ip_port ] [allow { <em class="replaceable"><code> address_match_list </code></em> } ]; ] [ inet ...; ] @@ -4554,7 +4414,7 @@ query-source-v6 address * port *; </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2585181"></a><span><strong class="command">statistics-channels</strong></span> Statement Definition and +<a name="id2584781"></a><span><strong class="command">statistics-channels</strong></span> Statement Definition and Usage</h3></div></div></div> <p> The <span><strong class="command">statistics-channels</strong></span> statement @@ -4799,7 +4659,7 @@ query-source-v6 address * port *; </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2585865"></a><span><strong class="command">trusted-keys</strong></span> Statement Grammar</h3></div></div></div> +<a name="id2585533"></a><span><strong class="command">trusted-keys</strong></span> Statement Grammar</h3></div></div></div> <pre class="programlisting"><span><strong class="command">trusted-keys</strong></span> { <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>string</code></em> ; [<span class="optional"> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>string</code></em> ; [<span class="optional">...</span>]</span>] @@ -4808,7 +4668,7 @@ query-source-v6 address * port *; </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2585916"></a><span><strong class="command">trusted-keys</strong></span> Statement Definition +<a name="id2585585"></a><span><strong class="command">trusted-keys</strong></span> Statement Definition and Usage</h3></div></div></div> <p> The <span><strong class="command">trusted-keys</strong></span> statement defines @@ -4851,7 +4711,7 @@ query-source-v6 address * port *; </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2585998"></a><span><strong class="command">view</strong></span> Statement Definition and Usage</h3></div></div></div> +<a name="id2585667"></a><span><strong class="command">view</strong></span> Statement Definition and Usage</h3></div></div></div> <p> The <span><strong class="command">view</strong></span> statement is a powerful feature @@ -5110,10 +4970,10 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional" </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2587559"></a><span><strong class="command">zone</strong></span> Statement Definition and Usage</h3></div></div></div> +<a name="id2587159"></a><span><strong class="command">zone</strong></span> Statement Definition and Usage</h3></div></div></div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2587566"></a>Zone Types</h4></div></div></div> +<a name="id2587166"></a>Zone Types</h4></div></div></div> <div class="informaltable"><table border="1"> <colgroup> <col> @@ -5322,7 +5182,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional" </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2588054"></a>Class</h4></div></div></div> +<a name="id2587722"></a>Class</h4></div></div></div> <p> The zone's name may optionally be followed by a class. If a class is not specified, class <code class="literal">IN</code> (for <code class="varname">Internet</code>), @@ -5344,7 +5204,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional" </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2588087"></a>Zone Options</h4></div></div></div> +<a name="id2587755"></a>Zone Options</h4></div></div></div> <div class="variablelist"><dl> <dt><span class="term"><span><strong class="command">allow-notify</strong></span></span></dt> <dd><p> @@ -5845,7 +5705,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional" </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2589906"></a>Zone File</h2></div></div></div> +<a name="id2589437"></a>Zone File</h2></div></div></div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> <a name="types_of_resource_records_and_when_to_use_them"></a>Types of Resource Records and When to Use Them</h3></div></div></div> @@ -5858,7 +5718,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional" </p> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2589924"></a>Resource Records</h4></div></div></div> +<a name="id2589456"></a>Resource Records</h4></div></div></div> <p> A domain name identifies a node. Each node has a set of resource information, which may be empty. The set of resource @@ -6509,7 +6369,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional" </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2591270"></a>Textual expression of RRs</h4></div></div></div> +<a name="id2590870"></a>Textual expression of RRs</h4></div></div></div> <p> RRs are represented in binary form in the packets of the DNS protocol, and are usually represented in highly encoded form @@ -6712,7 +6572,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional" </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2591927"></a>Discussion of MX Records</h3></div></div></div> +<a name="id2591459"></a>Discussion of MX Records</h3></div></div></div> <p> As described above, domain servers store information as a series of resource records, each of which contains a particular @@ -6970,7 +6830,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional" </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2592547"></a>Inverse Mapping in IPv4</h3></div></div></div> +<a name="id2592147"></a>Inverse Mapping in IPv4</h3></div></div></div> <p> Reverse name resolution (that is, translation from IP address to name) is achieved by means of the <span class="emphasis"><em>in-addr.arpa</em></span> domain @@ -7031,7 +6891,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional" </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2592674"></a>Other Zone File Directives</h3></div></div></div> +<a name="id2592342"></a>Other Zone File Directives</h3></div></div></div> <p> The Master File Format was initially defined in RFC 1035 and has subsequently been extended. While the Master File Format @@ -7046,7 +6906,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional" </p> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2592696"></a>The <span><strong class="command">$ORIGIN</strong></span> Directive</h4></div></div></div> +<a name="id2592433"></a>The <span><strong class="command">$ORIGIN</strong></span> Directive</h4></div></div></div> <p> Syntax: <span><strong class="command">$ORIGIN</strong></span> <em class="replaceable"><code>domain-name</code></em> @@ -7074,7 +6934,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM. </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2592757"></a>The <span><strong class="command">$INCLUDE</strong></span> Directive</h4></div></div></div> +<a name="id2592493"></a>The <span><strong class="command">$INCLUDE</strong></span> Directive</h4></div></div></div> <p> Syntax: <span><strong class="command">$INCLUDE</strong></span> <em class="replaceable"><code>filename</code></em> @@ -7110,7 +6970,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM. </div> <div class="sect3" lang="en"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2592826"></a>The <span><strong class="command">$TTL</strong></span> Directive</h4></div></div></div> +<a name="id2592563"></a>The <span><strong class="command">$TTL</strong></span> Directive</h4></div></div></div> <p> Syntax: <span><strong class="command">$TTL</strong></span> <em class="replaceable"><code>default-ttl</code></em> @@ -7129,7 +6989,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM. </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2592862"></a><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</h3></div></div></div> +<a name="id2592599"></a><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</h3></div></div></div> <p> Syntax: <span><strong class="command">$GENERATE</strong></span> <em class="replaceable"><code>range</code></em> @@ -7154,7 +7014,7 @@ $GENERATE 1-127 $ CNAME $.0</pre> <p> is equivalent to </p> -<pre class="programlisting">0.0.0.192.IN-ADDR.ARPA NS SERVER1.EXAMPLE. +<pre class="programlisting">0.0.0.192.IN-ADDR.ARPA. NS SERVER1.EXAMPLE. 0.0.0.192.IN-ADDR.ARPA. NS SERVER2.EXAMPLE. 1.0.0.192.IN-ADDR.ARPA. CNAME 1.0.0.0.192.IN-ADDR.ARPA. 2.0.0.192.IN-ADDR.ARPA. CNAME 2.0.0.0.192.IN-ADDR.ARPA. @@ -7332,6 +7192,1224 @@ $GENERATE 1-127 $ CNAME $.0</pre> </p> </div> </div> +<div class="sect1" lang="en"> +<div class="titlepage"><div><div><h2 class="title" style="clear: both"> +<a name="id2593067"></a>BIND9 Statistics</h2></div></div></div> +<p> + <acronym class="acronym">BIND</acronym> 9 maintains lots of statistics + information and provides several interfaces for users to + get access to the statistics. + The available statistics include all statistics counters + that were available in <acronym class="acronym">BIND</acronym> 8 and + are meaningful in <acronym class="acronym">BIND</acronym> 9, + and other information that is considered useful. + </p> +<p> + The statistics information is categorized into the following + sections. + </p> +<div class="informaltable"><table border="1"> +<colgroup> +<col> +<col> +</colgroup> +<tbody> +<tr> +<td> + <p>Incoming Requests</p> + </td> +<td> + <p> + The number of incoming DNS requests for each OPCODE. + </p> + </td> +</tr> +<tr> +<td> + <p>Incoming Queries</p> + </td> +<td> + <p> + The number of incoming queries for each RR type. + </p> + </td> +</tr> +<tr> +<td> + <p>Outgoing Queries</p> + </td> +<td> + <p> + The number of outgoing queries for each RR + type sent from the internal resolver. + Maintained per view. + </p> + </td> +</tr> +<tr> +<td> + <p>Name Server Statistics</p> + </td> +<td> + <p> + Statistics counters about incoming request processing. + </p> + </td> +</tr> +<tr> +<td> + <p>Zone Maintenance Statistics</p> + </td> +<td> + <p> + Statistics counters regarding zone maintenance + operations such as zone transfers. + </p> + </td> +</tr> +<tr> +<td> + <p>Resolver Statistics</p> + </td> +<td> + <p> + Statistics counters about name resolution + performed in the internal resolver. + Maintained per view. + </p> + </td> +</tr> +<tr> +<td> + <p>Cache DB RRsets</p> + </td> +<td> + <p> + The number of RRsets per RR type (positive + or negative) and nonexistent names stored in the + cache database. + Maintained per view. + </p> + </td> +</tr> +</tbody> +</table></div> +<p> + A subset of Name Server Statistics is collected and shown + per zone for which the server has the authority when + <span><strong class="command">zone-statistics</strong></span> is set to + <strong class="userinput"><code>yes</code></strong>. + These statistics counters are shown with their zone and view + names. + In some cases the view names are omitted for the default view. + </p> +<p> + There are currently two user interfaces to get access to the + statistics. + One is in the plain text format dumped to the file specified + by the <span><strong class="command">statistics-file</strong></span> configuration option. + The other is remotely accessible via a statistics channel + when the <span><strong class="command">statistics-channels</strong></span> statement + is specified in the configuration file + (see <a href="Bv9ARM.ch06.html#statschannels" title="statistics-channels Statement Grammar">the section called “<span><strong class="command">statistics-channels</strong></span> Statement Grammar”</a>.) + </p> +<div class="sect3" lang="en"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="statsfile"></a>The Statistics File</h4></div></div></div> +<p> + The text format statistics dump begins with a line, like: + </p> +<p> + <span><strong class="command">+++ Statistics Dump +++ (973798949)</strong></span> + </p> +<p> + The number in parentheses is a standard + Unix-style timestamp, measured as seconds since January 1, 1970. + + Following + that line is a set of statistics information, which is categorized + as described above. + Each section begins with a line, like: + </p> +<p> + <span><strong class="command">++ Name Server Statistics ++</strong></span> + </p> +<p> + Each section consists of lines, each containing the statistics + counter value followed by its textual description. + See below for available counters. + For brevity, counters that have a value of 0 are not shown + in the statistics file. + </p> +<p> + The statistics dump ends with the line where the + number is identical to the number in the beginning line; for example: + </p> +<p> + <span><strong class="command">--- Statistics Dump --- (973798949)</strong></span> + </p> +</div> +<div class="sect2" lang="en"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="id2593348"></a>Statistics Counters</h3></div></div></div> +<p> + The following tables summarize statistics counters that + <acronym class="acronym">BIND</acronym> 9 provides. + For each row of the tables, the leftmost column is the + abbreviated symbol name of that counter. + These symbols are shown in the statistics information + accessed via an HTTP statistics channel. + The rightmost column gives the description of the counter, + which is also shown in the statistics file + (but, in this document, possibly with slight modification + for better readability). + Additional notes may also be provided in this column. + When a middle column exists between these two columns, + it gives the corresponding counter name of the + <acronym class="acronym">BIND</acronym> 8 statistics, if applicable. + </p> +<div class="sect3" lang="en"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="id2593364"></a>Name Server Statistics Counters</h4></div></div></div> +<div class="informaltable"><table border="1"> +<colgroup> +<col> +<col> +<col> +</colgroup> +<tbody> +<tr> +<td> + <p> + <span class="emphasis"><em>Symbol</em></span> + </p> + </td> +<td> + <p> + <span class="emphasis"><em>BIND8 Symbol</em></span> + </p> + </td> +<td> + <p> + <span class="emphasis"><em>Description</em></span> + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">Requestv4</strong></span></p> + </td> +<td> + <p><span><strong class="command">RQ</strong></span></p> + </td> +<td> + <p> + IPv4 requests received. + Note: this also counts non query requests. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">Requestv6</strong></span></p> + </td> +<td> + <p><span><strong class="command">RQ</strong></span></p> + </td> +<td> + <p> + IPv6 requests received. + Note: this also counts non query requests. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">ReqEdns0</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Requests with EDNS(0) received. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">ReqBadEDNSVer</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Requests with unsupported EDNS version received. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">ReqTSIG</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Requests with TSIG received. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">ReqSIG0</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Requests with SIG(0) received. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">ReqBadSIG</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Requests with invalid (TSIG or SIG(0)) signature. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">ReqTCP</strong></span></p> + </td> +<td> + <p><span><strong class="command">RTCP</strong></span></p> + </td> +<td> + <p> + TCP requests received. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">AuthQryRej</strong></span></p> + </td> +<td> + <p><span><strong class="command">RUQ</strong></span></p> + </td> +<td> + <p> + Authoritative (non recursive) queries rejected. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">RecQryRej</strong></span></p> + </td> +<td> + <p><span><strong class="command">RURQ</strong></span></p> + </td> +<td> + <p> + Recursive queries rejected. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">XfrRej</strong></span></p> + </td> +<td> + <p><span><strong class="command">RUXFR</strong></span></p> + </td> +<td> + <p> + Zone transfer requests rejected. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">UpdateRej</strong></span></p> + </td> +<td> + <p><span><strong class="command">RUUpd</strong></span></p> + </td> +<td> + <p> + Dynamic update requests rejected. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">Response</strong></span></p> + </td> +<td> + <p><span><strong class="command">SAns</strong></span></p> + </td> +<td> + <p> + Responses sent. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">RespTruncated</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Truncated responses sent. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">RespEDNS0</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Responses with EDNS(0) sent. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">RespTSIG</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Responses with TSIG sent. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">RespSIG0</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Responses with SIG(0) sent. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">QrySuccess</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Queries resulted in a successful answer. + This means the query which returns a NOERROR response + with at least one answer RR. + This corresponds to the + <span><strong class="command">success</strong></span> counter + of previous versions of + <acronym class="acronym">BIND</acronym> 9. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">QryAuthAns</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Queries resulted in authoritative answer. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">QryNoauthAns</strong></span></p> + </td> +<td> + <p><span><strong class="command">SNaAns</strong></span></p> + </td> +<td> + <p> + Queries resulted in non authoritative answer. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">QryReferral</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Queries resulted in referral answer. + This corresponds to the + <span><strong class="command">referral</strong></span> counter + of previous versions of + <acronym class="acronym">BIND</acronym> 9. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">QryNxrrset</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Queries resulted in NOERROR responses with no data. + This corresponds to the + <span><strong class="command">nxrrset</strong></span> counter + of previous versions of + <acronym class="acronym">BIND</acronym> 9. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">QrySERVFAIL</strong></span></p> + </td> +<td> + <p><span><strong class="command">SFail</strong></span></p> + </td> +<td> + <p> + Queries resulted in SERVFAIL. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">QryFORMERR</strong></span></p> + </td> +<td> + <p><span><strong class="command">SFErr</strong></span></p> + </td> +<td> + <p> + Queries resulted in FORMERR. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">QryNXDOMAIN</strong></span></p> + </td> +<td> + <p><span><strong class="command">SNXD</strong></span></p> + </td> +<td> + <p> + Queries resulted in NXDOMAIN. + This corresponds to the + <span><strong class="command">nxdomain</strong></span> counter + of previous versions of + <acronym class="acronym">BIND</acronym> 9. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">QryRecursion</strong></span></p> + </td> +<td> + <p><span><strong class="command">RFwdQ</strong></span></p> + </td> +<td> + <p> + Queries which caused the server + to perform recursion in order to find the final answer. + This corresponds to the + <span><strong class="command">recursion</strong></span> counter + of previous versions of + <acronym class="acronym">BIND</acronym> 9. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">QryDuplicate</strong></span></p> + </td> +<td> + <p><span><strong class="command">RDupQ</strong></span></p> + </td> +<td> + <p> + Queries which the server attempted to + recurse but discovered an existing query with the same + IP address, port, query ID, name, type and class + already being processed. + This corresponds to the + <span><strong class="command">duplicate</strong></span> counter + of previous versions of + <acronym class="acronym">BIND</acronym> 9. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">QryDropped</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Queries for which the server + discovered an excessive number of existing + recursive queries for the same name, type and + class and were subsequently dropped. + This corresponds to the + <span><strong class="command">dropped</strong></span> counter + of previous versions of + <acronym class="acronym">BIND</acronym> 9. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">QryFailure</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Other query failures. + This corresponds to the + <span><strong class="command">failure</strong></span> counter + of previous versions of + <acronym class="acronym">BIND</acronym> 9. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">XfrReqDone</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Requested zone transfers completed. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">UpdateReqFwd</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Update requests forwarded. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">UpdateRespFwd</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Update responses forwarded. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">UpdateFwdFail</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Dynamic update forward failed. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">UpdateDone</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Dynamic updates completed. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">UpdateFail</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Dynamic updates failed. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">UpdateBadPrereq</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Dynamic updates rejected due to prerequisite failure. + </p> + </td> +</tr> +</tbody> +</table></div> +</div> +<div class="sect3" lang="en"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="id2594955"></a>Zone Maintenance Statistics Counters</h4></div></div></div> +<div class="informaltable"><table border="1"> +<colgroup> +<col> +<col> +</colgroup> +<tbody> +<tr> +<td> + <p> + <span class="emphasis"><em>Symbol</em></span> + </p> + </td> +<td> + <p> + <span class="emphasis"><em>Description</em></span> + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">NotifyOutv4</strong></span></p> + </td> +<td> + <p> + IPv4 notifies sent. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">NotifyOutv6</strong></span></p> + </td> +<td> + <p> + IPv6 notifies sent. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">NotifyInv4</strong></span></p> + </td> +<td> + <p> + IPv4 notifies received. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">NotifyInv6</strong></span></p> + </td> +<td> + <p> + IPv6 notifies received. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">NotifyRej</strong></span></p> + </td> +<td> + <p> + Incoming notifies rejected. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">SOAOutv4</strong></span></p> + </td> +<td> + <p> + IPv4 SOA queries sent. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">SOAOutv6</strong></span></p> + </td> +<td> + <p> + IPv6 SOA queries sent. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">AXFRReqv4</strong></span></p> + </td> +<td> + <p> + IPv4 AXFR requested. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">AXFRReqv6</strong></span></p> + </td> +<td> + <p> + IPv6 AXFR requested. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">IXFRReqv4</strong></span></p> + </td> +<td> + <p> + IPv4 IXFR requested. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">IXFRReqv6</strong></span></p> + </td> +<td> + <p> + IPv6 IXFR requested. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">XfrSuccess</strong></span></p> + </td> +<td> + <p> + Zone transfer requests succeeded. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">XfrFail</strong></span></p> + </td> +<td> + <p> + Zone transfer requests failed. + </p> + </td> +</tr> +</tbody> +</table></div> +</div> +<div class="sect3" lang="en"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="id2595338"></a>Resolver Statistics Counters</h4></div></div></div> +<div class="informaltable"><table border="1"> +<colgroup> +<col> +<col> +<col> +</colgroup> +<tbody> +<tr> +<td> + <p> + <span class="emphasis"><em>Symbol</em></span> + </p> + </td> +<td> + <p> + <span class="emphasis"><em>BIND8 Symbol</em></span> + </p> + </td> +<td> + <p> + <span class="emphasis"><em>Description</em></span> + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">Queryv4</strong></span></p> + </td> +<td> + <p><span><strong class="command">SFwdQ</strong></span></p> + </td> +<td> + <p> + IPv4 queries sent. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">Queryv6</strong></span></p> + </td> +<td> + <p><span><strong class="command">SFwdQ</strong></span></p> + </td> +<td> + <p> + IPv6 queries sent. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">Responsev4</strong></span></p> + </td> +<td> + <p><span><strong class="command">RR</strong></span></p> + </td> +<td> + <p> + IPv4 responses received. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">Responsev6</strong></span></p> + </td> +<td> + <p><span><strong class="command">RR</strong></span></p> + </td> +<td> + <p> + IPv6 responses received. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">NXDOMAIN</strong></span></p> + </td> +<td> + <p><span><strong class="command">RNXD</strong></span></p> + </td> +<td> + <p> + NXDOMAIN received. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">SERVFAIL</strong></span></p> + </td> +<td> + <p><span><strong class="command">RFail</strong></span></p> + </td> +<td> + <p> + SERVFAIL received. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">FORMERR</strong></span></p> + </td> +<td> + <p><span><strong class="command">RFErr</strong></span></p> + </td> +<td> + <p> + FORMERR received. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">OtherError</strong></span></p> + </td> +<td> + <p><span><strong class="command">RErr</strong></span></p> + </td> +<td> + <p> + Other errors received. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">EDNS0Fail</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + EDNS(0) query failures. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">Mismatch</strong></span></p> + </td> +<td> + <p><span><strong class="command">RDupR</strong></span></p> + </td> +<td> + <p> + Mismatch responses received. + When shown via an HTTP statistics channel, + this counter is shown in the + Name Server Statistics section for brevity. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">Truncated</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + Truncated responses received. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">Lame</strong></span></p> + </td> +<td> + <p><span><strong class="command">RLame</strong></span></p> + </td> +<td> + <p> + Lame delegations received. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">Retry</strong></span></p> + </td> +<td> + <p><span><strong class="command">SDupQ</strong></span></p> + </td> +<td> + <p> + Query retries performed. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">GlueFetchv4</strong></span></p> + </td> +<td> + <p><span><strong class="command">SSysQ</strong></span></p> + </td> +<td> + <p> + IPv4 NS address fetches invoked. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">GlueFetchv6</strong></span></p> + </td> +<td> + <p><span><strong class="command">SSysQ</strong></span></p> + </td> +<td> + <p> + IPv6 NS address fetches invoked. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">GlueFetchv4Fail</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + IPv4 NS address fetch failed. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">GlueFetchv6Fail</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + IPv6 NS address fetch failed. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">ValAttempt</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + DNSSEC validation attempted. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">ValOk</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + DNSSEC validation succeeded. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">ValNegOk</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + DNSSEC validation on negative information succeeded. + </p> + </td> +</tr> +<tr> +<td> + <p><span><strong class="command">ValFail</strong></span></p> + </td> +<td> + <p><span><strong class="command"></strong></span></p> + </td> +<td> + <p> + DNSSEC validation failed. + </p> + </td> +</tr> +</tbody> +</table></div> +</div> +<div class="sect3" lang="en"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="id2596328"></a>Compatibility with <span class="emphasis"><em>BIND</em></span> 8 Counters</h4></div></div></div> +<p> + Most statistics counters that were available + in <span><strong class="command">BIND</strong></span> 8 are also supported in + <span><strong class="command">BIND</strong></span> 9 as shown in the above tables. + Here are notes about other counters that do not appear + in these tables. + </p> +<div class="variablelist"><dl> +<dt><span class="term"><span><strong class="command">RFwdR,SFwdR</strong></span></span></dt> +<dd><p> + These counters are not supported + because <span><strong class="command">BIND</strong></span> 9 does not adopt + the notion of <span class="emphasis"><em>forwarding</em></span> + as <span><strong class="command">BIND</strong></span> 8 did. + </p></dd> +<dt><span class="term"><span><strong class="command">RAXFR</strong></span></span></dt> +<dd><p> + This counter is accessible in the Incoming Queries section. + </p></dd> +<dt><span class="term"><span><strong class="command">RIQ</strong></span></span></dt> +<dd><p> + This counter is accessible in the Incoming Requests section. + </p></dd> +<dt><span class="term"><span><strong class="command">ROpts</strong></span></span></dt> +<dd><p> + This counter is not supported + because <span><strong class="command">BIND</strong></span> 9 does not care + about IP options in the first place. + </p></dd> +<dt><span class="term"><span><strong class="command">SErr</strong></span></span></dt> +<dd><p> + This counter could be implemented, but is not yet + supported. + </p></dd> +</dl></div> +</div> +</div> +</div> </div> <div class="navfooter"> <hr> diff --git a/doc/arm/Bv9ARM.ch07.html b/doc/arm/Bv9ARM.ch07.html index ceb1193e..1e27757a 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. --> -<!-- $Id: Bv9ARM.ch07.html,v 1.152.18.4 2008/01/18 09:37:04 marka Exp $ --> +<!-- $Id: Bv9ARM.ch07.html,v 1.152.18.9 2008/05/06 01:41:46 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -46,10 +46,10 @@ <p><b>Table of Contents</b></p> <dl> <dt><span class="sect1"><a href="Bv9ARM.ch07.html#Access_Control_Lists">Access Control Lists</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch07.html#id2593546"><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span></a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch07.html#id2596516"><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span></a></span></dt> <dd><dl> -<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2593691">The <span><strong class="command">chroot</strong></span> Environment</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2593751">Using the <span><strong class="command">setuid</strong></span> Function</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2596593">The <span><strong class="command">chroot</strong></span> Environment</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2596652">Using the <span><strong class="command">setuid</strong></span> Function</a></span></dt> </dl></dd> <dt><span class="sect1"><a href="Bv9ARM.ch07.html#dynamic_update_security">Dynamic Update Security</a></span></dt> </dl> @@ -119,7 +119,7 @@ zone "example.com" { </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2593546"></a><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span> +<a name="id2596516"></a><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span> </h2></div></div></div> <p> On UNIX servers, it is possible to run <acronym class="acronym">BIND</acronym> in a <span class="emphasis"><em>chrooted</em></span> environment @@ -143,7 +143,7 @@ zone "example.com" { </p> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2593691"></a>The <span><strong class="command">chroot</strong></span> Environment</h3></div></div></div> +<a name="id2596593"></a>The <span><strong class="command">chroot</strong></span> Environment</h3></div></div></div> <p> In order for a <span><strong class="command">chroot</strong></span> environment to @@ -171,7 +171,7 @@ zone "example.com" { </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2593751"></a>Using the <span><strong class="command">setuid</strong></span> Function</h3></div></div></div> +<a name="id2596652"></a>Using the <span><strong class="command">setuid</strong></span> Function</h3></div></div></div> <p> Prior to running the <span><strong class="command">named</strong></span> daemon, use diff --git a/doc/arm/Bv9ARM.ch08.html b/doc/arm/Bv9ARM.ch08.html index 806f82df..5fd71b22 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. --> -<!-- $Id: Bv9ARM.ch08.html,v 1.153.18.4 2008/01/18 09:37:04 marka Exp $ --> +<!-- $Id: Bv9ARM.ch08.html,v 1.153.18.9 2008/05/06 01:41:47 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -45,18 +45,18 @@ <div class="toc"> <p><b>Table of Contents</b></p> <dl> -<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2593831">Common Problems</a></span></dt> -<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch08.html#id2593836">It's not working; how can I figure out what's wrong?</a></span></dt></dl></dd> -<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2593848">Incrementing and Changing the Serial Number</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2593865">Where Can I Get Help?</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2596732">Common Problems</a></span></dt> +<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch08.html#id2596738">It's not working; how can I figure out what's wrong?</a></span></dt></dl></dd> +<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2596749">Incrementing and Changing the Serial Number</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2596766">Where Can I Get Help?</a></span></dt> </dl> </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2593831"></a>Common Problems</h2></div></div></div> +<a name="id2596732"></a>Common Problems</h2></div></div></div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2593836"></a>It's not working; how can I figure out what's wrong?</h3></div></div></div> +<a name="id2596738"></a>It's not working; how can I figure out what's wrong?</h3></div></div></div> <p> The best solution to solving installation and configuration issues is to take preventative measures by setting @@ -68,7 +68,7 @@ </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2593848"></a>Incrementing and Changing the Serial Number</h2></div></div></div> +<a name="id2596749"></a>Incrementing and Changing the Serial Number</h2></div></div></div> <p> 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 @@ </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2593865"></a>Where Can I Get Help?</h2></div></div></div> +<a name="id2596766"></a>Where Can I Get Help?</h2></div></div></div> <p> The Internet Systems Consortium (<acronym class="acronym">ISC</acronym>) offers a wide range diff --git a/doc/arm/Bv9ARM.ch09.html b/doc/arm/Bv9ARM.ch09.html index 4cbc5746..721127f8 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. --> -<!-- $Id: Bv9ARM.ch09.html,v 1.154.18.4 2008/01/18 09:37:04 marka Exp $ --> +<!-- $Id: Bv9ARM.ch09.html,v 1.154.18.9 2008/05/06 01:41:47 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -45,21 +45,21 @@ <div class="toc"> <p><b>Table of Contents</b></p> <dl> -<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2593927">Acknowledgments</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2596828">Acknowledgments</a></span></dt> <dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch09.html#historical_dns_information">A Brief History of the <acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym></a></span></dt></dl></dd> -<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2594099">General <acronym class="acronym">DNS</acronym> Reference Information</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2597137">General <acronym class="acronym">DNS</acronym> Reference Information</a></span></dt> <dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch09.html#ipv6addresses">IPv6 addresses (AAAA)</a></span></dt></dl></dd> <dt><span class="sect1"><a href="Bv9ARM.ch09.html#bibliography">Bibliography (and Suggested Reading)</a></span></dt> <dd><dl> <dt><span class="sect2"><a href="Bv9ARM.ch09.html#rfcs">Request for Comments (RFCs)</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch09.html#internet_drafts">Internet Drafts</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2597447">Other Documents About <acronym class="acronym">BIND</acronym></a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2600348">Other Documents About <acronym class="acronym">BIND</acronym></a></span></dt> </dl></dd> </dl> </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2593927"></a>Acknowledgments</h2></div></div></div> +<a name="id2596828"></a>Acknowledgments</h2></div></div></div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> <a name="historical_dns_information"></a>A Brief History of the <acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym> @@ -164,7 +164,7 @@ </div> <div class="sect1" lang="en"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id2594099"></a>General <acronym class="acronym">DNS</acronym> Reference Information</h2></div></div></div> +<a name="id2597137"></a>General <acronym class="acronym">DNS</acronym> Reference Information</h2></div></div></div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> <a name="ipv6addresses"></a>IPv6 addresses (AAAA)</h3></div></div></div> @@ -252,17 +252,17 @@ </p> <div class="bibliography"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2594286"></a>Bibliography</h4></div></div></div> +<a name="id2597324"></a>Bibliography</h4></div></div></div> <div class="bibliodiv"> <h3 class="title">Standards</h3> <div class="biblioentry"> -<a name="id2594297"></a><p>[<abbr class="abbrev">RFC974</abbr>] <span class="author"><span class="firstname">C.</span> <span class="surname">Partridge</span>. </span><span class="title"><i>Mail Routing and the Domain System</i>. </span><span class="pubdate">January 1986. </span></p> +<a name="id2597335"></a><p>[<abbr class="abbrev">RFC974</abbr>] <span class="author"><span class="firstname">C.</span> <span class="surname">Partridge</span>. </span><span class="title"><i>Mail Routing and the Domain System</i>. </span><span class="pubdate">January 1986. </span></p> </div> <div class="biblioentry"> -<a name="id2594321"></a><p>[<abbr class="abbrev">RFC1034</abbr>] <span class="author"><span class="firstname">P.V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>Domain Names — Concepts and Facilities</i>. </span><span class="pubdate">November 1987. </span></p> +<a name="id2597427"></a><p>[<abbr class="abbrev">RFC1034</abbr>] <span class="author"><span class="firstname">P.V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>Domain Names — Concepts and Facilities</i>. </span><span class="pubdate">November 1987. </span></p> </div> <div class="biblioentry"> -<a name="id2594412"></a><p>[<abbr class="abbrev">RFC1035</abbr>] <span class="author"><span class="firstname">P. V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>Domain Names — Implementation and +<a name="id2597450"></a><p>[<abbr class="abbrev">RFC1035</abbr>] <span class="author"><span class="firstname">P. V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>Domain Names — Implementation and Specification</i>. </span><span class="pubdate">November 1987. </span></p> </div> </div> @@ -270,42 +270,42 @@ <h3 class="title"> <a name="proposed_standards"></a>Proposed Standards</h3> <div class="biblioentry"> -<a name="id2594449"></a><p>[<abbr class="abbrev">RFC2181</abbr>] <span class="author"><span class="firstname">R., R. Bush</span> <span class="surname">Elz</span>. </span><span class="title"><i>Clarifications to the <acronym class="acronym">DNS</acronym> +<a name="id2597486"></a><p>[<abbr class="abbrev">RFC2181</abbr>] <span class="author"><span class="firstname">R., R. Bush</span> <span class="surname">Elz</span>. </span><span class="title"><i>Clarifications to the <acronym class="acronym">DNS</acronym> Specification</i>. </span><span class="pubdate">July 1997. </span></p> </div> <div class="biblioentry"> -<a name="id2594475"></a><p>[<abbr class="abbrev">RFC2308</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Andrews</span>. </span><span class="title"><i>Negative Caching of <acronym class="acronym">DNS</acronym> +<a name="id2597513"></a><p>[<abbr class="abbrev">RFC2308</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Andrews</span>. </span><span class="title"><i>Negative Caching of <acronym class="acronym">DNS</acronym> Queries</i>. </span><span class="pubdate">March 1998. </span></p> </div> <div class="biblioentry"> -<a name="id2594501"></a><p>[<abbr class="abbrev">RFC1995</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Ohta</span>. </span><span class="title"><i>Incremental Zone Transfer in <acronym class="acronym">DNS</acronym></i>. </span><span class="pubdate">August 1996. </span></p> +<a name="id2597539"></a><p>[<abbr class="abbrev">RFC1995</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Ohta</span>. </span><span class="title"><i>Incremental Zone Transfer in <acronym class="acronym">DNS</acronym></i>. </span><span class="pubdate">August 1996. </span></p> </div> <div class="biblioentry"> -<a name="id2594525"></a><p>[<abbr class="abbrev">RFC1996</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>A Mechanism for Prompt Notification of Zone Changes</i>. </span><span class="pubdate">August 1996. </span></p> +<a name="id2597563"></a><p>[<abbr class="abbrev">RFC1996</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>A Mechanism for Prompt Notification of Zone Changes</i>. </span><span class="pubdate">August 1996. </span></p> </div> <div class="biblioentry"> -<a name="id2594549"></a><p>[<abbr class="abbrev">RFC2136</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">S.</span> <span class="surname">Thomson</span>, <span class="firstname">Y.</span> <span class="surname">Rekhter</span>, and <span class="firstname">J.</span> <span class="surname">Bound</span>. </span><span class="title"><i>Dynamic Updates in the Domain Name System</i>. </span><span class="pubdate">April 1997. </span></p> +<a name="id2597587"></a><p>[<abbr class="abbrev">RFC2136</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">S.</span> <span class="surname">Thomson</span>, <span class="firstname">Y.</span> <span class="surname">Rekhter</span>, and <span class="firstname">J.</span> <span class="surname">Bound</span>. </span><span class="title"><i>Dynamic Updates in the Domain Name System</i>. </span><span class="pubdate">April 1997. </span></p> </div> <div class="biblioentry"> -<a name="id2594604"></a><p>[<abbr class="abbrev">RFC2671</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Extension Mechanisms for DNS (EDNS0)</i>. </span><span class="pubdate">August 1997. </span></p> +<a name="id2597642"></a><p>[<abbr class="abbrev">RFC2671</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Extension Mechanisms for DNS (EDNS0)</i>. </span><span class="pubdate">August 1997. </span></p> </div> <div class="biblioentry"> -<a name="id2594631"></a><p>[<abbr class="abbrev">RFC2672</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span>. </span><span class="title"><i>Non-Terminal DNS Name Redirection</i>. </span><span class="pubdate">August 1999. </span></p> +<a name="id2597669"></a><p>[<abbr class="abbrev">RFC2672</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span>. </span><span class="title"><i>Non-Terminal DNS Name Redirection</i>. </span><span class="pubdate">August 1999. </span></p> </div> <div class="biblioentry"> -<a name="id2594658"></a><p>[<abbr class="abbrev">RFC2845</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>, <span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>, and <span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Secret Key Transaction Authentication for <acronym class="acronym">DNS</acronym> (TSIG)</i>. </span><span class="pubdate">May 2000. </span></p> +<a name="id2597696"></a><p>[<abbr class="abbrev">RFC2845</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>, <span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>, and <span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Secret Key Transaction Authentication for <acronym class="acronym">DNS</acronym> (TSIG)</i>. </span><span class="pubdate">May 2000. </span></p> </div> <div class="biblioentry"> -<a name="id2594788"></a><p>[<abbr class="abbrev">RFC2930</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Secret Key Establishment for DNS (TKEY RR)</i>. </span><span class="pubdate">September 2000. </span></p> +<a name="id2597757"></a><p>[<abbr class="abbrev">RFC2930</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Secret Key Establishment for DNS (TKEY RR)</i>. </span><span class="pubdate">September 2000. </span></p> </div> <div class="biblioentry"> -<a name="id2594818"></a><p>[<abbr class="abbrev">RFC2931</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>DNS Request and Transaction Signatures (SIG(0)s)</i>. </span><span class="pubdate">September 2000. </span></p> +<a name="id2597787"></a><p>[<abbr class="abbrev">RFC2931</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>DNS Request and Transaction Signatures (SIG(0)s)</i>. </span><span class="pubdate">September 2000. </span></p> </div> <div class="biblioentry"> -<a name="id2594848"></a><p>[<abbr class="abbrev">RFC3007</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Secure Domain Name System (DNS) Dynamic Update</i>. </span><span class="pubdate">November 2000. </span></p> +<a name="id2597817"></a><p>[<abbr class="abbrev">RFC3007</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Secure Domain Name System (DNS) Dynamic Update</i>. </span><span class="pubdate">November 2000. </span></p> </div> <div class="biblioentry"> -<a name="id2594874"></a><p>[<abbr class="abbrev">RFC3645</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Kwan</span>, <span class="firstname">P.</span> <span class="surname">Garg</span>, <span class="firstname">J.</span> <span class="surname">Gilroy</span>, <span class="firstname">L.</span> <span class="surname">Esibov</span>, <span class="firstname">J.</span> <span class="surname">Westhead</span>, and <span class="firstname">R.</span> <span class="surname">Hall</span>. </span><span class="title"><i>Generic Security Service Algorithm for Secret +<a name="id2597844"></a><p>[<abbr class="abbrev">RFC3645</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Kwan</span>, <span class="firstname">P.</span> <span class="surname">Garg</span>, <span class="firstname">J.</span> <span class="surname">Gilroy</span>, <span class="firstname">L.</span> <span class="surname">Esibov</span>, <span class="firstname">J.</span> <span class="surname">Westhead</span>, and <span class="firstname">R.</span> <span class="surname">Hall</span>. </span><span class="title"><i>Generic Security Service Algorithm for Secret Key Transaction Authentication for DNS (GSS-TSIG)</i>. </span><span class="pubdate">October 2003. </span></p> </div> @@ -314,19 +314,19 @@ <h3 class="title"> <acronym class="acronym">DNS</acronym> Security Proposed Standards</h3> <div class="biblioentry"> -<a name="id2594956"></a><p>[<abbr class="abbrev">RFC3225</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Conrad</span>. </span><span class="title"><i>Indicating Resolver Support of DNSSEC</i>. </span><span class="pubdate">December 2001. </span></p> +<a name="id2597926"></a><p>[<abbr class="abbrev">RFC3225</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Conrad</span>. </span><span class="title"><i>Indicating Resolver Support of DNSSEC</i>. </span><span class="pubdate">December 2001. </span></p> </div> <div class="biblioentry"> -<a name="id2594983"></a><p>[<abbr class="abbrev">RFC3833</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Atkins</span> and <span class="firstname">R.</span> <span class="surname">Austein</span>. </span><span class="title"><i>Threat Analysis of the Domain Name System (DNS)</i>. </span><span class="pubdate">August 2004. </span></p> +<a name="id2597953"></a><p>[<abbr class="abbrev">RFC3833</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Atkins</span> and <span class="firstname">R.</span> <span class="surname">Austein</span>. </span><span class="title"><i>Threat Analysis of the Domain Name System (DNS)</i>. </span><span class="pubdate">August 2004. </span></p> </div> <div class="biblioentry"> -<a name="id2595019"></a><p>[<abbr class="abbrev">RFC4033</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>DNS Security Introduction and Requirements</i>. </span><span class="pubdate">March 2005. </span></p> +<a name="id2597989"></a><p>[<abbr class="abbrev">RFC4033</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>DNS Security Introduction and Requirements</i>. </span><span class="pubdate">March 2005. </span></p> </div> <div class="biblioentry"> -<a name="id2595084"></a><p>[<abbr class="abbrev">RFC4044</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Resource Records for the DNS Security Extensions</i>. </span><span class="pubdate">March 2005. </span></p> +<a name="id2598054"></a><p>[<abbr class="abbrev">RFC4044</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Resource Records for the DNS Security Extensions</i>. </span><span class="pubdate">March 2005. </span></p> </div> <div class="biblioentry"> -<a name="id2595149"></a><p>[<abbr class="abbrev">RFC4035</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Protocol Modifications for the DNS +<a name="id2598119"></a><p>[<abbr class="abbrev">RFC4035</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Protocol Modifications for the DNS Security Extensions</i>. </span><span class="pubdate">March 2005. </span></p> </div> </div> @@ -334,146 +334,146 @@ <h3 class="title">Other Important RFCs About <acronym class="acronym">DNS</acronym> Implementation</h3> <div class="biblioentry"> -<a name="id2595223"></a><p>[<abbr class="abbrev">RFC1535</abbr>] <span class="author"><span class="firstname">E.</span> <span class="surname">Gavron</span>. </span><span class="title"><i>A Security Problem and Proposed Correction With Widely +<a name="id2598193"></a><p>[<abbr class="abbrev">RFC1535</abbr>] <span class="author"><span class="firstname">E.</span> <span class="surname">Gavron</span>. </span><span class="title"><i>A Security Problem and Proposed Correction With Widely Deployed <acronym class="acronym">DNS</acronym> Software.</i>. </span><span class="pubdate">October 1993. </span></p> </div> <div class="biblioentry"> -<a name="id2595249"></a><p>[<abbr class="abbrev">RFC1536</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Kumar</span>, <span class="firstname">J.</span> <span class="surname">Postel</span>, <span class="firstname">C.</span> <span class="surname">Neuman</span>, <span class="firstname">P.</span> <span class="surname">Danzig</span>, and <span class="firstname">S.</span> <span class="surname">Miller</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Implementation +<a name="id2598218"></a><p>[<abbr class="abbrev">RFC1536</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Kumar</span>, <span class="firstname">J.</span> <span class="surname">Postel</span>, <span class="firstname">C.</span> <span class="surname">Neuman</span>, <span class="firstname">P.</span> <span class="surname">Danzig</span>, and <span class="firstname">S.</span> <span class="surname">Miller</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Implementation Errors and Suggested Fixes</i>. </span><span class="pubdate">October 1993. </span></p> </div> <div class="biblioentry"> -<a name="id2595317"></a><p>[<abbr class="abbrev">RFC1982</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Elz</span> and <span class="firstname">R.</span> <span class="surname">Bush</span>. </span><span class="title"><i>Serial Number Arithmetic</i>. </span><span class="pubdate">August 1996. </span></p> +<a name="id2598286"></a><p>[<abbr class="abbrev">RFC1982</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Elz</span> and <span class="firstname">R.</span> <span class="surname">Bush</span>. </span><span class="title"><i>Serial Number Arithmetic</i>. </span><span class="pubdate">August 1996. </span></p> </div> <div class="biblioentry"> -<a name="id2595352"></a><p>[<abbr class="abbrev">RFC4074</abbr>] <span class="authorgroup"><span class="firstname">Y.</span> <span class="surname">Morishita</span> and <span class="firstname">T.</span> <span class="surname">Jinmei</span>. </span><span class="title"><i>Common Misbehaviour Against <acronym class="acronym">DNS</acronym> +<a name="id2598322"></a><p>[<abbr class="abbrev">RFC4074</abbr>] <span class="authorgroup"><span class="firstname">Y.</span> <span class="surname">Morishita</span> and <span class="firstname">T.</span> <span class="surname">Jinmei</span>. </span><span class="title"><i>Common Misbehaviour Against <acronym class="acronym">DNS</acronym> Queries for IPv6 Addresses</i>. </span><span class="pubdate">May 2005. </span></p> </div> </div> <div class="bibliodiv"> <h3 class="title">Resource Record Types</h3> <div class="biblioentry"> -<a name="id2595398"></a><p>[<abbr class="abbrev">RFC1183</abbr>] <span class="authorgroup"><span class="firstname">C.F.</span> <span class="surname">Everhart</span>, <span class="firstname">L. A.</span> <span class="surname">Mamakos</span>, <span class="firstname">R.</span> <span class="surname">Ullmann</span>, and <span class="firstname">P.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>New <acronym class="acronym">DNS</acronym> RR Definitions</i>. </span><span class="pubdate">October 1990. </span></p> +<a name="id2598368"></a><p>[<abbr class="abbrev">RFC1183</abbr>] <span class="authorgroup"><span class="firstname">C.F.</span> <span class="surname">Everhart</span>, <span class="firstname">L. A.</span> <span class="surname">Mamakos</span>, <span class="firstname">R.</span> <span class="surname">Ullmann</span>, and <span class="firstname">P.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>New <acronym class="acronym">DNS</acronym> RR Definitions</i>. </span><span class="pubdate">October 1990. </span></p> </div> <div class="biblioentry"> -<a name="id2595456"></a><p>[<abbr class="abbrev">RFC1706</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Manning</span> and <span class="firstname">R.</span> <span class="surname">Colella</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> NSAP Resource Records</i>. </span><span class="pubdate">October 1994. </span></p> +<a name="id2598425"></a><p>[<abbr class="abbrev">RFC1706</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Manning</span> and <span class="firstname">R.</span> <span class="surname">Colella</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> NSAP Resource Records</i>. </span><span class="pubdate">October 1994. </span></p> </div> <div class="biblioentry"> -<a name="id2595493"></a><p>[<abbr class="abbrev">RFC2168</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Daniel</span> and <span class="firstname">M.</span> <span class="surname">Mealling</span>. </span><span class="title"><i>Resolution of Uniform Resource Identifiers using +<a name="id2598462"></a><p>[<abbr class="abbrev">RFC2168</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Daniel</span> and <span class="firstname">M.</span> <span class="surname">Mealling</span>. </span><span class="title"><i>Resolution of Uniform Resource Identifiers using the Domain Name System</i>. </span><span class="pubdate">June 1997. </span></p> </div> <div class="biblioentry"> -<a name="id2595528"></a><p>[<abbr class="abbrev">RFC1876</abbr>] <span class="authorgroup"><span class="firstname">C.</span> <span class="surname">Davis</span>, <span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">T.</span>, and <span class="firstname">I.</span> <span class="surname">Dickinson</span>. </span><span class="title"><i>A Means for Expressing Location Information in the +<a name="id2598498"></a><p>[<abbr class="abbrev">RFC1876</abbr>] <span class="authorgroup"><span class="firstname">C.</span> <span class="surname">Davis</span>, <span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">T.</span>, and <span class="firstname">I.</span> <span class="surname">Dickinson</span>. </span><span class="title"><i>A Means for Expressing Location Information in the Domain Name System</i>. </span><span class="pubdate">January 1996. </span></p> </div> <div class="biblioentry"> -<a name="id2595582"></a><p>[<abbr class="abbrev">RFC2052</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Gulbrandsen</span> and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>A <acronym class="acronym">DNS</acronym> RR for Specifying the +<a name="id2598620"></a><p>[<abbr class="abbrev">RFC2052</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Gulbrandsen</span> and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>A <acronym class="acronym">DNS</acronym> RR for Specifying the Location of Services.</i>. </span><span class="pubdate">October 1996. </span></p> </div> <div class="biblioentry"> -<a name="id2595621"></a><p>[<abbr class="abbrev">RFC2163</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Allocchio</span>. </span><span class="title"><i>Using the Internet <acronym class="acronym">DNS</acronym> to +<a name="id2598659"></a><p>[<abbr class="abbrev">RFC2163</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Allocchio</span>. </span><span class="title"><i>Using the Internet <acronym class="acronym">DNS</acronym> to Distribute MIXER Conformant Global Address Mapping</i>. </span><span class="pubdate">January 1998. </span></p> </div> <div class="biblioentry"> -<a name="id2595646"></a><p>[<abbr class="abbrev">RFC2230</abbr>] <span class="author"><span class="firstname">R.</span> <span class="surname">Atkinson</span>. </span><span class="title"><i>Key Exchange Delegation Record for the <acronym class="acronym">DNS</acronym></i>. </span><span class="pubdate">October 1997. </span></p> +<a name="id2598684"></a><p>[<abbr class="abbrev">RFC2230</abbr>] <span class="author"><span class="firstname">R.</span> <span class="surname">Atkinson</span>. </span><span class="title"><i>Key Exchange Delegation Record for the <acronym class="acronym">DNS</acronym></i>. </span><span class="pubdate">October 1997. </span></p> </div> <div class="biblioentry"> -<a name="id2595672"></a><p>[<abbr class="abbrev">RFC2536</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>DSA KEYs and SIGs in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p> +<a name="id2598710"></a><p>[<abbr class="abbrev">RFC2536</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>DSA KEYs and SIGs in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p> </div> <div class="biblioentry"> -<a name="id2595699"></a><p>[<abbr class="abbrev">RFC2537</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>RSA/MD5 KEYs and SIGs in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p> +<a name="id2598737"></a><p>[<abbr class="abbrev">RFC2537</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>RSA/MD5 KEYs and SIGs in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p> </div> <div class="biblioentry"> -<a name="id2595794"></a><p>[<abbr class="abbrev">RFC2538</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span> and <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Storing Certificates in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p> +<a name="id2598763"></a><p>[<abbr class="abbrev">RFC2538</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span> and <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Storing Certificates in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p> </div> <div class="biblioentry"> -<a name="id2595833"></a><p>[<abbr class="abbrev">RFC2539</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Storage of Diffie-Hellman Keys in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p> +<a name="id2598803"></a><p>[<abbr class="abbrev">RFC2539</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Storage of Diffie-Hellman Keys in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p> </div> <div class="biblioentry"> -<a name="id2595863"></a><p>[<abbr class="abbrev">RFC2540</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Detached Domain Name System (DNS) Information</i>. </span><span class="pubdate">March 1999. </span></p> +<a name="id2598833"></a><p>[<abbr class="abbrev">RFC2540</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Detached Domain Name System (DNS) Information</i>. </span><span class="pubdate">March 1999. </span></p> </div> <div class="biblioentry"> -<a name="id2595893"></a><p>[<abbr class="abbrev">RFC2782</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Gulbrandsen</span>. </span><span class="author"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="author"><span class="firstname">L.</span> <span class="surname">Esibov</span>. </span><span class="title"><i>A DNS RR for specifying the location of services (DNS SRV)</i>. </span><span class="pubdate">February 2000. </span></p> +<a name="id2598862"></a><p>[<abbr class="abbrev">RFC2782</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Gulbrandsen</span>. </span><span class="author"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="author"><span class="firstname">L.</span> <span class="surname">Esibov</span>. </span><span class="title"><i>A DNS RR for specifying the location of services (DNS SRV)</i>. </span><span class="pubdate">February 2000. </span></p> </div> <div class="biblioentry"> -<a name="id2595936"></a><p>[<abbr class="abbrev">RFC2915</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Mealling</span>. </span><span class="author"><span class="firstname">R.</span> <span class="surname">Daniel</span>. </span><span class="title"><i>The Naming Authority Pointer (NAPTR) DNS Resource Record</i>. </span><span class="pubdate">September 2000. </span></p> +<a name="id2598905"></a><p>[<abbr class="abbrev">RFC2915</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Mealling</span>. </span><span class="author"><span class="firstname">R.</span> <span class="surname">Daniel</span>. </span><span class="title"><i>The Naming Authority Pointer (NAPTR) DNS Resource Record</i>. </span><span class="pubdate">September 2000. </span></p> </div> <div class="biblioentry"> -<a name="id2595969"></a><p>[<abbr class="abbrev">RFC3110</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>RSA/SHA-1 SIGs and RSA KEYs in the Domain Name System (DNS)</i>. </span><span class="pubdate">May 2001. </span></p> +<a name="id2598938"></a><p>[<abbr class="abbrev">RFC3110</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>RSA/SHA-1 SIGs and RSA KEYs in the Domain Name System (DNS)</i>. </span><span class="pubdate">May 2001. </span></p> </div> <div class="biblioentry"> -<a name="id2595995"></a><p>[<abbr class="abbrev">RFC3123</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Koch</span>. </span><span class="title"><i>A DNS RR Type for Lists of Address Prefixes (APL RR)</i>. </span><span class="pubdate">June 2001. </span></p> +<a name="id2598965"></a><p>[<abbr class="abbrev">RFC3123</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Koch</span>. </span><span class="title"><i>A DNS RR Type for Lists of Address Prefixes (APL RR)</i>. </span><span class="pubdate">June 2001. </span></p> </div> <div class="biblioentry"> -<a name="id2596019"></a><p>[<abbr class="abbrev">RFC3596</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Thomson</span>, <span class="firstname">C.</span> <span class="surname">Huitema</span>, <span class="firstname">V.</span> <span class="surname">Ksinant</span>, and <span class="firstname">M.</span> <span class="surname">Souissi</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Extensions to support IP +<a name="id2598988"></a><p>[<abbr class="abbrev">RFC3596</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Thomson</span>, <span class="firstname">C.</span> <span class="surname">Huitema</span>, <span class="firstname">V.</span> <span class="surname">Ksinant</span>, and <span class="firstname">M.</span> <span class="surname">Souissi</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Extensions to support IP version 6</i>. </span><span class="pubdate">October 2003. </span></p> </div> <div class="biblioentry"> -<a name="id2596076"></a><p>[<abbr class="abbrev">RFC3597</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Gustafsson</span>. </span><span class="title"><i>Handling of Unknown DNS Resource Record (RR) Types</i>. </span><span class="pubdate">September 2003. </span></p> +<a name="id2599046"></a><p>[<abbr class="abbrev">RFC3597</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Gustafsson</span>. </span><span class="title"><i>Handling of Unknown DNS Resource Record (RR) Types</i>. </span><span class="pubdate">September 2003. </span></p> </div> </div> <div class="bibliodiv"> <h3 class="title"> <acronym class="acronym">DNS</acronym> and the Internet</h3> <div class="biblioentry"> -<a name="id2596108"></a><p>[<abbr class="abbrev">RFC1101</abbr>] <span class="author"><span class="firstname">P. V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Encoding of Network Names +<a name="id2599078"></a><p>[<abbr class="abbrev">RFC1101</abbr>] <span class="author"><span class="firstname">P. V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Encoding of Network Names and Other Types</i>. </span><span class="pubdate">April 1989. </span></p> </div> <div class="biblioentry"> -<a name="id2596134"></a><p>[<abbr class="abbrev">RFC1123</abbr>] <span class="author"><span class="surname">Braden</span>. </span><span class="title"><i>Requirements for Internet Hosts - Application and +<a name="id2599104"></a><p>[<abbr class="abbrev">RFC1123</abbr>] <span class="author"><span class="surname">Braden</span>. </span><span class="title"><i>Requirements for Internet Hosts - Application and Support</i>. </span><span class="pubdate">October 1989. </span></p> </div> <div class="biblioentry"> -<a name="id2596156"></a><p>[<abbr class="abbrev">RFC1591</abbr>] <span class="author"><span class="firstname">J.</span> <span class="surname">Postel</span>. </span><span class="title"><i>Domain Name System Structure and Delegation</i>. </span><span class="pubdate">March 1994. </span></p> +<a name="id2599126"></a><p>[<abbr class="abbrev">RFC1591</abbr>] <span class="author"><span class="firstname">J.</span> <span class="surname">Postel</span>. </span><span class="title"><i>Domain Name System Structure and Delegation</i>. </span><span class="pubdate">March 1994. </span></p> </div> <div class="biblioentry"> -<a name="id2596180"></a><p>[<abbr class="abbrev">RFC2317</abbr>] <span class="authorgroup"><span class="firstname">H.</span> <span class="surname">Eidnes</span>, <span class="firstname">G.</span> <span class="surname">de Groot</span>, and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Classless IN-ADDR.ARPA Delegation</i>. </span><span class="pubdate">March 1998. </span></p> +<a name="id2599149"></a><p>[<abbr class="abbrev">RFC2317</abbr>] <span class="authorgroup"><span class="firstname">H.</span> <span class="surname">Eidnes</span>, <span class="firstname">G.</span> <span class="surname">de Groot</span>, and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Classless IN-ADDR.ARPA Delegation</i>. </span><span class="pubdate">March 1998. </span></p> </div> <div class="biblioentry"> -<a name="id2596226"></a><p>[<abbr class="abbrev">RFC2826</abbr>] <span class="authorgroup"><span class="surname">Internet Architecture Board</span>. </span><span class="title"><i>IAB Technical Comment on the Unique DNS Root</i>. </span><span class="pubdate">May 2000. </span></p> +<a name="id2599195"></a><p>[<abbr class="abbrev">RFC2826</abbr>] <span class="authorgroup"><span class="surname">Internet Architecture Board</span>. </span><span class="title"><i>IAB Technical Comment on the Unique DNS Root</i>. </span><span class="pubdate">May 2000. </span></p> </div> <div class="biblioentry"> -<a name="id2596249"></a><p>[<abbr class="abbrev">RFC2929</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>, <span class="firstname">E.</span> <span class="surname">Brunner-Williams</span>, and <span class="firstname">B.</span> <span class="surname">Manning</span>. </span><span class="title"><i>Domain Name System (DNS) IANA Considerations</i>. </span><span class="pubdate">September 2000. </span></p> +<a name="id2599219"></a><p>[<abbr class="abbrev">RFC2929</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>, <span class="firstname">E.</span> <span class="surname">Brunner-Williams</span>, and <span class="firstname">B.</span> <span class="surname">Manning</span>. </span><span class="title"><i>Domain Name System (DNS) IANA Considerations</i>. </span><span class="pubdate">September 2000. </span></p> </div> </div> <div class="bibliodiv"> <h3 class="title"> <acronym class="acronym">DNS</acronym> Operations</h3> <div class="biblioentry"> -<a name="id2596307"></a><p>[<abbr class="abbrev">RFC1033</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Lottor</span>. </span><span class="title"><i>Domain administrators operations guide.</i>. </span><span class="pubdate">November 1987. </span></p> +<a name="id2599276"></a><p>[<abbr class="abbrev">RFC1033</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Lottor</span>. </span><span class="title"><i>Domain administrators operations guide.</i>. </span><span class="pubdate">November 1987. </span></p> </div> <div class="biblioentry"> -<a name="id2596330"></a><p>[<abbr class="abbrev">RFC1537</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Beertema</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Data File +<a name="id2599300"></a><p>[<abbr class="abbrev">RFC1537</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Beertema</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Data File Configuration Errors</i>. </span><span class="pubdate">October 1993. </span></p> </div> <div class="biblioentry"> -<a name="id2596357"></a><p>[<abbr class="abbrev">RFC1912</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Barr</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Operational and +<a name="id2599326"></a><p>[<abbr class="abbrev">RFC1912</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Barr</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Operational and Configuration Errors</i>. </span><span class="pubdate">February 1996. </span></p> </div> <div class="biblioentry"> -<a name="id2596384"></a><p>[<abbr class="abbrev">RFC2010</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Manning</span> and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Operational Criteria for Root Name Servers.</i>. </span><span class="pubdate">October 1996. </span></p> +<a name="id2599353"></a><p>[<abbr class="abbrev">RFC2010</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Manning</span> and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Operational Criteria for Root Name Servers.</i>. </span><span class="pubdate">October 1996. </span></p> </div> <div class="biblioentry"> -<a name="id2596420"></a><p>[<abbr class="abbrev">RFC2219</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Hamilton</span> and <span class="firstname">R.</span> <span class="surname">Wright</span>. </span><span class="title"><i>Use of <acronym class="acronym">DNS</acronym> Aliases for +<a name="id2599389"></a><p>[<abbr class="abbrev">RFC2219</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Hamilton</span> and <span class="firstname">R.</span> <span class="surname">Wright</span>. </span><span class="title"><i>Use of <acronym class="acronym">DNS</acronym> Aliases for Network Services.</i>. </span><span class="pubdate">October 1997. </span></p> </div> </div> <div class="bibliodiv"> <h3 class="title">Internationalized Domain Names</h3> <div class="biblioentry"> -<a name="id2596466"></a><p>[<abbr class="abbrev">RFC2825</abbr>] <span class="authorgroup"><span class="surname">IAB</span> and <span class="firstname">R.</span> <span class="surname">Daigle</span>. </span><span class="title"><i>A Tangled Web: Issues of I18N, Domain Names, +<a name="id2599435"></a><p>[<abbr class="abbrev">RFC2825</abbr>] <span class="authorgroup"><span class="surname">IAB</span> and <span class="firstname">R.</span> <span class="surname">Daigle</span>. </span><span class="title"><i>A Tangled Web: Issues of I18N, Domain Names, and the Other Internet protocols</i>. </span><span class="pubdate">May 2000. </span></p> </div> <div class="biblioentry"> -<a name="id2596498"></a><p>[<abbr class="abbrev">RFC3490</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Faltstrom</span>, <span class="firstname">P.</span> <span class="surname">Hoffman</span>, and <span class="firstname">A.</span> <span class="surname">Costello</span>. </span><span class="title"><i>Internationalizing Domain Names in Applications (IDNA)</i>. </span><span class="pubdate">March 2003. </span></p> +<a name="id2599467"></a><p>[<abbr class="abbrev">RFC3490</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Faltstrom</span>, <span class="firstname">P.</span> <span class="surname">Hoffman</span>, and <span class="firstname">A.</span> <span class="surname">Costello</span>. </span><span class="title"><i>Internationalizing Domain Names in Applications (IDNA)</i>. </span><span class="pubdate">March 2003. </span></p> </div> <div class="biblioentry"> -<a name="id2596544"></a><p>[<abbr class="abbrev">RFC3491</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Hoffman</span> and <span class="firstname">M.</span> <span class="surname">Blanchet</span>. </span><span class="title"><i>Nameprep: A Stringprep Profile for Internationalized Domain Names</i>. </span><span class="pubdate">March 2003. </span></p> +<a name="id2599513"></a><p>[<abbr class="abbrev">RFC3491</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Hoffman</span> and <span class="firstname">M.</span> <span class="surname">Blanchet</span>. </span><span class="title"><i>Nameprep: A Stringprep Profile for Internationalized Domain Names</i>. </span><span class="pubdate">March 2003. </span></p> </div> <div class="biblioentry"> -<a name="id2596579"></a><p>[<abbr class="abbrev">RFC3492</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Costello</span>. </span><span class="title"><i>Punycode: A Bootstring encoding of Unicode +<a name="id2599548"></a><p>[<abbr class="abbrev">RFC3492</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Costello</span>. </span><span class="title"><i>Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)</i>. </span><span class="pubdate">March 2003. </span></p> </div> @@ -489,47 +489,47 @@ </p> </div> <div class="biblioentry"> -<a name="id2596624"></a><p>[<abbr class="abbrev">RFC1464</abbr>] <span class="author"><span class="firstname">R.</span> <span class="surname">Rosenbaum</span>. </span><span class="title"><i>Using the Domain Name System To Store Arbitrary String +<a name="id2599593"></a><p>[<abbr class="abbrev">RFC1464</abbr>] <span class="author"><span class="firstname">R.</span> <span class="surname">Rosenbaum</span>. </span><span class="title"><i>Using the Domain Name System To Store Arbitrary String Attributes</i>. </span><span class="pubdate">May 1993. </span></p> </div> <div class="biblioentry"> -<a name="id2596646"></a><p>[<abbr class="abbrev">RFC1713</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Romao</span>. </span><span class="title"><i>Tools for <acronym class="acronym">DNS</acronym> Debugging</i>. </span><span class="pubdate">November 1994. </span></p> +<a name="id2599616"></a><p>[<abbr class="abbrev">RFC1713</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Romao</span>. </span><span class="title"><i>Tools for <acronym class="acronym">DNS</acronym> Debugging</i>. </span><span class="pubdate">November 1994. </span></p> </div> <div class="biblioentry"> -<a name="id2596672"></a><p>[<abbr class="abbrev">RFC1794</abbr>] <span class="author"><span class="firstname">T.</span> <span class="surname">Brisco</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Support for Load +<a name="id2599641"></a><p>[<abbr class="abbrev">RFC1794</abbr>] <span class="author"><span class="firstname">T.</span> <span class="surname">Brisco</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Support for Load Balancing</i>. </span><span class="pubdate">April 1995. </span></p> </div> <div class="biblioentry"> -<a name="id2596697"></a><p>[<abbr class="abbrev">RFC2240</abbr>] <span class="author"><span class="firstname">O.</span> <span class="surname">Vaughan</span>. </span><span class="title"><i>A Legal Basis for Domain Name Allocation</i>. </span><span class="pubdate">November 1997. </span></p> +<a name="id2599667"></a><p>[<abbr class="abbrev">RFC2240</abbr>] <span class="author"><span class="firstname">O.</span> <span class="surname">Vaughan</span>. </span><span class="title"><i>A Legal Basis for Domain Name Allocation</i>. </span><span class="pubdate">November 1997. </span></p> </div> <div class="biblioentry"> -<a name="id2596721"></a><p>[<abbr class="abbrev">RFC2345</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Klensin</span>, <span class="firstname">T.</span> <span class="surname">Wolf</span>, and <span class="firstname">G.</span> <span class="surname">Oglesby</span>. </span><span class="title"><i>Domain Names and Company Name Retrieval</i>. </span><span class="pubdate">May 1998. </span></p> +<a name="id2599690"></a><p>[<abbr class="abbrev">RFC2345</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Klensin</span>, <span class="firstname">T.</span> <span class="surname">Wolf</span>, and <span class="firstname">G.</span> <span class="surname">Oglesby</span>. </span><span class="title"><i>Domain Names and Company Name Retrieval</i>. </span><span class="pubdate">May 1998. </span></p> </div> <div class="biblioentry"> -<a name="id2596835"></a><p>[<abbr class="abbrev">RFC2352</abbr>] <span class="author"><span class="firstname">O.</span> <span class="surname">Vaughan</span>. </span><span class="title"><i>A Convention For Using Legal Names as Domain Names</i>. </span><span class="pubdate">May 1998. </span></p> +<a name="id2599736"></a><p>[<abbr class="abbrev">RFC2352</abbr>] <span class="author"><span class="firstname">O.</span> <span class="surname">Vaughan</span>. </span><span class="title"><i>A Convention For Using Legal Names as Domain Names</i>. </span><span class="pubdate">May 1998. </span></p> </div> <div class="biblioentry"> -<a name="id2596858"></a><p>[<abbr class="abbrev">RFC3071</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Klensin</span>. </span><span class="title"><i>Reflections on the DNS, RFC 1591, and Categories of Domains</i>. </span><span class="pubdate">February 2001. </span></p> +<a name="id2599760"></a><p>[<abbr class="abbrev">RFC3071</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Klensin</span>. </span><span class="title"><i>Reflections on the DNS, RFC 1591, and Categories of Domains</i>. </span><span class="pubdate">February 2001. </span></p> </div> <div class="biblioentry"> -<a name="id2596885"></a><p>[<abbr class="abbrev">RFC3258</abbr>] <span class="authorgroup"><span class="firstname">T.</span> <span class="surname">Hardie</span>. </span><span class="title"><i>Distributing Authoritative Name Servers via +<a name="id2599786"></a><p>[<abbr class="abbrev">RFC3258</abbr>] <span class="authorgroup"><span class="firstname">T.</span> <span class="surname">Hardie</span>. </span><span class="title"><i>Distributing Authoritative Name Servers via Shared Unicast Addresses</i>. </span><span class="pubdate">April 2002. </span></p> </div> <div class="biblioentry"> -<a name="id2596910"></a><p>[<abbr class="abbrev">RFC3901</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Durand</span> and <span class="firstname">J.</span> <span class="surname">Ihren</span>. </span><span class="title"><i>DNS IPv6 Transport Operational Guidelines</i>. </span><span class="pubdate">September 2004. </span></p> +<a name="id2599812"></a><p>[<abbr class="abbrev">RFC3901</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Durand</span> and <span class="firstname">J.</span> <span class="surname">Ihren</span>. </span><span class="title"><i>DNS IPv6 Transport Operational Guidelines</i>. </span><span class="pubdate">September 2004. </span></p> </div> </div> <div class="bibliodiv"> <h3 class="title">Obsolete and Unimplemented Experimental RFC</h3> <div class="biblioentry"> -<a name="id2596954"></a><p>[<abbr class="abbrev">RFC1712</abbr>] <span class="authorgroup"><span class="firstname">C.</span> <span class="surname">Farrell</span>, <span class="firstname">M.</span> <span class="surname">Schulze</span>, <span class="firstname">S.</span> <span class="surname">Pleitner</span>, and <span class="firstname">D.</span> <span class="surname">Baldoni</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Encoding of Geographical +<a name="id2599856"></a><p>[<abbr class="abbrev">RFC1712</abbr>] <span class="authorgroup"><span class="firstname">C.</span> <span class="surname">Farrell</span>, <span class="firstname">M.</span> <span class="surname">Schulze</span>, <span class="firstname">S.</span> <span class="surname">Pleitner</span>, and <span class="firstname">D.</span> <span class="surname">Baldoni</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Encoding of Geographical Location</i>. </span><span class="pubdate">November 1994. </span></p> </div> <div class="biblioentry"> -<a name="id2597012"></a><p>[<abbr class="abbrev">RFC2673</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span>. </span><span class="title"><i>Binary Labels in the Domain Name System</i>. </span><span class="pubdate">August 1999. </span></p> +<a name="id2599913"></a><p>[<abbr class="abbrev">RFC2673</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span>. </span><span class="title"><i>Binary Labels in the Domain Name System</i>. </span><span class="pubdate">August 1999. </span></p> </div> <div class="biblioentry"> -<a name="id2597038"></a><p>[<abbr class="abbrev">RFC2874</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span> and <span class="firstname">C.</span> <span class="surname">Huitema</span>. </span><span class="title"><i>DNS Extensions to Support IPv6 Address Aggregation +<a name="id2599940"></a><p>[<abbr class="abbrev">RFC2874</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span> and <span class="firstname">C.</span> <span class="surname">Huitema</span>. </span><span class="title"><i>DNS Extensions to Support IPv6 Address Aggregation and Renumbering</i>. </span><span class="pubdate">July 2000. </span></p> </div> </div> @@ -543,39 +543,39 @@ </p> </div> <div class="biblioentry"> -<a name="id2597086"></a><p>[<abbr class="abbrev">RFC2065</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span> and <span class="firstname">C.</span> <span class="surname">Kaufman</span>. </span><span class="title"><i>Domain Name System Security Extensions</i>. </span><span class="pubdate">January 1997. </span></p> +<a name="id2599988"></a><p>[<abbr class="abbrev">RFC2065</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span> and <span class="firstname">C.</span> <span class="surname">Kaufman</span>. </span><span class="title"><i>Domain Name System Security Extensions</i>. </span><span class="pubdate">January 1997. </span></p> </div> <div class="biblioentry"> -<a name="id2597126"></a><p>[<abbr class="abbrev">RFC2137</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Secure Domain Name System Dynamic Update</i>. </span><span class="pubdate">April 1997. </span></p> +<a name="id2600027"></a><p>[<abbr class="abbrev">RFC2137</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Secure Domain Name System Dynamic Update</i>. </span><span class="pubdate">April 1997. </span></p> </div> <div class="biblioentry"> -<a name="id2597153"></a><p>[<abbr class="abbrev">RFC2535</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Domain Name System Security Extensions</i>. </span><span class="pubdate">March 1999. </span></p> +<a name="id2600054"></a><p>[<abbr class="abbrev">RFC2535</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Domain Name System Security Extensions</i>. </span><span class="pubdate">March 1999. </span></p> </div> <div class="biblioentry"> -<a name="id2597182"></a><p>[<abbr class="abbrev">RFC3008</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Domain Name System Security (DNSSEC) +<a name="id2600084"></a><p>[<abbr class="abbrev">RFC3008</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Domain Name System Security (DNSSEC) Signing Authority</i>. </span><span class="pubdate">November 2000. </span></p> </div> <div class="biblioentry"> -<a name="id2597208"></a><p>[<abbr class="abbrev">RFC3090</abbr>] <span class="authorgroup"><span class="firstname">E.</span> <span class="surname">Lewis</span>. </span><span class="title"><i>DNS Security Extension Clarification on Zone Status</i>. </span><span class="pubdate">March 2001. </span></p> +<a name="id2600109"></a><p>[<abbr class="abbrev">RFC3090</abbr>] <span class="authorgroup"><span class="firstname">E.</span> <span class="surname">Lewis</span>. </span><span class="title"><i>DNS Security Extension Clarification on Zone Status</i>. </span><span class="pubdate">March 2001. </span></p> </div> <div class="biblioentry"> -<a name="id2597235"></a><p>[<abbr class="abbrev">RFC3445</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Massey</span> and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Limiting the Scope of the KEY Resource Record (RR)</i>. </span><span class="pubdate">December 2002. </span></p> +<a name="id2600136"></a><p>[<abbr class="abbrev">RFC3445</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Massey</span> and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Limiting the Scope of the KEY Resource Record (RR)</i>. </span><span class="pubdate">December 2002. </span></p> </div> <div class="biblioentry"> -<a name="id2597271"></a><p>[<abbr class="abbrev">RFC3655</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span> and <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Redefinition of DNS Authenticated Data (AD) bit</i>. </span><span class="pubdate">November 2003. </span></p> +<a name="id2600172"></a><p>[<abbr class="abbrev">RFC3655</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span> and <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Redefinition of DNS Authenticated Data (AD) bit</i>. </span><span class="pubdate">November 2003. </span></p> </div> <div class="biblioentry"> -<a name="id2597307"></a><p>[<abbr class="abbrev">RFC3658</abbr>] <span class="authorgroup"><span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Delegation Signer (DS) Resource Record (RR)</i>. </span><span class="pubdate">December 2003. </span></p> +<a name="id2600209"></a><p>[<abbr class="abbrev">RFC3658</abbr>] <span class="authorgroup"><span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Delegation Signer (DS) Resource Record (RR)</i>. </span><span class="pubdate">December 2003. </span></p> </div> <div class="biblioentry"> -<a name="id2597334"></a><p>[<abbr class="abbrev">RFC3755</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Weiler</span>. </span><span class="title"><i>Legacy Resolver Compatibility for Delegation Signer (DS)</i>. </span><span class="pubdate">May 2004. </span></p> +<a name="id2600235"></a><p>[<abbr class="abbrev">RFC3755</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Weiler</span>. </span><span class="title"><i>Legacy Resolver Compatibility for Delegation Signer (DS)</i>. </span><span class="pubdate">May 2004. </span></p> </div> <div class="biblioentry"> -<a name="id2597361"></a><p>[<abbr class="abbrev">RFC3757</abbr>] <span class="authorgroup"><span class="firstname">O.</span> <span class="surname">Kolkman</span>, <span class="firstname">J.</span> <span class="surname">Schlyter</span>, and <span class="firstname">E.</span> <span class="surname">Lewis</span>. </span><span class="title"><i>Domain Name System KEY (DNSKEY) Resource Record +<a name="id2600262"></a><p>[<abbr class="abbrev">RFC3757</abbr>] <span class="authorgroup"><span class="firstname">O.</span> <span class="surname">Kolkman</span>, <span class="firstname">J.</span> <span class="surname">Schlyter</span>, and <span class="firstname">E.</span> <span class="surname">Lewis</span>. </span><span class="title"><i>Domain Name System KEY (DNSKEY) Resource Record (RR) Secure Entry Point (SEP) Flag</i>. </span><span class="pubdate">April 2004. </span></p> </div> <div class="biblioentry"> -<a name="id2597405"></a><p>[<abbr class="abbrev">RFC3845</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Schlyter</span>. </span><span class="title"><i>DNS Security (DNSSEC) NextSECure (NSEC) RDATA Format</i>. </span><span class="pubdate">August 2004. </span></p> +<a name="id2600307"></a><p>[<abbr class="abbrev">RFC3845</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Schlyter</span>. </span><span class="title"><i>DNS Security (DNSSEC) NextSECure (NSEC) RDATA Format</i>. </span><span class="pubdate">August 2004. </span></p> </div> </div> </div> @@ -596,14 +596,14 @@ </div> <div class="sect2" lang="en"> <div class="titlepage"><div><div><h3 class="title"> -<a name="id2597447"></a>Other Documents About <acronym class="acronym">BIND</acronym> +<a name="id2600348"></a>Other Documents About <acronym class="acronym">BIND</acronym> </h3></div></div></div> <p></p> <div class="bibliography"> <div class="titlepage"><div><div><h4 class="title"> -<a name="id2597457"></a>Bibliography</h4></div></div></div> +<a name="id2600358"></a>Bibliography</h4></div></div></div> <div class="biblioentry"> -<a name="id2597459"></a><p><span class="authorgroup"><span class="firstname">Paul</span> <span class="surname">Albitz</span> and <span class="firstname">Cricket</span> <span class="surname">Liu</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym></i>. </span><span class="copyright">Copyright © 1998 Sebastopol, CA: O'Reilly and Associates. </span></p> +<a name="id2600360"></a><p><span class="authorgroup"><span class="firstname">Paul</span> <span class="surname">Albitz</span> and <span class="firstname">Cricket</span> <span class="surname">Liu</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym></i>. </span><span class="copyright">Copyright © 1998 Sebastopol, CA: O'Reilly and Associates. </span></p> </div> </div> </div> diff --git a/doc/arm/Bv9ARM.html b/doc/arm/Bv9ARM.html index 68d19277..292603cc 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. --> -<!-- $Id: Bv9ARM.html,v 1.164.18.4 2008/01/18 09:37:04 marka Exp $ --> +<!-- $Id: Bv9ARM.html,v 1.164.18.9 2008/05/06 01:41:47 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -40,7 +40,7 @@ <div class="titlepage"> <div> <div><h1 class="title"> -<a name="id2563403"></a>BIND 9 Administrator Reference Manual</h1></div> +<a name="id2563174"></a>BIND 9 Administrator Reference Manual</h1></div> <div><p class="copyright">Copyright © 2004-2008 Internet Systems Consortium, Inc. ("ISC")</p></div> <div><p class="copyright">Copyright © 2000-2003 Internet Software Consortium.</p></div> </div> @@ -51,39 +51,39 @@ <dl> <dt><span class="chapter"><a href="Bv9ARM.ch01.html">1. Introduction</a></span></dt> <dd><dl> -<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564109">Scope of Document</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564133">Organization of This Document</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2563474">Conventions Used in This Document</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564816">The Domain Name System (<acronym class="acronym">DNS</acronym>)</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2563405">Scope of Document</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564385">Organization of This Document</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564524">Conventions Used in This Document</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564637">The Domain Name System (<acronym class="acronym">DNS</acronym>)</a></span></dt> <dd><dl> -<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564837">DNS Fundamentals</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564871">Domains and Domain Names</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567208">Zones</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567285">Authoritative Name Servers</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567526">Caching Name Servers</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567588">Name Servers in Multiple Roles</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564659">DNS Fundamentals</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564693">Domains and Domain Names</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564845">Zones</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567243">Authoritative Name Servers</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567416">Caching Name Servers</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567546">Name Servers in Multiple Roles</a></span></dt> </dl></dd> </dl></dd> <dt><span class="chapter"><a href="Bv9ARM.ch02.html">2. <acronym class="acronym">BIND</acronym> Resource Requirements</a></span></dt> <dd><dl> -<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567622">Hardware requirements</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567649">CPU Requirements</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567661">Memory Requirements</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567688">Name Server Intensive Environment Issues</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567699">Supported Operating Systems</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567580">Hardware requirements</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567607">CPU Requirements</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567620">Memory Requirements</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567851">Name Server Intensive Environment Issues</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567862">Supported Operating Systems</a></span></dt> </dl></dd> <dt><span class="chapter"><a href="Bv9ARM.ch03.html">3. Name Server Configuration</a></span></dt> <dd><dl> <dt><span class="sect1"><a href="Bv9ARM.ch03.html#sample_configuration">Sample Configurations</a></span></dt> <dd><dl> -<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2568004">A Caching-only Name Server</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2568020">An Authoritative-only Name Server</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567894">A Caching-only Name Server</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567910">An Authoritative-only Name Server</a></span></dt> </dl></dd> -<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568042">Load Balancing</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568465">Name Server Operations</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568001">Load Balancing</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568423">Name Server Operations</a></span></dt> <dd><dl> -<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2568470">Tools for Use With the Name Server Daemon</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2570184">Signals</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2568428">Tools for Use With the Name Server Daemon</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2570142">Signals</a></span></dt> </dl></dd> </dl></dd> <dt><span class="chapter"><a href="Bv9ARM.ch04.html">4. Advanced DNS Features</a></span></dt> @@ -92,34 +92,34 @@ <dt><span class="sect1"><a href="Bv9ARM.ch04.html#dynamic_update">Dynamic Update</a></span></dt> <dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#journal">The journal file</a></span></dt></dl></dd> <dt><span class="sect1"><a href="Bv9ARM.ch04.html#incremental_zone_transfers">Incremental Zone Transfers (IXFR)</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2570658">Split DNS</a></span></dt> -<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2570676">Example split DNS setup</a></span></dt></dl></dd> +<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2570616">Split DNS</a></span></dt> +<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2570634">Example split DNS setup</a></span></dt></dl></dd> <dt><span class="sect1"><a href="Bv9ARM.ch04.html#tsig">TSIG</a></span></dt> <dd><dl> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571111">Generate Shared Keys for Each Pair of Hosts</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571185">Copying the Shared Secret to Both Machines</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571195">Informing the Servers of the Key's Existence</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571235">Instructing the Server to Use the Key</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571429">TSIG Key Based Access Control</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571474">Errors</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571069">Generate Shared Keys for Each Pair of Hosts</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571143">Copying the Shared Secret to Both Machines</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571154">Informing the Servers of the Key's Existence</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571193">Instructing the Server to Use the Key</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571319">TSIG Key Based Access Control</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571432">Errors</a></span></dt> </dl></dd> -<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571488">TKEY</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571673">SIG(0)</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571446">TKEY</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571563">SIG(0)</a></span></dt> <dt><span class="sect1"><a href="Bv9ARM.ch04.html#DNSSEC">DNSSEC</a></span></dt> <dd><dl> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571741">Generating Keys</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571811">Signing the Zone</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571890">Configuring Servers</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571700">Generating Keys</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571769">Signing the Zone</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571848">Configuring Servers</a></span></dt> </dl></dd> -<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2572033">IPv6 Support in <acronym class="acronym">BIND</acronym> 9</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571923">IPv6 Support in <acronym class="acronym">BIND</acronym> 9</a></span></dt> <dd><dl> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572231">Address Lookups Using AAAA Records</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572252">Address to Name Lookups Using Nibble Format</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572189">Address Lookups Using AAAA Records</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572211">Address to Name Lookups Using Nibble Format</a></span></dt> </dl></dd> </dl></dd> <dt><span class="chapter"><a href="Bv9ARM.ch05.html">5. The <acronym class="acronym">BIND</acronym> 9 Lightweight Resolver</a></span></dt> <dd><dl> -<dt><span class="sect1"><a href="Bv9ARM.ch05.html#id2572285">The Lightweight Resolver Library</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch05.html#id2572244">The Lightweight Resolver Library</a></span></dt> <dt><span class="sect1"><a href="Bv9ARM.ch05.html#lwresd">Running a Resolver Daemon</a></span></dt> </dl></dd> <dt><span class="chapter"><a href="Bv9ARM.ch06.html">6. <acronym class="acronym">BIND</acronym> 9 Configuration Reference</a></span></dt> @@ -127,86 +127,88 @@ <dt><span class="sect1"><a href="Bv9ARM.ch06.html#configuration_file_elements">Configuration File Elements</a></span></dt> <dd><dl> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#address_match_lists">Address Match Lists</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2573587">Comment Syntax</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2573477">Comment Syntax</a></span></dt> </dl></dd> <dt><span class="sect1"><a href="Bv9ARM.ch06.html#Configuration_File_Grammar">Configuration File Grammar</a></span></dt> <dd><dl> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574157"><span><strong class="command">acl</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574116"><span><strong class="command">acl</strong></span> Statement Grammar</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#acl"><span><strong class="command">acl</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574347"><span><strong class="command">controls</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574306"><span><strong class="command">controls</strong></span> Statement Grammar</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#controls_statement_definition_and_usage"><span><strong class="command">controls</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574776"><span><strong class="command">include</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574793"><span><strong class="command">include</strong></span> Statement Definition and +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574734"><span><strong class="command">include</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574752"><span><strong class="command">include</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574817"><span><strong class="command">key</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574840"><span><strong class="command">key</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574999"><span><strong class="command">logging</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575193"><span><strong class="command">logging</strong></span> Statement Definition and +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574775"><span><strong class="command">key</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574798"><span><strong class="command">key</strong></span> Statement Definition and Usage</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575026"><span><strong class="command">logging</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575152"><span><strong class="command">logging</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576505"><span><strong class="command">lwres</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576579"><span><strong class="command">lwres</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576643"><span><strong class="command">masters</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576686"><span><strong class="command">masters</strong></span> Statement Definition and +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576464"><span><strong class="command">lwres</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576537"><span><strong class="command">lwres</strong></span> Statement Definition and Usage</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576601"><span><strong class="command">masters</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576645"><span><strong class="command">masters</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576701"><span><strong class="command">options</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2576660"><span><strong class="command">options</strong></span> Statement Grammar</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#options"><span><strong class="command">options</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2585163"><span><strong class="command">statistics-channels</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2585181"><span><strong class="command">statistics-channels</strong></span> Statement Definition and +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#statschannels"><span><strong class="command">statistics-channels</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2584781"><span><strong class="command">statistics-channels</strong></span> Statement Definition and Usage</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#server_statement_grammar"><span><strong class="command">server</strong></span> Statement Grammar</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#server_statement_definition_and_usage"><span><strong class="command">server</strong></span> Statement Definition and Usage</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2585865"><span><strong class="command">trusted-keys</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2585916"><span><strong class="command">trusted-keys</strong></span> Statement Definition +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2585533"><span><strong class="command">trusted-keys</strong></span> Statement Grammar</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2585585"><span><strong class="command">trusted-keys</strong></span> Statement Definition and Usage</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#view_statement_grammar"><span><strong class="command">view</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2585998"><span><strong class="command">view</strong></span> Statement Definition and Usage</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2585667"><span><strong class="command">view</strong></span> Statement Definition and Usage</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#zone_statement_grammar"><span><strong class="command">zone</strong></span> Statement Grammar</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2587559"><span><strong class="command">zone</strong></span> Statement Definition and Usage</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2587159"><span><strong class="command">zone</strong></span> Statement Definition and Usage</a></span></dt> </dl></dd> -<dt><span class="sect1"><a href="Bv9ARM.ch06.html#id2589906">Zone File</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch06.html#id2589437">Zone File</a></span></dt> <dd><dl> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#types_of_resource_records_and_when_to_use_them">Types of Resource Records and When to Use Them</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2591927">Discussion of MX Records</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2591459">Discussion of MX Records</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#Setting_TTLs">Setting TTLs</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2592547">Inverse Mapping in IPv4</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2592674">Other Zone File Directives</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2592862"><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2592147">Inverse Mapping in IPv4</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2592342">Other Zone File Directives</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2592599"><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch06.html#zonefile_format">Additional File Formats</a></span></dt> </dl></dd> +<dt><span class="sect1"><a href="Bv9ARM.ch06.html#id2593067">BIND9 Statistics</a></span></dt> +<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2593348">Statistics Counters</a></span></dt></dl></dd> </dl></dd> <dt><span class="chapter"><a href="Bv9ARM.ch07.html">7. <acronym class="acronym">BIND</acronym> 9 Security Considerations</a></span></dt> <dd><dl> <dt><span class="sect1"><a href="Bv9ARM.ch07.html#Access_Control_Lists">Access Control Lists</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch07.html#id2593546"><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span></a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch07.html#id2596516"><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span></a></span></dt> <dd><dl> -<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2593691">The <span><strong class="command">chroot</strong></span> Environment</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2593751">Using the <span><strong class="command">setuid</strong></span> Function</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2596593">The <span><strong class="command">chroot</strong></span> Environment</a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2596652">Using the <span><strong class="command">setuid</strong></span> Function</a></span></dt> </dl></dd> <dt><span class="sect1"><a href="Bv9ARM.ch07.html#dynamic_update_security">Dynamic Update Security</a></span></dt> </dl></dd> <dt><span class="chapter"><a href="Bv9ARM.ch08.html">8. Troubleshooting</a></span></dt> <dd><dl> -<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2593831">Common Problems</a></span></dt> -<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch08.html#id2593836">It's not working; how can I figure out what's wrong?</a></span></dt></dl></dd> -<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2593848">Incrementing and Changing the Serial Number</a></span></dt> -<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2593865">Where Can I Get Help?</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2596732">Common Problems</a></span></dt> +<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch08.html#id2596738">It's not working; how can I figure out what's wrong?</a></span></dt></dl></dd> +<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2596749">Incrementing and Changing the Serial Number</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2596766">Where Can I Get Help?</a></span></dt> </dl></dd> <dt><span class="appendix"><a href="Bv9ARM.ch09.html">A. Appendices</a></span></dt> <dd><dl> -<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2593927">Acknowledgments</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2596828">Acknowledgments</a></span></dt> <dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch09.html#historical_dns_information">A Brief History of the <acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym></a></span></dt></dl></dd> -<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2594099">General <acronym class="acronym">DNS</acronym> Reference Information</a></span></dt> +<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2597137">General <acronym class="acronym">DNS</acronym> Reference Information</a></span></dt> <dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch09.html#ipv6addresses">IPv6 addresses (AAAA)</a></span></dt></dl></dd> <dt><span class="sect1"><a href="Bv9ARM.ch09.html#bibliography">Bibliography (and Suggested Reading)</a></span></dt> <dd><dl> <dt><span class="sect2"><a href="Bv9ARM.ch09.html#rfcs">Request for Comments (RFCs)</a></span></dt> <dt><span class="sect2"><a href="Bv9ARM.ch09.html#internet_drafts">Internet Drafts</a></span></dt> -<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2597447">Other Documents About <acronym class="acronym">BIND</acronym></a></span></dt> +<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2600348">Other Documents About <acronym class="acronym">BIND</acronym></a></span></dt> </dl></dd> </dl></dd> <dt><span class="reference"><a href="Bv9ARM.ch10.html">I. Manual pages</a></span></dt> diff --git a/doc/arm/Bv9ARM.pdf b/doc/arm/Bv9ARM.pdf index f90da559..a443bc36 100755 --- a/doc/arm/Bv9ARM.pdf +++ b/doc/arm/Bv9ARM.pdf @@ -621,389 +621,437 @@ endobj << /S /GoTo /D (subsubsection.6.2.16.18) >> endobj 420 0 obj -(6.2.16.18 The Statistics File) +(6.2.16.18 Additional Section Caching) endobj 421 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.19) >> +<< /S /GoTo /D (subsection.6.2.17) >> endobj 424 0 obj -(6.2.16.19 Additional Section Caching) +(6.2.17 statistics-channels Statement Grammar) endobj 425 0 obj -<< /S /GoTo /D (subsection.6.2.17) >> +<< /S /GoTo /D (subsection.6.2.18) >> endobj 428 0 obj -(6.2.17 server Statement Grammar) +(6.2.18 statistics-channels Statement Definition and Usage) endobj 429 0 obj -<< /S /GoTo /D (subsection.6.2.18) >> +<< /S /GoTo /D (subsection.6.2.19) >> endobj 432 0 obj -(6.2.18 server Statement Definition and Usage) +(6.2.19 server Statement Grammar) endobj 433 0 obj -<< /S /GoTo /D (subsection.6.2.19) >> +<< /S /GoTo /D (subsection.6.2.20) >> endobj 436 0 obj -(6.2.19 trusted-keys Statement Grammar) +(6.2.20 server Statement Definition and Usage) endobj 437 0 obj -<< /S /GoTo /D (subsection.6.2.20) >> +<< /S /GoTo /D (subsection.6.2.21) >> endobj 440 0 obj -(6.2.20 trusted-keys Statement Definition and Usage) +(6.2.21 trusted-keys Statement Grammar) endobj 441 0 obj -<< /S /GoTo /D (subsection.6.2.21) >> +<< /S /GoTo /D (subsection.6.2.22) >> endobj 444 0 obj -(6.2.21 view Statement Grammar) +(6.2.22 trusted-keys Statement Definition and Usage) endobj 445 0 obj -<< /S /GoTo /D (subsection.6.2.22) >> +<< /S /GoTo /D (subsection.6.2.23) >> endobj 448 0 obj -(6.2.22 view Statement Definition and Usage) +(6.2.23 view Statement Grammar) endobj 449 0 obj -<< /S /GoTo /D (subsection.6.2.23) >> +<< /S /GoTo /D (subsection.6.2.24) >> endobj 452 0 obj -(6.2.23 zone Statement Grammar) +(6.2.24 view Statement Definition and Usage) endobj 453 0 obj -<< /S /GoTo /D (subsection.6.2.24) >> +<< /S /GoTo /D (subsection.6.2.25) >> endobj 456 0 obj -(6.2.24 zone Statement Definition and Usage) +(6.2.25 zone Statement Grammar) endobj 457 0 obj -<< /S /GoTo /D (subsubsection.6.2.24.1) >> +<< /S /GoTo /D (subsection.6.2.26) >> endobj 460 0 obj -(6.2.24.1 Zone Types) +(6.2.26 zone Statement Definition and Usage) endobj 461 0 obj -<< /S /GoTo /D (subsubsection.6.2.24.2) >> +<< /S /GoTo /D (subsubsection.6.2.26.1) >> endobj 464 0 obj -(6.2.24.2 Class) +(6.2.26.1 Zone Types) endobj 465 0 obj -<< /S /GoTo /D (subsubsection.6.2.24.3) >> +<< /S /GoTo /D (subsubsection.6.2.26.2) >> endobj 468 0 obj -(6.2.24.3 Zone Options) +(6.2.26.2 Class) endobj 469 0 obj -<< /S /GoTo /D (subsubsection.6.2.24.4) >> +<< /S /GoTo /D (subsubsection.6.2.26.3) >> endobj 472 0 obj -(6.2.24.4 Dynamic Update Policies) +(6.2.26.3 Zone Options) endobj 473 0 obj -<< /S /GoTo /D (section.6.3) >> +<< /S /GoTo /D (subsubsection.6.2.26.4) >> endobj 476 0 obj -(6.3 Zone File) +(6.2.26.4 Dynamic Update Policies) endobj 477 0 obj -<< /S /GoTo /D (subsection.6.3.1) >> +<< /S /GoTo /D (section.6.3) >> endobj 480 0 obj -(6.3.1 Types of Resource Records and When to Use Them) +(6.3 Zone File) endobj 481 0 obj -<< /S /GoTo /D (subsubsection.6.3.1.1) >> +<< /S /GoTo /D (subsection.6.3.1) >> endobj 484 0 obj -(6.3.1.1 Resource Records) +(6.3.1 Types of Resource Records and When to Use Them) endobj 485 0 obj -<< /S /GoTo /D (subsubsection.6.3.1.2) >> +<< /S /GoTo /D (subsubsection.6.3.1.1) >> endobj 488 0 obj -(6.3.1.2 Textual expression of RRs) +(6.3.1.1 Resource Records) endobj 489 0 obj -<< /S /GoTo /D (subsection.6.3.2) >> +<< /S /GoTo /D (subsubsection.6.3.1.2) >> endobj 492 0 obj -(6.3.2 Discussion of MX Records) +(6.3.1.2 Textual expression of RRs) endobj 493 0 obj -<< /S /GoTo /D (subsection.6.3.3) >> +<< /S /GoTo /D (subsection.6.3.2) >> endobj 496 0 obj -(6.3.3 Setting TTLs) +(6.3.2 Discussion of MX Records) endobj 497 0 obj -<< /S /GoTo /D (subsection.6.3.4) >> +<< /S /GoTo /D (subsection.6.3.3) >> endobj 500 0 obj -(6.3.4 Inverse Mapping in IPv4) +(6.3.3 Setting TTLs) endobj 501 0 obj -<< /S /GoTo /D (subsection.6.3.5) >> +<< /S /GoTo /D (subsection.6.3.4) >> endobj 504 0 obj -(6.3.5 Other Zone File Directives) +(6.3.4 Inverse Mapping in IPv4) endobj 505 0 obj -<< /S /GoTo /D (subsubsection.6.3.5.1) >> +<< /S /GoTo /D (subsection.6.3.5) >> endobj 508 0 obj -(6.3.5.1 The \044ORIGIN Directive) +(6.3.5 Other Zone File Directives) endobj 509 0 obj -<< /S /GoTo /D (subsubsection.6.3.5.2) >> +<< /S /GoTo /D (subsubsection.6.3.5.1) >> endobj 512 0 obj -(6.3.5.2 The \044INCLUDE Directive) +(6.3.5.1 The \044ORIGIN Directive) endobj 513 0 obj -<< /S /GoTo /D (subsubsection.6.3.5.3) >> +<< /S /GoTo /D (subsubsection.6.3.5.2) >> endobj 516 0 obj -(6.3.5.3 The \044TTL Directive) +(6.3.5.2 The \044INCLUDE Directive) endobj 517 0 obj -<< /S /GoTo /D (subsection.6.3.6) >> +<< /S /GoTo /D (subsubsection.6.3.5.3) >> endobj 520 0 obj -(6.3.6 BIND Master File Extension: the \044GENERATE Directive) +(6.3.5.3 The \044TTL Directive) endobj 521 0 obj -<< /S /GoTo /D (subsection.6.3.7) >> +<< /S /GoTo /D (subsection.6.3.6) >> endobj 524 0 obj -(6.3.7 Additional File Formats) +(6.3.6 BIND Master File Extension: the \044GENERATE Directive) endobj 525 0 obj -<< /S /GoTo /D (chapter.7) >> +<< /S /GoTo /D (subsection.6.3.7) >> endobj 528 0 obj -(7 BIND 9 Security Considerations) +(6.3.7 Additional File Formats) endobj 529 0 obj -<< /S /GoTo /D (section.7.1) >> +<< /S /GoTo /D (section.6.4) >> endobj 532 0 obj -(7.1 Access Control Lists) +(6.4 BIND9 Statistics) endobj 533 0 obj -<< /S /GoTo /D (section.7.2) >> +<< /S /GoTo /D (subsubsection.6.4.0.1) >> endobj 536 0 obj -(7.2 Chroot and Setuid) +(6.4.0.1 The Statistics File) endobj 537 0 obj -<< /S /GoTo /D (subsection.7.2.1) >> +<< /S /GoTo /D (subsection.6.4.1) >> endobj 540 0 obj -(7.2.1 The chroot Environment) +(6.4.1 Statistics Counters) endobj 541 0 obj -<< /S /GoTo /D (subsection.7.2.2) >> +<< /S /GoTo /D (subsubsection.6.4.1.1) >> endobj 544 0 obj -(7.2.2 Using the setuid Function) +(6.4.1.1 Name Server Statistics Counters) endobj 545 0 obj -<< /S /GoTo /D (section.7.3) >> +<< /S /GoTo /D (subsubsection.6.4.1.2) >> endobj 548 0 obj -(7.3 Dynamic Update Security) +(6.4.1.2 Zone Maintenance Statistics Counters) endobj 549 0 obj -<< /S /GoTo /D (chapter.8) >> +<< /S /GoTo /D (subsubsection.6.4.1.3) >> endobj 552 0 obj -(8 Troubleshooting) +(6.4.1.3 Resolver Statistics Counters) endobj 553 0 obj -<< /S /GoTo /D (section.8.1) >> +<< /S /GoTo /D (subsubsection.6.4.1.4) >> endobj 556 0 obj -(8.1 Common Problems) +(6.4.1.4 Compatibility with BIND 8 Counters) endobj 557 0 obj -<< /S /GoTo /D (subsection.8.1.1) >> +<< /S /GoTo /D (chapter.7) >> endobj 560 0 obj -(8.1.1 It's not working; how can I figure out what's wrong?) +(7 BIND 9 Security Considerations) endobj 561 0 obj -<< /S /GoTo /D (section.8.2) >> +<< /S /GoTo /D (section.7.1) >> endobj 564 0 obj -(8.2 Incrementing and Changing the Serial Number) +(7.1 Access Control Lists) endobj 565 0 obj -<< /S /GoTo /D (section.8.3) >> +<< /S /GoTo /D (section.7.2) >> endobj 568 0 obj -(8.3 Where Can I Get Help?) +(7.2 Chroot and Setuid) endobj 569 0 obj -<< /S /GoTo /D (appendix.A) >> +<< /S /GoTo /D (subsection.7.2.1) >> endobj 572 0 obj -(A Appendices) +(7.2.1 The chroot Environment) endobj 573 0 obj -<< /S /GoTo /D (section.A.1) >> +<< /S /GoTo /D (subsection.7.2.2) >> endobj 576 0 obj -(A.1 Acknowledgments) +(7.2.2 Using the setuid Function) endobj 577 0 obj -<< /S /GoTo /D (subsection.A.1.1) >> +<< /S /GoTo /D (section.7.3) >> endobj 580 0 obj -(A.1.1 A Brief History of the DNS and BIND) +(7.3 Dynamic Update Security) endobj 581 0 obj -<< /S /GoTo /D (section.A.2) >> +<< /S /GoTo /D (chapter.8) >> endobj 584 0 obj -(A.2 General DNS Reference Information) +(8 Troubleshooting) endobj 585 0 obj -<< /S /GoTo /D (subsection.A.2.1) >> +<< /S /GoTo /D (section.8.1) >> endobj 588 0 obj -(A.2.1 IPv6 addresses \(AAAA\)) +(8.1 Common Problems) endobj 589 0 obj -<< /S /GoTo /D (section.A.3) >> +<< /S /GoTo /D (subsection.8.1.1) >> endobj 592 0 obj -(A.3 Bibliography \(and Suggested Reading\)) +(8.1.1 It's not working; how can I figure out what's wrong?) endobj 593 0 obj -<< /S /GoTo /D (subsection.A.3.1) >> +<< /S /GoTo /D (section.8.2) >> endobj 596 0 obj -(A.3.1 Request for Comments \(RFCs\)) +(8.2 Incrementing and Changing the Serial Number) endobj 597 0 obj -<< /S /GoTo /D (subsection.A.3.2) >> +<< /S /GoTo /D (section.8.3) >> endobj 600 0 obj -(A.3.2 Internet Drafts) +(8.3 Where Can I Get Help?) endobj 601 0 obj -<< /S /GoTo /D (subsection.A.3.3) >> +<< /S /GoTo /D (appendix.A) >> endobj 604 0 obj -(A.3.3 Other Documents About BIND) +(A Appendices) endobj 605 0 obj -<< /S /GoTo /D (appendix.B) >> +<< /S /GoTo /D (section.A.1) >> endobj 608 0 obj -(B Manual pages) +(A.1 Acknowledgments) endobj 609 0 obj -<< /S /GoTo /D (section.B.1) >> +<< /S /GoTo /D (subsection.A.1.1) >> endobj 612 0 obj -(B.1 dig) +(A.1.1 A Brief History of the DNS and BIND) endobj 613 0 obj -<< /S /GoTo /D (section.B.2) >> +<< /S /GoTo /D (section.A.2) >> endobj 616 0 obj -(B.2 host) +(A.2 General DNS Reference Information) endobj 617 0 obj -<< /S /GoTo /D (section.B.3) >> +<< /S /GoTo /D (subsection.A.2.1) >> endobj 620 0 obj -(B.3 dnssec-keygen) +(A.2.1 IPv6 addresses \(AAAA\)) endobj 621 0 obj -<< /S /GoTo /D (section.B.4) >> +<< /S /GoTo /D (section.A.3) >> endobj 624 0 obj -(B.4 dnssec-signzone) +(A.3 Bibliography \(and Suggested Reading\)) endobj 625 0 obj -<< /S /GoTo /D (section.B.5) >> +<< /S /GoTo /D (subsection.A.3.1) >> endobj 628 0 obj -(B.5 named-checkconf) +(A.3.1 Request for Comments \(RFCs\)) endobj 629 0 obj -<< /S /GoTo /D (section.B.6) >> +<< /S /GoTo /D (subsection.A.3.2) >> endobj 632 0 obj -(B.6 named-checkzone) +(A.3.2 Internet Drafts) endobj 633 0 obj -<< /S /GoTo /D (section.B.7) >> +<< /S /GoTo /D (subsection.A.3.3) >> endobj 636 0 obj -(B.7 named) +(A.3.3 Other Documents About BIND) endobj 637 0 obj -<< /S /GoTo /D (section.B.8) >> +<< /S /GoTo /D (appendix.B) >> endobj 640 0 obj -(B.8 rndc) +(B Manual pages) endobj 641 0 obj -<< /S /GoTo /D (section.B.9) >> +<< /S /GoTo /D (section.B.1) >> endobj 644 0 obj -(B.9 rndc.conf) +(B.1 dig) endobj 645 0 obj -<< /S /GoTo /D (section.B.10) >> +<< /S /GoTo /D (section.B.2) >> endobj 648 0 obj -(B.10 rndc-confgen) +(B.2 host) endobj 649 0 obj -<< /S /GoTo /D [650 0 R /FitH ] >> +<< /S /GoTo /D (section.B.3) >> +endobj +652 0 obj +(B.3 dnssec-keygen) +endobj +653 0 obj +<< /S /GoTo /D (section.B.4) >> +endobj +656 0 obj +(B.4 dnssec-signzone) +endobj +657 0 obj +<< /S /GoTo /D (section.B.5) >> +endobj +660 0 obj +(B.5 named-checkconf) +endobj +661 0 obj +<< /S /GoTo /D (section.B.6) >> +endobj +664 0 obj +(B.6 named-checkzone) +endobj +665 0 obj +<< /S /GoTo /D (section.B.7) >> +endobj +668 0 obj +(B.7 named) +endobj +669 0 obj +<< /S /GoTo /D (section.B.8) >> +endobj +672 0 obj +(B.8 rndc) +endobj +673 0 obj +<< /S /GoTo /D (section.B.9) >> endobj -653 0 obj << +676 0 obj +(B.9 rndc.conf) +endobj +677 0 obj +<< /S /GoTo /D (section.B.10) >> +endobj +680 0 obj +(B.10 rndc-confgen) +endobj +681 0 obj +<< /S /GoTo /D [682 0 R /FitH ] >> +endobj +685 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ÿÚ<Ÿ endobj -650 0 obj << +682 0 obj << /Type /Page -/Contents 653 0 R -/Resources 652 0 R +/Contents 685 0 R +/Resources 684 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 659 0 R +/Parent 691 0 R >> endobj -651 0 obj << +683 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./isc-logo.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 660 0 R +/PTEX.InfoDict 692 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 661 0 R -/R9 662 0 R -/R11 663 0 R -/R13 664 0 R +/R15 693 0 R +/R9 694 0 R +/R11 695 0 R +/R13 696 0 R >>/ExtGState << -/R17 665 0 R -/R8 666 0 R ->>/Font << /R19 667 0 R >> +/R17 697 0 R +/R8 698 0 R +>>/Font << /R19 699 0 R >> >> -/Length 668 0 R +/Length 700 0 R /Filter /FlateDecode >> stream @@ -1019,7 +1067,7 @@ xœu˜;“d9…ýû+®Ùe´R©—lG`XËkz#†10gwÙ~6ßÉ[53}+ˆ}tI%åóäÉT½ßs*{Ö?·¿××í'¿ûŸ? FÑÞIcaÇ0Ú) ¹A¿+ÇÀº
¸|-Tuùa>‚s:½¯•~K“ÒÞV׋„OÒAŠI…
ɪÁr2Q“°Ø¨Á>.z ÏÆ狼eÇNdæÌdï"gK2cëÉ—GoOá8GëÏϦ:B
Àht[ endobj -660 0 obj +692 0 obj << /Producer (AFPL Ghostscript 8.51) /CreationDate (D:20050606145621) @@ -1029,46 +1077,46 @@ endobj /Author (Douglas E. Appelt) >> endobj -661 0 obj -[/Separation/PANTONE#201805#20C/DeviceCMYK 669 0 R] +693 0 obj +[/Separation/PANTONE#201805#20C/DeviceCMYK 701 0 R] endobj -662 0 obj -[/Separation/PANTONE#207506#20C/DeviceCMYK 670 0 R] +694 0 obj +[/Separation/PANTONE#207506#20C/DeviceCMYK 702 0 R] endobj -663 0 obj -[/Separation/PANTONE#20301#20C/DeviceCMYK 671 0 R] +695 0 obj +[/Separation/PANTONE#20301#20C/DeviceCMYK 703 0 R] endobj -664 0 obj -[/Separation/PANTONE#20871#20C/DeviceCMYK 672 0 R] +696 0 obj +[/Separation/PANTONE#20871#20C/DeviceCMYK 704 0 R] endobj -665 0 obj +697 0 obj << /Type /ExtGState /SA true >> endobj -666 0 obj +698 0 obj << /Type /ExtGState /OPM 1 >> endobj -667 0 obj +699 0 obj << /BaseFont /NVXWCK#2BTrajanPro-Bold -/FontDescriptor 673 0 R +/FontDescriptor 705 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 674 0 R +/Encoding 706 0 R /Subtype /Type1 >> endobj -668 0 obj +700 0 obj 2362 endobj -669 0 obj +701 0 obj << /Filter /FlateDecode /FunctionType 4 @@ -1079,7 +1127,7 @@ endobj stream xœ«N)-P0PÈ-ÍQHHÎP endobj -670 0 obj +702 0 obj << /Filter /FlateDecode /FunctionType 4 @@ -1090,7 +1138,7 @@ endobj stream xœ«N)-P0PÈ-ÍQHHÎP endobj -671 0 obj +703 0 obj << /Filter /FlateDecode /FunctionType 4 @@ -1101,7 +1149,7 @@ endobj stream xœ«N)-P0TÈ-ÍQHHÎP endobj -672 0 obj +704 0 obj << /Filter /FlateDecode /FunctionType 4 @@ -1112,7 +1160,7 @@ endobj stream xœ«N)-P0Ð365³TÈ-ÍQHHÎP€Š™X ‹™›#Äô-,ŒÀüZ endobj -673 0 obj +705 0 obj << /Type /FontDescriptor /FontName /NVXWCK#2BTrajanPro-Bold @@ -1125,17 +1173,17 @@ endobj /StemV 138 /MissingWidth 500 /CharSet (/Msmall/C/Ysmall/Nsmall/Osmall/Esmall/Rsmall/S/Ssmall/I/Tsmall/Ismall/Usmall) -/FontFile3 675 0 R +/FontFile3 707 0 R >> endobj -674 0 obj +706 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 127/Nsmall/Tsmall/Esmall/Rsmall/Ysmall/Ssmall/Msmall/Osmall/Ismall/Usmall] >> endobj -675 0 obj +707 0 obj << /Filter /FlateDecode /Subtype /Type1C @@ -1158,42 +1206,44 @@ x¸
\3§gA34–ITž-‹R8õ-ǵÛö2ªWuÉ~Á!"(0Š*FÂ͢ùĨ¸SˆˆoÊQPˆ0¦šåiFäݸVN^_!Ô‚–b ȼLçÇ<;—*X³«¥×ÛGâ_Y1ETïƒ4ˆÒ-U…_>´üØ¢æ}õï÷v¼
§ádù#¹rÛŸå¥@ÔÁ\5l…hð<8Ús· »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 -654 0 obj << -/D [650 0 R /XYZ 85.0394 794.5015 null] +686 0 obj << +/D [682 0 R /XYZ 85.0394 794.5015 null] >> endobj -655 0 obj << -/D [650 0 R /XYZ 85.0394 769.5949 null] +687 0 obj << +/D [682 0 R /XYZ 85.0394 769.5949 null] >> endobj -652 0 obj << -/Font << /F21 658 0 R >> -/XObject << /Im1 651 0 R >> +684 0 obj << +/Font << /F21 690 0 R >> +/XObject << /Im1 683 0 R >> /ProcSet [ /PDF /Text ] >> endobj -678 0 obj << -/Length 994 +710 0 obj << +/Length 999 /Filter /FlateDecode >> stream -xÚµVË’¢JÝû,5¢©¯Z҈ʂ83³°»‰hÅ+8ý÷7¡ªDÐÛ›‰.*«ò˜yòd@4?¢&29åšÅud`bh›ý -Qm]»ÀÒíÏ¡[?NùËk5ú~ÕŒ,ÌrÀ¦v|™ý*Ô˜"ËäV£ŠÂýí´›•"("6 Š±þ0SצњfkZÂòUv:d•Ø%e•íK±q‹CYœªü¼PØ
ÁÀÂÀ¿(ÕýÄØ’šÔÀK/‚F‘aš¦féZÏÏÕUèñ5üŽºÌ‚¾Z¼ú_êÒÿS]ÜêHZ“¶&»«n±«Þק±‡Y_bÔ×ÏĈSÓÖ,Ê€'ŸÉ§Àãkôz¦8¶I³.g™öyYæÅApª -±žËLÖ³yG„¡Üï‹m¾ëœ¬[aló²:åÏçJX½æršÊ›âwÅIýûCÇóéX”ÒýžW¯ÂR¸ú¤8K1w™ÄA‚ºëpßAÜ0hSÚk&ò=Ëø/§54d+Igñ'ßf[Åv])KF_?²V1eÍöPTù&ëÕßÖ{ìÉÚÙZ•Kÿúí©ƒpšTß„ëJ wž•ÍÀàbŽ˜Îêb-ĵH:÷ä˜EÓôiÄéЉ剟ˆuGßý‰7»úæ:‰BÔ;a;áDºÂ˜€8þB‚ †Ì;aê{Òùä§saÅÞ̉'âJÂó•‘nIi~$ é\Q¼C>tƒÕÄg½äþbøª–{L¢©X^ìÎÁ1²ô¡óè~ú£-´fg"®Û–bGvS?
½$AŠƒXCÉ×ûîA<AxÞ2Rz=Jêï<ÒžF±Ê*Ó'KÏõàAi{nÃQ=mÛ#Ñ -½YàϼÐõº™¢&ró°Ðµ é¶\d<b’ëœ2²ûÉE‹h•v©D=Ú@-ô®(·WãrWA NkëË—^ópÚz¦ŸÝš›7‰úôbª¿ˆî~x©|ýá5VÙƺ…˜mÓûo"jÃËbRÍ{õ†8Ì9e&½Ãü_®…dµendstream +xÚµV]“¢:}÷Wð¨UC6|å‘AT¶\ÀÚÚÝGq†ªQ¼‚;5ÿþ6$Qï¼lÝò!ô±ûôI'„h~D3-dqÊ5›ÈÄÄÔÖ»Ö^À7‰ÁšŽãNëügðó7Ö6 +;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á'Ð<s·«gòÙ©¹ù’¨73Qó4ºûSùþú¦«lºa#æ8ôþ—ˆ:ðŲٙTû]½!}N™Eï0ÿýžfendstream endobj -677 0 obj << +709 0 obj << /Type /Page -/Contents 678 0 R -/Resources 676 0 R +/Contents 710 0 R +/Resources 708 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 659 0 R +/Parent 691 0 R >> endobj -679 0 obj << -/D [677 0 R /XYZ 56.6929 794.5015 null] +711 0 obj << +/D [709 0 R /XYZ 56.6929 794.5015 null] >> endobj -676 0 obj << -/Font << /F23 682 0 R /F14 685 0 R >> +708 0 obj << +/Font << /F23 714 0 R /F14 717 0 R >> /ProcSet [ /PDF /Text ] >> endobj -688 0 obj << +720 0 obj << /Length 2891 /Filter /FlateDecode >> @@ -1213,1307 +1263,1364 @@ W±ïëå*¯úoÞæ®x]Δܫ!$j2È¢ 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 -687 0 obj << +719 0 obj << /Type /Page -/Contents 688 0 R -/Resources 686 0 R +/Contents 720 0 R +/Resources 718 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 659 0 R -/Annots [ 691 0 R 692 0 R 693 0 R 694 0 R 695 0 R 696 0 R 697 0 R 698 0 R 699 0 R 700 0 R 701 0 R 702 0 R 703 0 R 704 0 R 705 0 R 706 0 R 707 0 R 708 0 R 709 0 R 710 0 R 711 0 R 712 0 R 713 0 R 714 0 R 715 0 R 716 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R 722 0 R 723 0 R 724 0 R 725 0 R 726 0 R 727 0 R 728 0 R 729 0 R 730 0 R 731 0 R 732 0 R 733 0 R 734 0 R 735 0 R 736 0 R 737 0 R 738 0 R 739 0 R 740 0 R ] +/Parent 691 0 R +/Annots [ 723 0 R 724 0 R 725 0 R 726 0 R 727 0 R 728 0 R 729 0 R 730 0 R 731 0 R 732 0 R 733 0 R 734 0 R 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 ] >> endobj -691 0 obj << +723 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 -692 0 obj << +724 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 -693 0 obj << +725 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 -694 0 obj << +726 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 -695 0 obj << +727 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 -696 0 obj << +728 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 -697 0 obj << +729 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 -698 0 obj << +730 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 -699 0 obj << +731 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 -700 0 obj << +732 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 -701 0 obj << +733 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 -702 0 obj << +734 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 -703 0 obj << +735 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 -704 0 obj << +736 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 -705 0 obj << +737 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 -706 0 obj << +738 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 -707 0 obj << +739 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 -708 0 obj << +740 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 -709 0 obj << +741 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 -710 0 obj << +742 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 -711 0 obj << +743 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 -712 0 obj << +744 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 -713 0 obj << +745 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 -714 0 obj << +746 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 -715 0 obj << +747 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 -716 0 obj << +748 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 -717 0 obj << +749 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 -718 0 obj << +750 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 -719 0 obj << +751 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 -720 0 obj << +752 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 -721 0 obj << +753 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 -722 0 obj << +754 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 -723 0 obj << +755 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 -724 0 obj << +756 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 -725 0 obj << +757 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 -726 0 obj << +758 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 -727 0 obj << +759 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 -728 0 obj << +760 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 -729 0 obj << +761 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 -730 0 obj << +762 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 -731 0 obj << +763 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 -732 0 obj << +764 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 -733 0 obj << +765 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 -734 0 obj << +766 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 -735 0 obj << +767 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 -736 0 obj << +768 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 -737 0 obj << +769 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 -738 0 obj << +770 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 -739 0 obj << +771 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 -740 0 obj << +772 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 -689 0 obj << -/D [687 0 R /XYZ 85.0394 794.5015 null] +721 0 obj << +/D [719 0 R /XYZ 85.0394 794.5015 null] >> endobj -690 0 obj << -/D [687 0 R /XYZ 85.0394 711.9273 null] +722 0 obj << +/D [719 0 R /XYZ 85.0394 711.9273 null] >> endobj -686 0 obj << -/Font << /F21 658 0 R /F23 682 0 R >> +718 0 obj << +/Font << /F21 690 0 R /F23 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -743 0 obj << -/Length 3151 +775 0 obj << +/Length 3169 /Filter /FlateDecode >> stream -xÚí[w·Çßõ)ø(=ÅýòèkNÒÖvlõ¥iÖÔZæ ÉUI*®ûé‹å.€Y;ÚȵD:Çeîìçÿ#ƒ½± õÿ±‰ÒD;î&ÆI¢(S“ÙòŒN®ý{?œ±~›iØh -·z~yö§×ÂLqšëÉ姉TŠpµÛ™%ÔZ6¹¼úåüÅÛ7—¯Þ\~¸øõò§³W—q¯Ð3£¢Ýå?Ï~ù•N®| -
÷ÕÚß«×{qõsq`¬ Þ+ÒM©Ž¬ðž•óëUeû¹î^ü½YùW†ê1(1!«ÅÄ -&ŒŸ{L¡¸ŒrrYÌ 0Ä8ZaœdâÀ8A½NŒlOÀŽ˜¨ƒ˜ÌW³ÅíU£DãØ¡ÉŽeü¨æÉ!ÃÅð$;Œ Ÿ?#6Fæ:€£}MÒ:ÍiôC‘sx|ùÖÇóÿà“5b*‹†#P*’L%¨÷€‰¢DÐI™ƒ˜üVÍM}} rV\„°§Uߘóbž€!ÆÔã)Æê=ð$,4:ö!p:<â(úô:©Úbj’
NŒŸ–Ÿ CsˆážÃ2î 2‹æúº=“,S¨Œòœ:´ž£äQmS\Œ0ÄØbðdâÀèA½|˜ô›;–éCñs‰Îÿç,«?¬á¹,æbœ@0N2q`œ ÞãQ&I9áÔ8@J{<Òö§-ïC£©ïªe˜õÎ>W«U[õóƒœTJ÷Û½û¼®6ž-øqÍjBz‹á†<P>1~q@.Ô{„G8‹íT»ƒxü@rݬs3I‰¶æ<’Ú£ªP1½¥ð@Cž|’ŽÂ“‹÷ÞW(a,aR‚ -uøhÕâ˺Î-ôq_Ÿ",cÓ®ô÷Œé.F b(A9åøi½¹80”Pï%==”0þ (žéHæžÐèÒZŒ0IJÉñ3örq`È Þ2JjOÈ>Rµ¬6ÛöúøüüX:}°¿ÒÇU½BŽ‹ù†?PCŒŸL?¨÷Àä„J§?ò¡ø¹OåssYÌ 0Ä8ZaœdâÀ8A½ND;á…ÝÕáCUÍM+õ&ÀÁú½<TÅŽkjr\Ì0ÄøbüdâÀøA½~˜!ÎjP§ôCñsŸVòQ×£ËbN€!Æ ÔJŽÏÅq‚zO8UÄ) *’ë8Ï›fQW½¨o{:¦J¸#>ÚÓU0Ä`€rÈñE½\¨÷w‚8Î-„¡_—yݬ¿TÝVv—KÊO—ÙˆÙ+e"lÔQã½r.„
Ü{bÃújá`ë£Û»‚µl¼¼ÓͶšývçŽ`âû»dé[1UÅ -˜1oÅT -¨‹¿ð(Fê=Q!1zØ}˜ŽŠî.´-—Žž¯«ÕæÓnR¡;aWŒ0Ä°€Â¨ñ¦4†ê=aÁ1b؇ؾ)ÂâÂËwÝ‹wñ£ý-W,WÇÅBÈV1Àcª¡Æ{Ò\¨÷ÄuÄP6(®cáíÍàNç¾n¶õ2Ý -ívWJfñzËùŽ©×:eL@±¼À“&“7&/ê=ÊËœ!Z;9X¢¾øÇ>ò †é'Þ8Ä• -¦bÍ¡ç·ýý•õÑÞ§–>Ŭ$;(Öø¡¯L(˜ëÄ WDš;Šî@y~;_l§áÑ&ЯÌWŸv"ˆgEü»YµëßƸGy¶LÌB±¾ÀxåñÕé\˜Ä¨÷¤1DÊ;=ˆÉiüjy³ýšž“ÕÑæ8Ž_Å$# +xÚí[wÛ¸Çßý)ôh?Åýò˜ûɶM²±ûÒí>02#ëD]INÖýôEZàÈhãlli÷ìÚ‰9œñüÂ`@‚d#êÿe#¥‰vÜŒ“DQ¦F“Å MýÏÞœ°ö˜q8hz~qò—×ÂŒqšëÑÅç‘TŠpµ=™%ÔZ6º¸üíôÅûw¯Þ]œŸý~ñËÉ«‹xVè™QQŸòß'¿ýNG—>€_N(ΪÑ7ÿJ˜s|´8‘J%…3?9?ù5žütkšüM%\hžøU¸ +vch¸«Öîùk½¸Þ‰#¨ŸŠcõX‘†hJud…·¬œÏ¦ËÊæªl¾ùgµôßªÄ Ä„¬f1b j1‰80bPÒÖEbDKÌ‹jù/Jùôf¹9/W_ËU=Æ0q¨¨2ò˜Í0Ä:q3ÌH"ŒÔ»a~ÈѾ<r_Õ„á-$Î#B=o?|Õ-7××ÕjÓüa¶l¾>ûîeó7pœ=ÞAæ‡ +% +î½År¢` +‰80Pï¡¿U¢.0:~¿þöͪX,ŠzõȈc{{—Ñl\€!†TLÈa\q`¸ ÞÃ4„s¢¸•¥®+ÞýÁˆµTzõQÅdÞÓ‚áŒÛö˜óM±)»iL¤Ëp{ìcγy†OPS¡†yJÄñ„z<ùÃ¥'þ8í/eÖ±§7µ©Í¦¦³Ã ÂaÌì!ƒ¹n‰‘Ωc#ĉ؋̤ZnVÕ|àF8B™à{†!eÝ“††Ð‰9Îe"ðô4DèIÅàƒ{üX?÷宫`òÁø¹ÇZñÇ€Ë '!—Ùœ +©Í¦¦³Ã ‰áÛòA`È`®1ÜsbX‡ŒÛ‹Ì¼šNë;É…Êø!Ï©}ë9JÔ݆1ÅÙè +úlÄìå²
6zê¨á^9Âî½cÃújá`ë£ë§‚Õl¼¼)æãõ¦˜|¹óD0ñómYúƒDLU6ÀJ¡†g©80PïÚ«\¯bÈ„g“IÜ +ý¢¾Á®/ªy]4Žûž»Äec1, 0‰80,PïÊËM¯v¨‹·KßÀ~.<gcMÙqûbÀl<€!†H
ïHJÅázïðŠ§ÄC7xüzSÖ/Ú>Ð
>PAs¤"æ-› +`ˆQuQÃRq`T Þ;*„ F÷»ÓPÑ<…¶†ââÌÑÓU±\ÞN*”aG,bâ²± endobj -742 0 obj << +774 0 obj << /Type /Page -/Contents 743 0 R -/Resources 741 0 R +/Contents 775 0 R +/Resources 773 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 659 0 R -/Annots [ 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 797 0 R 798 0 R 799 0 R 800 0 R 801 0 R 802 0 R 803 0 R 804 0 R ] +/Parent 691 0 R +/Annots [ 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 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 ] >> endobj -748 0 obj << +780 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 -749 0 obj << +781 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 -750 0 obj << +782 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 -751 0 obj << +783 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 -752 0 obj << +784 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 -753 0 obj << +785 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 -754 0 obj << +786 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 -755 0 obj << +787 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 -756 0 obj << +788 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 -757 0 obj << +789 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 -758 0 obj << +790 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 -759 0 obj << +791 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 -760 0 obj << +792 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 -761 0 obj << +793 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 -762 0 obj << +794 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 -763 0 obj << +795 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 -764 0 obj << +796 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 545.4324 511.2325 554.3887] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.2.2) >> >> endobj -765 0 obj << +797 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 -766 0 obj << +798 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 -767 0 obj << +799 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 -768 0 obj << +800 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 -769 0 obj << +801 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 -770 0 obj << +802 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 -771 0 obj << +803 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 -772 0 obj << +804 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 -773 0 obj << +805 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 -774 0 obj << +806 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 -775 0 obj << +807 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 -776 0 obj << +808 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 -777 0 obj << +809 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 -778 0 obj << +810 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) >> >> endobj -779 0 obj << +811 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.12) >> >> endobj -780 0 obj << +812 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 353.0252 511.2325 362.0313] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.13) >> >> endobj -781 0 obj << +813 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 340.9936 511.2325 349.9997] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.14) >> >> endobj -782 0 obj << +814 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 328.9619 511.2325 337.968] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.15) >> >> endobj -783 0 obj << +815 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.16) >> >> endobj -784 0 obj << +816 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 304.8985 511.2325 313.9046] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.1) >> >> endobj -785 0 obj << +817 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 292.7672 511.2325 301.873] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.2) >> >> endobj -786 0 obj << +818 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.3) >> >> endobj -787 0 obj << +819 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.4) >> >> endobj -788 0 obj << +820 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.5) >> >> endobj -789 0 obj << +821 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 244.6405 511.2325 253.7462] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.6) >> >> endobj -790 0 obj << +822 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.7) >> >> endobj -791 0 obj << +823 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.8) >> >> endobj -792 0 obj << +824 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 208.5455 511.2325 217.5017] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.9) >> >> endobj -793 0 obj << +825 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 196.5138 511.2325 205.4701] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.10) >> >> endobj -794 0 obj << +826 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.11) >> >> endobj -795 0 obj << +827 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 -796 0 obj << +828 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 160.4187 511.2325 169.375] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.13) >> >> endobj -797 0 obj << +829 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) >> >> endobj -798 0 obj << +830 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 136.3554 511.2325 145.4611] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.15) >> >> endobj -799 0 obj << +831 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 124.3237 511.2325 133.28] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.16) >> >> endobj -800 0 obj << +832 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) >> >> endobj -801 0 obj << +833 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) >> >> endobj -802 0 obj << +834 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.19) >> +/A << /S /GoTo /D (subsection.6.2.17) >> >> endobj -803 0 obj << +835 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) >> +/A << /S /GoTo /D (subsection.6.2.18) >> >> endobj -804 0 obj << +836 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) >> +/A << /S /GoTo /D (subsection.6.2.19) >> >> endobj -744 0 obj << -/D [742 0 R /XYZ 56.6929 794.5015 null] +776 0 obj << +/D [774 0 R /XYZ 56.6929 794.5015 null] >> endobj -741 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R >> +773 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R >> /ProcSet [ /PDF /Text ] >> endobj -807 0 obj << -/Length 3351 +839 0 obj << +/Length 3439 /Filter /FlateDecode >> stream -xÚíKs7€ïú<¤j¥ƒ°x€ÝÖ^v”rd¯$W¶6É&ÇËâPáÃŽ÷×/†`š"¦%8~ÈJ‘’¦§›Ýß4ºÌõ¨ûõŒ"TXÙÓVE™ê
&;´7r{¾Ãü1ûá }xÔáåÎߟ ݳļè]¾ç2„Ãz—Ã_w^ž]žœ]^ìý~ùÓÎÉe<)T̨¨ÏøÇί¿ÓÞÐéÿi‡aê}p?P¬å½ÉŽT‚()DøÍõÎÅοã Á_W¢©¢„!Êpø$\€OÂ8'Æjg²¤îoõG)wŠëâgàpÁˆ1T:õa‹Ùr¾(‡ûïÊs0<·2ÄrSøƒ/ýE9)«ÅÞ>Wt÷ù¬?™ôg{ûFÒ]²·¯èx‘Ö~ŠÜ€+nHÁ)k}º¡Ù¨×¼9‡1rûPp3f›ç_ÅÌlØHÙƒjo‰‘šZ³H§_”˜ãò7Jy5^Œ§Uó›~5lÞ¼ž÷GeýV<LN: .Ìb€¬…$aª½D(¢9³- ìN@ÞË 0¸tH«;R‰âÁ¤’Ï™_î Spw6L@ƒi-œL ;0˜Pí-L\]¦…‰˜îÎ2…-¾?v:¡ n͆bЬ…
&a
ª½…†9+ZhÄÐüoZ•ih¨¶ú®dÌcN=wÁÜ
Ä`Z§í†)aª=ÂTXKŒ*d“ü"0Ý´bgØŠnÍ… -"Ь…MóNhRv ÐàÚ™’Dkm{…ÑÄR& -PíqPÖ•”ÊÚH÷ƒÀñx>X&Âýó B~Óðë¹öèÃ\B BÈZŒBRv „àÚ[B%‚J ž‹r±W#?ª_¾Xq ·õe>?ÁÃÙü -îßÜD˜Æ>眾zïæFl[‘èÅlF€ ÆŒÆHÂŒT{ˈr`XÙ¶"Ê3òrqUÎn7¿«%•qS–ã÷u»"${ÊãPðb6#@cFÉtO¨§ìÀAµÇzUII¤°¼e$¶/®¥L¬Ø®f2,ÆýðòüôùéYbÑNj"‰þ¸5¤ööbu[th6.@ÃÃ%a†ª½ÅEp"d -™¯øJ}z'ÁUÙ -„„¨ö‚«sIÁLÛéhÂÁp¸Úõ¦ÓZžMg“þÂU®….¶MNt`.PÁc-@¦{‰?e‚Ǧv–¸§Dj7àPêë½µa›—‹r°œ›ŸŽ¦.?ËY¿Y÷ïô[8µ3à~þ›ožwå/Õí/p:ÌOZSkŸ²àDKåÅV5~½öy0”óytËb•×¦þ‚z1ž/V“Û5Ïü«.8<ûª‚ØUŠQ”°£ ÕiR”hKý’Ií-wéÛ2Éüˆyt5›N‰UHB%‡Õ+‰±Úኰÿ³\,ÇÃÔ©q¨Ø_ÁÿbCP³‰‚±Ó½÷#eF,ª½-#œ€JdÛuùd}¨˜ãÒæø2Â5uáIõ¾©§U³AYâé$ÄN®‚ç³¹‚W0²W ;0®Pí-WuOj(‹\…¥¾×ó8óžnA\b,©oÞ™ÖÞ46ÆÏ–Õ Ùê.õSl;¡ -nφ -bPÁ°bP%ìÀ BµÇá•Ib¹ô›#ãFµÎ‰my«UñÄ; >ÍbÀÀ˜aÀ$ìÀ€ÙОꂄç'ü«ÆwA—{Œ±ÝÙtù溜_¹ñ«ÎG]î‰g¸o³fgݲî›àéwljM]?¸Ñ[ù)òØëM'“°ïâU3L;ÏLêi)·Mö¼œ{A9äzZ‹!Âͦ>˜ê8¤‹Âjý]˜Æoè[/þæ{åjêo?û0½s×Õ?›Ÿ®¦š7ƒ~Xlo^ê{ÔFÍ^@Ÿ³§Ëp†«~<í_=ŽþåR93h¼>ÉŽ6Ľæs$Þ ;°€£Úc¾Pš¸^Õ÷Ò« -®N§Õ ‰X]ÌÇb.îÆ=ºêW£µÏƳq˜’<[NÞÔ3ÔÎŒGPÈG7e3 -Ê -ÑY¹(@A…µ` (¤ì@PÀµ‡$Â&’ -æIàMy^Vå,TX1Èçå[?RWán›Óêíj!x5]Vاµþ}—
ÄÀ€±±Ý›Rv`` ÚÛ¡‘~ïõA3™_§ˆÓWï͇áÞšpÇÝo®ž;pÿÜ«;¼z»5 ¸1›‘VC #dÓLuL… ÒòÀ‡hÇáøÍõx:šõo®>¶HÄÑáb9•õóöBBé]w×Ð"8"i#x. ˆ1#ƒA‘°£ÕÞ¦
ňº\„¼q^þ±t¡oï°!bâËÔÀÊù³£y„üiÔšÑeÙ@ -Íýñ¬ÿ¶ÆÀZ¾mLîÃLðj63@cFÍv¯µ¤ìÀ˜Aµ·Ìp]?QDfDø«æx:X‚Ôqð&Îö6-ˆbO%{_e“ -QxTRÕŸ”ÃýÁU9x7˜Vo÷ê‡âm úd‚‚³ ‚A0†Œv¯P§ÁBÕG‚„ Vß¹Ô·VÞ"ȧ"µÍAŸNPðq6A@#Ʊî¥ÁBÕG‚8'”‹Ðði@k„Ú–Ý_¡ì1È&b„Á3†”Ý C0ÂPõ‘0F -LèòLCجœw™Ù¶w_·lÜ€ †8cÝ·4¦ÁpCÕܬ!Œ…tæ¿ÌMØÎkɪÎJ<,€Õ߶¢·7"~}˜rlÅ +xÚí[SGÇßùzت…zû~Ù}Ø€R1öbRÙÚ$²4SAÑâýôÛ£™î9B=Gô&W +æÌ9:ÿßœ¾Îˆõ¨ÿÇzV*œì'‰¢Lõã=Úù÷Þì±æ˜ÃpÐ!<êÕåÞß^ÓsÄi®{—ŸÀ¹,¡Ö²ÞåðÇýãwç—§ç—~¾üvïô2ž:fTTgüuïÇŸioèý»G‰pVõîü/”0çxo¼'• J +þr½÷aï_ñ„àÝ•iêƒ(a‰²Ü$> à“0ΉuÆG§Ñ¿W}M8á´ú þpŒXK¥÷Q6/f·Å¬9žUø¸µÖÍaýE1.&‹ƒC®èþIñ¥|R.Êé¤þK2¬_|?Cëè>98TôQ~Hç²îɸ%šSÖftCŸÙ¨W¿¸€Š»Ch¸©ØæùWŠé8©80^Pï-/Ò¥(oya[yYÌ–óE1<ü¥ø<OP£,qÜvPófÖû3‡|L8~*Ûˆ 9Í&bĬif»‰Iăzo‰ŠHm1ü‹³½Îp%¾²’R˜
0Ä +a~ˆã%üOEÄJÌË?þ|SÌ}†äï°<B )Ìbh@‰08q`x Þ[@4'ÎÈ! ¼äøº?÷HÊ¿&$¾8'Ûp ÍÆb¸@ÁŒèÆ%†ê½ÅEQß q÷ëÉ»›ªÅ¨Ðá»2u™Ëæb\@e0.q`\ Þ[.¼elYsqòyÒ—ƒ¦ßp3ô]Œúõûéu9(«VG*õle‰É–b²ÃÄ›î9ÚT˜ì¨wßGuVˆžÿ•î»µê¾0ºV ^—×þ•Rî«oAžtÇ5ÈÍ0ă2ÓÍX"Œ1Ô{;Öa’hi"dUÿ•qºÖmX›~ª^óérvÀìþ LWÎï
c~¸*š‘Íb6¡S|UŒý +è½R\l—Ö +ö"{!aÙ8 + !BÁš¦{º+Bî=6ÊX")k)àM#pRÎË„Üoÿ(òQåì™õ˜ÃlB€!FÔÈÒnBq`„ Þ[B´Ç‚9
!ŠÅ¢œŒšVýò»r׿Ìç'd8›`ˆñÄøIÄñƒzoùñ
¦åG6üœMn‹Yè¾íßÜD˜Ê¦æœ½¿õs+vC‘˜ÅlF€!ÆTɲnFq`Œ Þ[F$'ÌQ
#ïWŬ†áþàwµRÖÝ’Á¢¼†+B²—Ü…,f31F J#‰80FPïmUPB +”Êv/Ô¥âÀ@A½· PEu‘Šïù¦Öÿ5±Òu@bgZþñ:/!ÅÙ +d»—rSq`x ÞÚžÔŽh-¶VÙ¬éUEÂÕ0T»ÄÊù¢Tû…ønùîwã2ž0Äp‚Šb8%âÀpB½Ç~‹TÆ°È¡kã¡
¢ÚÂã,‰Ól1aÙ8 +,¯ËÅçZâ»rqUO·Ö'0¾- áæÚÕ4Db†ÊoP±÷™Ñâ©uº€ˆ)Ë"@¬Ib»wé¤â@€ØôΩFÍl³9¤2®Í+…c1XÎ"ÇÓɼ³~½Y¼3oáÔ>€‡ålF¼yÞU¾º÷³ÀÓayÚðš\͉º^¾4«^M5¸>Šy¬‡“Åj2lÚÌÂ|ç«åê=¹iç_u!áÙW0Ä®:((FQ"Œ&Ô{¤IQ"•4¥và‡]ŽIÖ”Ïã«ÙtºH=NÅË}CßVmMLð:"”áVÁb±,‡©SY߀HÛö·}ÿ?ÄQ³‰†±×½Ë&F,ê=ÿ…7†Ë€l»™;¹¨ ˜çÒæøúÑCuÒú°ÓÉm½œ0Ô÷² +-^NAìä*d>›+`ˆq•Å¸JÄq…zo¹ªn[t´å*ìý~·k¥×Œög`,>pª«¬Qbh\M}½œê»¢¥y m'T!íÙPC*(+U"*Ô{l^™$œÚÀT¸»©ó~¶¶{k”ÞMY¦ 9ÍbÀ@Í0`q`ÀlxO‚¸cD«æy4¶]0ÆögÓåÇëb~åÛ¯ªu¥'žá¡ƒh€vÖ"sÝK@ðtH:6½¦®nQ¦yÒŠƒãéxv뿯ÛiŸšq5˜—r7¶É¾¤bšs/)hˆ\Rk2bì$âÀB½Ç†ëj’ˆ†bñlñ×fÀ<™6+¹›Î~ñ×?êß®¦wõ‹A?lÓ®TÏ4Õw‘5…{ºg¸êÇÓÞ5]ÈÑ?}=gö 5º!%Ùz·v˜Ü á˜Ú›A`bc®c½PŠÄjÁ›jq6ÔRU]ùØ•‹7p_õ'£µ^X*Ã.–óåøc5ù,´{Ýø&IÙÚG3LúV +iµÚÆÝ®³•õ„äf_=À»z x1‰80rPﱳŜ&š5wpÕ½-W]Bu¥}5+‹æöÚoÊùb:û¼~Ïml~OÎ?Ük§ëµ MÙóA!&+hˆ °&‚B*Ü{("ÌJ¢¸$𺈼)&Å,ô«¢Èŧ¦¥Ž5Î&ŸV;†WSdÚ½¬5§˜»l0€!ÔÆu/ý§âÀÀ@½·5Âp"esæQ=ƒ_Õˆ³÷·º¹è‡Ãð†ðl–Ÿ|‡îÈÿç²jÑÞìvýÆ<fS1J N%‰80JPï±|hJ„VQ—WåÇër:šõo®>·\Ä6âÃr4*ª‡±‡²Òú‘]Œàü…¹l,€!†TÃ"†ê½-Òìms¯åQý,§ªx\¿.½ôµð¾é[!ÆMg5°rñúx^a=Θ²l €!”"ê½Bhâ£hàMkRíïš„!þɬÿ©ÂÀ9¾ž`Ì¢…5mVÊLcw
SÌÜ?¥£ÝË,©@0hP÷-4\Æšû(êG½TЀ§0œLKP;Ž>Æ9Þz$¢Øs/Aª«l€!†ÔE!†Â†ûÔ|£Œ(mê9ËWU« ößö'ñ`7ýQjÚ'Ĭ·MûÄœ +·?,GϪl~·q59r¯;`‡\vPlŒ°Dh¨ïÀ™1DRÑ`ÆkÌ®¦UçM™g:g¹˜µfe@jF‘ïÛû¢Äq|®°"‚‡J&šJ6™Ï‹Aõ=]£ê™RªHAM¶s jÍ‚€’ŒZä¡ä÷CØ (~'å!wÄZ›j3ýÿŒ8Ußâþû¾³ý¢Îê¹K¶ë«Åu>r*{Õ‰úRQÈžÚÕA òÿ¼ÔAªendstream endobj -806 0 obj << +838 0 obj << /Type /Page -/Contents 807 0 R -/Resources 805 0 R +/Contents 839 0 R +/Resources 837 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 659 0 R -/Annots [ 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 864 0 R 865 0 R ] +/Parent 691 0 R +/Annots [ 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 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 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 898 0 R ] >> endobj -809 0 obj << +841 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.19) >> ->> endobj -810 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 746.5215 539.579 755.4777] -/Subtype /Link /A << /S /GoTo /D (subsection.6.2.20) >> >> endobj -811 0 obj << +842 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 734.5663 539.579 743.5226] +/Rect [527.6238 746.3946 539.579 755.3509] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.21) >> >> endobj -812 0 obj << +843 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 722.6111 539.579 731.5674] +/Rect [527.6238 734.3125 539.579 743.2688] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.22) >> >> endobj -813 0 obj << +844 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 710.656 539.579 719.6122] +/Rect [527.6238 722.2305 539.579 731.1868] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.23) >> >> endobj -814 0 obj << +845 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 698.8005 539.579 707.6571] +/Rect [527.6238 710.1484 539.579 719.1047] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.24) >> >> endobj -815 0 obj << +846 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 686.8453 539.579 695.7019] +/Rect [527.6238 698.0664 539.579 707.0227] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.24.1) >> +/A << /S /GoTo /D (subsection.6.2.25) >> >> endobj -816 0 obj << +847 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 674.7905 539.579 683.7467] +/Rect [527.6238 686.084 539.579 694.9406] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.24.2) >> +/A << /S /GoTo /D (subsection.6.2.26) >> >> endobj -817 0 obj << +848 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 662.935 539.579 671.941] +/Rect [527.6238 674.002 539.579 682.8586] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.24.3) >> +/A << /S /GoTo /D (subsubsection.6.2.26.1) >> >> endobj -818 0 obj << +849 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 650.8801 539.579 659.8364] +/Rect [527.6238 661.8203 539.579 670.7765] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.24.4) >> +/A << /S /GoTo /D (subsubsection.6.2.26.2) >> >> endobj -819 0 obj << +850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.6238 649.7382 539.579 658.6945] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.6.2.26.3) >> +>> endobj +851 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.4) >> +>> endobj +852 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 639.0246 539.579 647.8812] +/Rect [527.6238 625.6738 539.579 634.5304] /Subtype /Link /A << /S /GoTo /D (section.6.3) >> >> endobj -820 0 obj << +853 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 627.0694 539.579 635.9261] +/Rect [527.6238 613.5917 539.579 622.4483] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.1) >> >> endobj -821 0 obj << +854 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 615.1143 539.579 623.9709] +/Rect [527.6238 601.5097 539.579 610.3663] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.1.1) >> >> endobj -822 0 obj << +855 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 603.0594 539.579 612.0157] +/Rect [527.6238 589.328 539.579 598.2842] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.1.2) >> >> endobj -823 0 obj << +856 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 591.1043 539.579 600.0606] +/Rect [527.6238 577.2459 539.579 586.2022] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.2) >> >> endobj -824 0 obj << +857 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 579.1491 539.579 588.2549] +/Rect [527.6238 565.1639 539.579 574.1201] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.3) >> >> endobj -825 0 obj << +858 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 567.1939 539.579 576.2997] +/Rect [527.6238 553.0818 539.579 562.1876] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.4) >> >> endobj -826 0 obj << +859 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 555.2388 539.579 564.1951] +/Rect [527.6238 540.9998 539.579 550.1055] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.5) >> >> endobj -827 0 obj << +860 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 543.2836 539.579 552.2399] +/Rect [527.6238 528.9177 539.579 538.0235] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.5.1) >> >> endobj -828 0 obj << +861 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 531.3284 539.579 540.2847] +/Rect [527.6238 516.8357 539.579 525.792] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.5.2) >> >> endobj -829 0 obj << +862 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 519.3733 539.579 528.3296] +/Rect [527.6238 504.7536 539.579 513.7099] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.5.3) >> >> endobj -830 0 obj << +863 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 507.4181 539.579 516.3744] +/Rect [527.6238 492.6716 539.579 501.6279] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.6) >> >> endobj -831 0 obj << +864 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 495.4629 539.579 504.4192] +/Rect [527.6238 480.5895 539.579 489.5458] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.7) >> >> endobj -832 0 obj << +865 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 (section.6.4) >> +>> endobj +866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.6238 456.4254 539.579 465.5312] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.6.4.0.1) >> +>> endobj +867 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.6238 444.3434 539.579 453.4491] +/Subtype /Link +/A << /S /GoTo /D (subsection.6.4.1) >> +>> endobj +868 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 (subsubsection.6.4.1.1) >> +>> endobj +869 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.2) >> +>> endobj +870 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.3) >> +>> endobj +874 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.6238 396.0152 539.579 404.9715] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.6.4.1.4) >> +>> endobj +875 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 473.5253 539.579 482.2574] +/Rect [527.6238 373.4431 539.579 382.1752] /Subtype /Link /A << /S /GoTo /D (chapter.7) >> >> endobj -833 0 obj << +876 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 461.59 539.579 470.5462] +/Rect [527.6238 361.3809 539.579 370.3372] /Subtype /Link /A << /S /GoTo /D (section.7.1) >> >> endobj -834 0 obj << +877 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 449.6348 539.579 458.5911] +/Rect [527.6238 349.2989 539.579 358.2551] /Subtype /Link /A << /S /GoTo /D (section.7.2) >> >> endobj -835 0 obj << +878 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 437.6796 539.579 446.6359] +/Rect [527.6238 337.2168 539.579 346.1731] /Subtype /Link /A << /S /GoTo /D (subsection.7.2.1) >> >> endobj -836 0 obj << +879 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 425.7245 539.579 434.6807] +/Rect [527.6238 325.1348 539.579 334.091] /Subtype /Link /A << /S /GoTo /D (subsection.7.2.2) >> >> endobj -837 0 obj << +880 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 413.7693 539.579 422.7256] +/Rect [527.6238 313.0527 539.579 322.009] /Subtype /Link /A << /S /GoTo /D (section.7.3) >> >> endobj -838 0 obj << +881 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 391.8316 539.579 400.5637] +/Rect [527.6238 290.4806 539.579 299.2128] /Subtype /Link /A << /S /GoTo /D (chapter.8) >> >> endobj -839 0 obj << +882 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 379.8963 539.579 388.8526] +/Rect [527.6238 278.4184 539.579 287.3747] /Subtype /Link /A << /S /GoTo /D (section.8.1) >> >> endobj -840 0 obj << +883 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 367.9411 539.579 376.8974] +/Rect [527.6238 266.3364 539.579 275.2927] /Subtype /Link /A << /S /GoTo /D (subsection.8.1.1) >> >> endobj -841 0 obj << +884 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 355.986 539.579 364.9423] +/Rect [527.6238 254.2544 539.579 263.2106] /Subtype /Link /A << /S /GoTo /D (section.8.2) >> >> endobj -842 0 obj << +885 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 344.0308 539.579 352.9871] +/Rect [527.6238 242.1723 539.579 251.1286] /Subtype /Link /A << /S /GoTo /D (section.8.3) >> >> endobj -843 0 obj << +886 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 322.0931 539.579 330.9498] +/Rect [527.6238 219.6002 539.579 228.3323] /Subtype /Link /A << /S /GoTo /D (appendix.A) >> >> endobj -844 0 obj << +887 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 310.1578 539.579 319.2636] +/Rect [527.6238 207.538 539.579 216.4943] /Subtype /Link /A << /S /GoTo /D (section.A.1) >> >> endobj -845 0 obj << +888 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 298.2027 539.579 307.3084] +/Rect [527.6238 195.456 539.579 204.4123] /Subtype /Link /A << /S /GoTo /D (subsection.A.1.1) >> >> endobj -846 0 obj << +889 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 286.2475 539.579 295.2038] +/Rect [527.6238 183.3739 539.579 192.3302] /Subtype /Link /A << /S /GoTo /D (section.A.2) >> >> endobj -847 0 obj << +890 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 274.2923 539.579 283.2486] +/Rect [527.6238 171.2919 539.579 180.2482] /Subtype /Link /A << /S /GoTo /D (subsection.A.2.1) >> >> endobj -848 0 obj << +891 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 262.3372 539.579 271.2934] +/Rect [527.6238 159.2098 539.579 168.1661] /Subtype /Link /A << /S /GoTo /D (section.A.3) >> >> endobj -849 0 obj << +892 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 250.382 539.579 259.3383] +/Rect [527.6238 147.1278 539.579 156.0841] /Subtype /Link /A << /S /GoTo /D (subsection.A.3.1) >> >> endobj -850 0 obj << +893 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 238.4268 539.579 247.3831] +/Rect [522.6425 135.0457 539.579 144.1515] /Subtype /Link /A << /S /GoTo /D (subsection.A.3.2) >> >> endobj -851 0 obj << +894 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 226.4717 539.579 235.4279] +/Rect [522.6425 122.9637 539.579 132.0694] /Subtype /Link /A << /S /GoTo /D (subsection.A.3.3) >> >> endobj -852 0 obj << +895 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 204.534 539.579 213.2661] +/Rect [522.6425 100.3916 539.579 109.2482] /Subtype /Link /A << /S /GoTo /D (appendix.B) >> >> endobj -853 0 obj << +896 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 192.5987 539.579 201.555] +/Rect [522.6425 88.3294 539.579 97.4352] /Subtype /Link /A << /S /GoTo /D (section.B.1) >> >> endobj -854 0 obj << +897 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 180.6435 539.579 189.7493] +/Rect [522.6425 76.2474 539.579 85.3531] /Subtype /Link /A << /S /GoTo /D (section.B.2) >> >> endobj -855 0 obj << +898 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 168.6883 539.579 177.7941] +/Rect [522.6425 64.1653 539.579 73.2711] /Subtype /Link /A << /S /GoTo /D (section.B.3) >> >> endobj -856 0 obj << +840 0 obj << +/D [838 0 R /XYZ 85.0394 794.5015 null] +>> endobj +837 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R /F39 873 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +901 0 obj << +/Length 618 +/Filter /FlateDecode +>> +stream +xÚí˜MoÓ0Çïù>.?óã÷ç:´!í0ËmÚ¥]AÐL¬$>=v›8FÙ†XUUMëçÕÿŸ\ÛÈDx!3,IbŽ4†µÛJ°M{[aoÃ#žZ5Õé…rŒ€¬´¬¹cÚf̃ðY³º9yóîª9¿j®ëÛæ²:oƨif*†üVÝÜ +¶ +\Vyþ‡/H²m¥£•~ùZ]WïÇ€ÉèÞ5Û +ÊÊL+R%8«l(ÎPxC±“3Ð5'E'«n·[·|÷yÓý¸ïÖ5×Z@Íÿõ‡&z~”ß0Ð ¡0ÃãTOt{Ø°ÃÇDÉѧŽS%§ñ£”ˆbÂã€F®HÅô#HÚu{̤îãv½âí§uû¥½ïîjn<ôd‚†9^LPâX"(ÕQÍ”)¤DP1ýH2à$ROÔ/Eæ¸= aŽ”8–J5DÔóe +)TL?$8k}OKª¹'óþÂþ:Z"lÐ`1a‰c‰°TcD;OX¦aÅô#aˆàCÖž0 ì¡[µavÑ¿vÀþnƒ ‹qKK¸¥‚#Ò<n™BJ¸Ó¸Y"ðÆê·}öÓ‰©”@¨c†hI„ýNkoù(¨Å¸ë-ˆ¾$†£PK1L>åüÞ>WHÃrúCÄp´àº_öx„m³îj®P—¸—…j˜öÅP%Ž%¨RYQÊy¨2…L o'â´õ*wAÞdŒ|þuȯ[›p¼PÞË|»Ò §ˆ…-dŒ›ß5ôFIå?Vê‹çendstream +endobj +900 0 obj << +/Type /Page +/Contents 901 0 R +/Resources 899 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 691 0 R +/Annots [ 903 0 R 904 0 R 905 0 R 906 0 R 907 0 R 911 0 R 912 0 R ] +>> endobj +903 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 156.7332 539.579 165.8389] +/Rect [494.296 758.4766 511.2325 767.5824] /Subtype /Link /A << /S /GoTo /D (section.B.4) >> >> endobj -857 0 obj << +904 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 144.778 539.579 153.8838] +/Rect [494.296 746.5215 511.2325 755.6272] /Subtype /Link /A << /S /GoTo /D (section.B.5) >> >> endobj -858 0 obj << +905 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 132.8228 539.579 141.9286] +/Rect [494.296 734.666 511.2325 743.672] /Subtype /Link /A << /S /GoTo /D (section.B.6) >> >> endobj -859 0 obj << +906 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 120.9673 539.579 129.9734] +/Rect [494.296 722.6111 511.2325 731.7169] /Subtype /Link /A << /S /GoTo /D (section.B.7) >> >> endobj -860 0 obj << +907 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 108.9125 539.579 118.0182] +/Rect [494.296 710.656 511.2325 719.7617] /Subtype /Link /A << /S /GoTo /D (section.B.8) >> >> endobj -864 0 obj << +911 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 96.9573 539.579 106.0631] +/Rect [494.296 698.7008 511.2325 707.8065] /Subtype /Link /A << /S /GoTo /D (section.B.9) >> >> endobj -865 0 obj << +912 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 85.0022 539.579 94.1079] +/Rect [494.296 686.8453 511.2325 695.8514] /Subtype /Link /A << /S /GoTo /D (section.B.10) >> >> endobj -808 0 obj << -/D [806 0 R /XYZ 85.0394 794.5015 null] +902 0 obj << +/D [900 0 R /XYZ 56.6929 794.5015 null] >> endobj -805 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F39 863 0 R >> +899 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -868 0 obj << -/Length 69 -/Filter /FlateDecode ->> -stream -xÚ3T0 -endobj -867 0 obj << -/Type /Page -/Contents 868 0 R -/Resources 866 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 659 0 R ->> endobj -869 0 obj << -/D [867 0 R /XYZ 56.6929 794.5015 null] ->> endobj -866 0 obj << -/ProcSet [ /PDF ] ->> endobj -872 0 obj << +915 0 obj << /Length 2197 /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ž -ôœA)*ìaˆÔqf§†d -DÖñ›Öñ R -}å7A,û+£c”ú…%%”Æ8yÿiU¢¿^OI¢0SÔƒ©C>”‚e”<÷á!8|V5T•ËãWóø·áÕÓØøú*ÉsUž›vð>¯Jœ‹–D‚A G -OyùœCÖ•“¦Ï@´64* >2óNgÃŒ&ÌõÀçUlN¾.ÝR Ñ#ë›0Hõ§øn*·Ø†¤°ÝàK{hîôËŒB/-RvÍi¢n0‚b‰ÒHUéŒ -êj»^¬ûh‚*"¸‘K4Ñ·õ3v£®tgihM2îc`ˆŠw.°Ëº>,)…¼â`7!] ->YÉàT&³ëdQ¶®ÂŠ¾QaÁô'ìL, -¸×S^ÛIÀ“ÿõ÷7¨¹kûa¦ ¼VÇêvñÍA
DŠÑ
úþ®ø} °ÝþüUè[o#zvÊosÜÑ—žƒ[Ñ¢gžû¾úÍql -ôûR•Ãî6x_ÍÞ?xc _‘©!RªôKàe‚PÁ#ĆSYVébÍ;ŒŸÁÏl£WcÄK㡪/ágnü@?y -š[}¡[Ày5sÿ,¸áî‹®Œ¥î -ADÆåüg¿«Ÿÿ¸§` Ô
˜¯µ^ü0þô·Š¸_Ñ# §r”\²+·Ç_O+ÅÝþ-Õ«endstream +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ž +°\ˆÈˆÈ²˜µÞ=&yÙAS;œy媀߾؞òò9‡¬+'MŸhmhT@|dæΆM˜ëÏ«Øœ|]º¥@¢G4Ö7aêOñÝTn±
Ia»Á—Z÷ÐÜé—!…^Z¤ìšÒDÝ`#Ä#¤‘ªÒÔÕv7¼X÷?ÐUDp#—h¢oëgìF]éÎÒКdÜÇÀ6ï\`—u|XR +yÅÁnBº|²,’Á©Lf×É¢<l]…}£Â‚éOØ™X +ÊßYÆ49nD9&&ea-z™w×^2ш+'ÁÔlÉIpcS†œµÎa?[ŒÐ÷Ñ!*¡·õÈs ´ã¸j)W
XÂõ’%ú¦%ÑðYZ‚~(Ÿã#\Yvmëóñ&ç4ÕçxÛÙúà8 lí¯Hb[+“Ƕ<ÎYOÆ>k!A\rœ“tÄ䥽4’/cΨɩ‡ƒmÊÊUþ…ÄK Óp{FÕ—]à%é +R¥£¤^ݯþù_ΊvÌš„›à< +k…aõùR›x¦
séD5›¾Œº€³ LHXF’n;¾u +7•Xù®Ü&¸" §×ó-¾ÍêiÉ/˜- m”.§ÏÌþéŽÓä&\úáX_B¹þ8Uê!9\=(dý&ÌýßÁ‰ÿ@ˆÿÀ™âŒ›pâ@äƈÓw›bN®Í”È6¹k…%ÜÇû&ÄÑp¯§¼¶“€'?þëïoPs×öÃLxŽÕí⛃ˆ£ôý8\ñû `»ýù«Ð·ÞFôì”ß渢/=îYBôÌsßW¿9ŽM~_ªrØÝï«Ùû'oô+r!5DJ•~ ¼L*x„Øp*+À*]¬y‡ñ3ø™môjŒxi<Tõ%üÌŸè' ?|ÛÖåm(½šéÿ×P‚;5Ì| I”B«[œ¾ÕpmId£qøˆf[¼†.¾AAs«¯ t8¯fîŸ7Ü}Ñ•±Ô]!ˆÈ¸œÿìwõó÷„ºóµÖ‹¿ÆŸþ6B÷Kâ"zd àT®ƒ’‹Bvåöøkãi¥¸Û endobj -871 0 obj << +914 0 obj << /Type /Page -/Contents 872 0 R -/Resources 870 0 R +/Contents 915 0 R +/Resources 913 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 886 0 R +/Parent 926 0 R >> endobj -873 0 obj << -/D [871 0 R /XYZ 85.0394 794.5015 null] +916 0 obj << +/D [914 0 R /XYZ 85.0394 794.5015 null] >> endobj 6 0 obj << -/D [871 0 R /XYZ 85.0394 769.5949 null] +/D [914 0 R /XYZ 85.0394 769.5949 null] >> endobj -874 0 obj << -/D [871 0 R /XYZ 85.0394 582.8476 null] +917 0 obj << +/D [914 0 R /XYZ 85.0394 582.8476 null] >> endobj 10 0 obj << -/D [871 0 R /XYZ 85.0394 512.9824 null] +/D [914 0 R /XYZ 85.0394 512.9824 null] >> endobj -875 0 obj << -/D [871 0 R /XYZ 85.0394 474.7837 null] +918 0 obj << +/D [914 0 R /XYZ 85.0394 474.7837 null] >> endobj 14 0 obj << -/D [871 0 R /XYZ 85.0394 399.5462 null] +/D [914 0 R /XYZ 85.0394 399.5462 null] >> endobj -876 0 obj << -/D [871 0 R /XYZ 85.0394 363.8828 null] +919 0 obj << +/D [914 0 R /XYZ 85.0394 363.8828 null] >> endobj 18 0 obj << -/D [871 0 R /XYZ 85.0394 223.0066 null] +/D [914 0 R /XYZ 85.0394 223.0066 null] >> endobj -880 0 obj << -/D [871 0 R /XYZ 85.0394 190.9009 null] +920 0 obj << +/D [914 0 R /XYZ 85.0394 190.9009 null] >> endobj -881 0 obj << -/D [871 0 R /XYZ 85.0394 170.4169 null] +921 0 obj << +/D [914 0 R /XYZ 85.0394 170.4169 null] >> endobj -882 0 obj << -/D [871 0 R /XYZ 85.0394 158.4617 null] +922 0 obj << +/D [914 0 R /XYZ 85.0394 158.4617 null] >> endobj -870 0 obj << -/Font << /F21 658 0 R /F23 682 0 R /F47 879 0 R /F39 863 0 R /F48 885 0 R >> +913 0 obj << +/Font << /F21 690 0 R /F23 714 0 R /F39 873 0 R /F41 910 0 R /F48 925 0 R >> /ProcSet [ /PDF /Text ] >> endobj -889 0 obj << -/Length 3125 +929 0 obj << +/Length 3126 /Filter /FlateDecode >> stream -xÚÍ]“Û¶ñý~…u3‹~öíÛ3“sb«“i<P"¤ã˜"’:ùò뻋]P¤„³Ý6fî+`ìö'þä"Šƒ8SÙ"É 2Zl7b±‡¹¿ÝHÆY9¤Õë›õÍ_^ëd‘Y¬âÅz7Ù+
DšÊźø°”AÜÂb¹þîÕíJEbùòíwoî ¾¿ûGßÿãýúÕÿ""ñòþ=|äíJÊ8Ëo¿»ûqýêÍKÞòÍýúÝÛ—ÿvýæíýí¯ëïo^Gª§œI¡‘äßn>ü*0øýt–F‹üÌ2µ8Ü„‘¢Pk7Rݼ¿ùiÜp2k—z%%E t¬<¢RÚ'ª(b
S(ªõƒ!övMU5§²ÞÓÏmS?šz(›º§¼»•é’‘½)*kú¦ßve;YÐìè;¸¾ysÿrÜü!ÔþØå¸ÀÉ_¨ÊüõR¤qÄR -h€½t+æ[O«D« ’ᨯpjÚIdi²Ht¶$bR×”rÙLe¾™dª´^þ|«ÄDEòï‡'|Ã, 2™á9#-ÿw(G
wñ"0%‚(‚½½î$¦àö…Qh%öÑ<k»E¼ƒÿÈ&K”JèDa±_—ŸÐ²c!–?—Åðð¼´ˆìO.. -3o»Ë+ç Ûã -Ë~€Ìá8XWèE>䛼7ãêìa á~ ÐizÚ®¬wMwp¦ð“fy»ò ¿%µbÞìl~ÉåCÓ4^c=VÔˆú#!åEÁÇ÷…l -€ÇrkëÑt}nS@FYѨ]؇ñü íYŸ÷j@û(ÚÀæ¸3ŽÈ{lØN&ü µm¶ùo0.ƒØŠÔ.û¶*AÿÖÚ¢eÕ4 :¶ôKÖЗӷÈ\[¹|"4ZqÊÊeÍrH…î=CÙ,ͦ™yìPk/Z2rUB êžlÆù‚Î;=Ði½©ææ·£éJ« @¡ëWµfº…À÷À¦ä¡µ¨,‹æ¶S[“×ö°µì!| +xÚÍ]“Û¶ñý~…u3ƒ~öíÛ3“sj«“i<P"¤ã˜"’:ùò뻋]P¤„³Ý6fî+`ìö'þä"Šƒ8SÙ"É 2Zl7b±‡¹¿ÞHÆY9¤ÕëÛõÍ7¯u²È‚,Vñb½›ì•"Måb]|XÊ na±\ÿêv¥"±|ùöÇ»7÷ßßýÈ£ïÿñ~ýêG‚‘xyÿ>òv%eœˆåwßßý´~õŽæ%oùæ~ýîíË¿·~óöþö×õ7¯Ö#ÕSΤÐHòo7~‹üáF:K£Å ~ˆ@f™ZnÂHQ¨µ©nÞßümÜp2k—z%%E t¬<¢RÚ'ª(b
S(ªõƒ!övMU5§²ÞÓÏmS?šz(›º§¼»•é’‘½)*kú¦ßve;YÐìè;¸¾}sÿrÜü!ÔþØå¸ÀÉ_¨ÊüåR¤qÄR +h€½t+æ[O«D« ’áÙ´³‰¾’0ÈÒd‘èlIĤ®[)å²™Ê|2[ÉTi½üùV‰‰Š.äßOù†Yd2ÃsFZþ;îPŽîâÿD`JQ{{-ÜILÁí£ÐJì£y:5Öv‹yÿæu('K”JèDa±_—ŸÐ²c!–?—Åðð¼´ˆìO.. +3o»Ë+ç Ûã +Ë~€Ìá8XWèE>䛼7ãêìa á~ ÐizÚ®¬wMwp¦ð“fy»ò ¿%µbÞìl~ÉåCÓ4^c=VÔˆú!åEÁÇ÷…l +€ÇrkëÑt}nS@FYѨ]؇ñü íYŸ÷j@û(ÚÀæ¸3ŽÈ{lØN&ü µm¶ùo0.ƒØŠÔ.û®*AÿÖÚ¢eÕ4 :¶ôKÖЗӷÈ\[¹|"4ZqÊÊeÍrH…î=CÙ,ͦ™yìPk/Z2rUB êžlÆù‚Î;=Ði½©ææ·£éJ« @¡ëWµfº…À÷À¦ä¡µ¨,‹æ¶S[“×ö°µì!| ‘(¶ ÕVx ›–ÎC™k'HX-hÊ€®V±ŠèÊá$yI„2>zæäpd¼<VW8õÌ | „S»P @@ -2525,192 +2632,185 @@ b5:”ÀyÈ,º¸+¤€$u9@yß7Û’C.üƸH«#™D³dŒf Î J}¹¯¹šÛù«Í˜Û2ñLM/ :i
5 ÷&M¾d)#þjºàZK×û^ÙÊÏVøË8–rFÏõÛ‚Ãú×»=ßÆ@Š³8UWmÍmŒ>v/›øª„JÓ£¯mM‡ÅŽ lÛÖZe¶â×cú ŬÕ+Ö4a“ XQБä5|ÔíC2:Íñ¢Ü!;õ–OÞ˜ád°>C$_œEI¾Ò“”×qHHS9kí=³¡-¡:½Åø—êw½ypv»ï¸) -S™ýä-ç깇bë¤Âˆ;=Ÿµmê®c?Ý*؇ñù »”åþèmÓ+ô‚¥ÿ±%:W€Ï$üE‰ +S™ýä-ç깇bë¤Âˆ;=Ÿµmê®c?Ý*؇ñù »”åþèmÓ+ô‚¥ÿ±%:W€Ï$üE‰ endobj -888 0 obj << +928 0 obj << /Type /Page -/Contents 889 0 R -/Resources 887 0 R +/Contents 929 0 R +/Resources 927 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 886 0 R -/Annots [ 896 0 R 897 0 R ] +/Parent 926 0 R +/Annots [ 936 0 R 937 0 R ] >> endobj -896 0 obj << +936 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [272.8897 210.0781 329.1084 222.1378] /Subtype /Link /A << /S /GoTo /D (types_of_resource_records_and_when_to_use_them) >> >> endobj -897 0 obj << +937 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [190.6691 182.1322 249.6573 191.5418] /Subtype /Link /A << /S /GoTo /D (rfcs) >> >> endobj -890 0 obj << -/D [888 0 R /XYZ 56.6929 794.5015 null] +930 0 obj << +/D [928 0 R /XYZ 56.6929 794.5015 null] >> endobj -891 0 obj << -/D [888 0 R /XYZ 56.6929 756.8229 null] +931 0 obj << +/D [928 0 R /XYZ 56.6929 756.8229 null] >> endobj -892 0 obj << -/D [888 0 R /XYZ 56.6929 744.8677 null] +932 0 obj << +/D [928 0 R /XYZ 56.6929 744.8677 null] >> endobj 22 0 obj << -/D [888 0 R /XYZ 56.6929 649.0335 null] +/D [928 0 R /XYZ 56.6929 649.0335 null] >> endobj -893 0 obj << -/D [888 0 R /XYZ 56.6929 609.5205 null] +933 0 obj << +/D [928 0 R /XYZ 56.6929 609.5205 null] >> endobj 26 0 obj << -/D [888 0 R /XYZ 56.6929 551.1302 null] +/D [928 0 R /XYZ 56.6929 551.1302 null] >> endobj -894 0 obj << -/D [888 0 R /XYZ 56.6929 525.7505 null] +934 0 obj << +/D [928 0 R /XYZ 56.6929 525.7505 null] >> endobj 30 0 obj << -/D [888 0 R /XYZ 56.6929 422.4834 null] +/D [928 0 R /XYZ 56.6929 422.4834 null] >> endobj -895 0 obj << -/D [888 0 R /XYZ 56.6929 395.8284 null] +935 0 obj << +/D [928 0 R /XYZ 56.6929 395.8284 null] >> endobj 34 0 obj << -/D [888 0 R /XYZ 56.6929 166.2827 null] +/D [928 0 R /XYZ 56.6929 166.2827 null] >> endobj -898 0 obj << -/D [888 0 R /XYZ 56.6929 138.253 null] +938 0 obj << +/D [928 0 R /XYZ 56.6929 138.253 null] >> endobj -887 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F47 879 0 R /F39 863 0 R /F21 658 0 R >> +927 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F39 873 0 R /F41 910 0 R /F21 690 0 R >> /ProcSet [ /PDF /Text ] >> endobj -903 0 obj << -/Length 3414 -/Filter /FlateDecode ->> -stream -xÚ¥ZKsã6¾ûWè¹jÍàA -a²¢´á¦f²”™ËÕW„\€Ž™ ®¯Ë÷tÎ -Bƒc34ÏõÈå‰â‘=½ r‚
öÇÇGÒ}0N: -$¿vG"‘ÂUk"þð}O-ˆÂ´7¤›9½D¸×ð”Q½X4 -Ú½¢¤bü²êÿr…û€º–Èuüç˜âÙKŠy{„°ëÐÆáäÍ0Å#÷—Ì‚² _Xy‡«4Øòǧǚh>½§Ç*x¶uÕs¿KÁ¶ÑOuÊ-~Çf->øDÄ)Ày•ZNŽ/£øLeð~È¿QtœOpÈëj¨¨EçÄ#é˜,¬`ÎÊ9ntáæ‹ëRÍÑO8Xð„òuÇ ‰¢¤tm}¨|Bd®@
*4‚I îêá¥;<õ¡jÚ#GCè‰c?ÐH¯4nã5ϯôÒQ£ã‰c†é©,é›RM•…#$΃B2Ü?Ô§ù"³Ü'ýsÝïï(áqór·[|+ÎðÊÔÏûRÁ]Cñüâ3ttý=FÜÞúÊ…ï_úxÉÏÏ
JÓŠqf–³ç–ºöÕê))ªz@¸4ºW@áüù÷1Ýá•iQ ùÜ
È@}!´úº^‚ã'T¯:Ø -n±=*‚«wzŒÐx¢KìÏñ¸‹¨i{ -˜0¸†¥^!ž¥ð -ÍÈ)´c‘Â|Fææ¡f63 -O=°& wœWðdcZ*…—™¤µùiÙȸýd‰ƒ6™Ì]Ь.dJÐæ&õÅYs™©MÔ>²W˜S·ùñMš fHÁWUOA -fD -_tÀ€ÌvØüM„ù¹…S &cÃQðføˆ‘€:úMϣΠ-4´â9§îåÌüváâ}Ï1[,ò\\ÔG S=Ÿ^ÌÉ:ÐmZc´“1àp¨/÷‚ã~¤Fñ_ [€ƒUÁÁÒß.¨rlõØpŸ…Ô8èm¨þ°·ì§_Såþpäœþå‘óß-¦ëE*ýCŸ«g¶ÌŒÖgeŽÑAè)èpÅÔ%_*{ Ðå7‚¤§ºÞûÀ(Þb1AÓ!ñG¢·Âñ¦+ܪ³_Ç¥÷uÍ7kÇ=uU+ -¢ü
XÇÃÕXT
p~ÅCê,x^®¤zç;š›ˆ|¦„§¹`õ\5mµ)"_œâ€´íÙ$X5ìÆ‹¬¦j¹Ž8Bé…D›^¿šr -¡‚—†HÙ[‚ÿï”(L‰Xãÿ¿ÿV5þ»,w™. -•®piQâEpd -£¼( +943 0 obj << +/Length 3415 +/Filter /FlateDecode +>> +stream +xÚ¥ZKsã6¾ûWè¹jÍàA +J$”š.º\.³/ËA*™…_ÕÏ5ŠAç ãîøˆ›ÔoÉÛéÌ‚ÖþoâFð6ñ—·'\d"`X¦Ûµ¯Dí”»@/HhBg©3¡½¡&+JNaz +¢â¥ 486Có\\ž(ÙÓ*'Ø`||$Ý㤣@òkw$)\µ&òçß÷Ô‚(L{Cʱ™ÑK„{
OÙåÑ‹E pàg`6Ž;ð’è:×€4Î"ÈÆÇ8@Yƒ67¿ ¡VÇvHÙ ÆÇåвº}³Júí{-Äü»wï¨Eë÷®ÚÖ[¸ Òoà<Ãã;[9´ÈʱÅ"µ7ìX×pºÔ܈ÓS¸O‚gÚÓ2´é1Ì1„ÞðÛª<¼ ?çÇJûïÛêÙUWmuÞHÇëÙ7ã~]l/¸³5x‡ÝCÊ/ª¬ˆ&ˆçÑò¢ý¾^5¯´žß„WAê‰D¶VÜ›+çÿÙÔ;¢³ÆYMžˆÒw[ž5À*.Ð]Jpä./‹3{Ej,®º§÷—¦mIµ0HèˆèÑÞ+z
 +&‘|øD`ñ‚ZÈ +æ<ð¡œãFn¾¸.Õý„3€O(_Çq’(J@J×Ö‡Ê'D@öç +Ô ÒH#˜â®^ºÃQª¦=r4„ž¸P1öôjAã6^óüJ/5:ž8f˜žÊ’¾I!ÕTY8Bâ,0($ÃýC}š/2Ë}Ð?×ýðŽ7 w»Å·âüàq +p‘æPj¶]åK]¼´ç‡3õBypÀ&؈\û`‹æ€¹‰";$×ë†ê`Ð^² +“©Ò3:Ó8˜k8¾óšlùø¿óå ¥BÐ=&óرk„Óâ¼nÍ€¨µ Žöu“ S=qsz†€\…nß|
€ÅtMô=M¸ª{^!ȧï×¢Q%à)Ì €àà¢úþ!霜‹Íåè,Œ-Ï……(œ‹,²2^ +”r¬¾*{êÃÂ4Òçাc¡Z¯; ·]u‹Î¿0b0–9›7Œ÷13;w|rQ'èú¾Yzlq\QF‡¤A_
)â)b—×i|H£>î’àœ‹˜¿„›#ÎJ*NUF+ •¿šâ ªúºåL²xnô'sLÑÛof2ýqÉë6;„7Öé¥`F¤ðE|Èl‡ÍßD˜ŸûPˆ0b26o† ¨£ßô<ê€Ì$Íòý1J4˜DôTE‡_Ÿ‚§OFŒ»¼ÂE6ÅÉ}b`¯OµFxìë8gâ¼// •ó—vC3ÎÔR&Z¸Ì¨<V×ÇûÙ4zÉxõâ³ñi†Éá²'ÉêdÀ¸?_VÍ+÷•|ÖŽ‚öƒÉšÔ(ò1-ucBj‘9=VÕä4†±jtòÐ&]Gû°ì·íB^ëd¨Ýž·W$/ +,Ê,ÿJ@T&¸«j_ÿ™¾,07šÈކС¶’Ûù/¾¶r$:]iYíEE¤Q°¸ñ]b¢o¸6wCûò¯¾(ÏsU#i[•¹Ü˜ókAº§ž˜ +¾P(Å& L®©§&à™`Â稙þ˜£á +?6`³<söÔq¿qÁâKNÿ¢@C+žsê^ÎÌo.Þ÷³Å"ÏÅE}”0Õó©áÅœ¬Ý¦5F;Ž +—%^G¦ð8Ê‹`øûÕ%çÿ^_'kendstream endobj -902 0 obj << +942 0 obj << /Type /Page -/Contents 903 0 R -/Resources 901 0 R +/Contents 943 0 R +/Resources 941 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 886 0 R -/Annots [ 906 0 R 907 0 R ] +/Parent 926 0 R +/Annots [ 946 0 R 947 0 R ] >> endobj -906 0 obj << +946 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 -907 0 obj << +947 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 -904 0 obj << -/D [902 0 R /XYZ 85.0394 794.5015 null] +944 0 obj << +/D [942 0 R /XYZ 85.0394 794.5015 null] >> endobj 38 0 obj << -/D [902 0 R /XYZ 85.0394 570.5252 null] +/D [942 0 R /XYZ 85.0394 570.5252 null] >> endobj -905 0 obj << -/D [902 0 R /XYZ 85.0394 541.3751 null] +945 0 obj << +/D [942 0 R /XYZ 85.0394 541.3751 null] >> endobj 42 0 obj << -/D [902 0 R /XYZ 85.0394 434.1868 null] +/D [942 0 R /XYZ 85.0394 434.1868 null] >> endobj -908 0 obj << -/D [902 0 R /XYZ 85.0394 406.5769 null] +948 0 obj << +/D [942 0 R /XYZ 85.0394 406.5769 null] >> endobj 46 0 obj << -/D [902 0 R /XYZ 85.0394 301.1559 null] +/D [942 0 R /XYZ 85.0394 301.1559 null] >> endobj -909 0 obj << -/D [902 0 R /XYZ 85.0394 276.6843 null] +949 0 obj << +/D [942 0 R /XYZ 85.0394 276.6843 null] >> endobj 50 0 obj << -/D [902 0 R /XYZ 85.0394 200.1512 null] +/D [942 0 R /XYZ 85.0394 200.1512 null] >> endobj -910 0 obj << -/D [902 0 R /XYZ 85.0394 175.6796 null] +950 0 obj << +/D [942 0 R /XYZ 85.0394 175.6796 null] >> endobj -901 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F47 879 0 R /F39 863 0 R /F21 658 0 R >> +941 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F39 873 0 R /F41 910 0 R /F21 690 0 R >> /ProcSet [ /PDF /Text ] >> endobj -914 0 obj << +954 0 obj << /Length 2458 /Filter /FlateDecode >> stream xڥ˒ã¶ñ>_¡[4Uš -Yþýî×ßÂU üù.TžÅ«LÂ@ä¹\5wQ¬‚8RÊCê»ç»Œg«n뢤DH•ÈQIµ$ª8K(ªwp9®‹®ý†òe8j[u-O{s¼ÙÚÐÔîyp8V>žiÒèÞš÷æøêÇ•íM½ãqO_ÍhÖèÚîö0^·³†y væHƒ’Yé˜ Û <á¯RFûª,a3(¤zò8–îªÌ6"z]_ô«âhý¹5´<ô<ØuÈ_ƒ‡·[ H‹1Ê!$2 -ëÖòT„ -‚>a·£ßÑÉå£-}ùÞý©àÓA"U¾x¬Û\wÝ·á°dý)^Üï¤`êðIxåº2í6ð0 -¢,‚Ì&Ò W2%ÿ¿Ïåô£’l]5ÞÇ
rϸn&™òšAÜÕs¨q; -G·{¦Â -jÛÓ -ú.Xêïè÷/Ž'·Ÿ+`cÚ¸˜‰F¿r¤rrÙ(œóíl–(ÊG¡ã™¼¡cp€IÕZÈ/–?r鼿3ÎA"Á6wÕ«€½0UohN`K½UnP*yí"¯Æ“2çâoÒ-ÆAžÇÙ•ãÌó›¯0ÕõÞgúsÛµç¦z†€â U07'*fÒumÚªERRaò*Y+Nûª`,M%Ü’`>…™#Y]µ†Qª–¾Ö3À–ˆ»èüñ„IP0a×…ÑT1¥\1e¨pKFå‚Ç‚ÍmÏW)}sÇëªgä^8þeôi¬‰7›_¨&&@(Mí£SßwEfW^×
F<òAspƒÂÌ¡^vS)q‘ý!Ï 1«è¡°àZâ§îxÒÇeó?놯d" ÅÜd&U˜ø€˜ÌBqº.;ç–¸ÞYôV¨2¨HJf9&,Ô««Cm,Ïn¢d„ÆT"c¦ù”Ñt‡ñY)Ÿn—ªì|ÒhŠ¯(›¥T -iâ;.Pw…°s7¨ì@Va$ê÷´DF…Þ˜óY€GZF£éKõê‰÷•]ÌÝÎ\‰)ZˆÂÒì²ÖEC•(_=HyrZ~DŠáefkŠ(Å6Ýá’P£0-$æçÔ
—‰µWìDh¢‰‰vh¶d¹×"oèB#®bê<‰&dg°¬[Ìx†ÙeÇêÞKÔØá¹}¾#Elr|¨¶uÏ«]|3–ϲ{ŠÃËÞ¡ýQcLÖÇÂJÍý’<_±Z0F~tmŒ0Öºå’ñ+‹áE%\!¥yNb<[:·;_6IÁÔ~Lô¥ÊO½U>Nšš÷ÿþÂÁÌ· ®CO8«Þ6åÔp…õ êâêàŸ¾tµùÓ]{®x|zO#ßzͺŸ4dq#°jà Ý*à MïD7ÃESzHJgoO0¦J
tžþ ”b„[@X¬õ«¹ÚÀiçfG»XGM ƒ»µÙ³–K9*œæÞØ] õõì·FW5ìÇîd¦ÌI蓹õȹäW9œ6´6¬=M»Ã:·Þ¾ËÆ%ÒŽÛªà 9=lá»~Ý[½µUÌŸR®åXw/c|ÏpÛA¡”Ä‹I¥EÆ©#Í}¥ ]¾êÖê4‚¸@’bÿ–A€aØÞ44êÚË×ëWw/ãbmž»X›…ÎÓ—bgëŸfNÎF“kÏ_’IJF³Y®ìB©ü»ÑÅwöB³i–§¾Ês—`3„£ØÍ’QVäº=MnºOX,«C6¦ˆU¤Ì.ãíÔSѦÈ/1•ÞVueÏ$SBCÅCL
ÚCaå.§DãZFÎàK)I]Ù/€œ_Ñ1|žóç«£Ig8ºÐÙ‚v¯Ë÷<šé-W”Iòé] @ì®wz]ª+chft¶ýð[ -ä4 Õ’BánUàhjU -e*Ѳ€Ç,EJ¡¼Mq 9jÕäå/œÆGi²5—Žøy©Ö…¯¿«vzOÖSo9¯ÞøoÒþ!²ðOH8&ºÿû—éï§(
T–Éå¿TðA8Ê€3åRjxùÿƒæ–õÿ÷Å:êendstream +Yþýî×ßÂU üù.TžÅ«LÂ@ä¹\5wQ¬‚8RÊCê»ç»Œg«n뢤DH•ÈQIµ$ª8K(ªwp9®‹®ý†òe8j[u-O{s¼ÙÚÐÔîyp8V>žiÒèÞš÷æøêÇ•íM½ãqO_ÍhÖèÚîö0^·³†y væHƒ’Yé˜ Û <á¯RFûª,a3(¤zò8–îªÌ6"z]_ô«âhý¹5´<ô<ØuÈ_ƒ‡·[ H‹1Ê!$2 +…>°®Á€º}á’`
2™#Xô ++x¨mO+èG¸`=ª¿£ßw¾8tž@Ü~®€iãb&ýÊyÊÉe£pη³-X¢(…Žgò.„ŽÁ&Uk!¿X2üÈ¥óüÎ8‰Û0,@ÞYT¯öÂT½¡]8-õV¹I@©äµ‹¼.OÈXxœ‹k¼I´ygWŽ3Ïo¾NÀT×{ŸéÏmמ›nèAŠƒ`TÁÜœ¨˜I×µi_¨II @„É«d08í«‚±4}XH”pK‚5úL¶fŽduÕF©ZúZÏ +3‡zÙM¥ÄEö‡<'Ĭ¢‡Â‚k‰ŸºãIK”Íÿ¬>¼’‰$s“™Taâb2Åéºìœ[âzgy`Ð[¡Ê ")™å˜°P¬®µ±<»‰’ GS‰Œ™BæSF[ÐÆg¥@|º]ªJ°óI£)¾¢l–RHE„cñÒáÍ‘*š8~±È$ +K³ËZ!U¢|õ },ä-T\Èiù)¶†—™M¬)¢Ût‡KBaŒÂ´˜ŸS7`\&Ö^±¡‰&&Ú¡Ù’å^_ˆ¼=¢µŽ¸Š©/@ð$.˜Á²n 0ãf—«{/Qc‡çöùŽ±Éñ¡ÚÖ=¯tñÍX>Ëî)z/{0„öG1YC*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šwzc4vÖ׳Ü]Õ°»“™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¿ +…3¸U£©UPk\‘;cpËÜÓ…à8~*”©DGÊR endobj -913 0 obj << +953 0 obj << /Type /Page -/Contents 914 0 R -/Resources 912 0 R +/Contents 954 0 R +/Resources 952 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 886 0 R +/Parent 926 0 R >> endobj -915 0 obj << -/D [913 0 R /XYZ 56.6929 794.5015 null] +955 0 obj << +/D [953 0 R /XYZ 56.6929 794.5015 null] >> endobj 54 0 obj << -/D [913 0 R /XYZ 56.6929 717.7272 null] +/D [953 0 R /XYZ 56.6929 717.7272 null] >> endobj -916 0 obj << -/D [913 0 R /XYZ 56.6929 690.4227 null] +956 0 obj << +/D [953 0 R /XYZ 56.6929 690.4227 null] >> endobj 58 0 obj << -/D [913 0 R /XYZ 56.6929 550.0786 null] +/D [953 0 R /XYZ 56.6929 550.0786 null] >> endobj -917 0 obj << -/D [913 0 R /XYZ 56.6929 525.2967 null] +957 0 obj << +/D [953 0 R /XYZ 56.6929 525.2967 null] >> endobj 62 0 obj << -/D [913 0 R /XYZ 56.6929 393.0502 null] +/D [953 0 R /XYZ 56.6929 393.0502 null] >> endobj -918 0 obj << -/D [913 0 R /XYZ 56.6929 363.1913 null] +958 0 obj << +/D [953 0 R /XYZ 56.6929 363.1913 null] >> endobj -912 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F47 879 0 R >> +952 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R /F39 873 0 R >> /ProcSet [ /PDF /Text ] >> endobj -921 0 obj << +961 0 obj << /Length 2095 /Filter /FlateDecode >> @@ -2722,72 +2822,72 @@ fhWü(½¾YhovçåvlŒ25©,*Yݳ÷›¦¿ªîÄqˆjØ|SüÍ‚Ø{©uÏ•cqÀ]#Xg±¬,ÕI’Êøߨ ´8Í dXõcsý.Û~¸ý¿ Šç•‰×:%<ä7IE”èÚ–Ø’ª2yÑT hZvýxªY/ý‘áÝN6“dy 8xp]Óc~{î0¨”~‚’$¡½„3×|Ó$ý$ÈR¸2Æ/{ë³ý4±òÕc¯ÕW¹aµ¤ôó,ÎXT¦JP¶Ø¶ÖVDÙ6 ^AÁ³"r -DŽ49œvDü¹„šný~¹ æÒû/å¢õ>ÉÃP©_¬MËZç¹—ù +DŽ49œvDü¹„šný~¹ æÒû/å¢õ>ÉÃP©_¬MËZç¹—ù ÜѸU‚>Gy%â*哦tð–RW8 Ÿ¤IhsÜ]W‰y Õmíš™Q‘‚z -â~ó
¯ fÙ"‡èâ9Lt¨ž¹£j¡ mK(ÈÏbµ +â~ó
¯ fÙ"‡èâ9Lt¨ž¹£j¡ mK(ÈÏbµ endobj -920 0 obj << +960 0 obj << /Type /Page -/Contents 921 0 R -/Resources 919 0 R +/Contents 961 0 R +/Resources 959 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 886 0 R -/Annots [ 927 0 R 928 0 R ] +/Parent 926 0 R +/Annots [ 967 0 R 968 0 R ] >> endobj -927 0 obj << +967 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 -928 0 obj << +968 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 -922 0 obj << -/D [920 0 R /XYZ 85.0394 794.5015 null] +962 0 obj << +/D [960 0 R /XYZ 85.0394 794.5015 null] >> endobj 66 0 obj << -/D [920 0 R /XYZ 85.0394 769.5949 null] +/D [960 0 R /XYZ 85.0394 769.5949 null] >> endobj -923 0 obj << -/D [920 0 R /XYZ 85.0394 574.3444 null] +963 0 obj << +/D [960 0 R /XYZ 85.0394 574.3444 null] >> endobj 70 0 obj << -/D [920 0 R /XYZ 85.0394 574.3444 null] +/D [960 0 R /XYZ 85.0394 574.3444 null] >> endobj -924 0 obj << -/D [920 0 R /XYZ 85.0394 540.5052 null] +964 0 obj << +/D [960 0 R /XYZ 85.0394 540.5052 null] >> endobj 74 0 obj << -/D [920 0 R /XYZ 85.0394 447.7637 null] +/D [960 0 R /XYZ 85.0394 447.7637 null] >> endobj -925 0 obj << -/D [920 0 R /XYZ 85.0394 410.3389 null] +965 0 obj << +/D [960 0 R /XYZ 85.0394 410.3389 null] >> endobj 78 0 obj << -/D [920 0 R /XYZ 85.0394 348.7624 null] +/D [960 0 R /XYZ 85.0394 348.7624 null] >> endobj -926 0 obj << -/D [920 0 R /XYZ 85.0394 311.223 null] +966 0 obj << +/D [960 0 R /XYZ 85.0394 311.223 null] >> endobj 82 0 obj << -/D [920 0 R /XYZ 85.0394 189.9853 null] +/D [960 0 R /XYZ 85.0394 189.9853 null] >> endobj -929 0 obj << -/D [920 0 R /XYZ 85.0394 156.0037 null] +969 0 obj << +/D [960 0 R /XYZ 85.0394 156.0037 null] >> endobj -919 0 obj << -/Font << /F21 658 0 R /F23 682 0 R >> +959 0 obj << +/Font << /F21 690 0 R /F23 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -933 0 obj << +973 0 obj << /Length 611 /Filter /FlateDecode >> @@ -2795,138 +2895,140 @@ stream xÚ¥TMs›0½ó+t3EÕtÌI;ŽÁÓvÒ£$šbp$Í¿¯@Â&Mzêx<ˆ÷vŸvßzM ˆ,}Q7c‚}vû ƒbÓJP*ݾ-Wfü¦=»DÖ+ýÉ\Kií“ù'çs·?0¦¥ÃUõW`[ïí¡”Ï²´ÇB
>Ém[7¯ŠšæWN¸ênÈÚÊQD·ºïZ3ô¯åcõóÁª˜¯›æ/æñß*ŒKzܹénÐ8AabD\Q½Í„¾«|Üà÷¥ÿ¦œ@šendstream endobj -932 0 obj << +972 0 obj << /Type /Page -/Contents 933 0 R -/Resources 931 0 R +/Contents 973 0 R +/Resources 971 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 886 0 R +/Parent 926 0 R >> endobj -934 0 obj << -/D [932 0 R /XYZ 56.6929 794.5015 null] +974 0 obj << +/D [972 0 R /XYZ 56.6929 794.5015 null] >> endobj 86 0 obj << -/D [932 0 R /XYZ 56.6929 769.5949 null] +/D [972 0 R /XYZ 56.6929 769.5949 null] >> endobj -935 0 obj << -/D [932 0 R /XYZ 56.6929 744.7247 null] +975 0 obj << +/D [972 0 R /XYZ 56.6929 744.7247 null] >> endobj -931 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R >> +971 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -938 0 obj << +978 0 obj << /Length 1222 /Filter /FlateDecode >> stream xÚÍWIãD¾÷¯ˆúäH¸âZ¼©OÍ°‰Hs`8TìrbSeìrBƒæ¿ójs6sà -©Ç¥·†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' Ðò‡4A¤L\û6è@{{VnZ&ÜvœvR˜ò›ÍÙžÛñàVÚkÙRºåÜX³iuD·°qÅâUwñwñð—{à’ œˆ¡dCØËía~}øée ”®[³M#AJTyy+W·´@AÿäóFèjc†£Þ=æ0Tè½>Ú˜ÍEq)·+\]gR½
=^Œl9¯ËσØÚ»Ç -ÿ¨2ûù@[ –¤('ðVt„(þ° F—7¯€ÑK‚sTRRx;Ö›#<鹎{žëøIÜý7¸Pé´«Õqþ›ð™˜1t6Ihb–{â^Ž(áÏ!½Žm‰CÁe -5€B=—âÿëÄæ/n¸GÂä^xÞ`W>¾QAF?°9¯ª™Ù;ëƒû9âãòíÊwÁ®|»0«ðœIª
Ÿ:½äÊ0
£•0ö1¦ÿ˜SM™^ÿ^r0m%©ßÑ1¡¨Ä ûOèøéÛíü•¾]hŠÌ—ÐÒwP‰/2î#èñ4ÉPAÊ<2yazïmþ¤zt÷7¯Ì™øendstream +©Ç¥·†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 +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 endobj -937 0 obj << +977 0 obj << /Type /Page -/Contents 938 0 R -/Resources 936 0 R +/Contents 978 0 R +/Resources 976 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 944 0 R +/Parent 984 0 R >> endobj -939 0 obj << -/D [937 0 R /XYZ 85.0394 794.5015 null] +979 0 obj << +/D [977 0 R /XYZ 85.0394 794.5015 null] >> endobj 90 0 obj << -/D [937 0 R /XYZ 85.0394 769.5949 null] +/D [977 0 R /XYZ 85.0394 769.5949 null] >> endobj -940 0 obj << -/D [937 0 R /XYZ 85.0394 575.896 null] +980 0 obj << +/D [977 0 R /XYZ 85.0394 575.896 null] >> endobj 94 0 obj << -/D [937 0 R /XYZ 85.0394 529.2011 null] +/D [977 0 R /XYZ 85.0394 529.2011 null] >> endobj -941 0 obj << -/D [937 0 R /XYZ 85.0394 492.9468 null] +981 0 obj << +/D [977 0 R /XYZ 85.0394 492.9468 null] >> endobj 98 0 obj << -/D [937 0 R /XYZ 85.0394 492.9468 null] +/D [977 0 R /XYZ 85.0394 492.9468 null] >> endobj -942 0 obj << -/D [937 0 R /XYZ 85.0394 466.0581 null] +982 0 obj << +/D [977 0 R /XYZ 85.0394 466.0581 null] >> endobj 102 0 obj << -/D [937 0 R /XYZ 85.0394 237.1121 null] +/D [977 0 R /XYZ 85.0394 237.1121 null] >> endobj -943 0 obj << -/D [937 0 R /XYZ 85.0394 206.4074 null] +983 0 obj << +/D [977 0 R /XYZ 85.0394 206.4074 null] >> endobj -936 0 obj << -/Font << /F21 658 0 R /F23 682 0 R /F39 863 0 R >> +976 0 obj << +/Font << /F21 690 0 R /F23 714 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -947 0 obj << -/Length 1859 +987 0 obj << +/Length 1860 /Filter /FlateDecode >> stream -xÚÍËrÛ6ð®¯àøDÍD0^$ÁæäÄvêL⸲RO'Í"!‹>’²êvúï]<HQ2e»gÚá`±Ø]ì“ÄÁðÇó‘ÒÐ BŽ<L<'ÎGع…½w#bq&-Ò¤õf6:>g¢Ð§¾3[ôh „… Î,ùâ2ÄÐ(`÷òäãÙxB=ì^ŸMÇžçþƒžº:›žŒîÎ.>]^'¹ûöÇ“«Y‹ñ4·Ÿ.Ï/Þ}ÞÒ½Í:)ú’Ì”ßG_¾b'ß0b¡ðœ
L0"aH|Ä=†<ÎX»’®G?u{»úè æF”ùtHuáê¼ùŒ2ºßËBŽ'>ÆîFÀ
PZL¢$©PT¢#³÷‡Ô¡!"€'"…žG5æ~e äQÝÈêµFÅ»H‹4koÉÊ8Ê–eÝ JÞía›ç,Ê&]Üü¢4(“ÁËÿ¼íøØœ½±wF•šå«®eu׋Òò·(_eÅe>ÄaOk=Ì—WV8JæÃÚj¥½¸²ÒÂÛɺ–µ™–+fÝɾÄv?ʲr#« ÒŽUTÔù”2¿šÂd÷È#: !EÄ<„ -Ô"xÈcÏxüçYyÜ2¢JÚ7‹â=¡¾iìbÿóÐŒŠÐ·Ž]úhþíèQس]ûØíŸÐ7Xu+žz¯L_›¥ïEzïu|N‰C8b„,¸È£ˆ’Іy:ž¤>”QbBò›(‹Š8-níqÖxpš -ä¡ u'ã ž»ªÒ<mRõÎj -o›HiB™&® yG\O㨰ëöl/Sy'-vjwu”QÀ©Ê3ÿތ뺣•¯³&]e³áʸÔcR›Å_±‡ëu¼´wÕƒªïÈ(eœ˜aÐ!fCÛ±´* ˆr‰: -
4ás*Xëü¯`R7]¨UîÞ—câ®
¼Ô>£p›¥¹Zš››³Þ5Ù¤ÍÒì²Ù”Õ7³¬ŒR6¡Kí—³ETf‚Üdy°SjωÁ¶ËìÕ`Œ%bŒ4Ðo
ãCÅ+,£t€"½Ò>),,JìÌ+Â4—ôØ,#K;ÎRY4vy“f™].‹BÆGZ5ʨ½*WÆTØkÊh–©aÍðѲø²IsùÃ~M@Ú0u˜Oó9yVQB ìBì%ÿìTËG/ŽäÀœÃ@Ë‚t»¤&LÆCÄqØ<;þ/ÂÜgƒ†ž¯ut ?žpÁˆ;›}PøîÛ'×ÊWy@ÝÙ/WPþqB}w*ërõ[™v¶bæÊG§Ó‡FM´ÿ -ß× -ÞƲƒZéÝ÷²ZyQ7$ºMñžÒ -dŠx¦VØaôî{)l;¬ÿ":RL 8b ¸À¸AÛê=hùh -€¬SËþ‘.oBff¾ï¾¹¸<5û6íµ˜e5²#’ÛÛUæîÝ¿*Û
î–Ÿû–²*ÚÝùAJ§A¨k35FfH Ž]Õ®(ä¢Q%”E挄ڦR->‚‹Bá^ØÚؚȒœ—wº<Á6õ«
£Ak””yvog†A©KÐÞÂ0ÇÝ¥-s•á•Ö9ô•ý—ñÚŒÝÜŽÄ®›ª©¿aGªd&ØýºYÙÊ+@ëÚ¦Dà ΅˜Ví©]™úkͺ*d²ÇF’ÖqÔÇí¨Zãhº*•BÃÑ«RÁrs‘4³D6Qš¸Tzät«>]¼Ñ³ƒŠS‰Ï¡Ä_ªÇ¿kaº+Ù:%D!â3ÚÞ*¨*'e•˜æhß1ò|Á,n½ž×Êrcrp…~æƒW h_0åöt¹jR`và检ᖣî --”ªzå¡U$äÈ×™ÀìT·Ž¦C¿æ¶Ø‡CÅQ|L§ºÞÖßúÚßã…@ŠczÌ<xΣ<ìSRL ¡¾r©ï¡~ž!_´ýhûKS$ê_€ö7€b%«¨ÿ¤Ë*¦Ûd~÷O’Xr³1!Ä-ˬÞëÃ>·Nt3fk£¾ñóqÉÌz¸á…™g‹Î–©îBB°€Xñm&‰¬ã*ëðŽìá(3{iž¸’EÍuoªÐÓ趀hÆ*ÊSÕ©åi‘ÖÒÅE2± +xÚÍËrÛ6ð®¯àøDÍD0^$ÁæäÄvêL⸲RO'Í"!‹>’²êvúï]<HQ2e»gÚá`±Ø]ì“ÄÁðÇó‘ÒÐ BŽ<L<'ÎGع…½w#bq&-Ò¤õf6:>g¢Ð§¾3[ôh „… Î,ùâ2ÄÐ(`÷òäãÙxB=ì^ŸMÇžçþƒžº:›žŒîÎ.>]^'¹ûöÇ“«Y‹ñ4·Ÿ.Ï/Þ}ÞÒ½Í:)ú’Ì”ßG_¾b'ß0b¡ðœ
L0"aH|Ä=†<ÎX»’®G?u{»úè æF”ùt@uœ©Î‘Ï(Óªû½,äxâcìa,Ð +EÕ*:2{(A"!x"BPèyThîW–@Õ¬^kT¼‹´H³ö–¬Œ£lYÖ
ªäÝѶy΢lÒŽÁ/Jƒ2¼üÏÁÛŽÍÙ{gTY Yî°jàZVw-¼(- ‹òU&Q\æCö´ÖÃ|yeõˆ£d>¬VÚ‹++-¼¬kY›i¹°bfÑìKl÷£,+72± +*íXEE½O)Ãð«)Lv<¢RD|ÀCø @-‚‡<öŒÇžeÇ-#: ¤}³(nÑÚè›Æ.öß1ÍÈ }ëØ¥æߎõ‡=Ùµ}ÑùÉ +šwÄõ4Ž +»nÏFñ2•wÒb§vWGœª<£ñï͸®;Zù:kÒUf1«1®ŒK=&µYü{¸^ÇK{W=¨úŽŒRƉö¨b6´+@Û¨Š(—¨# Ñ@>ר‚µÎÿ +f!uÓ…Zåî}9&îÚÀKí3 +·Yš«¥Ù¸¹¹1ë]ÀQ“MÚ,Í~!›MY}3ËÊ(õaºÔ~¹0[De&ÈM–;¥ö\‘l»Ì^
Æ(P"æÀHc +g:+Â`ón™é‚W|_Ë*UiXMtÕ +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¬¢<UZžiÝ(]ÜY$Ë endobj -946 0 obj << +986 0 obj << /Type /Page -/Contents 947 0 R -/Resources 945 0 R +/Contents 987 0 R +/Resources 985 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 944 0 R -/Annots [ 952 0 R ] +/Parent 984 0 R +/Annots [ 992 0 R ] >> endobj -952 0 obj << +992 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 -948 0 obj << -/D [946 0 R /XYZ 56.6929 794.5015 null] +988 0 obj << +/D [986 0 R /XYZ 56.6929 794.5015 null] >> endobj 106 0 obj << -/D [946 0 R /XYZ 56.6929 480.2651 null] +/D [986 0 R /XYZ 56.6929 480.2651 null] >> endobj -949 0 obj << -/D [946 0 R /XYZ 56.6929 441.7923 null] +989 0 obj << +/D [986 0 R /XYZ 56.6929 441.7923 null] >> endobj -950 0 obj << -/D [946 0 R /XYZ 56.6929 373.7178 null] +990 0 obj << +/D [986 0 R /XYZ 56.6929 373.7178 null] >> endobj -951 0 obj << -/D [946 0 R /XYZ 56.6929 361.7627 null] +991 0 obj << +/D [986 0 R /XYZ 56.6929 361.7627 null] >> endobj 110 0 obj << -/D [946 0 R /XYZ 56.6929 167.4388 null] +/D [986 0 R /XYZ 56.6929 167.4388 null] >> endobj -953 0 obj << -/D [946 0 R /XYZ 56.6929 126.8733 null] +993 0 obj << +/D [986 0 R /XYZ 56.6929 126.8733 null] >> endobj 114 0 obj << -/D [946 0 R /XYZ 56.6929 126.8733 null] +/D [986 0 R /XYZ 56.6929 126.8733 null] >> endobj -954 0 obj << -/D [946 0 R /XYZ 56.6929 98.4089 null] +994 0 obj << +/D [986 0 R /XYZ 56.6929 98.4089 null] >> endobj -945 0 obj << -/Font << /F37 747 0 R /F39 863 0 R /F21 658 0 R /F23 682 0 R >> +985 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F21 690 0 R /F23 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -958 0 obj << -/Length 2706 +998 0 obj << +/Length 2705 /Filter /FlateDecode >> stream @@ -2934,79 +3036,81 @@ 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šÃCYqV;ܘÃ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ñ
VH1Ë™·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™„$"ÕêY2u00ãçc2ªàb‰+ûô=ºZÚu5‘ÒÔ»FO$ë!E8¸'û<ŒÊû5†ŠS Ɉ–" -Üx"âÂ×dU“ -¨€©¾PÕt©¦«šHÕR»LmÈ“T©ó\#Õ[1ŒÂ–Å=¾Óe8“ü|ÍÁiŒ‡G(<ÊÖU¦éÜìöP3”×lþÕ4¸ä¬¾\D_ñJHºÎ`ɬ€SØJÓùžxiVÅqÛÚÍPµ¸º¨+0ë¶Á·nM{oL…6XÁ²-‹}õ"¡gR”‡Xƒ -ˆöÆ)•ñÆY,—hÖMc‚Ñ݆ҷl½u®ŽÕšeá?Ýšo°£[o¡æKkª¥Y·n7g>‰ÞÔ'{J9¡ -vòI´‹1Ø#ÕÅÄ.sP.tIÏ‘©‹1Ø#U4MïIñr¹ÍÍý]ˆøÉb,ð{-Cv›Ê<‡&r˜B’·Ë‡jY·“x±)€íEÀ‰ÄßÏ\ï_—ñÊ>î IÎC¾„¼‰Ê¹ì'îƒi¥ižŽ½»(îj[¬Ç>‚^¦ùOÆ‘+Ðzˆµ×4‚dyD¿X¡}[ÉØ/xšð¹ÿ¯Éu:;è4ÚûÓ²«ä™=j’ç³k—j:»Fªá™M/Ãr
ýlÆÏsŽTX3H¬LÃNò>=/Ò:çE¶ËNx&°Ÿ¶ƒÐO‹4ë÷Ðö!nªºJ:OmêÔ>ué±Qvon·õ}àµñ‹…˜&UN˜à|Ðã;‘2["BVwÝ,Ìü™Œ¼@s쩳ìÑfá™3[X+nk—JaxËÅ¡¬þ=kM~è?Pù’Õ¯"®Šíðí¸TàŠwXpNA{?&,„9ºðŒ\÷žÍßöÕŠ„^‰@ëÎa`ô¶Ä‘“ž‰`é·cãG>Û‹ 2˽OÌÑÅA³@ÌæƯœ‡c -Ø¿±C_ñXgîUú“U„È8äAö¬*¢‹1]EDª‹U„P”¤\=ëÈ¢‹1]EDªž‹úÜáÙ„ñ©†Z -"U·FNÚ:Y•á¹ßújÂhpôÿ"ŸÄ³C×ù<ž Œ¦*ï%‡¾gë<%ŒœQ¯±$Ϊ–¸p¿q•qN!Zà -ž=¶ámºKj
ðí1&Ú/L|)ŽoÌ:œ9{fغÂÈÕÀ¹+q—îsÄpÑ\£ˆ*VÆ–1å4ë¾ÀH‡.˜;ï…éæa)ŠüŸäÏþØÔÒ8gë‚7ú‡å%l$·èu$xpŽ¢«Në0b:Ä 3ãO@£A…™œ“ävNâ‘ài8ý„‘Øþb<²#T¨¹\yfvÉ»Âïc×cg=aÙª‡+·Tãïb](°¶®dù•£Q7˜–†
þ¢šað¸åöig[\G¨ý -<Cug*0‹›9xË?Ý›Ei‘ÍßUù}¨.Õ`ç¤ïO-ƒ13~Â>:ºV_Ó…ýuͤ ÜÐ?:Ÿ‘‘ÄnÒªXø7ñ«˜9ªÖ^ -!-h¢è¾Þ®ÜšMqWÖN"{ÎõüÞ#-½UíiÏÁ–(†/‡ßÛíZG®Ì4Éd,Ï•@P2©,ôYþàüccƯá4Ð~Ù
)–d,a"·²IŒ(Édç~“ûûÍË]Y*E¨ -=Ï‚PVx–%ÿªt*úÿ +’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*ä +›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–=Ú,<sfkÅmíR)ï`¹8”õÑ¿gÉý*_²úUÄUQ ý¾— +\ñN +µ#÷‚+ÏÌ.¹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û×ñÌ +ÏÒ¡äñ_•NEÿ…6_0endstream endobj -957 0 obj << +997 0 obj << /Type /Page -/Contents 958 0 R -/Resources 956 0 R +/Contents 998 0 R +/Resources 996 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 944 0 R +/Parent 984 0 R >> endobj -959 0 obj << -/D [957 0 R /XYZ 85.0394 794.5015 null] +999 0 obj << +/D [997 0 R /XYZ 85.0394 794.5015 null] >> endobj 118 0 obj << -/D [957 0 R /XYZ 85.0394 769.5949 null] +/D [997 0 R /XYZ 85.0394 769.5949 null] >> endobj -911 0 obj << -/D [957 0 R /XYZ 85.0394 749.3395 null] +951 0 obj << +/D [997 0 R /XYZ 85.0394 749.3395 null] >> endobj 122 0 obj << -/D [957 0 R /XYZ 85.0394 221.8894 null] +/D [997 0 R /XYZ 85.0394 221.8894 null] >> endobj -963 0 obj << -/D [957 0 R /XYZ 85.0394 197.4323 null] +1003 0 obj << +/D [997 0 R /XYZ 85.0394 197.4323 null] >> endobj -956 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F39 863 0 R /F53 962 0 R >> +996 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F41 910 0 R /F53 1002 0 R >> /ProcSet [ /PDF /Text ] >> endobj -966 0 obj << -/Length 3396 -/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,‘±Ž²¹º¹úÁ¼ÕŸNY.–”HËÅRÄ$…þ§¸XB2‘HhO‰P 7K94dFÁEoül`ü”™erá¹Ðøu¾-‹åê¡\}øÔÔåõ2¡4z·,~ùõñ›÷îi…–úò¥iLÁ¼¡F(eµÉÛÖ0]òŒ¤©Ê,——×LÈF/ÀæÐíÝ„ÄÍKì.J,ª}¹êšýqB¨ŒIÂ%;ú4!f 甩Œ1’IɯôUþ™JZÝ×;4¬,°ÆŒ¤±pR™Æ‰JTlžò}=!…’¡«¦”u^m@+67Õéé ë?á ÇþüÓ¤£ð”(šÆ¡£ü§‡û™ŠN¬_«”áÐkÿ’˜wb$É”JœåªM‰€2!)V$åT
- —ÅX²PT¥Ôôcy–&rœMm1–i -º¡»gqF“êlÿži¬@`XXï4S,Ðà¦ÚV›|‘Qgñ/Ð;–„RæL}ËÏìÃ~Ò|Á[ôÐR¯ôo囧üØZqØîZCîJC3h¤USweÝyÝÌçæ±Ý•«êgJyY -‹%§1á eΫ™õjÊ7¥ÙfÑûã®Zå›ÍѪÚüæ槨Ö×,ÖåL×@^7ûmÞ¡C“9÷HAÒKî1`šwÇ„ÚïëbuÚ£R„%2;Û£ã÷Ì',V"èñVÏBÊ#cmÓÙg½z Å¢"rm¨8Cš³ÙÚx‡ŒŽÆ~Q»q(Ä)A}<ü2#sgz¸ßç[C€ùkžZ£MçnmW:†b[ÕUÛísØùI»Ï”Æ(@;«Qmµ!,6»¤T8`Aã¨Y›ßÜü«*¢¶Ü?‚Û@ -uÖ˜HËÌïW_´Füê!¯ërc„o›¢çàõ¯ÖÆg1æK™„ wl¸ö×it˜RI(ˆüRyÁß84…Sû©êšƒEļ¶ -½Ñ -ÓxÞB®3&r\¡À ålöÖgTÈ M~7!E»òD]%®¿Y1nE<VåÓ”.á‚%eö/ -þ}Þ–žklÌpŸÃè"KYhÍáÔ{÷¿¯ËºŸäÙ9Ž3J -sÏ\Çð6ü½¾ -bXvÞ¨žklÕÐ/ j†¤‡f½9´»·w!âè°+ò®lÍÖ„)KáOq¬ómµ2–2ᘰiRÝô¯L«²‚tAkiK‚Äâ´aª]˜§f½M×`¤Iýyjd¶–æÓVxhòe• CĨã¼4R$xm}Ȥ²¨:K6uÝ•æÕ6/ÊáSK}ÙZ5–˰Ćc¡ajjl‡†½;â/C£AÎmíφ µM Õí³I¾±µÊ6?¶!A¾7LWóh‹4ú¥9ìë|c\¨†œugÛ# -€¿±\¶4DÃy°ë{ɹ‹ù¸«CñAŸøàÃChk{ç}v¶G=1ØóóýÌ{>k˜oó®+·;=7ÜçÙœžÈ\ƒ}¬ZOÕfrz8sÑ¿…µOe=‹_°0ˆL“ô<~
¹æñËsµò§yô -å²ÿ+àåbÔ³í#Ù‘I§#ÙÀ¦/êüN;a’öØÅ“Ìx$sóØÏ»!÷^/-–‰$ÑX†ïë¦e(•ŒXæ L¤$NéÉ©d5À2å±L9,S¡.ðì±M
±
kô86làíÙRø-+W°0ÄÆ0a6Ô2;<SÃm>(ªöó)hÓP +1006 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<v”ÿôp?SÑÀúµJ½ö/‰y#I¦Tâ,WmJ”€¤X‘”S5Th½Œ(Æ’…¢’(¥Â{ŒåY˜4ÊqÚb,Ó +¡~&=Ÿ¡;Ðè顺fÑêÁ|üd‘À<国H‰¨n:«°™ +"¿T^ð7MáÔ~ªº‡æ`1¯-€6;\ESûö©Bo4€Úî6ùq²‡6¿·ˆ¼-Ûþ!oÚêåý— ÔBr€VL%”³ô¤#CS$véˆçÂáÿ¨QIbÖ˜Àrùý*
EÌgHžËOÛ™Dr<Hgð«ûPâ’ÈÅièØ^-ä%róS‰»‹q)…‚½Q˜ìå/ÊûP†Òá¯Ì’ÏA-’†bÇ”p–±ÏBÏÒñµe#„¼ÁHc$F8ŠdiÖïØA0d‰G1PÁ¹ie— ‰À°±6¿f—õ‹³ªï'ËÓy²”÷²ÞÞ3gOCÎn™´¯—›&/&Ñ1"N +þ}Þ–žkjÌñ>‡ÑE–²±5‡SïÝÿ¾z,ë~’gç8Î(¼° +†\ósì¹Ì¯! yMò(=7É“´yvzþ˳C +þäo›W˜{æ:†·9àïõˆuy¦Ä_pñÇe|œº]»=x4 ¤øÒ—Aÿî +”¥ð§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µžªMpz8sÑ¿…µ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Ц¡ +À3¢MÙé¡J.£çî3®·ø±[ +ðVV4.&md#¦,C8à¦XÒoŒjxzšáwÓ +¯ßܾzù¯Q¶KƒÎæ>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ÊØ©œ__”¼$jC®3ëËqéÚ~—wí´ÜÊ`/Wò|·žkÚïxq±\ xÔñO˜7ï«ÎÚÂoÙØÐãWíØêÞp§Æz³ÆËbT°ÓkÞxžÇðë¡Ü7Í<8í¹§I×apõ}{ñ¨¹¿×™SFlÂê endobj -965 0 obj << +1005 0 obj << /Type /Page -/Contents 966 0 R -/Resources 964 0 R +/Contents 1006 0 R +/Resources 1004 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 944 0 R +/Parent 984 0 R >> endobj -967 0 obj << -/D [965 0 R /XYZ 56.6929 794.5015 null] +1007 0 obj << +/D [1005 0 R /XYZ 56.6929 794.5015 null] >> endobj -964 0 obj << -/Font << /F37 747 0 R /F39 863 0 R /F53 962 0 R /F14 685 0 R /F21 658 0 R /F23 682 0 R /F48 885 0 R /F55 970 0 R >> +1004 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F53 1002 0 R /F14 717 0 R /F21 690 0 R /F23 714 0 R /F48 925 0 R /F55 1010 0 R >> /ProcSet [ /PDF /Text ] >> endobj -973 0 obj << -/Length 3750 +1013 0 obj << +/Length 3749 /Filter /FlateDecode >> stream @@ -3017,83 +3121,77 @@ VŠ”ÈJñeq³æ«˜Œ×¡±âo0Öˆ]-‰‚¯ÃÃÁß™éâ#ÉGÎtqhM“éºùv<k«©æ 癸`«s°Ó¶ p?ã®(ë#º2OŒ w»«Ëýn@ß~ª9O;2G´ã…Ì‚ø×ûíãÁQ¶ÍàäÔ;™ÿº¯w÷³tÓø'ùucû<xؘˢ*R40’å)°n ž”Ê¿Dß̤›³ÃmQ€‰tM¶6žÆ¯ûÆ”(ŠËP,k‚(lK ÞH!nÆ
¨(ïÏpÒ)öðºq©-l \5‚sÒ9¼¥i+,˜G–p¶ Çaã*¶Ê¡ª]&;¾Â‰Ô™ŸE8 Ï‘œ¡7½ÅíÙîb¥ -IPHEŒ«ãÃÒWt¶VPÕ4ëý…]×öeX °n¤+úü 0—€ït®b×UeÌŸˆÄ°ÔGØ_ÊñEãf ŽÌš\Pïkâu=–¯‘XÈî#„d9åüiº)èt)6[B•Wźl -`z&
P;š¾óAwQ³Âw0 -[ìCL7YêX[ÇäÅU¢“¤DúxdœQíìøLÏ&¼
Ò„ñÒ'ÃÄ}¿ïªW‘³DáCEÃò¥!:T™¨Lx&]‚qßÐÓ¨íûÏ4jºˆ$2•è”§GGú¹~Ž({ð“úg¦*&"«©ÑS“€$•KåµfxP]ªfÁŸ -pƒÚkÌS1òªFYvÖÙXZ¶#rS0øêý‡¯]»‡ñŠÞìPÁšu]bæ8ÐÁv8¶, c¸j
i§V&;;!'HŠ@¨Y“S稑øCÝÕ;òŸ8mËjøÝݘվë\ä;P
.t¢4Ëfô×(Ë›ÂêuáNXpå3Ú<Št(wÍkd®e&“\è|)5Ò˜Eü¤‚éÀÙºŽ^î®iðq‰=üz¾ ‰ðR!XNVB¢b¥½L_ð-î-Ô%.Ž°ÙüŒD”‚ð¹â>DÛWÖwËÔ:è-†
™RbŠs£yÀÊ+P[A€Ü6m±sË{¤x„3ý}Ì•i°`Åù¬rªN9d£y™à×°×¾ô-P§€>£Þw‘i‹ûSp’§ùa÷ÔKØiv"VAÊ•3¾ðªC„U‰$¡ã -9dì,Ë^ŠÄ¥:^D×܃a¦±Í<Qyˆ®‰áÅÊÁ$3Œ, ä Pz -üôŸÕԲƗO”¤À¨†¾Ä¾:€M‘Ëeô @eÒeJc2Ü@ol>„¿šÍ‚0ë*Ž6M¹! -´6ÐÝôûÖI -”µƒŒ¬ªfÚ©*Xª4\õv:æf}YïÔ'r³ª)h³çàv…¯£z¨íéB7Oƒg_žKÈU$§;ßÓKšÅŠD#ƒôXЩ9(P:G¿1le P_#Ü€¦ -m^p´9÷úçnG‘øÔ¿¡N”‘¡s¤CYÂD0 jtEÅœçAym•¯Þn³Ã3x½ß|¡‚Tuæ¿è*b‹Xíîàõ©¦‡áI†Î öPå¤%Ó‘Xj‘™Rfü¬DH—Õ }r‰ !_v.
+ú'8à‰JƒyùÞ÷ø½ŠÍµ5¹$I¾ÏQ{å«Z䆧Kçs1aVÛ½
uÂ5E`¦ Ÿ/EkïèaXõÛÂ@n×ðòßUä+ÛЮ®Ý"Ê_9î‹ÖöçfT6
”±VDåOîOÔË7{[HéùÆ),n›Ïu,ûY´ÂË]?¼^S :0A‘ -ŠRÕu -zô¦è\Ë)î•rt½Æò±W”³¢O~êiæ\¶ -¨RâyÑ>ô;ðÛQ•Aõ -Í““Ô¡ÄäŽÅE‘&à8ÅäZPß4¾³æ?ƒÁÎ4ùß…JE:séê±Ø
6]S©OÒ`T”eý8ºq÷Lƒ ¶JSF¡|‰¤ÒÔQ¹* -ßxá ¨ìè: +IPHEŒ«ãÃÒWt¶VPÕ4ëý…]×öeX °n¤+úü 0—€ït®b×UeÌŸˆÄ°ÔGØ_ÊñEãf jNÈ@½¯=Š×õX¾Fb »P4’å”;ðW¤éJ¤ Ó¥Øl -T\gè²m(€é™4l@íhúÎÝEÍ +/Ü1À(l±!0Ýd©cm“W‰RL:þéã‘qFµ³C~à3=›ð6HÆKŸ÷ý¾«^EÎ…
Ë—†têPe¢2á™t
ÆA~CO£¶ï?Ó¨é"’ÈT¢Sžéçú9v¢ìÁO:蟙f¨˜ˆü ¬¦FOqL’T.•×šáy@u©š]*À
j¯1OÅ@È«eÙYgciÙŒÈMÁà«÷¾víÆ(z³CkZÔ
tUˆU˜ã@Ûáز€Œá6ª5¤bX™ìì„œ )¡fANNœ£FâuWïÈâ´-«áwwcVû®s‘ï@5¸Ð‰Ò,›Ñ_£,lv +«×E„8aÁ•Ïphó(Ò¡Ü5w®‘¹–™Lr¡ó¥ÔHcñWp8L(Q08[×ÑËÝÃ5
>Î#±‡_ÏD"ñ^*ËÉê¡@HT¬´—)ã~¢Å½…ºÄÅ6›Ÿ‘ˆR>W܇hûÊún™Z½Å°!SJLqnô/8@y¥@ + +YÅæ:»PA€Öº›~ß:I²v€ÑƒUÕL;UK•‚«>ÐNÇܬ2ëúDnV5cVãÜΡðµ`TU¡=}AèæiðìËÓÂ` ¹±Šät'â{zI3 ¸U‘è`dÐÂú!5‡Jç(à"†êk„ÐT¡ÍŽ6ç^ÿÜí(Ÿú7Ô‰224pŽt(K˜&A®¨˜ó<(¯-¢òÕûÑmvx¯÷›/4Pê ÎÀü½UEla«Ý¼>Õô0<ÉÁ¹#Áªœ´d:K#2SÊŒŸ•é²z€ +·.týðzMèÀEÄøK¾o€Õ˜ø×Më€q=Gé^+(JT×ìŒÈ’\†dÏîuÑ*èј¢Cr-§¸WÊÑ _ôJÊÇ^ PΊ>ù©§™sÙ* JUˆçEûÐïÀkl#DUÕ[(4OVLR‡“:Eš€ã“kAiü}ÓøΚÿ;Óä*éÌ¥«Çb7ØtM¥>IƒQQ–õãèÆÝ3
‚Ú*M…ò%’JSFåª(|ã…ƒF ²£ë +U™¿?`¢6Ð’òÖVà endobj -972 0 obj << +1012 0 obj << /Type /Page -/Contents 973 0 R -/Resources 971 0 R +/Contents 1013 0 R +/Resources 1011 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 944 0 R -/Annots [ 975 0 R ] +/Parent 984 0 R +/Annots [ 1015 0 R ] >> endobj -975 0 obj << +1015 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [120.1376 365.8002 176.3563 375.0156] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj -974 0 obj << -/D [972 0 R /XYZ 85.0394 794.5015 null] +1014 0 obj << +/D [1012 0 R /XYZ 85.0394 794.5015 null] >> endobj -971 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F48 885 0 R /F55 970 0 R /F21 658 0 R /F39 863 0 R >> +1011 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F48 925 0 R /F55 1010 0 R /F21 690 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -979 0 obj << +1019 0 obj << /Length 1632 /Filter /FlateDecode >> stream xÚÝXmoÛ6þî_!û`Ãñmý”iêM»ÄÉÖvÅ HŠ-T–2Knýï;Š”,ÛLtÁ6þ`R<ÞŸ{îŽ 0üHÀšê@êqLx,G8˜ÃÚɈ8™° -‡RÏf£ƒçLiAE0»èR+E‚Yú~ÌCЀǧ‡¯Ž'!åx|~|6á|| íüõ›ã³Ã‰ŒÆ³éëÓóI(±ŽÆG/ßÌ:‰¯ë8z}ú|zr±Ñ3ù0{9:žõ§ž”`fŽðûèý¤pà—#Œ˜V<¸… FDk,GgˆGŒuOŠÑùè§^á`µÝêEŽ`D™ >èô -·£†1Ò¸„[Y“ïPR•×CB¬¸3x[‹ÎHQT·vØ,2;Hªå2.Ó<æC¢€SJpI¤•Þï¬h¤†©‰´”Â6.ZèWYQÅ©ÇÓÐmpŠ-bM.I.•e–4vÒ=ì£h§7ÕÊ hÎì -8PvH¹§H›âà-öa¯1ªÜ¯äTiĈËÆGsÀ}غ¬µç@®žQŽ'r;÷ÎzjÙÚj#ÃW€ -‹¨„¦Í³ÒcZ0D¥ê„o,qç«xi-Üæ… †—Ÿ²2‡wv-±é²±/DàbèÌ}Eú²ä½Û¶[C&ú…»j
yÏ°vÌ2F‹º²x1&PD‰ÜÎè4¯oŠØxL¨+ -q†£>ÛÛËÚm'Pû#%†i‰"ÍÈCº kß3øN?ù¶]ƒk˽Ø}t¹a‡óNCëÎ2ÅÕ·³-5ERIÅNC1Š,cϧ'/.Þì‚D$!ÁY0Pø÷\ì5îû¸CˆIŒ-'ûëÛô†ô¸/A®¥¾LÔ‚H~C-èêÍæêºãJC:Äu¶G¶®7„èǃ‘i†$– +‡RÏf£ƒçLiAE0»èR+E‚Yú~ÌCЀǧ‡¯Ž'!åx|~|6á|| íüõ›ã³Ã‰ŒÆ³éëÓóI(±ŽÆG/ßÌ:‰¯ë8z}ú|zr±Ñ3ù0{9:žõ§ž”`fŽðûèý¤pà—#Œ˜V<¸… FDk,GgˆGŒuOŠÑùè§^á`µÝêEŽ`D™ è"2€Ž‚"%y ¹F‚QÖbój•7‹å$Ÿ,–q.Sþä©9Xa›æœ¶Òu–¬²Æ‰&ììîŠòrzr¹¾b—e|ôlyŦó·çÏš·?Gó·å%žžÅ»“‹ù»¥¾›žÏSªÍÚN}H5RJêm+ŸwlÛ(W7M^•µ5þg+áÝf×ñºhÂ:[}ÊVVœP‰0üˆ÷TÝŽÙ:ùU™&¿ÁÔï%xyð€Ü€Œ°jEf‹¼¶ÔùcZdßÛI~íþ˺‰‹"Kí4®Âí¨aŒ4.áVãAÖ$Æ;”TåµÇÅP@+îÞVë¢3RÕ6‹Ì’j¹ŒËôù(à”FiFe«÷;'ª†©‰´”Â6.ZèWYQÅ©ÇÓÐmpŠ-bM.I.•e–4vÒ=ì£h§7ÕÊ hÎì +8PvH¹§H›âà-öa¯1ªÜ¯äTiĈËÆGsÀ}غ¬µç@®žQŽ'r;÷ÎzjÙÚjZæ +PaÑ +:µî‡ÌmMƵ ÎÛGeÖ6xÔ–5x§›#ÀÊŽæ¦Æ¥÷‚¨‘”\õLjñ;,šlUÆMþ)ƒØÁZŽ…¢Qmg¶uÔT².KmíóQC.PÓÚ}aìqQBóÃ}œ[LÂg.Õ×7®Bx0…Hh=$“?¡8¤5!l—Kmáq¨¬œÁe•æ×wk +ªª¦ü!°Š¨hÜômõ õCS0ALp!ãˆ,ú2„p™€[m>/c/ÛL‰ŽHÔn:ÊVMœ·x“ñÅéô;ªÝ~˜Ð¾ÏÂsw ]§4¢]§4Ë•ÝÑĻ՛,É
€‰ÇI{ÁûÞÊŵ}šfu²Ê¯ì% ºr¹cm«EõWE†|·¼Ù"«]¤GPñª[í{úî[¯¿`iÔ'òGSÑ<%X!ÎpÔg{{ÙB»íjD Ä0-Q¤yH7aí{ßé'߶«ócpm¹×»ƒ.7ìpÞihÝ™B¦8` úv¶¢¦H*© Øi(F‘eìùôäÅÅ›]ˆ„"$8 +ÿž‹½Æ}·c(1‰±åä‘a½s›Þ÷%ȵ³ÔW‚ ƒZÉo¨]½Ù\]w\IcH‡¸ÎöÈÁõ†ýx02ÍÄ`ܼ©þ«ì¥É^è+ðľB_ ·‰uGßÙñÙ«ûù;PùhÞsÓÏà¡ŸfpRd]ìÛhÇ¿ì¼¹ŸbvÒÿ7ÇFŠA»þ2ÇDò’v›žÎî§Ø@ã£QlÏK?ņnþ{´“þW(F àX2¸)Êí/{_ endobj -978 0 obj << +1018 0 obj << /Type /Page -/Contents 979 0 R -/Resources 977 0 R +/Contents 1019 0 R +/Resources 1017 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 944 0 R +/Parent 984 0 R >> endobj -980 0 obj << -/D [978 0 R /XYZ 56.6929 794.5015 null] +1020 0 obj << +/D [1018 0 R /XYZ 56.6929 794.5015 null] >> endobj 126 0 obj << -/D [978 0 R /XYZ 56.6929 466.6686 null] +/D [1018 0 R /XYZ 56.6929 466.6686 null] >> endobj -981 0 obj << -/D [978 0 R /XYZ 56.6929 439.3642 null] +1021 0 obj << +/D [1018 0 R /XYZ 56.6929 439.3642 null] >> endobj -982 0 obj << -/D [978 0 R /XYZ 56.6929 409.8468 null] +1022 0 obj << +/D [1018 0 R /XYZ 56.6929 409.8468 null] >> endobj -983 0 obj << -/D [978 0 R /XYZ 56.6929 397.8916 null] +1023 0 obj << +/D [1018 0 R /XYZ 56.6929 397.8916 null] >> endobj -977 0 obj << -/Font << /F37 747 0 R /F39 863 0 R /F23 682 0 R /F48 885 0 R /F21 658 0 R >> +1017 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F23 714 0 R /F48 925 0 R /F21 690 0 R >> /ProcSet [ /PDF /Text ] >> endobj -987 0 obj << -/Length 2336 +1027 0 obj << +/Length 2335 /Filter /FlateDecode >> stream @@ -3106,31 +3204,33 @@ xÚ¥XK“Û6¾Ï¯Ðm©*ˆÉä”õ#åœZÏìa+ÉCR3Œ)R);ã_¿Ýh A/h5þ;“çe¾.àŠœ»ò?‹‡tùsç÷þãص8!†BgVo„u)Ü*M3_t¤¾èxóújJ »ÿ=Vˆ îÒjÜbLj»Ãb(ÊÜñ3RÀ†zIl‰îçYÔcõ‹|™ -iVQyÔXCröš’>CãXÝÙûébå&»²=“œpØ®0ÀLa@Ô•»ósd$Ët +iVQyÔXCröš’>CãXÝÙûébå&»²=“œpØ®0ÀLa@Ô•»ósd$Ët +ïA{§¦‚ô|‰íÖüdØ@óXò¾éìéé\8<ö綊O²ËVWÍ¢ÇÁvgÇwô󵩙Bü²öp4•
Ó¢•‡#™*†H +"ŠgŸWNü?n¦w»endstream endobj -986 0 obj << +1026 0 obj << /Type /Page -/Contents 987 0 R -/Resources 985 0 R +/Contents 1027 0 R +/Resources 1025 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1001 0 R -/Annots [ 991 0 R 992 0 R ] +/Parent 1041 0 R +/Annots [ 1031 0 R 1032 0 R ] >> endobj -984 0 obj << +1024 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/usr/local/share/db2latex/xsl/figures/note.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 1002 0 R +/PTEX.InfoDict 1042 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 1003 0 R +/R4 1043 0 R >>>> -/Length 1004 0 R +/Length 1044 0 R /Filter /FlateDecode >> stream @@ -3143,12 +3243,12 @@ qª„Ñ«ò^ÿï>‹«>÷—
.13×…Óƒ!¶3¢SËAÕ”ih¥Å¨Š^…(€<Îm䦽ªšÛÆlLÊâ³ò7Ù n*Œ1½÷¨¾x¥Æˆpîâ‹&Xîܧ³±è\íD¤ßä0}#XŒûž˜‹¸À>#^V°¡|2Îi‰9ÊÎr)`˜¢Xh¡Ò& „hb—H°Œe"Ãê þrÓGçX5¾ûû8‡´ÕªOª«t–Ô³$Ây°‰—BÒ›ÀÄ5©/¨vp÷o`kA“ôr±ñœÓ4N.4Žæ endobj -1002 0 obj +1042 0 obj << /Producer (AFPL Ghostscript 6.50) >> endobj -1003 0 obj +1043 0 obj << /Type /ExtGState /Name /R4 @@ -3158,127 +3258,132 @@ endobj /SA true >> endobj -1004 0 obj +1044 0 obj 1049 endobj -991 0 obj << +1031 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 -992 0 obj << +1032 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 -988 0 obj << -/D [986 0 R /XYZ 85.0394 794.5015 null] +1028 0 obj << +/D [1026 0 R /XYZ 85.0394 794.5015 null] >> endobj 130 0 obj << -/D [986 0 R /XYZ 85.0394 769.5949 null] +/D [1026 0 R /XYZ 85.0394 769.5949 null] >> endobj -989 0 obj << -/D [986 0 R /XYZ 85.0394 580.0302 null] +1029 0 obj << +/D [1026 0 R /XYZ 85.0394 580.0302 null] >> endobj 134 0 obj << -/D [986 0 R /XYZ 85.0394 580.0302 null] +/D [1026 0 R /XYZ 85.0394 580.0302 null] >> endobj -990 0 obj << -/D [986 0 R /XYZ 85.0394 539.9341 null] +1030 0 obj << +/D [1026 0 R /XYZ 85.0394 539.9341 null] >> endobj 138 0 obj << -/D [986 0 R /XYZ 85.0394 315.9171 null] +/D [1026 0 R /XYZ 85.0394 315.9171 null] >> endobj -999 0 obj << -/D [986 0 R /XYZ 85.0394 282.0038 null] +1039 0 obj << +/D [1026 0 R /XYZ 85.0394 282.0038 null] >> endobj 142 0 obj << -/D [986 0 R /XYZ 85.0394 146.7217 null] +/D [1026 0 R /XYZ 85.0394 146.7217 null] >> endobj -1000 0 obj << -/D [986 0 R /XYZ 85.0394 117.3479 null] +1040 0 obj << +/D [1026 0 R /XYZ 85.0394 117.3479 null] >> endobj -985 0 obj << -/Font << /F21 658 0 R /F23 682 0 R /F62 995 0 R /F63 998 0 R /F39 863 0 R >> -/XObject << /Im2 984 0 R >> +1025 0 obj << +/Font << /F21 690 0 R /F23 714 0 R /F62 1035 0 R /F63 1038 0 R /F41 910 0 R >> +/XObject << /Im2 1024 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1009 0 obj << +1049 0 obj << /Length 3348 /Filter /FlateDecode >> stream -xÚ¥ZIwã6¾ûWøú½‡$ -Ež©ët¢0Îóäz{%••Â4WW?NfÝÖEFÆQ˜ˆ4Yàd"–8©ò00…œ|ÚTð¬T¶Ú¿V{jꦡ–ilG®(Œ»Ö4Í‘Wíëž7#_KYÛ~‰¿8Óûó‹n»kª~ìµ}Õö–Ï^Ÿ-v¥é«’:_ºÖ
gAÏ´Ô~£› -ìfèËîÀ§u{ZWìݸE k4Ç6³t0Pw¤f¤ -þè†=>ÕuHi±Hk‹n¿ëö¦¯ü -ØêöŸþn&SÁ»ÚšçfQŽ#%"ÊO@&bb4:°AtâÔ`‘ŒKÖÇ)Ä=Y–ÍX[×ûªúRÑ¥¦Ä±ˆyƒÎ$”ˆ0ÇØÍKh%Càáôd¤‹Ð Çߺ×júˆ˜TîK—ˆ|J;’’ÇÚßòGÛ,‘’†zR¼žã
ˆ'Nudœ‡YŽÁߥgEÏ’x÷”€¼-»¿ädŸ"Š‚»’œÜd1f+ãàaÙ"D®Ó¹
¸ãÌaAR‡*‹ô_ˆ!
ã$öÂ%7™0§›Î”g“þ—çÔîŽWU;ªæ*Ñ2Œ¢(þŠŠN|m8>:±Ià6ª
Æœk·9%¹YÅp„YÅ~æì~çÉÙÚÜãÍr’K>Da–fr⿲%·š—Å£[¥ñyÞƒ#lÐ}Wt¼×Aì4Ô%„†ÆºãClÃøq¼Åm¢³+ë¡u
,~š7KÐPSpŠ<Qã)"ÇŠ¡8^£|ðÃÀ…úäD•cjm¢½ÏW²€Zgχý„øF¥'§›r¨¡‚‡÷oi -‘N¢ø¤ãâm±sÀÐy¼*E˜I•,Ú01¼
cÅò}œX¹`™ÍFsZË¡®îûj»ë©ãBC¬·8kulØ8ÔBâÆ7Ô=ÍÖܯ>¨±âú%…¥%h¬99Åñm÷õ¼cfË `€yšt©£Íš±UE
Ò\[Ùb_ïNç8Ç+*Àú(˽döX̱ýÊiÊ¥ˆ” -•Ê½ˆŠ†óË¿¼Eé"7Éû¸„ry¼ˆÂ8V^[mø‚!ÇbLÎô%•ùyl$96z™ô§‚ê_†;UϺ(é~O6â‡y-¿ÖÕ±Ú ×Ùú¹†;Ç,G0_]\Ãw±aw®v"¸hƒ_@°Š[á‘ -ƒŠêsãŒö5‘®¡ÈÈmåï` 4ŒvÁS¨á`Pr¸+Â_IeA°Þia<…ä@í‘\<cañ2c¥3d£´ûaÇAýÓÉý¹»Nëà5TÒ’L«±]k™¼–&È‚^L[ñ¶£¾ö ¦íç/#d‚*+J®é“lŠÃàé¬àSóÿYæùÉA¼XvÞ:‚ô”~š#gÖkŽ:‚´‹:°Ku\tßµ¥A¦B“5;-è#„’IÀ‚¸W"lÓ<Ÿ+Î0fÆbÚRaöƒæMÎ’Ÿ¦¦b:v:PË–š¤ß+¿¸¥£]¥ZM%Ž³5ï´Ý–GÊê™ÂÍ®†µ+V÷Ÿàeüu%+\Mœ™ž -Þ€#ì6'—B'CK›dªÎâ)h*óÉRÓ1-¢ïÖ•I±‚áEè×_kC -B¾aé˜*bBîcD\ñÙà/üÉãᮤ†-k^__“8/S|‚“Y@*Ǫ!n¤Z•;Nù*4æ/¤™#o]íǨ -âšóæ·D0(U¡ƒïºZ«3À–‚ïh `¥`—)KF+{
Ò3œãÈÄû°7Éú¤/ÉÁ°×Gêºè:¾Z - E,¦¤Px[t?¬ÐÂé8W–3IÙ.èZÇÙH ï~¢à[(z„ÅĘÕB2Ž*tÑ:%äu]@.aê‘Ŧ£°XsšßÁúxä…&Ûôi펟CµW¿'Á×XH…¦ÚÓz/¦iM_@ĪYϼø™€å5ô–ð±Û7å"*Þ¶¬:¨ŽÈ(Ò92Â!£H'È(!£¨Óñá‚ÕD·¸¥®šùÐw¿ÑÐDµ Ø„DKËX·ðªÑÁðsµ©Ûò«¿÷õäw'¨T3ºÔÑ)Î㌱Ž½N>x9‚—™'1b’ -Ë®0òkïñ¿1Ÿs!Ð +xÚ¥Z[w£F~÷¯Ð[ð9#4Mþ93öÆ9‰3k{/'—‡6 ‹…k4¿~«ºªHÌæaè{W×å«‹®øW2ñ“,ÊV*‹}„r•ï®‚Õ+Ìýý*ä5k·h=]õÝóÕ·wB2?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 +0B +‡cG.º‘'`d›'ÏO0ú:hàN_ÒqõhKµeH–°˜3åíZ+æÌékܧþÄ +'9™¬â,ò#&ÉMv¯+j<N²·qýzºá2{»<¹öëGzÈܵC„ …$Ð:“ {Ÿz0rå…ùýœè0ˆý8€¼;N!Ñ“åDs\µž.»$õò´‰¯ãW!8À™«£€^ı§óÞJܶ
éÃø¹7æ\~wÿð¦2ú˜aÑuÏÛHÚز*Œ
k°É16!ýršC‹¸Ñ@ÐdŒîŽØ•¬Ç4î oabQ‘7bÚƒN ¶š%BH9Þ4©/Le P--1¸¤Éë¡àŽÃil;*aûb<ŒóP/q +cKüž|*,rÀû°Á†‹ótÞB¢qà€/²Q¦ÖAÛ\*ôÚw3SFXûÔ¼£Ô)8Ü;ÑŒçœ\a•Í11køè;Ç[xFÇß-U×îË@¸!(ÓƒáÍ`C;„© ”À8‚ä
ƒ$çÈ‚„ˆ[XÅìƒ`˜QløL68µ·*pé.EšÄÎWŸ){Zoºv·.àè +äd5Çwí×óŽ™-G€ú¥zjÒy¤fŒ6ïhÆ”%5Hpmiò®ÚŸÎ±ŽW,T€õAš9ÉtXÌ1ýÚjÊ¥ˆ¤ô¥ÌœˆòšóË¿¼E*"·˜÷q åòxøa(¶šðCŽÅ˜œèKgç±Q̱ÑȤ?Tÿ2Üy*{Ö%@ L×ð{²+8Ìkqø*(ˆÕV¸vÌT/Ü9f9‚ù"¸èb¶¸‹
³·µÁEü‚•”Ø +‡TT”ŸûëÐg”«‰´5EFv+C˜¸ a´žB
ƒ1‡»Â#ü©,øíÈ&œJ 9`{$ÇXX¼ÌØ8öS¥£´ûaÏAýóÉýÙ»Nëà5TÒŠ™VmÚÆ0y
M½ê¦úâlF]ítÓÏ_FÈTVŒ¹¦3L>²)ô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§0SÆ: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 +ó§ñº«¾¸Ë8‹W‰=öÃO¿PÚ¾ endobj -1008 0 obj << +1048 0 obj << /Type /Page -/Contents 1009 0 R -/Resources 1007 0 R +/Contents 1049 0 R +/Resources 1047 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1001 0 R -/Annots [ 1012 0 R 1013 0 R ] +/Parent 1041 0 R +/Annots [ 1052 0 R 1053 0 R ] >> endobj -1012 0 obj << +1052 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 -1013 0 obj << +1053 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 -1010 0 obj << -/D [1008 0 R /XYZ 56.6929 794.5015 null] +1050 0 obj << +/D [1048 0 R /XYZ 56.6929 794.5015 null] >> endobj 146 0 obj << -/D [1008 0 R /XYZ 56.6929 556.0057 null] +/D [1048 0 R /XYZ 56.6929 556.0057 null] >> endobj -1011 0 obj << -/D [1008 0 R /XYZ 56.6929 521.4772 null] +1051 0 obj << +/D [1048 0 R /XYZ 56.6929 521.4772 null] >> endobj 150 0 obj << -/D [1008 0 R /XYZ 56.6929 361.9951 null] +/D [1048 0 R /XYZ 56.6929 361.9951 null] >> endobj -1014 0 obj << -/D [1008 0 R /XYZ 56.6929 325.2573 null] +1054 0 obj << +/D [1048 0 R /XYZ 56.6929 325.2573 null] >> endobj 154 0 obj << -/D [1008 0 R /XYZ 56.6929 133.2872 null] +/D [1048 0 R /XYZ 56.6929 133.2872 null] >> endobj -1015 0 obj << -/D [1008 0 R /XYZ 56.6929 104.8892 null] +1055 0 obj << +/D [1048 0 R /XYZ 56.6929 104.8892 null] >> endobj -1007 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F55 970 0 R /F39 863 0 R /F48 885 0 R /F47 879 0 R >> +1047 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R /F55 1010 0 R /F41 910 0 R /F48 925 0 R /F39 873 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1019 0 obj << -/Length 3002 +1059 0 obj << +/Length 3001 /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Íì +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Íì +¶û7Á’T8_9äUÛ +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´E î·ÚÞ¯Ëê½Çï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] Ž“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 @@ -3288,157 +3393,155 @@ xÚå]sÛÆñ]¿‚o¡2æå>CòäÆJãLâ&±Úfšd¦ ›¨)€! Ñj§ÿ½»·wÀI©™>u<2îc±··ß» ˜qø'fÖ0®2=K3 |_æ«]ûôß;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|&‚š -*Ri¨âÌ…_¢ÄPgd .ËèÜ©‘ŒÆÇNË(>öÿ/¨@^ å6°ë¼#¨3P—%xîÔH‚ãc§%{ÙÊ@¢uU<IŠF2ÈíÒ'I1yv<ù/¥±NÌx–M÷pð'
šš}©¦NNª£NLº2kÿ½×)¡OC[1ÅÖ_ë,†¿ô÷!Gë¢YíË%ý8ŽZÖø+ (Eæo궨ò6ŒQáéŒS4YZv4šÁGâ/FeÈàûqìô6!cæ¨Î¢ÅÇú~ßÿ4(ª8ŠÐökŠb¬ÒD`µ²3Ÿ‡%OÚÜ¿ŸÑàÇH¹;øEü±rãEF¼Åj(ÜJ1qDMÀÙ˜#û -@—(ãŠ>+ÍØd\_ÇáiT»¢)¨%þž‚„ž¯¶ÔìÁ°¡é¿|+0Ø„Áÿü3©¿ð‹.Z&âÅt*4èCP¢÷-…E¹kïëŦØ'Ði*ºwÞáˆû™ƒþc§ó{Ãð׋"ƒ?o
¿ûG’½O×P´Z+§…¯x¬ÌÒ@’.Ôû5å1éÿÜOáÍendstream +“7 `©gŒN¡wbAÎÇü&ePÁ†¬¶ÿL„N|&‚š +ä•Pn»ÎK0‚:#Á endobj -1018 0 obj << +1058 0 obj << /Type /Page -/Contents 1019 0 R -/Resources 1017 0 R +/Contents 1059 0 R +/Resources 1057 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1001 0 R -/Annots [ 1021 0 R ] +/Parent 1041 0 R +/Annots [ 1061 0 R ] >> endobj -1021 0 obj << +1061 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 -1020 0 obj << -/D [1018 0 R /XYZ 85.0394 794.5015 null] +1060 0 obj << +/D [1058 0 R /XYZ 85.0394 794.5015 null] >> endobj -1017 0 obj << -/Font << /F37 747 0 R /F47 879 0 R /F23 682 0 R /F39 863 0 R /F14 685 0 R >> +1057 0 obj << +/Font << /F37 779 0 R /F39 873 0 R /F23 714 0 R /F41 910 0 R /F14 717 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1024 0 obj << -/Length 852 +1064 0 obj << +/Length 853 /Filter /FlateDecode >> stream -xÚÕWMsÚ0½ûWxr‚ƒe}ø³9Ñ„´Ít2ip{IrpH˜16±LÚé¯da#BI;ÓadyõvõöX!ò2]x!M?t€‘k&3šwüÝl¬ÚÈRÞG†}F|3¡‡=3š(X€A€Ìh|Ýs€úöF—Ÿ?E}»°wz1ê[(pÜ wòqp
¯ä|m:8ýÖGõ'ÃSe‰œ
}ßéE_¯†£þmtn£&Ru7æƒq}Í1ßÔ¹ ×|â 0ÄæÌp\\‡z&5FÆ—Py[-Õ²ƒ ÀÄÃ:zB…ž - ‹W|€úÿFNþYJì3ÞsÛ1îŠð®Îá-¬°6]‘h2Å)¾j|äÄ}ÎÊêøn7£²{’ã$Ïn Äw盧Vï÷ÂYœ¤Z6mì¬6È;;> -J0ñFäõf3ôß…£«endstream +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 +ùLšó'ÀŽäÏ[Bì½eK¸]—q¶Ð]»PïØ8ž§Ûš?Óe„¸@Þ WØðxðEeuG£> A€›;HKôØ endobj -1023 0 obj << +1063 0 obj << /Type /Page -/Contents 1024 0 R -/Resources 1022 0 R +/Contents 1064 0 R +/Resources 1062 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1001 0 R +/Parent 1041 0 R >> endobj -1025 0 obj << -/D [1023 0 R /XYZ 56.6929 794.5015 null] +1065 0 obj << +/D [1063 0 R /XYZ 56.6929 794.5015 null] >> endobj -1022 0 obj << -/Font << /F37 747 0 R /F39 863 0 R /F23 682 0 R >> +1062 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F23 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1028 0 obj << +1068 0 obj << /Length 1946 /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à{Þ -->øaF0ªÔ½A—ÈòlnÒÙå›4%“Tº4i+ËH -ø¯æ|ü<º÷}Ô}6˜\J_x~¨Ø¨Çä -(Âí®{é3®s…¯áo9DŸ -ÃÕ°jZÚCÝt¸
Vû>ÏA»šoM×åÕžý‘Ö͚ƟNÙ -yãù‰Ïf~sæGÉ…<BIPº@™òÔ@(ø¼Ôw¾ûà°Çð3²7)ð2oyÚÞ&8”4‡üS„ „7 -4§cWï}<(ó*·žðI†t€*d{¢•ü‡;+„ÇN7¬^4M^Ûp·âDVœ¡ÃŒÚ·ô„ãg -”*Ï9µ§¢=äš6óヲI+&ëü6ÃY"òÔÀÓrfqEèûg2§2Œð9?¼±žœ‹a‘W\eëcÇ™‰Sòê‚€^ úi¦e¸›54Œ"BI7` ¡ÏiŠÐBÆ—‰`´P`ŽX¢^Ÿ ®&!y6xk*ÓØHGqîº1¬Þ_Îå7¨t«S.çtÞL5y3V;?e(4æ¡ -rÞó|ÈY}i€x6Ü0·¼€‚à{ÑlΊў’ÙšîјŠÄðÇßâP„繃Óq"”3Ò*_$nò4z¦”ð9ŒG„Ô!Ÿ(NÎÞÑ +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à{Þ +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óyw?Ÿ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éÏ»" +-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¢ +eS ´™¶&ÐÖÐÚ·f×tKn`v‚:–§ŒqÌtgЮ·º&ùýD‡³SÇ$ô7”’Á]øäP÷EÆÂÕUG!Ïb<?ñÙÌbÎü(¹G( J(Sž_‚—úŽÀwö>`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秒Æ<TAÎ{ž9«/
φæ–P|Ïâ1šÍYX±à ÚS2[Ó=S‘^2ö¹J„繃Óq"”3Ò*_$nò4z¦”ð9ŒG„Ô!Ÿ(NÎÞÑ ^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%?ÿœ÷èÿcØ…endstream +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 -1027 0 obj << +1067 0 obj << /Type /Page -/Contents 1028 0 R -/Resources 1026 0 R +/Contents 1068 0 R +/Resources 1066 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1001 0 R +/Parent 1041 0 R >> endobj -1029 0 obj << -/D [1027 0 R /XYZ 85.0394 794.5015 null] +1069 0 obj << +/D [1067 0 R /XYZ 85.0394 794.5015 null] >> endobj 158 0 obj << -/D [1027 0 R /XYZ 85.0394 427.2881 null] +/D [1067 0 R /XYZ 85.0394 427.2881 null] >> endobj -1030 0 obj << -/D [1027 0 R /XYZ 85.0394 390.6298 null] +1070 0 obj << +/D [1067 0 R /XYZ 85.0394 390.6298 null] >> endobj 162 0 obj << -/D [1027 0 R /XYZ 85.0394 229.0656 null] +/D [1067 0 R /XYZ 85.0394 229.0656 null] >> endobj -1031 0 obj << -/D [1027 0 R /XYZ 85.0394 200.0179 null] +1071 0 obj << +/D [1067 0 R /XYZ 85.0394 200.0179 null] >> endobj 166 0 obj << -/D [1027 0 R /XYZ 85.0394 151.3455 null] +/D [1067 0 R /XYZ 85.0394 151.3455 null] >> endobj -1032 0 obj << -/D [1027 0 R /XYZ 85.0394 127.291 null] +1072 0 obj << +/D [1067 0 R /XYZ 85.0394 127.291 null] >> endobj -1026 0 obj << -/Font << /F37 747 0 R /F39 863 0 R /F23 682 0 R /F21 658 0 R /F47 879 0 R /F48 885 0 R >> +1066 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F23 714 0 R /F21 690 0 R /F39 873 0 R /F48 925 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1035 0 obj << -/Length 2293 +1075 0 obj << +/Length 2296 /Filter /FlateDecode >> stream -xÚ¥ÛvÛ6òÝ_¡Ó—P'!ŠÁKsúà8Nª¶I³µº/M(‰’˜ò¢ˆ”]ížþ{ -Dùñ‚‘¥rrJX–ñI}IAd$„…T7ÿr«z«W'Œ.bîQ ->¥ÈŒÄ–”RæÛÄ=üYqPvêË‚²Áyo1>RÊ«B‰Ú΄3A8‹?ŠâOÛ¶ëY¨þçä9“Ésªþ‘ݾ¼Í{³ÄK%TZ`ƒH°à}ÛoËfƒg¯Êý”¥A±ì+Ãæ¡+:Ë e9|1
¥ÁâП€C'!OR"è8dŒdRr}Ü"ïŠ0ŽÐ¸E³lWÅ -']¿G`¼n«ª½sÓœGM00ODlUQ¿óÈËÉ”w ’&¥‰.ó‹ÂpóW¿Ï—½åguÐÖ8C»Hg=΃ê1£¼3_#Ô6GUZ!‹%Îûï<…,IK²”DÜÇ Æ åŸóo¯åÕ§·Ù/ÏÛŽ}úLsþiuùý÷±é˜ÆÜò?Tó½JNx*¬Æ¾âL Ah<ªê‡úrú=¯1bNd#e’$·“PDp4qɇ>
ÄBð.oy…äÞM±Ïû²mü:ãREë@e"³$âK¸®BÁËz§`9~öà"Ú…ô¶ÏðxC´]#tQöĆá -»}g°‡(GŽ˜ÑP׎XJ‡¦ñH92”Ïkíš)˜mÐ7ŠqÄtYub#aZè8 þlÚ»‡.ª`Œ§À@Ÿßý4
Öo16[;³”g©‰ ºF—ð¸*Äh”¸m÷HÝ0ŽXV¹íðÀÍ>¯
-~¸†Yç0±žˆ‰"+…1Öí*ïóSDºDj_j¢H…¢
Ä«vwtÉÇEü
ØÐFû
XÌZKó ßWv:©y E -*Ñã¡«ý3ÑOS ¶8¶Ú
†'°[¶»aÚeáÁÅK€œGªÍS¦¢ºÛµû!u.Ü”]m6lÛCµ²§"L¹±*´,q¬É`iñb‡78ÌãÎoæ¦ÐE/Lfì¶fÔU±Û¶MaæE¿ü²i„30¦™5ëv_{ŒSìo14a¢•4\…Êôl*A‘8½þ«ìzâ3ЬÎ7`IÄ‹†Í¤H)² »_Q3i°T‚yH‰eDÈD(!—ÜG/&ЉÚÊuJA*W8÷ëP*3zª¨÷š•Òv -PøŸÇñtNЂ>Éñ Û£°Q†ç¦m»v_™3‘‘|•/ð® ]³Eù –¸AJÎï™ÿt)o‹q÷™é¼l¨é‡<*f½`ƒêàh/Ž>U©›\„Ÿ )¸&‰‹f´z(àúBOﵚ‘ØÞ³$ð¶lzÙmãËx”¦ÀÉÄ|Ó”ÿÑÅF@¥0ÅFª"51°°wm!†ªMKjl s³1·¤º.ßØå¦A-%:NƬ+.ÕÍþ…ÏϵËÒû%5€£ËõÇ&~"}@Þ›ª¨j(ô_³õ—„K‡å^ªêx:F¿X锜Èà~(íMwŸŠSXÓû´Ò?µMŠ\-†vò +xÚ¥YK“Û6¾Ï¯PåbªlÁx|Ä•Ãx<v”]{½e/q”DItøEj&J*ÿ}h +l$#¥<ÅiH$er´¨®èh
cﮘá™X¦IŸëõìêå[R’F<ÍV½µB“„fË_˜@Æ°
fwÓwã g<¥ÁÍ×g·?CWR`A†ë7ÿ3Æ‚ë7·opè͇;l¼½½Ça0ûåçÛ»ño³Ÿ®ngN¾¾Œ +%Ü—«_££%¨òÓ%"Mäè:”°4å£ê*”‚ÈPK)¯î®þíìê©^›0J¸ˆ¸Ç(\øŒ"S RF™mrPìð{~ÀFѪ/ŠûåøD)/s¥òË·!ë-œ +ÂY¨äQ+þcÓ´›¨ÿ9yÎdüœªd»+î³ÎÌÆI•vðA(Xð¡é6E½Æ½—ÅnÌ’ _t¥sßæЊŒ¾O¥Á|߀MG'D2°ñ„1’JÉõvó¬Í'QˆÎÍëE³Ì—Øi» + +{èéü¢ÛYmxÁ<¦•µæk”ÚdhJ«d¾À~÷½G¡ ‹cÂÇR§Ø$+ÿ3{y+o>¿Kÿõ¼iÙç/4㟗×?üàQ›×˜Yùûf>cWÉ O„µØ7ìÉBABH‹¦~l/gßó#fÇ¡ÅRIbÈÛÑD„p4v‡#|<aÁû¬Þg%.÷.¯ó]ÖMí·—*[{&ñP$õDÂqŠ^T[0@Ëð³ƒÑ!¤§}ÙCÄ›E›RçE×Bñ°Ÿ@×ð™„!*Ídðòé×w7Ó©YX»´5£hعÏÊb©Ó‘žKC‘碒fm»¯0J`¸³v(ózÝmX´==“ Ú—]±-º%YÓDÑk4ObÓÄXW¥Ý®5Ü}T €DÌX¨m"%}×x´8ʇ•Ž-ôÖù’¸Åzt]¶#fZé(~¯›‡›.« »@CïßÝ8 ö†ÖmðXÙ¯7žpf '"J“AU…!á UÈÑ0v9Úìpu#bQf†¶Å
×»¬2"4øµêa]D@ÇF"äY `ÄжˬˎéFt À¾Äd‘JE›ˆ7Íöà—ñwàC›íwà1ë--'|_7:è¤Jä€ ÑåÔÕñ™D§‰_†@ÃØ.šmŽ4²ð…ƒàà5 †ö."Õä1SYÝn›]‡”*‡®‹¶26;\Ú]‘¦ÂX-‹h2XX¾Èñõ6ó„óÛÙÇ1TQÁs2¶Óêò2ßnš:7ý¼[|Ý5¹F×LëU³«<ÎÉw÷˜šÐÑFê2=K0$voÿ(ÚNq—4²5xù +`éJÉ9Äo©ñJÛg‚¹d„RiÍPgТ©WÙ#€ë(²¶ÀúÄ[]„œ‘$@ ˜&ÑüºUµE¿DÊ_:müB1+×Í®è6•™[e‹Iµ”¯ÎÂ*§ãw窉ïpêäd7¼KüýÊP¨;¢µ ü(šªLYèd3]åÅÖY~%A´©ÝoUz+÷)úü€ä×Óo’Ün}ˆQžåsqèbÄœ7÷9ñÙë®ÐE‚ˆBSl«–ýfê#{Û*µR]ŸO¦€o„è8Äå2Öƒ þ<' r‚ôIÕ…”CÖ¹‘¹nêÉC³+Íž(H¶ÌæxWH…F+ÇLQ1ˆP7HÉù‰ûבâ>¸'ÉLåÝCuûb<.äÑ0ýì”{·öüà3•º‰ÁEø –‚;`»lF¯O\_(ãÉI™¡‰ì=K€7EÝé“Ý>0ŒHi +C9¹‡h?ƒÆÃxÿ¥Í£òE +mÀ·lr3£n:ä‚€ë2ý endobj -1034 0 obj << +1074 0 obj << /Type /Page -/Contents 1035 0 R -/Resources 1033 0 R +/Contents 1075 0 R +/Resources 1073 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1001 0 R +/Parent 1041 0 R >> endobj -1036 0 obj << -/D [1034 0 R /XYZ 56.6929 794.5015 null] +1076 0 obj << +/D [1074 0 R /XYZ 56.6929 794.5015 null] >> endobj 170 0 obj << -/D [1034 0 R /XYZ 56.6929 691.7741 null] +/D [1074 0 R /XYZ 56.6929 691.7741 null] >> endobj -1037 0 obj << -/D [1034 0 R /XYZ 56.6929 668.7722 null] +1077 0 obj << +/D [1074 0 R /XYZ 56.6929 668.7722 null] >> endobj 174 0 obj << -/D [1034 0 R /XYZ 56.6929 579.8329 null] +/D [1074 0 R /XYZ 56.6929 579.8329 null] >> endobj -1038 0 obj << -/D [1034 0 R /XYZ 56.6929 549.1878 null] +1078 0 obj << +/D [1074 0 R /XYZ 56.6929 549.1878 null] >> endobj 178 0 obj << -/D [1034 0 R /XYZ 56.6929 502.9124 null] +/D [1074 0 R /XYZ 56.6929 502.9124 null] >> endobj -1039 0 obj << -/D [1034 0 R /XYZ 56.6929 474.9173 null] +1079 0 obj << +/D [1074 0 R /XYZ 56.6929 474.9173 null] >> endobj 182 0 obj << -/D [1034 0 R /XYZ 56.6929 277.7919 null] +/D [1074 0 R /XYZ 56.6929 277.7919 null] >> endobj -1040 0 obj << -/D [1034 0 R /XYZ 56.6929 249.7968 null] +1080 0 obj << +/D [1074 0 R /XYZ 56.6929 249.7968 null] >> endobj -1033 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F39 863 0 R /F21 658 0 R /F47 879 0 R >> +1073 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F41 910 0 R /F21 690 0 R /F39 873 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1043 0 obj << -/Length 3184 +1083 0 obj << +/Length 3185 /Filter /FlateDecode >> stream @@ -3446,210 +3549,212 @@ xÚ¥Ùrã6òÝ_¡·•«" ;O'™“¬GÙT&´[ÌH¤"Röx·öß·/ð2=NÕ–«L 4¾!½Pð§©
”É¢E’EU 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ø +Pb7ƒDø ?åcFs¡FwÊñÂ}Z4™ <QÒ,’T1Žâñ}ÿzž…ËúÄìóG‚ª3ƒ™¥ ³§v†}Ís¸w¨Üñö´›9Oˆb¡Y¿:Ô»ró8sž
ˆñzÚ´0yï<u`&'+Ò`‘¢0Z€rÚ€ßÁƒÇ»7®Î¦›¿.`g3$ã)^$ç -|-Za -‹µ^Í&¿ÀÔõ»¯¾âYÖÑrxh¬œˆožÐ™#q |-þ -”Ò>ýx†WFZuå‘fÀHþõö‘;[ÌòBNƒ AÜ…¯ðŠx‚yAÞ¶ŸkŠY"k)ÄÀœL0`¾Š©AÃK$cC$•o±J±š²2b‡×˜G\!µ½ÉVË7ø{I¹VߺÝnOÚèSÜg”‰;çI¬Ñ(ñÁOVI -Õˆä†<#|Ù‡9žJ¾[_îA¾/ëSãË@¡’òŠMÇ w£|a^¦C„ÖÆ/ZÔDÙhN¤eƒI_¬ ³ÁÄ.¥1ÈÐÝìJÒ>l“-…oöùé« -òOƒµ½†LÉO@]”úKô›Q™ð¢N@š¸;ÉŽ -2ÓÏtŸóDcÃOØ Ù¸ˆÔÎ+eŠ5cûÂë'aœ@¾>Yþkë$8Ia¬?L:vÜ"éãU5ñ9Þ©?%/ -Šñy©MÍ€<¸Å|ë3‘Câ'LbûÈÁ^ - -AÀÙO"õ(œ>¼ ê<N,mɽ“Õdo +|-ZaÆAô„¤4X·IO¼^7ë%Bž`CB‚ŽÏÿ¸Š” +²4´‹XÃ4ŠÒÎCÆâ!¯ŽÇúؼìöØZédy K®Ñs–ÕÃÈ<èØ[<€t‚í=LÍÙóAoC6&‹Ÿ<íZ ‡Kݽ;æ;î¸#owD“féòÝ-äÏî#ØÞ¥aQ r¿²ª+òŠdÿþD΂]~È;†nãŽ@ÆO_! #D +!Ûè+h^ÅßSõ©ª*^…ž#|ฉRf3Âå® +J–Bè<"Ùf†ce»…YFJhÈñŒ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ÃCdåD|ó„ΉyàkñANÀAÕ’@("„ífOx€vžÐð¸(Dmˆ³È|¸PI$)Ï +©}èM¶Z¾ÄØKʵúÖív{ÒFœâ>£LÜ9ObF‰Þx²úK¸OËNˆ;µ¬Êïeïœó$๔/G{¢¥¤]ù®ÝÖ§;¤Î
.±
wæ–ÐåÀ—•ÒÌÑÃD·áh¿1 ƒÃ2Šñ
Å?øù7\k49»õÖÍe¿~EY— +È„uÒÄÝIv'¬‰6
lO<U~ãŽ%UÁ( Ék8º0’ÞNïñC4eár5y©ºÐ§w+«5+ä`„Ú](f¢ô&¢ÂŽ–|e.ŽÅd²WLhÛ-“7ŒŒ*Ϫ†¶°ó‰•V©¼4@®À¡B¦|ÃQ¬FS5%^^ܶdŦ‘d8 åØW\A¹a'ùšò“‹Å©ì pÌUâN +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 +Î&ßÏ&ü Ù"tíM6t¯%Í+ï‹Ëûrçº(£|p÷ÐvÏ6G Te÷Ó?ûÒ}÷ˆ1z–™ endobj -1042 0 obj << +1082 0 obj << /Type /Page -/Contents 1043 0 R -/Resources 1041 0 R +/Contents 1083 0 R +/Resources 1081 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1050 0 R -/Annots [ 1046 0 R ] +/Parent 1090 0 R +/Annots [ 1086 0 R ] >> endobj -1046 0 obj << +1086 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 -1044 0 obj << -/D [1042 0 R /XYZ 85.0394 794.5015 null] +1084 0 obj << +/D [1082 0 R /XYZ 85.0394 794.5015 null] >> endobj 186 0 obj << -/D [1042 0 R /XYZ 85.0394 769.5949 null] +/D [1082 0 R /XYZ 85.0394 769.5949 null] >> endobj -1045 0 obj << -/D [1042 0 R /XYZ 85.0394 749.4437 null] +1085 0 obj << +/D [1082 0 R /XYZ 85.0394 749.4437 null] >> endobj 190 0 obj << -/D [1042 0 R /XYZ 85.0394 597.4103 null] +/D [1082 0 R /XYZ 85.0394 597.4103 null] >> endobj -1047 0 obj << -/D [1042 0 R /XYZ 85.0394 573.0707 null] +1087 0 obj << +/D [1082 0 R /XYZ 85.0394 573.0707 null] >> endobj 194 0 obj << -/D [1042 0 R /XYZ 85.0394 410.9267 null] +/D [1082 0 R /XYZ 85.0394 410.9267 null] >> endobj -1048 0 obj << -/D [1042 0 R /XYZ 85.0394 378.8211 null] +1088 0 obj << +/D [1082 0 R /XYZ 85.0394 378.8211 null] >> endobj 198 0 obj << -/D [1042 0 R /XYZ 85.0394 204.765 null] +/D [1082 0 R /XYZ 85.0394 204.765 null] >> endobj -1049 0 obj << -/D [1042 0 R /XYZ 85.0394 171.4256 null] +1089 0 obj << +/D [1082 0 R /XYZ 85.0394 171.4256 null] >> endobj -1041 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F14 685 0 R /F39 863 0 R >> +1081 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F14 717 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1054 0 obj << +1094 0 obj << /Length 3094 /Filter /FlateDecode >> stream -xÚËrã6òî¯Ða«F®Œ<Ìžœ±'™d×Ùµ=äq DØbE"‘šÏ×o7º‘Ij·|P£Ñ -J$š-RÂUÆÎR‚ŒòóîcïšnÒ½t6¯Ü/B¨ÆU8TpWú½{û=O…ÖLÊ8…¸”qeSøIƨXÚÚK -véÜŠÅ•ëVûzé:’Œ€hå…çÊ#eÜýÐ1
(o'Æ· -ŽVÞÕOt€?µë’¸¢HR«ÈÞ5È"(ÛŸY¹=ͼo ݹž‡!J†ƒˆ4é9¦9<¤¢•À+
gÊã îÔ¹}ðL<2®w;F} -Äœæùüëw·×DPŒ…Cñ£[×q׺_æß»}¹ÁA·n7LѯK>lÄ4È¿"Úº „5/ّͯ\×ñõ#óùx÷q·)놶ÊâVÛvHT¹¾¬™±¥ƒ{^jîojYk°ëf3e«²sÞ®³Â[•w]œ%M•B¬"gY¬'ü ÂŽ)RÍ$íŽ13pѺé;‚Kúy< -¡°ì<Ãw¬¿)`ê¦Âkú0ègBs¶Õcöùšyô· -g³y¦ñªm0T=q¯hÎ’ÈÏè¼WÝ”|ŠÊü
ùj*ŠlŠ&(®a¡ŒéÊeû>ÚH°›8[7'Ä¿§›¸„u
etàÕ—Ã)…Ejcc!¹„þÆ5Pô>úã>߃¯NÔ*Çh,CpŠçlªHd–lSUÓk/àâO®™Ø2CI‹P¿r1Eúvì3Tø+¶ôûD,Ëtam’É|l‚p 2Öl8fÄAFaøn ihç½N‘®^ÏÁ
’‹—ÊÄ,Aj_1(*T **˜€cWô‹å<pÕOx=e•%®Pñ9¿7@Ck`î¤ ÜINHÜ<0˜Ì‚ó{]ðxmUóŸ&öc©´.ß»:(j"4Éå멲¸Õa)@ýóŽ!jN¬2³I!bKõÓ·7ƨŠD«"„Ã×´å~@K>éÐqÆ°!µ ý¨©ÄŒ' tå•ÞžŽúÝn]S9>€ëB€X9 -‚Œ—f/Á-ÉAjl…ÇÓ¡ñ{¶3Á0 )™__ćAïvãw@aÞ¬µOù4vâ‘þ
-a+ÓtlÈ+ð˜~CYˆ|q`õ2¿œ‹ñäL -üãqÚÑÑ\5áy-ý!Œ(p†÷O'Š›jºg¸Îa¹lB%¾3“õv'ã_Œ™)7þ<[eI*äÔå&KÂ¥G÷!tþ="dc‰Ü$ÆdgA2,ÊíPJy1¨Ñs¶Äro󓢸¢G¾Û÷þ™gQ4ËäËþtƒ’Uýˆ«Ý {žÈ±À—%áihçJÞŽ¹°±w -ScvøÛ»Û7ÿøñzª2„"rU.NÞÓ±£ô•Q÷g;.Å×=˜j¬Zb#÷—Dÿ·¾=âÓô¦yÕÈ_ﻸo9–Q¸=û~·0À¸÷jž§ò²JZˆoC®Ÿ`RÛÄš¢8Ó©€àÛrÙíÚ¦ªÁ±¼ ÉÏøòä‰X?,}dzÁ˜³ƒg—÷L²GÀ›±àO{ÂrÑ#bdõ¯
ç×]`©“ª“s;ýÝJa]“™?¬k@ÂY¡C¸»»÷Í”øT’ËTN¾ïøº?=ö-\ §áqEA<,™ˆûH€ÊnŠ
܈øŒûÒSS)–IøÔð˜
LJwEf€®'ŽÃ”Ç^-ªW/ -1ôr5ï7xŸFK97uBf ·õúð–BòR½FšŽ¯Ã^Gçg‡ºæWœ»;p†n¢¡†=¹ÇY‡ÏÑîÔq—¡û©ª0yààŸÃð›ñË}–.²aŸ…ÃØgá +xÚËrã6òî¯Ða«F®Œ<Ìžœ±'™d×Ùµ=äq DØbE"‘šÏ×o7º‘Ij·|P£Ñ +\`ç*’"ɳ<{ ¹
r'„ŠD% ¤H€+÷›Ã…ÇFÀ i{VívAŒŒ[“âä°§¥
¯y1P=C‰2ÖTnº–pKžƒs·‡æ˜Ë€(2®«¶uƺ/AiMz“íÊ!{>ÌÙîù˜u½©ˆC¯d^`Û¦ÛÖý”{¢µ¢#§P¦`úKýúW>™j +§œS…eà¾3`ýMS7^Ó‡yD?š³³ÏçÐÌ£¿ JG·ÔªÜ•œÍ5;^×nÞ;^Wœ¸T¿¿´sVŠ˜×>> +Ä_±¥ß'bù(X k“LæcÄ€•É°fÃ1 2 +ÃwHCƒ8ïuŠtíôzn\¼T&f úPûŠAQ¡JPPÁ +Z +[ªŸ~¸½™0FU$Z!¾¦í(÷Û˜ˆ +hÈX ßùúBó…T:5 êc¢xɳ$×"HÕ>QAÆK³—Žà–Àä F5¶ÂãéÐø½GÛ™à@Д̎¯/âà ÷»ñ; ° +oÖÚ§|;ñHÿ +&€ÅíhùB<‘6OòT¤,¸?°<#¡ÌQÂhþñ8íèh®šð¼–~F” 8Ãû§ÅM5Ý3\ç°Ü@6¡_‹™ÉÎz;Š“ñŽ/ÆÌ‚›
ÿž²$rêr“%aŒÒ£û +ºÿ²±¿Dnc²³ åv(¥¼Ôè9Ûb¹·ÎùÉQ\Ñ +¿[`aÜ{5ÏSyY%NÄ·!×O0©mbMQœéT@ðm¹ÆìvmSÕàXÞˆ„äg|yòD¬–¾cáÙ`Ì‚YÈÁ³K…{&Ù#`ŠÍXð'†=a¹è1²ú׆óë.°ÔIÕI‚¹þn¥°®ÉÌÖ5 á¬Ð!ÜÝÝ¿ûfJ|*Ée*'ßw|ÝŸû.ÐÓ𸢠–LÄ}$@e7ÅŒnD|Æ}é©)‡Ë$|jx̆ãû"3À×ÇáGÊãV¯Õ«…z¹š÷¼O£‚¥œ¿›:!3Ð[‰¿z}xK!y)È^#MÇ×ᯣó³C]ó+ÎÝ8C7ÑÐÞ܈レˆ‚Ãçhwê¸ËÐýTU˜‚<pðÏaøÍøå>KÙ°ÏÂaì³p€ÑHQ¿Èƒ¥ø¯ëÛ¸.Í_Q‘Ðת}óŸD9Gà!À›«&óAšhý “J>×|AG•˜"zh?‡Rðk®‹S¨p!¼«q]\¹Çò°éYQeè&Gïy,oþè… ¿up©ïß—õ¦Œ_Žåá°×}MøÜ{׸rK&ÚH1Ù>Æ|@a;ÑêOÉôäŒp_ ½bè +EuŽ¿ŸmA¿&~ÎKŸy§Â0ÆsT³*Â#ü);! ¼dI4Ö`+槒˜Ló$Íc]‚m×U‹TIL¦OžgÚæñsõnÙ8|ÝxaRyMÜOG†˜‰§þµC›ÿcâ1D,Yþçû8þ§HF[«ŽÿÑ1®Ô,6a¦ðÚ*;ã<üÈ9ëÿpj,Èendstream endobj -1053 0 obj << +1093 0 obj << /Type /Page -/Contents 1054 0 R -/Resources 1052 0 R +/Contents 1094 0 R +/Resources 1092 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1050 0 R +/Parent 1090 0 R >> endobj -1055 0 obj << -/D [1053 0 R /XYZ 56.6929 794.5015 null] +1095 0 obj << +/D [1093 0 R /XYZ 56.6929 794.5015 null] >> endobj 202 0 obj << -/D [1053 0 R /XYZ 56.6929 769.5949 null] +/D [1093 0 R /XYZ 56.6929 769.5949 null] >> endobj -1056 0 obj << -/D [1053 0 R /XYZ 56.6929 747.8139 null] +1096 0 obj << +/D [1093 0 R /XYZ 56.6929 747.8139 null] >> endobj 206 0 obj << -/D [1053 0 R /XYZ 56.6929 540.916 null] +/D [1093 0 R /XYZ 56.6929 540.916 null] >> endobj -1057 0 obj << -/D [1053 0 R /XYZ 56.6929 511.3349 null] +1097 0 obj << +/D [1093 0 R /XYZ 56.6929 511.3349 null] >> endobj 210 0 obj << -/D [1053 0 R /XYZ 56.6929 239.6059 null] +/D [1093 0 R /XYZ 56.6929 239.6059 null] >> endobj -1058 0 obj << -/D [1053 0 R /XYZ 56.6929 207.3747 null] +1098 0 obj << +/D [1093 0 R /XYZ 56.6929 207.3747 null] >> endobj -1052 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F47 879 0 R /F39 863 0 R /F48 885 0 R >> +1092 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F39 873 0 R /F41 910 0 R /F48 925 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1061 0 obj << -/Length 2903 +1101 0 obj << +/Length 2902 /Filter /FlateDecode >> stream xÚµYI“«F¾÷¯èx«§Ýˆ¢XÃ1mOûÚl @b‘ -WýÀ«,0,TøWIá«῰¯6¢µ_@Æó‘3}<rÕÕ—êw(½*Œ"r⫺{%3¬,ƒWÕüµÒèÔ&jkööÁ l…gÞ>‘Ôš‹7 -lr݈nf„Õ->†évɆ€™òýæ%[çGÎB%"ÑøiÆhko¬'I¨HdåÊOØQÚøð -ºˆâ,\ÈüJtâX Â?‰œˆl–Ø<¹py+ɈBW™ÄLTKý!A• -”¢4’°È8³^øÔ<óúTàì_l”©â×ÈÆ›˜VlDîö3;éÓŸ™ÝÍì÷…Ñ3sâ¸Lfhœ}Ôl˜"ɾOºjç°` VêÝ>i£“µü3~*Ŭ(”`†äPˆ&‚0¡S¨8»»”N⳪žd%&cÊç…º™‰%§SD¢Ç6LÌ|‹æHÎâ~Nœ0rTn/W–Ƙj†t -«‘w²‡Ì -¬¯ñPߣe¸8‘¿‚\DÈg¥¤•žLæçÚ’®YÛQpâCß+¶EÏ"B"AÈ‹ -|ŽÍoÌ7*™$:€OoõÑš¿FË!»Þ{ce²Ñb•®ýp›Hq«µëCÛmÛºz÷nQûpë-ÃÍYìJ“{ïL·F×m‰%-àê–bßxîíZÇ[õÍ_w3G¯÷ƒ‹Ñà4Åß8S;š`‡ÕNÍÜ,yà½à¾†eλ§Ü*åÞr\kª“ûü¢Xº¿—@žtÚûú@_$ëË¡ê¦vܯmg÷.îZ^ä¦~/KÜá”7‚Zc&©ù¯×uI›U·V³“w©®–sW\ùao°m+sãdHžÄö›'ﲚÁa™ŽUOÓ³íÁ²AwÒ›»¦ß‡›´áy¿š÷·{«ÊóþÙèØÁUöÖn˜œDÑî‡ætÿ^*Ñq ¶Ó–tV”å] tNÞéÜÖÓ)Ç~Ÿ*Òü}Ð×ÔãÔ8qÒLª©°ºœÙô67ºeVNWãÎïקM“ÛMMû¶5šjÃÓØƬnº®•†£ûª
¿ýR|M¡îý{AŽC›„©pxžóAôY¯~Š.tÅ5éKþ¥ê•ƒ -þÎÿJbp"dX -Fd¯ªýa«mVKMtÏ—ïü©×Hͳku·óvøÕ°fÌÞo®ÎQƒ®6¹øÕ0]Îäú²ê,Íûø”™8o¨Ž×ÙÁ›»ö¬æ6©†`¬NY¥Æþ3÷O§ýß>½wß<¸é -¹›áþRÙ—Ð]‹“„g39]æ˜îè£ÖlÎ&5fÔRÿ(Χã`Îß‚j×kÇú¤·¡}¿·±9Òo¬@žž6Át:QuÀpä;ô£Ã‹èÝ8m5µ°.§{ïG½ÅÞm;…ËëH›P4Ø2‡'ñ}}Ú&ÃñíiCnÜûá~X]Ñ‡íª¥g˜¶5»úØœ³enNÇ]±nOâëûzcÞ½õPïöÚ;~È›iØï:ws“N¹ízíÓi™ü Îz
Iñ0]÷;µ5»Ð'·}wºòÍ“=îµOïtŽk³biÃZ¾ƒ›½î9JÔèî´q¤Û·Á¤Í]Vj³:«÷&T¡6(3BêôÖžSÛ4… ,.ûù$Þô:V³¡¥Ëut™l¬xÓìÎ.N³Y¶¿ÀÍû—cYjOóÅ–s¸§ÉhÄÍGŠ8ä}ÕíÊî¶ûRoþû—\2Mú'ýd_~z\Í0ÌûÇ¢P‡°ìÿ
¶H¦¿ýoÊçHH=(ËÜç%OŸñ—stÎÏ•"$}Õ¼øÛåGÕÿôtúendstream +WýÀ«,0,TøWIá«῰¯6¢µ_@Æó‘3}<rÕÕ—êw(½*Œ"r⫺{%3¬,ƒWÕüµÒèÔ&jkööÁ l…gÞ>‘Ôš‹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ë‹d +r!ŸÇa–ÿO–?Úôe…"Ÿ]îŸãÌÛÂÝ_<šZ1ñ#HŒ¢ ºô8”Áÿ +QÐE”gáBæ·ˆP¢Çr +#¡¾•±2%f| ŽÆÈ +¾3 7^¬½"ºü‹ˆç%FæXtÑDG°<a®’€/u¸,2)á„ëó@˜…¸ìa±}‹v0Ü?¸’å™Ü‡yºß@—Sàsl~c¾QÉœ Ñ|z|«Öü5ZAÐØõÞ+“«tí‡ÛDŠ[]ÞlÛÖÕë¼w‹Ú‡[onÎbWšÜ{gº5ºnK,iP·ûÆk
po×:Þªo¶øûº{œ9z½\Œ§)þÆ9˜ÚÑ‹8¬vjæ~dÉè÷5,sÞ=åV)ð–ãZSÜçÅÒý½¼ +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[î +†Íïßó<oõ15@ëk»ªß:—ÝuÝ©Ö-Žk²Èð"7è÷Ž`lóéõ>V–¶7<Hûín ¡õ/n¤v"Nh¤¹:Õîõ Å·Ò“’ìÙAªj$°wm¬§¿§ï7¿¶ØL8ÖµU÷æU00"{Uí[m³Zj¢{¾|çO½Fjž]«s>œ×°Ã¯†5cö~suŽštµÉů†ér&×—UgiÞÇ— ÌÄyCu¼ÎÞܵg5·I5cuÊ*5öŸy¼:íÿðîý¸ûæÁMÏPÈÝ$ð—ʾ„îZœ$<›É1øë2ÇtGµfs6©1£–úGq>sþT»öX;Ö'=¸
íûո͑~c%0 +µ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 endobj -1060 0 obj << +1100 0 obj << /Type /Page -/Contents 1061 0 R -/Resources 1059 0 R +/Contents 1101 0 R +/Resources 1099 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1050 0 R +/Parent 1090 0 R >> endobj -1062 0 obj << -/D [1060 0 R /XYZ 85.0394 794.5015 null] +1102 0 obj << +/D [1100 0 R /XYZ 85.0394 794.5015 null] >> endobj 214 0 obj << -/D [1060 0 R /XYZ 85.0394 717.5894 null] +/D [1100 0 R /XYZ 85.0394 717.5894 null] >> endobj -1063 0 obj << -/D [1060 0 R /XYZ 85.0394 690.1986 null] +1103 0 obj << +/D [1100 0 R /XYZ 85.0394 690.1986 null] >> endobj -1059 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F39 863 0 R >> +1099 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1066 0 obj << -/Length 2379 +1106 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¶ -F‡ê/Ç’Ý¡ nŽ!‰\°?xRˆ8¥3Õ†ŒÓ°Þ`›„Ý£øº<´øç¹¥©²h;›ÓlQõìEK#v¡xøïl»+-Me—ô´Qˆ¨t^W4¾ËšÅRó°+ÖûhHÀó‰M]w44RÇk൪€c& G›N¡
85I“`ßWÁQj °Ž¹ü}QªZߪ"š)mä8£8àŒuœ€œ#p>õÀ¹ßíꦣŽsß4Ñ݇˜T&’€àÄ3ó›Í¾,ÑÜ„-Ioi"+K"Öû¦Yˆ$´UGœq˜ÛÏœËÊʨ›mK2\Âר*ÛZ¢ºÚKÎsØúEY•ÏΗ…”uýu¿kÙ\¼\{Ë -§;PYÙÖDí[ëïšÁš£ÝlKCçÞf_=û·½mŠ~úðh½Ñ›E¨¾P¿öãY5Ýeíº±Ó>CúmÊÇ,U2qʨ!“¤ThÍCæËiÀóJ&½a<¥Æ»m!–êÊù ¨Kø!Šº®In‹YÌEx÷áM+eQ¹Ý$ÏžVÀ0e3dGÜeã÷0³;œŸ:ˆŠr´IÃuY@8-Û"·4Б
3N6´Ù4xÈ<‘ûp‡;ú°d[?Y¿åÆÔ[Dœ!i`Ëeâð—ú`ŸlƒµƒC0fûî±nŠîÒ';o½+rEÒ‡)Pm@Xë;$eåDý‡`(Ì¥ÒzÞu]uYáúdÞd09'&+HÈÎÚg糋"Ô^)°u{°
->1tȺ3¢ç='GžÃ -ç3{œÖ/µZ0)¢t¤mQu3ÊJ,ž†Š‰´Å,Šãð£ÛÔín›¶¤Õ&²÷ P)MxŸPQ2R-ÿPTYóL|eö`Kçgslj:˜Ï`)ù& -¿Võ¡"’°Âx©]Û5ƒØ‚XÈÁç„ -ûŽFGÀÑ! ô‰%d$ªæ7x¤€ÇZ¿÷ºÆ‚ª³MÑš¢pçL‹g’ÑÙÕ]&ü{V9)2Ìv»²X»:¿¥ŠÅÁÄFöaŸ×Ô\!ľ/µ‡ãÞè@&ÉàDcöíÛÒOm)}í¹7y/Ý]Ç3Ç"înßTx¶ÔÝØZB4Lwìj¿ -c˜,/<+”Ÿ}åI®0zy'øí†È4H¥Ôb#EˆM4nM†·K
R„ßs÷ÝîóíÌÛ¾Q -Œª •æ©°ßÛxÐ}´Þ’{ÜÔâX£¬Á¾ÎΧk_©‚ÎýZk§·Š8< ˜x$”{<ÓdóÅ?oîF¯Þ9^пÓÆÀ7•‹¸‡ë¬èkªK&™xñà1¬ƒÂ,þÅÛ{àú-^JC-˜Ç>1~Wº“Å©;"<Âx<|æ¾^¿‹RÊÿF7u>µÇ›J3 îðÞƒë|¾vÁZЋ`E5XÔ;(!Bªñ¢É%Jcî……¯(jð¹&0u]fÀ+x±ÉÆOêpVª+.\”yj_•ÅW{"DO¯RÕ¼!¯ÝÙuydÛ¹<"ŠÆbγa|ú<ò5Z¾¯ÂOU@dü˜t–Àçä“O4è”% ¥éß>Þ]ÿŒŸ®ð+‹_Å -tÒ“'--$¤ƒÞ:Û…k"wŸÜTx½ñ¨¡ãà:wá¹™ŠZŠ œí†ÐEôz82CT¼~1ŒCÜB—×Ñ¡h±óþ½×=ÎxKoö¡N¹¸ØÀÏ…HML´•‰}q7:ñ‹²v‚µ£3ÍÃT’é(–=>˜ä>ô/Îz:¼7® õ9 ñÿ2þ鬊Ó#Ò‰ÂÎ~Gmæ'O’ -?Qù=‘ê#ÏgÙ¥XíÀÕXu¾ŸõùŠ¶€$y&zT¼çNª ÿµwQŵ³»Wdî¡!æÁûî¥ë5”ÓÂ}…×ÝlÆ`DB"zÆ^gÈŒ}Ò]„£Ã™ý÷eç-ª]™¢c$È6 -£”òåjÎ$PšÀƒ +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¶ +âæ"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 +-˜Q:Ò¶¨ºe%OCÅDÚbÅqøÑmêöG·€M[RjÙû¨”&¼O¨(©–(ª¬y&¾2{°¥s‡3‹ˆ9‹ãDÌg°”Ç|…_«úPIXa¼Ô®íˆAìÀ +A,äàsB…‡}G£#`ŠèÐzÄ2Uó<ÒNÀcß{]cAÕY‚¦h +MQ¸s&ƒÅˆÇ3ɇèìê.þ=«œf»]Y¬]ßÒÅâ`b#û°ÏkêV®b_—ÚÎÃqot Ž“dp"±ûömé'¶”¾öÜ›¼—î®ã™cw·o*<[êîNl-!¦;v‹
µ_ +7&C‚€Û‰¥†@
)Âï¹ûn +wƒyvæmß(FÕ„JóT؃ïm<è>Ú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Ï×î Xz¬¨‹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©úÿ endobj -1065 0 obj << +1105 0 obj << /Type /Page -/Contents 1066 0 R -/Resources 1064 0 R +/Contents 1106 0 R +/Resources 1104 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1050 0 R -/Annots [ 1069 0 R ] +/Parent 1090 0 R +/Annots [ 1109 0 R ] >> endobj -1069 0 obj << +1109 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 -1067 0 obj << -/D [1065 0 R /XYZ 56.6929 794.5015 null] +1107 0 obj << +/D [1105 0 R /XYZ 56.6929 794.5015 null] >> endobj 218 0 obj << -/D [1065 0 R /XYZ 56.6929 594.1106 null] +/D [1105 0 R /XYZ 56.6929 594.1106 null] >> endobj -1068 0 obj << -/D [1065 0 R /XYZ 56.6929 562.6395 null] +1108 0 obj << +/D [1105 0 R /XYZ 56.6929 562.6395 null] >> endobj 222 0 obj << -/D [1065 0 R /XYZ 56.6929 370.2937 null] +/D [1105 0 R /XYZ 56.6929 370.2937 null] >> endobj -1070 0 obj << -/D [1065 0 R /XYZ 56.6929 341.714 null] +1110 0 obj << +/D [1105 0 R /XYZ 56.6929 341.714 null] >> endobj 226 0 obj << -/D [1065 0 R /XYZ 56.6929 214.6004 null] +/D [1105 0 R /XYZ 56.6929 214.6004 null] >> endobj -1071 0 obj << -/D [1065 0 R /XYZ 56.6929 186.0207 null] +1111 0 obj << +/D [1105 0 R /XYZ 56.6929 186.0207 null] >> endobj -1064 0 obj << -/Font << /F37 747 0 R /F39 863 0 R /F23 682 0 R /F62 995 0 R /F21 658 0 R /F47 879 0 R >> -/XObject << /Im2 984 0 R >> +1104 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F23 714 0 R /F62 1035 0 R /F21 690 0 R /F39 873 0 R >> +/XObject << /Im2 1024 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1075 0 obj << +1115 0 obj << /Length 1913 /Filter /FlateDecode >> @@ -3657,239 +3762,257 @@ stream xÚX_Û8ï§È£h\KòßÇöfoÑÅ]±èÎ>]ïA±•‰P[ÊFöäæÛ)JNœqºE€˜¦(Š"©)³M?¶©‹4M¾©š<-2VlÚá]¶y†±_ß± “"-r!àeet[ˆ:-j^m¶×J>=½ûðOÎ6<KË’›§ý¼VYÕi#òfóÔý'ùÇAGuzØò"KŠ‡ÿ>ýFÓò´ª+†Ó2X¢H«&«ý„§ƒ"áOŸ¿<ÕÐã_úù0žþã«r¶åQ+ËS‘—<h-EZ•™Q¤ìa˲,»è¿¯.ïNòôt‹M“6%/ƒj^§eÕ2ø¡É’“ìô¨‘}ÿ 5e"Ç^·™Ž8ù¢ª’R†x½6ßUGôY—Äpã´#êôÀêd6&’y^~<È1LQ¦s×sÚéä4[&_þ MꤕÃÍávK›¢à~;£¥ýKzô¶•=‘lÚ<Ó‹‘Cð£S'´ªÊ“tÖWA@Æ ¾Ï¿¿”[«[Ó*¤ªD›Ñ[g»©ÅÝã¨QglípìÕÿôøJ lid<(bÍî˜Ð½Ä;’ÆV9÷þa霸©=ÐDéHfoûÞžýý1Ö¤6.ˆšnÍ+_>þûØ/¯£_v¸Üσá*qz˜úQe'Gzk¿OGµ{âWr¢æ‰ä(Ï꺰C§\ veÒÖNϬ—ê¼g¸rÞÊ.ÎèŒÈ¢h¡Á¾¨îý<æBh%ÒËÞ:z³á˜èáhÓ»>HÅôÑhÇ L8[Ú,²j¼œ—D>Õ/…T¿—T„
¬ñØ€0š&îm´Ù4DÈÞY¢Bž¼è.ÈÜ&ò0§5¤RP¦†³à÷öÆ'çSʯ†í°ÓF^b ®Æû+ìY‰Óò¸ó†_Ž;oDHàJz+ÞI©!úê`Dñ:™Œ¡£Q’â™ÞR-ÅãT!pº -M&PÄqíèÙi7jÓŽ4¾§YyŸ"A¦Í ì‚d,"û©ì±‰kkÒ;¥)ÏR^Š:”&JÓ×9*—“²,Jן©IW؃È!6Š‚O +M&PÄqíèÙi7jÓŽ4¾§YyŸ"A¦Í ì‚d,"û©ì±‰kkÒ;¥)ÏR^Š:”&JÓ×9*—“²,Jן©IW؃È!6Š‚O +q¿–D"mX•
‘¹ÈjmËúÿ@CH®2#¶¦È²&RØš8"u£ +:åô³¡&Ä«»Û†ý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šQS£»»·ž;š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 -1074 0 obj << +1114 0 obj << /Type /Page -/Contents 1075 0 R -/Resources 1073 0 R +/Contents 1115 0 R +/Resources 1113 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1050 0 R +/Parent 1090 0 R >> endobj -1076 0 obj << -/D [1074 0 R /XYZ 85.0394 794.5015 null] +1116 0 obj << +/D [1114 0 R /XYZ 85.0394 794.5015 null] >> endobj 230 0 obj << -/D [1074 0 R /XYZ 85.0394 769.5949 null] +/D [1114 0 R /XYZ 85.0394 769.5949 null] >> endobj -1077 0 obj << -/D [1074 0 R /XYZ 85.0394 576.7004 null] +1117 0 obj << +/D [1114 0 R /XYZ 85.0394 576.7004 null] >> endobj 234 0 obj << -/D [1074 0 R /XYZ 85.0394 576.7004 null] +/D [1114 0 R /XYZ 85.0394 576.7004 null] >> endobj -1078 0 obj << -/D [1074 0 R /XYZ 85.0394 544.8207 null] +1118 0 obj << +/D [1114 0 R /XYZ 85.0394 544.8207 null] >> endobj 238 0 obj << -/D [1074 0 R /XYZ 85.0394 403.9445 null] +/D [1114 0 R /XYZ 85.0394 403.9445 null] >> endobj -1079 0 obj << -/D [1074 0 R /XYZ 85.0394 368.2811 null] +1119 0 obj << +/D [1114 0 R /XYZ 85.0394 368.2811 null] >> endobj -1073 0 obj << -/Font << /F21 658 0 R /F23 682 0 R /F39 863 0 R >> +1113 0 obj << +/Font << /F21 690 0 R /F23 714 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1082 0 obj << +1122 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0 endobj -1081 0 obj << +1121 0 obj << /Type /Page -/Contents 1082 0 R -/Resources 1080 0 R +/Contents 1122 0 R +/Resources 1120 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1050 0 R +/Parent 1090 0 R >> endobj -1083 0 obj << -/D [1081 0 R /XYZ 56.6929 794.5015 null] +1123 0 obj << +/D [1121 0 R /XYZ 56.6929 794.5015 null] >> endobj -1080 0 obj << +1120 0 obj << /ProcSet [ /PDF ] >> endobj -1086 0 obj << +1126 0 obj << /Length 3113 /Filter /FlateDecode >> stream -xÚÍË’ã¶ñ>_¡K*šªŒ7ÍiýØd}p{o¶«Â‘8#ÖJ¤,R;ž|}ºÑ +xÚÍË’ã¶ñ>_¡K*šªŒ7ÍiýØd}p{o¶«Â‘8#ÖJ¤,R;ž|}ºÑ Waƒš)m%ÂÌ ™æLZEBµL€ap~ƽ¯Wq/¿£ÍïòI:pH^”ïÛÕª}Žòâäv -©YÕ]O½`ùÐV sø·ëª¨ý’XP»ëÓXu¬,óݤÔ_´ó.>¿Eúï¾û8øoAè…žh!™å^¢óÿíîç_ùd±âû;Δwfò8 -h\±›f¢š%žfÊÁ¾x燈v œ0“)¥ÌDsͤæEؾr¾:–‘‚9sÀ/’dÞ9—gv6`œQfH„@ê8€Ñ&rf€â -ñŸ‹S5Ë~ÐhÙx“áÔ1·ÏfNùÔP”yÃííø0^áS#íXð¹ÙVõïN• 7Ä£³œªð ôcV¸}ÅéíXM¯±êa¾Gž£^äânô«‰Í™…z¯ÝfØÅ\mM:ãLÊ!!Þ©ÍÜ:èùjÆŒ³1ÊSÆe¨-šy»r@¬ÐƒE¦Dö
å]UX¨)˜Ä 7&>nŸ&Ôùqt61ÀŸÒ|¤hÇx‘žŸªù>#†DRýcõ‚]0¢ôœœPW¨8Å6T#ù -]· -°Éä¾ešq6ÀBmã%Ħ+Ö€*È·º¾Ú^¯zÃà: ¼Z÷ž‰YP2îC† œÍÇlLé¿p0$ÒØbü --\Š_J@…eÏûuåãd~#
ø. -Hy‰¨Uc‹\`e*Y;
Þ7hfå*óUÌ8ëÏ;xÃ
”èÚÞŠçßEž
w¨µzÌsÖµƒëðL;s”=—Í⫬ƒWŽi}n‹¥÷ñ<¸u™†šâõn=aœQf¶™CyÇ´,„îvÛ_MQØ=Ø#ïrs`X¥<ïŒå+ Ñè$nÅõ€ñ -׸6VêC®ÏØ?ðÂ
—/P{Ya§u3_íþ)¦m8óÍDváøôFcE9#é1•õ ôq_Ü@
"ÆÙe&º{¨L·_8É#w°QŹÂÕòl"^uŽ+E}ËJ\²¸È 6F›Àó¢]—usÉ”g…·ÅöÕ±,aœQ梙„”ÁQyî<ˆ[ÆñÌdˆgRÛéo»{jNáo×oé¨R›éó²0ü\‡³]çÆ0&u¼|ÐtÅÍ·?üDãHÆ{Äxˆê÷r=ËùoÒñä/RêŒAIH×`Ç’1¾°¾êz¶ß#^Áú¬³)6!Îê:R„?îÁ†t .õu•0Áj-¢ºö¸±çÔu€½ºŽQ^P×C*«y½.W×5öï!»¯‹—J Zí¶4R7}õ„ž5Œ.W»¤Á§ìOÏ FC_ºjSnËžàm<b+Pv]î6çˆ ÿb†F¤Â†®áðL¿ËœÊð°Î$¯)¤Ê1ª™×ÊVÆX -…—×*Y€’ªxToôÙÓÿðv§ÿc”NÿH<“œþ¿ƒº†ÄôÃ?>ëØ
3Ã%dG(‰‡.GO=—áYZèîï§Âß:wwpäÜó~¬‚)!ìDZ•Û¥Â÷K³ž„q6F™Ézäû²‰ì²‚dT#eµMKwgìa¤i·²‡á¾òËqSÎY„àKæk÷ajf'•‰aÏ[D¼¡EŒP^²ˆ1‰_nJt0‹=3¶píÚ%×¾å\;’醈Qr.Þ.ÜÛ·°”΂CÑQ8±¯£€ÇÑúݼÝ`BªÊtå#H2ŸC‹J„â½¾6ßðn{Ëòs…=7-×õÓ®î_è}hUo©V$àãÙ…˜vôo½ë"º‡*uGØ)pjÁCàÔBàe"µ›
…ÜͶ.ñ¥IEãa¡Ðûð-Í$¯£ã½Vø´¡—4sp4Ù"KÙóðÐÊMŠÉ -1™0%ÅvQêuÝÓ+”7çÓ=}«#d¼ÌæiõB#$Ûy»?· öÂÈ!Cº ý7+pÄ!Žb -ÜÑ ¤X*†aج†F›ÝºÚÖs®Àn~É€*íÃk¤s¤Yv/Â{+ß*ARth‰¯‡°•ø¿|‚d™þ€²½@)º>~”Þà ùTÑk"7ý[ûœÍÛGO -³ÆGZP[ññk(ü[wÔ6-µ]_6zü´ ‘5hÉsª\0Á03 -“ã…õ"GÌX€2Á K!§óÝ–(Š¯x¼‡]Ç^ 2Èíc™¨/Öìªn>EXX'»ÃîÅOÃ;"¢Ùmðx¥Z 5=J·[S 2³¾ÍAèAøñ¡êŸ«ªÉ²œÈK’dB©
›Êó>”_>u|¶ô&2¶‡œÚy¹Š(FiÁ©Ï“Ã[ã’Ï{¬—=+K£z©Â©«Â&±ÂPÙ÷å|qh +h\±›f¢š%žfÊÁ¾x燈v œ0“)¥ÌDsͤæEؾr¾:–‘‚9«üð„$™wÎå™
gc”!:à€D´‰œ 8À‚¢|D]QÜxè¡Ê)ºØdlµÌ9íâìr±ØV]w, +e5¨.·’DBxEÊLØcA€š/OHô³ÚÝ’Æ„ñ +‘šC^¢@Ⱥ[”ÔsŸÄÝÑ-*4Ý} +{Häí¶–Y@ªùîj +&1èI Û§ u~Mð§4)Ú1^¤ç§j¾Ïˆ!чTÿX½`Œ(Ä=''$Ô*N±
ÕH>ÀŽB×l2¹/G™fœ
°PÛx ±éJ€5 +2Æ®¯¶Â+Þ0¸/…Ö=gb”Œ»Á!hgAó1S:Æ/‰4¶¿BgK —â—PaÙó~]yÅ8™ßH@¾‹RÞ@"jÕX@ç"X™JÖNgC÷
šY¹Êðl3ÎúóÞp%º¶·âyÀw‘gÃjóœuíà:<ÓÎeÏe³ø*ëà•cZ€EŸÛbé=D<n]k¦¡¦x½[Ogc”™mæPÞq m +h4:‰[q=`¼Âµ®•úë3ö¼pÃåÀÔ^VØiÝÌW»E…ŠiÎ|3‘]8~½ÑXQÎDzLe=HF}Ü7Pƒˆq6F™‰î*ÓÂíNòÈlATq®ðãcµ| …ˆ×EãJQß²R×À…,®2È…Ñ&ð¼h×eÝœD2åYám±‡}u,Kgc”¹h&!e0GTž;â–q<3â™ÔvúÛî^€‡SFøÛõ[:ªÔfú¼¬Ã?×álù1ŒÄƒI/4]q@óí?Ñ8’ñ†Æ1b§ú½\ÏrGþ›t<ù‹”:cPÒ5رdŒ/¬¯ºží÷ãˆW°>ëlŠMˆó‚ºŽá{°!H€K}E]%L°Z‹¨®=nì9u`o§®c”ÔõÊj^¯ËÕuý{È®Àëâ%…¨V»-ÔM_=¡g
ãŸËÕ.$ið…Ç)ûÓs‚‘ÆЗ®Ú”Û²'xØ +”]—»Íùb¿؟¡©°¡k8<Óï2§r<¬3Ék +©rŒjæµò‡•ñ +'ö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!&Ó +²>Ÿ2˜ÄáÎG9ü)¿²ÁrÔ™½ã7àã~€ª;'è¼UðB4²nÃÑ2–'ÁN;ú3Þ*ü?ÚªŠª•YZêð€rõ\¾ÄE^í… +¶ÍÍ^f"|-Ô—0zp™=Ÿ?¬†3©ÒŠI®åÍØ^fSiÓ¿ŒËX9\+ÒGêý:ƒÑZ0)-Ø ºÈÙ"{Kšž‡ã$¾6Ï_Ôri;ur-;<IߣJËý~ÌÑóendstream endobj -1085 0 obj << +1125 0 obj << /Type /Page -/Contents 1086 0 R -/Resources 1084 0 R +/Contents 1126 0 R +/Resources 1124 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1093 0 R -/Annots [ 1092 0 R ] +/Parent 1133 0 R +/Annots [ 1132 0 R ] >> endobj -1092 0 obj << +1132 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 -1087 0 obj << -/D [1085 0 R /XYZ 85.0394 794.5015 null] +1127 0 obj << +/D [1125 0 R /XYZ 85.0394 794.5015 null] >> endobj 242 0 obj << -/D [1085 0 R /XYZ 85.0394 769.5949 null] +/D [1125 0 R /XYZ 85.0394 769.5949 null] >> endobj -1088 0 obj << -/D [1085 0 R /XYZ 85.0394 576.7004 null] +1128 0 obj << +/D [1125 0 R /XYZ 85.0394 576.7004 null] >> endobj 246 0 obj << -/D [1085 0 R /XYZ 85.0394 479.565 null] +/D [1125 0 R /XYZ 85.0394 479.565 null] >> endobj -1089 0 obj << -/D [1085 0 R /XYZ 85.0394 441.8891 null] +1129 0 obj << +/D [1125 0 R /XYZ 85.0394 441.8891 null] >> endobj -1090 0 obj << -/D [1085 0 R /XYZ 85.0394 424.9629 null] +1130 0 obj << +/D [1125 0 R /XYZ 85.0394 424.9629 null] >> endobj -1091 0 obj << -/D [1085 0 R /XYZ 85.0394 413.0077 null] +1131 0 obj << +/D [1125 0 R /XYZ 85.0394 413.0077 null] >> endobj -1084 0 obj << -/Font << /F21 658 0 R /F23 682 0 R /F39 863 0 R >> +1124 0 obj << +/Font << /F21 690 0 R /F23 714 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1097 0 obj << -/Length 3648 +1137 0 obj << +/Length 3650 /Filter /FlateDecode >> stream xÚÍ[Ýsã¶÷_¡>UÎœpøþH¦—Ä—^š\Ò‹3}H2WZ¢mÎQ¤#Rö9mÿ÷î DR”ìÔÎLç&!‚‹Åb?~»€ÙŒÂ?6SšhÇÝÌ8Iej¶\ŸÐÙ¼ûê„Å1‹nТ?êóó“—¯…™9â4׳óË-K¨µlv¾úi® #§@οøîíë7_ýøîÕ©‘óó7ß½=]pEç¯ß|sZgßœ}{ööüøE…›ñ×WߟŸ½ït$òù›·_†¨¾;{}öîìíg§¿œ}rvžÓ_0£WòëÉO¿ÐÙ Öýõ %ÂY5»ƒ”0çøl}"• J -Ñõ”'?œü=ì½õŸN PJF4Wb¶°šp£ÕáiæMåˆ1ÊŽf]hK4£¸'ÔÎ{[âz[b$qÖÌÑ‚¿#ÅÍX&Ö%œÛ
{„P8¶vZ$‹Žà¢OqŸ;G‰âcönêM‹¾|
»±ŒCÛœG½ªPKìüÍ÷ø4½¯3HCŒ°:~Tm×ùf‚¸PÄj¥â0P5îôüü:Ÿ ÈAm¬| !NÀwaXÑfËb]´ù*pÜÖ¡“ƟכSfçõöê:ô?B½@Ú³“ŠÎ¡ÁˆSŠ{ªwE‹C™™ßfå6oBû"/ë;lÚ9£\†Îöþ¦Xfey~ú™ò¦ÝËÀ‹ì@÷ö”Í›<´/âø›ÀÚ2o˜9¢CV6§ðaUÕÕéBP=Ï|ª0Q]· Qi`³ªðº©×y°Ì€âhs:Ϫîã6ß͇0âgªè??ù3<Xx½¼Î6ð½‰?á³GÁí\àÊÌ·
.[ž'äÃÏ›2[æ×u¹ò„T -íu^….h…F´8ÿº¾}EÛ„VQ¥ãð¼]gÍð;VÚùù©£`ÄE‰jÂ\¶\ã^æ©á3›(N8ypG¹¥Ä9 r5Š8©Ù“w4Q\ôIîï(·°KMvlG
ÑTw;ºÎîÊkˆO@lÚˆùëzºóÙú¦Ì_DBld<l¤Ä¸yi§æÓDÊzñé¶!ÂÂ¥&–ŠQ€ë,oVx=iš”Pü7ˆ¡)lˆcÈTIA&hk¾–u;Ì•:N»#Ê;!GÀþ£„AèK>%"ÉÁ Í +Ñõ”'?œü=ì½õŸN PJF4Wb¶°šp£ÕáiæMåˆ1ÊŽf]hK4£¸'ÔÎw["YoKŒ$Κ™"Zpáw¤¸ËÄ¢„s»a +ÂÖN‹dÑ\ô)îsç(Q|ÌÞM½i‘Á—¯¡c7–qhSà¨Wj‰¿ùŸ¦÷Õ`iˆVǪíú"ßLŠXTªÆžŸ_ç9¨•4Ä áâ°¢ ̖źhóUà¸C'?¯7§ÌÎëíÕuè~„z´g&1œCƒ§÷T23¿ÍÊmÞ„öE^ÖwØ´sF¹íýM±ÌÊò>üô3åM»)–Ùîí)›7yh_Äñ7µeÞ40
rD‡¬lNáê*ª«Ó… zž5øTa¢ºnA¢ÒÀfUáuS¯ó0`™ÅÐætžUÝÇm¾)šaÄÏTÑ~ògx°ðzym2à{ÂgŽ‚Û¹À ”™o\ ¶<O +ȇŸ7e¶Ì¯ërå © +Þz^y÷}–X);¿²/ a±¸Îg“P¢ø€ˆì Å=Q¶ZMy3.@q!V†e ¹B„½¬Ë²gqçE"@oáE$Ó”YsÝ—…wZMÔ[öËhÙeY% Úë¼ +]Ð +hqþu}ú.Š¶ ¢JÆáy»Îšàw¬´óóSGÁˆ‹Ô„¹þl¹Æ½4ÌSÃg6PœpòàŽrK‰sð‰6Š8©Ù“w4Q\ôIîï(·°KMvlG
ÑTw;ºÎîÊkˆO@lÚˆùëzºóÙú¦Ì_DBld<l¤Ä¸yi§æÓDÊzñé¶!ÂÂ¥&–ŠQ€ë,oVx=iš”Pü7ˆ¡)lˆcÈTIA&hk¾–u;Ì•:N»#Ê;!GÀþ£„AèK>%"ÉÁ Í ä"Ìp¿ÿáÍ`rp³—÷Oàï<âýïÇð¢¨nëòv8N€ë¾Õá‹fYßx„ƒ/Ñ<ðiBG§~#oà¿’ÃÀÆEì؈ Ï`o{µ¡…x¦ë‹ÓÐsW”eG¿]^ÇaÙòÃb Éämöä28©uø•U÷¡áÙ=6úqüiÐ`‡6B<¿ƒdA¡
e¡e„8Ž6¨$œE±|ÈïÇkvˆ1£vãžêz;‚‹>Å ¸Î
逿b5 5@.%¯¦0%ÒðÎc -ŽbÒõ”Ñ]]-ªü*k‹[ÔMMç‚/ o‹ªÍ¯|y^`¶Tœà&Z*»´G\ -+]Ô `Ò‰íšXFõ®rv2\ÁÌèL#¹¦‹¼I~Ë„êè ²Ë¼ìª»y;Hƒ ãQ>zÊP»ÊÇ(æ0"í#½'¢Ç?25Õñãg¾
ôÓxÉÞ‡Ø2U½JãžzÕ§x¸z5à/ø>{°L -=pXxÉW1]è -ƒ{×À¸À|(ß}²‰w}’S&.‰„ž“ŒNš¹&TóNY¿ÃR¹Vkçûš 3ÜQ[gxO"Ñ›†Ðréäù–þmqyÿàí¾GÒYÜd
B…)cöúÑ|mòËM®ÂìsPaåÆaÚ3Êp„Æ*à!æÆùÿ‚á9x8ZWZÆⶊؓ…Ö¿¦ÖÂ0uæé®È3H ‘%üÁË–ÓpM/¥Į"´KzwDLèSœ;g¼x¹w;’ºtY³)³Û<tyPíûÚíEhùâÇ×s*ÏU’Þ]:~ð3|c¨Ýbþß¾JÑ€7¬Á.@I„^ß»ÍÅ"ÇÑÏ°vdí½‹ä8¡Ùî"9u¦”Î_V›xƒÎ¿—( ùMýK++tœÜ‘JÄ~¸‡¬äãt¸ÿU&}ï/m¼ç‹XžùKxì¿~Ÿ—ùRžðþ3ç»Uþ§‡(|BBã—X‡cØòÙsþ©#èþéæ}Ö‰×|YæÕU{‡ü;,#º÷Á2ð˜ÔÆûbÕk[–ïÃñ~¯ó_‡Öúÿ“˜b{ºH<`q“ëž–·öKí¦*v'üÁj¡ñc“]M9†Ñ¦¿\ÀÖ]Ùféµ
š¼ç@ ÿfS¬³MáS4ø/àE‡xOa•·ùf]Tyüx¹Läñ,Üó)CG¸¬ -¼–d‚áû©Œ½Ç$[áÆ÷*üðµ5“j#™[^ …\^-&…D Ÿ°þÁËqʤÖÔ›öÀ ¿„ÛkÚ¬õúÖ«øG¦£žGuG‡†¡T›¶h·m·ø¸Êá•0Ó]ÈJwÔ&I£#Ì.m÷¾ÉndùË+}hj}Euõé¡¿F?/…`S<BgÝüOþS•ÝòHîºWá¥@ÑOw\áÂßãAÆ"4Ÿbþ¿púPÃendstream +ŽbÒõ”Ñ]]-ªü*k‹[ÔMMç‚/ o‹ªÍ¯|y^`¶Tœà&Z*»´G\ +
IF¬LÅL²«¯(øx ð¯&K– • +5»-$fÓ;.8‚rr&$Z‹g(av}’@ˆK"¤å»™ì9DÉØ0ùu&Þ„¥V +.æÔ§Š +¿MØ™ÊULp••/ÖÙÇb½…ô\R¼·YQ†é®ëm…Ç bódÚ'¡”ºÑþB:F'ÅŽ'ŠV05ƒd‘jù“Åž(.ú$÷Å.¥$–ƒ£HÃŽ‰Ý@–É@ºã#¬Í@úÈGád~/:ÛÈbë.k†Øà2X˲3žX>êÙS“onóÍèó¦Í6m„ã 0¹5 Ž<¥‡ü°Ô—4l™E Vß`zÎÞðw8˜r¡|jçØßzX¡p™•!âHÈPëͧ>3‰þ§ód›à +2{E¤æ#]7ä˜ œªn&¨9birb>VÎ?e}qßâAÞ>Q
DeúæÛDu§ø`lýhÆÖ +’‡¦Wxâi¯È}ó“ô[„ƒ•nÌ'éÓ'¹¾<ÖŒ9IÙ«„ŒGâñ¸?íÒh®·>é¦&¨9ôìU}b‘‰Ã!+|¡eÌ| k[5ÅUåƒê”Md˜aªCy8¿oͬ”ÚHI0j泦ö²7ÿ±‰‡BãJ5˜ôcb»&–Q½«Ü‡…W03:ÓH®é"o’_ë2¡::¨ì2/»ênÞRë Èx”ž2Æ®ò1Š9ŒHûHï‰èñLDDuüøY€oý4^²÷!¶LU¯Ò¸g«^õ)®^
ø~£Ï,À&žÏÅ_¢ø +ŠQ¦óoq/Æ` +EàèY:o7ÛüÀɨb|ª7Œ»íZ×qy™•Í%!P“;ÉÅvà¾@o…îe +и’õ6Η +[ð¢¾É7®°ÁkIÆ!¾ŸÊØ{LòA±n|¯Â_[3©Ö9’¹µàR(ÀõçÕbPHò 뼧L +iM½iœðI¸°±¦ÍZ¯Ïa½*€d:êy”QwthJµi‹vÛv‹«^ 3Ý…¬tGa’4:ÂìÒv_á™üèF–¿¼Ò‡æ¡ÖWTWŸúkðóR6õÇ#tÖÍÿä?UÙý!4à®{ÞQ +ýtÇ.\ð=Þd,Bó)æÿÔ·OÇendstream endobj -1096 0 obj << +1136 0 obj << /Type /Page -/Contents 1097 0 R -/Resources 1095 0 R +/Contents 1137 0 R +/Resources 1135 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1093 0 R +/Parent 1133 0 R >> endobj -1098 0 obj << -/D [1096 0 R /XYZ 56.6929 794.5015 null] +1138 0 obj << +/D [1136 0 R /XYZ 56.6929 794.5015 null] >> endobj 250 0 obj << -/D [1096 0 R /XYZ 56.6929 268.7207 null] +/D [1136 0 R /XYZ 56.6929 268.7207 null] >> endobj -1094 0 obj << -/D [1096 0 R /XYZ 56.6929 240.9336 null] +1134 0 obj << +/D [1136 0 R /XYZ 56.6929 240.9336 null] >> endobj 254 0 obj << -/D [1096 0 R /XYZ 56.6929 240.9336 null] +/D [1136 0 R /XYZ 56.6929 240.9336 null] >> endobj -1099 0 obj << -/D [1096 0 R /XYZ 56.6929 212.9194 null] +1139 0 obj << +/D [1136 0 R /XYZ 56.6929 212.9194 null] >> endobj 258 0 obj << -/D [1096 0 R /XYZ 56.6929 133.1778 null] +/D [1136 0 R /XYZ 56.6929 133.1778 null] >> endobj -1100 0 obj << -/D [1096 0 R /XYZ 56.6929 104.9484 null] +1140 0 obj << +/D [1136 0 R /XYZ 56.6929 104.9484 null] >> endobj -1095 0 obj << -/Font << /F37 747 0 R /F39 863 0 R /F23 682 0 R /F21 658 0 R /F48 885 0 R >> +1135 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F23 714 0 R /F21 690 0 R /F48 925 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1103 0 obj << -/Length 3008 +1143 0 obj << +/Length 3006 /Filter /FlateDecode >> stream -xÚ]sã6î=¿Â{¨³3¤¨ÏéS›fÛtÚlo7;w3ÝΔ‘™XYòJr²ûï @Yrd§7~ ‚ -¼¹úù’z—?_þry}óþô÷›ŸN.oza†+©Q’O'¿ý.gKû§)t–F³'H¡²,˜OÂH‹(ÔÚCÊ“÷'ÿî fÝÒ)ö8Š4ÇÕe"Öîլš3è¦$ðX¨æR%û¢*¢0™
é=ãÚc=gÝ[%¡Æc¶¦"m_ýJY.›S•ÎmÛ࣌äÕ¯!êÆ£?Æ0£N(Eš%éj`Q“ÇzYMǸԴÏvZMC¶ûjÚ’>J|Þé©`¬?ο¦NUw¦+êꨪ‚@¨XëT5À:¢*õ²ªŽq¨jŸí´ª†l
‰þ`¿°Ê¾?cÓb‹Z:µUvIÃ[ÆëVw,Ô…ÊD*ÜGª„4ÚG&$ÈÏ8-èÜ®mÕÔ¸Ô"Òì°ŽhÜc½¬ñc\ßg;ñ![Ô™›Ys¯¾cWÜzmº|Eݲh»É“y*ºÕ±³ ˆ…I±ÞM^NM$¤ölâ4q†ÇÏfˆuølz¬Ïæ(×ÝÙ<c;y6#¶ì
•m;¯Ö?w¶Ê˺õk|d¹mLn[”c¶ -cÝ_}Q
}[Ç`gL“l:^($KBA
´%jÁzLõG#qª®,PD ²)‘EQ@Ge›rU·/f®3µC¨l×â€À†ÔMŽÜ½©C:’ÀÎ~©wH¨î»ºñ²ã*ßvÀš ±,ØujÆÎ-ÏÝÕ[¿§¢_iÇ2Qvµ´mÞÖòÀs{§F·rÞwDOhpð7„£yž\Ìä"O.öq9žÃén[®ÍÒîáùXâIÄ0U´Ôk¿TÉ»"§5–lŽçêµLgEƒÅ†P×E[BƒIŸ»Òy[T¹:îÖæÛ¦èp»‰Æ}#wXGF°QC»%7©®&È£)‹%h‹ &ÏÉײùzÛÑ€Žüžìc„¡M&\ê°§Úy’ö¾|ªæm¶¤S5¿#=–ÀôlêÌû£íl³æì½á…¸@í¢Aë-¢(Ù8¶}¨èVŽJ½½gA‡Æ´¬ó-ž•3íI;úÏÊ¢zSÒ -@9Q6òñ -Œyr´›CDA”Œ•Ö§îdc+óXÔ}Ñ6@:8â4ó¢CÏWç-a‚¶ÛÛÖvr›˜“¦, -D
ÎdœÌŽ°¥Uü´ 8*—…ìÝú`^8‘bßRþdÈ Â^Œ3ËÊ’³öa˜ße~¸´ðý„L`}ºçò•7µGýlÖ›Ò2—¢šˆ¢:Ð"M•¿
•„>ÂohÉW”T9¨Pú›©»QŠR^OŠƒ•~ ß/þ²½Ôbw–YD¢d¡«ŒJKõÂÁªX!0¸Å²Ù[Zæ2L2ïk(ýWk"ÂÞ”íIÄq¡f˺~Ønèr|ìôv(Î݆¼b¦Üå@íÇjþ¡ÝÝmjœ—È ðŠúŠwš?‰G\öÓšL„i4ðáÏÎØãÄ{ô¸@½…ýÀ=•ÇéÝÉx -®–fÛ¢×5´6š'pÄÎ2°àíô&uqÆíë×lUu3ù˜·²ey¾±Mÿ˜ùÅyîWhØG–îìC(¶¡Q@uvÐ(ÎÝ"(’|I¨éMâ•›ðÆ=˜¸q—[,é¡[C
öz{r³»¢ö‚§PüÈHMðäÍàç|}ÊL* -Ç'ççD÷ïëõë©·™ý¨ãdÍý×Wÿ¥ž;kOs2츣ÿ“ÇíÂ÷ƒÌdïõäCkîíËÑábçÕÃ÷¬Þ+É‘[»æ_¸Fn}ˆÀÞ{Ïî¯ÏÙ}'&Gž8”‹…ó -,@‚A<Âr¤íLÓÑ}µÑþ[‚º§š ùÊ4&ïœÏãÄù+‚ã£f[švåÊ"Çoœ:àï'øɇ:C¯Î â(À*ÿú‰D RÁ‚*Jû¤qÂû)¼h™¾ÅÈd”àxiK(ÊÜ«y?=ØÖ¯éEÄm <ä=yú#)zaËÏ’‚#3%ƒÆA]yÞ†|У×II!“æ&’À²¨ìøáÏ…_ŒmÿÙu½-»bSZÿˆ8ôåÜ œþ/ûûóÿ×e÷ 5L„NÓ`úS&è\¤A–øM¡¼Zïï<Ò©ˆÒ ™Øúÿ +xÚ]sã6î=¿Â{¨³3¤¨ÏéS›fÛtÚlo7;w3ÝΔ‘™XYòJr²ûï @Yrd§7y ‚ +•eÁl}FZD¡ÖRž¼?ùwOp°ê¶N)°ÇYèP¤1Ð8®æ(±t¯fÔœÁ0Õ ÇB5”*ÙUÉ6…ÉlHï×ë9[îØ* ã0³5iûêWúšå²9Uéܶ->ÊH^ýúÒ¬n<úc+êàå„R¤Y’¾ ¦Ö5y¬—ÕtŒë@Mûl§Õ4d»¯¦
)飔Áçž +ÆúãükTugº¢®Žª*„Šµ~AU¬#ªòX/«êתöÙN«jÈÖèö«ìû36-¶¨¥S[e—4½e¼neñ´ÀB
Y¨L„¡Â£!q¤JH£sdB‚üŒÓ‚ÎíÚVÝAK- Í^Ðø +O.fr‘'û¸Ïáv·-×fi÷ð|,ñ$bX*Zµ_ªÎä]‘ÓK6ÇkõÚ¦³¢ÁfC¨ë¢ +±½jïÀ¶ŸÓ‹C¡Ò4þkôèêCh
’DEãİݸ’è9'Dªãœ¤Jƒ'¢¶€ údš%GËgv %“°§¼Ð)&\.ô}ÙûaU—S§
S¡B5s±+i0*"´û¤ÂHËï‹uQš¿RÊŸr +cRœ§^+H@áž/ù²š—'ªÄ`”sY
Cn† (¶Í£õ¬éË ·GF£ÈO:$Üí‘\ÌòökÞ0ÚÓxZÔ%PöÑB
úî,yÞ˜ìÝd¾yKÕ²Gi:˜Â*„d}(.úàÛ÷æS(Ú”o)ÅtXZïj
…£áP=Ó`—}úz¬o/~sâžËѪ™K©¨˜U!³XŠT4sŬ›Ì„*¨òG¥-&›´¼ãìTåÜr°9$Ñüùј;Î}—Áö溋Êzˆé|Ÿ³fû‡D4ÌM¡ã>|áiš¶;ð*eÞ‹j#)¾à¡– +`Lšª(˜5P8“q2;–vñKÒ‚æ¨\ªwëO:(€yãD‰}Kõ“!'{1Îh6n+K®F؇a}WùáÖÂ2e€õåž«WÞÔõ³YoJË\Šj"Šê@‹4U>*}„ßЖ¯¨¨rP¡ô7S¹QŠJÞOŠƒ~ç‰Ù^i±»Ë,"Q²ÐuF¥¥þ +á`U¬˜ÜbÛì--ó™÷5´þ«5aoÊv…$â¸Ð«e]?l7t5>ú;çnC^1SîÎr öc5ÿÐîr›×%2¼¢¾"äfÁOâ—ý²&a
|ø³3ö8ñ^ +WŽÒ²MÞœfÐ:Ó‚cPòE×#ùoÈÔ°]¹èƒJÆ~( ¿v¦àzi¶-z]Cëa£yGì,>NoRgü}ýšªn&óV¶,Ï7¶é3¿ 8Ïý +í#ûÈÒ}Å24ŠP6Šsw„š¤ßÇEjz“xå¼qn\r‹%=”à×ЇîG½=¹U]Ñ÷‚§ÐüÈHMðäÃàçœ>e&…ãÇ“ós¢ûÏõúõÔÛÌ¿þ?Ôq±æñ‡ë«ÿÒÈݵ§‡5ÜÕÿÉëöáûAe²÷zò¡5÷öåèp±óêá{Vï•ŽäÈ]ó/\#·>D`ï½g÷¯ÏÙýNLŽ<q)çØ€ƒx„íHÛ™¦£úÕFûßZÔ=ÕÉW¦1yç|Î_5ÛÒ´+×æ9~ãÔÿ~‚?ùÐ`ÈãÕ9AØå_?‘D*ØPEi_4Nx?…-“Áo128_Úš2÷j„S>…ÄŸlë÷ô"â1jˆž<ý#)zá—Ÿÿ$GfJ“ºò¼
}ðA^'%…LZ›(Ë¢²ã‡?~1¶müÏ®ëmÙ›ÒúG|¨hÅ¡_>Á
ÂéßãeŸ?ÿñÿºì~B
¡Ó4˜þ)t.Ò Kü¡P^÷OéTDiLý‘ÅK{endstream endobj -1102 0 obj << +1142 0 obj << /Type /Page -/Contents 1103 0 R -/Resources 1101 0 R +/Contents 1143 0 R +/Resources 1141 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1093 0 R +/Parent 1133 0 R >> endobj -1104 0 obj << -/D [1102 0 R /XYZ 85.0394 794.5015 null] +1144 0 obj << +/D [1142 0 R /XYZ 85.0394 794.5015 null] >> endobj 262 0 obj << -/D [1102 0 R /XYZ 85.0394 337.2197 null] +/D [1142 0 R /XYZ 85.0394 337.2197 null] >> endobj -1105 0 obj << -/D [1102 0 R /XYZ 85.0394 308.7375 null] +1145 0 obj << +/D [1142 0 R /XYZ 85.0394 308.7375 null] >> endobj 266 0 obj << -/D [1102 0 R /XYZ 85.0394 249.3979 null] +/D [1142 0 R /XYZ 85.0394 249.3979 null] >> endobj -1106 0 obj << -/D [1102 0 R /XYZ 85.0394 223.4382 null] +1146 0 obj << +/D [1142 0 R /XYZ 85.0394 223.4382 null] >> endobj 270 0 obj << -/D [1102 0 R /XYZ 85.0394 151.2553 null] +/D [1142 0 R /XYZ 85.0394 151.2553 null] >> endobj -1107 0 obj << -/D [1102 0 R /XYZ 85.0394 124.0503 null] +1147 0 obj << +/D [1142 0 R /XYZ 85.0394 124.0503 null] >> endobj -1101 0 obj << -/Font << /F37 747 0 R /F14 685 0 R /F23 682 0 R /F21 658 0 R /F47 879 0 R /F39 863 0 R >> +1141 0 obj << +/Font << /F37 779 0 R /F14 717 0 R /F23 714 0 R /F21 690 0 R /F39 873 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1111 0 obj << -/Length 2398 +1151 0 obj << +/Length 2400 /Filter /FlateDecode >> stream -xÚÍYYoãF~÷¯ ‡P™Ý7ÙÉ“ãx;“ÄãÅb‘XšjKD(R!);š_¿ÕÙ’écÖÞ 0`öQ]Ý]U_-!øÉDF©d G˜GÅúEK˜;?ÂŽfî‰æ!Õ·WGÇïhÉD -"¢«›€W– ,ÃÑÕâ—X$$™ŸþøáÝÅù?/Of)‹¯.~ü0›Žâwÿ8³óË“÷ïO.gsœqŸ~òÓÕÙ¥ŽÇ·¾³#Ò~`zyöîìòìÃéÙì·«ŽÎ®†»„÷ňê‹üqôËo(ZÀµ8B •î ƒ,%‰ÖGŒÓ„3JýHuôñèça0k–NÊ£„PA&Hè” -vIS°6ŒõY¢?@ë-5MØ6—…bŽ/Ö4ú®+FÁ-=ßyÀØ\2öÑÊ¡¨"Ø]rpWÂÚú¿g˜êÁû04FRÝ6QG7Œ=èF§ÖeÑ@’c»Ú=üç›/G`)2¾g†Átÿ±k· -#¡0ÿØ«Ï=ÿàW€Ù]iN ,F,
¡DšÐŒâˆ`€áÙæE5NŒ2(GSJC°6ŽTHã.!>ÔùÚÔc0rñ“Ê«‚Α®ó¾X}éé -06C¥M¶ŽYQXjqÀmaWMÙh>$™ -ß|vup1$5þEÌM6“Y@[~ -² m7Dª«ç¨+Äkù©×W…¢ -?eâ,M2žÚÐõêRKàó4FSH(Lò-÷°ŸA‚ÐÞŸƒÀפ̿Z˜%j|÷ÖZË`
Q&_BÙwvÀ'jì&³úA[£ ^WYì•fˆ?¥-Í…¥6¨Twz:¢„5’‰*÷c“‰Â¿:Ù,á>[Ê žQGdÞeu2`2F“IèŸÌÐ~ÒQ•ËU?¿Súc'ÜAšÊ؇Yä.GŸgPÆPyðà¿öøÔïÄù ÔÓ -4ŠeòPÜg4x\ØL Ž¿-ÀAXLò§Ü1B ¢ßë¼3?+|Nú˜r«I6¤0♎N-…ÍaÈÄÀΖã¦kç»~{íXÖŽSWé—ý‰ç¸OÍðï73ÙO•?žABùÛ*N HçùãzKE‚‰°zk6:F=ë>WÔâ’Y¼¬škó”üà‘aü~‘~CaµÔŽÜTk0¿P7ù¶š.Goü3oêÕÞÃêEñ2Ñê‡ÃŒ¢´Å̱œúEÞÂ^ü«ýø”f™þAž¤àG2`¢g)µ¦MÙ½7\ÿû¾'ÿ_À¶endstream +xÚÍYYoãF~÷¯ ‡P™Ý7ÙÉ“3±;“ÄãÅb‘XšjKD(R!);š_¿ÕÙ’écÖÞ 0`öQ]Ý]U_-!øÉDF©d G˜GÅúEK˜;?ÂŽfî‰æ!Õ·WGÇg4d"ÑÕMÀ+KP–áèjñK,’Ì€ŠßýøáìâüŸ—'³”ÅW?~˜Í GñÙÅ?Nmëüòäýû“ËÙgÇï¾?ùéêôÒN ÇãÛ‹ßÙi?0½<=;½<ýðîtöÛÕG§WÃ]ÂûbDõEþ8úå7-àÚ?¡„ÊŒGwÐA –’Dë#ÆiÂ¥~¤:úxôóÀ0˜5K'å‡QB¨ $tJ€\&‚”à»y×ï*÷¢$.šõZÕ}§{8.òºnz;sí(jÕõj⢈ÆgMkGÕŸùzS©·ºÇã~åˆošªjîÊzi»¥ã;0½Í«ráùù¶S–`` +wœ¼ïÕz3tìW[1ƒ‡®NK2.²‰Ã¸Sãöôs +fŸQÆö¯vÿ uc¿US/Uëí/±›8
A +ye‘ƒQR"⪬•ö¤45¨ô^D·µ1cîÛÍò¦ël½úrS9b½ñþÝ7ÐÌœ^ò[GÛÔ®Q5Ëqw¦ÓmÀr'à6nª„Ùæm«¼X£¶µÞzwb½VèmŒJ¸Æ(8/ˆ#ºc}§æn}ç£>)µ–vlmõežfŽ‰á¡<4ÿtÌå&ôë·€ïÞíq~k{êVÕþPÍv¹rkû}N=Õî±
ñq›VݖͶ»Þ$¢}~\©ª +1¨aã5±Q›s*vÍÖQØ`t£ÚYO¡x°Œ¼Ê¦„$L€SAæ¤_L\&î–@Ÿ¼Þ®¯µK3;—ËÚŠ£ ¼[ŸIQ"ax_àÆ„l½ +Å_¬iô]WŒ‚[z¾ó€±¹$d죕CQD°»ä஄µõÏ0Õƒ÷ahŒ¤ºm¢Žn{ÐNË¢$Çvµ{øÏ7_ZÀRd|σéÿc×6n) +ôe†¯!Æ¥ +mÏEÕt¶j†¹kÈ”¹+’ñ{S°èá@:ç×Q?÷¡8·Ÿëª)~ßëÝöz>2r‘ünUú|w¼¤îTÏT».kX¶8¬¸ÝV '‚þ•O&Â÷Žö~¸{·Ýlš¶üúŸYš ”Fºä’<}Ö›•€%²ÚÃÒÿ¶*Œ„Âüc¯>÷üƒ_q +:GºÎûbeô¥§+À,Ø•4Ù:fEa©uÄ#´…]5e£ùd|Ú¡˜êî;à.õxˆãeòÕšäX¤ãžÏÒ¯x@eX#‰³Çu†!Ê‹4cXۦꞡ¸¢r è|r=ŠØ¬ IP•›ö‰ýµÄëd~½{»mxL,‘®E|"ÕÖ‹bâpIAýá¶}Y•ýn†1ŽVa(ž— üÿ©Ãè¨Oè0£²Q÷N{»POªÐÑu{îÒ¦@-8Ïk íÕ}†Ì‚@4Bh)NRáïW»'ÖmTQj™ dÔ :¯Á묇4Y'¤gì“ŒpÅ(|ó-Ø9ÔÁÅÔø17ÙLfmù)È‚¶Ý©®>^œ?¢®@¯å§^_]Š*ü”‰³4ÉxjCÔ«K-ÏÓM!¡0É´ÜÃ~ B{k|>_“z0ÿja–¨ñÝXgh-ƒ5D™| eCÜÙŸ,L¨±›Ìêm‚x]e±WT˜!þ”¶4–Ú RݵêéˆÖH&ªÜL&Bÿêd³„ûl)ƒxF‘y—ÕÉ€ÉM&¡0CûIGU.WýüNépi*czd‘»}žACåÁƒÿÚãSW¼ç'PO3(xÐ(–É@qŸÑàq
?b2:þ¶ endobj -1110 0 obj << +1150 0 obj << /Type /Page -/Contents 1111 0 R -/Resources 1109 0 R +/Contents 1151 0 R +/Resources 1149 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1093 0 R +/Parent 1133 0 R >> endobj -1108 0 obj << +1148 0 obj << /Type /XObject /Subtype /Form /FormType 1 @@ -3909,1042 +4032,1047 @@ xÚm”In1EOPw¨u€$ÅIg0²Êľÿ6¤¤êV5oʯÅésÀóή¯ƒÖ×O²Î Ž¢‘ÿ¨#h8Çùø:„5?ù 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 -1112 0 obj << -/D [1110 0 R /XYZ 56.6929 794.5015 null] +1152 0 obj << +/D [1150 0 R /XYZ 56.6929 794.5015 null] >> endobj 274 0 obj << -/D [1110 0 R /XYZ 56.6929 330.9243 null] +/D [1150 0 R /XYZ 56.6929 330.9243 null] >> endobj -1113 0 obj << -/D [1110 0 R /XYZ 56.6929 299.0803 null] +1153 0 obj << +/D [1150 0 R /XYZ 56.6929 299.0803 null] >> endobj -1114 0 obj << -/D [1110 0 R /XYZ 56.6929 240.311 null] +1154 0 obj << +/D [1150 0 R /XYZ 56.6929 240.311 null] >> endobj -1115 0 obj << -/D [1110 0 R /XYZ 56.6929 228.3558 null] +1155 0 obj << +/D [1150 0 R /XYZ 56.6929 228.3558 null] >> endobj -1109 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F39 863 0 R /F62 995 0 R /F21 658 0 R >> -/XObject << /Im3 1108 0 R >> +1149 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F41 910 0 R /F62 1035 0 R /F21 690 0 R >> +/XObject << /Im3 1148 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1118 0 obj << -/Length 2415 +1158 0 obj << +/Length 2199 /Filter /FlateDecode >> stream -xÚÍZÝS#7ç¯ðÛ™«X§oi²O„e÷Hí’= O›Á`níÎ3@È]þ÷ëVKã±óHUŠ‡‘ZR«õëVȈ‡?1ò†q•é‘Ë43\˜Ñt±ÃG0ö~GÄ9“4iÒŸõÃéÎ?Þ)7ÊXf¥ž÷xyƽ£ÓÙçñþ?÷>ïN¤ácËv'Æòñ‡Go‰’Ñgÿ§£w‡ï>ÞÛuz|zøÓ‘ÞíìN„7ÖËÈaË‚w‡¨õþxïãǽãÝ/§?îœvgéŸWp…ùÏÎç/|4ƒcÿ¸Ã™Ê¼ÝB‡3‘er´ØÑF1£•J”ùÎÉο:†½Ñ°t?-“2S£‰òLã·oK[pØ66…`™1›»N„0L…:1–qm\§)z:R0'33r&cVI”ÒË›b‰ØÀtÕŸÎ=Úá64¯mÎi±l󲊺ú…syq½ÌÛ²ŽÄú -Ûqz"æô¹‚Í„Oâ¾v–7eÃ6õc¸cÞq1êëeP©L2#¬CÐhÂk¢¯5ã7¡¯³ÎÑ•h—×M[Ì&ߊ»æqÌ -ĺ*"²ír×Ãzê¿=:99ا62| -‹ü.ùûyjM§×ËDœ+ÿ?9X'YÒ=l &-™Í,˜4Üq!¸
{cìp8¿“$PúË|±Èc`SYï´¦Y¦Xâ4©òEA½ÿâÊ\sƒî’†³Ù²hš¯‹¼^~—MæN6&“‡ÿýÍÐÁ@ÜßH>r ·tóÊU˜Eu†ÆÏM~1tw7NºÝ”„O¦„»8 -BÑ€;Íã}¹¬á¾¤P$ipÿ}a^šB(f!ÿ9˜3Í Ay3ˆFy²ïj8ïz -¡D²‘´ò¸iaˆ0‰¬UÑÞÖËoÔ)«¶XžçàˆqZPu~§çÉÚäwš;(ÚÛ5ׇäe0¯4醗ü95tZ±]sÚ3)ùcÖ®<¼Ñ÷ÕUÆŸ¬:‘éàX ¡‚Í ³ ¢RjYÒ—tŠc¾|žÆo/K¥8!¨i¤š!í]æ¨\¡(wr¥wHRdæÇ'uÈD`1ihÚ¬&bU·Ô¸¢DáÌ¥œÅ9}nC
ãºYÛ,Jr+¡DϤ¤ŽLC ÿ•(ó¢&íeCý`ÄHG
P3=´ÖŒ>$]b|XÑXs²IRaš7ÅwC¾l@.ÙU%ÛU=é殧`]í°è;¼îâ$Ù¡e_Ï׊æ;¢ý;$A”±}Êz%§Ò«¾¬[<ŠæBÛ”=pk{×áeWlukŸSæ¾~b! \åFP—a<ÒË\%¡œk™C¯öIï®ü‚6JtŠÐ“ézÞ¼¬®[qY•s)\3ºÏ4nXK-LØ#íêk°®Ðù±»FGÈœŽyÏßã1í
`ÎO«ã.Wõ²íx¯:_b Šùhx"$çCÅ&
üNIs2¡5·žü +xÚÍYOwã6¿çSø¶N_Íå‰ÛS:“™MßLÚMÒÓtÞ<ÅVlíØRV’ãfwûÝ HIvä8™äÐçƒIA +ÄiÖEÿ¡¼ÁZÉÚÔ|ƒ.-¸¸4d,!8]qÄs°çàÓ%ñ»y W¥«UêÓZÔ?/GÀl$ÈïMœ&ˆ¨÷_\Ùæð-¼Îfà‘/«´™.¾,:¸¹“Éd¿?:Èçè8i$è-ݼ¼K²hN×øNçCwwç¤û]I$Á•p÷ +ÿª$lèÖë±Ó)¡b¶+žŒÏüVs‚ ÐÊC£ã}ã8•«-An«¼àž:ë:#K©ˆÉ®á–Y˯Ö-™œk“LÐD™ê@(ÁÇ'•ºB¤,ÚÞïN¤æï<æ'o>Ôð/œ—£]„aVIã6>/8‚R žEÚ`K;!eKðÂà +ó7O&5 ux€hמböŒÈ›¼Yah“0ËÛ@¿Ç48mbÀuvS’t´Qî7žéIŠŸ@~¶YÌ~š±ã¢ô÷Š+kÄŽY`‹
ÞÛiíç%ä¢ Šë,—å&›
êï›tSâ,Œœ®‹F`u½Î—Í$/~ØMpBDÌ#GÜ!yéié + mÌsÓÑЪ Uá5‰ [Œ½{A„ˆ¡€…”ʼnò æ~Ài¬bJÄ! }Dnm¶ô÷eQÂ}€ ‹"¡/ËK!„bZÃøk +„: 2¸KKCåW1Œ»QZQ>Ig}a^Kg”â¢×x‰huf°¶ãöÎôñ7xYNÓ%ÿŠ3 +Â+^i#Çg¿ÞED¢J$íI]È
]j€Iä®@(²fSV_©“MVݤ€pÄ8,(ÚÀÓeM<õ=Ôl«GL×ÓÉK_‚é +"ÈöuöJ¬Ne¢ú²î‰(0zäÖö®ÃË®XwkŸSç¾>°PóXƮεI$žXçJ3+k/0ôªŸðš.c%¥‰ÚHùhŠpº\ÖßPÙÅL%UU—® 8pë}¢pÅj!d÷´Û/ν\çÄB(›#!3‘"é¿óCÄ´7€¨ŸVû]n˪iywϾEDžÉùP¹Il>´u‘Üsb`ƒ@ðk±U©ßÕ±0†žèZaŒm-ãƒó×Eþ‡?i +…µ €Q«X¯®3¯ÎrS„fŸ<¯ÊõíCò³NÄ·µñ@´Ý£øú`§ôØ_»'ŒHTÁo£§øí7ð=‡.à%Ç÷›P“µ"Æ1ÉÕÃ"^i»ó™F–PÒâ”î#
c%TWâÁ¿/ñ`äúž(>“:Z:ƒ¶ªÒ¦¬j¶72íQ4g±æ;—µg +_´¡¬¦Ÿ"€à€ä?0˜hŒ MKÔ_íǶ6ÅeÝép¸+ endobj -1117 0 obj << +1157 0 obj << /Type /Page -/Contents 1118 0 R -/Resources 1116 0 R +/Contents 1158 0 R +/Resources 1156 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1093 0 R +/Parent 1133 0 R >> endobj -1119 0 obj << -/D [1117 0 R /XYZ 85.0394 794.5015 null] +1159 0 obj << +/D [1157 0 R /XYZ 85.0394 794.5015 null] >> endobj 278 0 obj << -/D [1117 0 R /XYZ 85.0394 656.7756 null] +/D [1157 0 R /XYZ 85.0394 632.8653 null] >> endobj -1120 0 obj << -/D [1117 0 R /XYZ 85.0394 632.436 null] +1160 0 obj << +/D [1157 0 R /XYZ 85.0394 608.5257 null] >> endobj 282 0 obj << -/D [1117 0 R /XYZ 85.0394 563.6675 null] +/D [1157 0 R /XYZ 85.0394 539.7572 null] >> endobj -1121 0 obj << -/D [1117 0 R /XYZ 85.0394 533.5536 null] +1161 0 obj << +/D [1157 0 R /XYZ 85.0394 509.6433 null] >> endobj -1122 0 obj << -/D [1117 0 R /XYZ 85.0394 456.2156 null] +1162 0 obj << +/D [1157 0 R /XYZ 85.0394 432.3053 null] >> endobj -1123 0 obj << -/D [1117 0 R /XYZ 85.0394 444.2604 null] +1163 0 obj << +/D [1157 0 R /XYZ 85.0394 420.3501 null] >> endobj 286 0 obj << -/D [1117 0 R /XYZ 85.0394 307.3784 null] +/D [1157 0 R /XYZ 85.0394 280.0345 null] >> endobj -1124 0 obj << -/D [1117 0 R /XYZ 85.0394 280.2293 null] +1164 0 obj << +/D [1157 0 R /XYZ 85.0394 252.4421 null] >> endobj 290 0 obj << -/D [1117 0 R /XYZ 85.0394 163.9859 null] +/D [1157 0 R /XYZ 85.0394 134.8432 null] >> endobj -976 0 obj << -/D [1117 0 R /XYZ 85.0394 133.872 null] +1016 0 obj << +/D [1157 0 R /XYZ 85.0394 104.2859 null] >> endobj -1116 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F39 863 0 R >> +1156 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1127 0 obj << -/Length 4048 -/Filter /FlateDecode ->> -stream -xÚ;ÛrÛ8–ïþ -¿¼eqp%€ä)“NzÝ5“îMÜU»ÕݵEK´ÄŠDjD*Žgjþ}ÎÁx‘ Û³IùA$ -¾«Ð+>«à¤¼Çq¹(<°%² - 5õ摞ħ¤u&“ÒDxûz¹H¡.3¥mzM -Ü„úŸšM!lÉyä(<xÇݶ! -€!—8’c8föß¡õ°Ý Nø²Ûm*ÏaD¤™ dAúhmÝÑIJ -iC×ì€ö¹CxòWôÒÏU×–›{"E†€è(4zZûY"¹›íöÕ¶ð8ÂKqèÖ;ú{
mKTäªÅ'·dÿa¸‹ß‡p5¼ô:/^?ÂÒD¨‰¨»>öKøJ¡Á¡ f*ìee§Mp„8ƒL˜`q½ÓÖ/{ql‚Éëëj±&Š¡aˆQЇåŸbÁ`‚À\ª<Ó¹OG -‘ 8물ÔNdBéo/‘D€ó1ÄSp<˜Àõ«ÎF>ÿ†ÊÛegï -r¹Ç„G£ÆÜy™ÀŽÃ -Îw;oñ™£Ùv,w/81‡(C«è½;rç¼°™âO( Œ¢è¾ã#Äg, @·<âäÀç”À@ৣõšGŽæÄ›M$AC¿å×rqðN^†|ß(ßô‚sYàde‚(}*Ëså`mY&|þA3ûÕ%=|L•Á‡Õçk¸a
ò·å–<Ÿ³…÷xFÎ~(`¸¦Ñ·ÌaÒ;‘…·®œ¤Zg` äë“’s¿æIdÇÜ{„mUŸìÁºæ‚¿ŒJýê§w>‚é½8¥ëD™ÉŸӔ€gJª'ÏÞ¯yƒcH#nb‚Œ¨jŒJŠ±â®9t4ò†ÑÜê?˜å‹K4î'r55ÌUªºÍ}Ë=S‚e™2ò¨€Ä1£s‰’!×X2LXªÞd¼Â4›TÁŒ¤1°o»¢óÉöj¿»ÃÄuºvgtq®AòSFB.ûT˜ -×¼-Ãngúß‚~–å}qØ„¹©ÊóQ‰_ƹ×!lÒ1lÒC5š‚%púFkõDÞ/UšáUúÐÔW]XÚ äPwåb¾Ž¦^½â`Œç³›š–t¾6s‹¢-¯)Pîa›¶¡ukßy±ê\”¤]ÆsýÎ*†e—ü”³þ1Éq¨Ÿìˆ#~c’¤fw‡ð°lJŸ¸¡Ø…¡uñ¥¤§"%ó‚S1ç鲟„¨ (›HIäd̾@Ð ±“SACô: À.`í=@Ñ(–adŽ1°ø2$Ê»cÿÕ=Éâvø’l¤É -«¥“0<d›‰fD¶Ûò‘=È‚Ã?v6™¤‡ø!ÙØÀÊ -pâ—Æß΀C]QgR:""NÀvÞúÂÒÈÑ“î.ÁÔ3AdÂDhöŸÃQ£å… -×¼ -HÈYgGÆǜ˩L¡…žhUÂlD1á«°àìó÷·TáÇBÚ5Ýê(܆MÂõ13«KªÄÙ~ÿIhø$óˆ?Í—'ÔÐ÷z©EÀuØ9¨¼ÃŽÁ_€×€Ñ²¸‹ßzŸ‘ƒHb…„œÈÞŠïOáJÒ¨þ®ã•5º¡´cëp
k0M,Úglõ{ùE*ÊôY -,[Vm@y¼Í]â¢×=ñ.ýbºšŠ[V’tþ‚ê/\ŠãÀ«”|a!(wI˜\…ºÿ«dê\‘‘÷¯Sâš)ÇòqäAô\ľ‡™qRâSÆÃ]Y¼l¬¯æœ1ŒS›Ã2îÓ¨~…7÷;•ÕÛ -ÜôvöÕ-?ºdz–Z¾ƒŠgèX3»/è`¬Ü€4q¹jH¾úX{ã÷4wšvÙHì–VÐõo§‘{ƒ²Ÿ¡+–ÔÊ°NN)𰯺pc7±¯z¡¨…F}ÝCê«É¥ù¦1³÷âhùµÀûUèh‹¸ž&˜Þ˜âL¯,8¾ÛW_¼ÃÁŒ~èÂ"‹¡ >Å^v"@=òšõq#ÒÍobñnî+^F¥-Ï©¢› è!^üÿX;DÔ9Aú?,.àó?üÑÀ;ü…iiz³j€gë-Äû›õêuê¾=Ûà/›Á%Âýóõ¹>¶]¥Lu]XO£oþ—Š¡Ñ¦BÅ™’±™² +1167 0 obj << +/Length 4329 +/Filter /FlateDecode +>> +stream +xÚ[ÝsÛ8’÷_á·“¯,.@|'OÙL2çÛÌ\⩺«™©+Z¢-V$R+RñøöŸßn4À ²<ç”Øhôǯ»a~Éà_*i—»Kãd¦W—‹Í»|€±/x˜3“æãY½½øËGa.]æt®/oïGkÙŒYË/o—¿Ît–gW°›½ÿéÓÇ›ùüîÊÈÙíÍOŸ®æ¹b³7ÿùZ?~~÷÷¿¿û|5çVñÙûÿx÷óí‡Ï4¤Ã½ùôõ8zœXôó‡>øôþÃÕï·»øpÛïe¼_Înä¿þÎ.—°í¿]°L8«.á…eܹürs!•È”"ö¬/¾\üW¿àhÔÿ4É?β\è<ÁÀ\¤¨\¦!ßÕ¸˜ÉG3¹Êl®-,Sªºì¤ñrš–çaÒ¢©»Ý·³f
<ÊÝl±*êºô/vVµÔYÐëíûŸé½m_aqß^WmWÖUý@sŠÐÝJêh·å¢ú±¼\&HÎ¥†«Hòöðd„tcV»ÁÙä°CkÓ'3ïWœ—$¶)ŠgÎ>åû¶Ù¥˜šóŒ9vÑÔŠ~k¹8É©@(±ßýŠgX •É¸ÖfÊ‚b¹Ü`àa×°q!f«j±Â¹ðMWLÂ79ðU©œÄ¯@^Y;»CVY´ð~óó7I=Í®ïÑÔò€È–m@æê„6hØ}näIÆæ¹}Éa{ÒdÚÀQ¿–±ýŠóñ’ÇŒéÈ,…ï§=ÇX‘9&#g›{š"'[åp<, ÏŒÊOü÷ÄR6³Š™ËѬߘb(ð®j¿B›‡½Þï«F¶Äì„—ØßÒ“Äfų²³Çj½\~þ2œçpVoIrn@„>„¬Î¢«šVFáRklI/ØS,åÖSo¨d8ZÔO¡ãžžž,l´O°¯Í¿µ4ˆôë$•(@Ú‚¸rù¬¡q2hô+úÊhQ’Â@à°WÜ‹;&}´Að|¶oqÆPÈ“f@ZeNJ+6ãà>
ȃÑ`å_+¬qÁùxÅcYå’ƒpvøðs²*3Ƶ:#«t6Lyó&墂`ÐÔqRvOÌ{jö ZÎE ®¦^?QY|ÌZg2!L\oW/i5“ʪ‘
ÇIÈákëfQ„Ïš¶ëÔ;¾ƒ™Íö®X|
g=ˆA…§¢!êa‚Y"ÜDšÀ˜eþx‚z +Ü$œüÒ¬€°’óx¢ÐðŽ»m +€Ž!–8cØböÏðzøÜ Nø²Ý®+ÂHH3!È‚ôÑܺ£e†®Ù=…Ús›ðìÏè¥
ÚU×–ë{bE&@£çµŸM#Š´›mwÕ¦ð4ÂK±ïVÍ®ú¿umJTäªÅG[²ÿ:&ú àjxéu^¼~„© ¨‰¤»û%|%@hðC`0•eHñ«
p\o>,˜0¿0½³&½•`˜0òžWhÁ¸6ôðkùVLL>?˜Öò W”`¸ ¸ Â`ÎO¾>9œW<f—ƒ¡[?ë$Žð‘o4QÞZH;ûP³=J=ƒ9cî´4`êÆaîæ»í·_ñ̆Ñ`;¦ÝvÌ_(©ûjfGNùÜf’?#þ@2 +¢ûŽŽ+žÙpÐÜð…“
ŸROõ˜–¶
‰7˜È‚†žååbïݼ‘.¾Q¤ù
s€)ðd_‚(})ËSU-
aϮ
ÒØîá’ŸSõ¼ñüÓå¨~nõ×Ïå†<ŸÉgŸ +ïñŒ˜ýP@wM½ï'ôà w"o]? +
”ÊÀD‰ íG´~Ö’áH2Žñ÷„æª>ú*@vÅsþRŽõóÏ}ÿh]ïÑ)t'îˆLd +Cáx¡e¯C%s…… +)Áìe>KFz¼Qñ|1†Iy RËê¡ê¨8 †`·ßYfB1ÓcÍÌ ÔØ;TLàe¿xˆ?ìçt«}èòÔa—§dòüôdÅdZÊóµæ;îM[ð7-¾)¾Y¸`¯
øZ0ÚSvl›¶î|ŽK°-ß±Ãß0ˆ¾ÁO’—„áp(Ðoé1Àœƒ„’g0¡ +ëÄ_ù:ö5rôj•Âq +}ˆû2&Pä@9¶-9xp.üÏÈOöõìâ¾óaÕˆL§|?®rž±¨\Õ +W÷¨‰åý…îoèP%Þ½¡'Õ*{‚üL„|á¾ +pn³¹öZ‚³ö¨ôaí{z‡ð—–:€Ûsâ•™Á¬Ð‘ck‹Ú‚·_àðæÃþ©å…Ž€£D4yÂE%(U#«êaf—ôã’F¼Én¬±¡ªL7€x=ûï0÷af,Ò4ómå¥SPÆî!|6*;Î=aÜéñµ¨Î64ZõÃÐýdH⥈p›Ê+f5iÝjÁ«f¿^R'š<j¥|:/X¿Óz©BHߢÇV•¯ÐWñÍcM~ƒÕý„2¼ðÔ®ˆÆ® :Ã4˜ƒÜLíLÏE¿ñ¦í› î˜ø +L¼¯Fîe¼|´ý]º¤‡u…âÇ]Õ…;¼:`_jöØC¨…z}Þ;Cè«È¥ùbž1³±·ü£ÀWèhr¸š$˜Þ˜âH¯,Ø¿ÝUß¼ÃÁD?t…‘Eh‚XÝN\;?ðŠõ8†ëÆæ7‚X¼»ÃŒ—‘iËs¬è&(zÀ‹ÿkãDi¥ÿÅä¶ÿé·†ÿù€ÿŽ5½W¿~hàÌVš‰7:뇷)¬Ž`ÞÁ´T‰+®B¤Š+¬gëÿ)l¨°Iƒ¹ÎüDµÈØLZX$…[úˆòøßcǤÿd@Ééendstream endobj -1126 0 obj << +1166 0 obj << /Type /Page -/Contents 1127 0 R -/Resources 1125 0 R +/Contents 1167 0 R +/Resources 1165 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1093 0 R -/Annots [ 1129 0 R 1130 0 R ] +/Parent 1133 0 R +/Annots [ 1169 0 R 1170 0 R ] >> endobj -1129 0 obj << +1169 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [55.6967 576.4843 256.3816 588.5439] +/Rect [55.6967 552.574 256.3816 564.6336] /Subtype /Link /A << /S /GoTo /D (rndc) >> >> endobj -1130 0 obj << +1170 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [268.5158 576.4843 332.4306 588.5439] +/Rect [268.5158 552.574 332.4306 564.6336] /Subtype /Link /A << /S /GoTo /D (admin_tools) >> >> endobj -1128 0 obj << -/D [1126 0 R /XYZ 56.6929 794.5015 null] +1168 0 obj << +/D [1166 0 R /XYZ 56.6929 794.5015 null] >> endobj 294 0 obj << -/D [1126 0 R /XYZ 56.6929 311.2132 null] +/D [1166 0 R /XYZ 56.6929 287.3028 null] >> endobj -1131 0 obj << -/D [1126 0 R /XYZ 56.6929 286.8682 null] +1171 0 obj << +/D [1166 0 R /XYZ 56.6929 262.9578 null] >> endobj 298 0 obj << -/D [1126 0 R /XYZ 56.6929 252.8569 null] +/D [1166 0 R /XYZ 56.6929 228.9466 null] >> endobj -1132 0 obj << -/D [1126 0 R /XYZ 56.6929 223.8335 null] +1172 0 obj << +/D [1166 0 R /XYZ 56.6929 199.9231 null] >> endobj 302 0 obj << -/D [1126 0 R /XYZ 56.6929 155.208 null] +/D [1166 0 R /XYZ 56.6929 131.2977 null] >> endobj -1133 0 obj << -/D [1126 0 R /XYZ 56.6929 127.8981 null] +1173 0 obj << +/D [1166 0 R /XYZ 56.6929 103.9878 null] >> endobj -1125 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F39 863 0 R /F48 885 0 R /F14 685 0 R >> +1165 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R /F41 910 0 R /F48 925 0 R /F14 717 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1137 0 obj << -/Length 2663 +1177 0 obj << +/Length 2511 /Filter /FlateDecode >> stream -xÚ¥]sÜ6îÝ¿b噈å‡(Š—§4urî]“«ãÎ=¤™Œ¼K{5ÕJÛ•6;¾öþ{A‚ÔJ+ú£ãñ -É`=÷Xðîòß½¿zóÓOo®Î¿\ÿxvq=è2Ö—QaùýìóºXÚ?žQ"t!P´æ‹ÍY&‘™SŸ}:ûy`8šuKcö“¢ ²à*b@ÎŒ-%ŸXPj’.œÒ€RšüfîQ½O}Ù›izþ`~¥”7U_µ
bÊf…À/]yg¬`31:-ºHyFtÆ2·Ëõ:±§$ϸbKcwŸ3©¬Mw쑬P0Óá°ÄŸn]îÎY‘˜•›%Žý*§¦nÛûÎ p¨ú5Bן.ß#ô+•´3æô¬3ªHÎAH%2’kªÕqrw·@àjtL}:^€Ç4VxÎ×*þÉ,ÑúV"8å™4Rða=‘fæ*ÕS2̸YÀvë×ÞnËv³±>R-R¡()—‹tp>X½\—Mcjt›lÊ2§«…âœ(!Õ6èÓñ‚¹>s¾›bòà$›É£Á<tÌ~fÕê))fÜ‚U Ž1JT.¬áÑ‚«Gb‡D1Z<;@“g,;œfɲlh—ËýÁÒϹsåT&}»ELm¾¹³³ô·"àÔ66ïö»ÒÛS{‚Ö³¯š®Zy\ÑIPI$WA©o•9Ä2äVEå©Vº¹–É¿Ì}‡;¬Lêý1Wü-›ú#f›Æ„•AßUK§œÉ×Y¼Cîhr -NÕ¬æ,%Qr¨'x¡°+xìÁëV<Ū8aÅya–[Z‘ý]¹¸Ìd&ÿ.3QD%ƒ[3ÊR''ì€*“'ü$ãò™Ð?Ü8É>
%Ü BÓH{ŒÍæœ&×çšBÞ€ax¼¥3HÝÚ:—"ñ/Kœðn„t"¹¹Gt¹ÝB‘†ÙÐþr ¤¦j³ß Q³ßܸ®¢–Ç]
ÏWǶrùæ·ˆO§yÅ?¯–… €“C»¨²ÃˆÿÊÞV,1äŽDŒ¡>f‚ŸzhZЈµƒ·K¨
ÁnÜÍdî±|¸¡ ñ™þ4e –“ -fxã®sö┦cŽó”%ÀÁ¤fÅqc¼E]ŠVÄJr”¶¬eñd5›tÜDëOÂÏû:t6~)_ÎW9È#\ΟîÐoq[ÛB÷NJ±²¿¾à,;“æÜ‹«@ˆ:’¡î5ˆÀ¥à½¯T¦†Öö¡º½»ó=k½ß•ðúßEë¤40ÉãNßPÒN"ó3RƒÑà+Vl#^üÙk‰n«Ú“oK{¹[ȱ°k¹ Ú¶é&kýæPat:†¸µðŸø³oêjS¹“ð´¡/±Àóïªÿ™7ÝxeUÎïÚÝw`Ï1üõ¶\V5\‡±üVõ+³ÛÅäú3èW×G=^å`QCuÆc°é`¨%!¯Ö#Á®íÔl‡r×Þvoa¥ (»·O7'Åóm;Y¶27{ÏÈKåûhË é=µ«8¶øt»É‰m!núÔÞ±^Ý{ã$èÖ´¯£gÏ眦†{ §¾ -1ñ—SBÿÿŒ¦z‡ÑóÂq»¯'‡õà<!ä…Ò[¸tšhxXOƒYN÷OT›}F|I›\<Þ&§B…Ë'H½¤¸Ð,Ò*jԤ÷—ÅbÇ\؇mËYè[¹«ŒõI;°u‰¥”vÈmyÑ°ƒ.üÜÒâZ”BªÌV RÙ·rkúIM 6 ¥cHúsõ ŒSDªâ$_o׻߸öìÚezwØ3h÷ývßãÜÆôëvÕ½Â7'¾)ýÌ ‘k3¸#ã¼fG.Ÿx’ƒ}ೋ,AC#AÐá
ÍB»ÏÕ Â'4;vNÜÕ¿@}K(b,M¨•ó’‘G <‹`ÒÁBÒW&¶ -0µYz¿]·ìá·{_H,k°¦ñ¬P;ëÉ¡Ö8ÃfZVš¨lÚ°úظæJ–%mS-ƒb#d~ÄËÔGYé{ -СBxñGýã<d |Qðø×AsRp‚PVq¡N%¾þÏEÿ(^Øendstream +xÚµY_sÛ8ϧð£2S±ü+J—§n7éeo·½K³OÝNG±™X³²äµädr{÷Ý$HY²˜º;›<˜A +(õÙdz
G³niÌJäDå\G(Y̪ ™àÂ9ð¿Ö†×Wœ-#…RܲÒE*s° Ï“uLN¢”&¿›gtÁǾìÍÆ4=~þh~£”7U_µ
RÊf…ƒ_»òÁømÄH!Ø…+°«@Un×fÐåÀÄ)É$/€ÙòØÝç‚€Gië$ÇÓŸ%+TÌtøYâO·.wç,OÌÊ›%~ûUÎL;¸ow8ØwOU¿ÆÑíÇëw8ú*Ús’j’qP2Ë3¸”ödpr÷°ÀÁÍè(þt¼ÀåÄà¹\køG³Dï[ fÚ(E ΋‰6³p¸Né0“fu +)¬_^ÎÔŽ˜w¹†‚Ì´ôÊÁ©õ»¶î"VÀ¥“+Åfqã¼)!H¡>ÙÍBGšJ’1‰'8¡LªS øÓñ‚H*Íä~cB+0MÚÂ6?OèÀuJ‹™´C™´*lö¿AÝÃo¸°üíYúiL%;pù„¾,haËÆKUAÇ„û4F'à`D·DëoA1œyžÇ1L:ÈK£¦j…’aW«\µŠåOPÔÿ•
f9ѵ0â:ù½iŸ–þ¢ëìœ/<KšrcÜJžTž©Ä™U»)+¿ÞráhßTìMýŒ_P š¾º®š\4Ù€1–¸¤äÉudLjÜy6©ÝÁ)ˆ@Æø´î|-Eáø„¢uf÷hv±ü¤m<RÖ]ÃÚ°,‡¢€àlì°)|ÌÞ¯KOñ»"µ×+XW=%¡®|y +.rîG˜0)n«êÒyþMÙ/×¾¬€é™½CǾª+T9רJž' œŽ§¡Ò0ª@ xdÀsd0̯ËGƒswÆ4HŒ±7&wÒ0š`àT${Ss=DYÑU?´;° ßÑi‰<ÀP2LŸLh‘µ =ì4KëÒGYüŸ}V{qéA^$©3Ah¡‡M_NjN`™·Á:PRfmº~ç¼kÇxž’«ÛšeuÎÜ%m:¤…àJÕ?¿.÷š«K:œÐà HR@RÉ{8¥•_·ßnÛ]ïï»Éë)…·e”Mƒo½)—éf¥"IMrNõP¦æ"ÑjÀ +N¼JXD<áÕ+N‰ÊDq.#Â2Ë+ä_Õ‹«ìEaê¯ +yT3¸)³Šú9Ç`¨¥:’§Q^¨þ±Æ Höi€)pk +‘Osp1¶ŽsšÜž*< ãÍ,¡`tkx\‰Ä¿&q‡ò‰äîÉåvÀëý….(JÕf¿A¦f¿¹s¥&ŠV‡â\
OV'¶r•æ·HO§Å?©BA0ÀéQ¸¬²Ÿ+Pÿ•½§Xbȉ8» +Pk•«QÙ²žÅ“-ؤ«à&Z~ÞcûÑÙø¥t|a¸Xå€ð„«·ãÓz,nkq¿¤1ýõ ³ìLšIü0p#®#ÚH^h xãÛªÚA…oÕíÃèYKèÝ®„ÿ.XGŸAHÿtö2
Õö´ÆÖ~BŽ¡K0úø‚Xm$À¯›½@龪=û¶´×º9v-}aÛw±Í[tP:ü:ykÇÿÁŸ}SW›Ê„çe8úKT/¿«þmf#¸éÆ+Ó¨q~×Ç_îËeUÃuÛ6¬êWf·û +C³¯ëƒc=ØT`ˆ±06µ„O¨«õÄI°k;uÛS¹k†h»·°Ò’ÝÛ—›#Ø|ßN–ÌÝÞòZùúrÂúÇ_-Ç&Ž=Û΋ÜBÞô©½ c½¹ÏÆH°i/¢gÏæ’¦ŽûfIú*äÄ))ÇÅCsø¤ÎS»Ãשtœ´ûFÌ“ÃzqžòÚ[ ¸4VhNtÅÕPý†:ølS¡Ãå4ˆ^R\,ÒzÔ˜ÃW—¥b—\Ø'mÅÙÑc¹«ŒIûaq‰åŒvÄmuÑ~`×\ø§·åÅ3´$ÿxÔÒ¢¥í+¹‹5úàÅ +,}\™0Ñyƒé@|*›Þš;O®ï‘xàqš9Ïä”pl뎽ic
endobj -1136 0 obj << +1176 0 obj << /Type /Page -/Contents 1137 0 R -/Resources 1135 0 R +/Contents 1177 0 R +/Resources 1175 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1145 0 R -/Annots [ 1140 0 R 1141 0 R 1142 0 R ] +/Parent 1185 0 R +/Annots [ 1180 0 R 1181 0 R 1182 0 R ] >> endobj -1140 0 obj << +1180 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [406.6264 730.8852 456.8481 742.9449] +/Rect [406.6264 682.3188 456.8481 694.3784] /Subtype /Link /A << /S /GoTo /D (tsig) >> >> endobj -1141 0 obj << +1181 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.5805 719.5976 196.7992 730.9897] +/Rect [140.5805 671.0311 196.7992 682.4232] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj -1142 0 obj << +1182 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [103.6195 677.087 159.8382 689.1466] +/Rect [103.6195 628.2088 159.8382 640.2684] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj -1138 0 obj << -/D [1136 0 R /XYZ 85.0394 794.5015 null] +1178 0 obj << +/D [1176 0 R /XYZ 85.0394 794.5015 null] >> endobj 306 0 obj << -/D [1136 0 R /XYZ 85.0394 769.5949 null] +/D [1176 0 R /XYZ 85.0394 731.7607 null] >> endobj -1139 0 obj << -/D [1136 0 R /XYZ 85.0394 749.4437 null] +1179 0 obj << +/D [1176 0 R /XYZ 85.0394 701.1889 null] >> endobj 310 0 obj << -/D [1136 0 R /XYZ 85.0394 543.6821 null] +/D [1176 0 R /XYZ 85.0394 493.1135 null] >> endobj -1143 0 obj << -/D [1136 0 R /XYZ 85.0394 516.3776 null] +1183 0 obj << +/D [1176 0 R /XYZ 85.0394 465.3511 null] >> endobj 314 0 obj << -/D [1136 0 R /XYZ 85.0394 259.6272 null] +/D [1176 0 R /XYZ 85.0394 207.2221 null] >> endobj -1144 0 obj << -/D [1136 0 R /XYZ 85.0394 229.5133 null] +1184 0 obj << +/D [1176 0 R /XYZ 85.0394 176.6503 null] >> endobj -1135 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F53 962 0 R /F39 863 0 R >> +1175 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F21 690 0 R /F23 714 0 R /F53 1002 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1148 0 obj << -/Length 4006 -/Filter /FlateDecode ->> -stream -xÚÛ’ã:ñ}¾bŠ2U£«/ìÓr˜=ì³À2<PŠò$žÄlb‡ØÞì@ñït«[²Qvfa+–[r«Õê»y-à'¯mš¤…*®³Â$VH{½Ú_‰ë
ô}%yÌÒZNGýêîêouv]$EªÒ뻇 ®<y.¯ïÖ]¤‰Jn -Ö.ÊÝ!z±k7›Ð½¯º®ÜTüéñFæ‹jSºç:꛾üLíêè:Û#R7ôì·¡_µÍOB¨Íp,ûºå^„ì*joZþ¢}iëê¡v=î°c)eRX«ÜÚVÛ²iª]÷Šv=ÒQà–ܬ™j‚2éµ~àp.lü¤”Á‰@2‹ ceª€³9l’›v¹¡13æ{ºhˆCDDh½Ø>•Sv¨V5®¾Z'ŒKNp-ef’Ôj{½Ô&)t®ƒ.€(Hp!ÄâÎSÍl —?leWEÞ)›dFäÙ› -ßQ²$¹—uÝjÇÒH»x×B”ˆÙÒÉIŽ)ÃMÔ°»‰ÓùbWï란D'À˜Ïí*Ø{\
‡·î¶€§zÇ°{þ¨\ªC_©ÿþñl‚q' -&§Yÿ¢ezÇÂ7Þ*lz“†›4ÉužÎ902Í>ˆ¦íç6nÔi4#Í#26 71wÛ*Æ't»Âo]3€Ø<e“’I–zO27E:ŒyÍŽàÎM#pb$ -š!FpÅÙ‚ÄåAJ¡^ȹùŠ€MÚº§h!'J‘lñ¼x@˜[ù©ÏQ!0ø”¿Ü öÍIŽJÄòG
f§ -¯>¶ x >ª.|ôÃþÞe2ÐvŽž~B\hÒ;GcÌ\ºÈý”]ý¯˜C¿ŸÚ =!µœµ”º®]Õw"}§}ë$2J9á-Ælˆìa!+ÎÂÒ}!΢²–£HôÙ.í€ÖšsdË&a¥£—ƒîûŠ±¤ÞR8põyUUëîìúY×+^BÎ$(ÐÙâ}K#¼ÀöÔ£»ÑYàõ2jÝs&Í1òëþrÍäsÝõLï¤Z0®g¨»ì>V`eë^ûbüœ'xYòÔžK -÷Ür/i4†¦¯ùË®Ýso;ôËöayO\À¾Â«îöôJ”í»pdüÇ›P¢)ì.Íèi!a¦1ç%£`Ù}%ñs½öÞ€‘q•“êê¬tp_mËOu¨_*$x9ÍA;/YNmiÔRÞR,Mã®[áˆdi’AŽõ¬)•…ñƒBttn’µÍô‹´Ù\êº_F¡¥ÌRØ“ÏײìT ïù;çŸÁÿí8¤tRàÙËl?jdúŠÑÕÏ4š|Óô ýÀ–û×19ë¦_RÆŠã«îu̯Ҹ±„5»Œ’ûŸ×ñ -½†(H+ùe'ióPúà"mÄe€c)ä…:“šÔ™Ô¼ô -œôÂܽ«¹C#ÙôG‹w)†=רÇhÎNò÷Ši.0ƒ¹t•X -ŒufÖ˜Á³âK$ÙDJãåvV‡•¤¹ÉŸÃâÆÕ1ºY 9…²/%÷ -Lާخ{˜—bzè—ø,äK‘ìÚU¹‹eÑ -D0ê«ðÈÿâQ߈ýð˜o´.ûèIcxðh6”¬.Æ#&
å[‡*{IK•j¬o»ŒR'µ>sæ–¹Â!ýy‹œYz×ò
xé†Ã¡=rA.ȹ†±@ŒG`”ápç0]5DëÅo¨Æ~²îÊcèö%ÿž‡rñæ -›Î®`\`qŠ·ƒ‚ßÇ‚ƒg¢x|ÕÑ×…#ÈH©8Eä9ßòéMg¥žè×QoN)¹Þƒ98l¦-^X÷QR{;Žy#Í+Ã’@•]œÚãGÏ]ý1"!+~a ðóŽÐãmðxíÑ|{5V쨌fÃþº -Ë#Áø‹ñ7\ížTÂ>º…d½P›in¬áÐávj’"ËõyÁçXÖ›-ή -’x¢ ëI@`Œè¶ Û:Ú 5tŒÿIèš'2Ͼ2¸r•½øq´=0…×DUL6>qF(?wUÙqÓe¸ÚgÉ -MÄ -Ëé×xÃ2žI•E‹¶˜DNÅYñ/
ÔÓ;[TØbìíª£;ý‚ø9y~ݺ˜_·.&÷?1HÐ9,’ÂÉbžMïN
9I†uf ÈGçŠnú(0í|ÚšûÚd®yØv¸s<YÀó2õwÇ[9•#ááotðàà®EÁgz_Á^¿¢´.PP…âüŒ -g›7ã<ô˜Ü€_FO$`’Kÿ7Ð6Á? Dþ ÂÍóÿû¿ã5L–€áQñ¿(Œ¥Á&z¢x?¡Üÿiá)éÿ—±hendstream +1188 0 obj << +/Length 3866 +/Filter /FlateDecode +>> +stream +xÚ]sã¶ñݿ“—Ê3'†øâGïé’ú§Í%½ºÓé$™%Q{©ŠÔéÜNÿ{w±”!Ûioô +Û®ü¢î¡é‹OÔ/v²=ð_ª†Zb2€ÌT˜õL…þ¦å´“êÙª\Ǻñy¹-š¦¬»W¤²íZ-¹Y1Ö4âѤÏjÍÀ½°ó³”š¸5Ñ*‘HP«Ìñkâ¨Ã‹–X@„Ԟ΋}ËY‹Ù¾\Vxzdïc1š‹TG‰QÀJ(¤ƒ!; À¼Åq<»wX3èãÇí¡èÊ°ÂË$»HFáMÍ +‡ê’ë霵6}µ<Öž»‡ŽDúëbYÕUÿp#„˜ý”ÿ0U7Øn¬nvIL±cn¢pæ?VU·d(Öøi°„w=D‰˜ƒtL2Q;ê‘SÙ¬®vhåqð„1¦3v%ðOFËá«vË-»`ðTÕ<¶à?Ëe¹ïÑIàüâálƒ0úslb?ãl™©º€êk™E¹09«Dլ۱ɢLäÞØÄF¼"ùÖ:ReÄT4€/è.ÒAÞðÃZZh½$ãGÀIeÚ9µ¦ØÁɪGy®o#˦[_òÎ}µã@LvÖûx#ƒKX¹iQ ñ·`tšÕ—-ã;° +¿˜UØu$&
×`äT–L)0Í>ˆ¦í§6nÐi4#Í6ò72÷Aï/0æŠëš#ˆÍc2I¥‰ó$Sƒ‘'ƒÁÈ‘&Ðíhܺi‰Ý?
8n',„ùØáhKƒV€á{¢c`v•ŒË&EïèÐV¨TØŠ
‰˜€Ìý„¾¤L×µwÄA5h;ò²h ¢¨áX¿Ò2Ž´H2/ÿ6Œª‰& [¥Æ[¥HÂjÙw4I¢‰«î¸ÌêLjm&6@Ç4A8€¹JÀL¡¹²-šTFM*˜^8° +{œÂAùPêÓtöÖj.?…·aÚÙ8J‚ÎrÛ¶¤v’õIÎ>”åÞíC{ó‚¶^Qgt4^{¬°£&6`»Ç纳@òó1 iNSŽ"cuJŒ™Íþaƒ?ì-ÊuëSVø®xÜ&[Ð’À†2 àt’ÆÚ‰•Ç¢úÇø@ç©“AÜóÆúVèÛÀN‰ŽLØG†öŸ¤„?öc`(Ô˜óð_ ýTŒp£8$çº>F°Šó³Å—)…|!å¦'2)k胕2-#
+9Ö³¦TäÚ-òÑѹIV&U/Òr0dS©ë~„æ"M€
:›žÓgÙIŒ¾çWÎ!~ŒÿÛRHª(Ç‹· ?× }ÁÅèêL~)jˆØ“ñîu¨¬¸?TM?§Œ×=”Ýëàu“]7”°&kçAt_r%wÑIšÌ—>¸HpàXrq¡Î$Gu&9-}à +eWTuØ*hîE NþV˜êЉld"³—"SÁ÷_BæÅGºÈ\™E DéKáÔû }Uôäæ„5ÆXg¢ê„&˜…4ŸBÉDBh'·Çãr‚"£$ÓÙsP\Ø°<™’“KóRTW`ò>†¸žcì¡_ +iÝï/Ñ9/R·Ë¢eÑD0‰åo‚#þw8fG~&|Ôg‚£?Ó¹ÌgÂ' ÁÁ«Y_²ºèÄ—o-¨ô(Íe¢°¾]úÇ:ÆZŸ>sË\áî¾EL,½ðù|tÇý¾=pAÌȹú?c¯À(ÃåÖaÚjˆR³o©Æ~³îÊäCèö”Ïü ¹ø{€Ç^ÕŒÞø®Hø»"¾ÀvËåvˆ”Sp³ÉÙ=ƒ¿õ…HSq°«ÇÎ×7Ô†/^ŠÔ¨Éq¢eÛ¬CåW0‰RL\0BfŒwT6øjxZ|,i¨ ”@ÿ´ìµÌòMò:¾ñ‡)[aæ¡ŽŸj(Œ¯Cï2’,Êò³²ÚS<’©·†|¯fŸR¸"‰CâøS;¾£°éì Æ'ø4Ìû},(:x'Š×—¡P}¿‚\CJÅ)"ïѸžKo|°8)õÔ€ ;Gµi8¥äzæàÀL“¿°î#…rvÆ_ó_Má_•x¬ÌìÔ>°xÖÕ‡`˜A$á³â +¿ë<¾æ׬!À¯WCÅŽÊhÆó×VXhŒ_°h÷"ÁÖþ¨¥‚ÎÑ+$ã„ZëtC
‡.·åi¦Î>‡¢Úlqw™“´@‹‚®Fu:cD¯MpÙÖâ½c7¼Q›†®$#éo®låF;l̽&Ê|\°q‰3Žr[—EÇ]›á*—%ÃÀ詆]IO5 »©>–|–¡6fÓÌ$?3i>S_¸¬œžÙ¬ž¹¹~ín«ý©F9øˆ_<$ÖI^Í6z´·{FrñbS¾ØÄŽ'~!UºÀ6t€!~kH<×t³ÛÐa[‘%ƒ¦>mÍM¤Rï¡õ!øD
{.«Ú¾EèËîjøŒ'«PØ*6ý‘Þ÷à÷¾èÐp’¡ö*Íyy‡êxÇÍÖÞÉw;©'·“Æ?ñ¢kNEûz|é¯G~¿¨pKGïQp8ôšGÅÏÇ™|.[Ò1&ŸO‡>™<2úÅñBkbÿäaqì ;~‘›Úwžsvú¹†`*>£Ü&,Uh¤YžOŠC~ßšÁ¤öu£*\BŽŒTúe¤Çù™«H*z#ƒ]9~³+º †Ñ3o2µoR0>ýÔ +RóLy‘¿•bÑ&v&¦Z–áR²©Ñ¥"º`ôW$°û=ۃГse"|'x û÷§ÿ÷sôá¾N#•eÒ¿4ŸÒ=*PÆ!…gRÙ#ÌÝ»õǨÿ‰§z-endstream endobj -1147 0 obj << +1187 0 obj << /Type /Page -/Contents 1148 0 R -/Resources 1146 0 R +/Contents 1188 0 R +/Resources 1186 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1145 0 R +/Parent 1185 0 R >> endobj -1149 0 obj << -/D [1147 0 R /XYZ 56.6929 794.5015 null] +1189 0 obj << +/D [1187 0 R /XYZ 56.6929 794.5015 null] >> endobj 318 0 obj << -/D [1147 0 R /XYZ 56.6929 728.4063 null] +/D [1187 0 R /XYZ 56.6929 671.5351 null] >> endobj -1150 0 obj << -/D [1147 0 R /XYZ 56.6929 705.2957 null] +1190 0 obj << +/D [1187 0 R /XYZ 56.6929 647.314 null] >> endobj -1146 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F39 863 0 R /F21 658 0 R /F47 879 0 R >> +1186 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F23 714 0 R /F21 690 0 R /F39 873 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1153 0 obj << -/Length 2604 -/Filter /FlateDecode ->> -stream -xÚÅ]sÛ6òÝ¿B“—Ð3B -òûÅ/¿…‹Äþþ"d2Sñb!ãY&Û‹(–,Ž¤túâç‹Œ'³f©O±T,V"õ(PHŸãŒ%¦P÷
e<èu÷Uw8ƒ"o,p÷øX¨ÿtÓW_-~©vëuÕ¬é³jVm·Í‡ªm}¿Ñ–H5ØÿžfªÆC!¶m©Aý‘ÁÍŠ0†SæÀ¯{T:H¾äœeq,Œëº}Èk@V ÑÅaÔú«¶P³;ü¯»K®FXÀ6FZ˜ú·6síÜ4ÆÝB™r -xÈ)Mì«ú’5}<hšÎ‹´„¢ðÌêf½&GSäÐ#Y¯A}Y®€¡Ç°Õ`ýwƒá¿P]@ÌÎ'fç\0!e„‘^“ouiѦÞ!ÁcãŒ[,§p$»‡iÛq™MV¦!S2v+—>â<f\„±Eù5eny^µuÝ\9ý=¶}5ïªôÔ
|€‘¤ŒƒÖ2éVv—*Ø5
êä\K!“‘’NÅDº¦,ðXgÁÐå…öðE,—°ü3Ü:±¦…U£iaìL«Ñ´ -S@õº¨VúÈ'0ðxQÐ÷è 0¬uÕp¸äœ£?#l…ýG¾}¬õ;ÏÃ90JRÃhAÜ\.“бP_Ì>_¬âÌŒ¬B²ŒŸZwrÒ«UÛ¾z?CÜFˬÁ³RàPúÒKùÏ÷—Ê2daÈ•Á -,B Ö&ÖÅ³Ô GåÓøºù·’áPÚ™Ž°kp2‚äÍCµÕv´±ƒ1ÂÁŠÊâ£CžmÏÍ¡Ãp“&yÍ:7ÿåq'àÊ»i3%Ç!U4#SFð«|àèW8câîùÉ!ê.uÁ¨<@D¯ -_Ð’Œs9tg>$½ë513r8Ï°fîÈ´töF°S<@!x‘éq+Œï§HwÛªÑäÐûñ˜L¢ -¡ mƒ1’.ûã´ O0WBÑ@# -:8gAäÅD˜þëv½Ö%ó™0Féâø¯s¿ÍÓM&áÅ €„‚Z1•ÄÑÜ(¹‡JÌÄ1Óz`Üè9¤Î$³h6è¼±im7Pº2UVœ‚ƒíòÚTŽ1¦qÎ -ÎõUSx•R’EýFFòºo‰®QcO[’Í -TâéÌ:ÐY·ÝÁÃO’°4‘.“Ú*nE HŠ“RÃÄßwºt‰ÊSÜyDâ:ƒq7ó…!ÿÇi{€h‘u< -ûßÈr$¸œP¤Œ8oÚ8Kp¹Ã"ñPxÊÁb9Þ}Ž¶Äs= ÓÔ6 +1193 0 obj << +/Length 2561 +/Filter /FlateDecode +>> +stream +xÚÍYÝsÛ6÷_¡ÉK¤™! +fk˜ûxÅÍš¥]´¯úîñêíLf)KcÏW£³”â³Çâ×ù‡O×??Þ<,–" +æ1[,£8˜wwÿ7Iéóá§ûÛ»ÿx¸^$áüñî§{~¸¹½y¸¹ÿp³XrqØ/Ì 6ÜÞýpC×?þxý°øíñû«›GǢ_Hdä÷«_f°ýýUÀdª¢Ù3tÆÓT̶Wa$YJiGê«_®þîÍê>ùER±H‰Ä#@!}ŒRK˜BÞKDóaSR£¯†}6TmCÝç²[p5דñœÚ_Ê®/‹70½çjØ à2>ºŒÃ%)" ¯i²mY˜ecšd4IeV=wÕP5kºy[ö}¶.{굆ζ©¾ëxÈ’(ŒíAY×àA熜 'f]ÛÑ©›j½FAÙš«ÅÑx®‰KBGnèëvíckrÅâ$£æœ¥Q$ˆ¬v_d@»®jjfuM#ÇØ«Ì4É</«/¥Ù»ÒCí–zZsØÈ7YÓ”5Cz€B°i„À*Þü‹<RK™ˆRÇÎP”]çáF¤Œ‡Âʬ({P’1Ø>Ïëlß—Ô.*Cî€\ÄŽºÔRG¡5_;Û—XÕb xmvöCÖ™>® EH2Þ™=Ý•mÁkÁˆ€Éª§)÷m†²)Èò@)Š…ˆ¦:Yé㔘ŠÏŸQ÷zˆÈƒ†%ÛúlXÖ-Ô|ßh3ÓãYo¾ôÁs‘º5Ѽo +Ú¶£~º[ip¤ ü#Ûîê3*Šòi¿^ï¡OÞ6ÿ±ÞwÙÒi\óEȈú¹h +p/?24äYc÷»x˜,ÿ +ã#… Rèá¬/‚Ö i–®:ÐxEg0zƒß¹`BÊøëØ(mßÈÛAº¾ÕŽÏO¦$K;—¾³yĸ,úƒ¡Ê̼jëº}F(³•Ñg×Bøч=ô^öúˆÌ2"ȆI»sä†ç’X +)˜•œúF×¹ .ËK_˜Yaè×øÍÂ.§YD<£ÙH9Í"Úeµ‰ÀœVêúƦóy¦ñŽ-–ËÃû®)
B4DQ¾!¤DQàè‹¢ +Ð/,Øk*JÉ‚$S#lÚK¢å YqM(¢ù5¹D:u5iJ(ûJp5o²/f4£ó™”$«TIÁ¼ ÚÞµæÂ5—B9š<Fóly˜°\”CVÕ6ȶûa·PóòA +^½¸™‰Íý®Ì«ÕÁÄñÑBsN}g 0…©S5œs´gÌ)œýßyîÁ](KB•Ö÷|66ˆ3ÿѼ + yXpâ +Ã.zµjÛWïý0dˆÕëØ”´|yr2íúó½Çdàd° àŠÒ +EFèÚ5Ff#ðiJg~ð5œaSš™ŽV×`d4’5jÕ¶4i8„ÃÜʬGƒ<»žk§C¸IlÆ»6yÈñ& Ê#3ºLI‡R…“ÃaJóv•€
í +g.¤Ò"@Ù%ŒŠ +…cõ Éê¾¥sµ{ºÒT‰ÕYd¡ u—~ËâaÀ ôN&ÚÉáœuÛ<ôÄ1KbWš$n†1pœÂß÷P4é’S{ci€.DuÍÝmº‡‡_7mˆ6Ãá'3M†Gmmí î5¢Œ„ŒóÊ5Ô:XÄøä CÁ"úXG<r€š›«‘ˆøæ«ž#š +VÙ¾ˆ endobj -1152 0 obj << +1192 0 obj << /Type /Page -/Contents 1153 0 R -/Resources 1151 0 R +/Contents 1193 0 R +/Resources 1191 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1145 0 R -/Annots [ 1155 0 R ] +/Parent 1185 0 R +/Annots [ 1195 0 R ] >> endobj -1155 0 obj << +1195 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [173.6261 465.0053 242.2981 474.4149] +/Rect [173.6261 393.0464 242.2981 402.456] /Subtype /Link /A << /S /GoTo /D (the_category_phrase) >> >> endobj -1154 0 obj << -/D [1152 0 R /XYZ 85.0394 794.5015 null] +1194 0 obj << +/D [1192 0 R /XYZ 85.0394 794.5015 null] >> endobj -1151 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F39 863 0 R >> +1191 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1159 0 obj << -/Length 2725 +1199 0 obj << +/Length 2653 /Filter /FlateDecode >> stream -xÚÍZKsÛF¾ëW°r1TebçÁc}Rl9«ÔZö:Ê!›M¹ r(¢Há¦òß·{ºHÚk¹Ê¥ƒ€ž™žž¯ßʉ€?91¡&*™DIà!Íd¶:“;ûáLòœi;iÚŸõýÍÙß^ëh’øI¨ÂÉÍ¢Ç+öEËÉÍüW/ô•„÷òíõë«~~qÞÍÕÛëó©2Â{}õÏKzúáýÅ›7ïϧ26Ò{ù‹w7—ïi(dß_]¿"JBÿ0}ùúòýåõËËóßn~<»¼éÎÒ?¯òûÙ¯¿‰ÉŽýã™ðu›É¼_&‰š¬Î£}hÝRò³ŸÎþÕ1캥£øIá+ª -ï?J§Nú6#}' Ã9½A¼eGSDZ\×YYÐ3ƒ Àì<£ÿ³š¨ žbΈÅnÚ
½’ÁV•[Ÿµ¨}Tbä'ZENŒ·Å–·$ ý6'šƒþÏ-r*ìÕ"ò²šè3˜[òó%,y»Ô¡w³l˜ie°8ôÒ¼¶çÒÛÐ<›,¯§YÁH´Š&í°É·çRJïù˜Þn†Ž¶…Ø–Vå<[l·V½s»H›œ×äåÝ;ƒðnyêºÌŠº£ÎÀ!ïÊMf+ž—ödío¾Lï»:€û°pÚ’²é1ÐAüB -f?2ŒZÇH /é¸+‚Ø챸P´µa³,8ädv$@ü±°›)f§~„Àm1`_!CP
¹cãp ŠD‰ã÷ºE°KíøBn„Ôû4ËÓÛê-¦ŠœáªPx¸Ú‚続m2Wªò¬r1`eøvm÷Æ(ËÁúÃf•r¥K«¶¼{YÔiVøc -.Y‰®È4mh‚Ž9/ÂJœ@›vS€B¶4½ö±;¼ÓâR ½ºéÝ}Tõ iü·,ìž
ÌÒY×ïƒHGÔ¼Ã充ܚ觳l!8¬eû"§ãj¤F‘áb•KËSj¾X¯é‚é>Í÷PœÛ"k‰.ßw9õ÷ÆVuuÖžÀ_Â>®êIqU¡/µ9‘$`‘â+å6›œÄõå~ÚÙ]×ñ5Sº©ºŽ©Ãœ•1çƒÁ#÷D*„¿FòÊWÊœJ>PvGaDa}c«2¿ïîí#üêú§ó©²”lV5ˆôsüÜyU3[â0]Qã4]À׊
àoi,/Ëͺ¢ñ5e‡Ñ¤ƒEn[¶ZÅv7_ýd–gÔŒ÷oÓ]tê4ÿ(Ô¹žù Ú{x>mÀzRÇ’‰ðU$ÔqµËDû± )/aåP§²£šÿwñëMZT°²Ú»Iè§ö^ˆÕn³û£žÕ—ýŽ]2æý¯a£ÇÀFÈpˆ0ß±~ˆñ¢ø8¸$µüÖÁ
C_›äD•!Ђ.÷öŸT2#T×oo®^ÿ2úu9+ó#Øõ„ú–±3ˆàDR•pª$‘œT]°<‰Ý»An‹·ŸS£ôå|*8
T -‘‰?ƒe»â œ -*ñebøv\ôIÙRnÞš"½Í-ÏäÎln¡ª_eEK^òƒëæƲ'jKljûš©A_Tð°Ì0]#î}½Â‘´":ö÷Hp‡Cý|óˆ±ùt÷™}»TP8…í‡\hX#{´=ºš$þn£ßŸäî¨JC kV«Ô}—Óý´à[t¥¥»æpU‚æ®EºÇ”ÄÆ»½¥<ä -*$
µýÞw¼4Åv(anð9}O‰Ü¡>t©5}¡×:€Ú¿y!…?,iú””^Û¢IN_[ù9~˜†Zå95x·[Ø}õÁM˜a6jUç°mc7x—€Rásoz{~Ï¥¾ÌK¿jز>FãÐW¡ (ZØú¡Ü|<éõ×<›`©A9){’|Ãy'~$ãQ€ -y!BxôS±öW[<«'úÿ +xÚÍZÝsÛ6÷_¡éK¤™@€—§4±{î4NÎuzm'CKÅ Eª"iWíô¿],@‘2%9—d&“‹ÅbñÛO #ÿÄH‡,Ld2ŠÅ4z4[ñÑÌ}&ÏÔ3M»\ßÝœ}{D£„%¡G7‹Ž¬˜ñ8£›ù¯ãI6 |üêíÕÅå÷?_¿œDj|sùöj2•š/.<§Ñ÷×/ß¼yy=™ŠX‹ñ«¿|ws~MS¡“ñÝåÕk¢$ôs@èõùÅùõùÕ«óÉï7?œß´géžWð +êïâÇY½´‡æ}_iƒû@DI)!ñ)az÷Ô€‰mä`Â"gà.ºw™Âe–bD1‚vs$ñùì0©´ðÉ%²j¼-f.€qIîêÒ(´4˜%.š©8 }¼¥ßà4÷+À¬J…P„'‹¬Ò[ŽÓ¼61ÞЗK_ ³Éòzj,. Õ*bÚa“S}>d·ÛÆAGÛÚà°^•ól±ÝËݾ jTÞݵYûÖ±®Ë¬¨[êò®Üd¾ò¤niG×îæËô¾Ý¨èqsk-!:]"6IÐûqÎmCÓÝÜ)ön¹I+s R,QBù~ÈO@þÙ}Äã•MBHÞl®=®Jš°gA^$R*ƒ^‹$*ý@ä*"9vÈWiQÓ¨.iª2ŽûÁkdÃðÑ*§ +Ì]Ñؽ#àÐ%.ÛAZyZUÖjÞHKXÙ +Ÿkw}éݬ]Þé ãçšµ»¦9Ï9bÜjŸf‰}ãªÏi\ð΃ú mE°X‡T²çiÞß#ûÆ}ÓVí@kŸK!„ ª` +_W˜âêD•pª$ô¿4¾œœÄõÕ~ÝÙÿŸŠuº©Ú+S‹¹3Æ¢& ÜQýs!üª8S‰:Q}„ +¡©úlLUæ÷íËýa„__ý4™jèKÉ'aUƒH?Çÿ,ÆU3[â4=R#›M/Hp‹
àoh./Ëͺ¢ù5•‡éPC‚]®oA½Uñ¾›/úq2Ë3ºwßÓ]zj-ÿ(×ÙKóA³wðüš–ˆ™yÂìR2!5&¼`YÔ³â¤åÿÛ¦üz“¬¬ü]÷eÈ™Ýd÷Ç#«£ûל»xÈt|*°ˆ‹xØGؽ²~ˆñ©ø8¸;?/¶âsbP„2>Qn“˜I¡©Úº›ý“fÄéêíÍåÅ/½Œ_—³2?\G¥¯Ø)cÉÂ(8QOãÉ»rjÓäIàÞõªâP¦ý˜î¤£å§\qÎ" õTEL*
ýú©n³û[$Ø/ˆãN~í={AW«b÷M”…*þèüßå8®Žêÿ“Æ!Úendstream endobj -1158 0 obj << +1198 0 obj << /Type /Page -/Contents 1159 0 R -/Resources 1157 0 R +/Contents 1199 0 R +/Resources 1197 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1145 0 R +/Parent 1185 0 R >> endobj -1160 0 obj << -/D [1158 0 R /XYZ 56.6929 794.5015 null] +1200 0 obj << +/D [1198 0 R /XYZ 56.6929 794.5015 null] >> endobj 322 0 obj << -/D [1158 0 R /XYZ 56.6929 687.8392 null] +/D [1198 0 R /XYZ 56.6929 616.1082 null] >> endobj -1156 0 obj << -/D [1158 0 R /XYZ 56.6929 663.0573 null] +1196 0 obj << +/D [1198 0 R /XYZ 56.6929 591.3263 null] >> endobj -1161 0 obj << -/D [1158 0 R /XYZ 56.6929 346.0859 null] +1201 0 obj << +/D [1198 0 R /XYZ 56.6929 274.3549 null] >> endobj -1162 0 obj << -/D [1158 0 R /XYZ 56.6929 334.1307 null] +1202 0 obj << +/D [1198 0 R /XYZ 56.6929 262.3997 null] >> endobj -1157 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F39 863 0 R >> +1197 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F23 714 0 R /F21 690 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1165 0 obj << -/Length 2627 +1205 0 obj << +/Length 2877 /Filter /FlateDecode >> stream -xÚ]oã6ò=¿ÂÀ=TA+–)¥OÙÄÙK±›ô’P`»(›±…•%×’“æ÷ßo†CÙ’#Ç»Mí?f†œÎ%Fþb”ÄŒ«4™4b1ñh²8â£Ì½?~MØ. -»«ÞÝýx¡Ì(e©–zt÷С•0ž$bt7ýœýóô—»ñÍq(chvÆšï.¯Îi$¥æìúêâòý¿oNMÜ]^_ÑðÍøb|3¾:‡"‰àKOaÂÅå‡1AïoN?~<½9þ|÷óÑøns–îyWx?Ž>}æ£)ûç#ÎTšÄ£'èp&ÒTŽGQ¬X)ÕŽG·GÿÚìÌ:Ô!ùE\0!c5 -U¢8Nö³%ØzP–Æñ.×P(”ê$ÖŒ¸Ñ‰ˆH±D©xdâ”i%•SÊz9ÍÖv²^åÍ3 - ðTÄcâÈ -ì4ó¬!hž=Ú]h“ïèð¡rš DÒ8¥c{õëùõÇSŒhM˜+¸YWX -•ÒÁªÒä2…—¥€†’›«¶8,O3™Fízw}€CF
„®†XKH -9Pí=7´d
+xÚµ]Sã8ò_‘ª{XS»öéÖlÞslÍÀpUWµ»&‰k;;d¹_Ýj)q‚CvÔn}´ÔÝê/…üóQšDLfñHgq”0žŒ&ó6šBßçîÆ„~PØõéáäïWR²(SBžzk¥KS>z(~
.þqþËÃøî4 Tt&ŠŸ®o. “Qsq{suýù_wç§:®oo}7¾ßo.Ƨ!Oó…[áÀ„«ë/c‚>ßýz~wúûÃÏ'ã‡ÍYúçåLâAþ8ùõw6*àØ?Ÿ°Hfi2ZËx–‰Ñü$Nd”ÄRzLuròÏÍ‚½^;uˆ1ã‰N ´J“%È:0É"“tjÈ¥ŽâD£LX ±‰à=‘ðXF©”ÉHÃ:J +ie²ªçy7™™¹3doðE'±*8ò«iÛ|jZà–Ý,:ŸÃl‹\ç-áVuþX7²!\a:³œ—µGÏ0©ò¶Eê@'ä<Ê’DX‚ÍÓi(Ó,h–Ðf,x² +œå"ÛÝ~e*$ÚÕ|ž/_è£l©Í«¶AˆU3"Û5®™¡-'°8KÝv&Uiênh×:ÒR'~XÞ™iô9çxÉdð0+‰ç!×Y”¦ZúÍóÝ9¡”ÒîYÊ8x4mG˜ [î19}þƘ@É#ÊÊpmW˜åoçO€H`ê(ÌS¾ªÜ’¥[°T"ˆ·Ù²(9Ä¢ì
Ϥ;z½ªª!þðȘÌòº6U´ob°Z)1êÝ©÷]S [“`·çúëKúo¾ÊÀš(ÐŒ·¯¾Ê@؉Š‰9¦[7ËoG/þg¹Þ,Ì2ïʦn³¬¿™÷pŸgüCy–Æ‘äpÌ#<Ku”1îÌ墀›q”e—/`Ë ±Œæ¼Å¯ÞF>–_«cZD2ÉŽ¹¥“(‹ïñ+lÍdµ,»—£Œ;_,¬=ožóŠ¸—×…©KD×°e-ÁäþXz‹×½C|¯•Ž¤ñ÷¬é§ävÂâ(K5?Æm%£,c™å~Yšö(—ïfR>½ßÖ[ŠŸ~
ûÑΚUåøÿèlÜ•µÅѱ>S£—èòe·Z€ÕSXŒ¨¢7¶½6@`ãl<žŠÁ”poP‚Ý×\¸qëì¾]ÛºYç¥Aò,ùŽ£3.R:ÃÕOy`5|á9í^ñcUW¦m‡6¾VÄ"ímðfì$¦cîÆ5´¡´öƒ¡Sà°©½Sf |™îù@d :XS²ýafh!»q/ +ô†Ò4øû%¼UšXG©`ê;–¤ú°ÒHØo,“c¹Z,b,þ8ãj*3µò›º:ž«]nƃ(!Ô³“\)KE𥙶ԳÉ)ðƒ*‡Íòg³mbà=bñ$4A‰…¶BÇöæß—·_ÏÑC¢6a´`{mj€«-2á7ºlsjzG¬@â‰B)Uð,öYˆŠZ ¬ð:Pi3ésãü„LYd±o¯PÈ©ßÕ)" !`·zìm‡2¥ÊÀ=îÄ.…@šîæaUîëÈûô®'ð$ÂòÛwx+7ã *c.Ö1U–â;¥(6à[ÂÂE“Ç
Í‘˜êå¾ðAz*Xâ´qV;-Ô×G;º¡±6ÂFÄ¢ÊK7£s«A‹H¡AtåÜ4+¬^X±Ûí |ÚSgé +—²¸ÍdµìZ_; gò2›ÄºÆeº]] +õ½´uwðaŠ#Wu|욦 ô#TZ×n2íd( E)Ðá Ñ¥•&äµ¾íˆÜÔt”ßuê¨ÝŠN¥^ý”—•›ÚPëÌÜ¢±ŒQV+¸@ÜÜ/ò¸…wB×¢©pHwlàù`Ñáí<Ê1Wº¢sz3¢I^@ù:B®Ëj³” ŧÀJ)6÷¶m4ÄÝOÆ]DTöLö + +ß±:âÍ*}ùz +På,7´¤
+’)ˆô2˜Â_pô£¯à·¿óÈd”HA¢Á_fp~rÆXP—ÞÏÜwygæôy™ã³ø@t¢i$ •pemoà6†ÎêÖرLÞÎ9çIìÅi_ƒOç2õa»»ã²Þ#°S{Ô2b›7wkÎ"H“Ÿh(ñCéÅüìЯS$é’ý˜„ŽVrþêOW¶¿ë‰‘©ÜÊ{ç•Å«…ß æû{Od%©ÐC›ÿ/Oêendstream endobj -1164 0 obj << +1204 0 obj << /Type /Page -/Contents 1165 0 R -/Resources 1163 0 R +/Contents 1205 0 R +/Resources 1203 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1145 0 R +/Parent 1185 0 R >> endobj -1166 0 obj << -/D [1164 0 R /XYZ 85.0394 794.5015 null] +1206 0 obj << +/D [1204 0 R /XYZ 85.0394 794.5015 null] >> endobj 326 0 obj << -/D [1164 0 R /XYZ 85.0394 204.344 null] +/D [1204 0 R /XYZ 85.0394 115.6831 null] >> endobj -1167 0 obj << -/D [1164 0 R /XYZ 85.0394 175.2926 null] +1207 0 obj << +/D [1204 0 R /XYZ 85.0394 85.2644 null] >> endobj -1163 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F39 863 0 R >> +1203 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1170 0 obj << -/Length 2010 +1210 0 obj << +/Length 2005 /Filter /FlateDecode >> stream -xÚ¥ÙrÛ8òÝ_¡Gºj…¯§Lâd=µãÙµ=Ož”‹&! ’²ã=þ}»Ñ EJ´WN*Ua£Ñè»
™/|øÇAÈÂD$‹(Q,ðy°ÈÊ3±†½ÏgÜÑ,{¢å˜êçÛ³wŸd´HXŠpq»ñŠ™Ç|q›ßy!ì8øއ߮>]~þýúýy¤¼ÛË߮Η"ð½O—¿ èóõû_}}¾äqÀ½{ÿÛ‹kÚ -Ÿ/¯>&¡ÏL¯/>]\_\}¸8ÿrûËÙÅí`ËØ^îK4äϳ»/þ"³9ó™Lâ`ñŸñ$‹òL’JÊSœÝœýs`8ÚµGgýÇ}&d(f(ø‚s–˜x0HX(…<ÈxÅ÷}¯xjtK6Þti§K]u´ü¨ÿð}Q™ÎÔaÒ*'à÷6]kôÈ“£€ùØf"Q‘t»é‰øˆˆ',ŽÚ‚4$ÿ˜•€'èKÕîU“‚{Y]¡në]sÎcõGlâ,P¥¥…|¯ÕÍ£nÜvMß´h{(süRÇ!¥OaÖ›îIãÿ„pbêÂ1CŽ`" éýáþÖ‡é¡ÁT"‘TLÊ(Ä8Ñ^³^p= -lO¾ÓS\ÇÎ9âŠ>ºÑÙÅ°Ø÷ß -°Oqä‰ò D‡zÆ1S¡/"!˜Œ…šM»žh9¦:ÖîˆJgà Ù“pLr(iS¦Ï<X„ôÊ]Ñ™m1›;~Ì",ÿOò„,¡:Lž–äì³ÇTk9‰8ÒL#ŽŠxKôO¦Û:7+$]9“ CmxAdÂh‚%ª·ºéŒn™%…šá1㑯Ԍð™Ï“ÞjÓvºZB4-W’EsE#¯ÝêÌ á¶^dh³ðÈŽõŠ0iž;û[¢
lzÛòGºmÝt-Å÷ºMêtãèMÒ«L0î%ŽëöIšËÞLPÉÔqCéqîå©.1“n7õ®È N³Lo‘!÷Ã?wºÅ ãn]A¡BÍx—+BT5}Ñ‚Œ#Ý;*ÿV{8¢I' =ñ®Õùgçä4Š -mß!S?¬Î4Óè;{xC›Ð˜ÚÂ&¹&À鵫VÔ/hñàÈ É´]s{»Œ"e‹¢çêˆZ{Q!T¦Ueíĺl —Ò§ª›2uÜÉ@B‚4ÏýÑ.ÛØN&úœÉ2ë¡DØëÊç.WÕ«jš«ÒëÑûì”ÒwW,lçz•B›&ò>Bý)¬ -[;
vo9´ÿ± ªGuÀëw¤íè†zi3žM³bטõÚIËJ@¾^\%Czë´É63U 9J©™*P±µ¿PËæ1-¼Í\•XWÎHža(ù‰v7ƒL¦Ãôp3¼Ó]ö®±ÅÅ QW3’€…Š÷ k¤Ÿx—éîî±G“kgeJºKªWTi2F‘8èçy]¦Ð\ƒÛ°‘:[Ÿv±Ýê*ïÛœõÛÐ ‹´3ŽÎ6ÆõB,·Ý°rÁ…3·Êënv®ˆX'|Æë徂iÀOŠ¯<‰Tx’dñ‚äâßïŠ8Œµ6ⶮÜd ´u6ÙødsÏuU‰¯; ŽcmÊ] ÌTèU»òÁÞâ*¢‘ -_3ÿLûܤe bŽ3 -&°×Ó®Ða aŸ <ß'#ÉàX*Bl>BB|9mAwDR›Ó£Å=Œž0ºšú27¹Ó›ºíö½ _½z~"^ÅK“—÷&?Cnuuãz6Ò{Ôáå¡,ßv|"Ùqù
Ÿîo>Û¡ìuÛ¦[³ÌCÒ-°<3Û´8Á˧¿Ø¬;,ü-ò͸±Þ«.=%Yšmôre -ýö ä»r{úщØR—XƒÐ/MæòýY·÷us_Õo=þÚoMþÊCÚí تõwžÿaÕ±{/Äé®Û,«oãì{Ëñ\ãõ†Cá²®–ú›éNâ1M(¸öð=µ¿ä¯Ò¯ziÜCøEÁs¿ÕÆ?°ÏüÄé—àÿŽ¿ÿ#Ì+2ŽÅü¥"‚»+&N)4Pý<;üà¬úÿ +xÚ¥Ùrã6òÝ_¡Gºj…ÁÅkó4™ñÌ:µq²¶óäL¹h’Pá¡”ïfÿ}Ñh€"%jVž”«ÌF£Ñw7±5lF$JyºˆSIBÊÂE^]ÐÅÚÌ}¾`Žf鉖cªïï/Þ}ñ"%iÄ£ÅýjÄ+!4IØâ¾x"ÂÉ¥á@ƒ?Ý|ºþüËíûËX÷×?Ý\.yHƒO×ÿ¼Bèóíû|{¹dIÈ‚ÿxÿóýÕ-NEŽÇ÷×7“âçÓÛ«OW·W7®.¿Üÿpqu?Ø2¶—Q†ü~ñð…. +cö”ˆ4 /f@ KS¾¨.d(H(…ð˜òâîâ_ÃѬ]:ë?F Ÿq dsS .¬Ë—Vu—ˈÒà?`Í‚’2*KÆH†ÜR= E©»^Õ˦öìGo³¢hqð°mÚ~ÀÃàŽ¾sóß°†‚€Cÿ÷;?…鬪ÏZ½ì¡Ç:«Ôü*6^Õ©¬Í7늦ÊtmÌrjú[t®‹¦w±¨wÕ“j'k–³‘1|Íä»Oœ-ô +ø˘$‘‡*aÜd>… bÄ!ïú¬W•ª{~T¿RÊkÝkˆ0`²º@à—.[+'IŒrÊâ!á)‹ ûÔÙ±”$±„|ÝgÜ1+nÊ:…L·TÝ^5ÁY75è¶Þµ—, @ÀöFœÐý‚CÛgÕºé¿YÙy(wü2Ç!ÃO©×›þEÁD81Mé˜
ŒM€fÁEð+
éR‡-@¦œÈT,ŒU$¦ŒC-â\»^ p;*^O¾ÓÛÚ8çˆ+øèNåKL
)B’Pʦ¹qd©LˆõL"#š,"&I,£ÙÎâi–#¢cÝ9hb¼ÃLê¤r½‰ªTÙ+O!‚jWöz[Î&MG.ÿ_æD$á‘<ÌœåìSG×k9 7ÐLÃ
w‡ô/ºß ºÐ+ ]9“LzZÿ³(&BDñ´©l-Q³Um¯UG†ÊO‹]ç†SBYêšî±åRx®bDt[•k0Ü‹ˆlª<°CD³BŒmÄÖþiC›Û¶ör‡ñ„¹~“9ýF;z]éu®{‰ãâ2ó(Í¥ndLé4q‡ºc,(2UAÜmš]Y œå¹ÚCFÃßwªƒ ÃlS›*5\¯Q7øÅ íH÷Ž*þ¥hRÎP‚'Þuª8àì¼ +|'’ +[;)žìÜ rhÿcAXò€³q¬SÜiÕ8£Zì¥í x¦´úV¯×NZñ¶`2ÒÏ€ÇU áRÊ™*‰µ¾¦–õsVx›¹2µ®œ‘lxF‘`M´ÛûÃÎðNõù»Ö1‰ºš†$’Ì/0Y#h\÷¨»ÛÇžu¡œ•~p/¨Ya¥‰È0ŠùA?ÇC²op
GlÛÙ|fØÁv«ê·9ë·¡A–Y¯Ÿ-lµë…PoÛaMȹ!@sñÜ=Óöb’&)›ñzˆ¹ÏÃppƒGÅï<…CÒ9’ù É'â„ßoŠ¸9ÓÚˆ‡Ðº +¡³Év0ƒ¯Œl¸®*ài‡ãXëjWf2rw€c<Þp endobj -1169 0 obj << +1209 0 obj << /Type /Page -/Contents 1170 0 R -/Resources 1168 0 R +/Contents 1210 0 R +/Resources 1208 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1145 0 R -/Annots [ 1173 0 R 1174 0 R ] +/Parent 1185 0 R +/Annots [ 1213 0 R 1214 0 R ] >> endobj -1173 0 obj << +1213 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [491.4967 730.5319 511.2325 742.5915] +/Rect [491.4967 622.8956 511.2325 634.9552] /Subtype /Link /A << /S /GoTo /D (lwresd) >> >> endobj -1174 0 obj << +1214 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [55.6967 718.5767 89.457 730.6364] +/Rect [55.6967 610.9404 89.457 623] /Subtype /Link /A << /S /GoTo /D (lwresd) >> >> endobj -1171 0 obj << -/D [1169 0 R /XYZ 56.6929 794.5015 null] +1211 0 obj << +/D [1209 0 R /XYZ 56.6929 794.5015 null] >> endobj 330 0 obj << -/D [1169 0 R /XYZ 56.6929 769.5949 null] +/D [1209 0 R /XYZ 56.6929 672.1567 null] >> endobj -1172 0 obj << -/D [1169 0 R /XYZ 56.6929 749.3309 null] +1212 0 obj << +/D [1209 0 R /XYZ 56.6929 641.6925 null] >> endobj 334 0 obj << -/D [1169 0 R /XYZ 56.6929 523.534 null] +/D [1209 0 R /XYZ 56.6929 415.9107 null] >> endobj -1175 0 obj << -/D [1169 0 R /XYZ 56.6929 498.8411 null] +1215 0 obj << +/D [1209 0 R /XYZ 56.6929 391.2207 null] >> endobj 338 0 obj << -/D [1169 0 R /XYZ 56.6929 441.2232 null] +/D [1209 0 R /XYZ 56.6929 333.6097 null] >> endobj -1176 0 obj << -/D [1169 0 R /XYZ 56.6929 410.756 null] +1216 0 obj << +/D [1209 0 R /XYZ 56.6929 303.1455 null] >> endobj 342 0 obj << -/D [1169 0 R /XYZ 56.6929 377.2039 null] +/D [1209 0 R /XYZ 56.6929 269.6003 null] >> endobj -1177 0 obj << -/D [1169 0 R /XYZ 56.6929 349.6417 null] +1217 0 obj << +/D [1209 0 R /XYZ 56.6929 242.0411 null] >> endobj -1168 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F39 863 0 R >> +1208 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F21 690 0 R /F23 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1180 0 obj << -/Length 1176 +1220 0 obj << +/Length 1122 /Filter /FlateDecode >> stream -xÚÕX]s£6}÷¯à1îŒT@|NŸ²©“f§›m]÷)Íx0ȱ&±Øq7ûß+,Àààgg:HBçÞstuuG†¦ËŸ¡y6Ô‘oi®oA[7l-ŒGºö(ÇnFFù
¨>ͯ>ÌF?^#Wó¡ï˜Ž6[6°<¨{ž¡Í¢û‹«_.›M¦c`Úú…ÇÀvô‹·w?«_=®>ß]ßÞü9½»ÖÅìöóêžN®'ÓÉÝÕdÏ6ä|³D82áúö׉z»™^~út9?Ì>Ž&³šK“¯¡£‚È—Ñýƒ®E’öÇ‘‘ïÙÚF6thø¾©Å#ËFжªzèèÑï5`ct7µK?yÐöL·K@¿! ¡{з|Wsm:ÈD;ïÇÀÑõ‹%ÎÂx¤9Ví-sÆç ûIµ -ªÒ0èÛ¶ÙšKs±³À Vy±M2hH -`)×jiÚš€N¥4á -KU™pÏO%¬Öʬq«§JÄ
?;¤3¤“Á´C* ´ÕAÆñ‘ ëÁ(~>¤óF›ú¿Û…õÎ’ëÔ|™3ñ#'ÙvøžØªÓì;r|ý¾6;tdAIò8\¥€R¶Íƒ»Ì@ÅÞÃBÌã@hsJª¼ö7è—ó7aG0Aur×URÌ÷C~£Ûjd<HIJÊDgóù Â:?îù•ÈSYÑœ{í((èz{¿DV{÷I<
O™Œª,L¥¦KéÅêÔ¿v€Ø&Ù -"ÎÆnAe=±bŸo‘×LÞkäQ -ŠÓ¿ílÑ3t…¢s>Äâk¼íû=P«ni•hg¦6+ɼ»åa•ÚËyøê¨Û¿‘ÔjÔqe½çú™®-a¡k!{‡úC«lÔ¥0"×´:ÝÙSlo0¯jMm×2JÛÖ1ÛÖÞvS·—ÒÓ†¶é£îhU¢öR¹Ðò,k€ÍjÏ°|h!ß9£ \xU€÷v:uÜvGóZ3ß…¦£›VPyäÙÉVçš}±ŽDÙ+zœÿAôÝN}£Ç8¼‡ÙEPá̉×1íùÍàõ[×M+²aq=Úq/ª×Äß|»¿¢¶dâó<³¾`5Qã‚éôLßœ*hZèÐóúºöµëÿ +xÚ½X]s£6}÷¯à1îŒ(ŸfŸ²©“f§›m]ïSšñÈ ‚&±’pìî +ÞOÁÌ0.R”ræ‡Ä˜ 5žC‘¬2˜¢wêù¡¤,禩®kµ1r´d(,ÇÙc{³mÿj×ÿ¦5¸C|EÙ*£= +ž€R~^2çI!"úœ
J F™àÃY$”‹W…À +‹CË6| v92‡Ó+¸Œóä”’áÆenùx3°†ÈôŒs”Á5‘/•ùAÑWÁS„Ò'ÈqT9Ñ®\‚2”a&”µßö§—– +ª-ºI¯3àWÈ*wŸøÓðò(dT‰0—šÆÒ‹dlâof€ï2‘ ŽùÙ؉ì'JÐùyCeã½q@å Üý»Î–#CWX!ηX~¡} +¼Ú©ÒwÇ>ö¼9qûÑõ endobj -1179 0 obj << +1219 0 obj << /Type /Page -/Contents 1180 0 R -/Resources 1178 0 R +/Contents 1220 0 R +/Resources 1218 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1182 0 R +/Parent 1222 0 R >> endobj -1181 0 obj << -/D [1179 0 R /XYZ 85.0394 794.5015 null] +1221 0 obj << +/D [1219 0 R /XYZ 85.0394 794.5015 null] >> endobj -1178 0 obj << -/Font << /F37 747 0 R /F39 863 0 R /F23 682 0 R >> +1218 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F23 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1185 0 obj << -/Length 1117 +1225 0 obj << +/Length 1126 /Filter /FlateDecode >> stream -xÚµX]sâ6}çWø:#Õ’¿gŸØ”¤Ùé’.¥O4ÃhmÔË+‰ì²Ýþ÷Ê6l3I&[ò=:÷è^éJÈ0õ/2º/°¡c"ÇW=ÓxÑ}=´ý”ïÞO{?ß[žÀÀÅ®1]`ùÐô}dL£Yß…4‚Ù¿{ß?>ü9<»?}| - ØŠj ›!øZ]Ç@g1XßJ#‡hD£‚¡Â„1£‰’-4\É^isûÊÈ’ -FbO*DÑîöŒ¶%Ÿ¹3©h’¬ÛŽ½S}ÁÅŠl5ÿËtÌâ‰'è¾RQ¼ÿ(ç+ÙlÛåεNæ1‚p+Ow¶‚cg›j_ÙU%É×"¤{•XjÏIíÔÉ @{ŽF‚žmÙ9ÐOy—ÏsƒöL·Âx–Å#KçÙËsñVá—-§ÐÒF%Úò¯î!U÷”jàA¬W©-UçU§UlZz¥ô‚ZII¬@+YÐÞ„k -lÔÏï.͇NŠý·m¡ªU«T.¢²6Û¢å-§“<»Ø{œšû=ïKLôqA©.§–$$ᲡñÉrжª={zòYÄÔ¦6gÕŠ%@pÞú ‘mÌÙbÖuåNeQ-FkAõAªæÖG¥e–Ä¡ +xÚ½X]s£6}÷¯àÑîŒTôhö)›:ivºÙÖuŸÜŒ‡9¡ÅÈ+äìºíþ÷°‰
¸ÙÉCdI÷pîÑÕÕ•e›?d1:sËå21+XlëÑŒÝP1ì&ꬷÓÁ7ĵ8äv¬é¢‚åAÛó5
gCb82öðúÃýÍÝí“«‘K‡Ó»÷#€™=¼¹ûeœ·n'Wïß_MF +£ +?•HÓc2tž
ÕØRÒîlr”CJ¸ÓH£Ÿ ô% +´Y²ãÍIj¨JíÓZ¨
HåZ<;‡,«|c͸±cãšåŒ<‰ùõ?Šõ]£Ç9=–îü}AÚFOM¡u*À6‚22`%eœ÷oD:—jžÈ–݈Q·Y«<Y/? +ÕN@D‰êÙÏ£Ôˆ,ý/@+?IB-…ºB®uGgjQ_JcÑŠF
C+Ä‘H:¯†ÁZ¥Ñ³ho_ûr*TäÇy\åkÑß>]ÉgnÇQªE’¬»~{¯úBª¥´me"€™ðYì“G±^ɦè/³
êð¹t#wòtoÛ#8ö¶+ãk’öU)?wJ•f—C‚]ÖZä®ë4gÖY™‹dùИގ"t‚gí|<q’†\¥ÊúQÅ61µ™Ë›ÏªXƒN²VÐ^…+‡1Ö–ëYi1F¹¶ó:Q€±õpcd‡Ü‹òv9驣ń"ö7»TÈ$L(DhµmÓ—c—m—@B9o¬Æòü¦)wà+"âb»§äÔÒpõÖ³õšøq*AŽ”wü»gUºzŽí¬‡
„°VÁ}mY\D_ +Äò¤Ñ?¢Geñ—Y×Ä°¥yÖš§+´@¤©©-OÉ]ó ôµßѾöýEîÆ©öƒ¿/aÄÂO¢ä±oú$|¥? +_÷Øš-ü@t endobj -1184 0 obj << +1224 0 obj << /Type /Page -/Contents 1185 0 R -/Resources 1183 0 R +/Contents 1225 0 R +/Resources 1223 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1182 0 R +/Parent 1222 0 R >> endobj -1186 0 obj << -/D [1184 0 R /XYZ 56.6929 794.5015 null] +1226 0 obj << +/D [1224 0 R /XYZ 56.6929 794.5015 null] >> endobj -1183 0 obj << -/Font << /F37 747 0 R /F39 863 0 R /F23 682 0 R >> +1223 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F23 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1189 0 obj << -/Length 3019 -/Filter /FlateDecode ->> -stream -xÚZ_“Û6ßOá·zç"…DIœ<¥é&ÝöšÞ%Û¹¹I;9Y¦mMdÉ‘äìnïúÝ HYòÊÞmîfA ‚À ½|ÆàÏR2©£Y¢£P1®fùö‚ÍÖðíÍw2 -†RßÞ\<-“™u,âÙÍj0W²4å³›å‡ù«ï_þíæêÝe ›Çáe b6ÿöúíwÄÑôxõóÛ××o~y÷ò2‰æ7×?¿%ö»«×Wï®Þ¾ººxª8Œn†^_ÿõŠ¨7ï^þôÓËw—¿ÝüpquÓ¯e¸^Î$.äóŇßØl Ëþá‚…R§jv/,äZ‹Ùö"R2T‘”žS^¼¿ø{?áà«:å?%ÓP¥"™r 8³4Ô‘Nf‰Òa,…´üpČ͛ºî‚¥)Í:늺 -ꪼ§/NÀÜåå~ièåßô¨²)‹¶£·?èñ=^ø7pØpj¥ÄPçç½iîËzMo÷¦ýX7«úÉã—E›-JdåºnŠn³m¿ÞfE5²´y1ZÔ1ÛÙþÇ´r>TžåY¾1©Ð„¯]›$/MVÕ:(ªÎ4_²Ò¹w¿]˜æ Ól³»ÀMÕ¿;kúØîL~Κђò²0U×;Óvo†f<yMhÌÿk¦Ü±*`‹Wu³Í\œýÊëÌ]÷Ÿ&»š?y}f»ëîƒ<ìÀ -üÃŒÄGê㟲éwÓÔAUm]W~mMØX||²@ÈP#NŽ ÙŸ¿|Ö«Z¡bÅ -·™Îv;“5NÅz¢rC;£šÍÇ» *ãxžá#™C* o×û&#ïâ7ä”숕ž_¯ˆÙm ãx:74C6Å„cã4Lµæ{6ÁpHŽ=ûæÖ -v™tõND…‹²Î?y°O‚•x$K4l
}FÇ#£èZ´,S¥Ó±o–f•íKt·EYe·ž¸]áƒv…LA'EI˜H&¦Û#'¥lu¹Í·½”5ªhLÞÕ€¿Gš¹P¾JžWÝKMèî—™I•cÞR¨ùmÝ|‚êF/`’€P>GË,·^ѳócJCû…-ÄýËʉVÐd‹¶.÷“ÝeÝQ7YD¥Ã¹Æ)0)NÝŽrð‹ÇJ{(#J9A -fŸLE¬¬¥'¥„y¿âØe9Òf!R‡EãŠ9çvUš;¡„TQê-…OPûˆØÖmG”¯a(\ï»ÝÞñiQQÌ„ëRgÔ -•tÞ2löÕD–A -·tYFõVÀ¶X€Iü"‘š\¤L…EȦäF“UuGö-®Æ,!ŸEÊh7ñSM“sA€ØëÌ–9Aö_Ž±¡y § -øÐen¾M½/—ôqáÆYT„o}MÔtL§“P%U"ÏCÕPê4TõR¨õ“¹NÃU» Xt^}/5¡WØH0žŽ
øÇÆ&7gsèZ±ß$Èbz¾¼‡)rú¸ß-3<@[ÔÖäû¾¾qêÃÚg„F´½œ=Ø2`ÝÊ"LÓ‹îö‹ÒëÃn…BŽáU]S|!s„Fq€‘ -e¬žÛ}Ûëi曹¾àÛùÐå‹(}$tRgB×KõðÜ¡çŽãzâœÕÝK=T
o@x$BÁδS¯'ezh_¤k±‡þ1™B6C‘ÀbÚ®;AÐSP‡‰,[QáI+ø-%†íài7luï˜vŸAÈ×å±l7ÙNÈ]è@=ÎŽ]zdw -«?îÑÉá˜ÃêDJÀt0ƒx¤ñJN‰^ÊVB„óuÛf»"ÈXuÕp¬9N›D˜á…&̺fa"€5²Ãb|"ˆ¶þÅ·œ -OD¨âÔï¡ßû˃uAsã+tXÝ„Ã! -A € %Ø‹ç©ŸñÚñ¶hs—L¢0ч¶‘íÒ»W›2>|eÐIKzw!5í$@/ɄφÊ*Þ -<_¢‰;Âx¸RŽuPÆýPëµÑvêÁS -´–ãÔ8ayÊH–6ýbèÄ™šAÇQú„î = NL^K·¤VEp FøÜEPÖ'𥬳¥ãø)üõš`:Èô7iÈu®ª¿¶¥‚+¡Ç×"Wþº
㹨†Gü-¨¿¯VìÄ9&šFHLÇBâÑd`Øà€ïqtN½ä1ŽkÓÏs„§þyÖˆÿq2ö¬ÿAöþÇ–Ãýà5Kšž8ÕKü
bÓ…îŽÔ±åýÀ<4ý¿‚BÄendstream +1229 0 obj << +/Length 2511 +/Filter /FlateDecode +>> +stream +xÚYQsÛ8~ϯðÛ93•*Š¢$NŸ²Ý´—ÝÛô.õÎÍMÛéÉmk*K®D%uo÷¿@P²äÈi’»äA | +PU¢ ÏN=Z$-TRæåÚÉKêÛ¤xƹ'ÏJ˜Ñ–Ò"W¥nœªs6C3ž–¼ÿ§•pÇ*‡#^U5¤ó!÷´ú¦ÿ¨“;LªGïOmwzï4àáΈ'¡MO«R'©~öüïU©š§‡
› +üÊÄGêiHû]Õ•SVNS%ŽÖÅsãøh™Ç–Çç®Äb=Ú$d¾|ã³Y¯j…Šér&c#„
¡{ð`µj‡˜ÕPð^'Zm!üèõgõÑóüÒT8â@…"â÷&Y+«‹ª5¨ò…+9£=.6ª7hPÒ¡¢K‚0ÊtÜ_Œ‡Pð¹°rÍÀ8ÎçÒ
Q펞ë¢Zbþ#}ؼè +ŸÁ|©ì„FeD-÷ôÄÞË%r±Éí´#…ÛÄ +cULj«Ç`=Q©¢“ÍfãÓFPåa8OðÍ!зë¶NÈ»8†œB¡ó«1õ2ŽÅsEÑ8dCPL86ŒÝXJöcÏF@zѱg_ÀÚRÀ)“®Þ‰¨pYTé"ïrì˜PBA°d‰†£¡at<2rÝØ õB7‡#ßdj•´…
º»¼(ˆ2ÇO<.÷^Ï깞€vš¾-&›îÑ3”2-æÈm]ÿÛK£òZ¥ºü=ÒÌ0À¥à«î¥&tO‚qÏ•QŽ•cÞ8Üó»ªþÕ^À$ +Oúº‡c11LoOs`«½ešs¡®.eõd;íCîBÚáìØ¥Gv;€¼nÈ|ÿ·a×u²ÅÂ=Õ ’¸ÿ*Ï%V“açiÞµKêDO6øAäBãÎc‘\!…´¢CH‹)oð,•ÊTö +MðM?i¸«¶Léû[®÷à ¯mN-%ž¶6[b#Êð–r¿–S2[¨)Á°Í'>nö)1”:½”©„çë¦Iv¹“Ö°ëRçp9N˜?0£š0cêÒs#X#;æÀA´ñ/¾¥@Y†GCQqFRæSq6´ET¤ñÃ+®’Fì¼!Š”|mUœŽ| +ÍÄÑ…×\à˜Xæ¼}ÿÞY¼¿zKlNºJ«ïwRÎ_¸°“í%˜¿ªzI ^54&è1°•.ÃÌFŽÝ&yAß$MwäƒMòØeßr{Ç6êÊ‘ˆÎu^¦ùÎ\oAÀºGHK {7#3í1>ýÚæ]¡D)½¡uÛõñüÑ-¬Ùƒã·4`j#2©6¾ —?+ÅþÇ-òK¥Ó—_ê¥pa%,§àâ.`AßJ:¡Í¯;
aw# +ˆR¶cö%3gdSPùºuâwO.\ü±r"μþ3êÿü›èáclŽâØŸYŽ_È|uF¡_qlyÿãé}Óÿ!:ؼendstream endobj -1188 0 obj << +1228 0 obj << /Type /Page -/Contents 1189 0 R -/Resources 1187 0 R +/Contents 1229 0 R +/Resources 1227 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1182 0 R +/Parent 1222 0 R >> endobj -1190 0 obj << -/D [1188 0 R /XYZ 85.0394 794.5015 null] +1230 0 obj << +/D [1228 0 R /XYZ 85.0394 794.5015 null] >> endobj 346 0 obj << -/D [1188 0 R /XYZ 85.0394 550.434 null] +/D [1228 0 R /XYZ 85.0394 443.9876 null] >> endobj -1191 0 obj << -/D [1188 0 R /XYZ 85.0394 518.6098 null] +1231 0 obj << +/D [1228 0 R /XYZ 85.0394 412.8839 null] >> endobj -1187 0 obj << -/Font << /F37 747 0 R /F39 863 0 R /F21 658 0 R /F23 682 0 R /F47 879 0 R /F48 885 0 R >> +1227 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F21 690 0 R /F23 714 0 R /F39 873 0 R /F48 925 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1194 0 obj << -/Length 3480 -/Filter /FlateDecode ->> -stream -xÚ½Z_sÛ6÷§ðôå䙊! -Vˆgo>ܾ}÷×O¯¯L2[¼ûp{5—i<{ûî§êýðéõû÷¯?]Í…MÅìÍ__\Ü|¢)Ík|ÿîöšF2jN,úéæíͧ›Û77W¿.~¼¸Yôg Ï+b…ùzñó¯ñeÇþñ"ŽTfÓË'xˆ#‘eòrs‘¤*J¥üÈúâóÅßûƒY÷ê”ü’ÔF©L4HRFV1-e!€È$"Ò*Iz)K1%eO…R^嫇rþKËu9>r–ErðÂÔæžhbsl.â$’&QÃÝUKr÷í]³£NW¶]UßÓCS¯Ÿ¯„3¸M%âÙuCãuÓQgß–ÑѱXàO¤H^]@uFvž -¹/ö›í щXD©H^ؼ§šØ}(<%Y:Ú~ñP‚4”žmóî¡Î7üÔÜQÛùiæúfÖ]‰Ù÷Ûr÷XîˆÒŽÞ+ò._æ-?u
µOeM½ªn»Ý•íW]Y‰Š†·ð/UÝŠh$Õ¹L"›é$!¢,M¥;×®.Vt«ÈU±äChÉTK"¾ÀJñîn¤í¶\Uxú²ø–• -ÏæV.ïòýºëuÏm¡²Pæ*´Èïò-Æ·¬b¤âRƒ ý¯ £ÌZ;íæýŠópIò˜!wJÀ2I–vö -M -ŒÎ&Jô;a*ZÃjFÉó¦R6•ž -wÜ”›¶Ë» -lzÕž²¥#•ªä<=Õ›#+•˜!Îf¤›Á'´l;?ím&½ÁààÓ®E}8\³{¦þ¾Íïù½Ãy†7«©-¯:PÝ$¤º–T¤²žØÃÀ0þœ>Ç -l-Õ9â[i'Æ*p4…Ri .¥/èË茺0n·Š:b³ŒGÝ×Óï¸ՙì»ð®1ô¨–=ªñžÑÕîÔôÚU×ò¢»+‹Ê–Þ]3E ÅH§8á<˜[spãJLJíúLJÉOÀ—(›y£Eš•Hé4CÕzÌw¯vûúéÈB%0Zia³Àëʘ-*U᥹gŠè †æ‚F–ÏLI‚¸ßå¦éòŽæžòš{Î\ m˺ ª¶º¯óu;œfHf.Õ5bwОÝÁA½Í÷÷èNò…}÷ÌŒÔT€0µ}‰Çê«›ºœŠSÀBœú—ŠªÍ—kòÆ»ƒÂŽf/df95Q?°nô‹”ÆoIo…³OÕzM½¥MìÊš®–‘´ÿBˆ;¯á‚Tœ gbð…Ox4è(^‡–%µî"Áû=‚Ò€˜Ý6Ϲ;=¤ŒctÇÊ;¢iÁÉ¢šðD¨J¸dNÍoåóSã¶vV!¼Áx -Å2Á»vÖÜÍ€Ô‰é;Z™%@"i!"(Ge½Z7¬Ïàgkv¾Í~¹fGüuhOúË4£8ê¼Ã©N{̞ʦrµßµpg§‚«0QƒC?ËAO5ÁÂÀHŽ5évi\áÉ©5´ -Œ:‰Ó©,Kibb -&I”¦YîuJH_"‹o!J&ùØ0u€(ZÐÅDG§‡¨ô?€ã•1’¢óÅMx7Õú_Zš<sT±'è°sA…×K@ƒCS#g -jϧ;W<¹‘ÃpºdëÍ{çCýªÙlöuµÊ»2ˆõCû¿_7Ëœ—ÑŸÖp -M6êb/R †^§ÐÇd(žÀˆ ç;冞ž*wXAé5‘×Éz -/’£gÊå+Ú¾bF|›{p[”¨Š‡[|ÝW;ra£}&ŽÌ6làbóŠ{™$¤ d™&ˆÌÐÀÛÃÙ%&!ž´üý!ß·Ë^•á:œñ®Á!mã³ =øF {Ì×{Þiè¨Ä@˜°©¯ÅÀý¼"»:6J_4àÛ#i”%I:TYì2£{•Iæ¥= -%Dˆî[q:Š—{»žóŸO~DÁ´ ãÔ]ÚÈ*é9;ò;£c˜ ˆOeú»uùo.…ƒnéÂÑàz.ö¤Ž¬Çd²´ghUWyÇ»jj¼¥û=i
®›œ˜o‡xâʳ»n¿eo^m|¨‹!–;åRAá?Fñûe²/k^œˆpÓÓù?¤s`¡ -¦!Õé ÐS9˜³+ïÊÝ®,æ÷¨‰GQ@",Tç÷ï©&F¥Jë!TÖc“ɼAZ5[W-eÓ@Ö=oKꡆ¿&`è5üÇÊlU_Õ’\ÕR³rƒUÂj9n0uOV ƒ®Vcå—¼(ØŸ‚Û2eFÐÕÈkWâgŸ -8%vÈÅ5q©cL‰—ƒ£§×n2`Ø͹ŒÓ XB¤|ziE,¡J¦bö¼§wØ:l|c»žÂ,XéH29ü3ç8£·¤þ¬F9W2eXùAè¬æCoM}r¸iÚqÍvå€ÏCûôs»]W¸Ø)%‹!EñckHuFÉ<•“JÝB„›¯›æ·¼Š‰óÆ™=ÏAO5ÁÂ@ÅT<1äáŸX5Ö2 -§‘ÚWvø“×}r.qy:."ÅüŸØз.ã‹+åÄ,Ä`.Ü¥-Lu%í
1x‹âõC“œÈÄÜ'ÝÄ›p¢ ”۲úð§u£†þá4^è¿Ÿ¸ä%õÉK°cÅÙ5
ÒªÔç{å¬Cqëò®£!^Ã}Q¤Î¾¦j;âTÞ±OCD’D±´£ìËÓÏózõ@25ý—RÍ_J
—ýýM®VÓö®.ÈŒ/$ðèÙ5E_*Ì©-Q¶%Ïî·áÖŒŒ‰*V¦Šµb•×§~ù¨Ò®8aûð?ëÄŸþUäá'£‰”µ'~Ý#A9‹0Sx‰>öœˆ1µœ`ýÛŠŒlendstream +1234 0 obj << +/Length 3618 +/Filter /FlateDecode +>> +stream +xÚ½Z_sÛ¸÷§Ðô¥ô4¢ €$€¹§\ìä|½8i¬t¦sw”H[œH¤"’vÒN¿{w± +9Ó¡Ny:[<ôÆRa¤›-ò_ƒ4äá%Œo>ܽ½}÷ùÓëK‹Ûw—sžDÁÛÛ_n¨ôîÓë÷ï_ºœ3•°àÍO¯?.n>QSjÇøñöîšj4=Núéæíͧ›»77—¿/~¾¸Yøµô×Ë"ùzñëïÑ,‡eÿ|…B«dö/QÈ´æ³íEœˆ0‰…p5›‹û‹¿ù{¦ë¤üXr‘ò rÑ ba¢u2“‰SM(Àv]Àšâ4¨²-ÕôôMÍ:Û_29½)¾Sá¹Ül°$})
– +åêmÌz¬™äa’*
F¦«MYTíå<¢ Ù«ò¡Ä±ñu—í[`0wÆe¨³ýÿ2ÁB…±¿…Îóz›•ÕÄXiÊDÄ–¶^D:ø +{ÌæBÆ¡Ô„ÊX¨“„¤%„“–ÒHk|S_ZH`¤…
$#,MË(…=Ž LóÚg¬€„².¾Q!/˶™’OC6÷´€t(”ü%”¤:¸hòÛºiie«¬)šWPN¤Y>
Ôç9qƆˆ‘N0çaš0·’f]wÔ;¥QlðTV1¡¢)öOÅþrÆù熪ìš2€éqƒzOUYEdµÛnzêj^|+›Ö¨%6Ýò0”6å—‚ÃMÏ.ˆÜÐoœÇc_ dȤJg’‹P¦©úoœ%WjÚÌÝ€óþˆÇf®¡w*ã_·ß—Œ1ØÌcÍà°GŠ;Õ8»9à:¤L”%Åe£ý°(¸} ×ø½î¨`€^º¦¬¾¿Ÿ/îoß½¢×v]6TzÊöe¶ÜØÛµKK[“¿E¯Š<<òº,”Œ¥³T‹P ˜ö’D4ïS‘ôØD”ñTkY£G¬Y¤`XùoO5Á|`ÅL +N +,f¡Šó;a*I +ÙÄšó¦Ò§:m*ž +9n‹mÓf-À¿rÕœ²‘†1ñÙYxª‰il–,D,‡ó°!+êÙ¾™|L9ý€‚³™^%ë…9ˆ û²5áÊ°8Œ¦Ü5Ù£íwX°§¶Ì*znAu㈑ê*R]ÔŠ„cÚÓçH€é¾:‡vW¦²0Iõ,ì” +³@É2`ƒñcfÌÁ¾‹4:°óûŽ/“ûG˜•jgúW¤_1ÇK³¡ç…üàjßUW¤°“i0¿èÏÐ÷òÈÚU"úûfÞ)®Ç5CAÍHI‚xÜg[KÓ®³–Úž³Ê–ŒÑÀ³)(ª¦|¬²M3l¶†& U"B‡nºKr–ï÷š"¬äÞ–|·ae¦R»„ÁbîX5™nâÄuÊËqC]¬s1iìÙTdôøˆú…>#È +¥cI½úö¤JKWšØ•¸Êl$¹JF0Y…‡)Q˜lÝ@0|Ã¥AA¸3¨Zô$ø¼Ÿ0qœÇ’wukÛÌž’Gd¹xèFû1-8ž„’3G„ª„Cfô +a_¾¼FÒ?I½Víæ;UÙ4$DUÍ’GŒèðn°å#ˆkBní¶Û‚Lû<qY‰sœ:wyÀ¶~«¦98>ý¿ÀÛðÜœ ¢¦©P/‚`“—T»GuFµ•?/ÂG<ÙI”<?O51‡á9dZ +pFJLÑù"ËMŒX°ç 쌦|pYwÂÆÓ(ŒÄÈ@¬Øf֦ꇑÅ\Ùá,#/šÕ¾\öÅHe9ÀÎ~fBjLVLúOûÇ>õ”×ÓÏûŽ•÷x\œÿ=,¸¬+w‡‚ÍH%Y‹t0£##òT/Íãh´³¾CÄ*Ô +‡ÏݾÜfûrc««¢ÈݨFã° +›¸/NeåCâð†5Ö§£æ<δL²‘DwînP<'ÕŒ¥<Œ8AÍúT§ÕÌS›¯ë,~S<;››ËÙ±²%øÁçgá©&¦1P¶òÆÓá<—ˆö˜Ú[¡ðh‰•U†U±¥¤êMÌU¸ É›ÊÒ²øåº!rq[ï¨zS<ÛÝ|ºÓØ詬¯À¬ÜŽaÊÄHŸLŒƒÈÌéÔ®¯nÅ·Õ¦Ëí~£Í„>BdH9]øÑ9+C9çEk8ú>ÈëÙA endobj -1193 0 obj << +1233 0 obj << /Type /Page -/Contents 1194 0 R -/Resources 1192 0 R +/Contents 1234 0 R +/Resources 1232 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1182 0 R -/Annots [ 1196 0 R ] +/Parent 1222 0 R +/Annots [ 1236 0 R ] >> endobj -1196 0 obj << +1236 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [222.5592 483.1171 296.2125 492.5267] +/Rect [222.5592 378.1793 286.2499 387.5889] /Subtype /Link /A << /S /GoTo /D (statsfile) >> >> endobj -1195 0 obj << -/D [1193 0 R /XYZ 56.6929 794.5015 null] +1235 0 obj << +/D [1233 0 R /XYZ 56.6929 794.5015 null] >> endobj -1192 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F39 863 0 R >> +1232 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F41 910 0 R /F21 690 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1200 0 obj << -/Length 3419 -/Filter /FlateDecode ->> -stream -xÚÍZÝsã6Ï_á·*3+UüHÍ=¥m¶—^7{ͦw×iû Ør¬[[r-;iî¯?€ -”ª§@Ó‰I²(UÐ… -|Ê—å,ß—¡ŠM°]8"
>/—Bˆ -<PL(D”%‰t»tâ¹yÜñß5ŖȲ¡ç¬(VÅŒhŸ<t»¹´Á®Ù³èàØã(NÀ"0‘±pˆ£fÎLaŸ‹NIŒ™¹çBùgUÓÓpˇEônSìK!¬ó;8)FË5"ÇÀZ2erOŽëbZÎáL¤4Á¢,6¹;)
5>/Êé‚H”–(§BxÂyQOÎSTõ‡Û™;\z'#y¬Ü¡À{^1áík†Gî4;<y°\èûò¶}G©°ô/ ºcn´¤@KÄó%ó¯ -8&|½Yå,3YѬӲ®HŸL@Ç©ò%ÈÍ×ë¥;n°Ò _.ëç²zÄ7Ìñ€±¹¬úé½Ïù94>øN§.t¬ÐhÜ;÷¾Íí—8–¨kdœÕ«¼¬ˆ&óB6?Í®š,@ÎZé{Ö>&lœ3‡u‡*LI[¾çƒÉlšx3b]ÖõǼ)gÅÈœ€ -©WÔÃéPÖ šºtß_êÏÑÆxÙ5°p"PÓëR'£c;ĺz9kó"šz¾}æéÞP…5 ªb?‰è2mÛ1¢5Ì߬U¯0WË<Gs‘$± -±7¬«°øv´ïèiY™d§eh¹F„î7ŽlläPŠû…ÏÙjtD?ç®QÀû(¹«+ -,± u×DUþ°dž.ŠéG2xsÍm±ª7/Ä ûÑ/γ£Àø¤Ìn!gS)ž -9t9.I §©ÙÙ |ŠÚߥ;H0X ½.6 Öjœ¼9n(djÌ{èq°ÏåâX±j¶ -€ŒTªÔ>”a…Ž´N|®¸«–EÃfóE¸"bXJ}1¬‡ XßÞ;««W«ÖJ—eU½Î—È™7ÅG·A R:– dµym`ÿJÞ“6ßç:nó-—ÃÀ2_îÖÆêÎ ÕÉu[®‘…‡á1‹,Öüƒ•Õ3H½>j`äq[d|žqÜ殑l#ß6Ô—S¡“ÿ©«Â·5Ô„I¾û¦s¡yV;Hõƒ™wUÁœk#ÌA(¬7~jjF]c¤™ÎвªœÐdCàC U’ %~ÄDÉJo‚Ø:Åä W1$ið@+î[êðã^è "Α}`Jc 1z,+ðyWõ -æ™nÆ ^b%!zÈFÚu-/k¦œ*û¯«)¬±á{™>vã0ußBDVÑ4=p•ütĊ¢â9]«åýPFÕ@béÜ_¸ÌjÎ7ôZ»‘*|ZvPp¡#´n¿(òÍöÌ3ô3!¯Šl¢½o0RÉ`Q¯‹ùŽ^xí6ò¥‡6ˆ‰)ìÓwÈ,YvXK8ÅàK³[¯9–7…Ï·3ù¶Ùé¦^ù(?ßR_”#Í.âRÊÞaÐ-TÏ P1çåîúÊçåÇÐU¦*2ÆžOËE['¡4 ÔQ -á‹¡—’°±Òp+ÕÖ*÷Ö(fuæi›õd–óhD„¥S14¹žÃ€
.Ð0€ˆ)£NÛhýTÏ#’È$‚´2éÙÈ覬j3sw@#AúžÆÞ>11(Vào®dq+«Š >EÜÈ–žõaAÈŠ‡0¥S¼ïÛѦœäËú¡u¾è?C1¯8•Úáyðé‹ÏJIúÖ‡" -¼Ùé5ðçFyAzà{TÃ\LúéÂvS¡”À‰÷,ã—Ë$˜GJ(L´6ƒJÞU@õÌ%m:9iE†¢%áF™®Òúçˆ) -Ë·õ¶½cér”.÷éW†û9{ÿ^„¾îÀŒ¸ýá䈄 Šà³7…”Ô]"ý÷-MÀÄ™/ŒZž»È?a‰¥ÆAº&”Dš™S˶<ë ùžè¯{ƒå;$>þSX,62Ý~¯’t7ØÐK̨£)W»%ÿ_$ý-$rÕM½,ÜYC3}bmÏqÐ8ØxóÃ×w—¼þä¿ËíË“Ù±O‘œ)Õûêˆ'ga赟)wßpkpk|Sªâ4²ôÏB¡jµ9@ÿ=ó¡èÿbÃL¹endstream +1240 0 obj << +/Length 3599 +/Filter /FlateDecode +>> +stream +xÚÍZ_sã¶÷§Ð[ä™#€ NŸ.w¾ôÒœ/½s›f’<Ðm±'‘ŠHÙq?}w±ˆ¤(ù®ig2~Ð\ +— [|\U‹‘(-QN…ŠÉ½)x‰ºq¸“ù¬¼‘Ü×îR{Þ¾–xå1ù±‰³2ƒå: +8%<+ÒX‘î«Ó§ÐÂŒ1ÊcЯsMRUßãS2¿s0 ÃUÝ¿HÇèµ€|ÎÏaðÖ¿têr‰$¦óçþù(aDÆÀ€&óB6¿Ì¾^–,@1§Æ˜°sÎ!Ô«0År)¨Î5‘{ÊØšTQÊ’Š,å ìýqÑUe<±ä÷w
^›$±”\¡aQ…0\ŸP›5ͺtY
,ö~‹Ùž‚ªTè8‘*=U}®ÓP¸œyì»UTÿÆ75†(Pkf@g·\ûÌ<ÍãL[;`Òe€1I¿Ìá%Ùga}²0ÎZ!Ô™OB_¾œZ +H#=ËÇ!i[CŒcÚ…#ܬáíúŸ¯ß¿{ùöºôÚ-ÜjÙ²€åƒO}¼ç؉‰öî¡Ü…Ý8Ó‘±Êl6ôhBa›£îÁ£Ÿø n˨K ©¥3Ìây'¾_–wTmø`y‡‘Ö% r5ÀçcÕŸ½¶]D†MüoA?‹UQß—´ååüzà ¬Ô¸¤ŸŸš=¯"<ì[[¸¨é‰õ“ƒåia‡HѬ—!{àj¯¹ëy¹4D»`MXp•X—ãTâotáÅ„Ö°UcC…zÎ\-óœÌHt +˜#õ3}‹>×i7\îJ„þD਩£ò·ª;.+¡ŒWi~^†À5!Äð¼®Á¡†Rܬ|æÖl¹ ÀÚÛ©„;ö7Pñ«CûÊZwCdYsÞ.Våâ<¹¸æî¶Ü4»'b¨ýä7çÕQ
®Y i#êf€àFª¡Iqó2›†ÝzÔY蟇’× °@z[î@¬Íxž¼=mrŸL>g=®3öà¹\4+7ØJ©Ú®Z·° ºÏs£Ïo¸&öÂ>(2˲¡ +ÑOêpSH÷sÏ.ý\i")ÆÚÑ”s„”ÞÝ>MྶC(ï>âÕ&â?¢ahY¸r6`£I…âÄÆ´¢D“Ð +y€Š“$c(ŸÂ +kúŒq_¯Ë–Íæ«hCÄ° újX
ûv={?X]³Ù+]Wu9ô:_ gÑ–Cœ<8ÑB}AÈ>ió‰1 +[VnyP‚SVÝMujJæYtcP5±¿’=d#íº‘§-SÔx’pþ¦^À;îÎôð0³÷""°2ˆÐôÀUñ¯3$V®Ækº2
v+¦ú1-$–ÎýÕ·ÙAåù‚·!R¥OËŽÊ.€3Ü~U»îÌ3ò+M!oÛT{ß`¤RóU³-ïö”ðÂãr¿ã¯<´¡@L,àœ.¸CfɲÃ^Ò)Úýv˱¼-}¾[È·³H·ÍÆGù»†ž'Ðì".¥ì]õ¢zÉŸ'nü‡¼üº*“ÄYfŸOËe[g‘ÂÏGIâ¾7P6ùe&¶yø2ã¡r´D1«sHCÖ“[ΣÖNÅ0ä +eø$p†lB”ÔÆÚ„hýP•’¨4–¦=™<”MBfî.hb!HßÈŽ>0½ {ò²ú âsPătôÛ<ðWaJüŽÛ÷¢íèÐýº¹
.Ðògéì3î#1vx|ûRà]%jxû®5lSÆ C€r8gS×¼…ŸMÑv® e&Ї–¹¯±ûK„ÒÕúö:ªÙwƒ•¯ßß¼}ó#Ñä‚¿îË–y&"¯_ç°Íºx`Oá¶Ù¨¿-rçˆ_{, +ƒ¾XÝß;i
߬ãbi….t½ßÜzV—©Ór+û³dD¢(‡¯[„ô†²'Ç ¨XÚNER‹ë‰>g†¢&˜oÖ/TAûÔæÕùï€G`º¾Pꥀu
±)->yôM!F…JØ# ]yÛ/‹ÇÇée‘þÂY*ÆMÎ1ëac
d£,¦Y¯};™×Ë\ÆIÒκéP
^"bi̳X‘¤™o"ˆE'×Óy¬RÐ6‡]°½ùD×û›2>@Á×”Óüb¯ÄÈp¯0B?!FuûÛÃ,¹&e¬éiþ’ö"Üh
ßï×ÏúY)}*ÇßÐ/vyÁÄihêÞïxÏ[²ÉæàÞ;úä`ü7 ¨ÿŽÇô +%U¬áá‹Rá-¡üm[êyاâýŠå²bß0«!sˆ†þÈ×mð?tÔ”÷‹4mTá;Mõlã
T^ˆ.*ï›<¸¬—õ&蘫 +r¬%>Ñ/µÅ&šRY+£Ÿ÷ŒlVûÔÂgÝ°0]Rxê–È +¿»·mqÍ©ÝEœXm»slL¬‰³<1£)ÚpgÊ×ð~Èl¼„Z¹´<È¥E‹ÞPÅ8Ýs/ ¿õ!ÃAb +FLlÀSg…9qš†¼ƒ©8íø G'—ýÉüXF;|üÇ¢á ›Ìáj;PnEÒÑÉÉÁ1ñá‘KqÂÝmãÔ†äï³Ü- +“†ÅÑÁñ^šfÇÊMÓØÚÜg¥gŒDÇI’dC#Áeÿ¾Úð?µÇ‰û‘f\¿n Ö£f…Tp‘ é£4ösþ¿-É •ØÙéÿÛ7ËÒß“Ð<k1ég—ŠÂ¡`I…ŸẢ&‡Â2ɃÿÏe‡•<ý£ÕÒ%m:=¯éDÈ„)BK:Á%³$;â:@Zÿ^ +¤ÏØbŠ¬€ÒVˆ°.⥦õG‚¥pýY›T&Ϩ/WC²üL§
?$2º ƒÎxÚ¤®zBüU•™ØäF>£*¨\•åüädÖ0ÔÖ„aÓVOŽ?°¶Œû²˜?£-cáLYúLäÖ¸Îø¡“ã ,
P¬”˜¸Æ‰Èò©6·}¤ßýßÚ‡e×ä‚öÄÇ¡D`›<ÏfIklU¡†tv¤Ž³u`ë ÿq¿Qendstream endobj -1199 0 obj << +1239 0 obj << /Type /Page -/Contents 1200 0 R -/Resources 1198 0 R +/Contents 1240 0 R +/Resources 1238 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1182 0 R +/Parent 1222 0 R >> endobj -1201 0 obj << -/D [1199 0 R /XYZ 85.0394 794.5015 null] +1241 0 obj << +/D [1239 0 R /XYZ 85.0394 794.5015 null] >> endobj 350 0 obj << -/D [1199 0 R /XYZ 85.0394 664.0883 null] +/D [1239 0 R /XYZ 85.0394 556.4918 null] >> endobj -1005 0 obj << -/D [1199 0 R /XYZ 85.0394 639.2266 null] +1045 0 obj << +/D [1239 0 R /XYZ 85.0394 531.6301 null] >> endobj -1202 0 obj << -/D [1199 0 R /XYZ 85.0394 244.467 null] +1242 0 obj << +/D [1239 0 R /XYZ 85.0394 136.8705 null] >> endobj -1203 0 obj << -/D [1199 0 R /XYZ 85.0394 232.5118 null] +1243 0 obj << +/D [1239 0 R /XYZ 85.0394 124.9153 null] >> endobj -1198 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F48 885 0 R >> +1238 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F48 925 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1206 0 obj << -/Length 3647 -/Filter /FlateDecode ->> -stream -xÚZÝsÛ6÷_¡·Ð3‹‚çžÒÔɹsq®Ž;7½¶4IYœP¤"RQ|ýíbˆ¤(ù2×ñx´ -#
ºÍ¦\ÆŒÏpæ¡ñåÅ¡T¨æ™<ÛweAkôë’¤êÊÝ%v¶ô›õ}¹ÙöÄà:ÍŠ¸Æ»C-Áö8S¥È¨H‘ê`wÍuPvíÞù¨7oÍoÑQgÕÓoQÍ+K¯³¯ö‘úlˆÊÛ¦ëw×:Øç}Õ<Q'투(*<笶³e}FTWæö Ñ®ð7
²‘˜[˜º4 -Çdw$†×ªì~›ö@ÊS%MQP_F?™møíÊÛuâ*f
©êÏLœðP³”_6˜!×yƒñ\¸×?“ûn½üO۔ݲm–Ýzßí¡9±ŸD„:£Ë¢x®YFö“€&%‰ó/sïRJºb)EÐd›Ò©*”ß@uxÐQ«Ø—DX%+«¯FKðÉO·ïÁexMvŸ4ÔÚÉŠÖ.Òöc.£í)„‹D‹±ndÍ3]Ö¶l -ÒHhàéuØU}Ù¡‰sŠd{‹r•íëÞ+Y,ŸˆàÞd/^ËÔCp
ûhÓÎ8·b9¯fàÍtš¨ÔlÀuAÍ®¸Î`u±ÌëªlúîD¹„„ ãËx® F›p \$cȪe{çŒô!³hU^ÊjR_?ÛþͶ.7 4š»é°O’M#~{±„ÌÝ°¸9ŸšÖ» -™¨àñyúl -ªk<\§ —¤xQ2.ùDñòuU¢ƒä)#ó@¢¹š§ÇV¹ÂÅV =µÁñÍhœNÅ. ÌÜÌD¿b
NNøçOÂT -7'œ‡`"è¶e^ž'"÷‡–ˆ®Üf»¬·Ýt)³¦©œSÞl߯—Í·¢ÝdÕœ9@på!KÅ8JÍ‹-X 鶆÷7³| -±4q†¹[åB2½ìŸ·%Ÿ;,ðþ¬æM1‚ãW©e© ¾•YqÖ"8T^¶È!×y‹ô\æÞÛ®_v=à´®¯òS‹D§"Óô² -(¨!N[¼ mÛuØ”ýv5†ÀÖ]¶{TÓ±–©:4Ij´ûþ©õ0¨:ÙßõvoÝkjï»rÆߊ8
uN•.z»k¿¢&Å=õ· -`“Žâ¿ -º*;d=PšXŒ¦C3«kS€@’~,ú5\¿@¯ãw•å8ßÞ½ùpC¦GAv;Ö°Ss’¤"øZµTÕ£n£OÐMú?Ý}¢ -†bTʼn½GA׆õ¶H•wnßýFl`¦]ö„#ÞÍâPˆ‚(òȆ:` EëÁˆ¯ÅTÃ3Ü{ŠäwÈ4T"š -ùTȸ©ø?œüD/<×2œÎfQwkŠ(ÆàÂØ .â½0Fx‡ûµÂÛé¨QCîfÊ#ÀQÙÝyN¼ÚWvv£0Lž8)Ââɧ‘œø3…¿åˆK¹ªbäécu1ÂÒmÓWèŒH’²ˆÑ£Ÿ>¾!âƒñ<†4Ô…So„$}Þl~MÝð¸\G
¿ùÉJ§¨xâݲºk—Gï0¹<t8‘RÖ)ú„ÖïÛ!P„1./C$®¢C¶4ít½X…‰òeSqMï2ƒ{C퀼°v[=6MÂ.;Ði - øÂMDg<¾<ÓÌA‘òÛ¶®òªŸ‘2JB-XòR:Ù„——ã…’ï -•”êdÒ\¬ýJáW8¬«|MdŽCáÛ.ü˜¾Ûé.IIº“ú¯«.…NÏWœ„^y¼ˆèµELµxøÐîë‚H›rimŽÎÌ\æèÓMášQÂp¿ß5öª1Ûa‚¸Øí .0Wv´²ú÷0ÖÕ€M;?¹Ñzäßò]ÖÏ‚-0[‹—Þ†
¹ÎÃ-ÏuTÃeß.»6;-‰F¡f -™ÉÅeÏé²ãO[",©Ž–=•fêûª‡&M0— -ªep[8€ö—=½°I…¯ª•]ß—…ý´û×>£hˆß~"Ž¥ExÄ–q%ÿaKÊm•D—ÄAââÇIíî³…ËøÕ|™dTòc„ôä'YÓŒ,r2²[㜣¹‹Ô`Y30ÚM`¬†Ž‘–EöÐ\n„=~§X`¤oH`غ|x ¦©³â™F>ÓG,C©¬¨ÖÅpnžš‘=Gá>±` +1246 0 obj << +/Length 3489 +/Filter /FlateDecode +>> +stream +xÚ]sÛ6òÝ¿Bo•gJ>Ið1Mœ:çê¸sÓkûÀH”Å)Eª"eÅ÷ëo@¤HÉýšŒÃ%° +†¿½ÿD +—Àéꀲj™&Á9#|ÌÝ` ZUƒ—ršÔU/n|»«Š-ænÜJ²i„0€+–’¹[¿çSÝW!S‰ÓÙÚT%1fþx›^’âA’͸ägŠ·Ü”:Hž12J «^áöøV„LÞÁñMhpG©§MHæL¿N¸NøÓ‡§T &4LÌÛ]±„ +áŒäîØл|Ÿwn˜„2iXBÍì•7?t›¨þ²j¶y9e\9ÔbèÓ§É,VBú«¡ü&ŽÏ –¦Þ0÷ë¥ÌD˜Nñ)f;¼š6EìÇ*Á¢”ߊ|uÑ"U¢
ËÄu‹ìc]¶È€eåÞ´]Ôv§µ]¹[$:™e× X-,ÜÛ›iÞ‹Ž6†— +D鯿ÅÎù\NQž½;X¤u³wKŸ)ù/;¬‰¸Ë"0Cˆq[ùœ`´¬}¾$‹€û‰˜ žmòXvçêï}µ4ðv å +iŒyMÚ=¬+ÒöXH)ÚJQùem=Rô9oÇ9²bà8ÓWèXcB 7ÚÎÌ%>¹R§`“§:f"§5±NYBX$Ÿ/:ZoÝ8.ÓÅ-ÝÖžïPhÑ6±…ל³ß–¹& {zÉéÑíóº%€ØHš'R ®R$ÏtÂR¢8(«Í¤"`Q/) ~ؤÿK¹ƒbØO\©²w„°â. +†ù„¤ø²«ÊeÙMP©ÒØ–þ*=m"ÐËQ ä; ?NäYw8‡'¥r)›6•>˜.O4›$V¦¡#uUÌ +"ªV¦WC.7Í$Rÿ#UÒ×þ»Gø¸d#eȃ5¹f§]‚%ïÄP»'6½NÙ…;JŽßãø@•á¢ÒØTdAŸzÚÆc°b—gáÄ´mqÐ_‘Zl<™o:ÖRza×É–¹Øû•"œpÜ”Ë
Kì°X¿vá’õý|L{ë˜Áážõ}4&»Ì®$ƒòÑk‹„z%°øت®ð2ƲÎî\àrújœQ^ ÓÝa_»%ÔcvÓî“uÖûdm楛-Ýáû#̵d¨mØÜj
=ÂË}Þn.¦\œCLR<¹žrõ±.§\«÷“–®‰Ú&·Dí÷|yýø€5qþÐÞ²85:0i½Ø“ñ빋K|~†ßµ3î' +êdóMs,\•îFrZi-ˆ@K2l]áÇ+\àÕÞìttâx€ç¤ÏXˆ¼)WôLÝ%ÔI©ýþôé°Ï½JÝ/œ¶›¥Æw×aŠœŽQ+€cT’ëÁ·ÜŠ2õj”8Ãýã +]f.ôKøé‰BÞ(3ö®PäÉDLþÂAºendstream endobj -1205 0 obj << +1245 0 obj << /Type /Page -/Contents 1206 0 R -/Resources 1204 0 R +/Contents 1246 0 R +/Resources 1244 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1182 0 R -/Annots [ 1208 0 R ] +/Parent 1222 0 R +/Annots [ 1248 0 R ] >> endobj -1208 0 obj << +1248 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [154.2681 344.7581 203.5396 356.8178] +/Rect [154.2681 239.2989 203.5396 251.3585] /Subtype /Link /A << /S /GoTo /D (notify) >> >> endobj -1207 0 obj << -/D [1205 0 R /XYZ 56.6929 794.5015 null] +1247 0 obj << +/D [1245 0 R /XYZ 56.6929 794.5015 null] >> endobj -1204 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F48 885 0 R /F47 879 0 R >> +1244 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F48 925 0 R /F39 873 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1211 0 obj << -/Length 3744 -/Filter /FlateDecode ->> -stream -xÚ]sÛ6òÝ¿BòLÄà‹ øè&N΋s—¸siû@KÍ Eª"eÅ÷ëo@¤HË™kã™\,w‹ýÄgþø̤ “¹še¹JRÆÓÙrsÁf0÷ñ‚{œE@Zô±~º»xûAf³<ɵг»u–I˜1|v·úmþîWÿº»þr¹)›ëär‘j6ÿéæö=Arz¼û|ûáæã/_®.35¿»ù|Kà/×®¿\ß¾»¾\p“rø^x -/|ðáæŸ×4úøåêÓ§«/—Üý|q}×Ò_/gòçÅo°Ù -–ýóKdnÒÙ^XÂó\Ì6*•Iª¤êâëÅ¿#ÁÞ¬ûtJ*5I*”ž-¤JŒ“Zf KAk‹,Í-…ŒZ|J˵¼[/…dfÑ=o-?]3Wi"µÈf}Â#ök‚¿ìñç)¬Tðÿj»®¬.’eóî±lý¨AYÞ~P¦G@«$Ó,®øå³m gÀD°$7°HÂ9”UE—žµ‹èykwOvºgkën¿ÒswÉÍÜ.÷\µôiQ5AèCÙ=g󯟯mø-Šê:á*ËaÄ“<M…“t
8ÎüjûPtå“¥·¢nvׂíJÎæw¼²ëb_uôR¶ºâ äŒçÜ+¢n&tøJ2Ú}¨`{O“TþÅKãØL[<á‰f:}™}Ç€–†/†¤A¸…V2É…Nû6‹kL-˜0‰d`¥¸ÖÛž6R¸Ãd°J,çóåBóùü/æ×#Í -”}Òn]Z¶–hH ÓDpò¥Û-"3óçKÁæÖ¿”›me7¶îìÊjzúX -£|´÷*ÏÀGµœõÕû×vL ™Cä\Þ_³§…Èœ\ÏÎGÐ'7I–êWbcÄB}BÄX”«Å¶iª‘ÈÈÊ|Ö';ŽŒkÌ]õóW؃ÁØß¹hˆÞl»²©£·ì¾m*ÛÙ ¿¥©T›è×.vŒ2gQŠç6Œ«fYtÖ¿þ¹·»gÞ¼÷°µ‹aÍÆ@TÍÈvB:JqóXv>eõ^Þ•€„ËùoSÛEÛAŒl»rÙŽSVžfÄYîiÌ~˜° Õ›<ð¿YOD[Hh\ȳ‰‰gI.!üÎÊ.cˆ<©Ç”´D®æ˦ªì²ó(aÍEE€UÑ4r¶Ï¢òS¨¤–hüÎR¶¯+Û¶žÌÖ.Ëß@§z&X·ßÕ.: 5îóšr¸rfÀ)© -¹I&Ñð±µÎ2È“ ÷EKy†Ïôt\×ϘéI5ü$˜)¨ ¼nNwؘL`†'FòãJ/*uÌD@%•F\'ìDõ 0tå ep‘tÈÁ”Î1·~™§"nŠgÒš0:Q"•AmTÏÞ»ÜÍ‹å6é;Õc¦uy ˜Ë®^-ékd:e^¦U³×D6óÃc¹|¤ï¼QÇÕ~³%(jãG
Í‘= -…>þ„¯ŸR¥âty¼ØBp(ÝÌH ãžH4Ž9ë5AFÔ&‹³d‡¼)^iúXgÂlÀŠÉï;DýQíI77ò<çˆ5f=Ì|àq&Ëõ7e>™å1óá8Â^Î|9Ôx\gGkÒy†Š6nöD ¶hÎ8rU?<We[Ü£½ãËͯ¾§zl‹ó¾*vDŸû^±‚G4Šå-ø âÞ<Yï2h‘à%)“èZÖÐlŠ£½…ç´«ážeyð´í®y*WÇ
;u2`hÀ¸ yPMÔ§û9#1º¬<BÉì÷Šè‹þتGT§Ýkä[R0ƒ2·G|dk缧”z¥‘7l2ÜÈ\C‘©Íê#¢¿"Í)Õ‘>T"GE9ylVÎ)#àœgJélˆQ™I y¥ëc½b"Ö”Õl ºÎ³Ü#ÖûAPU`~<`À?î{wì«Ûå®ìùG³žð=è˜Pæÿñ½±¿BÌ‚œÙ_Á9ø¯,yL÷G]NCOÌû{5étë51FÔÎÛšÂ2Ù¨Wl‡uÆÖ–« ,45m÷‚A«B:Ë=bM°ÚšÄ¼=dÿ÷˜Úé"NM-…6„å/›ÃbK
×yÎÔþ++ÓýaSƒz*¯l{ÄzMŒµó¦twüSëa1µ€…»-ºÅ’º¢¢]´ÛbiG6q:+}^Œˆ5!ÇÀæ´HŒ†Æe ˆ?@Pü˜òa|(<pOMˆbTÕÄŸÀÈÐÃõðÜ߬‡8ûUìر"Î9‹Ž^—ÅnWþšÃ“Þ±!ý]EÌU¡”Œ….¦žp•äȃ?L8„z2
8òÁæÍËõXìŠå‚ª0 MËÌ°ë nÃ#±Ð eÐpK CñL§@˜*è•ö×
Ý!.ÌtÅ=ˆ%ÅÛìÊŒ$¥ÂܺX–U‰=&½WM±rGáH¢RW#j¡<k·™( -=~¹½ùÕ‹ûÍÚÆ-‘
ûÏî‘öB»¥·[Û]Ažòg -ëyë—¾$F–&2‹]ì«Rì¦V‚V¨þÞu8³U*·H춶‡ª¬Ãñ]·÷ô˜o¹´[Øé7árau’”¦Ë‡šî/ìêÅX*S–¤™’çciëåX±paÅjU¢HEµXïšÍ¢ØwAú“©%Øã(Ì -ƒ ”‰óF¬ ‡]Œ€‚ë¡ŒáH(W^-½,›šcƒwP¹ô÷C0so‹§Òõ‹øÑšžèqî klvðˆZFŒSÌý]!X 6?<ÚGÜ_¹@‚x–[¢e–;Â!H`ýQ‘4ƒçŠØ¼j霾OÍ×MU5‡HýÝíÕ§ëÀw5vÞîòn“ˆe’,W„õÇ@ráÃŽœ^àÙyýrÞÓ/À£™ãK‹×{êæg,’ñóW‡
0¸=¦)Ú0 êïÛ(•8Þî–$˜?1GHéÅ»·t¯é°ÛsýgÇÓt7¿÷I‰ç<Á‹ÔANêD<œû‚BQÆ‚€>O –›SÅÃ>2Äù²¦3¾àì*œSàšÞœÌô-ÂÕªÄÑ}³T¬Ãqܺce€‡3G†gŸÓ^ÅÑ*:xΩÉ?u pÂmú· -¿8PI‡£f_ùdîœãP¶6º]Õ‘àQÅ*žý
³ÿ©Û{g? ؤÏhU\Á~/ð‚7‰c¬j0,⤋8,Úo-Ö
›zhMÏO¿ÒóäŽÖ:°zlÚŽâ¶Ìûq[Ê$3y8õ]7Mâ…J–ÍfêÚ(O´–¦wWÂr²\äâÔ|Dz ìû€çcÀBBE¦RyrIv,-²Ú\´flÎ=7EYEÑkÛMÝ"Jž¤,Þí"'¿˜×xzìnôxÎÂ"Üžz³i 0ú91‘\ùh}l~ÿ(áá›w«SÕÈ«YH«ù½rRdi.†=½6 ÅŽÛâ‘+²`xžX0@\P…çÁVªª4@}«›CíaöÉÅ\€B®Ø?` à.¢>{21ÃKí~Dƒ2~ãgúFå -8v˜Qá"•—eÃèqtŸ~[5ƒŸ¦Š]MÕ¼l üv2“}=§
eÃã¦[N¨uÅK?°Ë®ãŠ%Ô“ô£ø¢ç²*¸!HeJøêº73àÖy¤:#ÇTÞ1ÁÉ7©Ði’ϺHä°R£êšoû-úP -…ÚBÉ^pD5+N"&u5 -%Û?‰Ah\L‡¶f€…Š_
Z¡ÞùHÏKÚ½=ÓܺLC©§¦3E®ŽBr߸T/¼TèzOÖ¨Dô¹ö›K¢©"Mú0…µž_Èi÷š÷˜þ¼L[ûFnáH±~îI·zé—Ð2M”œ<Pañ˜ùWÒÇŸ«r¢/_A5 -Õ®òSÉSi’ÔˆlBôÿ7k‚4endstream +1251 0 obj << +/Length 3818 +/Filter /FlateDecode +>> +stream +xÚ]sÛ¸ñÝ¿Bo¥g"ߧO¾ÄI}Ó8mâ›^çîh‰²9¡HE¤¢s}w± +¹¾~§l5µeÈ#ÆKÞÊZ§RXóêz.™ˆ²j ë—B½½ÿL¿¿îòíu·×ÜF9 +Nž$ ÷_x;d?
Mü[^‘&çRë˜0œ-Ê0ðãDG+÷M½¦_O^\øa¢eÖfSH´‚Ð F +#¨ü¹ï©CÅ&‹µì<÷ãõÜðèþÑíH5@T +mgË AäìëÒJSIX½¾›íAðún-fok˜Ó¬?@yÞ'íæeÄ`}aŠ–¡IÌAÞtï²Vb£—kÁ Ób½)ó5i +ô +B‹VgÂ#(¬‚+¡ÎGÇõ 1c^,盺.G& +ÓYŸì86¬1w +Ô´£ªâ;nWΪ$ ]`Dël ‘ x˜éùHÓÇ:j:¬)ÙJ¤”ç¹wX쑪åà
þÝê·‡Ýu³Ø=_©W~û#&”ýüpì{`†¿ cögpÎÊþ…)é~¯ïØóþZM:_Àº$ƈÚy[ÃÝH/ÙZëŒ,:v'lÍÆ\C>:˽Ú`?´5 û8>dÿç˜Úñ$ŽMMÃ&„¥§Ma©¥†ó<gjÿÂŒÇt¿ÛÔž`\Xöë’#jçM
2qÂ.œ«öΚGBví6ÏÚù‚6DY3o6Ù"ØT™³2tHc!æfDl
ìXúRøãʼnúûÌw´ùPŒªy€øèYjÜ~ +¡Èt¹ê¯ã0v/Õ„+@I!<x„ùK(*uØ‚#Ü´y¹ž³m¶˜ûkØœ±ã{Àª7ºñ÷1°ÑÊÖ9öîú‚îIÜPF?iq]×âÂH›=ú«Ç²=\ÉYIJ…±U¶(Ê÷–ô»¬³¥¿—Ièv€´›Æm<k·˜( +5?ÝßýìÅ}MÚzê²Ãߟ)˜íÔsúõ”Wx[B¶àÏ +ãf(c8 +J•×_C?uE±Æ;¨Ô_ôãÈcþœ}+Ü®1u¯\‹çZ˜c½ÅÀ€×@´q´ÀXcè{tÁJ°hïN(Áý•‘$8€'¹Za¹ƒ 삹ÿ S$ày"natNߧ΢U]–õ¾£þæþæÃmໜº>~K¸b‹ª‰;,K“жã_Žä‡ì9½p÷Äé—óž~Þ™9þhð²ÃaOÝò„ÅB2~þꣷÇ4EDý}¥ÇÛÝr÷âóçå)¼xþ’°›sýg‡³t7¾óI‰§<Æ‹ÔANêØgÎ{A¡(cF@Ÿ'PËu…©âiwxËãEEg{ÁÙU8À9½:é[„«R‰£ûf1¨U°Äq㎓ΞyNd$—ÑJ:pN©I? u p²mûw +6uÓîXÁùjü[ª‘¢‹ÓË<׿K©Ëð:`O%öê]铹sŽ}ÑäëÑEy +í>/KTT!h€Â·‘•‡áÛ8‚B®Ø==ÓËHPÑ‹'ÓÅaøAÿ Stßø‘¾Q9 endobj -1210 0 obj << +1250 0 obj << /Type /Page -/Contents 1211 0 R -/Resources 1209 0 R +/Contents 1251 0 R +/Resources 1249 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1218 0 R -/Annots [ 1213 0 R 1214 0 R 1215 0 R 1216 0 R 1217 0 R ] +/Parent 1258 0 R +/Annots [ 1253 0 R 1254 0 R 1255 0 R 1256 0 R 1257 0 R ] >> endobj -1213 0 obj << +1253 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.9497 550.9859 182.6031 560.2012] +/Rect [108.9497 443.7983 172.6404 453.0137] /Subtype /Link /A << /S /GoTo /D (statsfile) >> >> endobj -1214 0 obj << +1254 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [293.8042 505.6313 355.0043 517.691] +/Rect [293.8042 398.8702 355.0043 410.9298] /Subtype /Link /A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj -1215 0 obj << +1255 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [395.8905 505.6313 444.6373 517.691] +/Rect [395.8905 398.8702 444.6373 410.9298] /Subtype /Link /A << /S /GoTo /D (incremental_zone_transfers) >> >> endobj -1216 0 obj << +1256 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [309.3157 474.882 370.5157 486.9417] +/Rect [309.3157 368.5472 370.5157 380.6069] /Subtype /Link /A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj -1217 0 obj << +1257 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [305.9683 444.1328 367.1684 456.1924] +/Rect [305.9683 338.2243 367.1684 350.2839] /Subtype /Link /A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj -1212 0 obj << -/D [1210 0 R /XYZ 85.0394 794.5015 null] +1252 0 obj << +/D [1250 0 R /XYZ 85.0394 794.5015 null] >> endobj -1209 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F48 885 0 R /F62 995 0 R /F47 879 0 R /F14 685 0 R /F39 863 0 R >> -/XObject << /Im2 984 0 R >> +1249 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F48 925 0 R /F62 1035 0 R /F39 873 0 R /F14 717 0 R /F41 910 0 R >> +/XObject << /Im2 1024 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1222 0 obj << -/Length 3749 -/Filter /FlateDecode ->> -stream -xÚ]sÛ6òÝ¿ÂoGÏT($ñè&NÏÖÍÙÎÜÍ´} )Êâ…"U‘²ãþúÛÅ.(’¢ìäîâ™h¹X‹Å~ƒò<„?ynb[eÏ JsžoÎÂóGûñL2ÍÂ-†T?ÜŸ}ÿA'çVØXÅç÷«Á\©ÓTžß/b¡ÄÌï~½ùpýã§ÛË‹$ -¹X(®¾"èÇÛË_~¹¼½XÈÔÈàÝß/?Þ_ÝÒPÌsüp}óž0–~NLz{õáêöêæÝÕÅ÷?]Ý÷{îW†7òçÙo„çKØöOg¡Ð65çÏð -i:ßœEFií1ÕÙÝÙ?ú £îÕYùÉP(«*=`*…±Öœ'ÆŠXà -ð¯¦.¾»Xhe¿*êf·Éªê…ž²º}.v-=<—ÝÚ£é÷w¥¢ýö9Û]È4X2™{(VÅn—UH€Xt
vëb@Ö4¼l[ìžú…šÝ„v<º¢ÛfSà€R -kŒr›jà5œ VÁçºy® Ü“EÝѳ›~i
-–‚$h -Á‘ì1‘=¢X}éö„îK–„]¡!àôä@×6ÕOfÄR^´8reR$RÆçq -p˜Ñ ×CD‹!y9ãº{*Ì&ëòõb“m·År³.à&lÈD pNæu>zªF†Š&“DhiÓ1'×+ÒÉ(’:§Ê -ýBŒÍ&¬V)Ó a¦ -ý -˜ŸËzÿ…Àö<À¦EÄdÞ€}nvŸ "»iö5¿šÑÏçbWÁh>LM²AÈ™tÛ3tÿî#7u]丹vŽuï^`½–~1ÔÔí ª®\8SF±G"_í^ÈóbÛ‘)K’bù—´ßk›üsÑvß:ñ#èUͽt8ªÂIÈо˜xt–ã]ȃ‘bÄIœ.µ.‹¶|¬:Óó5°† -@ -ˆÇ^Ï(&‘~žj†Ÿ‘Ÿ2‰‰Çý³å#¿§,FbõªãSRD6òÁ¾^’3"nªOI -ˆœ•—8âË+æÁ"ÁCYSBrxñ0#Â+¦ÉjX¶¶—_ïÚ¸Üë)ûÕ|ìAøÔžê—IÄ,ü›m³ËveÅÅWîÜ>yõ¾²fvCo -‘ÊÆ“là››ˆ4ñù?}H±«‰Bd¤l&b-Œí›BVªدÒìæd,E›è-‘hìöݽQCû'ä<À¼”28™GûŽiúz<¤:÷TNûª+9Œ²^iH‡_]½§šY~”õªPh¥“ñúÜÆßÑ·qbE^qÎ_àú\ziöD³v)¢Ü¶•r{i‰ˆÂgLEfÜ×|½«òD‡Öf„ê»>LÚPZ«S‘¨HŽ#ÐÔ½ ç)øª,_ƒ»Å<L[;ßÛ -ûŽS3öî'/¡ˆ”Ž&ÉÈkXÁÁEøÿ½)H?ÓH¾íÞä[Ú§%Ò(I^W¿!Õiý멇CIí -ÆrW,»gh‚£~žj†Ñ–c)TÊ1#—Žl^ÈÀ±áo_´Æ‹Ç:ëö݉ˆb"ŽB}R®^¨[®ZðøET[ãÛ¤0Ú!>Ìá"± Êáäí«•Ó–»¢ë¸5<¬kú"îâ½.()]ï"¢*ØŸŽƒïÓ¾ª‹¾><¼O{ÜV™¯¸º.Ë?Ÿ¾‡R àøÞˆ˜CªWTÊSáÖÝ/¦.“…!ïMj__ØÍ,<v¨D…j¼ò^f®^¨úAÍlixì€Ñ‘`“Éç¬}—Jm—íúg^ -I(LÖùvRƒdÒRH¼1%ƒÀ„Ør®“BÅõyƒ»œ IFDV&ƒsϳ®ÀÚl’¼Ý±:Nÿœ?g»zn!¨ "5Ã9]8ó'T¤|1${ÖLšRcåq_pÚ¾¿ÅÊÃ184á\§H)È'SŸ¢îXOç¼¹û¬Ì;-˜NN–›ÍÇ
.#ÌÁ?BþÒìf -m2t4MÎ5Ô£û
ÊXÝgSi°¯¨5¢}gEAžñè €[7mÇöÜXKÂoܵ3¢Èð‡hp9 Û6aÝí‡w„†câ7}ó†‡t*É‹òä›fYÎÞxP´G*š -«7%zBǼhÇ‹»•rOŽh&øµÿtä|îúfqùþý¸¼ýxa•Ó-‡þOQþc5º¾¹G?$N}Z«!HèÙ¾BØ×4ÿóg·‡o’£Dè4Uó©”"‚ìÐ3…r <NýøûÜcÖÿìð}[endstream +1262 0 obj << +/Length 3836 +/Filter /FlateDecode +>> +stream +xÚMwÛ6òî_áÛÒïU($qLS§›¾6Í&Îë¡í¦h‹ŠTIÊŽûëw3€H™’›Ý}:€Á`¾AyÃO^šT¤VÙËÌ&ÂÄÒ\–Û‹øòÆ~¸Œ³òH«)Öw7ß¾ÑÙ¥6UéåÍÝd\Äy./oÖ¿E©Pâ +Vˆ£×¿¼{óö‡O^]eItóö—wW+eâèÍÛŸ®©õÇW?ÿüêÃÕJæFF¯ÿùêýÍõJyïÞ¾ûž –þN,úáúÍõ‡ëw¯¯¯þ¸ùñâú&œez^k<ÈŸ¿ý_®áØ?^ÄBÛÜ\>B'ÒZu¹½HŒ&ÑÚCš‹ÿ +NFÝÔEþÉX(ª*=a`.…±Ö\fÆŠTÃ2ðfS
ÕÕJku»±îÚ:E%óˆGêv¬Úuµ¦Þ]×Sc?„qüO¢b?nº¾‹±~¨®d´êÚ扆†ª¨úáèت'(MÔó‰a–ŽêêqÈe8êJJaQŽîWãXmw#P«”‰ÆÿSØedÀ¦Ú†!˜¬VÈ8™F¶ºÅZ3e—Ô"ÏdÂ(5P¸çÕ‹fð¾{ªÛû»@3ç%úªÜ÷°˜YÜÔä"Sp•~Ó¦!ä²pÌÆ-áh#–ÎPß·¿9æƒãÞJåȼ,›s1\9JuÑ®©Ñt÷¡¿Ç¢oñ„®³†¡¸¯—Úç™[îã9n$¹ÈeÆ'+Öë·.šÕ]ßmWeQºc%êÄeÈLÈTúÙå¸/œ°®‡â¶©ê~b4º»£‘Ùf##µ~9'Þ*ÑD#H±#“¸(S#l–Ï™¸.F`”N‘qÝçý5ÈØ襡$-ØzÜT-
"¦c)‚÷;:ÝŒvx„››†)Õ´´h¨æÕ÷s +ï¡r'„?÷U_;B +óg··)œBæp§n`Fœ›û=ŽUµ(¬&zÛcU¬-*•Ntq;,˜A‡v9•œ<.µ/7!-üÌqC\}úxý½ 8Y>7üoË‘üâ‚’ê5a~Ã=lÙÎ$PØœñG¼wfijðxcøçþ`nJ¶djò˜]³ÉóH*ÁPŠg¤™”)©ˆM’œˆøi5Å¢€O.D̳-Ær³Ú»]µ^Äô@\Â2Sl’9OGÀZ dæ½³Lhió9%oïH&“|3a,ËýD„=[MX|T…Š™'ÈpçZs²&‹Þ¾Høœ4 +jæöNWnâ ?Õíþ5‡'° +Æú†¼hÆù4Èg^‚²cñ™nD +£Þ¿gÑnßï:¿N½x%Ÿ—ݾ‡¤a}ÒÜ%6‘dçÍÝë´¹X¸yý…|<yÄu}‡ +|Às«g”ˆ³DŸ''`-Ð3³S&cgÒ9A¿W>³{Ê¢'Vg
Ÿ’"±>!uÙ#2 `¦BHÀ¦+\8Ö‹ mõH}ãèn
ßüi[€Nó¤788‰’ +¯y(ìXòš*Ût÷÷Ζ%T£ÁNŸcã?þ³c×ñw‚m¶Ã‰ñ–ý°B•›¢½¯x‰²à
ny}w9Ûz=ÎPÃÿR‰a$ú‹-ïƒ"1ÐÄbXŽ9< zçÏDb1ùüJ”ÅR?2äÐ{¾j45´»ýßò0Xà5µ(rDE +~PH +ywRëЃ:ÃFÐ:ìPÉAQåJ…ëU\dpÉß®©F*}Ј˜é)Ž¬žü¾s5v{º~†DuÈ@^VGDpæfá¾((±¼€¥)¨ÿª("ëDù%ŽøüŠi°ˆp[·‘&VdD8bÃ8\ +Òƺ§WÍy
ÂM0×çÉXtÌŽœJ¡ÒXÎ yå(À†ŒáÍ[ãûÎ}[Œ{öñ„Ä/ï0 +Y +¢à‚C{>ÅÖøj)Œ†+ÄÎâ®2¢=§ý-wå¤åc5Žá;‹CvRýIЋ¯º ¤ô¸ë¾Ù¨ØªÎ]ðþi«%æÓwMáó®q,ÊϧŸ£d¢…ŒyA¤&XgDÊcáÑÝ›/0GCôŸšÜžßØ#-l<cv¬DšÄj¾3¬Be$ªiã‡üp,„Ñ•`ÉG®¡X¥£a,úP¨âø+IÂà,ÄpQOœ‡°ðèD[J/
S–$Áœ0ñŽªæ +Ä’à3í•ŒÊG¯ ŽI’™6~Æý&¼S¶G/–þôô!Ð}H/ŽkH´û¯,Ä®ú:[€+$Ã!ó~ö!ÈlaÌ÷ï1Ï_àL +¡Ž&׿/&ˆD/YÆX + ÙÜb<Á:#ÆË}#°©ÊÏ+¼õáDvõÂæka÷…ìêh{þ>(±‡‡¾1„Q•Q³ú#„ohìëräúRÀbm¶/J~ˆ½óäâ6†§v,¾Ð¨+⤪‹š·]w[j'hLM;Mª’¹T†‡‡PÚ¸¦ß®¿õ`«§¯øN:x¼ÉÚ “Wú2<>4ŒøFé¾ø̽uO§Ö=…p†m‘€²¤/êøIV§>=<ªníñ³8LªÂ'*}¦¢7‹u…,&†û{¹¡AvTXȼ2eÇ„Ðz©"“CÞ™„¸Á½.¸$#>Ðs¤Ë¤+Ð6›e/—D¬_?þ?(Ç—6‚Ì Q”Ó»3@EÂ)“±Fͳ׹ð¸9&Å߉Ýbáa›x©^¤Ä“¹
_}’œ.Ys÷Q¯7Z°œ<Ún1jœ—¹Œ0ûè¾þ\¼ ++´¶ÙIóè+F Z/Ù§8D,ÿó'͇sLè<Wˆ‚CHÊ`& + '~Ï
;ûüœôÿ endobj -1221 0 obj << +1261 0 obj << /Type /Page -/Contents 1222 0 R -/Resources 1220 0 R +/Contents 1262 0 R +/Resources 1260 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1218 0 R +/Parent 1258 0 R >> endobj -1223 0 obj << -/D [1221 0 R /XYZ 56.6929 794.5015 null] +1263 0 obj << +/D [1261 0 R /XYZ 56.6929 794.5015 null] >> endobj -1220 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F48 885 0 R >> +1260 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R /F48 925 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1226 0 obj << -/Length 3109 -/Filter /FlateDecode ->> -stream -xÚÅZÝsÛ8Ï_á·sfjø%JÙ4íew›ö÷>fwKŽ5u¤¬%×›ýë @}زsëÌ53Bü -3Y>]„“Gè{!˜gæ™f}®}§ì$ ’HF“Ū7V„q,&‹ì—éõß®>-næ—3iÂi\ÎLN¸½{K”„×ïÞݾÿ<¿º´zº¸ýxGäùÍ»›ùÍÝõÍåLÄFÀ÷’G8ñÁ»ÛŸo¨õ~~õáÃÕüò·Å7‹v.ýùŠPáD~¿øå·p’Á´¼•Äf²‡—0I"'OÚ¨Àh¥<esqñ÷vÀ^¯ûtÌ~ÚÄ‘:šÌŒTLb¡«Í¬IRÈÖÊRŒYÙs¡•—ë|ùeöôÇát…ŒAi+'ý1$·\#¢UO´P*6Ž†²¯Q6]M÷ë¼Yç[z5>ü‹žÛKOóeåžÑÒçç<ÝÖüEÕg\µ19¥Çí'~Í2b¬k -ä58½LŸÜÚŠ¶)úœ·òŒzÐb+/¿Ú5³jÕc{æ@¹–Ò5Œ‹ÙÌ
‹ŸrŽÂ¦™A]pwO¬Çs€'ÏGbâC¾©öÔl Á㊞¬ ´º‰Á£›˜HzÃ{q†kÂ.—°µ¬Ê¼›—Ë&x¸C›Œ -,ìW`˜«Æ*/iktò
Yödj3PÅ…ð<›ÚzL§S›gêÕ³%Nø(³Eak(êÏ o™Ž¥¦™ –&ˆ¿]X-D±=FrïÁÀVÚXo¿‚©ÎÑ1±Á•»$.öoÈšj`ŠŽW=¶Qe8v£ñ(å¤lý2;*"_ß]}¸¹(5 -±‰Õ0ÜNÂÈ=Gy«µ5ñYÇŸ‚Sõ¡I¢WðÔã:(ÏÕ9¬Þ~=)s^–kDƒPÅCN Ji›|ªÀ‘¢ª(fTE‰G<ª¬ò¨¢C<¨‚Ϻ Kž@dhµÝ-”XùZFȃe÷ÿ-ŸŠåyhõ¹NC«åêAö›XnKG¸ŒÎ‹o¹Fäë0È*°ä
ø'y]GÓg*ɨì×vPwi^“ë7Ô—nêŠZ¾PÖm -¢Ÿ#ó2dW‚PmæK{ væñ5'‚”ˆÕ÷Xs´µ"yÅ“=®3žô\®\Ê·Õ¬¬fu•Îšfs\QCø'">¯@Ë5¢ÁЗ$¬CØ—ÂW€Í¶P‹:O -}p#P]m‚DZq¦®Î¹Âé¦á)EÉïóŸ>5ì)é4Àðfžà¨úöjGÚ\Šï<Ç2¡9¼>×iäµ\#È›-SÊ#üÁLˆ8¯FË5¢Ç`ʱ†‚ÇŠ¡"„?Ūà€HÜÁÒ:¨á[jĆÞÂfw€C:î…hnØpîÇN7Gá¯{¾–‰ _#ÝûÚ!Ðê@hq€ÀQ -vòÅ^;¬‹åú –&C·Ö´ô -m¿]èŸDfU~ÈîŒ}Pª—õ¾žKô¢á†Ofp%GÚWʧ>×éÞr¹«ZŠôãxÜVÜrH$%AÆVj(šoÇÙÞ`*(X[9(OyŠD«Ý†z\†N|BB/ñP +1266 0 obj << +/Length 3275 +/Filter /FlateDecode +>> +stream +xÚÅZÝsÛ8Ï_á·sfbHŠõ˜MÓ^v·iÎqïc¶û Xr¬©-y-9Þì_¿ +_áB~»øåW”²¼ð==ÚÇï‰8–£õE •§¥euñxñÏfÀN«í:¤?Œ§Œ(UG‡zŽ"{¡‚&Tàl™ÁŠB9Þ^šñn•Uø¥Æ‹rKäUöœ¬ˆ¶,«ºHÖÄ"ÇI‘}ä+"¥%Ô"Ù^ +3æÑÓl›¿d)},lK¹&¾éû"ÇZrÏ‚¹I<)¾.Ó|‚ÚL„ðb¥]Ïß—v0ÒÓ+ÛÙ!¤ò°hFt4ƒcÏø>j¾Ìæ_'´Tbîª1”žŠD7ÙlV9ªDRêK5®Q©H(÷E¶%kÎRT^_QÓ5ü#Š]9’>þ‡¤ÃyiË´x†FŒïjâJVUÉ[1‹X1PE'rOSd,PL;á°J$Ck@ÂôíüsM$\ +ò?ûd[8)ðs2€@L<Û'»TëTyʺªMYUùÓ*#|¼$«]Æ(sÎüX°n@d¢™ŽÅ‘8Ÿ Nâx {JGŠyòç¢ÜfC+6¾YÙ)àÂp:ÐñÀíp®ãj»ÏWé<Ù¦GðÕ‘>?Ã5 @Om©#iL_‚ÙÒDA ÙÔyYPÝÑvº”>,¡œ3â¡J‘*EYLêl»Îà‹j<µòF(K“.Îõ§ < @p#M^ÍØÀ.æ£ØÜ!Ö!Ž@ø}òZñ§c¡‚wmø¶¢¸æÀ‚o×8xÉûÊ]ùGUSp’n£C¥»b¢¬“z¾Ì‹g'Ús¹Íëåš&@GÉÄ@¼l/ O +ΰ”Þv+"3ág²ÀÉÙ¼æx»NªÚæÐøGYdU3ǾÖ5ÀJ0°w¤Š¼0r>áu0odÊ0ÊÊŸuA×aª+Øv`khêa…l.µôB¡ŒNJÇ@UU;ö, è»@Õ'÷0áÅ|vw¹NïᆫÝÃyQgÏ`Ý×ãM¬¼PC}V€†k@‚þ&6˜n›¾Ù´kqå£ßµˆ3$)ÑTkå´,VøŠšìæ‡ÒÛˆÐnì*€£í%\*Tè ä!ÆÓKÇÿâM‚›Ð¼‘X)%ºñO)H¬ +á48ÇàÙïyÅ] × +%x¾Áo Çjv#(è½õš&$™ˆ5§1K=Î:£,V¯Ôœ6+»Ç)°q\Ðfe3OhA-Üü实”‹f˜¨3ÌÀÈiøȑNì°Ø•=ndZ™ÀdžX2gãÖÀ#1ñ)[•{ªÖå†T²€PkE»0w†;ð¯nZí·…€µyYT`ݬ˜ó‘¯;ÔI PV‚¾ËÃün†k(ÿ’Ú‹tƒ¯=éà‚(ðT +82WWÔÆ×WPsIsи ºõX2+ ÛD„24—æµµ(0GžU¨ïy$¥"RoDž.×K:.›4eÛrR”“ªL&u½:NaûÇÂœ á oKp‘}Ø–ÂåõŽ‘ZK +ŒtÑ „ßvÙ–î+JÎÙ–<àlö3Q(ò]‹°#Pv~‘èoðžçp÷Øí2Å]úÕθ5qúSÁù’n4ì üƒ.?ËoÏydƒ©}ñ]'´„òðÔå:ƒ<Ç5€¼É<™/ƒ¬DÀçÅh¸äè-Ùžo"Ñ„ð' A¬±½¤@Z5üêBØÐZØÂìpHGÀ½ÍÂ
+ÖüØháf)Ü»ck²5Ò-!_8@à +NQ|ãÛ« ~~àÛ{Q xS·ü°á;7_±=~]uïþèܪAßàüÈ¢Ç?=þD9ôßWÉ3‰uËõîþñ§ÛÿãtÊ%•iF—D5ç××f(Pûš½RSµ,w«”ˆO<2œÓRjuã±³¬ú¼¡ó®»ÕíT8v´6gK¹aA
uç]>Û+ðeMÔfá@œNyȧ²^RmŸS-äó)“àXËT¢’=ªñÍjØñ¿(ãÐöƒMêI_Êïáá¬
>+|Ãÿv¹Îì@Çeq´}ÔóÍd›-¶YµŠüJ©è¼ +âÛ>¿cBõñÏø +$]¢ ~z€}æåz.à)_ap +"?qÚþH±¦C2šu +Š|Ž8ó9]«BÝÊ ù§H¸+p©Yš„SËÓ®&†}n7ZÓ%²oáTÃqä±jÊí¾ªûuÎX¼îÚ*¨«@2;`®r{Ðå$ZCw‡à…Ý`›¶kŸŸÂð!b™Ï—5)²À¦XÐI·Ý¡¡{+™–Ù!»UöAÂ^TûfxNÔóš;ZŸôàQäÉ(|ãU¤ÃtÚ;&ûrKÛüø=^x;rnÖ†éxÚž?W¡µR½yù¥,–Ík¦‚„µ¡‘i²Î|,ZìVÔb}sì\9:.‡6 +¢ŽË÷!jEìÔ>¦m!žvtúݱ*
(C>’†Âz|‡º@z³MñCʈjüc+ +v4HÂLˆäâoµãcÀvç± )íêÔᜋÔào8ü‘s;ÿóäÚ_ø«sⶠendobj -1225 0 obj << +1265 0 obj << /Type /Page -/Contents 1226 0 R -/Resources 1224 0 R +/Contents 1266 0 R +/Resources 1264 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1218 0 R +/Parent 1258 0 R >> endobj -1227 0 obj << -/D [1225 0 R /XYZ 85.0394 794.5015 null] +1267 0 obj << +/D [1265 0 R /XYZ 85.0394 794.5015 null] >> endobj 354 0 obj << -/D [1225 0 R /XYZ 85.0394 256.0608 null] +/D [1265 0 R /XYZ 85.0394 186.2624 null] >> endobj -1228 0 obj << -/D [1225 0 R /XYZ 85.0394 228.8008 null] +1268 0 obj << +/D [1265 0 R /XYZ 85.0394 160.047 null] >> endobj -1224 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F39 863 0 R >> +1264 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1231 0 obj << -/Length 2638 +1271 0 obj << +/Length 2793 /Filter /FlateDecode >> stream -xÚÍZÝsÛ¸÷_¡·Ê3‚/‚Äc.qRßôœÔv:w÷@I”Í E:$eŸû×wPü’}Ó¤ÎÍ„ÐX,¿Ýß>±àðŸXD†+í"¶šE\D‹ÍþŒ/î ïÓ™ðcVaЪ?ê§Û³·U¼°Ìi·»ž®„ñ$‹Ûí¯KÃ$;
|ùþóÕÇËOÿ¸~wëåíåç«ó•Œøòãåß.¨õéúÝ/¿¼»>_‰$Ë÷}÷åö⚺Œ×ñÓåÕ’XúœPz}ññâúâêýÅùï·?Ÿ]Üv{éïWp…ùvöëï|±…mÿ|Æ™²I´x‚œ kåb¦#Å"Tg7gïözÝÔYÿ Τ2rÆRÍ90²Ì(èB~¬ê§´>Ér›—w°=-7iI´h*j3ßU•¿q.ïnJ¶%iÆÓç!s½«mµOsßµN›¼ymÅAmQ=u«íªší½_䮨ÖiÑõNì«Ú¼*?«ÂC -î -OŸùˆd¨Z?’N~¬‡AšzýÕÒ×Ü4i?ài´ù/M(¤¢+§³dA™è•,ÔõB -£Ž°â©g’@Siûòâݨ™Õ‡I(f\5\~˜…Ž†š¢ËBf]ù1%Tj:aó•Ux+IëgêúpuC]D¯ -#úÙ@†l@Q—@náBÌ<ÊÀ1r -\ªƒï|ŽH$èÒö•¡!A%3B&¼Ó¼M—!hq{¬ú¹à´-"áp…×jœ pÆË>ÿÛ‹i"ðSŒG‰¦©ËÝè}å?
\g5Ѿ<Dé(6‹âxÉ–‰`‘…$hg‰åÉŸyÝD ð$Iæ_7¡23ÚèÓºh]¾fU‚up€NuU‡B@„_8Ç«…Á}Õ;°Èh᎚³HÓÒ}†+–·ð¯\Nž}ƒLª!ˆà*K‹oÔf¢A½¶ÛëÑNðör/*ØÑ¢¿)¯xÕ×ì6eÉîçF*¥û·]Ÿ¸Z;Lâ•aù¼Ú¤›shp3ôÍâ[sHCpi-I ý W!é/¹ø=™x¥w‹Þ -£f FAD.†éHéšEµqo*?ê`/Ý!à¡¥öˆ‹@B\*z\÷;³¼¥ÊYaÁú5(ͽž‡ªYQšŒ8^ŠÍ¨šÉá>ÿíË$e'¤ØräôdC"Äf—ñÞ¡ð›—Xfu™«]ºq—Q/Ïj„ñëCK
|N8ê¬ï‡ -³?ZÒ6|Í¡üV ‚)k|NÇ·°êàSy™aH¥uꩯeøãI?ý;Ë´“Z|v
ÖàÀæØŸ8㱉N q¨‡µˆü/tøs´Ó‹1ÓÏôBbW ÁÕî+T¯€‚¹˜ãúpmG®×Ïõðís½8Éõ1ܵ"1®ú‰¯-Ô2ŠGSÂoql̉" ôú³Ðÿ› <tì?EË\ ´dJÃYý¸*@ýÀ* +xÚµZÝsÜ6÷_¡·“g"Fü%>¦‰sçêäßÃMÛí®ÖÖX+mWÚ¸¾¿þ +Ó5ª¦y¢Ùmsè'i×í³ÿ¶ìÚ¢Ú‚AWáÍ-ôþZñ‚',©íQƒ¦®^ˆk¤Ð,UZ9¦²uZî‹uù[‹bó(F¾µ+ÝŽþ8—<<¼œt‡EƒH(ÁTªdqÎL’»ìñ9?\ò,܇–ÍΙ³”s¤°•DH~æ\ˆ)rѱð%¿ö\§õqíéÒ<ÖpÆIòúÚ=×ÂâC+sØ´Êt6^ý[oe4»áÎÈF„7_‰o6Ö:EÛö<
±¬ +z?¶Å†Fä04ðV-ëô aåeoŠm~¬:b-§+»}÷B´ªl×oq×n]\$GîX
˲trªƒÅáKμ0k8'!˜e–õz¤*¬ ’p×4È«¶¡‘Ý,N55ÚëáHVÙµñüôؤá¦Ù奛ZåmÙ¢+ËÄVÍs¿YMø0ƒÁCÕ¬òªŸé×컲©[÷Ucw-`õÕ2l Tåfc£[CÔÖDÏéñ=?”…57Ì5[">ç/ ‘„øïK0xs$:™Û¢#Ê>?tåúXåz§
·Äeýˆàn¶Üâ>¶d¢îˆo‚h"Ck˜|Ì¿ãý‘çæ” ç")ÁãN¥,…q Æ}ŽIã=žç¡íRS&˜V†»/W(S‚b +‚SCÆVI–bÓäá! ÁÝ è{þhøÁ<èçrmÐktˆ‚‰d¦þX‰‘B³ÜÓs½¥ÆLªÁŽ +v&0—B8ƒêÚÀŸk&Òã8?ó*j»|ýD{øf¡]8@p‘1‘Æ„Ã¥Ô„$ˆ-½ÓÉôBiMJˆêvÀN¼‰
$V9æ(¤¸<Ù:šAÿGússxÊoŽõ†Þ÷¸¶%ªbçVÁÅ'‰Ë×ùª¬JŒQ¶9:õ<®Mâ¢êb£ýí¸ß[œÒ (A€ß|ý®Æþí#„ž”›`ðØ´NÖt+ëâ,f& +Ž,ãâuÌrÇÌž÷¸é1jOG?ÂNi‡bêU<Ó‚ +#äTPâÁ?cFÈ)Uâì"•ë|ç‰hO|NP¹¬ÿÀ”³¢ûàŽ…æóõ¸‰j= h«†fwdV´u&˜´gfqN–p•¡;@ñ†Ž€©]%[$Ó3©LÕ5'"¢2R1Þa‰ç +ö°”ºEÍFk·A<Z÷y¤Ì¡ þ3éÍÑi3<€ 5€÷(‡†øØÔÝ¡©ÞÆ‚þ#%ÈzÊ× @è[SÕ³+7éü¹;”ëÎîhPÝÑ“-•8 ³¥´•Ò4a3ô‰ÓaAýKÛQ‡ª¼´]±ÃrÜúÛ¼vP`¡S¤“&*•oÔ=4ü`žöærǵ¨NÉø<û»&u(þ•Vöu-|þWPæ'Fô=“sâ¢Ë˪ûðcó<Ž ÛJn_<²¹@†uò¶;ßÿI“2Éÿu,rDzžË1¶Ô¨áŸd²Ùë«÷\Ë;ÀŒq!ÆË@ÁÃçÇrýˆCaÁQûÂéVeê|\3O·ËÐ=–î;G®`)5HàÔä?G²Q +T¶!D÷ò½uah3-ŽÎžÊa.8¯Ïb– +%§™ +Öyå?êðöÕ—X£[‚ÿxüÛÐÜ'î±âé¨ +õÜA=—çàò—†r÷
¬1_{ß7ñØóì¹{xÁžŸûš„OË~l‡HÒÉÍÔ_°[šj}¦ +ð³£³ø¿þþ ‡ÿ¹·,ý€„¦L.^rÄ=Þþð_œþtB¥òó™lðÂTBœRh·Dœ½¡™«þ_”Ýeíendstream endobj -1230 0 obj << +1270 0 obj << /Type /Page -/Contents 1231 0 R -/Resources 1229 0 R +/Contents 1271 0 R +/Resources 1269 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1218 0 R -/Annots [ 1233 0 R 1236 0 R ] +/Parent 1258 0 R +/Annots [ 1273 0 R 1276 0 R ] >> endobj -1233 0 obj << +1273 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [339.2005 732.0757 400.4005 743.9759] +/Rect [339.2005 655.8125 400.4005 667.7127] /Subtype /Link /A << /S /GoTo /D (zone_statement_grammar) >> >> endobj -1236 0 obj << +1276 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [455.0966 515.3057 511.2325 527.3654] +/Rect [455.0966 437.7416 511.2325 449.8013] /Subtype /Link /A << /S /GoTo /D (address_match_lists) >> >> endobj -1232 0 obj << -/D [1230 0 R /XYZ 56.6929 794.5015 null] +1272 0 obj << +/D [1270 0 R /XYZ 56.6929 794.5015 null] >> endobj 358 0 obj << -/D [1230 0 R /XYZ 56.6929 712.8597 null] +/D [1270 0 R /XYZ 56.6929 636.3095 null] >> endobj -1234 0 obj << -/D [1230 0 R /XYZ 56.6929 687.24 null] +1274 0 obj << +/D [1270 0 R /XYZ 56.6929 610.51 null] >> endobj 362 0 obj << -/D [1230 0 R /XYZ 56.6929 564.4689 null] +/D [1270 0 R /XYZ 56.6929 487.207 null] >> endobj -1235 0 obj << -/D [1230 0 R /XYZ 56.6929 539.0086 null] +1275 0 obj << +/D [1270 0 R /XYZ 56.6929 461.5669 null] >> endobj -1229 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F63 998 0 R /F62 995 0 R >> -/XObject << /Im2 984 0 R >> +1269 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F41 910 0 R /F21 690 0 R /F63 1038 0 R /F62 1035 0 R >> +/XObject << /Im2 1024 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1240 0 obj << -/Length 3289 -/Filter /FlateDecode ->> -stream -xÚZKsã6¾ûWhO+WâE•Ó$ñ$Nm&‰ã=%9Ðm±"‘ŽHÙñníßn4 -–ŸÝ¯~žùÍûîoî®Bgóœ]/tžÍ¿¸ýøQ,ý|ùýÇ·_ÿóîýµQóûÛï?ùîæÃÍÝÍÇ/o®¼Ðž~†|¸ýÇ
¾¾{ÿÝwï﮽ÿöêæ>î%Ý/Ï$nä÷«ŸÍf+Øö·W“¶Ð³W¸È·V̶WJK¦•”²¹úéêÇ8ar×=:¥?¥¦…Êg-˜UÜLk9c™-ŒâLk[D->¥åÀ…Z.7›öuñû¾Ú½-–år]÷ÍsÁêä±)"ׄ2‘Ø´ÉÍPˆŸž«eýK–‰ª»^HÉç¯ëz¹¦áºízO-w×¼˜Wþ¯Vx‘Íû–ˆOUïï6ÝkµóÏ=ºçÚ-]õk?ƒÛ.¢BËùí#î{¤0™åLª\ÃǪBîÙBæÀlŒ€ýsfµ&àF5Žö.V~¶„ŠÏ›¶§AW¹A†6Òä’e¹6avÕr¿ë궙X4mŠÌŽ–Ûw¨3Õ´¬ûGrÞÂʻ׺«&Vç™ÂƒãǺ˜XZç+ÿêÒ X‘3…èðŠn"wrh¢«ê±Üozºø%ÓÙ„À`]Jaû›vYnšªï>§‡Ü5Bëó ñ‹‚Yćù9=ä6¿¸vä¼æ…a¹àö¼¥¦\§-5rMZê‚Ž}`¬˜—´ò¼‘kBŒ±è}²|(ÇÀXEf‚±#©•¨åjEæÚuĘƒa4tï©~©ˆíÉ;Å[tÚ@v*lŽvên’ÕÀÍ.J³zGØ1 ´A—y:á@Ñ}à¯S1
ɈÝU^Wžµm<kóæ‡}¾›€¡œq•cNÀN V˜ˆØ²YM™¡eR™Î†(žš-ƒ€íõ4\•f¹´ü\®3p
\'Ô -ò&eR‡kBh1‡ÃO†ÅD1áÚ§BYù”¶|´žwð° sð†oÌ…Ø’3.3ñi±RD¥Ï.M!ÄyñŒý€
9 -D.àÏÄÎsHݸúëÁEüµà:g&ãâ¼µ¦\§5rM@l*´Îd®Šó2D® !†y KøPŠ¡ÉŠZ ¡©£Ð‚w]hq÷–Ëê¹'âØ\á¶7WÌú ÿÀh‚ŒÎPðö š,@@‡‡§\Ñœ>5šŒ$9U6›£¨‚Òž‚ƒ²ÌðB]€CÂuë -áèïþ©ÛÜƲ!ÀA^7âÙÝón¯«Ž°"8&£ôL
n¯pœnîžf4¸KPùéǨ9ž×¡¦Zöu0%Ãä‘4yÆ -Q˜4GÈ\—d€‚Lr´œTB‹#}YoNÛ®²ë3}ÞvS®Ó¶¹Æ¶» -2VF–Abšç‰\’”‘iÆEºc3Îe4c3†áÁŒñ"š1\íȃÃø`Æxá̉M%mÊo¯ /ÄÈ};ËÆãòh1¨èš‡rœ0p‹XdHdp”ÓInœwpw’¸ Ñd\ -TA=å…%OÄÆ‹í½¹»‹(…ù6†0–\è¡3Û''£ ×Î9©‚””çj3m1aYÈÌÎﯘ·ÄS5åÃÆóÅ¥•I3¿#fwߦôù×BrÃIpÃ>ïà½j¡`šýü¤je,— Âïã›Ó -ÒÀXϧ -)×éT!r¼éK¾èÞ€oG‘jXõeL({A†È5!Ä°êÓLHHRܯ)UÖóöÙŒ_KGÌ¢}ôITäk¯HÝà ۶sHÜA¬ÃTù ÅÖó÷ðÏ󵞒Ó/¶Ü†PåBJà/B¨¦~ lʇjÓ!•®in3¨›r÷–ò`¬,ìüÈrÞIG -œ~/¹—-²MMHã×*BÊäÔèqü«êÙWŸà”|47GCV -!¹†á²t½BÀî‰Ò‚¢võÊ•§¥1|Fç,¬[MÔå$7Ü÷yõY¨ÇVù¬Ñ›ç°µuºåy¦‹• -âRá{³¹Z.5à9çs©ÓŽeS J¡‘>~ïçü~@HDãC•6F±PX…(Ñ·~½ûSø<.‰$ƒ2Y¨‰šÓ&Ÿn$¯ÄÆï_$¾Ù(T;R2°ZéXñëlù_/xÖ-J%äÀ‹@l{&¹On\a‚%>ä - -èpã¹Ý¹Fˆå¡h·"Ô3<"Ç^îa|mJÔC#Ù¦Ÿ:P1ôFä_
=©Å÷&|-?á¾”\Ç÷-ì*¼í|y8"7LrVdñƒˆsS+Éò"¸º¾ü-|'âºþðKk¸÷PÊ¢F±âÓœ´ì9Ý´ÒŒº -é<àe\ -wª&4¸€gpý¸3>BzpïÇm¨ï¦æ¦=#}$JÙœ˜“VÇý-á=Çr]7UhýxÔV™ »`å)d{mOÂôrN}ð³êOã4p&{30ªà4Òf×±½w=8vêP‰^NNå’ðß+ûþ8ôðå¬2ô¢qºÕ•AÖ¡Peú¨µ¥!ÌA”3¢ÿc–éNendstream +1280 0 obj << +/Length 3338 +/Filter /FlateDecode +>> +stream +xÚZKsã6¾ûWè¶rÕˆÁ›Då4Éx§vœÄñž’h‰¶X‘HG¤ìx·ö¿o7€@Š’'ÉŽ«F Ð +Ø‘ÚLÅ%Ë´ +GŠï/†Ïïà1¿_.*….€5žRàÞ³ßg<cÊZIDIÛõ ×ñÅõVÌ>´p Yz¦°ð"YÙÊȲ\Æû@e´c¹ÜlÚK®ç/‹ß÷Õ°Ç毋e¹¼„ƺ¢‘"ß"„?qÝób¾ïªµú–~»§jY?¼ÒC¹\V]7$èay×€Ý <dc‘)¸$ +)™»sì|¬z?Út/ÕÎÏ{póÚ-=9\`Ãm –óë¯|©À$3™T +/ŽËbbkg¹âò¯n
‚&SÚA°ÒhpH«ê¡Üozzø…i6Á0øðáø›vYnšªï¾¤Iî¡õåû 3}XŸÓ$wøŃÙÒA>3ÜàÆùE…FJuFSÕ¤¦.èÚÊZ€zI°ðg¹ˆTl”¡3C>Ê*X”I¬Ô[®V¤®]G„£¡±Çú¹¢®¨§Ø}ÐS¢Û†î §ÂÔS7HZƒ]äfõŽ°“Ó9ºà·¡.Ô¹øu"¦&)±k¢ÈëÊ“¶'m^}ãpÎw0’g\±bŒÃ Ø)‘yDlÙ¬¦ÔÐfRç2]
Q<µÃ@$èëI¸ÂbËO[®)Õi¸Fªj€Tzcÿ@4±ÿ +$ðw[þ應ÔèÙwEp¸kBðþq:j?ÔU»gˆ Â$£§=Îb(¥ÁôÊgØz!„ÊASp-¹ð®%ç']‹ÊD1aÚ§\YÙƒ¶|´_ÒøœŸçoø“qÉÄçùˆ–”>»5¹gÅÚÏ*rdˆLÀŸñ-ì¡V\ýuç"þšsÑ<kNømM¨Îhk š€Ø”k€MUœç!RM01Œ]hŇ\UVD×á@p-Ø;r-8ê\‹ƒL੧αºÂ°WWŒú þ@o‚„NQpxàMÀ ÅÓS”À‰þ\o2âä´WÙlŽ¼ +r{ +ô^ y
Ñi0¢öO«²?Îä‚Zس[G¢ã½‡ #¤CR‰Áæ£è¢8Dy°Úض{V‰œô¡³ÛßoëžÚ^›r[/‰àÃÍOÔK'±G»£ÞmÙõ•oÿ»mV0ò¸@ +¶Eœ‚±Þ(y ÀóªrÁô¶„î$ÜÉÃÕC·;e†^ÃÎoÚ¾¢Þ~]ö‘°}©›Gê?¬C÷%™AèwˆÊƒ]ƒ ®ëñ¨àˆþág]ÿàÆFNç€À!¼ë¦C$»1oðºê(‚ƒKÊ•ž)¸eÍáÆ4¸{ô‡Û3‘~‘N8Íñº5Õ²¯ƒå™<âÆ°¬À +ô<U;Xi‹¡ÊB2;¿»´bÞMÕ”÷O·Vy*XXù‡2Þ„œ,dNZÈAT8 n,’yÚÁ%{ÑBª$ûåIÑʘ(-@„߇W',0=—›=§|äèëNë²™`KFJäîŠs,>àš&Ö™1j´lr¼©UA0_'á2ò½ïö ÏWzX¶ûÐüDîhµ_†ê—X¢3C¡öÁ`lÄ@Éêf‰wkƒf +¯Y2@œÀÀ¦Š¢*âÙ°=D»ï«Ê~óMè@—…¿%-DVËõø¸ö¶|õÛþñÔvUè¤ãˆ»)7N»mÉi¨™ºqê8`{RG+p,Ü–HÚ&¹®4ðíûrù[w:8 +RyˆÁÁ¶MEþV¨ +Åóñ»>gñ6"ï«´Š)Â*ø‡¾õûÝBæq2$A
TÎB6ÔœVvü8)y
6~ç"ñmF‘lAøhÉ.ã÷QXæÇOV ·ºÆé¡„èwb†™4LÕÒ‡5.%A['¹…\9<µ;W±<¤ëV„L†GD`ÛËÑMÆW¥Ô{(ÛôóJƒ^©ûÞçECjñ] ¹]ËO.‰×ñ» +¯F'_DÚŽÈÖMº“,~qni%3S#×—¿…oC\¥~i÷N endobj -1239 0 obj << +1279 0 obj << /Type /Page -/Contents 1240 0 R -/Resources 1238 0 R +/Contents 1280 0 R +/Resources 1278 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1218 0 R -/Annots [ 1242 0 R 1243 0 R ] +/Parent 1258 0 R +/Annots [ 1282 0 R 1283 0 R ] >> endobj -1242 0 obj << +1282 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [213.0783 523.2777 261.825 534.0621] +/Rect [213.0783 447.9822 261.825 458.7666] /Subtype /Link /A << /S /GoTo /D (dynamic_update_security) >> >> endobj -1243 0 obj << +1283 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.1622 402.1714 446.9089 414.231] +/Rect [398.1622 324.1411 446.9089 336.2007] /Subtype /Link /A << /S /GoTo /D (dynamic_update_security) >> >> endobj -1241 0 obj << -/D [1239 0 R /XYZ 85.0394 794.5015 null] +1281 0 obj << +/D [1279 0 R /XYZ 85.0394 794.5015 null] >> endobj 366 0 obj << -/D [1239 0 R /XYZ 85.0394 237.7961 null] +/D [1279 0 R /XYZ 85.0394 152.4569 null] >> endobj -1244 0 obj << -/D [1239 0 R /XYZ 85.0394 215.2797 null] +1284 0 obj << +/D [1279 0 R /XYZ 85.0394 127.9318 null] >> endobj -1238 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F48 885 0 R /F39 863 0 R >> +1278 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F63 1038 0 R /F62 1035 0 R /F21 690 0 R /F48 925 0 R /F41 910 0 R >> +/XObject << /Im2 1024 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1248 0 obj << -/Length 2570 -/Filter /FlateDecode ->> -stream -xÚ]sÛ6òÝ¿B÷Tù&DñIÉ““89u7u|ssÓö–(‹‰TEÊ®çæþ{w± -ZŦ_³â -Řøˆ8Ôá"ŒbLê½Ëñ°è›GH#±I( BÛS:l×S"vEʘ¯šÅâpŠÀIØ|¨šÄ¿®jÆ-?4Ã]Ëgt`#™W3žªãnr@V%L§"x_QP‚¾Oã1þ>ÆãÚÎ0~fàH»¢þê4*Š*G—ÆÛ7EÓ‡’ºp±ŸFmö™Vúí -~_‹è^GûÅö´®dP?©+É´¶O6þd[¡hÔy‚l®ß4á•!”ym(Dï1·º„…KÓW¦Xߎ-Ýç.ã®óyÓ>qÎó]“¾bqûÎèæÐþ-3hÒ|‰D!6ý|ý×ËØÔ·2ÉDH°^ip
)B™C˜1:í»ŽÓL;²ä’¸»‰º¯H$PL´3L™ÇìiP*>¿;zúwú)îô îô»ÞwXpRˤNãß)êb'‹ðY Å -é8êô^ˆ±ì´@éIZ¬&ú‘ -ÕkÝŽ!¯Ûu1/šƒßÁUO,ʱȤ
ã\‹—º1 +1288 0 obj << +/Length 2741 +/Filter /FlateDecode +>> +stream +xÚ]sÛ¸ñÝ¿B}ªÜ |’Dòä$öÕ7_Îq§Ó¹»Z¢-NdR'Jöe:ýïÝÅIQ²Ótô@p±Xì.ö”˜pø‰‰IYj¥dV3Ã…™ÌNøäæ~8' HIëÝÍÉë•M,³©L'7wZ9ãy.&7ó_§)“ì(ðéûŸ¯..øÇõÙi¦§7—?_&ÒðéÅåOç4úáúìãdzëÓDäFLßÿýìÓÍù5M¥žÆ»Ë«±ô8@ôúüâüúüêýùéï7?žœßDYºò +®P?N~ýOæ ö'œ)››É¼p&¬•“‡m3Z© +\Ví¦¬“¦>MRΧÿ¦‡a)ËXþ–Þþóå„Í!˜5FŽ\5ë
„TºGí/NI1íÉÁÛk‘öh¿¾ +dÊ¥v;=UË%(Ž ¬‹Ûe‰c5Ý,JÖѵåú±\ùBñ…£r×x”HáòÍóùúTäÓ²mýÒÃ+|³Ó¢ž¢M2#¬¹#HQ I‹i÷µ>³EU—dhUMϺÜÐ +ù´ð›p¸½³Œ¥\³DÇC§„h‘K«<¤\°\CyA–Ìæy>¢“H1é’Ü¿"³,ÏßíLþ¾#0)1¤%þLFŠÏ0 8LraûL¢u›4ÌfiîNqµ{:=׃ˆžj%^ìzÒʬçzTDê#8Ƽ)½iPÐ-8OUà KVźØPàMdj™’ý +tï¤WÄèè
'gXÁà X¶
aÝ–égzØ×*89=…Ö·%-sBºuÞcwîăa«€×qS~À=»ªðþÙ/B|Ù°“ÌW%ôzïhI‹…†¯ž%p¼”0ó²h¥'L†Ñ)À¼„ùÛ¯Ã"ÈÞè‰}Ü.7ÝHØÔ6!P½8lf""SØôܹãt|•!Å—sôMRÔãŸÚþ«‘äšØŒ)ò~¦îñÓù;ùþíX,Ú_x¬œ‹7óÛüÍ›×J¾ßá%=„â&öŠû +ŒôâÍ:;ÇÀ‰.pY=W#~A< +k¼ú„Õ΢B¼áhÀ"QdÁÉÊC\ +u€šžNM8³¢Åè_ÒTïd´—D_vs$•ßÇ)¡ä¾8rÕPùlhGµŒùÑÍ©•Ó†lù¡øRiCb»4Ö…¸S
Åï¡8t¬ü}ÆAê¦.¿Á~ÿ‡Æíå!bǾµûU²i¨“SÁ¡ŸSši•eñ¦G@CvÂAg¿@ßâ Ÿí +ý}B‰j$Ð +:TAÕGáʳú¯šøR7OÜ¢nŸ—š=\SÐ+ôP/PUf\M£¢‚<2‹KJ-õ1'ò1ªe5SêËJÚf»ž•#ò&»Ÿ1ãyb4J}RÓ¯Yq†b|ÄjqF1íÖåx˜ôÝ#¤‘Ôd”F!6•Û5•ˆÝ²æ«&E±…x œ*pï*f ¥«šqËÝp×ò +ÌKfÐm*è +$xúI²àÀr$4]C&˲4=fЙóœ7•óh¸kbÏ<w† |£ÀUÓxi\UÏ5øvóà%«Wëê±Z–÷Ð’¸zÕ-¡(ÕÅçÒôùR3cEà&^íÍ3¥G¼wNÇû¢C‹.rÒÕ«‘
!À§Rvd¤—LûTmÎ2£ÞèUa~ˆîv5‡ än +.M_]˜b};vçV8pwYÎ6ñŽsV®7EÕ¹‚n}gt³kÿî +hÒ|‰D!¶|óüõg/cSß²Ë$áÊ«`
¤ev`ÄèLÄ{ ¦™gvd^Èeiwu_‰ÈSíSæ>{”Š–=}ˆ;}Œ;}€;½ã®÷
&… +ÇÞçãsü€GEiÉ5Ó¡ó•Eˆ“¾AlbK| pö
&?¨ß,c2{Îí;H‡µ^”¾{Z¶P(Uñ‘ö™é•\0¡¹èq³S±T^Å?CïŒå¼Ìé»/Àªz»)Ý…ƒ´áX†oß0ˆ‚Ñ«?µ‹f»œÓøÖ#“ëÎèá«2eŽÑ<í—eE¼ÅÄ6¡.ŸöNœh97ûϹ0Þ’H$vè¯PöàÿFtÎcÖùî¿Uìþs¢±¶ÎåÓËrè퀈g +Ucô¾éúÿ_ì³þ_—Òrendstream endobj -1247 0 obj << +1287 0 obj << /Type /Page -/Contents 1248 0 R -/Resources 1246 0 R +/Contents 1288 0 R +/Resources 1286 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1218 0 R +/Parent 1258 0 R >> endobj -1249 0 obj << -/D [1247 0 R /XYZ 56.6929 794.5015 null] +1289 0 obj << +/D [1287 0 R /XYZ 56.6929 794.5015 null] >> endobj 370 0 obj << -/D [1247 0 R /XYZ 56.6929 388.1985 null] +/D [1287 0 R /XYZ 56.6929 335.0859 null] >> endobj -1250 0 obj << -/D [1247 0 R /XYZ 56.6929 358.3469 null] +1290 0 obj << +/D [1287 0 R /XYZ 56.6929 309.7244 null] >> endobj -1246 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F39 863 0 R >> +1286 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F23 714 0 R /F21 690 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1253 0 obj << -/Length 2610 +1293 0 obj << +/Length 2523 /Filter /FlateDecode >> stream -xÚÝZÝsÛ6÷_¡·R3%Š/‚Äcš89w®NÎQ§Ókû@K´Å E*"e×ýëoP¤BɹKn™p.€ÝÅo¿(‹‡b–%Œ+«g©Õ,á"™-7|vïÞ\ϦxÈõýââ»×*Yf4³ÅÝ`¯Œñ,³Åê×èåß^¼[\ÞÌc™ðÈ°yœ}uýŠf,=^¾½~}õ槛óTG‹«·×4}sùúòæòúåå<Y"`½ô;œXðúêï—D½¹yñã/næ¿/~¸¸\ôºõ\¡"/~ýÏV öœ)›%³Gp&¬•³Í…NK´Ra¦ºxñ~ÃÁ[·tÊ~=HÆOÄg+$³6ÑÓÇr¸ÅŒVöô^´ŽÃ^ž+Æ[®× -¹ïp8%óÖÈ#?Ÿo·.szòì
Í8YpâøðceÔ hçêsTòÉ -Øû|MÊSa$É$ø”°Ï„£ÁÆBÕ0b -Ï_7í~;p<7St]Yßà µänbËÒÓ}ôÂA+p€^7r# -m³D—ÿ€ÿwÓS.2¼å/Îÿ¿‹éNÿ;šú§\Dc´àÏfÚDƒ•2_ÓEð3K–ùº.2ÜùŒ‹$\c2"¿_”óªm&²¨ €ìvyÝÞa”/\=ŸJS(¶´ k}2<ÎÒ¼:õ,àmåÝsù°ÂUâWœvá
h¾¾{Œq(¹>ÀPLÔóµ‚.KpaXŠµçÑ?›º ‚{1–È]P±kX
Û‘S&z܈z -T2î«æ6¯hª*ÛŽ(w“ðöêg†ä8Y 2¬,u¾)h¦-v#éožÖÒJ?ÀÀåÚ¢ö×oW¯!z'ä÷Eë+qˆ7=oˆÇuQ.ûCk‹j@¿óâivÙlŸˆ"LŠ -€k‰iòIË£uQm=éðÏ¢n÷Á¬Ò -om|šSO`Iw·jíÙPÿ*¢>îËåç0ny¦…ï¿IMkAż¦ '½ú^Ô«»É6£öaMŒ ‰D„,3öˆ#'І©</SB²vvkÞ—Eí§ü3Ÿ8EzHlîú?=Kjý&$ªãä -Ò!9FÑÏkg«& R&e‡Fp¼§¥77úXZEÈT”"蚉3¡äÍd¢úraâP -øÅÉ|(3ͬéù|8ä:{.´Õ&ÿ#é¯7îÊM—õ'É,m¥Ñç%é¹&DA¼Çò4ËrUßBãzLRPÃÚ(S©ñ3IM$¼®šúžÚPDb^ŠX
ÖO´rSÖû®ðÓ„&¤nÃ9ÅnSƬä3"ãªÿ[}2„äláÈ€Iä -ö–n|¼ÜG¹ÙohðWûb¼³Ìü±ùÓ`WÍÕщçÑ=ŠÍ ±9¦×4®I4•«jMB!4g%é¹&D£I0¡ d9 Iôhc4 DÇBÐèøÜ:Ù›ûïhÖ¢G–è‘%gt¨í \0öà\â\ ®•ò?—9…-qÀÖÿZл.Œ9!×ihõ\§U³ï>Á„ms^”žkB–1¶,Ó08æí¾óàŠÄgr,M-‡¡Jº"@BÑÊq»hET¨§SŽê¯wPôJn¸d(ËÎí¸ôûËD+PÂYñ¤\g ¸NG«IHA‰ùà¼(=ׄ,cHáGÅôH˜¤Rœâ‡x´‹WðœˆW°ÐÅ+°Ek]¼âb¯x€R.^q/g0ÃRˆbc€Á&‘˜
‘Ð⹘5à:°Àå*öbWæUŒ?=Å;üìs,ÙĖç¬=ׄ#`™„ɪª‘ï«ü¦ä¡a–ª)0½1›U¹Ì+×Â;'1½ÜämçLÖKjƒáé>h¬ˆ¡q¿½ÁdyG>4ÒÙeî¬÷›[ÿÅmC“£Ô¡Ô"lIæÌFø}íÞ¡LK]æË5Í·û@aÜSoTNº~?å¿’ÉŒ>œàœÿ¶«úIËyœêè¿[]tÍî
nózõX®º5›ú°˜[èL’¾ûh‡dø1æz)€vR`‘v$^ü¹›^)Ÿ +xÚÝZÝsÛ6÷_¡·R3%Š/‚Äcš89w®NÎQçæ®í-Ñ'©ˆ”}î_»X€"eJn/¹¹›Nf¸À~à· ,fþ‰Y–0®¬ž¥V³„‹d¶Ü\ðÙ=¼{w!<O˜â!×÷‹‹ïÞªtf™5ÒÌwƒ½2ƳLÌ«Ÿ£×yõaqy3eÂ#ÃæqbxôýÕõš±ôxýþúíÕ»Ÿn^ÍS-®Þ_ÓôÍåÛË›Ëë×—óXd‰€õÒïpbÁÛ«¿^õîæÕ?¾º™ÿºøáârÑÛ2´Wp…†|¾øùW>[Ù?\p¦l–ÌaÀ™°VÎ6:Q,ÑJ…™êâãÅßú
oÝÒ)ÿõ<±Î˜°Çï+$³6ÑÓb9œŠbF+{z/ZÇa/O†ãÇkŒdFeº?^©fB0›$Ï×r– +8ÖT)Æq +Ž÷ì-KŒÈ'8K”ÅÇûylD´€ÿety|°¥F˜,cVd(xöy&×Ö*âÐÎÒƒÜÄwW9{Ó€=³Iaßx°±³ÈÈ`…LOµœ¥<.k‹u1µÔQ¾Z튶ŊÚm±,á\+z[Öôì€ÝùÀ¨áÖJ3ƒ;’>ï‹`˜GOqÛìwsÉ£eX6ÔȤL*\×l»²ñbJ¯Ç¾
+ÜÍš
n›nMÔOo>g^¯PÂ,–\°ð7‹é0)0¯Of:è–DeÑÎáñ-N›è•Üw8Hœ‘ŽyëòÈÏçÛm…ËÜ»¦®ž<{C3Nœ8–Q¬Œ:¡í\="cŽF>y`»³ˆKƒ9¼M³h7ÿ‚Ñ͆Æûzë÷|(«â݆ӽìŒÚ¦ +‚6¦¨9–¯´úá=ׄôqm™L“#ño +lÄkW&e†ýŸ’it_5·yESUÙvD¹“„·W<3”ŹÈ"(a}`©óMA3m±{ Iò´–Vú&.Çеg¸~¿¸zû¢7 !¿/Z߃C¾‘zCì<®‹ºxpu®´h¤ð;¯Þšf—Íö‰(¤€å=ð95ð +áZ¬¾Å2Ÿù(r@I÷Q
v9Ø +ô[±"Ž°~$ï/éúã8¨å!Õ—{® +"B•GÄŒH¤F*ÏKà”P¨_À›÷åCQû)ÿÌ'DB¥H…ÍÿsYRCî7¡Pµ˜'7 +õ·Ù#[áÆŸi;º—¶^ѳ–Ãõ;͸=Ö†QT¨¿$drì3¬št‚J™H”:Áñžv>4ÝÜèch!SQ‰@¢k&df’e2Q}»0! +Ù
é>»ù¶µ.ïuê¸ÔŠ»|_y†²=*ÅfÛùbçÕêžðÚ—¾à‘F»±,sJmað‹“õ€Ï¶Ìgëáët=ì¹ÐW›ü_q(Çx¼qWnŠ¸¬ŸGð´•FŸ×¤çšPe9ˆËÓl¬ËU}}Œ»]êP"€öF™‚LHjºBÂ목ïéŠHÌë@ÑÕUƒ…õÜ”õ¾+ü4¡ ©Û §Ømʘ€•‚~Fdãè®!þV¿Br¶ 2 B¹††½¥oçQnö<äÕ¾ï,3/6쪹:’xMp?S</ iÀuMkM媚F“T7„³šô\ªŒÑ$àN +ýaÊQýñšAÅ
—eY¹ý“f+¡$“ 4ç!5à:©Àu:[MB +Z$¨çUé¹&tCÊ}S8Ræ endobj -1252 0 obj << +1292 0 obj << /Type /Page -/Contents 1253 0 R -/Resources 1251 0 R +/Contents 1293 0 R +/Resources 1291 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1255 0 R +/Parent 1295 0 R >> endobj -1254 0 obj << -/D [1252 0 R /XYZ 85.0394 794.5015 null] +1294 0 obj << +/D [1292 0 R /XYZ 85.0394 794.5015 null] >> endobj 374 0 obj << -/D [1252 0 R /XYZ 85.0394 460.4475 null] +/D [1292 0 R /XYZ 85.0394 437.1956 null] >> endobj -1006 0 obj << -/D [1252 0 R /XYZ 85.0394 437.5053 null] +1046 0 obj << +/D [1292 0 R /XYZ 85.0394 414.1392 null] >> endobj -1251 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F62 995 0 R /F63 998 0 R /F21 658 0 R >> -/XObject << /Im2 984 0 R >> +1291 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F62 1035 0 R /F63 1038 0 R /F21 690 0 R >> +/XObject << /Im2 1024 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1258 0 obj << -/Length 3287 -/Filter /FlateDecode ->> -stream -xÚÙnãFòÝ_¡·•Q§ïãq2Gv‚Ídvâ`Mò@KÔ˜ˆD:¢dÇùúêê¦HŠ’=ÈB€ØG±»ºîª¦˜qø‰™±Ìf.hf¸0³åöŠÏ¾ÀÜwW"Á,2ТõíÍÕ7ï•›¬´³›uo-ϸ÷bv³úen™d×°Ÿ¿ùñãûßýüùõµÓó›?~¼^HÃçï?üëµ¾ûüú‡^¾^oÄüÍ?_ºy÷™¦lZãÛßÒH Ç™E?¿{ÿîó»oÞ]ÿvóýÕ»›î,ýó -®ð \ýòŸàØß_q¦‚7³Gèp&B³í•6ŠTÙ\ýtõïnÁÞl|uŠ~Úxf¤¶@IÇLg¨,˜€œ²,pÙYŠ)"' ¤q[îªb³øã -ü锂‘ki™@ïÑ—â›i±`/;„Îðr,w‚ëOl¬ñó* -¿Â’܃AK3I‡<œTuG` äÔ&KˆÏU ÓÛªNज:áC¥'ðrÕ²‰s)Lñ=ž$Òp¢n†Fî,¿ÀqIôú´j<P@êíÇŸhd[¶mñ%ÞG› -£É6‡ØX–ýÑ%ɽ’IOs«©3IÐ?À_¿P2ÓÂd{r_,O¸-íˆïQ”•àdµ -Ì)îR¸î-
éyß´mu»I U™ŠóôH4b“r(D€/•zˆ… - ¸J»o›Î$C¯ŒzŒFxYGß æ·‡}B.½ÔÔ›'jµ‡ûûf·/WÉXdÄȧ£<‘aSìÁ㊇y]>Òd»)ÊÔŒ"vc¡$øÎ -3ŽG&ðáHˆ0+‡9ÏþLÀèY±qœÓ,0CƒMýX$n€;Ô>œQuØ -íû$Nü§™0¥SäWÂõN´:½ä’¨ -ÏbÓ"ë¹êQ5N ýð™ÄˆÜ&ô¨–q¨i›uúϵ1 C«æ±¥¥êˆèý¾Ž°«r]6G$&Nìt6èçO/Ÿ;½cÜq×7¹c?ÉŒ_mSu¢Ãî‰b…Û_4pè]µZ•uê§gAû´üÑ Â«E[¥Xäöé…AˆTèQy8!Óf2k»XeñÉXy6ø0ÞUÚ]>úP烪OÜvQÕ'Q߆켸{5±ý êY(8ó`ÿ(€¨Ù]..ª†6æø¬êÛæõ:‘ÿ€V/X‰Ý»ðC+†-ظM»k??Ô5e0HNÀ !æ˜(™
-³'«O«RÒ3•¸ŒE5Æ0‰TLCæ3ă(,x¯4®4ÄSiHð£9ÇÉ"¶z²»w%YÄ¡Ûy"{ƒ÷wÉhF²z9NÖ+!~‚ -U8#TRƒÎ[‘Í·œ²Ù,8g{^Añy V8ñ -C±ÇNÀAåý v£Fï”™3ãÝ(À>4ž|†>f£Ï€É.¨GŸ!]ò0kk"‡¾8B~ -††Þ¡·¥HÞÐ;°é3'ˆ‰•OiÈGÕ«\¬é…Ljº—}x5@q¼IÏ‚¦Çh|•ÐØ|"°€âЙ -$ÂVþøqËßkÈ䘙$öŽ;9®{®‚œÎ˜±Åƒ= ¬•ÇË4;ëWg S,•H\Tp,ºÊNK‰:}G0‘[QùWY`ðÍÞwÜWǪÔ}ªýuRÓšúÀ¼Þ]L|Î -!N®€¡!>IÝœ¼3Œlª6Þ–E¨z*G d¶ûîãŎتüʺ¨6mBzò
±Oè¾¢‚aôÎ×ešù ôt•áÙ +1298 0 obj << +/Length 3384 +/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÷ûª©ßà +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—$^‚
ß +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â<LçÊ1—‹?0yVjçŒpÂò`S?p‡&wgT];[aò>‰ÿ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Ý mwB¦Í"rÈ´K¿îË-Xy6ø@fIq•y>øèC>:¨>qÛEUŸD |±óÙÓ;¨‰ãQ‡4”üÚáù^ +ª¯„q{_úD +ÍÃ==CœO ÏkÅmY/à g-Mb…7Ï€ôÎÁ“bÒ:gÁk•L7hQ§§ÕñºåQÁ|cÓ«¡Òö¦–>“¢â aÑö¬™<νTèCW jHx$z§µ +±æä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¤¡› + –;ñ +C±ÇNN.ϱ]Õ{‡ ̉°ù¸®ã}†õ`-Õ„Ï\¦É.¨—GŸ¡²à3¨º¼g8ö4Â~Jª‘wè)ƒw òlúL¤ f¢G¥ÇÄSŽ +x¯%"\¬í…Ç„z®8úÈõ +„æ_e†S’ø®ŠûæXšºE¤?O +[S_9À•ÐŒ‰o¥¦gS"*±Û,±/°®õë"&ûÅkÒ"5ôÎ÷YD:¨ L†¼3Â8˜ì*oÉg¡Tîjÿ‰ÎÒ^™&ïѧ8†ž¬ó endobj -1257 0 obj << +1297 0 obj << /Type /Page -/Contents 1258 0 R -/Resources 1256 0 R +/Contents 1298 0 R +/Resources 1296 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1255 0 R +/Parent 1295 0 R >> endobj -1259 0 obj << -/D [1257 0 R /XYZ 56.6929 794.5015 null] +1299 0 obj << +/D [1297 0 R /XYZ 56.6929 794.5015 null] >> endobj -1256 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F39 863 0 R /F62 995 0 R >> -/XObject << /Im2 984 0 R >> +1296 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R /F41 910 0 R /F62 1035 0 R >> +/XObject << /Im2 1024 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1262 0 obj << +1302 0 obj << /Length 3264 /Filter /FlateDecode >> @@ -4962,1687 +5090,1878 @@ Y$¸Ö Ú^!ì<Óä3rô#þ]Ëïà a·»4êåCÁÅß^þø¾Rã¡àÆÝóQ2ÞHà¶:¢Âà Òþ#I¾.Þÿn÷Àï!/«©‹/&/|Æþ#¤œ9?B—ÏÁ9ñg‰"„9ºý›ròÁÂoG×.~h`FMU%KõÌôA4´ÊF0Œ¸oÜ1—5*U¬Ð5„Ž>CÉè½ fžòõ>,ëŸ)°ƒÅ QePpœC‡Ám1áÇ*¡HE øKè\ô¾æ7ïâÏ|³]ßOAÔÒv —ü0õè -FèzAc“ÿYnöêäOy¹ÎïÖ<—oê}ÕN©¬Ö"Ý¿+MUØRÓÔöOœÍ‘|6åÜ:äLV†ÚÒÈÍõQAøï°J Û×8#ÈÈCÂÐæ;¾îvQ-ZÍrWnû¢hÒ‡`r¢®ÒjÊ¿Nž–´Õqš¤j¦”Æκ¯I.ì\jÙqœYžfŽÚBòâ’^pH¦*FÌEùµ¸:Ù$Ɖd´šÜ=p
s;H.;ú G®qÂ×—-Ų7¼ƒzå¸À¢Zšl¤Íé®êN¹¡1;\}™X‹Î±–#$×¼1“bté‘Íû˜ £} n‡æÐ>…N\IÐ$ì¨Ñ™½öl¥„¦†€ÐÄô†÷¹t½èMê`‘–*(üªï¾0‹ò_Kãç…-äðõÁ é<Ì¥Š+Àt +FèzAc“ÿYnöêäOy¹ÎïÖ<—oê}ÕN©¬Ö"Ý¿+MUØRÓÔöOœÍ‘|6åÜ:äLV†ÚÒÈÍõQAøï°J Û×8#ÈÈCÂÐæ;¾îvQ-ZÍrWnû¢hÒ‡`r¢®ÒjÊ¿Nž–´Õqš¤j¦”Æκ¯I.ì\jÙqœYžfŽÚBòâ’^pH¦*FÌEùµ¸:Ù$Ɖd´šÜ=p
s;H.;ú G®qÂ×—-Ų7¼ƒzå¸À¢Zšl¤Íé®êN¹¡1;\}™X‹Î±–#$×¼1“bté‘Íû˜ £} n‡æÐ>…N\IÐ$ì¨Ñ™½öl¥„¦†€ÐÄô†÷¹t½èMê`‘–*(üªï¾0‹ò_Kãç…-äðõÁ é<Ì¥Š+Àt +</ž¥×c£U/§?·LNŸ>áBZôߟ +oü=s*NR§Ž~ÈD"y»w´õÂU…¦Gøöû2ƒ[Ê—Q¦áº'ùÄhä/- ÍRYªX-8±ÆRZ^2ä]²ìâÏ¥½òút2Êf +E½êþ6’ ‡"(”A?”ÈÎÿ,ì©ÓðËŽòÁ9ÖÀEí~ÇuAöý6À§lHPÓP¢Ç†:ïn>÷«Ê%%¡Çà nBŸ³*̵¯òéýPq„£vÛqáZr>¿ß#‚;íëeËésÈ™ÆG
ÇÁ‚_CAr¾CÒpD,bEîàhŸ©Éa꯽´ñO´&.°è‡¿ù/Áú?“ƒÔ\§©:“óÈˬÞ&Çš[ü]*UÉ„êÿºŽÃžendstream endobj -1261 0 obj << +1301 0 obj << /Type /Page -/Contents 1262 0 R -/Resources 1260 0 R +/Contents 1302 0 R +/Resources 1300 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1255 0 R -/Annots [ 1266 0 R ] +/Parent 1295 0 R +/Annots [ 1306 0 R ] >> endobj -1266 0 obj << +1306 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [389.4645 200.1599 438.2112 212.2196] /Subtype /Link /A << /S /GoTo /D (configuration_file_elements) >> >> endobj -1263 0 obj << -/D [1261 0 R /XYZ 85.0394 794.5015 null] +1303 0 obj << +/D [1301 0 R /XYZ 85.0394 794.5015 null] >> endobj 378 0 obj << -/D [1261 0 R /XYZ 85.0394 376.6374 null] +/D [1301 0 R /XYZ 85.0394 376.6374 null] >> endobj -1264 0 obj << -/D [1261 0 R /XYZ 85.0394 353.7581 null] +1304 0 obj << +/D [1301 0 R /XYZ 85.0394 353.7581 null] >> endobj 382 0 obj << -/D [1261 0 R /XYZ 85.0394 280.8507 null] +/D [1301 0 R /XYZ 85.0394 280.8507 null] >> endobj -1265 0 obj << -/D [1261 0 R /XYZ 85.0394 255.5006 null] +1305 0 obj << +/D [1301 0 R /XYZ 85.0394 255.5006 null] >> endobj -1260 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F62 995 0 R /F63 998 0 R /F21 658 0 R /F39 863 0 R >> -/XObject << /Im2 984 0 R >> +1300 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F62 1035 0 R /F63 1038 0 R /F21 690 0 R /F41 910 0 R >> +/XObject << /Im2 1024 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1269 0 obj << -/Length 3076 -/Filter /FlateDecode ->> -stream -xÚZQ“ã¶
~ß_á·zgbUEŠš>]®{éf’KºÙ¶ih›{VO–K޽ͯ/@€2eËÞ¦íÜÜ!$ð ¼b–Â?1S:ÑeVΊ2OT*Ôlµ½IgŸ`ì›Á2‹ ´ˆ¥¾~¼ùãYÌʤԙž=>Es™$5FÌ×?Ïu’%·0C:ÿÃÇ÷ßüíáÝm‘Ïïøx»ÈT:ÿpÿÝQß<¼ûþûw·a”˜¿ÿË»ïhHó_ßü3qJz\˜ôáîÃÝÃÝÇ÷w·¿<~{s÷8ì%Þ¯H%nä×›ŸIgkØö·7i"K£f/ð’&¢,³Ùö&W2Q¹”Sßütó×aÂhÔ:y~"M2©³‰Ìdt€F$ª,Õ¬Pe¢%ávnÿìö¸½¯`o²œ/=j^ù§ž¯lCÄòVÌ‘‡Î‰ê[’ÞÛªãÁ ßîÜÞöUó‰$º×®w[ZÛÞÕU¿9¯«mX²ßX¦ªŽû¶eùkÖç•ÆÖîÉêl(S=¿B£ÀÉ,„HJ¥2¿Í×ö -Y¢5QÑý²XÙÕÆ-üÉ|lÅüDŠ’Åm³ž˜S˜¤ÌsÉ2{·:ì»êÙ-üÉ,¤‘‰JŽOhUW®é»‰e–HeržÝõUÛt„ª›Úur†‘BhPV%ZdÅ¿%¡E,En+¦p¤P‹¦iV»îtÝBÿƒòW×
BëŽà’&¹‘z¼î£7³,ÐNÕö°¥—æ°]‚Í=íÝžACÿÒ‡ÏØ;x -ïÀf¾±Ï<iˆZµ
Xm+ÌÌR¿Þ -!æÞÅÕQ ö|z©Øv²ŒmWÈ$×GÉx‡Æ{»[O˜"
„Öà4MªýñÉüºIc©Ë&¤|$êíêspúxå²Ht -/C -œúP -ik¬ÁOÎGŠÜ>†H/TD"E~ -m®-?Èœ?Ât®’BÁ•=Ràm¦Mlº˜tƒ"‹\¤#2+ÇòLGE·æ;<qW4zÜ@½¯h‚®~À\ò¼Ÿ!Ç µœl{òm
7x7î‘_TÛ]í¶0—÷Þßžs Å–Vo„çXêŠ%ƒÔø‚]âÆñ’–‰®ª0HMè0ŽÐ:£ÊÇJLÕÐâh¤¸††áº·kIÜx$T·íçîUUbT€1¬âœJ"”´á@áZ¥Ûoé6¶F5Œ u àñ™ý!6ò6LŒsƹ,SŠp1Æzâ™LJ‘æÄa•lþµ[YêÀ䔪ŠÎÁŽƒv4_tDY|²ÕžËªw%Âíë]Íp0Bà f¢Æ•µ½k<e)(#;KéýsU·Ë×Þu0«ÄÆ}WÌŸm}S<kºá!‰©>ëN\î@”PY9ê@ÐRþŽ…kÑYnä,ù}íVt®Ö7mü¦ø(àâ—©ÆGA¤>ÖoØ9†ÇW?*&/ ]b£¦LËëh¥.£}ò–Zí.â’{‘B){uñAjbõñ]Ù$Új¼<¤ÔÎáeÀ9ÐÞK}ŠsàÎôãû™Ù6²y9tÿ<å׊Ú&ÀdÜE—ƒ„mY`WxlÉß‘´u–À½X±<ᆢHJ¸G¾•A -=Þ°|$uÅòAjº782~/‡ÂùêúƒÔ„£½feRdF5 ~nâòûØ-Å}àîŽ{Dæ†:¡Hp•®ûÀ9½îËï£L!}šEž<Cuª†BµqòªŠM Q9Ú8:ã:!ýg |‡'×-K$‡
®bµ -¾…þQ™k¨C±YE–Ù÷Q^¼…r0ˆâÖv,uåƒTˆï5”®®Yüzp‡‰Ëvš¸Â]×`šPa\Ì)j3Žt`œc!š´YHÔ»~ãqhŽ²Ãùû˜à[5@l«†#…b7¦äoïŸFq „J|߸šèî°Ûµ{ïç0vYzl×0È}* -ýå:L#¡Ë(
Bôk™³
œí¢âõÏQ -÷G
Uöµõ¡säÉEC`‹?ÖÀÃ.Ç_Da}üevO¯d¤ŽM|WQ‚YÇØèÝt;KR(JMävK"}X›ã´ŸÆëT¿ -‰4¡a:\ø-RcÝUœ\³£C=í¢•øÃzˆà\\œ X"QÁ1ž:¥ç…oŽ
¼„ËLôyfxnûê9Â÷áʘç¥VmŽu¡á>Ü‚g*Fx¦_ѳi‡[mäöáÜNï¾í -®OøkóÅD%R‘óV9K]@ò÷$g÷ýÒÙþ -¸—{U‡AjB‰qI&poÕc-鱄ÌÓ|‘;ôý[Û°ðÖ¢Îm¼×ÃP¥£1a‘gÃ$ø]G¼Ýöø¶í¦ü]‰”åð»]®´›pdðƒM±“æéTµŽj¯Â„U”GHxþÊÞKüØľoæákò}û>|ó -Ž+Mö‡ÿ‰á2§üSž À>Àÿù/†ŽN•ƒ#“Mƒ)+þyƒJáV•9!ü§EçªÿG)i±endstream +1309 0 obj << +/Length 3094 +/Filter /FlateDecode +>> +stream +xÚ]“Û¸í}…ßê©U‘”(jú”¤›ëÞ\réfÛ>\ï¶éX,ù,y7¾__€ +] +
e%ì …ìïQÉ|¾©Ë²~ö¡_IÓÇ\k\K@I»EE¸6ì.âèøErò‡WL¾ÒwžGØÅ2K/Wmj~qMËEÕºCåDÏÍ'’Ǥv!µmüª†0L~ø¦O~*Õy”¦É+qrHuÙ©:ªNŠoêEYYL9˜P$T’\££šcäbÊD‰ +Ô˶ å±xÅ–TWl)P]:åK3ŠÓWD¼4¢’×X‚ÏÎÇ‹Ä_þtñ¨”Dˆì +‹foý(Àg[ðT|ìôÔ3ÄÑLH`ÅÓN^Yºî½½mèÀ>äÀoH >Çþ} +‹¸†K×0Ä£N€DÁÍ3daŠ’>YLµÔø™p=9¤†d”Ç:›žQžQr‡¢^+rìG_vÙ†'ò÷8Í…Ú³¹ä§"r÷•\ÜÓ\öQ¦¡ÏfÎVp±‹‚™Ÿ»h‚rsyGsÆ]½è1Núìy¬jä¼ãOOŒu´€
Úå\@ò´?çâ4ÖóOd(O”ge×)$"DsÓ'4„Ÿëc¹&°Ÿ‘0Ã.sÙE3ü€ÇÆÝòû9~šŸ§DDÒìºÞщ +…
<X¬ÿÖ~ùtÉL¿Òy
ˆ®|f"ß:{h—ζWÜžØ×èˆÎ%ËTMº‰àSm÷år‡DƒØn‚èß늉w®lµr´ÔBôlhÍgÄÙ° ¾×ng_Ñm›©/"*‹”ʻý„‹-€‡ùØœž¡‚w`2²q–Ãàûèâ½2çoá¸ÔWðÞÖ1=<Þy€ö¿®ì²äWŸ8Ó!Ü0„×á +üÏÔÿÅTwnŒœ6™ü„ÂkN͹£ð_‹þ_j½endstream endobj -1268 0 obj << +1308 0 obj << /Type /Page -/Contents 1269 0 R -/Resources 1267 0 R +/Contents 1309 0 R +/Resources 1307 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1255 0 R -/Annots [ 1272 0 R ] +/Parent 1295 0 R +/Annots [ 1312 0 R ] >> endobj -1272 0 obj << +1312 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [347.1258 528.4439 404.2417 540.5036] +/Rect [347.1258 523.0755 404.2417 535.1351] /Subtype /Link /A << /S /GoTo /D (journal) >> >> endobj -1270 0 obj << -/D [1268 0 R /XYZ 56.6929 794.5015 null] +1310 0 obj << +/D [1308 0 R /XYZ 56.6929 794.5015 null] >> endobj 386 0 obj << -/D [1268 0 R /XYZ 56.6929 656.9897 null] +/D [1308 0 R /XYZ 56.6929 654.3432 null] >> endobj -1271 0 obj << -/D [1268 0 R /XYZ 56.6929 634.3533 null] +1311 0 obj << +/D [1308 0 R /XYZ 56.6929 630.8121 null] >> endobj 390 0 obj << -/D [1268 0 R /XYZ 56.6929 210.4224 null] +/D [1308 0 R /XYZ 56.6929 200.5802 null] >> endobj -1273 0 obj << -/D [1268 0 R /XYZ 56.6929 185.1361 null] +1313 0 obj << +/D [1308 0 R /XYZ 56.6929 174.3991 null] >> endobj -1267 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F39 863 0 R >> +1307 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1276 0 obj << -/Length 2555 -/Filter /FlateDecode ->> -stream -xÚY_sÛ8ϧð½)3•Âÿ’¦OÙ6íeç6½KsO»û Ø´£©,¥’Ü4³sßý -»¨M‹Á“\ká„Wv]ì*0‰ç&*;úFß½&‘ZÇ.¾–ÛÝiíìt¸Èè»*ž=禙bRLõ—{Ý×kêé¬7¥oH={,ÊsíW{páë²Þ8ïXðŠ¦ßž,šºzÆ)XÔ,—»–˜O¶&ŠöˆeSÿÁ˜ØìÚ¢/›š† §òè~«¦XÙ˜D]®{ÛhB»ÀhÉ؈ ƒ“¶ÝÛMégBXØ:žú"< -r*“špÆÎ(âI¸ÑEšœ' -Ž@ÆÄO42hü–‘ -ê$“ó©‘žÇ{ÉÓ$•‚‡Ý¨]^˜R¦åÙwž×‡>üÄ=6»G»,‹Šû”+Ö)® -X×pŠ+È%*K‡;làƒªýTEו›ÚzcüD ÷E½´ &5 $FÙôhÝ4u\ÛMá"0øÔ£^ÔŒÔÈ.¨Tó¾èÂ0—‘—ý—-±›®¤²;Ü" -Á“Sà Öaòæ%ö{’{)uö³NeÀ,V+Óyiïty å„Ífœ{z(qÆYèz×Òe櫘:ÔDÏ!£Á8DDy@VQ[§Ž•y>½}×øaökùË+Š2Ÿ^Éšj)Åônˆ
Üç9§…Lr|°š¸ÎÙEöznMþÁ!)B½žƒü_¤d.¸yM
‰šõ?ÏÎHÇ™/'/|tçRÛßÌØTusÿ
ÎèëŸD´m܉÷€uJk”ÀÒ¿ ð¢FX (5©Åôn‹î
Z'øX’Ìa@©‘Z%#‰F)
ÎöÔM&a¿.í£!I"Ȇ*zÀ®‘Få•DNÍÁ`¦35Tù8»Ç>Œ)½îýš‡7|T¶€o|ùN2ˆŽvs(ý†g0ªÑDý¹;õ?/@Û}ªò+\ž×£6øßM9÷Œ+`™ ñ]ï¸\ä¹V/Vt‚ÿÝGdÃ{97©a鉒.gIÊ3¾Îƒhö3*:Щ8˜ÆÁ‹ì§tAq<Ö<Sω4a©R D:`Èye&¹ÃcÅ4ž¨„|8“<6áh¥tâ·n~J…8Þ®C -jñr‰ˆõ7Ó*Ÿ”ˆ2”ˆáLwºìï¾C±ñͪ‘4Hùü±©;Ç¡š{ -j¾½ùHm_à!¹-ž©s Ãhz|¦]sQ¦|¬¦4;G,'Üe㾫Žbؼ½uoK$µnÚ-½rBoñwôÍ–•hg®Â4¶÷XJù×5ì¤"©áAh%b?˜DÅ$¶|°kkjÓ’ëô‡‘XŒOzUäf'2ô¹”ºVR𶓸Þ/0gæ‚Cîw=ýˆÐYKÄü“58œiªÓ¶;â¦õŠ £Y"8Ÿ©dÝõá1„{âŠY|8âˆnêi7>4ÝŽnƒp¼—>~µ=ЈV|´K>À†p,Ô¡)’+|lÛrôt<ȼh¡&¿Þô›Žñ°S–U9,M@hEðÁÞfåå ØØU«±\ѶE½mš#?'îL©%å¬Slpñÿ‹îã>»e™8±>Ì@PÉÓÁ*\ Ú®%ä™HçŒÿ?SâŠíendstream +1316 0 obj << +/Length 2512 +/Filter /FlateDecode +>> +stream +xÚYÝsÛ6÷_¡{£gBß$&Onâ¤î\;Ç}jû@KÍ E:"ÇíÜÿ~»X€"%ÊI'™ŒC`±Xì?ìÄþñE¡3&ZäVešq½XnNØâÆÞðÀ“F¦tÌõÓõÉË·2_ØÌa×둬"cEÁ׫ߓ×?Ÿýçúüê4š%&;MµaÉO—oˆbéóúýåÛ‹w¿]æ*¹¾xIä«ó·çWç—¯ÏOS^hóEpdÂÛ‹ŸSëÝÕÙ¯¿ž]þyýËÉùõ`ËØ^Î$òéä÷?ÙbfÿrÂ2i½x„˸µb±9QZfZI)õɇ“ÿG£~êÜþiYdºùÌ +9Ú@Î Ì"×63†pÿ`0A)få:ÙTÍCï: rØ YäÉõCå—jó°ÁŽI>—õC W‘DAýUù((Z1)ŽÈ6ÉÅš;×Kß½€o!’¦%ú_mãhdSVMïš²Y:Ü{Ø€”óÌj-¼5ëvKçÓß¹ÎQ'wÔ|¬êšZírù°ÅÃÍŽeLºržgy2ÙÀ”Ž¹hÇùd#êˆl×åÒ¥¾[¹¯723\=¯BdšQarèÀaµœê@§ª-lýö³Ã=3»Ýê²l¨ÕGÆÆõíö#q&ÐX]u=µ{Bsö6BH0¶T?¾{š<ãº3x8²ðêãé§2‡{¡¢`åÖåC
*qk<>ñk}w’„´žáÍmá=žŽðÆ/Á[#xäx£l„7Žxxcáâ=¼YžT§<Ùí$ŽàÆ7Us;Å6¹ºp<…MÚ¦~Â%"Œ=ññÎ5Ô¢3ƒÆ²mþ`LÜ>l˾jš‚”:0ø»ßº-Wnj+Q$gëÞm÷$¡^ ´dlD‹ÐÁÅÝnÜmVBX¸&»§h"œ¤¦‹On[á=•R%¨+Ëæ‰{¬CsUuËæEâVDðÔQæÞs´Ÿ«q)Ô<È(ivèÔuû%ÝŽž¶cY™Pà† ”Á@Ðö½éÀ;1|ïH-/È#•ÍjßIu}{O-ZÉïš÷^
}Çv“×+{jÝ•Ÿƒû»%߉+<–O§œóã>Ï(hÌ<ïóÆ\Ç}ÞÀ…fw=˜ÛõÕ²{Öé1i¾¢ÄÀ5£Å¾Ûc<ßSã²Üࡳb +ÛЉa¡fø°
߶5›„m0
Û Û‡m„§`óa¾,@¹i#~w;EöMЂ6ö + ‚ëÌ•/t¡Z(ÂàÚ(N™Y¦%ŒÞŸ¦†'×ð¿Hζ„JqQK›©¼P¸øâÓ€¤¬•Ä5j{kw»à //6bñ¦›c³¢ät,ÚÛ&Ž€@°
”(Âéx³ZŸÃÉÓ©`‰js_»ƒ° +„†¾!E‡–=8}esÈO\Œ÷÷ûŽ2ÙÌXHÈÓ]ý}€£@e…ÌóçÝ¡²<BÒfa¡ÁMÆD}1õÚ»åö¾…ûð4ã& +pý:"ß8)ì>=”5\Kå
eÄìˆ3ºA$.ïÚ¶sADIŸÆ;LÝqrß‘†1û‰HkŠ¶›ÑlòB¯èš(^ÞLnCÒ;L1,O*˜ÇžPwkA‚$½qÄÇ4¢”¹Š<´Õâú
-k4¬ã¿ï\½—fÔPî‡{¨ÑÖ†{Ù? ¥à”Gžßc>¬I^ùÑíÊff +&~œ†QàW4Tà{å
=0O+$)x<‡Æç„9eY‹}h}ïAÄc·»w˪¬©³K·Ró伄]ñ +«TŒ– žÑ¿%ÀAëäŒè»îhÐCz)±Vš«Fç-†eF‰RÇgeGÎw2cªx9LÜÇîLl°—Ò6ì{]qãTÄrµ¢9]àfÀP +c¡‚ib=ô³ÉŒc1D +*bë˜À±° "¤¶oãû‘ûRbêò‚¼„âÓ`ŽÂÊøQ!5ÉÿöF™Y|þ›˜ÎÙËâÕ¨ÿ™A&_ +õjnÇþ&ÁÀó’›WÔ‘(É·þGsÒÙið0—«+w>Š¶Ô1™^â|Å ÄÝ3t8£oxɦõ7ßÖm,«‘ËjüÞóa' ^£"0º)»4EhÈá8°™½<JÄ*™HTJi0¶¿£aRîËÒ݇×àD'‚䨨¢ÇIT^QIÍ©šÀÕôªÆ +W؇9U½Ûóøž1cSíÊø6”^Ûdëè4‡²ox£ú,B4Ü»CPïð㥳ÐöŸº…Ì +·çÕ¨öwDÎ=ŠH§ +Í¿)ù†d1³V«g«9Áÿi5‡3öòˆá×.!-—Gj9˲œÆX…Rø(å@¦â ×Ð(rþÃ*¹(8Kž)äDž±\¡yÅœ äÍ2“ÔšÃ;Å4žÈTXñÈØÆ›•áw‹í©
w§õ}Ç@Ó_¿½2|œcDiÚg+CÎD&x®'•¡Œ•a¼Ðä-»À÷a¨1¾Z,’©’¾ïÛÆÿ2"©Â‘’ºo.?P?ÔuØÜ”O4¸„i´<¾Ï®‰¸SÝ×ÓÚßXN¨ËÖWMDŸyu啈kÝn7ô¼ £å?‘7ã0éaʪ¸ŒëÃë•RáY
©¶ÅÖð’
íqT¢{!ýØ6Ô§ +7_Û}͇ß'Uÿ?_aiÃendstream endobj -1275 0 obj << +1315 0 obj << /Type /Page -/Contents 1276 0 R -/Resources 1274 0 R +/Contents 1316 0 R +/Resources 1314 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1255 0 R -/Annots [ 1280 0 R ] +/Parent 1295 0 R >> endobj -1280 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [242.0197 61.5153 315.2448 73.5749] -/Subtype /Link -/A << /S /GoTo /D (rrset_ordering) >> ->> endobj -1277 0 obj << -/D [1275 0 R /XYZ 85.0394 794.5015 null] +1317 0 obj << +/D [1315 0 R /XYZ 85.0394 794.5015 null] >> endobj 394 0 obj << -/D [1275 0 R /XYZ 85.0394 525.3716 null] +/D [1315 0 R /XYZ 85.0394 505.3557 null] >> endobj -1278 0 obj << -/D [1275 0 R /XYZ 85.0394 500.6989 null] +1318 0 obj << +/D [1315 0 R /XYZ 85.0394 481.5651 null] >> endobj 398 0 obj << -/D [1275 0 R /XYZ 85.0394 129.7873 null] +/D [1315 0 R /XYZ 85.0394 116.3495 null] >> endobj -1279 0 obj << -/D [1275 0 R /XYZ 85.0394 107.5853 null] +1319 0 obj << +/D [1315 0 R /XYZ 85.0394 95.0296 null] >> endobj -1274 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F62 995 0 R /F39 863 0 R /F63 998 0 R >> -/XObject << /Im2 984 0 R >> +1314 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R /F62 1035 0 R /F41 910 0 R /F63 1038 0 R >> +/XObject << /Im2 1024 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1283 0 obj << -/Length 3046 +1322 0 obj << +/Length 3061 /Filter /FlateDecode >> stream -xÚµ]sÛ6òÝ¿BoGÏDñIpú”æœÖkÒº¾¹‡¶´DÛœJ¤+Rq2ûï·‹]P EÙžK:
Àb±X -›Ü”]@n™Ö€LkøGGµhW`ÑZfÉ5IÏõòˆPþÜ׌˔©‘âYšr[×FמXõG®#í/ -ñ]#ÓÂ97¯i–ÁeD‘´HÌt.•ÐÅmÙ¯î§*aSí´ûjŸfPÁê\Ù‡'öP䩲JI7kÚ–ºé«+¥ž·ªîi÷@Ó4Ô²mƒ>ÀZ÷Pj<ÈpkáÀãy‘ÂJ´rã‹ Jo“%åx¼ÿ¸ýºÈ™©¾}h7íÝçîµJ3)äñ DÚëÖ_0+ýY<:=`3láä -ŒÜ%uîî\E6fÀ_ÆŽmÌ1]díP’uË‹F“
;)äñ‰–°q`½â)Ž¬Ý€õ'GÔ¼…¨–µN.J8³´
íØÜ
m"ÍúÉÎQ!Ì‹”†P: n÷] ßwÕæ–N΀Z¦íXå¡W¹D•¥HªO›zU÷3ìXj@}ZpŒ³ÅÂ:‘Z—å_|?ŠË˜äñà˜Ü䇙OêáòÔ)P…_É@ñ9&‹,uÒ©1“§Ôx¤ù` -ëþžöªm*Ú,ô °¡l ¨6þp¡µ´¹ñ¦È#¢ÙᡈBÉïë“Þ–Ÿ ¸á‘t.drù"ad*…«žÈNƒíT`ýý0Sà0_²ÖC>>MPÞ¼ýÞ*{ȯʎ]׃Çp|"¥ÌR£Ì3&M ¢V-Ò\óLS\Æ$çl†Im®Ÿ¶j t•»¯Èc øÚ¦…´vÌä©©S~>Ë›|¿a·TV^ù!䕬ü<XŸ‹ÄŸB¨ ‡åê¾ZýA»Lg:µYa'Ç뮬›®Ÿø`]KñŠëÑ!¤dj4âÏ}µûLà¾ékvêJ*h[<X3Ûv߬'>]Ø>–Pšbv”–cvÁË(Áì ò}ÉH7•w -TÊW "˜â2&9E¨Ôå@f@{"Ž -Œ5a‡_KM]̪jaù\byÛûcæBÎp«šóŽ™$ó¤d’œŒzÔÐÓQÅŸþkÐ ñTóIPlïîÛdžÀ G~‡’ÈQÇ(V(ËÛ•ü<LÀŸLÀŽ&ÔJ*ø„)Jázêþð…‘4çò¬a¹ÊäáL-Ì×9›‹àôÈÚCìb7Åäc²ÞÕ0Á"šé~x¢Þ¶šé†P€ä3ÃþAZ¦˜JËŒ®ñ!âai¡gÝP3V³kž=DK3(fÊ uºàâ3fÁÂœ9VÓ»Œ -±b½#p]’ؘ1n0æVc‰½~§ŠÈ>Mò©CÚÌj–üå™’ÛàCÈHІW(Àoð2fÐòú5õ\¾ÃWšŒU÷€K ù¶/;¦
¼wß %Ѿþþâ=A·õ.0{[3€"²<ñIþã{€ôM ïyŽl¶#s§ï7ã&uhúïqI©¢<u zfE0å²s^mJ´ä¾ŒŸ¶|j&ëfå½ïx3SñŠ¥½ã9©«gÏß/7ù…r“/–›|©ÜäTnâÿ–›øÛ䦾PnêÅrS/•›zNnòKä&¿Ln“ ôñf<A/ó
~ z²$Ãk~Ø‘± VöƒVšSJßYIPç$F™xÐ×äØÛXb•=gª]CèΧ(∷k›ò&àÝT÷åÇÚ»Wž"}˜#¼Hv!U¨©#žìÔÚAËÁÚögü3³tÉ¥OlYÎ:åIWoëM¹£FŸ‘093bj‹DÝ“$˜õÖ“èúH -ZÂ×6Ñi‘~b.®"7‡Q8q0D#HkpZf<öëŠ Gƒ÷78 -Ÿò£÷\ ‘‚ÅyDUhŒE‹-‘#ÕØ5Ím¼ì¥exŠ-•‡ -*±§J\ÌlWøJÀ©aïä—kåãZ(&G -šh&h¡lMDã l¼‡Ð9Ö†åp>´^ó¿{ß™Ö]_ŸtÕò“®š5in”~ÖU›ºW‘žËN>F^N&c%#ÆÜk“:gåðѾ ‚ÊónãÕUW±$>ìÖÕŽ?ˆ8ÖTÒ¤²pÚá¯2,Ä¢ûM_ʉ½í®;B9D£F¿ßqÎÄpîƒ^J<zÓ=ú½Ã>ÖKþÁn˜˜§Ûý†ÚüݵfúÉHß™„yªXzbÍANYŸ¹ó›rå¹Ö -_¹ý§.:|N¢ŽÓ¤îÔWJ¤ lBºk·ƒX¶(üÉ›,5¹,fÞ©aʇj·ýeFë/ùÁ0ü:¡¸äÀŸÌèc”9QÀ
`†‹||Jëfü¼p8
CÊ(ЙK#ùd÷/UxÛØtí!ë4——Å4¡~ÙKq&Þö_eG¥MÁ,¼¾JŠgžñìåýøé|Jsü„ï¿—£¨Ž¸)ò´p…Š¸9zÀpžæaB yHO}n§LŠßÈÍÌÞê/þïð"¾ö;'O|wƒç€3åÖÑ÷Ã7{Ǭÿv!<Éendstream +xÚµ]sÛ6òÝ¿BoGÏTñE‚Ó§4ç4î´IëúæÚ>Ðms*‘ +IÅÉtúßo» @ŠŠ<—t<,€Åb±Xì% ü‰…Iã4—ù"Ëula«íE²x€¹ï/ã,=Ò2ÄúîöâÅk•-ò8Oeº¸½hÙ8±V,n׿Ei,ãK D¯Þ½}}ýýn^^f:º½~÷ör)M½¾þñŠ ïo^þôÓ˛˥°FD¯Þ¼üùöꆦR¦ñÝõÛÓHNÍ ¢7W¯¯n®Þ¾ººüãö‡‹«Ûá,áyE¢ð ï/~û#Y¬áØ?\$±ÊY<A'‰EžËÅöB”Ù\üzñË@0˜uKgå'’XªTÎPª9š<NL¡ +¶£¡UQ°ÆMuœW<Õ´¼œ–1~ÓRwÕo>ù¡ú÷$‘{šX#{Iý÷±dÒQ®†ü^¬Ë°+Ûá|ÌsÑ5mG§&ãH²YtWR»+Ûû¦Ý–kê:áÛ”iÙl²èä]Ñyä†i
Èt†uÔneú\u~©“õjú~_1.S¤Fw©‹m9w£ÄªSI0Èt¿ +¬°é±SI⫳§Ø¹+7;u+\^ñ'žgŠzŽec›ƒÕ"Ê([ëœ}’JÊEš+°(p¦g¸çÖÚyg³(.C’dËÄÈ–ÙXÂÈ€…\n‹~õ8åQeÕVÛ¯Çã@ñ +®Qg*3yâ&E«T /ïzM—SÕ}Ù²iêùªžîìMM#ÛÆ[ìu»rU¡:ÃÛµ'Ãká,ZÙñóÓŠo*'Ü-*Î3fªovͦyø4ýV18–9_´×{f©tyìw +,èqj“ì¬ßeüe¸`ÎïNéŽý.0æý®<Ök 7QL¸ÅŒße¬sœQü®Ò:º*@m隸Ü
m"Íê³7&4èQ.̳L‡PÚ#n÷§ßwåæž´F'@-ÑéØð¡-W™DÈʻMµªúvRk@ý¼›æ“âLóÅ/t ¸I¿PÉLvØù¤6‹ƒøõ˜ôÏ1™'±•V™<eF 3ɇðTõtWM]ÒeaýSC@¹qÊ…>3ÍÅ€ˆˆ¤E¥üŒIž«“ÞŸ¸ã•¤2ºþ™´H ‘¸žÄ|o
TAà–™—¹–òñq‚òòÕ8ßì w.hl,„w]qñFJ™ÄF™3ŽM /XMMgÙóò¨3Nƒ).C’sNÃÄi¦Ÿvl`ts•Ù¯È£§xŽGƹLÓ1“§4RÇ +–7E îÂî©-ñCÈ?Øø9°º‘ÓBè`4‡íê±\ýI·L'_%ùÄFEUwý$ë +‹WÜ”©ÑŠ÷û²ýDà¾î+í +jèZX1ûf_¯'‘Ùûw.£PšÓBv”–cvÁÉ(\Áì òcÁHw¥ +ˆûnXÛP><½ßæäúz.i¡Ë—¹ÏÐvMÝñˆK¡Ý6&#â»ò¡ªkJ#$©ùh>$ê’3]OqB—/Iï±-¨qmLü‰¹ðÆ“¥‘`} =›ÃÀ;ÑÙðj,KÖF=§õ= 8ó„¬L/@…ÇH RÏ4؈3™89H8&`RTþ2 ¦¸IÎe*¶Ð>“J@¼¨¥ùzLÏ0‰^A(¡ÆLžN%Œ––Žñ¢»¥9g˜Ä‰êYñ½L`ßcÑRøøÕi‡31°™2Ð +ƒ,«gMÆœl=!ö,º®z¨]¾Ÿ’•…f
§,¨ƒƒõúÿÒÈȈ#µšZÆÓwS¶U]m÷Û¹=+&Œ¯ÞïÞœ¶&9·263uk¼5kù¹pßl w•Í æ.¶»
–È´TTC,ô•Kì‡RǪ¬×Ž•×¶ÔV97n6©¥!±#œÇƹe€8cpðS…å„Ê~Îâ„'G±æ&¨¼qõ%×GÕ<@sYN¹ŠÜSKR…WÚð,¶\€»0˜«K0’ퟮ4)×ÛòcOx[wD ø Ú!*nØY/ç.~Ìlb#_Úå¨DŽ¹&Üð©iŠ9BS-RÖk@,î{*´Z_ùܲâêcbUUOR2I.3j˜áͨ㴶F W§æK¡8Þ=6O5w@â%‘£ŽQ(P"”·1*úePLÀŸ(&`Š ½‚Ö0E…\GÝ)PIsî$þ¸Êd^' +æú\ÓEpªò†î§8L1Ù˜¬5Œ÷ˆfzŽ¨ófz!” xų̀ÓAZ&ŸJËŒžñ!ãaiad]Ó3–»kÞÝgK3(fÊ M{Zò3fÎÂœ¹Œé[FƒX±j \W£R6ÖMƒŒÖPb/^ëБM¬çPöX¦Iý嘒Û౑ ÿ"g8P€ßâcL`äÅš¹~_ë6Ý.NäÚÒÞ»o‘Rо}sõ– ûªõÌÞW ˆRÞx†Ú#|HßxúŽçÀgà821§mÌh¨¾ßŽ‡Ôaèïã–JEYlÁôÌŠ`Êe.ç$ì¼ÚèÉ|5YVØÓR;+ï}Ç—‹oXÚ-ÈI_Už^nòå&Ÿ-7ù\¹É©ÜÄÿ-7ñÉM}¡ÜԳ妞+7uNnòKä&¿Ln“
ôñf¼Aë
îzr$ÃgÞµä,Ȫý`•æœ†çwV49ÉQf¾¬A¨ž†V»9S‡üB®Dg¼]Swï®|,>T.¼rèýþ;)€ä‡âT…†:éÓC:õv0rðv§ã÷±YÚèÚ¶R®:eQWm«MÑÒ «HÏœ1=ÊE‚éI,uÞ“èºL +Fü¯RÒHÇyü‘¹¸ Âx\Fé\ÀÁ !h9•7Ažèåˆ þ†àCAàS|p‘Rò¢¸Ž¨ò±hq$$°†¦YgéŽbCí!©‚N©3×å+`Õp÷Vò÷kåòZh&* +¿~ß
•Ö¶/ן
Õ²“¡Zją̂τSªMëÀÎ%gc±Ð(N6œ™ ÷ÚÄÖ¦røñýrgéÂÆ››®dI¼ÃŸ%ñÏ"Ž-•4±Ì-Îù·)ä¢ûM_
ƉՃ¾í®;B9d£F¿o¹fb¸öA_JzÝ=¹»Ã9¶Kîƒ
Ü1pO÷û
¹·›šéïHFöÎDÌSÉvÐÙ”Ôìá”õ™+ÙmŠ•ãZ+üÊí~ð¢ýJÔq™Ôžú„1ûÜß„™Læ3ß©aË]Ùn+÷X‘Ãùþ`îœÐ\ràÎèc”QÌý^O™d7óþYl_ü[¾Ãñ3±µòÄ뜿"Ì”Óô£÷ÃþŽYÿó~NJendstream endobj -1282 0 obj << +1321 0 obj << /Type /Page -/Contents 1283 0 R -/Resources 1281 0 R +/Contents 1322 0 R +/Resources 1320 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1255 0 R -/Annots [ 1285 0 R 1286 0 R ] +/Parent 1295 0 R +/Annots [ 1324 0 R 1325 0 R ] >> endobj -1285 0 obj << +1324 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [209.702 689.8302 283.4678 701.8898] +/Rect [213.6732 755.8266 286.8984 767.8862] /Subtype /Link -/A << /S /GoTo /D (topology) >> +/A << /S /GoTo /D (rrset_ordering) >> >> endobj -1286 0 obj << +1325 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [325.3322 61.5153 398.9856 73.5749] +/Rect [209.702 677.875 283.4678 689.9346] /Subtype /Link -/A << /S /GoTo /D (the_sortlist_statement) >> +/A << /S /GoTo /D (topology) >> >> endobj -1284 0 obj << -/D [1282 0 R /XYZ 56.6929 794.5015 null] +1323 0 obj << +/D [1321 0 R /XYZ 56.6929 794.5015 null] >> endobj 402 0 obj << -/D [1282 0 R /XYZ 56.6929 132.7054 null] +/D [1321 0 R /XYZ 56.6929 120.7503 null] >> endobj -955 0 obj << -/D [1282 0 R /XYZ 56.6929 104.7571 null] +995 0 obj << +/D [1321 0 R /XYZ 56.6929 92.8019 null] >> endobj -1281 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F39 863 0 R >> +1320 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1289 0 obj << -/Length 2668 +1328 0 obj << +/Length 3002 /Filter /FlateDecode >> stream -xÚÅZÝsÛ¸÷_¡ÉÕ)qø&pyòåœÔ7=§õ©\h‰¶9‘HE¤â¸þï]|‘ EÉö%NfB\,vûñ[Ðd†á™)0Ó|–iŽ&b¶ÜœáÙ¼{wF<MˆÒ˜ê§ÅÙoY6ÓHK*g‹Ûˆ—BX)2[¬>$oþrþ·ÅÅõ<¥'ÍS!qòÓåÕÏnF»Ç›÷Wo/ßýãú|žñdqùþÊM__¼½¸¾¸zs1O‰ÖSÏáÈ‚·—½p£w×ç¿þz~=ÿ¸øåìbÑéëK03Š|>ûðÏV ö/g1Äì~`D´¦³Í ÎX˜YŸývö÷ŽaôÖ.²Ÿ` - E³ R6e@¡‘dðÊð¼2: -`ðJ’!ͨ²>,×yÓ¸Ä`#‰Àoˆß¨£XŒSð[c1NÔZ|»ÅÇ4fi-6Žp8ùŒ÷«|SLYŒ!m<×)òÑYæCû¸-&´fIƒŸ¢XiJ9’Bï§tÇñ ¥)ÍäLƒÖ=ñPkC®=ñ«U½ÉËj¬8/ÕBëï§xÇñ Å6Ø(þjJs”ÊôPóz7'*ñQ?fOUJƹ¡¬î&8§Œ`ãž:„PfW\ÞÎS&tRÕæ©|¬Ø©rN?4ñ\š(-V†%“ö¾pVÅm¾_·~I3™¾ !Ê,„ýùÕ?§SƒÔ<ø.rìœpʧÁ¥A¤mÑíe_•MDz©#²eqÊÅ3d“§e³ÞmWbŠH08WÄRc/®9^+®K„^\ó#dÇß!Â¦Ç -<¥‹‘?MˆÍA3Æ=eãbó¦?i>Á˜ '-!1%~aA¶uq—¯ÝðK¾Þ]’ÞM§pìi§„È4
îž[?/~<HÕ,C\@Æ'BòŒàehq6*älUC¾³©‰—ÀÃÀËC2W‹ T*G -~¤¾r†c”‡Mxæ¼È8ÐW¨˜‡&•ÂøZ(}×ÅÒgs`›$qãv¿sÅ^Cæ´Oç“@Òçž0ÿxÀhXÂaшNþUW6uÆÁ`V4>pØ(“’ÎbÓ|›¹ÍÁ2À©aò–Aâã'•_ Ìž:A.gR[Õwy¥ê…(b»ÃÑ -€ðlêM q* --O*t†ˆbôt%2 ʨK*oë3vñ5ßl×®ž@÷ª£…&“"®mÝ횢M]c•JŒ“ÛdpÒ ey€d¨.¯ÜÓ"m;:w‡ÌèÕ}Ý´È‚–õæ•›örñùz*=FTÎo_ûZ=Ì)ñŸ×^
îƒ_Ò1|(צˆK™,ó}S¸a^=ºsëf[Wï2³õݾs:šÑyLG LZ77Ü‘ÌÐÉpjïóÖÍÜç_<«Û‡j -¾B~›pBM- ¹èx¬cTóBäîÑìo´¶x𕑤XSàtÖòõCþè3ÀÍ“Á"Óôœ¯=‚ª¡0îbn,Ùø\v$±Œ|ÜàUC¸„Y‚%'`×Ð?ò€Óã 8´¸ÀÐíë€.›6o‹MQµAí¶È(=Æ}œÐª=Ú…c…„ÌFØÊ“(6Y—EƒŽÝú -ŒÓ˜³U -O|W”™› Ó`Ydz«–4]À2‹œqNDârNqßø¨øJ}‚Q×.ÂÓºœ<>…ýÁ’Ûýzýè Mž1ëŒ7Ú‰Ê=Ý=¦is/‰³xÆ=–û]êòIÆ“L
Óɸšmh¡ZÛ›)0ðB˜a³ßnMê5 Ú͘¤fלØ+Ÿãà…/`è±!ÔO ’Ìbwû66±"4ÀØ@ŠÓñÀ0–é…ÃÐÉŒQÍ51‘ˆ°†J¹˜ª“}å;ÎAf€t( ¦¨äÐ$H5}ÿí‰Ò˜ê¸,•‘e
…?mÛõáõ,x3OîÜQMl=¸@¤ZûL÷þ°Ù—ÓÐv±¤Úon\çF“úÖ=(6•ë™©~vr™/ÝjK%¼Y[ãì¾&eµ*—y[Ö•)iX%ØͯÊ&¿Yž«áAC’;Oe®÷¥oò"†)“.]½_LÝaq,õ“ATùº ]+d.5\Á]»Y9Ä€H‘VÝþ -IÒy¥2Ê€÷+7²AÏÆ;3Èœ½CÂœG™P ¸ýºÒ¦ -«Æ_9ÁmŒÙ¬‹ÙC;A™'}ªxŽ}´ ´·Ïa¸QÝå3ÁÓÑÆ(dg®Šû< -²ÚØsÃûz¿ëo/P1§/“¼ûŒ•W/gÐÚ.‡–³$óöòJf]Ø55æË¡ý8;”o£–¦)×™˜Œµ›+¨Ÿç·OÊW]OTú¦Â¹VDéïAî|µ¡Ý±yïhJ"æd>žNI1Õñ”ÔQKÏH€9§êôöÕÄþÃŒø‡r2Àg!C=q=!Ö`ÚÅîËåý`M”fÌ{Œ²«Þ0ôm`Yå»G7c\s[7ek>ç|)B…’}"JU„›½·¹Ìä—‰®{(ŠOý·…ÈINÖ‚58Àž8ìˆêÄa*{Øe•îêº=üäK5bÄô©;ª‰½Ù1PÍÉpsŸ¾”‘"¯î¼°@žîfдö'Û¸Wþ®Ä}K²¯]}Þ—¾œ¹·ÞW”·žªhÚ÷ =ØUvÉ÷hŸï=Á¥ç|¹,¶Ðs´oñ+‰”è¾mÒ©K¤³¬ÿÎv¤¯g€~ÙäÙáÙ“·ÌÏýK¾%áæ+ž:rÙ]Tz¡,v$cÉ»? 9ý¿àP]endstream +xÚÅZÝsã¶÷_¡¹'©!Ä'äÉIìÔ™Ä×úÔ‡Î%<‰¶9¡HE¤Îq:ýß»À$(R²¯—N's!D,€ÝÅîo?h:Kà?:Ó’$܈Yj‘ •³õö"™=ÀÜ÷ÔÓ,Ñ2¦úfuñå5Og†ÅÔluí¥I¢56ïçßþõòo««»Å’Éd®Èb)U2ÿææö;|cðñíÛÛë›ïÿqw¹HÅ|uóö_ß]]_Ý]Ý~{µXR-)¬g~‡®o~¼ÂÑ÷w—?ýty·øeõÃÅÕª“%–—&Ü +òÛÅû_’ÙÄþá"!Üh9{‚ ¡Æ°ÙöBHN¤à<¼)/Þ]ü½Û0šuK§ô'¹&R³tBŒO)P¢8LY +”ác{(ÛbWæøk¿ zž¯k÷ÜÄïš]]59h‹Ódþ.÷ôYÙÔ8js«à€FP‚4Bßöì¦Þ·eÑ´ž2æ•’0èڬͷyÕ~q¬o.Q©ìEÁqnÿ0ÃÁ]¤©@¾ŒéÇŠíj™x—¯Û¢®‚¥1B¡ü˜!Áá\êG£ë¨^`d¼›å„ØCAA 3 +ü†¦Äp¦Ýäe5¥weo>õê¬÷›|Ì8e–F²Y +Û*cäkl—£µž¶Üe·ã2Þ…0ÇܵèvW¾Ë×fÁ è)¼Mþs’°*÷šù×÷uYÖOÍW¨.ª4I§Ôíð~]fMƒÉÁAŠ +WWrðk›ls¾¸°gUþ½;•Ah®Š¶pá‚GrÚà¦ëû#ú»;`ß=e‰/·Y»~œRK/-ª µ÷1uxéíK˜[ÕçYjoü}õÿÿ[TÂ!û„襡¤KÓ¸¨·<ÌePm.ÁiD\u¾!yEïç\×{Ôrþ{¶Ý•Ê¿¼±cÚÛÔ„I†¥¢3Å%µK•$ó¹;eÞàæ}rj©nnñéª7ºÄæavôæ±nZâ9!`Áoð}t‚ã×SQ¡;íó¤)Æþýõ¤$V™C9oÙJÍ×Ù¡Éq˜UÏ8ˆû2ÖÉUêr+7‡2ÚÑeLC¼t6owG%Ù¡U’Ý©}ÌZ|ó˜}ô[õyåàv˜a`,4änÇ*œÓH(ìºT¬hž‰ÍáÞrëÈ"GJçme°KÊÔP§Yù”={øýð"òž s®ÉuYúìµLØOõÇ>
écˆ?ä‘‘;$ûsãœY(ÞE(’b¯«\&DYß;ê¯ v»<s¼ôÆó„pUíK
¸WˆJAB¸Áô=Á¢Ú#È…CÊ"oÈ©*ׂ°”‰WõP)”ÈFŠ“Y·æØ;x=$‡GÜõªy*dzÐjíŒlê +˜ž@Án£›Êæq¶#’³po/è|ÿgó«cÍÀž‚kœ)b,`Âѳßfö +~´Å63ಙûg_1j¦(£Ã–‘ìƒÌ.…t³Â'º2ìTŸ=æ=%0¶Å%À½»qšdR€¸ôØ>Ï'÷KFó iÒyĺyܧ ƒÔª2´ðe@Âý&úW +©è¡ò—1@:°u©)v6Sa¦?Žy¢eLu†—@ey)!“Y¶m9îõƒÃ¸ƒ³'wTG|–I"ä(ƒ³ßå/5ºR¢:l?`€aÏ¢g…½nÃ9'Ù×0ûa¦t9.؛զXg¶ò°~–èy‚ï7Ec‹¿«Ý
‚.?x*Û¿Z=†Jh²«Ç5ŒiË·oWS
Q‘Hâ¬$v¯lƒ6ù†Øf«SmºqE9к;rÈ©®b2èÏT4ñYBQÚ¼Á£]°6Gy›ý^lÛ¨!wŽ(i$þ(ª§ùQÇÓˆ>f‡œr +,)£ç ¦:í•e]V΢&]X̘óçwT\A‚ +(¤²VokRécsX»ÂUÌ«¼}ª÷¿âd»ÏºwóxqÌFŠ5®u±Õ¾Ùå{Hðr×®f&”òwØ¡ik_à\•?€Ë|ô”YÕ<å{ÌÂŽ´¹ Œ’|ûÆê<îƒ@ÍG;«t^Æøê•
Žœ“ÃvdÈgoðΧÍű`×a¨ƒ–5Ì5)ÿÎË?Šª›g}„IȨ°i|ÿ:0>ðfï³iç³c=INh¯Ñ‘ݧíIw3DéîKM¦½3@gÓ}Jïpxu¾‡ÃÇú°ïïØ_ BrúiœwßD³Êçÿ)ëë³ÿtžz}ùÒ+u&ŒUšýí¾ôÅå«Ú¨Fk ½©ÚÒWí~¡!~·ú¢õcà‹ŒMWä¾HBÓŠ(}WíÁ{Pê7‡{§!‰â‹†3ˆÔ$OÔ|Ž ³æ‚é³gwDãÇ`‰tpºËR…H âH ƒ—Ákô2<=ëÇÁš`켿@ÕÅmúŠ¶¨²ý3¾±F¹«›Âõþ>æ!6©‚ üÐÎ᜵@%ÀS}d,“¸º’ò)Ïí?QEæq6òØØ–ªODtúš‘»æ¢ZîëºÿÙ endobj -1288 0 obj << +1327 0 obj << /Type /Page -/Contents 1289 0 R -/Resources 1287 0 R +/Contents 1328 0 R +/Resources 1326 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1294 0 R +/Parent 1334 0 R +/Annots [ 1330 0 R ] >> endobj -1290 0 obj << -/D [1288 0 R /XYZ 85.0394 794.5015 null] +1330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.6787 755.8266 427.332 767.8862] +/Subtype /Link +/A << /S /GoTo /D (the_sortlist_statement) >> >> endobj -1291 0 obj << -/D [1288 0 R /XYZ 85.0394 691.0694 null] +1329 0 obj << +/D [1327 0 R /XYZ 85.0394 794.5015 null] >> endobj -1292 0 obj << -/D [1288 0 R /XYZ 85.0394 679.1143 null] +1331 0 obj << +/D [1327 0 R /XYZ 85.0394 673.1367 null] +>> endobj +1332 0 obj << +/D [1327 0 R /XYZ 85.0394 661.1815 null] >> endobj 406 0 obj << -/D [1288 0 R /XYZ 85.0394 320.8972 null] +/D [1327 0 R /XYZ 85.0394 279.3135 null] >> endobj -1293 0 obj << -/D [1288 0 R /XYZ 85.0394 294.233 null] +1333 0 obj << +/D [1327 0 R /XYZ 85.0394 255.2326 null] >> endobj -1287 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F53 962 0 R /F39 863 0 R /F62 995 0 R /F63 998 0 R /F48 885 0 R >> -/XObject << /Im2 984 0 R >> +1326 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R /F53 1002 0 R /F41 910 0 R /F62 1035 0 R /F63 1038 0 R /F48 925 0 R >> +/XObject << /Im2 1024 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1297 0 obj << -/Length 3863 -/Filter /FlateDecode ->> -stream -xÚ¥ZÝsÛ6÷_¡·“g"_üš¹¹™4qzé\“^âÞKÛJ¤e^$RI;î_»ØDR”}ŽgL`±X -á»÷{½xÛÀ‚Ã5±ÜÕ@°[R¬«´±†OEjÓŒ–Ôt`EIº¬ö‡]¹/ë®,˜PÓ—ÍJ™˜®ÈÆ™Ði–.†Úükd@óqÖº:Ù_3Ÿ•ÎDš&àÒÚ -c¢~¯¨/ÃH4°´¨ÕŒß3—qJl«íê!ßUEÕ=*PájS])›kUrê:7Àµ²yìf¤…ÊhŸå¦úMJ]¶×+#Ͳ»/©P÷ûuy¤rsGß"rl¶ºk&îú®?^«tÉõÇû²¦ÒÛŸ?ß¼¡2,¼Î=#™÷]³Ï»®LRŠTð·à[0Ïj“ïvOÀ®är[Öå1wVg”Zæ-‘sª²ä~×ÙÍèÅSï«
ûCZjùMFrªz
f -Ì4–"Ó©Ã$j<nÙ»>ý04æ_
;œo¹\·å¦«ššæf…žÎÆX8'lfsfë…9œKÃ9€Mà±ÚíH3å·CEú„Æf -ŒË‚s3Y'ˬ7åwª]µŸÖ×›¦?¶QTvn%Ò¯€”ŒNƒpS—T¸o`0WZ—wëί°°éD¯;nqSp%ã6TD!D£Ï®ÚWÐHÛ7½—‚~áÄïšÍ*¶_ÊÇëL/Ï@Û#],c‘H›¼ -(åÁ= Ò·eñŠ°hÝwDëh¦2ýR瘎º~ -¨°Ï[8†1Pf¹ÛêÖí.`>¿iNt±/M{s®ZPK× üvÝÎ;ôÐœ+’<rúêxâ—gDÄRa üšš‰ÍÉÔLl= Îe¤ƒép[C_§ÇCud$\EZ]05 m|fsÖ`(D÷ž8ÕOYÁìpÖ,¥ë´Â}FW¶6*Â#GŽÈ^nwÍÚY—‚Mr6—z… À ¬œö*.à¢"ÙüÆ"o]Ð -×Å°ÕiËãz;ö ±
q÷%¿ˆÔâÖò,R¹.#uàr[WÔíª/«¶úãe•†Ø-QÙóî™ñÍ$‚Há¦4žÀç²sJJ¼rb°pp ®jI7ÉòNjùåíÏDZ÷w¨ì;r´défïXÜ¥9žºÒ!˜‘Ëÿ Õ±± -ãåa˜ˆ‹aiÍ”€·î¶j\ú{€‚ƒŒ¦]0ƒm!FÃn%aу“öéÛ>çi¡yëN¨“ËàÊ®C`œñ€±u¬t̪‰w(AµnêÕibq&óÄB—}æ¡mD!uûX'l‡¼m©¹»'\í·÷Ô´¦ú¼‰`=ˆÖõzåÝJO‘ÑÝ1߆›.ÔùæÛ¡óçï|Ô5èö7avƒQ·a´·emw§“ ¯©ÄF&½…^òx£…L2ó‚ǸžñxÏå3¬.:<JJ×>;zàšÞLò
23ñx|rx“Z>Ò p:‘ BÞŽ%§q×^¶m¾ef2E,ÁÐ]¡Èwl.k¦!à×#A¢ô °iäÑJXL¡Mf°§Æoœet0ì\Ë € - 8،Ǥp`α¨`ttŽ -H$GÅû4‡8€õàÚXñ80éCV9e>‰6ƒ•0_=·†)*¸‹ø-[Ž\†o]”°ðrzí‘ÅøðôAɦ¬˜a|tÊ.™`‡N0‹#çㄉ¯ÇV(8ÑeÈ=\6‘Ù(~؆\—-p°aÀ›¿+W`Æ{:Føf"¡“Ä>?‰À53‹¾Y A@šŒ§1NÁ)¾ú`¦FežŸ+SJ+å«Ñ‰³õ•H¶åùÂ)ÐA2ZË3)ÀÿªÎåNRZé2F$góI!4Æ<¯ÛÀõÒ,Τ¬ÄúÔU:L]¥!yÅù,–„#Ij¶Ó®üÖÍØ2[¾–Ó+>t,”Ç^ûx_mðÎd¥àK»ín -úMTâ·|Ÿ?‘Øf_±†ÚÆ%#z$ E°V6÷åæσ
ßé´éw×jÉÛ¿æÞpçGMx«À¨Â)MÅR€YN”†Š¶ê´VÓ°?ͨÐÂÐUhÐeå`cÜ)Y¾gé‡ÎÊM¿Ë9Qt®×Ì -sB§ƒj·;•‘Ɇ¼-S4´ªÚ=¶!?\¨GîLóKUZ‰H‡÷Åcþ8·T)ŒIæVêbòÝ¿²lì»û2¯9nt)fí}a? L÷jsi’îö±Í^š¤d4š% ÝC¬Kƒ¯y¸!l@õ±êló=—œ¢©¸+Ê1柰e˜t!ctM‚~²<s¢2£,~ÙϬŠ‚%45»í9¢(ž”ò]g¸àØèÜ+,Wé¦yq:*5`Ÿ'.Ä@“Ù¥`§2˜'ÌÜ•d’&£l,¦Éržøºd{‚@A¦“sŸÇª(Κ„sÛ)å°ÓQvŽã—$t-ë¼uJFwj -ÙŸ(Kg¬ÿœB$¬@úínIœíU¼ŒùMXPi5v'–¶xöDÀ8ÝUÞy—w*™•ëpò
2U=}r:³?÷“ý]Ó5z–)ý|˜>亦.ç» -óà+¿áîcðè3Û~öžk2aÓX=?ÍÀ53ϱ&°1„£‰ú´Œù•AF¬R‰iƪ«èÖ9íÎï.Ò§š¡5$:°Â/ò|,jØñdr,Òå.òw¸þØVpÔ–DmAԂ̪é[J -#üßìðî~.4¼CòK2ÓÁ=’æëAÜz£ŽNï6>›B [žÊl_lðÑÓƒzü0õ‚²‡Á -PòÂ?ÿb]yµ"TÛØg‘“8Ø¥Ä '21ƒ²»£R××<'ƒâS‚{×,_ìæR6>a$ùˆ”n·eRL$‡ä Ó=ÉOâ‹úèíBIyáeÊÍW»Plï!æ+¨LRL\ˆtﯚ»3=(¡½Un&*8Ú³ ‡Tð%[…BNo©ŠÔ=f&ÀBšxä.ÿRòtÝ&„ùµÍîaöéêdX8gÚÞßlíôã$’SšÁ’€X~Û”>Vñù>N/¾:‰/¦¹?ð’~Ò„>N©ºa>ó}ùŽŒs Y:ý¦ëÁ</ùÐÔ-e}L¼<¸´å@âi -jp÷nhÐ’ê +1337 0 obj << +/Length 3765 +/Filter /FlateDecode +>> +stream +xÚ¥Z_Û8ŸO‘·Ë +÷7M"•¤ FëH ¶÷#Ø1fQlD>)¢X+‘ãÓõÊÊå-ü¯–gÛ‘Ú(ƒXXXl&Sœxñm!#a²LÏ íVz²€#üða¯oXÏb¸$–»v+²jà°RiØ£6‹£L›Œ–ÔtàDIº¬ö‡]¹/ë®,˜PÓ/{!´²hº"c³H¥YºóÏíÃÛœuuò±?ç=+•Eiš@D«8’qbçÃ^F‰”Œh²HšDžüB΄}àB#¶Õvõ甆êžV˜ð½©€;2F&‹ágj®=ôp7c Œôør(7ÕoB¨²½^i¡—Ý}Iºß¯Ë#µ›;ú-ò'Ǧ`«»fòÁ]ßõÇk™.¹ÿx_ÖÔzûñË—›7Ô†…×¹gä9ó¾köy·ÂõCÜŠ(UÂ-„èYmòÝî Ø¥Xn˺<æÎ봔˼%rN]–Üï:";Ý^<Õù¾Ú±? ¥‘ßD,¦¦W€Ñ)†Õ xˆÌЦ4xÜrt}~?tæ_
?8ß„s¹nÊMW55éf"5ÕF8&LjGÚœ9BàzA‡si¨XA’ÕnG–)¿*²'œ/&˜r›Ö,ïò`âª%”3rqd%€:Áœ$<¹$ „&± wEäFÄ‘–€<#' Ù…XîóïÕ¾ßS§gzÕÒ¯ôûTæG&á&kka@e™› +ŒË‚c3y'ˬ7åwº]µŸLÖ×›¦†8öQTvn%¯€Â
ƒÏߦ.©qßÀd®µ.ï?/ö]\acÓ‰^w<âTp-ó6ÔD!D£Ÿ]µ¯ ‘¶oz/ã‰ß5›¯Ôl¿–×™Zž¶Gº8U +wÙ˜@z¨9&_4j¹Ý5kç[¶Èy\ê
‚ƒA°sÚyè¸t‹šäeÐðÛŠ¼uA´]¿&*Õòô<A²Ë÷‡Yl÷€MŽ
3k9®‹á¨³–GõvëAb²4þ–Üû"N›DÁ
$~§‡\—q:p¹+êvÕ‡U[ýq†±RAæ–Èìùé×Ìüz’?¤pO+ð¥ìœ‘oáÓU-Ù&YÞ@ºI#¿¼ý™Hëþ}Ga–,öŽÅ]Yã©+~i±ü7z;°(¶“CA'–Š8h¿’¥™¥.Gù$u±NÆqÐô][(Lár0ŸPÊ.ÂD¤L[k¦´ +©ÛÇò8a;ämKÃÝ=¡j¿½§¡5õ¿â=ûA´®G@ðU>›ªOyÑÝ1߆{.ôùæ+û¡‹ç|Î5ø†}oÂì&£Ï†¹Þ–Ýμ¦;™ðz)â!a±I^ˆø×3ï¹ÜQiÕÅ€—i$%Dí³³®™éõ¤Ú 2mÇóSÀëÔð‘Ó‰Švl9‹»ñ²mó-3“+b®îÊM¾áàpY3
‘ +ZéÒF:JÎôI!
ÔZ?oÛÀõ’gÒNŽ^b|á*®ÒP:‚æ|
KÀ‘$ûiW~ïf|ŽŸJˆé ‡4vŒ£÷ÕïLFRñ~i·Ý +´Ë†\ÊÕy©²cðç'>“˜Ž5èj»ŽüÄl÷åèH#£ÿ’âøÕ¦ÙÀ.:Η¹z¾¯8vM³CðL5¾j”4'çh0+U°‘–kI‚©Õ˜©¨brÕŽ +;*âÌdc[øÀV‰¾´7±‰²L$/l
Zë”™þƒÄ]“X&97‰#
·«¡åf¤‚}™ø-ßçO$¶ÙWl¡¶q¥È„žhl•Í}¹ùÊz°ã;›6ýîZ.yû×ü5ÜùÑÞ+0«pF“VDà–Ù8ŽÐÐFžöÀ(ÚŽ§:@ú¢ 5†¬lŒ» %Ë,ýÃY¹éw9—‰Îíš™HŸÃÙ`…ÖmçA i®Î†¼-ÍS4´ªÚ=µ!?\ªGáLƒóK•JF± +¯‹Çüqn©"Ò:™[©Ë!(vXŠÎ&þº/óšóFW`V>&€öÚt¯Ö—”„?µ&{II‹x¤% ÝC®K“¯yº!l@÷±êló=·œ¡©¹+Ê1æWØÏ2,º3:‰'I?yž¾ +~*ìÀ]¸`æ®$“2Õb±L–³âë’ý ‘NND¬|«¢p8«®l§TÁNGÕAf8ŽG\‘ЬóÖÝ©¤ªÞìú‚kÖ(tfâò«þ?ƒXðÛ5Ü8ß«xó›° Ž¾ÀŽé‰¥L$’àAŒÓ]•M±yg’Y9V…“oP©¨êéƒÓ™ÿ¹¼ŸüïBš.3H ”ÒϧéC®ËizàrÁ°«° +¾òîÞ0O>³ãg¯¹:‹Ljåój®=Ç–4‘±vŒõ5haùAÄlReƪ«èŸîºÖ%ë\vçWáKÍ0 +Øá÷x>ìx29érû;\l«8jK¢¶ jIfÕô- +ly*¦‡\¾Á'_,ªñ³,ôª+@Éÿø‹}éÍŠPm¬¯:!#qð“ƒf\ÈÄ +ÊîŽZ]_ól\²§ ~]³@~¯›+ø‚‘à#R@.¸Ý–E(0uPƒJ÷¤>‰ï飷)Äì»”ÓVžÊºÐlï!ã+¨M2J4\ˆtï®%:»s<h¡·UNíYÃ)ø%O…FN?ÞO%{ÌLû*ñÌ]þµduÝýÚf÷0ûpur+œˆëlîFžvúÃ$RHêÁ’€X~ß”>SñÕ>..¾:‰/¦•?ˆ‘~Š„>K©ºa5«}ùŽ\s:û¦u=¬Âñ’MÝRÍGÛå鸥
«$ +ðb&ÔÀ²3—H åÑðâÁxžÌèSòà݈Ž°Xsõ®¾$¦yå–Îç÷ò·PówîïO¸Ì]"ÅÌFÊàP¢§`ק¥†§ø—•©»ö àÄ×bãÎý ¬Ž#ü»Õ™LA„¿úüÓ{úÛa7…4URŽ$…Ôë[¤”ûËaužŒ‰Gͨþ_…PDendstream endobj -1296 0 obj << +1336 0 obj << /Type /Page -/Contents 1297 0 R -/Resources 1295 0 R +/Contents 1337 0 R +/Resources 1335 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1294 0 R -/Annots [ 1299 0 R 1300 0 R ] +/Parent 1334 0 R +/Annots [ 1339 0 R 1340 0 R ] >> endobj -1299 0 obj << +1339 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [297.8955 657.1224 347.2449 669.1821] +/Rect [297.8955 633.3862 347.2449 645.4459] /Subtype /Link /A << /S /GoTo /D (dynamic_update) >> >> endobj -1300 0 obj << +1340 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [324.9335 350.1399 381.8296 362.1996] +/Rect [324.9335 322.2932 381.8296 334.3528] /Subtype /Link /A << /S /GoTo /D (zonefile_format) >> >> endobj -1298 0 obj << -/D [1296 0 R /XYZ 56.6929 794.5015 null] +1338 0 obj << +/D [1336 0 R /XYZ 56.6929 794.5015 null] >> endobj -1295 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F62 995 0 R /F21 658 0 R /F39 863 0 R /F11 1303 0 R >> -/XObject << /Im2 984 0 R >> +1335 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F62 1035 0 R /F21 690 0 R /F41 910 0 R /F11 1343 0 R >> +/XObject << /Im2 1024 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1307 0 obj << -/Length 3025 -/Filter /FlateDecode ->> -stream -xÚZÝsã¶÷_¡·Ò3‹’ -½\7]ù´_æE•íÇ&óˆ…©LåÂç{$½§š/=ñ<ŠÃT°d(ÿa]€Û• -HÎyð
h”5N$A[¬š:oÍh<ÝkQôSu^ÖÏÄ -º–ZÍM“m4öR´mö\´4óÔli8£ÏŸM]Àù:õzÊvUG²Eç,–lP¸œ‡icßÅö’ë ‘fäô¥ˆÂ”%°BB=FžÀ_8œŒÁ¡Þ•U·4öÂùk‹í×bKí²M_²®lì$*ÚZ1¾sŠÃ8VüàU©Ì¤æÁ†´üZæè3Û¼XºuQmžvæeö\7mW®hr tkbµ{^ÓŠŒÆëÝË£“†›€c½qØ#ý
Á®Î½Êœ;IùÎ(/U°i‹]Þ,»f³¬Š¯EµÌ›—8óeêŸ-)Â$VX!‡Ç²Î'œ$T(–ȨRPÜñ¾‰4RqKXôå~‚#}•¥ZUYÛ"Ì(;ÐZ3œÍR™ñ›3/ÛvÔ2¾Âiêz.ƒÞײx¥é_XÌÚ¢8…L ,Ð~4·}^Pãn -“}úãp=âŠÞ+{yjŽ±àÇ !Ã4bb ÎhXª3ZsC5Àœt0¡_ãú‰m”i‹’3ÛTš‹ÈR½®Ë՚ؖ-}Û6+ëžèô¿Ðœ9®Ø8 -ÊP̉üÄ Ôj´V Ñ„UˆLPÇÈnY”³‘fk½T½T Ø91³ÇxtÊb& -±vTz& -=ª™(tT¨ëŠKw6aU—är^°#š<8cPo‹4I¦ L’ƒ -¦×¹á> -±í¢ }…0GQ
ûqQMãfŸç©(Ô<ŒT’Úw - -Cð·L†AˆB¦ƒ -lˆ&
È3§7E#¬O×SïpòÝ,(Dtâ"¯¥qLÓæKwkp˜îýteµ.k–RžOâV'Þý'¶•œ\¨·t4Œž§®#àÒH™„*"‡¢0ð\tN%¬Àmñ O»Ú”Ãh s7GX°Ù–/™9ØÙm7)f"‹Ð0hË«H»¤áÒ~Må“PGÔö -£®.%>ƒ‹m/žEÐãÙ^Î6Ô52áeá*k;ê_PÓ$)VÝRôÞÑ·¯ ›AèB͵¥VPPƒ78[B‹xtƉâÛ·S ²'"╱©YÄFiâÿ‚vQ”@MWY´ó©N£]OåÙ á²Ì!/E¬Å¼øžjBþô\[¡f(`AO7}ˆRS°§<ØKF°§F°§ŽaO‡=¨ºÓ(qró1¼¿¾û÷õÝÔÅ! ¡êÞ -zPypÎ’÷TFã“0Ü;¡2‡›Ë›*à#ЮÚ)÷0F˜`Küº+÷0ÁV&ø¥ÛŒ L¸äÁ8XðXeÄǶ‚¾\qÑeM@£Q -š'í&[vù¡Ûmkš¿ýéã—ÏW7·Ô£ÙvÓÔ--d–Œ|žz²Ì$|).WË)3vUf.›æçѳRq¯´r~ƒ)6ÚÞ†Áï"°syn&maÈ{õ„Þݧ´„§\Û5f·sq rB*Äaö–¬jZZÖ«j—'RŒ4(ó5†yÒÆo~üšÐ9‚4è™AsX‡#j@³-Ÿë"ÇÐAÂ…ÝqâAUÖ¿Íñ4…¸²ÓØW¤ÙLnÚc¶ú;ˆ
ÄãD¿nµü µ««›×úh¥Mc(D‡2æÚG!!R›a°•u"êÇèü |¸†hz1w*ì–O––>¯hDBì°4•}(É÷4PüQ¶æw8hÓÖ0ª „¹_”_íBÜ:¡<PÔþ Ù$²í+W¾Dx›r¥GÓ—þy%ÝÖü^uÈa½c3 Eˆã7VÖšÎú>£OqHÖôØ:Ãl”{넪ªm…ÿꀻ-I¨í’ªl»á}e$Ë‹²ýÛ©Ÿ}þ8 ãtþxŸÊÜ zò’+4µôxѯ,Ç×Á¢HÍKí©ŽÅ«q–â]`(–³ðævyõñã]xu÷#>¯_2§øÐÍ[î6ܵ{NäÁì±ÌI«}™\¨·[â0’‚Ÿ1Û£š±ÛQ7|NªgùXì´é¾XGP~¥o·?V!ÓLž±ß£š±ßQ·NªgÿXì´ý¾XSzŠ·›/u¨ÄÙSïQ͘ï¨Î›?'Õ3,vÚ|_,Wï3_°Pª$9c¾G5c¾£:oþœTÏü±Øió}±'Þe>! kÞ|jÆ|GuÞü9©žùc±Óæûbyú.ó5^X…ž·Þ#:m¼#:kûœÈƒéc™“–û2á¼Çð$ÏBþæ´Ù–æ¬Õ3òFNÚì ü]&KÌ“xÿl ø?ÿ/¼ƒ÷"JO<¬J†ï©©rJ™g9Ö<\‹µPªÿÔ˜Qendstream +1347 0 obj << +/Length 3187 +/Filter /FlateDecode +>> +stream +xÚZ_sã¶÷§Ð[噈ł›'çì»*Óó¥¶ÚÉ4ÉMÑç(R);ʧï. @‰¢|ÓN.C`±À]@æÿñ‰V“I8‰“0PŒ«I¶¾b“ûtÅ-ÏÌ1Í|®Wý(ãI$‘ˆ&‹go-0ùd±üeúáï7?-î®gB±i\ÏTĦ?Ìïo‰’Ðç×ûóOÿz¸¹ŽÃébþåžÈwïîî?Ü]ϸVæ»Â™ çÿ¸£Ö§‡›ÏŸo®[üxu·èlñíåL¢!¿_ýò›,Áì¯X &oÐaO1Y_…J*”ÒQÊ«Ç«vz£fêÐþ)©¥E<°BzÈ´Ãh«$ˆ$áΟÑàä=Î ‘‘‚å‘eþ1ËÊ"¯Úf¶É·×\Og¿ïòíÞÎìË!#;³h®g¡ÐÓ&o±OÛšÒ2õwÐÅ´]å
@ËŒäÔuT5ÍßmPCzªwÕ’šµ™e秱ëMÝä–ãi?`åŒsðX(l‰RÂ(½Í³Ý¶)^sgô€™qD‹ÌNÜ€L‡Æ<"¦ä°Û[¦™ÏE§Æ‡ÜÞq¡Äªn‹çýl™—éþX8ñô9.½ãß;ÐP‰`Q_þb$âxJpΧp”BËiQá@GžÕÕ²1Ôpú”·oyÞ
UË¢z¡À5jÕÏ4L¶m7Mú’74ò\o‰œÒçϺÊ!`¥N|…žÓ]ÙR§0g7™I°!Ïï³óÁ`È5D$,‚R±”6ˆ<‚€ŒÎ슲‹š|ûŠnˆí¢]×i[ÔvUr$¢T Àû*õa1©ùtCz¾KÜ3Z¯-ß*/7Ï»’—EúRÕM[d4ØÓ íŠ–Ú½¬hFJôj·~rÒðöÔ‡=Òß0@Ø/î+ëohk”—ñtÓä»e=këͬÌ_ór¶¬×)¬dÌ{@#E©XÛ@z* ¤O7IĈ¹‹6£HAq§''ÀŸ˜[^H_VDç×:¶\Y™6
"?@œ@cÍp6K=M(óÒmK-³W8L]oË ÷Zäo4ü+S¬ÉósÉ""ˆØD@Û¾L¨ñ0”&}þÓ€=Y-|Ì3ë‹<1n,ä)lHÈLôÔ€
ËuA‹ÓÕP
ØN:˜`‡¯Ùúc”I c]8FàÒ\„–ëmUd+Zó~›+m›>“÷¯i̸+6:µNE˜uNEÁt‚óZéóû¡t€‡Îs¿ï“;!žáARDÓ´ÚÃKY?¥¥ƒ.
+‹CÛ×;j<çyÙÍ 5ª“µ!YIË¢IŸÊÞÊfKx¥’Œ;8'p6ò`'e¤§;Âah! Ý&ÉPA6³¯15ìÆ[¢¯ +bU5#HÈ9”ÌBxÚR‚´‘Lâ…ø 5lEt¶àQ* +´Š“ñ‚Çç:_ðt\fßr(Éêê´¸4á¸àŽk@r?Z!Ùk¸tôDÛÒBw:˜Në¨](b{UïÊ%µ)´7õ¶µ³‹”öCQgšTùxkVé:È–"‚Ôâ|‰ô ÎdÍïÌñoE»²Rö›¡Ä už”‰Kœ‹ŸCpMéVüŽ¢1P×Vg13Ät/.Á:Tš¢ËÎXá%–FÐèà;ôømÝ(m{ZR¯;2ìtU´M™yn{Žpß±Œ¦›<ƒBs ?1()u|tV Ñ€UˆLPÇÈ#ܲ(g#ÍÖzÔ½T"͸‡bÖ= ®Sä#QÈD c¥/D¡Ç5…Žu]Aqé|³†PuI.Ç;¦Á=“pƒLÂ#É„QtPÁôZGî¢Û. +Ú{Qc…а…Ð4Ûì¯y. +5Â8JìÑ;…Î…!ìww¶AˆB†ƒ +lˆ&
·¬^8½+a®:_O1¼ÅÉo<XrA!¢#y
Ñ1M›/ÝYü£A2Ý#ºa%[•ÇK)Ïgq³#ïþ£l%žõ–ûÑóL¯ +|îé`¡õè:7.Œ¥©£`Ý?Îom…ÀÓ=þ$THÓÊæÐ…Õ;s‹¸<¡§žØ£FÂÄEUÜ9ãü6x¼{ø÷ÝÃЕEQõk\ø\Í#•tIü}(‹Ë-obtò÷¡lt@Y\rA{À „Ô„p„¶‹[BŠ!Úíg˜…˜Án&á{€&ìYh¦Ákø¦ôñÀ¨7êÀ;™…í÷ +“¶@òÞQ¡÷ðñMܤísÚ‡15•**íáö–ljšZTY¹[ægURi,yOc'>ÿé5"’qA"zfÐÖÁE‘ÁK•/1tpeÔħeQ}[Ó<=â«n_‹z3r¼§4ûjØzÚ!Áì _Ûõ µ«¾Võ[u2“Jd#DœG‘AB$6±`+m[„ÔÏe|‡PZ›+v‹gËKV4Áà!8,Oiß]–{"äùaÚt.Œ®+Â\WŠW;OÜÓ!ŠÚ$KÌTÛ7B®å±mÈK<žî&±Ì¡NÛšŸ¿ló7Ön´nüFfiíÞ§ôÉøoMWv3ÌA¹§S(òÁ£X¸³Ìv[’PÙ)eÑ´ýëÏ‘,ëEó·s¿"ñD૸ÿŸË\C Ùz¹5¡ËGÇE?Ú@:<¾ý0¸¦Da<.µã:;ø‡ =±œóûÙÍííCpóð¾Ößœ5ë<üzÜtkÄtÇuÙô1©žéÇb‡M÷År¸G¼Ûv¸ò$,¼`úiÄrËtÙð‘žÝG2‡Íöd +B핼ßr¸GÅ:¾dºÇ5b»ãºlü˜TÏúc±ÃæûbMÝ)Þo>\L£˜éæ{\#æ;®ËæIõÌ?;l¾/–Çßf>ãR¡¸`¾Ç5b¾ãºlþ˜TÏüc±Ãæûb1O|ƒùpñ'ÐQë=¦óÆ;¦‹¶‰<˜~,sÐr_&øÀ·©@ÂMnÔîÏy³-ÏE«GäŒ>8h³'P°o2Yª +´Hb§”¹4Ÿü-I÷‰§ªÿ-T™endstream endobj -1306 0 obj << +1346 0 obj << /Type /Page -/Contents 1307 0 R -/Resources 1305 0 R +/Contents 1347 0 R +/Resources 1345 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1294 0 R -/Annots [ 1310 0 R ] +/Parent 1334 0 R +/Annots [ 1350 0 R ] >> endobj -1310 0 obj << +1350 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [84.0431 641.5322 144.9365 653.5918] +/Rect [84.0431 618.9895 144.9365 631.0492] /Subtype /Link /A << /S /GoTo /D (view_statement_grammar) >> >> endobj -1308 0 obj << -/D [1306 0 R /XYZ 85.0394 794.5015 null] +1348 0 obj << +/D [1346 0 R /XYZ 85.0394 794.5015 null] >> endobj 410 0 obj << -/D [1306 0 R /XYZ 85.0394 712.9977 null] +/D [1346 0 R /XYZ 85.0394 689.8743 null] >> endobj -1309 0 obj << -/D [1306 0 R /XYZ 85.0394 687.4208 null] +1349 0 obj << +/D [1346 0 R /XYZ 85.0394 664.6429 null] >> endobj 414 0 obj << -/D [1306 0 R /XYZ 85.0394 380.6895 null] +/D [1346 0 R /XYZ 85.0394 358.7368 null] >> endobj -1311 0 obj << -/D [1306 0 R /XYZ 85.0394 354.6244 null] +1351 0 obj << +/D [1346 0 R /XYZ 85.0394 333.6847 null] >> endobj -1305 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F39 863 0 R /F14 685 0 R >> +1345 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R /F41 910 0 R /F14 717 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1315 0 obj << -/Length 2268 +1355 0 obj << +/Length 2204 /Filter /FlateDecode >> stream -xÚ½Z[sÛ¶~÷¯àôåP3‚+ ô<9±œ£Nëä8êSÓF¢bÎȤ¢‹]÷×wq#AŠ"«z¦“™h |Øßb-‘Ã?‰%Šª(U LD´|¼ÂÑ7èûpEfêAÓõnqõö–¥‘B*¡I´X¾$ÂR’h±ú-NEð€ã÷ïnç~½¿ž¤<^Ì?ÞM¦TàøvþóÌZî¯ùåú~2%Røýÿ®?-f÷¶+q>ÞÍïnl‹²gœÞÏng÷³»÷³Éï‹Ÿ®f‹ZK¨—`¦…|¿úíw@öOW1%Eô¥hôxÅC‚3æ[6WŸ¯þ_;zÍоøÕ˜)ãHÿH”…B £¬Ž2áA”S (ð(å/˜¤]©)ø#’F¡»R:%³!• ¥D›”RDRŠæwÓë››{t}ÿi¢h|}6äœ *( Ä{Ô¨ø!ÒF|—´_|HJÙeâ!X2%jD|€ïQ£â‡Hñ]Ò~ñ!)å—‰ÇqEäˆø -'I4%1éJÐìq{x™L)ñŸU™ïµÉãl7!2Îmû>?²¯÷”,äðàžŠüÙZ›ü)ß8åʶUåƹ϶[kÂتºw¸µíZn²½kšß!kÜ{Í¿²ˆ¼gÆ¢ž±VŠA"AJ+ÑM‰¸(ò]q0žX¯Í˜êÑvVÛCQ•{ÛU¬m#¨¬CÍM\ ¯¬l㪙´úéA‡Ÿ´î·ù²ø‚1õÜ&Œ–À6¸02FΰˆzýOõ”ïvŪ£ÑÖEëFà@<lŠýÁ5¯íg0Wx2|cí—êheV¶°ö¡&°1«ke‡Ð ÒÓЂͺÚY#ÿ#{Ünòµš··Lµ·SÊ`#ÀKcÂnj7™© ïÔÒ&Ç? þk]´6Ç´íÃþ1u®ƒ 'U…Ë Ç ‰÷EùÍ>Y³ZY”IKhØeå·ÜÙK½&¦we|º¼ÑË—6Lû‡ê¸q˜lc1ÙJç‰ñCöäÈløÜ»ŸBž«5¿ž\f«ÇAôì´qÜçU eñ¼´-Û]¶<ËÜ> -7¶jží܃ެú³Ôk®¯ïRW7,³½³ž‹Ãƒµ³òÅZß0m?™¯¹Q`«<d§šlnåz—í»‰ŒËñ^³Ö+ßé`Ù›Z`”ÙcîÚŠÒ~‚ë½³……Ζù^o±”ÅŸ+ÛngZCtüðÌYûl¹3yYd›žI<çáüÊ<_™ÔÐ>ª¾ûêvË*ßnª¿1Í©÷âCV–æL
w–Žè‹ÛZUæ†dÏ™kŽµpÔ¹0B—S€ÎÕH*$¢Œò¿õU¡Êïÿ*ÔÃM¤œž÷eÇaðåL?¢íª)Î$å(²U'믣nÃ)I"Ê‚…³Iu"áD FB«Äñö -vL|òøÄ)M#Š1’‰4¯0Ñ÷^O¸RÌ‚Ûhmb`ÞÎitS¢(åOCÏFTBƒóMAͧ)ð…$Æö|[˜¥Ne¼Ëmnªx›íòò`[a•õ©?M(”)›°2^O ÉîÕlÿ91Õ;w°ú -Q©dn§×íPnþÄ ãióÍíëÎ)Üa%aæ2ËDzæMj¿þ2eJ8ì˜ð/2¤ç«tÒëcoö8ìÆ<"ž@X¯'Ô5è”;¼žJçpyÉ?ë;âZWM¦âgSq´åfcl]Ù\¿ÉmÙbmm½ÚúÓ–f0ì)éSêÒ¢[>¼»–•ùt¦„jÃeµ6ÍDÿ6 -mۣʿk@C;+t—ÉŠ¦«É -ݹ®àÆ´³v}Üñ:18¼”ùÄàÑ„ñ×$Æ -{[ÿ÷!ˆûýƒOƒs> ¦I£vªëM~’\"!R5Ä^cNè[9 ÆÂàØøgeóæßžZïf™_ÿj§+#ˆw/þŽ¹ÎŽ›æ=Í5gáUÐ -\½ -2ô¯lzâúÎõêüwI“òÌ) -åq NܤÌo¡øif`¸¼Âíétꎘs’endstream +xÚ½Z[oÛ8~ϯæee fy•Èݧ´Iºì¤ÝÔû4Õ–Žäú’læ×ïáM¢eY#À"@|D~<ßù/¾ÃID†2EU’+Ž&"Y<]áäô}º"3õ iˆú0¿zÇòD!•Ñ,™¯_a)I2_þžfˆ¢ xÀéÇÏ÷w³Oÿy¸žä<Ï>ßO¦Tàônö¯[k}z¸þí·ë‡É”HAÒÿ¼þ2¿}°]™óñavc[”}9ãôáöîöáöþãíäù¯W·óVK¨—`¦…ü¼úýœ,Aö¯W1%Eò¥hòtÅC‚3æ[ÖW_¯þÝ:zÍСüµ˜)ãH$ËB¡ŒQÖf™ð Ë9Îx”Îò7Lò¾ÔüI“ÐÝ ©’‚Ù‘J‚„R☔DrŠf÷Óë››týðe¢hz}6å£<g*">@ˆ÷¨¨ø1ÒN|ŸtX|HJéeâ!YŠˆØú +P#â=**~Œ´ß'’Rv™xÌ9‰ˆP#â=**~Œ´ß'’R~‘øL^I9.>DߢbâGI[ñ'¤ƒâH©¸L|&ã˜GĨñ?FډIiv™xž!.#›} +ÂËE¹M„¨‘lyT4]c¤]¾ú¤Ã IoÐVû×”‹I»?†¨åU>FÚ)ï“+I%º½D;S3¹I„¨íÕ>FÚiï“kIÕeÚ)ì¿2º=¨íÕ>FÚiï“kI¯/ÓŽ b”Eî!jD»GEµ‘vÚû¤ÃÚCÒgµ'SÊõM3K¦D")¤=|nŸ6û×É”‘þÙÔåN›<-¶"ÓÒ¶ïÊý¾ø¾vOÅÞBö®á¹*_¬µ.ŸËµsP/m[S¯ûb³±&Œmº¡;‡[ٮźع¦Ù=²ÆMµÓüK‹("mÄZ)‰)¸`‰.&Òª~,·ÕÞxbYº2cš'ÛÙlöUSïlWµ² ²M4wy¾º±Ë.<hõáA‡Zw›rQ}Øzn“FK`\™K#HgX¤s=Ž§y.·ÛjÙÓhçݺ8Pëj·wÍ+ûÄ +O&ÀwÖ~mÖXõÖ>´6g;ó`bß:A:-ÈѬš5ÊÿO›uùwæý'ÇË)‡z† IÜ›bÌÔ¤wji3ŒÓ_Ð/ÿ°.ŽÇô؇Ýf: *sRU8ðp˜tWÕ?ì“•¡1Ë¥E™²„†mQÿ(½Ðsbz—¶Á—Ë;=}yÇ´{lk‡)ÖS,u(‘>ÏŽÌv€Ïkð%乎â¨õ Z=Ž ncÐÆaWBUe”¥³Ú¶l¶Åb_-Jû´¬ÜXªe±uz±ê×ZϹ6¾¼+]Ý°(vÎz©öÖz*êWký<@Ø>˜ï¥Q`Ë2d§šlmWõj[ìöÛ‰L‹ý¡³æ«ÜêdÙ[Z`ÔÅSéÚªÚ¾‚볉.åN/±œ¥_Ûn# ;~xá¬]±Øš…¼¨Šõ@/e_]–KSÚG34aßÝjY–›uóê¦Ù õZ|,êÚì©áÊÒ}uK«)Üâ¥pmÁ¶Ž:—Fèr +й3’R}b0ñ—¾»"Á±Ä‡¿»õ’!‘szÞ—‡Á—3ýˆcWÝáL¸@4WG3µ9^%E,'YÇ„þÍÕ}°iˆ¶ endobj -1314 0 obj << +1354 0 obj << /Type /Page -/Contents 1315 0 R -/Resources 1313 0 R +/Contents 1355 0 R +/Resources 1353 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1294 0 R +/Parent 1334 0 R >> endobj -1316 0 obj << -/D [1314 0 R /XYZ 56.6929 794.5015 null] +1356 0 obj << +/D [1354 0 R /XYZ 56.6929 794.5015 null] >> endobj -1313 0 obj << -/Font << /F37 747 0 R /F14 685 0 R /F23 682 0 R /F39 863 0 R /F62 995 0 R /F21 658 0 R >> -/XObject << /Im2 984 0 R >> +1353 0 obj << +/Font << /F37 779 0 R /F14 717 0 R /F23 714 0 R /F41 910 0 R /F62 1035 0 R /F21 690 0 R >> +/XObject << /Im2 1024 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1319 0 obj << -/Length 2683 +1359 0 obj << +/Length 3055 /Filter /FlateDecode >> stream -xÚÍ]oÛ8ò=¿Â -ZëH‘©½§´M{)¶é^šÅ°ÝÅRádÉkÉù¸_3’’91¶-nÉáp¾8šÏüñ™Q1™œéLÆŠq5[,Øìú>q7fîÍÇ£Þ\ýí½Ð³,ÎÒ$]^h™˜Ãg—ÅoÑÛœüryzq<O‹Òøx®R½9;G˜Œ>o?Ÿ¿?ûðëÅɱ–ÑåÙçsB_œ¾?½8={z<çFq˜Ÿ8 -{&¼?ûù” 'Ÿ>\ÿ~ùñèô2ìe¼_Înä£ß~g³¶ýñˆÅ"3jv
ó,KfË#©D¬¤S}9úg 8êµS§ä'•‰U"ÓÙ\%±aÉ´YÌm®%Ó,„œð)!ûQ(ä¢êò«ºœ—ËUÿ8ÿoÛ”»ûæZʼndélLý aÔbÄf“„gÛ\¼#.Pþ"ªš¢º«ŠM^SÛ²† Œ¿ô(x½q¸¢¼Î7uOcÜ€…òõ17‘k¸]85aÑåmÕQG»ê«¶!x‘7DñÊÊ -ÂüÚTó®¬ekƒ}¾\ÁÆe£e™w"\R<rd»rÑ6…oTÍÂQù˜7›|ý”2ò„E¦"ž‹ÏS¥£÷m]·÷Us=©rzij@PðH®+וÝ'Àíõ0££QÀYŸW#›úY‹vÓôVv¸Ôãªtüô·n©»¼Þ¸…<ÕÐç'[sžØ…„¼®] B‹1ù’LJF &'‰è®*ïi -ÑÇrEí¶%¯’a–è«×`’äD[1NF7u{!skGd¶\¶}Ý® °2A -6Ïbmi´Û,e×Mh^¤†EW@¿öÖ°²à§ŽÈõ¦&üࡱÌ7ÕZ²vœ©pŒ¦i2b<ÏLtB˜ñZØƵ ´þߢÄħ± -ÃoP6œÂÜVX¢RŸ~ xþïwŸ?œO¹Ð–ÒžQÌhÇeG’*N~)Ò‰”ÇI’‘®óªÞ¬Ë ¯ ®õ%¬X\Ówð%bâw|IQ¬t'Á&1àSPu@Äs¹t[†šJ%µ¾?¿jïÊgT:’Õ_Y¥ µÖ/ÅF7Æ^‹ÍºÃ:ÒaΖòÁÙR:½784¼³¸È7u3Û{.a²°-¶@çŠn“š„Iz"u{Žéºä¾-U‚šÛ¡xÔ;w'‹¤óùŒ½/î5€‘d¿—ü€Ô9Ñ°¨J_ôi.bÉŒ+¢nV5\ÓúC½ZŒ’gá’g1N–¡á]Zø,Y„k¹…s¸Ø.WääÂfÔ{Ã-êµf”«Ü™+¢‹–,ÈØj~ʼYÙ›–QC>úƒÕ¸]¶¡óì—©ã9/ -Š:¬Îè,ZµëÞ‚Æ“ÆèS®ÛÞÞyäZXÕqa«)XÔy×9\M´ób²>uU†ëâÊlñ¢€åß}Æ9Öú÷J„q&)ñê¥L IU¬Œ¦èT¬ÛÕ -Ìä°Ø$‡JD"©&‡¸!6AƒÊ -:PAÕæö*r{E¹#â¬m‚}XÍ"bÇhžåÿÐ\NØ%1šIoÀ™ô=Á”3;DR - -ŸáKƦ±Ž÷ý´DÀÁ'ÄÔï+àß©ò›v2ü&òaL2}ΆóØ1eƒÚå\ ™f¢'Xÿ¿íÎendstream +xÚ¥ZYsä¶~ׯÐ[F© +kãiøÒ‰e£Íš +.¿sñÞhHÉ'ñb„™Y¢ÉNH‰ó„ÒÉ,å˜ +>CY¡U<k„€’bÎ(¹ns"xxO½ÛG}>œ(@ö±IæLLJÍ/a(Œ4úÅ(¢„ ¥}1Š(-¿‹ u‰+"|ì€ ÃáH96m[PM=OðNX}ì™È R`"l¼4 þxôP¥,ªbáäƒÝÚ…ÞOû‚7xï-ÏîÛu©V «¡°a¥¥Ÿ¶,Ù¶øcM®‘†‚ÔFƒDè.P'Ù0Ñóìõv„P¶Œ°µÏ¬š²/ô«¢&ÿ4“üOC´Ó€H,!&¢Í“C|î€_æÉzîœüta!äw‡íZânúnÕ@EéøóJx(µžnø\…>ÿeYYdkûà{Ž6<mŠdB1 +Wr¨CÜ QØ`”õ8ìÉu¾Û$jQ ;Üä +}½ù¶yÈq%A¸ÈmSC²SC‚DšŸ\ô·Þ0`ÊÂì +¡ðý·«°å¬÷ï³,Ï]
ì—MÓNË펞[veÞ¶|è~Ʊ}åN°dۜПڬ‰¡¦@>£‚iÐÇ +g®UD5ŽÂÄìÌ(€}úrGÔ[^E‚ŒEk½9ÌÌ)Þ)*_qk›@«È›óÜÚ°?ºÎz<²û»Ì®yµt&ì×¾……< +-s +WÓÍ ‡KƳˆqéZÃÌ +waèå-;¬ÂÉ¿å¾)¡*öóÏ +ÄPR¾æjO£0}4D(–À )º>€þ¢ÙÎs³<¯\iêMs~wÖƾ,ë]¶{Þfñ-àÍ+6;™õ‚ÍúYÏT3Sµ±‘}…aÖ +3å@Á-m¸`ÀƒÔ“g/è¤UÓ»whSBÕcÍ,5g:°ÊÇŽ’§¦75øö-oÈ8Y{œ¬o +üï•è(9üßÿ$2þ‰„Žãg¬–=ƒ$òL93³KÎŽññ*Zaý¿{Ò>ñendstream endobj -1318 0 obj << +1358 0 obj << /Type /Page -/Contents 1319 0 R -/Resources 1317 0 R +/Contents 1359 0 R +/Resources 1357 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1294 0 R +/Parent 1334 0 R >> endobj -1320 0 obj << -/D [1318 0 R /XYZ 85.0394 794.5015 null] +1360 0 obj << +/D [1358 0 R /XYZ 85.0394 794.5015 null] >> endobj 418 0 obj << -/D [1318 0 R /XYZ 85.0394 711.7496 null] ->> endobj -1197 0 obj << -/D [1318 0 R /XYZ 85.0394 689.4384 null] ->> endobj -1321 0 obj << -/D [1318 0 R /XYZ 85.0394 501.5031 null] +/D [1358 0 R /XYZ 85.0394 676.0481 null] >> endobj -1322 0 obj << -/D [1318 0 R /XYZ 85.0394 489.5479 null] +970 0 obj << +/D [1358 0 R /XYZ 85.0394 649.3007 null] >> endobj 422 0 obj << -/D [1318 0 R /XYZ 85.0394 143.9193 null] +/D [1358 0 R /XYZ 85.0394 161.1524 null] >> endobj -930 0 obj << -/D [1318 0 R /XYZ 85.0394 117.5499 null] +1361 0 obj << +/D [1358 0 R /XYZ 85.0394 132.1973 null] >> endobj -1317 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R >> +1357 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1325 0 obj << -/Length 2874 +1364 0 obj << +/Length 2948 /Filter /FlateDecode >> stream -xÚµZKsã6¾ûWè¶òÖ! -’X¡D
¶•lþûv£Š”)?vjËF£ÑèÇX|Ÿ©˜ÅZèY¢#¦B®fùæ,œ`ìýw<g -†\ß\Ÿ}õN&3Ít,âÙõr +eašòÙõâÓ<f‚ƒ„pþíOß]¾ÿåêíyͯ/úxÎß]þxA÷Wo?|x{uðTñù·ß¿ý×õÅ
ÅNÆ7—¿#Š¦Ï ¡Wï.®.>~{q~sýÃÙÅu¿—á~y(q#ŸÏ>Ý„³lû‡³IªÙ=tBƵ³ÍY¤$S‘”žRžý|öï^à`ÔN´™±˜0 STšÅ†Ð€o‹¢-ªmVž2ÑóÆäØ¥Nžåëb»‚NΕiˆ¼Z7¾Î¶+Cívíõ9Oç¦ÙUÛÆÐÌäñyk¶-õUhr³k¦^]5¦u‹TVÎÂÔ¤ -®ƒ‰ -àÔZ÷Ðζõú# -JÓmvÎ)P8´y+£ß¼ -ì%6öèÈc˜¤ñ´&=ׄ*£]'‚I™ª±.de¡ï"ÐvåGø‹Ì†ž„«Í,䕇{#Pá¦\¶âÈÁ·:4`[hªªðýñêš<àÉÊ‚‡õ†.)@+}ô ºí'›¥a¤Æ…IÃ>òÁRÁýL¨,]k–íÊ”€zpp=¨ÖM‡ÔϹ\Ò(Á,B4‹ˆÐm@Q- -Ù—jÛ°Œ×9æ°ßcܵìuñ
aÑ~nÀªÇвþEÍÁ».µZ9¸ØÀ}¡Ü;!•_+kºM<ô7VîÒ·ð€ÏñÛ,\"ìË&’3úôþᨳbgsôî -soÓ ð¸
òá’ÙnWd¸Ëj€ -9¿Xî_fPÄ©‰ˆN4þ2ƒ&Pðó:>oÌÃÉü?ÔÔœ‰T$“牬ÛÒ
Žöáfš.mµ‚C™ã Wð–™ô…›Ñz‡½Œ;©d¢4Š^½ØØ&2LÅ*š<¼¡Mú³{½Y +xÚµZ[wÛ6~÷¯ÐÛÊ{B”¸ +G²j‰?Úì:7rÝùH}ñ,b)ÑÜ)îüÆ/¢£ET©@ë±]âfŸ°JI,E:zÇ1Ê)›/óE™5ÇTÍóGõz½ŠE†¼sJçÃQÍ‚®ÆçUŽÏm›/qÝÕ=Ž´÷-ìíl¹.*`²É"ÃÛ䘕(-/y`««'ICÞ<¯s'Ël±ÈÛÉáäØ/ªUݬ³AÜõʽ +ª)J7dNZoiT&ŒÂ©›¬¹?¦p{Œ:uâÔ sYu«†Üþmë z®VYQ:¸ó¸ó£'q2¶>Ÿyƒv¸(²WUÈ÷À½e©rÂ**¸Ÿû"ZQæ-êªÃ«L{]˜ŽB)Á`†Ýó×°ßÖ‹ÏöòC»çUQ]ãšÌ
£ +‡£¨§IúX3pÆЖtØÙph]žP%±öNßúŠ§‹@»Šòƒ" Db)Õ÷AOñˆDš¦r*‚l¹lˆ€û‹jn +çó/7ÅâÆ>Ì'±P;7ß<¸ë|”žûþé‡[#püHŠ-Ë€õi-ø<Á’·!…Ó3) +–A4WŒÁñ¸ œñÍ‚í)Fc’û‚ë ŠÊé—=$XNt,¼d!lÚ%brT +h(øD‰©ý34 ®Çr6Zõ1Nâ.pS´Ÿ¡MQÂèµ
¨
†¼Ü9U;D +úÿVkí)Fc’ûÖJ¹&IJå°óÃÖš +ô/nÐ]å®)èaÌ$S扎ÐR7,+Z +kßo=ÁhD1n5 +–µ›³I˜iŒ¡V9Šj‘ã$ÞQhL¯3¸ï÷ì²ÂmGl‹®¸µ/1ÄAæbÛI[Ê8˜ÇcÃEšb'Ý×76‡62kjyµô>Ü—OÆþf§NÒÖXEXäÓBÊDh=‰?·@Åížm\ùbÓH—˜Õk,£°¸ípë´x^‰+!"Q*Ǥóˆ}Áe—œÒGì‹CœU§S.·'q»™àqؽݴÐ3 öž‘Qü® +Õß6Ùz5”°Sbô4R Wl>¿øaÓä«â®Ì«Kœø¯ÕŸÉ(\¾‰ï¿ÀWõõ¶Åæ}Þ~ª›O-™îK|\†Ù½¼iêÛb™GÅݪùZ
šásiL‘/«¯>ƒy7Ú.7Q[ü'Ç¡j»¾ò¢}…uv÷lö»&«ÚUÞ´_µ½;Â"*šÜ
[u•G°à‹§ø?ÏtuïÆÛþ:Ýô¡]?ç÷·1û0þÈ §‹Ã3„Kg£=[N‘qs‹|8i±öøTj€š2q :@õF'>Õug¿ÀÀÝ*Ó¹ðg¾² + °ê¿&8™`6ÙWÆ`4¦ó%òf?˜ÅöËj“-lÇ%
0hQ:<m
žYÛÖ©—ØwtÌ>Ø®ëξÀü·Î˜N¾uBvá2¹áM‡‰
Owøni’÷êºó…u>uȦP<X¶ »µ/n+™V+2\qì:Ç&VI<Oí¸bò#çáeé*ïñ%÷Ù4ÖuÛíì¼@2½5R>·„6ä$e‘»=þµ«ª–ø%ÍVV!ûî3"ÌÆ–ÞØŠ*€¬0j™êqò@ cZ…*pšÈq‚Ar"¦öŠMÁ¿ endobj -1324 0 obj << +1363 0 obj << /Type /Page -/Contents 1325 0 R -/Resources 1323 0 R +/Contents 1364 0 R +/Resources 1362 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1294 0 R +/Parent 1334 0 R >> endobj -1326 0 obj << -/D [1324 0 R /XYZ 56.6929 794.5015 null] +1365 0 obj << +/D [1363 0 R /XYZ 56.6929 794.5015 null] >> endobj 426 0 obj << -/D [1324 0 R /XYZ 56.6929 350.5137 null] +/D [1363 0 R /XYZ 56.6929 769.5949 null] >> endobj -1327 0 obj << -/D [1324 0 R /XYZ 56.6929 322.7017 null] +1366 0 obj << +/D [1363 0 R /XYZ 56.6929 748.8062 null] >> endobj -1323 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F39 863 0 R >> +430 0 obj << +/D [1363 0 R /XYZ 56.6929 495.5006 null] +>> endobj +1367 0 obj << +/D [1363 0 R /XYZ 56.6929 469.1643 null] +>> endobj +434 0 obj << +/D [1363 0 R /XYZ 56.6929 192.6113 null] +>> endobj +1259 0 obj << +/D [1363 0 R /XYZ 56.6929 160.5008 null] +>> endobj +1362 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1330 0 obj << -/Length 4168 -/Filter /FlateDecode ->> -stream -xÚ¥Ërã¸ñî¯ÐQ®1Ä‹*§ÉîÌÆ©dv3ãÍ£vs EJf†"‘²Çùút£|™{6åƒÀÐh4ú
X¬bø+k¢X9½JŽL,Ìj{¸ŠW{èûáJð˜M´úÃíÕïÞ«tå"—Èdu»á²QlXÝ濬¿ûãÛŸnß}¼ÞH¯“èzc’xý‡›ßÄÑÏw?~xóÃÏß^§z}{óã|÷þÝÇw¾{w½Ö˜/Ã… ïoþüŽZ?||û—¿¼ýxý¯Û?]½»í÷2Þ¯ˆnä?W¿ü+^å°í?]Å‘rÖ¬á#Ž„sru¸ÒFEF+ ÕÕ§«¿öG½~êÿŒ²‘±2]` +!"gŒœpи(QRy⦅Äq¼n‹ÓCq¢-~ê²®8uGŸß¿Æ±¬Ë®lj‚duNŸÛl_ +`A5:±xµ‘I”jçüJ·÷a
6Jll`0Žažã’@r -ìáa#Úb±Î‰¶¢¥Ïí}vʶ]q*Û®Ü2°kè÷® ߬m›m hrú~,»{î¡ŸÓµ°ëâÐt~‚\×Ù§2‘ .Ò©õÍn2óHS‘¦/4·*®ÅºÞà -°³ÕFÛHÖì©DB`?Ûçù„˜uw_ Ë•ôÀSVïj6;žåijiX@µmN¤%JU¬×?ÖÕõRjš¶›¼%4½4 ª*;·<#;«²à5ÿ>ó¿yU´L†{§›¤UAf„¬éÌ•9ȾKÇgŽüÏ£mSïÄ$:±æ¡±Y¥FZh¹H$ê«bèPÁôKb¨PS± †©Zo³šÍv{>Q3ã>Ú8ˆL× REÅãw“A€©©ñöçSÆú@„T< aôeÝ–9c楄‰&ø¡,—”KGÖØg»B™II÷üe]dãT‡c/¬“Æ -Bjæå%ç1À¨â!Ì86m[ÞUEDyÃ~Úoñ,nLª¢ðX¿^æÑú¬âx Ýòg3 ä44õôœæ›T¼I\›zCL’tI&éW Q -Ú«MavG
Ø4ÒéX„¬4Þ-GW©‰Œèã³—TÜ•QAŸ›#‡@€½¬‡UˆrÁ–ãøÝWÍjƒ‡ù©-}ÜÚ~f4òž…8£X§§œÉبfºè_.F•ÚªàåN¤.·m"7ÈDp[I–‰Í’´b0KØɼÁ,!l¢ÀÒ
f Çù]YJ&p,+µ´.•cõ¦Y‹ZǪcg¦\#$Ód*Çf½#m;p'I³ †aSÁ6³}0Í0n°¨¨™6aÍLXZýÌî͘?Фz›Ý@ÂeÔ²wZ/›MÌ3iì%›oˆ9!&rêB*ÂȘcÝxa„õ2A†ÑÁ3ˆ¢#/¥¯‘Vò£7ÿx5¥gfÔ€¬
ôŒ2JÍñvçÜMœÆqçã±9qE `Ù¹kÇ€tRò©×;2uкËü†Fë¾5oï9}Ýq@ìb¯þC20„Cb”G;´»ðk×uáZñúho^Rþ‹Þ¾ÜÞSs´y;Þ¡ëwè8è‡þÑ< -鱕‡å›î÷ÐÒÁ|CW¼ÊŽ¢2œ½Ši,ï8g¾ê(7ý¨‰Œµ÷͹B*!ͪÇì©¥öcsúŒš“$ìx>)íI)Hâ.™s+#”yµ9שA"rmÑPÝ+ÑË—:7±“¼¯’ýIûÀû³ßõQ·ß%{ô~E&ƒÎÌ#¤
µáô Ñ[ery½ÌC« CfÇ[8ê®ñu%€±Ñòm’hxëK#a'åk¸·—<ø(ÉÿŠõ®a,ŗ쀡c ±dŠÈ -B5tsžˆüßg°?9`ÑRá–°êx8åÖ²¾;Wc”«)ÀÓ²½§N¿-Ñ<#p6 -˜±cNå
ˆÀŠQx†_o´÷Çš1q$$º/g’vד3Ž°€7Òñ7ÛÃæÍjU¼™Û²!ì˜4¶yXž¥îGŠn°«{IµËÐâklˆ1Ø£¨¾*’¢ý‘¯Ã[>’‚¦³æ²/_US0WªÏGz¡*¨©PÁ‚¢sûRÎü½=T¬³Ø_´þ–ˆæ“C+¨¥P½±Åì¥ö•O7Ó*´Š´TGJÅÉì˜û’’TMJ¾û -›aø1ë¶÷¡ÄÄ[˜ì£oÊî±¼ˆÑ:þNlA\ûÄéõ?ÑzþªþÎv÷Dœˆúš³×j{wš†xÞÓa#c$A7WŸí¥âØ]£e8‹^S÷À‰þRzÚÏš¨ÙB4õÖW’_¬‰Å߶X*£Øö·Œ>‚ˆÕ+0xžÞ¯+©/lÔ:ŒÖÿ•G >ñ…õRšõÄÝ.Þ¹¤‘r=ÿG—¨¸„wM\#•¤³Kƒ»b–„͈˜Yï¡€÷œ
vSI;ÖÉ´/G¥ìtR•Ÿ|§!‚F}>ÜQÁš_0¤˜NÖÛóiVÖwÍÙk|„º¢˜Ö'¾h¼È„ÿ8mšGѽ*%f¼•‰p._¥‚é’ý3Øá‰WsGwöÐc&žGȶÁ$÷Î:\ú-–„ìl¨—ô4oŽ,΋R–êHêxš£EáöUD±ó·¯¯I…‘_Ÿ‹§Ù»‰9ÏÞ5d9ˆñ¨%ÈÒ#«"=Ð -‹ÌŸeI|¶¡µ\ Êh^ó0KFÎZ»ü,kÓcÜŒQ†7Wã» Ðj¥Ä°²W–|) —‘Ž)<iÊiÛÞtèKõ8p-V™æLŽÑ6Ù¹Ù@ÈWL~f<ß¹C‹|.‚ƒ÷>И“¾‚˜Šõ_¢XÃÉYãëÛO7?¼™ŸŠIä\’øÛ!•ºYH§ýŠGïÜúñ›ñâùônmŽÉøTÒm -~Õ<£&1‘jB̳§vaÐKÌq1 -ɺË*~€—Z
ÿR€›Nk6™Ú¯rú¿3¢Ô;ò~ßÚ(¾é¢©u÷ÕUðÞ›J'×.”kÁÁ¦ó’®iÜlMƒu‡}uç¾èaúBšaƒß}Q'z}‡Ÿç–Ø`BR“PŽ áÄ‘`Èvðˇ[¾q<Bæ¡`6”nK7‰J×o—Ò«éÅ—/w–û²ÎºÞÚNSŸ—ªv#N—&f¸=/9ÖŸÚñ»¾:°¯CßÝSX/ Cþ`ùb1ïz[AüwÞC(§c&ûSv8@jç?Ðó†Þ%Wç¢41ɶÛD±xvi‰X!Õl[j{#‚ùêÊcÅC'&\ -ß{aû á>‰Àn”‰ÑPj ×¢^æ/¶K® ˆDGé³wV£°¢b.rú,i}¡x" /_Š1uÚ.ÕP UÒÙ—î>جËx7Éjˆ¨Æwók|¬’©Ã=+@o~zÐâŃž2NþpHžsVÈ8)EJ8E2£»sáÀU*1»;'¿ëþIŠ™<IÑ!шMx’¢gïPÌüŠíŸË -(ª ÿ
.ì}Ão]|jØh¿™âÕÏñú¤p)×1QblòMG¾égM…Ð?•Ì@øY5_$’ëOõUÙiT•Tá²G&kšŸ†3“³Ûr9{¶ã/oKÈ+4ß,qþ=n¸—÷óžHO'o7?ÊBRgÍÔ›äE—•Uû&Ïbf^ó¢ÝžÊãðü|ùݾH×÷ߪ¤ÃóÑËJjRõ”T -PÓƒ€qÔÆ+’V¥+ˆ,øõ¨½†?>æ8'ÑýŸ„ӥψI pJ”ó,êÇ|„¦þZiéŸ%”ÁËä¥Õâþ¿þï¤þËDC n\&\ÅId%DlL”ÿ‰gŒêÿãâ9éÿ¯‚?sendstream +1370 0 obj << +/Length 3951 +/Filter /FlateDecode +>> +stream +xÚÅÉrãºñî¯ðQ®1ÄVN“÷f^&•L^fœ’(‰’™‘HE¤ìq¾>Ýè7S^’CÊ
nôX\§ð'®½IR•ék—éĤÂ\¯Wéõú~º<f-‡£~u{õ‹Ê]gIf¥½¾Ýpù$õ^\ßnþ¶øá×ï¾ýðåf)Mº°ÉÍÒØtñ«OŸ$HF??üþóÇO?ýñËû§·Ÿ~ÿ™À_>|üðåÃç>Ü,…7æKÆpaÂÇO¿ý@Ÿ¾¼ÿÝïÞ¹ùÇío®>Üv´é©BBþuõ·¤× û7Wi¢2o®à#MD–ÉëÕ6*1Z©Ù_}½úC‡pЦÎñÏ(Ÿ/Ý¥šc É« øi{³TÚ,ë356e³®ï‹}µwy‹-»È pº~Qê¶ ï¦8uƒË†~wå}Yí¨]Ÿyþ*ßðy›¿ƒ¦Í‡üôY¶ô›3–U½;só¡Üï©u¤õï‹ŠÑnϧö6 +‘dÆÈ@Ú¿ÎÅ©,:°¶¦ß²…#V"]ÜÞÙÛü¼oéã>ߟ^o)ðPx(4ò:u°.A{¤aCV+8Lk㨲™Ág ”çU=ƒh–â!I q 2’dޙ륔‰Ð‚HEbž.!ÓDkBp<Õ÷å¦X–ß·§™ÕfM\m½ÏÏ
±Ë€A-0X,e…ÜDÐÃ]¸>Ú»0Ð/öõ:ߌŴŽZ»óuK'
á„aü!oÚÁ φÐ17GX¶®6¼hÙÞ1‚Š˜á²$E&ŽŽ½¬Ö,¤ $a?©]ü»® +jµ§¼j¶aï©AB*†ßñ +g#LöJu hhÔçúØ–uEØ˪_…vP¼ýîöõ +µ!ÀÂÔ†>V ¶ß
ƒ@õ7Ì¥À’¡sr&g£š,hðË–Id‰öJ2%'R—‹d›$ëe"Z&é%Y&6KÒ‹Þ,a'óBD³„°‘ˬ7K8.PƒrËJ-}…ÇË¡zÓ¬YƒcÕifÆJG6H:;–c³Ø’¶¸“¤ÙDC„°±`› ¼g×[TÔLoY3-Kk˜Ù¾òú¢´Bo½í÷0c™@ +½}¹¾£æ€x?¤0ë(DAþÁ¼štZ›¸|ÝþZ:šoèꎺû¨gÏ…bÃÞ,3Ï:Êe7j¤ŠÍ]}Þã.!Í÷ùcCí‡úô
5ÇZŽv<ŸÀÝñGP›]2ç^&¬›W›síd‘k³†ÒèN‰^Ö8—e#;Ét•üN:ÞßA>DÝJöèÝ8Š„I@g&ŽR„œ†úxzÐè¬2¹¼Næ¡U!óŠã-µª1šCÐ&ÙF°¾4()¼XͽäÁGIþW,¶5c)¾çãKÞ`llûÍϨJ/僲:ïvlI*6-ëSÞÜÅ#Z©u}:ÝøÅùØrf<Ôbò¡ÅÌ™¬·¹P¯E´ÅŦš©§;yì‚záG®S 7ˆè¡“ba€Æˆ`]¢mŽÓa@Þ¶ÅáØò´š~y·øðãç¯<ƒâl€ëÃá\ÑŽ—ü +ý†0;f`v‰™Ò+30ëÄà–çÍqÙ”ÿ.f–ƒ-eÖg ù +FH‚’e ,AV-‰i¶ø{jÒ!ŠúÜ6`b©³½+ñÕŽ,«ˆ&n±ÜC¨†n.lbóÏ3ØŸ
`Éœ1¸%¬:íODe‹Yßž÷c”«)ÀÓ²¹£Î@–Nûƒhžx6 +˜±eNå
ˆÀŠQx†_ÚùãÍys$$º+gÄ-¨#5ë¶3Œ°€7ÒñwÛFÃÌê¾x7µe}Ø12hlóþž¦’º(ºÁ®ö%Õ.c‹#¬¡!Æ`¢vøÚ“íFˆŽû²hÞfLh:kÞ!ÿþ¬š‚¹R]>Ò …PQM…ŠÛ÷òp>à‡ìì¡bÅþ¢iòf†VTK¡:c‹ÙKµÁ,4›h•ŠZEZª¥Ò‰švª&¥$U“Ëw + +›aø1o×w±ÄÄ$Œt£oÊî±¼ˆÑ:þNlA\–{›éÅ_Ñëà¡Ñ‹u¹}¤NDCÍ9赃;u1^…FðtØÈIÔMÄÁÕg©8v×hÏ¢ÓTàýðB¢?—žv³F‡N¶M½ÅÕ™äkbéÛs2I½TaQiFõ +žÇPLŠM((ë„ú£õÿaåÁB´…‹ŠôÂzNfk=r·³w..QYÇÿ¦ÍÛP’£%‚kâ‚xš(ë&—«b’„M61±Þ}ïé>4ØM%ýP']WŽrìt²/!ùv1‚Fu>¬¨`-¸‡édµ>Ÿú°aeµªÏA›à#ÖŸ®8òEÃEFüÇiã< +FÈAbƤŒt³š«í0]Òë‰T\`„'~ZÍ8ܱ ŽÂÄȳáè‚ù:šäÎYÇK¿yÁ’õõ’nÏË#‹ó¬”9HŽs4ND5i–‰W&†ÂÈȯoÅã…ìݤVN³w
ÙÇDxÔ$ŸÓT•è~¯°ÈôºZ*Ðåµô•Ç¾æÂZ&™÷~þºzÙa\QÒ]ôø.´Z)ѯ”e3—„ËÄ÷Ç´)ê*˜Í¦C_ªÇkñÊL0erŠ¶ÉOÍš@¾b +ë0ãI±E¾—FÁÁ{„hÌÉ@_ALÅâ‘/Q¬‘ÉIãëÛ¯Ÿ~z7=!l’eÖB´¨œFRçiwM/ƒûÿnür8áéýÿS¼¸¯EܺwàWÍ“ÝX“¡F›yò!ziS\ÌA«Ç„]´ùžà¥VÍ¿àºqÍÁÛ±ýrÓÿ™¹àÈ»|k£ø¦‹¦Ví³«à½7/äF×.”kÁÁº¾$Â)56ÙdMƒu‡]•·ç®èaºBšaƒß]Q'Á
}žbƒ‰I=LB9&„#G +€>ÛÁ¯n…Æñ™c„‚YPf}Xº´Ê-ÞÏ•AÆ_¡ÜYîÊ*o;k;N}^ªÚŒ8]š˜þö¼äXlÇW]u`WžÕc\/"Cþ`ùb6ïz¿‡ø#PN§¼IlìNùá +æÎ&îÉ~,ÄNVÉá~žDAÝ v1Å5¸\Rx¹„O,^kw…êžSµ`Ú.¦•àµœ|Ùâ¦~ãü1:›ØÔÈ·ÛZm½hkÍ+mmh¡5 £ë\âSm¦9kK{q]²‰OÄ(§ÖÝk²ùGdA§–Ÿ%’^;M& ¦2µ‘F“䲋–Ö™DfÝ€Y%iWÚ\Çg’øBéÔÌ—<&öI¤3övx”Çl:·gïeyî%{‘ðͼMÞŒp#S;Œ‡¤ð›¤JÈWæäÊvÏÃè³ê”¥©}V +„ÙË%2–§ÐE¦*wiUÌåPņsW¯>UcÇ®[±atê'Åêÿ£I´¿Î¼^Âœ«¯ÕŸ¹mPŸ8Íù¿ô:JËÿüoýÿ„h—(ïå¼'U©M¼Ì\ÜeŸøîîÿ#žný?Nr(9endstream endobj -1329 0 obj << +1369 0 obj << /Type /Page -/Contents 1330 0 R -/Resources 1328 0 R +/Contents 1370 0 R +/Resources 1368 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1334 0 R -/Annots [ 1332 0 R 1333 0 R ] +/Parent 1374 0 R +/Annots [ 1372 0 R 1373 0 R ] >> endobj -1332 0 obj << +1372 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [116.0003 171.5741 166.1092 183.6337] +/Rect [116.0003 269.6318 166.1092 281.6914] /Subtype /Link /A << /S /GoTo /D (tsig) >> >> endobj -1333 0 obj << +1373 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [399.2874 61.5153 467.9594 73.5749] +/Rect [399.2874 153.6184 467.9594 165.678] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1331 0 obj << -/D [1329 0 R /XYZ 85.0394 794.5015 null] ->> endobj -430 0 obj << -/D [1329 0 R /XYZ 85.0394 769.5949 null] ->> endobj -1219 0 obj << -/D [1329 0 R /XYZ 85.0394 748.8663 null] +1371 0 obj << +/D [1369 0 R /XYZ 85.0394 794.5015 null] >> endobj -1328 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F39 863 0 R >> +1368 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1337 0 obj << -/Length 2814 +1377 0 obj << +/Length 2923 /Filter /FlateDecode >> stream -xÚÅ]sÛ¸ñÝ¿BoGÏX(@ -¼]ä( Šª°LÄvu8eÕó§q]m7Ó€Ý%¬cf´‰=vVΆ)JÁÓ!Šã=@Ô -±dÓvÏ6ëfS”÷„VnWÐÞ³pÿ#Ëû‡úåïÓu/Œ±¯_É€yÿýͲŸ$eF5%ÇüµJ~Ÿã1–ESTe0º¿`ò0=í-9mBüí±qH*˜8NƒqÖS͈C—†aøþêææâÁu>ÝnŠæ‰FÎ7ªª©Á·.z˜EˆÕÓM1qÅ -So'³j6åéVs¿6¤îÖ™Ô.xíN°S…ž»Ý ¶ña _¹â©a06¡XªÊ™K+8vR¢ á² C˜ßAÌVÌض¨y)hCαքº– ê³â·ßÉ5KðÌÿ ÛH¨÷´d¶¤¦
æ‚àù¸È<fÇò)+*èˆÙK‹NNê÷êl×gqÛ)¯Ü[ -2 -P«€‡µcRÆãôÕÊIÓ4ô®(óímUçû[ïtƒÐ©ê¶‡
ößk]PùÛÅ?Bµ ¡\Ð{åæõu7ûÖ¿SéÁÞ½;t‹`ßF;¥ò7h¤Gë -N/€KÎKÓe¶ÊÏH×xm`⽎b¦Ìîk_„ûÈÔTÓjyÆ=¦²Åêl¯ÊjÂÁ¼Í ÷ꤣÖÞ«Ašnšï$©}bGJDªÃ“]‰(|‰øPä¶þ&rDA{Zw¨+§*©Xª•Ú+—¡[ë¯Ý:}/r¯²fºO—pÒÖóî)D‹;‡q·tçsœT|pÜN}Ž˜èÛ`Ì®¡“K#þS^ßU›»²ìânàÔS‘_òcÅÿÌŒlwì¯*øõMBü’ü›ƒ8¶Âû¹ÛþÔŸbè@0PTøà3£ÇºzÌ7ó‹Y&šC©õö
«ÊçÀwšî„1žfžæ2oúT!»Õ¾Í¦—eýØÂôðE +xÚ]sÛ6òÝ¿Bo¥g,ILž’Ôé¹wI{Ž;7wI&CI°Å‰Dª"e×wÓÿ~»X +<yýó»7W?þzýò<O“›«ŸßO¥æÉ›«\ôãõË·o_^ŸOE¡Eòúo/¹¹¼¦O™§ñêêÝ´bhx‚èõå›ËëËw¯/Ï?ÝütvyïÒ¿¯à +/òÛÙ‡O|²€kÿtÆ™2…ž<À„3aŒœ¬ÏR˜N• ++«³÷gÿŒ{_ÝÖQù ΤÊäˆ +tPè§iu½[uÕfei惉ÁÛm+ÛbTHÁ”óeÜÛÂ;{1^ãLMŽ‚à’éÒr]®í‰:ÏY‘c¨íK<¦*ïÜy(b²å®™7«‹à.î0-×9VÞåU ‘7KûjãnÓ÷@·;éÖÞ±'DlË\ïDåÄûÊ>|[öM2Oë3ÊʉJiVdú@R櫲m?õ³ôƒ0¼.»ùr:_UÀIÌæÝP.[pŸÆç•ó'¸þÇ‹1ÿOt ߃çvâûvb[ôØ-ä"S²hÄ´íçfû¹nNWN<Íyñ ?æûcÇù
èØ>G;8Ü3ð‰!ßk@zJ¾¥4Ⱦî¤4ÂÛ¹;þ˜dŸ¸Ðg )íÁ±¤aÓ<Øííι¬<¹…D²‡]ôªÚ‡ÀEwFE7ºÓÒÓ\ÙnHÕ)²ÛÝÚOàcÝ>D˜ŸdÉo;»}$p©
k!¥Æš.?ðÒp)rp9vcCü†©“:ŒË† +ûàz"VtÝG<à
¡púyOñh$Ë%O‡Lºø3¢ÓËs¿¹Ý?ŽP¿kGìäg<8O +^¡ª—²bh¿!Ús ã*@ðöÕiáË0 +¿“åÀJß»w†]ÙyXˆ.1{™ØETŸ£ ¡p$Ý¡™g¦g eì!§áv§K›í…Óq¬bó,ÈGæÄPº6W.BJóÐ÷È}«8Ñ_‚”¹íüÆ[’ñÚS¶àHÅz?ùöD@êëìƳ:¸eO¸ŠkßQ¯.rmýô–Æn´p1ÑJŸ,\Ò<?LC[¢[ù»µîÁàQ;Zú(eŽPJp½Ïû +MxSÉÍaè¥zÞÙ”,œžI~R§ýÒG}üÔR Ku„œVÉAëMR~àú_ņµ/é0 „sLh•Ãùq +’=¥Æ~ß屓÷Íÿâ±ÿÿ—4gPEÈñŠe^°´ endobj -1336 0 obj << +1376 0 obj << /Type /Page -/Contents 1337 0 R -/Resources 1335 0 R +/Contents 1377 0 R +/Resources 1375 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1334 0 R -/Annots [ 1341 0 R ] +/Parent 1374 0 R +/Annots [ 1381 0 R ] >> endobj -1341 0 obj << +1381 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [432.8521 516.7732 481.8988 528.8329] +/Rect [432.8521 617.9092 481.8988 629.9689] /Subtype /Link /A << /S /GoTo /D (DNSSEC) >> >> endobj -1338 0 obj << -/D [1336 0 R /XYZ 56.6929 794.5015 null] ->> endobj -434 0 obj << -/D [1336 0 R /XYZ 56.6929 674.1923 null] ->> endobj -1339 0 obj << -/D [1336 0 R /XYZ 56.6929 646.1449 null] +1378 0 obj << +/D [1376 0 R /XYZ 56.6929 794.5015 null] >> endobj 438 0 obj << -/D [1336 0 R /XYZ 56.6929 566.6943 null] +/D [1376 0 R /XYZ 56.6929 769.5949 null] >> endobj -1340 0 obj << -/D [1336 0 R /XYZ 56.6929 535.8374 null] +1379 0 obj << +/D [1376 0 R /XYZ 56.6929 749.0627 null] >> endobj 442 0 obj << -/D [1336 0 R /XYZ 56.6929 380.8349 null] +/D [1376 0 R /XYZ 56.6929 668.587 null] >> endobj -1312 0 obj << -/D [1336 0 R /XYZ 56.6929 355.7523 null] +1380 0 obj << +/D [1376 0 R /XYZ 56.6929 637.2799 null] >> endobj 446 0 obj << -/D [1336 0 R /XYZ 56.6929 225.5162 null] +/D [1376 0 R /XYZ 56.6929 480.6393 null] >> endobj -1342 0 obj << -/D [1336 0 R /XYZ 56.6929 194.6594 null] +1352 0 obj << +/D [1376 0 R /XYZ 56.6929 455.1065 null] >> endobj -1335 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F39 863 0 R >> +450 0 obj << +/D [1376 0 R /XYZ 56.6929 323.8452 null] +>> endobj +1382 0 obj << +/D [1376 0 R /XYZ 56.6929 292.5382 null] +>> endobj +1375 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F41 910 0 R /F23 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1345 0 obj << -/Length 2081 +1385 0 obj << +/Length 1719 /Filter /FlateDecode >> stream -xÚYYsÛ8~÷¯PåI®Šà¬ŸœŒ“ñÔÄ3ãxw«6“JÑ"d³†"5$%Ç»5ÿ}º‰)Ë›”Ø8ØèãëT0ãðf*b\êp–èE<ˆfËõ ŸÝÁÚ»“€ö,ü¦Åp×뛓Woe2ÓLÇ"žÝ¬¼ãJ³›ìãüÍç¿Þ\\Ÿ.DÄç1;]D1Ÿ¿¾¼úÁÍh÷xóËÕÛËwÿ¼>?MÂùÍå/WnúúâíÅõÅÕ›‹ÓE ¢ -VAœŽ¥Û4<^„,LÚÓ´ikÖ¦lÇ7§g“ß•ùeZ¶nêw!¤Âyê&–Enü¢•Òü¹5
M<äEá¨[3ÜÒTÅÎdtXÙ+c/«²5_ÚNU~¶„d’ó¨€é(Vp÷ -âð!oïQI¤Ó ®˜yø„ˆÀDŠ}ù#ÐÎH¡ñY•Åãx&].MÓä·Û -ŸœH¢;Õ‘²*ûÉ)˜‰$a"àOáL°@ÆŠ6®ã@Î_?:CB(1)¸;•Ì——w`|¡,Єžÿì&,üáé¼KMº¦¥²£,¬`m½-Ú|SÐ,JÙ¼DhÉy–¯Œ+ã0iA[ü9zž¥mêæ -íˆÏIvÚ›÷¥Õ˜{M]¾\UµÃ—ù’®AÆ—f!Âb .Ói7›–Y¿ñ±·Ü¹ÑⶤwÜ£ÙÉ?\} 9Ón7¬“j€ä÷iùˆ{¤34<)Ì`bÓæUÙ¸·yÙoœ -}z&‡`XURL`y; -L´T¥ -°ãÇiä_§wH· ø)u"»Á²HšïUfhôh~¹rÑã½9==xE—/¯ÆÛ`a»6ñ½ªZ:‰ÇJ -X¹ð¯ïz¡×[ÛÉ Ð”¤ÓAAIòåX„$¥ò&ïýãR -AÑÒd„^p>àö…ò§AÙ/¶™íëíyYVÃåÛ4cþcµ¡kk÷#úðvPHò4Z >ŒGFGM^BóbùÂËŲÛg¹Süÿ:b±s‡ÜG½¿Ãú÷=¾mçv +xÚX[sÓ8~ϯÈð”Ì`U¾ÛÛ§Â,-Ù})Œj+Ç6¾¤Í.ü÷=Ò‘;54…N|$ŸËwnŠÍ1…Ÿ9\BíÐû¡C\jºãh3¢ã8{32¡™Œ.׋ÅèäµíCz–7^¬:²BƒÀ/âËÉË·gçSÃréÄ#SÃõèäÅlþ +wB|¼ü0={ó÷ÅÙÔw&‹Ù‡9n_œ¿>¿8Ÿ¿<Ÿfàšð¾¥$üà…׳?Ï‘zsqöþýÙÅôjñnt¾h}éúkR[8òutyEÇ1¸ýnD‰îø”˜ah7#ǵ‰ëضÞIGŸFµ;§òÕ!ü\; n`ù +‡i?ò!^'2™)ùÉ*ÙÇ'Kwû`Hb¦:…öAHaŠˆòM‘¤<6t÷é«”U¤µ¦»„ϵ„’qèV{øá ½Ÿž
1¦:~’ÎŽ&B…rÑTS;h ÔDhop%È‘±5«ë•…J•¦ö6¬ŽÖ\)`ÙÏ£4ÁÞ!´êæÎ;‰ ª;ÌÌ ŽãšýxE˜ån†h¶š:bk6'Hœe»¡ŽGb¹¶Kö °lâ„A0 +QíªÕB´”?¯æŸÔ¯›BÉR„-rÈÃF½ùfÀQnŒŽëÿšŸ ¯ÓK¸=ÁÔqû›™÷š9/3–>Ãõ,Û%çºý²<9A–…,>AUë¼Ic¤e¯D2„–«Œ×·yù¥3::é+_7°µVÚù0)‘¿“à7¾Ÿjà[í°gÝÇ2ߊ,’‹’CrUÉV-+^n“H-DÞ7²g›ƒÖ*¹¢å ¾¯Ž·‰)E¹HŠZmî"ÒLš·VG* ¼€ºàÒÚ`ì§M,õÅqÉ«ŠW}ù}·áÖVÆÚ—7¦JÇ’‡³êƒę̈@ÕéÉ«$=nh»H|ýìTUîüïG¶á°³žß=6ëßïó[ÞÜî%K–×Jàª,®wá,J¾Mò¦ÚÇý‘õ endobj -1344 0 obj << +1384 0 obj << /Type /Page -/Contents 1345 0 R -/Resources 1343 0 R +/Contents 1385 0 R +/Resources 1383 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1334 0 R +/Parent 1374 0 R >> endobj -1346 0 obj << -/D [1344 0 R /XYZ 85.0394 794.5015 null] +1386 0 obj << +/D [1384 0 R /XYZ 85.0394 794.5015 null] >> endobj -450 0 obj << -/D [1344 0 R /XYZ 85.0394 170.1085 null] +454 0 obj << +/D [1384 0 R /XYZ 85.0394 265.7828 null] >> endobj -1237 0 obj << -/D [1344 0 R /XYZ 85.0394 142.8732 null] +1277 0 obj << +/D [1384 0 R /XYZ 85.0394 238.5279 null] >> endobj -1343 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F39 863 0 R >> +1383 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1349 0 obj << -/Length 1067 +1389 0 obj << +/Length 1057 /Filter /FlateDecode >> stream -xÚÍXmsÚ8þίðG¸é,¿{ú)Í‘\:×´Gé'Ža[]lË•D€”ûï'¿Hƒ»tÆòÊzôìjWÚÒtõCší@Ç7|Íõ-hëÈÖ‚¸£k3ÕwÝAå7 úÔ¿z?ìüzeºš}Çp´á´†åAÝó6G]°§ôîå§Û«›ë¯ƒ‹žku‡7Ÿn{À°õîÕÍý¢u=¸øøñbÐȳQ÷ò÷‹ÏÃþ èrJŒ÷7·¿¿x¼ -ü€lc—¦V-ÎÖ9 +xÚÕXmsâ6þίðGèŒTK~Ÿû”KIš›^îÊqŸ(Ã(¶HÔÛ'‰$äè¯ü&˜`é¤Ã0–%ëѳ«ÝÕ®¦«Ò,Úö4Ç3¡¥#Kóg]»Uc—T|Ê@õ«Ãί†£yг±
§,ꮋ´a0êÚÞBлç_®/®.¿ÎzŽÙ^}¹îléÝ‹«?úyërpöùóÙ k¡îùïg_‡ýA>d¯®Ë{¼ü±tпèú×çýÞxø©Ó®d©Ê‹t#äGg4Öµ@‰ý©£CÃs-íQ½èyÖfÓ2 eFÙv¾uþ\VF³©µúC:Ćkh¢Š]Úº‚r,Ú62ŽzÀÖõîŒIù”…Lc>#2ïþK·tIŸä’“GÕFyï‡ü1N¥W +û'†-ϲk`ž(ŸÍò¹4
Z¹ë hÈþõïÁ½¸oeÞã'¥?7x!¢ˆë§UZ÷_¥‚¹¢ROëGmJ´œ.ÙmsÚ*¿ çIµ=‰ÉJÓl’·È+ñ;*ЉJü.ÐÑ¥~«R!5±GU?׶1†–mT?Z%¶ª1^oîÿHí̸y}«¢‡Eï®z:¥w\†¡£Ë0ü®Ë0´y°Ò¨s<h`Çz£úf]=Õ% endobj -1348 0 obj << +1388 0 obj << /Type /Page -/Contents 1349 0 R -/Resources 1347 0 R +/Contents 1389 0 R +/Resources 1387 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1334 0 R +/Parent 1374 0 R >> endobj -1350 0 obj << -/D [1348 0 R /XYZ 56.6929 794.5015 null] +1390 0 obj << +/D [1388 0 R /XYZ 56.6929 794.5015 null] >> endobj -1347 0 obj << -/Font << /F37 747 0 R /F39 863 0 R /F23 682 0 R >> +1387 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F23 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1353 0 obj << -/Length 1046 +1393 0 obj << +/Length 997 /Filter /FlateDecode >> stream -xÚíX]sÚ8}çWø1ìŒK²,kò”fI–ΖîRö‰e‹ÄSPK4¡¥ÿ½22`‚Íì>dƲd{î½úB–Èò(´ w,ÆHmDQÜ°Ýv×@Å7`ù(õ®×¸¼%Ìâ»Øµzã–mÏCV/è_ÜüqýW¯ÕmLí6uí‹wíÎ閭›ÇÍÇÎmûîŸîu“9½öÇŽ©î¶n[ÝVç¦ÕÈ£H÷ÇÂŽ·í?[¦t×½þðáºÛôÞ7Z½•-e{‘MrC¾4úÛ -´Ùï6$Ü£Ö“~±!â[qáR‡eMÔøÔø{Xj]tÒR³*yI@d{;œYŒrèL -ö›Àµí‹Ø*ó9Pa,@˜˜–dß‹Ì”¯ÌcÛAN)Þ”NÕIHIªÂñÌ”gBÓl˜¤æunây…£PmTƾTzè4‰fû†BÛC@D~ÑIŠQšòH²@¥@¦þÎ5ºO¦÷ŸÅl[¦]e©²0y¨mßÊ!2f#a*ÿµ©Nœ¡ÙRÁ1 fT#Aæº -9¿¥‰ -’ÅÊ”ŠÃ +xÚíX[sÚ8~çWø1ìŒ],Ëš<¥Y’¥³¥»”>±ã€H<56•Ä¦´ô¿¯Œ1¹‡IvƲäóù;s,ì ûÃŽÏ ¢Âu¸p!C˜9ƒq
9ví®†ógÀò!P~ê]§vyK¹# ðˆçtF%,"ßÇNgؽ¸ùãú¯N£]„¡ÖóÐÅ»fë÷lFd—›ÛæÝçöu»æÇV6ÝnÜ6ÚÖM£°Ï°•'9ÂÛæŸlt×¾þðáº]ïuÞ×B—²¾ÑT‘¯µn9C«öû‚TøÌy²7b!ˆ3®¹ŒBæRºœ‰jŸj€¥Õ…h•ýõ!ó ¯0 ‹KÄȇÂÜáL@º°`·<„.‚È +¢ß“Xmjô/þ¨€«öÊ00Á} s‡h£Âøa›ð‡q%GJêG`ÂqOÇ÷Rí|; +?gbÔìT§AL#‚q ÍRèp‡|—*qb#0 +´Î£ðG–sª`Íl’K<†±¹ª²Å(Œ*£iKÊH>Ø@NbÄÑì +wU3‹}´-T*Ì¢w¼àÇJÍ5±R\Î!Üý"ó°ƒ^¾nµ®Õ§·Ð§e¥è¡õs]Ÿ + ´D endobj -1352 0 obj << +1392 0 obj << /Type /Page -/Contents 1353 0 R -/Resources 1351 0 R +/Contents 1393 0 R +/Resources 1391 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1334 0 R +/Parent 1374 0 R >> endobj -1354 0 obj << -/D [1352 0 R /XYZ 85.0394 794.5015 null] +1394 0 obj << +/D [1392 0 R /XYZ 85.0394 794.5015 null] >> endobj -1351 0 obj << -/Font << /F37 747 0 R /F39 863 0 R /F23 682 0 R >> +1391 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F23 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1357 0 obj << -/Length 1863 -/Filter /FlateDecode ->> -stream -xÚXÝ“Û6÷_áGy&fø¥¯ÉÓ&ÝM·Ól{çå’mQkµ²äšt\·×ÿý@‚”íöæîÒñA@à2›Rø±iš‘¬äå4/%I)K§«Í„Naíí„™yšŸK½^L^Þˆ|Z’2ãÙtQŸé*- -6]T“Œp2
4yóÓÝÍíÛ÷W³\&‹ÛŸîfsžÒäæöÇk¤ÞÞ_½{wu?›³"eÉ›ï¯~^\ßãRt¼¾½û9%Ï(½¿¾¹¾¿¾{s={Xü0¹^g9?/£Âä·ÉÇ:àØ?L(e‘N0¡„•%Ÿn&2$•BDN;y?ùÇ ðlÕo£„‹Œ°`Z’LpáøGßéÙ<£ÔSŸ;µ Ó«Vó€“?ÝA§\’Q93FÊ4å^=nÃŽºßÔ®zåeé¥ÔÇœ|¢)í»öø¯ºÙ3†üW8<\êa#zôÎDÿÐgšígUU»ÀÛö;;ðÝäáÂ!$ÚóÃ_ãæ/ŽQéV?*ÛôÝÜ -ªw\ªšÇÍSÎ Ki1^ÓŒ¹¸A-§"wÕú -äø[F!!¯4ÀäÚøxdع‚«µêu…l@(߉@ì”Xà.c‰ó¸«M÷gÒa_È48éÝ~³ô±îR×ÎÜšwØ-`ŽËG8‚^ß9!†"CÐzÙeÕXжÚï›<•ÉR - Um#7 HØ_Øt€‚\^Agä@¥Ç;\œžm?Ý1O}ñq,C¨yʃ‹:|):Ρ±k¤žºîx‹÷·o‘úU[)-“Û:¨E]®ÂÛ ÍÓ>?¾ô«£…çÉxG\ô5‘Šp5¹¥e9À-c‡}Tà58â6ƒÇ87‚]ÕQ
"Óeœ¥xK -ʃom•8§âp³àPƒ@{ À¨pâ:(4Ví¬ëÏYO²¸«Ž»Fü‹ê9ex/ºVýºLå}犱éVQÐâØ×>xnäGWÙTí<ÚoQ ÀÕm³iFh½2\óîú‘eÒ⠌̃'’¾s‚ÀԚʮÈMîú({x|2€p‹ê1H`U›ñȤ´qIä QwY¾x³Þw¡Êª¸RÙu¿7à›Á Óó¨1(µõšûu-Ö}ÔX\ÖRãu Bódo42Îí¡Ÿ· -_,ɉþ}4mj³mõ‹ÓóÚõðô8°Ñ\»|ìúÂåã'e¤€/‡ðDп{`9òšÈ -’¦¯ŽæqmÑʶU+ïÞœ™Âþ‹€†J†¾—»ÅûÕÍšÎ7 CE:Q¸c ‚G¼—œÐ^íÑû—ÿù -‰ Ì™ }F¥‚Vp¨
¶ª&´?ÛƒQøú}î;ãüÿm’„å.=ðL!)—ÅØŸBtøŠÿæ¿ NÿÏÁCÞ€|ø -¹S^Y€‘§Ëe'ç_ýAÿ« -Rg®ÿ\ïgendstream +1397 0 obj << +/Length 2886 +/Filter /FlateDecode +>> +stream +xÚ¥]sÛ6òÝ¿BôLÄ +[›ë™Muœ«$ûŸ´¤@ev®¤ÿk‘?…:ÉöÕýyVò +sÁjîo4·:óÄ5i +|Y +v†st`œ`!Š$4Aâ76A¡±l´DÛ2›ÒÞ¶¢uóɳ4zr=‰@·<V,(³?Û
+tù"+XxºÏá©Øéhù)Ç\ +‰än´eS#ˆŒKƒu+"æPk†.Ž¸ÇÏwú½:â±2UFw+a˼ÐÃá†÷Ä/é‡\ùfÒñà^@éïÀY\3™‘Ô„SOBr€,3„…g@›‚‹aƒŠ¯1Þ„£*Bu?¥>±LÔ¸Î8K•ÈÙš<E0'çÀ‘œ p€ÉPàëøäöƒÛ
Ÿ…’̯ZùUróì¥9/^‹nQfIgO48cÝ.<áÀßnEÂÃ5 ŸjÙ3:˜*Âx¢ý–‰¸H +åÙ— +„óâ'Óqƒ”ÕWÚ#³œ¨&lgY‘øª£~^¼Ë¶q‹ÊçJêŠDÅiëÏô-žq’ûÀùGuK ÇŸà‘H +9<xâôi«úú·~"!ÊX!?¬+É//9
ŒÓôÄx‚[õ%œRhÄ€PÐèªü\uÿÚ“!Atb +þÛš‚QŸaM¬´Éÿ +O¿äµNC›2Ί,}¥Ó +4ÇW +¬}Êèþ3~‹ÝèK1&)0'ìâ0ô]¢$. +-õO„^€ESP>AÔs³6¬éôBÓS + ü®s.<-J•–àƒ¢ÿE +3/_Ë$PQf¿OK:Î}½Ä_‘|§L…;eêÅþ,;ª"dGUHv@[ +Ÿ'qNˆØ£T!=‰ÊœŽ”/W”/ƒú®ÙóS¬šÐ•ÃX—GÏõŒ )=ö`šC¸ )!ŽºÏ”s)~°B©{*ûpL9àшîü•ŸiH™“2ºå<o}#ø†ß̤"€„á@tK áüˆP°Ð=ŽÊ°d»«¿HiK*htv¿ó`ßO†jæomôpûA—ºàÁ(í +–Gž$•YûÂ+φúÀÚ`–ƒÓËô}¡âºã!b·Ûº‰^ÒH¾‘öÝ,)ÌØÒ·µ¤ #ùAßj׺†©D¤vôLN=qÏÓ¡¹ö›4/Ñ=¶~Ñ9½Ø°½þûθŸùÆ)MŠXçÔ«4ÖY’Nýt«ÂϧßüCñéWôÚþ¢HBSvÞÅçEœÀÄd1òBIæÉ‹Ÿ±ý/ÊB5:ú^%&endstream endobj -1356 0 obj << +1396 0 obj << /Type /Page -/Contents 1357 0 R -/Resources 1355 0 R +/Contents 1397 0 R +/Resources 1395 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1334 0 R ->> endobj -1358 0 obj << -/D [1356 0 R /XYZ 56.6929 794.5015 null] +/Parent 1374 0 R >> endobj -454 0 obj << -/D [1356 0 R /XYZ 56.6929 612.9401 null] ->> endobj -1359 0 obj << -/D [1356 0 R /XYZ 56.6929 582.8262 null] +1398 0 obj << +/D [1396 0 R /XYZ 56.6929 794.5015 null] >> endobj 458 0 obj << -/D [1356 0 R /XYZ 56.6929 582.8262 null] ->> endobj -1360 0 obj << -/D [1356 0 R /XYZ 56.6929 558.4148 null] ->> endobj -1361 0 obj << -/D [1356 0 R /XYZ 56.6929 558.4148 null] ->> endobj -1362 0 obj << -/D [1356 0 R /XYZ 56.6929 546.4596 null] +/D [1396 0 R /XYZ 56.6929 708.5814 null] >> endobj -1355 0 obj << -/Font << /F37 747 0 R /F39 863 0 R /F21 658 0 R /F23 682 0 R >> -/ProcSet [ /PDF /Text ] +1399 0 obj << +/D [1396 0 R /XYZ 56.6929 678.4675 null] >> endobj -1365 0 obj << -/Length 3410 -/Filter /FlateDecode ->> -stream -xÚ¥ÙnãFòÝ_¡·Ð€Åé“öÉ™x&v<Y»@’Z¢,&©ˆ”=Ê×o]MQIv`]¬¾ë®j鉂?=É|¬lî&iîb¯´ŸÌÖjò}ï/´Œ™†AÓá¨o.Þ¼³é$óÄ$“‡Å`,VY¦'óŸ¢·ß_ÿøps95^EI|9õ‰Š¾½½ûŽ197o?Þ½»}ÿïûëËÔE·ï}óîæþæîíÍåTg^Ã|#+¼2áÝí?ozýáÃõýå/?\Ü<ôwÞW+‹ùýâ§_Ôd×þáBÅ6Ïüä>T¬óÜLÖÎÛØ;kfuñéâ_ý‚ƒ^š:F?g²Ø'9@&Ëc¯{}_ÞCÁ¾šÄÆJ¡÷jŸL¦^¹8ÏR}àJ>àŠvyl’®ìó8±Æ[Ún÷ˆ´yó‡ÁI§Îàþ8èHiSPýÑÔ%ãªVúªuµ*¶ÜÝ5Œ,¤oU<—‡‰WæQùyVn:Ñ-ªŽn/u•›U5+ºRöhêÕÏ -§‚[ǹ÷†Ž×-aukòèLž5ÔÎ[îlÜYðçºh»rË(¾b«°ÅüxF¿~Yw¯}˜‡rè’è“Ðñôl8¯tT„©F©¨n:ÁòwÛõœG̹cSl;îÃs †Îˆïî>ý£Gí7X½_tQÝnˆo7å¬úY)3;>+«(±
T†÷ñCõ¬Ö›U¹†û]ÕÔñØM‰@îlfE͸ǒ»¶œ3wCL¹Ñ©Ë‚^ -P—<ÒG‹f˨§ÕN–aN»N«Âh’E«¤*M©;F롧 -.Hú{¬ìIg&KEq±y<kêň®ƒ9HÁ&ÈPgkmô°¬dý][<ÉI -=êU¨Î[™>kv«9ƒO%v M¨—ª[†qõtì "¤U&MøVzºjËXæ/Bx0ìdÚ"Xtštð$yÈHd°c„8Ì8p¿Ÿ Ù.iYĬ«Ï¨‚v
ÜxIûÁf2âçE,qÏ:ÂWüYêèÞW(º¼¬FÅ} ÀV¡¶ÊR–ö±&ªPØça#ö œ›žd†Íÿ0áˆP½£DhY´0›FŽ(ò©Üá^~ ó´îÏ©mT¬VÜ/.Îõ1ƒ -¼lÏÌŽ<:#tÈ¡§XµÍWÙ³§·ä͆¾¯û«zAD$ßÉ«þN^Ýéϼ£Êzï {G -ƒ†ç2Œ!fŽjÛ;öó xÞã
t·ˆ -N0LîÃͧP¾yW<¢ p&çOjŒy¬ŒÊ{ºõÊÅ.ÍOïD1¡q2/¯Ä+;Hø0·3λìE/²m;ö<8¹kh¸A¥õÆ&b↲8ÐÏÕ¬äY*Wc’ô¸ë¸®Â|CˆÌ–N$ÂÑI¨Ú$·Ô1hÔÛ€”žVHm8“òš1$Håi°
‡Q/H%µÅþŒÄËùäÿµpgD|edrwR
.õïDP2áõPGÁ -,M¼Û ”ÏÕlDpµn8wx“œhF4ÜâÁ©H¨s>íéºýˆºô§ÂÄ…V -bê†ÛÇ]µê¦\½=e¡U|ŽìøŠÝhäW)ùÁjd—ÄüÃŒWí†ÑY¬ûÚÓ”Nb›åÉÄ`j™©Tˆ°*Ÿ¨4<
/?'&DÃÝ÷&„´‰BËE„Ø5›¨¬C¹„u%è9ÝSìd1vÙ°x½Øm·½„¨aÖ?¯üùÓzX|KˆŸ(òuÑÛ®¸ëîæŸ.¯¸î÷ñþ=:¤˜û®ëð¸S·/\^Ô!Æ"¡¬ô·z†-Jy>Âh½Ùuã‘Çmåg|_£Ê9äŒ!ħžö@é¢Á¬Ïû÷Œo!,”ÁY¦Ž=ÜñɪËëÜ—Ö¹îþûÝÇ×·w1£™³Í›R†ÐkÍádAä2öÑáJ±8ªüL´×¼Ú˜XrUŽŸç -dü°þŒ“Žó×°ãiúú¥ˆe¨Ó_g'¦çðxþÅ×x˜ãsüÿM -Ç€Äänå IåÊSxÃ?{Ë· -_ØrÌú3ç:=üâ(x?4Ð.ÓTs¿ -½ã:X{@ЛÐLä6¾>Ü>|#KþÈ¿²QÄ5æ‚þ2šè¶;>Àù/ -`c¿G‚¡ðWÿúéðÓ0Ð8›eæ`¤3M9Þ1µgþÅf±ÏL:rôÿ¶Ü‹endstream -endobj -1364 0 obj << -/Type /Page -/Contents 1365 0 R -/Resources 1363 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1368 0 R +462 0 obj << +/D [1396 0 R /XYZ 56.6929 678.4675 null] >> endobj -1366 0 obj << -/D [1364 0 R /XYZ 85.0394 794.5015 null] +1400 0 obj << +/D [1396 0 R /XYZ 56.6929 654.0561 null] >> endobj -462 0 obj << -/D [1364 0 R /XYZ 85.0394 167.2075 null] +1401 0 obj << +/D [1396 0 R /XYZ 56.6929 654.0561 null] >> endobj -1367 0 obj << -/D [1364 0 R /XYZ 85.0394 139.8789 null] +1402 0 obj << +/D [1396 0 R /XYZ 56.6929 642.101 null] >> endobj -1363 0 obj << -/Font << /F37 747 0 R /F39 863 0 R /F23 682 0 R /F21 658 0 R >> +1395 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F21 690 0 R /F23 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1371 0 obj << -/Length 2964 +1405 0 obj << +/Length 3184 /Filter /FlateDecode >> stream -xÚµ[[sÛ6~÷¯Ð£<S¡¸à£›ÚYw»ë¨»Mh‰Š9‘D…¤âº¿~" -t¦ÞÉdÏ
€‰Ì0ü#3‘ $¥éL¦ LÄlµ»À³Ïðìý±˜EZôQ?-/~¼ar–¢4¡Él¹éÉR+EfËõóQt ðüÝýÝÍíûß®.%Ÿ/oïï.TàùÍí¯×¦õþáêÇ«‡ËQ‚Ìßýëê·åõƒy”X?ÝÞýlzRóçŒÐ‡ë›ë‡ë»w×—.¹¸^:_úþÌ´#_/þøÏÖàö/±T‰Ù3|Àˆ¤)í.¸`HpƺžíÅÇ‹;½§í«£ñ#Q–Б -A[os3@õ!_Ÿ0¦Vèx.š'ÓÒzáM WÚ‹M -aÆJ‡T‹rÜ4(/‚Œ"&ajµÍj0ÚÀH¶ T ¥’d¶`1ÅU)Gˆ1îÜ‹îMQîë€KIB’Y" ”Ÿ{ZôQfèÉÈÐ;”6(ÛnË猱y*'„!±Œkw¨õý¸¢¡ÔWÿ1ÏO#Ò6Öy½ªŠ6¦£ÜŒD7•S®ì r^¡”)nÁÅ~è'p QɈç§yX}ž™ÆCÏc‡Ÿð8”k\^œÓ| âC“˜Ð„¦ïP†„Ò´!è,Ù8$šq²õP²u¨Ó8}=æÕ×(ÂŒ§qå5¢Ýçðƒ$ÌWÿ–dsN¹&‘bTF¸ÆNˆôüŒrÍâ'<從k<E’½CMJ‹s
§°ä)9Áµ*µ5¦E¡ J¥Rqý5b€G7ó+ÁÄ·àÍéfý(—I ËÌ9Æ1˜3)O¹çj„q?át(÷õŒ“°ù SÑw¨)CiQÆ [G&&×GgœCFª©²}½ÍTÀ8ÛØ–Eõ;Ôˆãôæ"Zð–Œëû1Pž€÷2eç‡1’‚§ž«1Æuø §C¹¯g\"gœÅ£ïPS†ÒâŒã R’ª ÆõPÆu¨ÓH°GÎÃ'<®Ý¡FÔû|ƒ§¤ôõÿ3¾¥ßN^ÙF‘Âœœ_QaÛŽ1÷Ã[Q;ü„Ë¡ÜïؽAFR`s4ö5aH(-Î6"ÄéÛz¨Û:”ÖhFhq(·ÅjdÿË>*ãêjD¿O73]2߀î@W›øgæÏ'JùÇbwØZÂ͉Ó|þ½5\£Ìgë!¢ën‰<CXÓaéçžC±$Öá'\åŽÒ -Ò*UˆCæÇØ¡¦ ¤EiÅG@À4N«>ê<j8ýpÆΪu±ÿŽ. -c7Ä¡F,ñ&…¾[ÿŸ|6phä˜"Ru>·qL@…çt„„?á~(÷Õ¹
Àp¨%i|jÊ@Zœ„‚éRÊ {¨ ;”³º<WÁö¹°ôE•;ÔˆvÈ1 -´ßï·/ušÎwy¶®lŽ[ó¹£›ýzÆÙ²…¦+ÛâHÌ`Œ¿å¦m*jÐhžºÇ—û\'EÌæË'«óÆ4€üÆÊlõTìóº{9³ÏŸ‹µÛ¤ßUîTe#õ6šÄ¥¢ÖŸïÚrDb$1ïªz¦È{w¿¼½ùÏX=NAàIwþÙåu}εÖ?Ý0þ1¬ZÿLŸéÑάmÏñ`þj756ÓÞ˜×-b[Ôm
S·÷ÙÎöÖyõ-¯¬‚OX`[M5¯fûCUì2S<€lm÷*˜»ÔT ‰ÀœZ? adpÖ¹]‡í±6lÿb·¿ÙŽõÚŒC]çµyÏ«‰jL[
)Fa×EEr:xÓc8‰aÞÕ<t]Éù•5¯¬ÓÚeÖ¼Ç|`Ë%™ƒ9&Aôù§S¸ÕÑÍy#æÂƈI*^e ˆÑ¤³¶#£¡)»Aݯm8ÕÍ4ÃÃ3ï%¥7$í§±®‚[&¨ -V—MvÜvÐy -‰a¬œ«u¢¯¼I1á)$D.x?@b¸ix¹>›l çÍñÑ´4Íj»GZžÖDkµþÐIu+f¾;4/¦©gËÙTÎ$ìp°¹9ŸÊû¨ó©Ü¡ÚŠüS¾ú²Ð³³7©'”;Ôˆv“ŠIl ~iR
‡4b·
̆I÷ëvâ逕¦Ç²¯©ŠUcŸ˜Iž‚'Yéº%–¼1ýYËLhÔ/û&ûË<mé£_Ê«&+¬Úu¹3mnòUmÙ»ä#)$Z“| -mýü•ÄŽ ž§Ñ+‹Ÿp:”ûz¾Ig ÆâÁw¨)Ciq¾ ]E%t‚o=T„oê4RžÉ?WEMõ´À"®¿è÷ ‡U ó
xKÂynGÁ‘kSأ幽R°ø ¯C¹ßÁ8x¢‹Gß¡¦ ¤Å§ï ?L0®‡Š0®C†ª.·c58ýLi\½Cè÷÷ÏaÅ„oÀ[.¦=7†— -©4M#— -R`B<O£— -?ás(÷õ|KRRLŒ½CMJ‹ò¤%RLœÖú¨ó|s¨vCšWú»¨ËlÑ4Û0ÃQ$8`£8Ôˆ>ã$úìï™ð6ŒqdÈ9ÇJF"9ŽÃ| Âó5šã,~ÂëPîwä8ŒdBÒxøjÊ@Zœs0I$‰ ÎõPÎu¨ÞE–É_ê/éœw’t‡1Á#§ˆ<°ámÖ1Oê˹¬g¥ÀʾÑk.Ÿp:újÊqŒQB`¿
¾CMØJ‹SN¹S§%N¹*B¹¥56ÕË¢YU¾©òú)Lsíõ:àP#øi.¶J|Þ&Í82Ls¾;–å(@aŸÙ÷!šå,~ÂéPîw¬¬° äBÅ£ïPS†Òâ”ðõUÉÄ7{û¨å:”Ö¨¿8ý˜ÕÁÅvš ÁàLUÜFûõ]®çÒ×ÜÞÓ·…rÞU3YÚ–âL—)Uâ“…æyiz-Ê–J¹-LkHÝ”•)ý9Áww!ð\l¯pWMÔïœ^Ù”újÖ“0öÅmhAý’b?šÃÃ`»‹» ò%y¶UJÐB¥)ýê¿pü©Ìwãss‰DÕ<³3óGWÌM« -„X£t`$3’ý Ihúÿ +xÚµZYsã6~÷¯Ð[誂›ä£3ñLœÊx²§v+Ç-Q³©ˆ”í¯ßn4Hñ5ÙÉVjh +%@ç6ê;‚3.”ͲLƒLµQ´hEhØ{š˜Y%•3ɪؿ&û%ªæëw0v"CòÈÂHws=×:~•RÓ’kKüO‘§8A_YIm‚M¼&Gú® +jEþ+çòùà¶Hi°µg–?ÓX‘·6Šƒ]êæçÈ*02³Øé¸[Û$r)Lð””Y Èq\“\m%„Š)]‹…¬È.ODe•Té6Í+: Xakƒê¸KÇöY$#åמׯŠ˜
#éé‰gÔSyY,ˆ>ܬ'OvýOZ™ËP²06aW;g–Ù(ŠüFI¾üöž§¥Žºò¤ûrdG€¿4Ñ@mo®ç*äÁë:[¬¡«mðšm6ÔKv»Í»Æ‡þ8¤û,-I"!¨IÊZ"r$¯Yµv:âaPSìD'Ààsö’úîÓ‘¦=]H6w½<Ù¦)6¸[ù¡bDRÀ½Fm~Ž‹ÂÆüNµq¬aàL×8„+%”»8Øîèb”~B`7Á6Ýîª#u7Yé‰V£ÆV€‘Íg1.Y,£Ø“ÖÌ8E¢¥Ó 瀴" ͬPqW¤þeV:lYü)¥‘¥3Ž¬œ€Ú›’æÀ”×"p'‡oÇ"Ý4›y:¤+<e•.ª’fànv܃ðØFبÍ*ÆÀ_å4‡›áKFV{»*+ò1íÛ=7Èp)k‚Çõ¡>lE‡‹u^çV,ùG9”©‡>Ü< +ÝU. +þ’ÌP~4w–&Boi·…oa®hL8”ΗáF î«Î¨Ø˜™ÿIè±·1tèT߯’}URÿ°CŒKd•(Ó²·¶-IìtTSÔ"ãù’úÉØ'ýÈei¸²Óê<;M‚S$`d[”õÛ櫈ݢöœÚaQë`õj·ÍCkB +æ8_P[¾¯Iï/%Å^l»–’VÝÌb“”žèîþ
uH\VK +}¯bI¦Å•Åv—mÒåÜEX¦«ä°åˆ|‚%œa{¿N~Êg*Ø‚Ç{‹Ü¥¥_|í©¾4§Þݽ_•¼¤4‚ÚÁöém*dnÄ„žUqü‰ã^£u!¿èŠŸ|F¤ w±ò/ìX¯8ë5t$ÁQ»
a™Šb;3:±Ö^›ô9Á5ÇÈ1âA‡,KÄ¡-ƒºH,©GqYiîwrL
%˜éŸæ1¡8øÍ(^ÃæùjŸ”ÕþR†EUWSgPŽk¹pá5…èΞ]Ú«¡tþð†¦îo±|v_<øø𣣹—?Áp’—¯çÜA«¢ÑÌï^_ßìŽpà ¦êÅ¡OË(iKÿÜm²º(cfÛöèI-~6車Qàœ}æc/!'ôÄQ“|†˜|Žh¨"Î!i¦E,]ˆ± +îÿõíÇ7w÷Œ†É²Ø[©'Éñnº5TÉ`ŒsŽ9 GCTéŸN÷‚vó ¯Í’nœÛ;O>šã)Yºìfy›4ie€tC{ÐÜëK˜ŽáUGŵKZCÔž2oü®XÇqBˆ'>Âe1˜€?ÛÒ¢nñZŸØ¯]/¥+í;ýe~âäzN8_„`‰M÷AèZT³° +7È–¡ +ýÖkÃ#5å1/òã¶9Âó~}Q7¹OMedÐpØÑàÛ_ÒM±ó¬0ãNƒöí:)J¸Ox¡!š&4úÃÍ=£w²¢*ņ¦í8îvʉ”nl³%¸‹£‡wüL +©žjª ª@•`;‚ÒäþyF‡vd¯é/ˆ<Ü—D^œ„C8@m£,Me_Ð}Cu‰‘ÁnÈÇP ,¹ +嬵©Îc¡ê™ *©Ü %‡ÌBNŸßP0ЛXrpõ¾nÑn^ŽþÏÁ’…¡5çZÆÚ2L!®¦¿ ôpßÏFœæ{„FMk¿¡ºÀÈp·iĨ˜ ˆ¸€¸Õâjª“¥ª=TÚ«t?tp1“nM_ßÁÌJÈâ»çÿxkKÑ•·Ì†±:73Á…êH:…·šþ‚ÐÃ}?ßÃņ…¿ ü†ê#ƒÝ¦ñy édo-ª ¼ÕT'Kv §C´ç22ž>½¡9¾‹7ðoJËîù'ÞNRôÑ&Yĵœ@› +ÿâ+ìœþ©©ãºÕ.þ÷ _£=üÀ:Íß.á÷OŽkÿ34|{ö…¸A÷±\(ÈöZ|Ná©&Ÿ–k°ë(šäX¬”øèÕã”v¢i.{MBÉbò#¦‘t¢9$OÓ¿ìsÿ7 +øƒkÉA[P,N±ÐÐxèü)7 +ÕàG1Ép„õÿuNuiendstream endobj -1370 0 obj << +1404 0 obj << /Type /Page -/Contents 1371 0 R -/Resources 1369 0 R +/Contents 1405 0 R +/Resources 1403 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1368 0 R -/Annots [ 1374 0 R 1375 0 R 1376 0 R 1377 0 R 1378 0 R 1379 0 R 1380 0 R 1381 0 R 1382 0 R 1383 0 R 1384 0 R 1385 0 R 1386 0 R 1387 0 R ] +/Parent 1416 0 R +/Annots [ 1409 0 R 1410 0 R 1411 0 R 1412 0 R 1413 0 R 1414 0 R 1415 0 R ] >> endobj -1374 0 obj << +1409 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [284.2769 667.7189 352.9489 679.7785] +/Rect [312.6233 240.8428 381.2953 252.9024] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1375 0 obj << +1410 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [282.0654 636.5559 350.7374 648.6156] +/Rect [310.4119 210.9549 379.0839 223.0145] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1376 0 obj << +1411 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [311.9531 605.393 380.6251 617.4526] +/Rect [340.2996 181.067 408.9716 193.1266] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1377 0 obj << +1412 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [299.7586 574.23 368.4306 586.2897] +/Rect [328.1051 151.1791 396.7771 163.2387] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1378 0 obj << +1413 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [292.0084 543.0671 360.6804 555.1267] +/Rect [320.3548 121.2911 389.0268 133.3508] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1379 0 obj << +1414 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [330.7921 511.9042 399.4641 523.9638] +/Rect [359.1386 91.4032 427.8106 103.4628] /Subtype /Link /A << /S /GoTo /D (dynamic_update_policies) >> >> endobj -1380 0 obj << +1415 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [401.5962 480.7412 470.2682 492.8008] +/Rect [429.9426 61.5153 498.6146 73.5749] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1381 0 obj << +1406 0 obj << +/D [1404 0 R /XYZ 85.0394 794.5015 null] +>> endobj +466 0 obj << +/D [1404 0 R /XYZ 85.0394 440.7496 null] +>> endobj +1407 0 obj << +/D [1404 0 R /XYZ 85.0394 415.629 null] +>> endobj +470 0 obj << +/D [1404 0 R /XYZ 85.0394 296.6684 null] +>> endobj +1408 0 obj << +/D [1404 0 R /XYZ 85.0394 271.9661 null] +>> endobj +1403 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F23 714 0 R /F21 690 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1419 0 obj << +/Length 3323 +/Filter /FlateDecode +>> +stream +xÚ[msä4þž_‘âËMªa½ÙòÇ.Ô±ËeCÝ]œObâ±Û³!üúëVK¿½)j+鱺[zÔ-µ¿à?~©CÆ"¾ŒbÅtÀõåf\>BÛwÜaִ¾¿øêFF—1‹C^Þï:}Ã/ï·?¯B&Øô¬¾ùðþæö»ŸîÞ]EjuûáýÕZè`usû¯k*}w÷î‡ÞÝ]¹Ñ|õÍ?ßýx}GM¡ëãëÛ÷ßRMLÎtzw}s}wýþ›ë«_ï¿¿¸¾oméÚˉ†ü~ñó¯ÁåÌþþ"`26úò~ŒÇ±¸Ü_(-™VRúšüâãÅ¿Û;öÓ©ñSÚ0-T#)Ỹ3£ÌYÄ9€"0óvŸdÂ1Nòº\e“í^‡ö‚0«(ºìt:’Ü‚Æ¢eG4çŠþPä¯0ä"^íӤȊÇÝ1§ßÙuho@4 +ÄâÇ'•’u;XVSɦÉ>¥TÞ•š'ßügY¤@ÈÕý“ƒÕiC…rç´L6OY‘Öþãĵ¿d¹Ó»ºâf•nÒVTB +ª®"ÔLEF8
¿}ÿA0Ó0DQ `H9X …m}ÿáþöæfJÃ3NìÓºNS´ÀÙ‡²OÆÚGuTƒÆl]Íñ@ÑLÄ&h
}îyV7é–ÊE²wµuZ}J+'à—@%|ÐJNŠA'‡*Û'Õ+Ùêµw¶ö ˆ© '_(áì€õ¡¤7ªù±¦RR¼RáöGW±ÝÒ<ÔuZÓwõ!Ýd¿°V +Ì›PW…LFB–¶Z0)B¯mgŒHBSúI-¶®†&Îø•F¬!žõ>Ƹ&£¡¢e‚3Á¬¶é.9溣Vðn®!„è8{³`)øB¥U×€W8z¾~“7€Bݨ„4«ÑðÀ¹¨lµÆ¾×Æ·¦ûCóJE\-l;œƒC(D2ž÷â]Ôy7Þ¢ÐÎÍSºy^ãê¬G~œk\Þ¢&¤÷<¹€h%ä@ü=¹näÐd%N¹&¬;ÖváပTãØ×TÙ¦q-´Èc°$©À][á´¤
Õ'–™P¨_‹&ùƒZ-}ð£´j’̉ݖ{*+òWµÓ¦hO$”šr> +Wgn¿‚ ö«Ò5 ¯¶§þ¡,jëøþ-ÕìlU¹§_dŠ´y)«g»+1Ä/¬> +øñ)©²Vͦ´=m¶®¯ÒZô—yGKË×Cêø{ߎ×U²€sï
œíAF@Ð}¤²ËbÀû᪘ÛSàß\»$Ë'÷TÌ;¾ô¼êt2Ò¾:O ÖNì4‹$î¬ÞLó—¤*¦I&”8i~nÝ!3a$Ö}5³î=ê´î÷Ç13:0ó‚=hBpovÅŒ]z’?¦éhHëM•¹õ/huŽ‡5ŽX ”±]ý‡V³P?Ó´z»& +ÁAªžÔX=^Rá®cm‹_0wÜ/™»9†'2>TIï $/{‹ZPdÜÛ,Çt¤™‰`:g9ÖEçX‹:Íls·›¤ÚŽÂ‹™ +ø¼xšßcšäL¨êÉÿ{L‹{LëZ1ÁœÆ&:Ë7Ü¥EpéY:÷¿`ô¸ßÏç[dà,!åüà·¨%EF½ÍóM[ˆ Îóƒšá›Gf*+šô±Êšñ¹—„gå{Єü>á&L(û +¼%ázfÇÄ゘…7=SççñVûýŒƒÃåüè·¨%EF½Í3ŽK@-9¸h†otš§:{Èqƒ5Ú<œ#1+»…÷·Î’Fêžô·£¢CÇñùXkp~!ïš9J=|ÞàQ¯ŸO38\˜HÏOyš×bÔ×,Ç”Ì(Ì’¬‹:ϲe7¡i…§Öu]&ë¦ÉÇ^M0´œW EMhЧZÄ4ž÷{*¼
×&²ÍÀQRò¿¦`!ݳuÖ¯9ü‚Õã~ÿ‚_Xòx~ø[Ô’"£Þæ9côÂé ‹šáœG¡Äãa›4éš¼Ãsý<"„3N/hТ&Tè‘N ¦t0Ðám‚é”%ñŽba$ϳNJKÞ³uŽt¾`ô¨×Ϧœ +bFvð[Ô‚ãÞæ)'@™…XÚEÍPΣPbS½®›Ía]¥»*ŸÆnŽÃùŽ2³ +´¨
ún.„² û*¼››0dèæ"=ãå@aoÙµaÖË9ü‚Ñã~ÿBX…ŸÒf~ô[Ô’"£Þf)'M›!ç)×E§\‹B‰à’‡¤NG9i çøYÁ4!¸ŸÁ½Šú’?b2ß&Ç•Ï`ÊئߨŠÒ“ÁICj/©öÁ¡\zT¹d4Bꦬ(Ý×v¬ÿíØ¡½r|¿9}²+ó¼|éõ0‘]çPæZô3¡ÝÑú ÛÜÀ/çôõÅe&AŠˆ(Ý‹áÈS(!JG¬טÐÌ’SÉŽ +6Êq)5e;ªM¶ÛÝ{’S}ס¨Õ¶ÊÜU,4=aFÜV?¤iAup*|¦k …<)©Ö9,å®rñ„½•à«å~’cu²?äž!^èÉöÔ“n“·ž‚tÙ'W†¾êáx +XPö÷tE:Ñ¥7 Ëé‡×^&ÿlÜpþd´p¢ë¢ÎÇe=e“xŠ5P"àù¬XšÛ]
1
ŠôľÍöæ¤üøÒG†3Û +b[MU ý!åí¶ËÅ?åÞ_@S–¾7ÈZµoaüÚ_ìù–
×$s“Ý¥¿:©˜—å³}H%5mï¡Ñßu£çáàÚ8<cÙÙ" +ð¬i÷ê"⎬Q02iIAãcÚ4í'EI•IQ¿PÇSâž:ŸÎBc|®Äï£'FÁ>MlïÀËcîä'x¾p:QMQV{Üž`•k[Iu~u‰H +9Ôi‚BÞ*q›;Äæå#µà[ÒßÊc‡zJ•ø&‹v¾±rû +²SÖfˆ‰Tp芤ŽþÖRN7·ÿ½¹cTt'Ë…CEöX”îuUo }؆•mW`lÌê¸i†ñXeЩ‰¯œy„ó¦aƒ=Ó €Ã!-çáç/B¨‰§ÄJêXt_áŠrµ=û[‘/nœ¬˜é|€3Æ=¹;³ØÈvîá¼Ô_»O0þ¹‰úÛêOÿÇŠ˜4æÜ#|ë` §š©ñ:`i€k«þ` +©ìendstream +endobj +1418 0 obj << +/Type /Page +/Contents 1419 0 R +/Resources 1417 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1416 0 R +/Annots [ 1421 0 R 1422 0 R 1423 0 R 1424 0 R 1425 0 R 1426 0 R 1427 0 R 1428 0 R ] +>> endobj +1421 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [257.6971 315.5214 326.3691 327.581] +/Rect [257.6971 603.0615 326.3691 615.1212] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1382 0 obj << +1422 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [310.7975 284.3584 379.4695 296.4181] +/Rect [310.7975 572.0651 379.4695 584.1248] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1383 0 obj << +1423 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [308.6055 253.1955 377.2775 265.2551] +/Rect [308.6055 541.0687 377.2775 553.1283] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1384 0 obj << +1424 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [294.1999 222.0326 362.8719 234.0922] +/Rect [294.1999 510.0723 362.8719 522.1319] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1385 0 obj << +1425 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [303.0862 190.8696 371.7582 202.9292] +/Rect [303.0862 479.0759 371.7582 491.1355] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1386 0 obj << +1426 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [332.9347 159.7067 401.6067 171.7663] +/Rect [332.9347 448.0795 401.6067 460.1391] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1387 0 obj << +1427 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [301.97 128.5437 370.642 140.6034] +/Rect [301.97 417.0831 370.642 429.1427] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1372 0 obj << -/D [1370 0 R /XYZ 56.6929 794.5015 null] ->> endobj -466 0 obj << -/D [1370 0 R /XYZ 56.6929 726.6924 null] +1428 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.137 257.2319 299.809 269.2916] +/Subtype /Link +/A << /S /GoTo /D (boolean_options) >> >> endobj -1373 0 obj << -/D [1370 0 R /XYZ 56.6929 700.1172 null] +1420 0 obj << +/D [1418 0 R /XYZ 56.6929 794.5015 null] >> endobj -1369 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F39 863 0 R /F21 658 0 R >> +1417 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F41 910 0 R /F48 925 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1390 0 obj << -/Length 3056 -/Filter /FlateDecode ->> -stream -xÚµZ[sÛ6~÷¯Ðô¥òL… q{L'ëÎ6é:îìÎ4} EÊfM‘Z‘²ëüú=¸ŠW0ݦ“É>â\ðƒ+^Eð¯EQ,“— ¢¦«íþ"ZÝCÛ»l1ÚtQ?Ü^|ÿ6æ+‰$#lu»ëô%P$^Ýf¿®_ÿãÕÏ·W7—B£5C—Ê¢õ×ïߘiþ¼þðþíõ»_n^]òd}{ýὩ¾¹z{usõþõÕåŠá{b{˜ùàíõ?¯LéÝÍ«Ÿ~zusùÛíW·Þ–®½8Š•!ÿ½øõ·h•Ù?^D(–‚®žáG„°”dµ¿HhŒhÇ®¦¼øxñ/ßa§U:å?Dá$qÇ8‚rÂVœJÄbhR¼}ÈÁ¢¯³|—žÊÖü(eÙ÷oÑùžãˆƒPõá7Ç»öƒêI! Á¥E}§ú‹Ýˆ@ÏòÛK¼nL¹JÛâÉŠ/ªÍ>ß×Çóóx‰Å:Ï6weº}Ü´æ§Ó4mÓ»´Éa¬âˆƒ…î/ò
VçNNÝ*EWIÀÇ‚6#I)Ñ*¶écn5ÕbîOû¼j¤?‰ -U]å]:L÷ö›Û›¡ES„" -Î ¬° -‚ÉìaA›.ÊOdRÞÈ -ÄÃP,Æ ’˜“°\šÜ‹:àP¡Û“ü1χ.Í›í±8œ=ZïltuÍE$qÑuÖ 4†Pyþ˜HX„.yÏDÓx¼_™ÂMÇX_0vܯ1v{6K%Y̪Ž0•^÷¨Eƽ)EæiVp–,0¬ƒ -0Ì¡ôåe~Ÿ*ë7uU¾Œ¨F’B†å;ЄüÑÄ9 -˜ü.ÙúSÅé½*ÓµVEצ‡CYè< ?TZQ Ã`Ze¦ªiOw¦ôâ’ã&Iøúzg[s‹‡Æó‰%f–/y3ÁXÌ‘Œ‰8O*µCpTV5gÆg“^@ÖsQ–Öˆ²±šß™¤KI!™Þ$¤´u‰(µÉO%iý×æ°Â%EÓ±*¹ í§ á—ƒa¥Ü<Çp„Ìåë s(eÖ®>>§ÇlÄ-‚åX†{Ô„äÞø†(…8ê‰þ Çt½ÏÓª¨îw§ÒNR;So§(jN5=¤©JÍ£¿šÌÎ LM«§²D3xœÁ݈GÌF\p
óDæØ‚ô”mdnÓS“[Y^Ų®!½kÓ¸K‹ÒpŠHŒ0¬úœJwZ<8¾€T[¾BåÐ8Õh¢ -ïó¶õŸTµ©L«æÙÌåjñÄÙúù¡(§]€"¶ÖA€“cÓNyA/žëSiå§eY?[LMU÷j‰¢ªœ;´mµ©sF8E8ä˜A€y6 -”—È\°9Š÷¨ ùý¼›9Èq}þ})‰žÝ0L”'MT,MUc¶cª$Lƒb°ú©iµ{1?´ÏUk•îsS¥ÈÔi‚ÂÒUj—w -[Ö÷¦åSD£ßëÓv<PÄ®2"¥íU»ªÌ^@@±µÊ`gd“¬œyLyŸ\†°Å¹þÏÛdŠ`ì*ߘÒü)î!—iJ4¦ÂPˆ9Ú˜JßÛˆë±>mÛáÆ~U¥ƒéÜ„×ÖBƒsÖ©½·Q‡¼²ô‡ŸŸILpŲ3Š !0©J—¢‘‹.[ÛK²¿WåâúI‹1SÈc6sqg,™
œ„Â6„/¥ò.j>p<ª8íþ°±î†O¢JÈ‚5¡EÏm lx<PÇÉA6•TY½ÕgnùXwvknO{>{ê|GëkOÄl*ç=M(¬`"±àé*ài‡Ò,²Äí}"I‚=jBr?9ň*û¢_ÙU‡pq$HçôIø ú¶1?
,o«)-ôZDÿµÓn–Wj[Q»ç¸ß«žyÔç®UÑ}N†>ó0ILàRöcp.ŒaŸ†ÝzM*¸DbØ¥
Õ$ -5[iÖØSîfDmÕ¶é;¾q{ÞXã„#Æ×ý>mÔòtò€@žg}•'ú’²¯3§)Õ±Ô„=’tìPvw8ÃæXD…XÈ]Ô<›=ÊØùÇFOE»ÜæbŸoÆç˜ewÖÄ£&TéÑ[ÀXF\ôuùkG;ÂܼE5$C±Ê\s‡=±(‘‚ôŒöxü‚ùã~ç{øP¥„ª´:ÇÁ£÷<ì‰aßÃZy…T€…59fEVN³V͔ɰ&5¡JŸ…j_ª†¡«Ë×9`Y4daŒX$H€…rÔ‰\ך -~Áüq¿_ÎÂD]„ZPdÜ[˜…D–6]T€…5Ÿ9êS;¢¡HPÂ(«âQºôi(, d_™¿‰†]“F·\0Oc&ç‰(%¢œÑžÙ!":ü‚Æý~9´,
„-¨1ê+ÈB9œ‹…TØÍsÐæÓÆ$1b’…õð ±"}2Ä8ïkò7MÆ]{†yPvó$@¿Æi×ä û,<lü¨×?Á½q̃#à0a†=…‰û- -.ï -Ï‚ÌÉS«Ž/F›ŠÑ8(ÔƒÆRû×y\‘‘õÄ~–•.ìecó·y”ÁÞ•Š®}¡Ë<[:êõO\å+é‚¿=(¬Å¨¯0«ˆJ~É:¨ -xÔ„=6S5SHÚWáz7ñþEBˆÇâÿzýâž×è×}º|~õò˜ç÷8Çڜڦ¢Ú©{|Ka¨0üÖïhŠæüFêÁöÁÔnÓÊ¿¤Ñ³Óþg†ô#Eƒë¨îÓÄŽÁÜ’â<8Ëá"D¢„ú/²\«áÕ‰çšwÍù:8ðÈKË,=ñr˜Ð/Ñ÷›§´,²¢}Ù¨Œt|š¸SáTí‡HHiÐßâ‹é:*|•á¬!ãS>K<å#6g3Îø4:hõ°Ï/_ª×ÓàTò¼Çuö4=MûCa4ó~þÛÐùË/ÃÏÏæŽbEiçE "¹SJ)ÎGŽòOÈǪÿÁ¡(ûendstream +1431 0 obj << +/Length 2730 +/Filter /FlateDecode +>> +stream +xÚµ[Ûr7}×Wðm¥ªÁýòè8²W©³+kk’<ÐäÈš˜"µ$eGûõÛà@`0Ó+r¹\œË™îÓ3¸4FlFá›YE¨prfœ$Š25[ÞŸÑÙG¸÷öŒõ˜y +Ý” +“ˆ†*DSËB—£Ï‚FUØã+á—vŸ¯BéˆVãíQ"¥5\…PV©Š +¢Â€šî9¶‡B†V©•Æ©DÔ—\†ŽÀ”Àåd¾‘Ó†<(ŒÓL»i!:G”Ñ*bÀWPÚ}¾5Ü©5D +SÔ´ +#jºçU!L¼®P‰¨.¹ +5ÑÆÈ|£!9
iØ:S1‰ˆPBҌʢFEØã+ñ—v¿B„”fðv +Â.B‹5®+rŠBDPÞãf{hoŸÊ5rJà~#jÄq¦8f¼2uîùewâ?lfp¥Á甼 Ô(›…ˆÈ+â+Á–v§äÅ +Åsȧªe=¢*DJk¸Â¸/˜JÁ"E! +¨SÍWÍzñ4V©p Ü{D¸V*§:÷ÿ’:;E1p,ŽªéÎ^Å…ÍÅ:³€¯„\ÚT›*§›’ÀÔEãɨ“Â*7é(MVFÕ5-·ˆJê°ï·‹RoA-î>¢Füçz³°¬à,'ð2ó¹"Œo=4åœ&ÎÏ5ÓPÁõøJÌ¥ÝçwoÖ?¾f€&?¢jD +k¸Þ aBÔª„) +Ñ[@y>5#(<FÂýFÔˆã¼H(‰µÎ枯|¾ER8²ß…šá±"WbýŽ¿,ú‹íæp¬£ù3u~»Ýu—÷Í4×n>vç‹î\·ËîØ×®º§|ÌÇKññÏÍ®õ5Âåâä„~Dïۛż¯JïÙÒjáᱫÿz†\võ_øýñÝû÷—¯»coãÈ™w<zè—»¦ÃûöÔ-:cÝÉz»X…çºÒùö¾;[µûO¾–HYÈ!\tý½mp +’óýšmh—û²Ït„û²æ=‚J÷™•$œÊü_õ½!ŒµIo/·ƒïS—â¡1³0ßù†4}*>ß7;h°îøK»^wGŸšæ¡¿^ô·Ú
Hù>ˆ.tʆƒþu‚#Ÿª£#ºk—wÝÕå¢âCï{õxÿЬ:¹F,¥l ÷í©áË‘€"“‰SË$Û=Ãé‡#RÅ'Vn†›)Qe15QqÓõh¡%Ñ0±Â5—¢¦EQÇ°ÚóÏ‹u»jOsß#í>ìµEŒY¡4"j„G¾ò…%—õeD^f~8NYäÂ)´È9¬ÓP*5À#¾{i÷ùE¿ñ éUx+DT…Ii
¸… +Â.<*ýú¹RrIQˆðj¢æŸu¡=
ÙмÂ#¢Fˆäc%#ÆŽ1ùfÚëã€"g‘tìØ?'±`òøJð¥ÝçËOPbaQ†6B +U!RZÃ(åL¥D“¢Òdc`·§S *#û"çòME8Þ
v¢¶ñ!²¨ë¢–€ÒîWn|hƒ7DDUˆ”ÖpúŠ´\E‡ +Ña@yûfþÜÞЋGûÜad"j„M&EŠ…%^Nçe +‡• Š`ö¤ýœÉù»Òˆ1F|%¥Ý狦±Z¥9*Æ€ª)¬¡bdG%ÙÊ°œ¢¦ÅQIÁwB~Æ.
k&Ô}DøÏ"°ð%¸ŒÀ‹î“L +NÃL€ÅÂÎHçǬQ¨È"Å:¿€¯Ä\Ú}¶ÞüG\T:‹'?¢jD +k¸Þü‡[´RòK@ˆÚzPÑJcã®òå<ªP÷TúÏÔægß–ÙŒÀ7Ûø`k GVÑ›tÐZ¤‘brp<æÂêó;7¦ˆáÊ¢™ œEaW÷ŸºÊ0›¢Ôñ£v3ß5·»fwü*é».þ[‘±ËGôa÷TbÃÅòŠ[<„ˆ‰a8MrBò<ˆ£`™ëë2Áú#ƒ'¸T¾*žzÄÏ€¯P,ífúòd&‹y +&_ÊÀjMVDU˜”ÖP9E 9.±4° +ÏÃY›£0”%®_f-ÎÙLòõ<ç^<‰±õh4Ú¡Í i•C¯ƒ¥;bpK㪠+õ]èĨŠá¿)ü—ÿþìôÇyÒá÷»Æ‰SM,‡ž¸'剛r–(ËÍõÿ‘¬–endstream endobj -1389 0 obj << +1430 0 obj << /Type /Page -/Contents 1390 0 R -/Resources 1388 0 R +/Contents 1431 0 R +/Resources 1429 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1368 0 R -/Annots [ 1392 0 R 1393 0 R 1394 0 R 1395 0 R 1396 0 R 1397 0 R 1398 0 R 1399 0 R 1400 0 R ] ->> endobj -1392 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [259.4835 681.3376 328.1555 693.3972] -/Subtype /Link -/A << /S /GoTo /D (boolean_options) >> +/Parent 1416 0 R +/Annots [ 1433 0 R 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 1448 0 R 1449 0 R 1450 0 R ] >> endobj -1393 0 obj << +1433 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [387.5019 378.783 456.1739 390.8427] +/Rect [387.5019 666.0385 456.1739 678.0982] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1394 0 obj << +1434 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [381.9629 347.5161 450.6349 359.5757] +/Rect [381.9629 636.1092 450.6349 648.1688] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1395 0 obj << +1435 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.5803 316.2492 467.2523 328.3088] +/Rect [398.5803 606.1798 467.2523 618.2395] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1396 0 obj << +1436 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [393.0412 284.9823 461.7132 297.0419] +/Rect [393.0412 576.2505 461.7132 588.3101] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1397 0 obj << +1437 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [255.0796 253.7154 323.7516 265.775] +/Rect [255.0796 546.3211 323.7516 558.3808] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1398 0 obj << +1438 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [311.5276 222.4485 385.1809 234.5081] +/Rect [311.5276 516.3918 385.1809 528.4514] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1399 0 obj << +1439 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [315.9507 191.1815 384.6227 203.2412] +/Rect [315.9507 486.4624 384.6227 498.522] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1400 0 obj << +1440 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [381.2254 61.5153 454.8788 73.5749] +/Rect [381.2254 360.8088 454.8788 372.8685] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1391 0 obj << -/D [1389 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1388 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F48 885 0 R /F21 658 0 R /F39 863 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1403 0 obj << -/Length 2816 -/Filter /FlateDecode ->> -stream -xÚµZÝsÛ6÷_¡Gy¦Âá“ -ÿ±™JH’òt¦SIej¶Ü^ÑÙ<{{ÅfáA‹.êÇû«¿½z–’4áÉì~Ý‘e5†ÍîWç áä$Ðùë÷ïÞܾýíîÕµ–óûÛ÷ï®\Ñù›ÛÝàèíÝ«_~yuw½`F±ùë¾úõþæ%NÆ·ï~™/g„Þݼ¹¹»y÷úæúÓýÏW7÷Á–®½Œ -kÈW?ÑÙ -ÌþùŠ‘5{JXšòÙöJ*A”ÂÏl®>\ý;ì<m_Û?©Q\&°“vKññ]fD3 -)Q"a—9Ûe²»Üì²²^ç»kf拺Úï–ù©åŒƒï´Nf]ñ%jDÑÑ‚ñ”(u¢Å‡<ÇíoÝ`•×Ë]ñÔU‰ÕÚêubRª åÒ€[NаßZI÷NQžš+¨!LjÖ3îf8¸ëð†å¢åË£–ò,!z ’–ÄðDÅ=PSŠ¤YEÈ€ðŽUš¦DB\MP¯ƒŠPϣθkñœØ'‘LMèP#ŠôØ'D›î+òÝØçÌ9ÑÁH™ˆP(ð`=‹côø Û‡r/& ¤Ò7Wq'Ô„"CiQ&|+D'`už€eWÌ6Íâ’ü' c1¨]QEjD“>%‘)7}UþSÇ¥ˆA§TDP(Iç9•˜IÓ³9ÊA‡Ÿ°~(÷ÿà JwC@M(2”ç ÔDðZœƒT„ƒqÙX"„@ÈTÅu ¨ez4„ÎB@Iêkó]i8ž
ÓÔVÅÛÖUt‚‰?±C¹—3Qph! Œz" &J‹34q&vP&z”]q_ç‹K3¢%·{S& F´éQ1ÊRÎûê|›¢<aÔ©&3Éy2j
ÔÑžá12züÄå^NF ôa"î -šPc +ÊDE„*ãLì¢Î31 ìŠeÕëÃ9î1pðÔê4²zÿ,ÂHšjÑ_þÛ$Á'k'œ§àsTã© -$ɘ(®Å@Vœ‚;T«‰Ãm!¡GÙ¿äðÓ¬¯v‡±FNi_݃FVï7rœ(uµ·ü·¡ÝÀˆÓFN/š™H#‡ -a}Ñ1!ÚÈ9ü„ÍC¹g¨6lãì'-â;Pj¥Å¹µ¿hĹÖAE¸æQmIÝošb±ÍêNyª)БËøê5²|Ÿlεк÷Öÿ6d;µâ”kÌ&vžk&%‰NTÏÐ×<~Âä¡Ü‹Óš -©Fû_éPÔâÉúf´ PЦ„¯9U‚δ¢~²œ}Î7‡kÆò¼ ÅÓ¤…`5šb>»70%–s—™×v$—›l_ƒóÕó—j÷¥ÆaëP;¨³šp9Ä9\“ùÚð\T{÷ä9ßÕ`¢»³²WKH‚ÃÛ¯-«ìì/qè¹Õî‚–™&ÂÉ’°k[Ôuˆ÷–FpÝwb&+ÝÍ^Víu’`T¶ÛQQždPKCø9éc?òË9")OOÜÂ…˜5^ËüÅMX½÷3)^,Wq`)à^Û¢¹N˜2_ÀÆeîÐRM‹©6(¸â£—ǬÁÑ1X|'i‹RÖwP«A¾²þæbþÊ׹¦¤Ût 1óý¦• -[CaÖFCaÍWm”$ dž<ØØ<[>öd¸éœµÃž\í‚;|¾ÊË"wsG급µG›û¯…=ÉM–/V€QH>#çŸs¼Ç=[¹ÉN¢p;Ø჎ƒ`¶ -ÿcc!hç8 2·‡~x†ÇúNü2sú9´8uji‰7Ó;GµD·7¾Ù‰,Ñçª „&Ç‘¦[KæËÉŸè~~,š¹Èí+Å·Üpz›geQ>¬÷¼GªÚxháV¶eHØü?y‰áÉ´z¦Òa1
úMÕå–¥BytÝ -ùÔAdx{,ì™kß`2ßabÚá-šmÎy†C'Î?Óe%ɸîÇÚÒªÝBaÀ‡†÷ã¾c˜ÝsÏ”e 3õö¶¤:ÑKsÏ-æù×ÌÒ¼Æy˜ÁaÁkœËðÖå‚t“‰}£ÂFj™#,[œ]5 -·FY5ŽO\@]KyŸOøÒ&ÎìvŒ•ÈÂ%}¬^zÙ£“Çm ·…ª86ò›ªúRÿwL¤ý¶WÀùC1TÄæ›ëE=t›ÿqø_¼@f9à’Ó½³É¼9<åÇ;}Ä‹}TãðÓxŽª Cn°FAdmK’c]²îÂ8Ô¥ÄöSÅs±É0–•™¿/—îÕ/Ǽ¯>fî½z¿\ÂȘ5 -¯ëýÎÕ
x£Sþ-öXSOpÛ@Hž´
Ì÷n0˜Ž•0ùbó^;rõ2õA1b¾Ù@´?Øn‚é¶.lÚFžë¥î - Ïuxn¼ -endobj -1402 0 obj << -/Type /Page -/Contents 1403 0 R -/Resources 1401 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1368 0 R -/Annots [ 1405 0 R 1406 0 R 1407 0 R 1408 0 R 1409 0 R 1410 0 R 1411 0 R 1412 0 R 1413 0 R 1414 0 R 1415 0 R 1416 0 R ] ->> endobj -1405 0 obj << +1441 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [307.1508 736.7306 375.8228 748.7902] +/Rect [335.4973 330.8795 404.1693 342.9391] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1406 0 obj << +1442 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [334.8268 705.6794 403.4988 717.7391] +/Rect [363.1733 300.9501 431.8453 313.0098] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1407 0 obj << +1443 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [337.0185 674.6283 405.6905 686.6879] +/Rect [365.365 271.0208 434.037 283.0804] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1408 0 obj << +1444 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [364.6945 643.5771 433.3665 655.6367] +/Rect [393.041 241.0914 461.713 253.1511] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1409 0 obj << +1445 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [374.6372 612.5259 443.3092 624.5856] +/Rect [402.9837 211.1621 471.6557 223.2217] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1410 0 obj << +1446 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [292.0276 581.4748 360.6996 593.5344] +/Rect [320.374 181.2327 389.046 193.2924] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1411 0 obj << +1447 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [319.7036 550.4236 388.3756 562.4832] +/Rect [348.05 151.3034 416.722 163.363] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1412 0 obj << +1448 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [460.1655 519.3724 533.2211 531.4321] +/Rect [488.512 121.374 561.5676 133.4336] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1413 0 obj << +1449 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [362.144 488.3213 430.816 500.3809] +/Rect [390.4905 91.4446 459.1625 103.5043] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1414 0 obj << +1450 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [293.1435 457.2701 354.3435 469.3297] +/Rect [321.49 61.5153 382.69 73.5749] /Subtype /Link /A << /S /GoTo /D (options) >> >> endobj -1415 0 obj << +1432 0 obj << +/D [1430 0 R /XYZ 85.0394 794.5015 null] +>> endobj +1429 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F41 910 0 R /F48 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1453 0 obj << +/Length 3430 +/Filter /FlateDecode +>> +stream +xÚµZÝsã¶÷_áé“ܱP⃠ؾô’ø®NšKês¦ÓIò@K´ÅE*"u>gúÇw€ DY¾\27g€øX`¿ýÄÏøÇÏSÍt.òó,W,Mxz¾XŸ%çÐ÷挻1s?húâöì/¯evž³\}~{Ñ2,1†Ÿß.œi&ØPHf_~÷öõõ›n^]djv{ýÝÛ‹¹H“Ùëë^QíÍÍ«o¿}us1ç&å³/ÿñêûÛ«êÒŽÆ×o¿¢–œŠ#Do®^_Ý\½ýòêâçۯϮn/1¿<‘ÈÈ/g?þœœ/í¯Ï&s“ž?ÂGÂxž‹óõ™J%K•”¾¥>{wö¯@0êµS§ä§RÃR¡4HR0“ˆi!s–qc2Åaù dÁ§„ìG¡×»º¯æë¢ëËí>Çœ§L*¡Îcº«‡QËËhy.€OÇ>Zÿ]Y’Üû•«,Ën±6}Õ6ÔÐÞãÆö˜É3–e`S\ì-9ã*ánpÕì3*LÎt¦Ó£Ô¹}8§ÊMÄr‚åCºÄòb`AÎ5ãû[’pZðÿyÑûA'¶q@wÁðíP˜ÁÊóP‹F=5?Ê’=žŸ’DÔåü¾Ý®‹þ +\Wp¬R2Î#/ 4S`Û“$™}õÔëjA<ü°Y½;ÄïÛºZTe7q + h¬b¹âÊRtž@ië èv›M»í;üJgýcKÍE
'Ü}õ¡¤†uÙ¯ÚeG€[>l‹¦¯.ø¬y †E]•MïFÆ ²V½kki¡M¹EàPã2ð;ËW‡í gÈ2OSayùµmÊKÀ¢mŽ»í7³rIwOØeÎ@€N<¨‹ºnç´ú”E¤<š‹f9E1SªIcˆÔ|ƒgó4E1ei.F·V;ÄE·AÌ~(ë§Î9áN<§ÉÁ +ñŒåRdvöí4‡9ËdúBþ$“—nð¢.vœžL²Ùc»}ßQÕž(Vºbí{‹'ªn(:”z¶!&>TíÎõ|(·ðè¾CX""U¯{*-¬Ü°@CU.+j’h9FD°j +Ž5–c¬UÍž E² +7Z.žhØØž2ðcËb±Ñp֖͜:<ºì‚[ê_–MUº¶;®áÞ‚sO2œ°N$`RBŸQ³»’¾IfK×øDD+[êˆZ+Øb_õ°KXóÙõ=
#ˆÁŠ†%h‘ùeWv=uÂƺâÁõVn“]õ@'õŸ’4éWäÕ¾È'U3RUïõaQï–$½$’4(·ï®ß8rЀK$ð‡Oé ¶_îi™ÀÓX?C·Ý¾#¿(œŠÞ… §ÇCmx#=5–¥‡5ÛpØ IÃtvÌ¡pÉ¢¤h6¥Þ£üJçÄOq§ºãÿmê'j^—ES5÷»š¾ «ØAù€Ž´6RóÙ¿WeCúÉ3.-ÍMèkÓfIúrÎr™úÑ]ƒ×pxˆ-íð–yÿÐAòš§¨hDAŸƒo/\å–,Ó–>‰msìdÃ!:í¹ÖÓ{'EÎWV„ÒÀ1Vˆ1”y–ñÝŠ$xÜ— %Ïò‰}eÂã!“³òc8勤šƒvàà{j+èÓƒ¿ÅÖg´K-JV,—Ž¯ŽTn¦íž„Ç–‹1žhR]~(P“N²r¦Ã—«öqd?"KŽªl]U5óuÛ¾ïþJ"S|/ôÍ™1¤ähp.æÂhë +4ÌâZ +ú|¬êå¢A»“=ªOfoñV¢v™Ó%ÍëÉÒà6Ƨ2Zä~¯ËE/Ñú£èeBÒïK›å3Õ—TCÇÛBȹJ¥ò©a=ŠÔ߀aë®m_AÅí7Wÿ¡Zùq±*š7Õj;.¾ bâ†>öv +³©®¥§àˇ¶¯¼½L…»6¡:í +kt1!foÞ½›#¾.éóqUQö"ÀÍöÅ]]uN=Áÿ:‚q,In6KåÛl÷Æ!¼ú¦ÜÞQ®ÔvÔ¥YT›¢¦O”'–a%ܸ¹Äz‘5îž "Ý8«Í˜ÎÃmÊŸ€ÙíßW- +»Uü”²Bl™©|ßÍKMé–!V“šb5l´±VƱ¶Ä±šÌ³iÏÁáä|ìޔ݈ȪØ*áÍ¡>û8ÒaöãÂ¥Orÿy”"<^*g2ÃÆ\žÇ¬‡ctΟF2m´ø’~Æq4&Q¤üy–A¸˜«çbœ)SrŽ“çz8Nìyt©Kæs(í›Üqbc8NlQpÆeߊ
–H +z&ÃrÚaPÃyö‚žƒÅÊå¾5š§RQ<À9dIò¤âqy¨w‚žšlùи·å¥»;†üË å‚ïvV7!_[µ;RÞÔ¾éHíãì$uÐ)Ýècy#þ"&MMú"Á(”ü¾`tªÁŒƒ]@_2ÜÎOã "3θÀ_í?Ò5µ™·ë¶ë©2iû¼ÛN¯Î>à˜`*ì;¶¹ÛšÇ(a +endobj +1452 0 obj << +/Type /Page +/Contents 1453 0 R +/Resources 1451 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1416 0 R +/Annots [ 1455 0 R 1456 0 R ] +>> endobj +1455 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [288.6803 426.2189 357.3523 438.2786] +/Rect [288.6803 737.8938 357.3523 749.9535] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1416 0 obj << +1456 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [328.5503 395.1678 402.2036 407.2274] +/Rect [328.5503 708.0059 402.2036 720.0656] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj -1404 0 obj << -/D [1402 0 R /XYZ 56.6929 794.5015 null] +1454 0 obj << +/D [1452 0 R /XYZ 56.6929 794.5015 null] >> endobj -470 0 obj << -/D [1402 0 R /XYZ 56.6929 378.2509 null] +474 0 obj << +/D [1452 0 R /XYZ 56.6929 693.8168 null] >> endobj -1051 0 obj << -/D [1402 0 R /XYZ 56.6929 351.7602 null] +1091 0 obj << +/D [1452 0 R /XYZ 56.6929 669.0349 null] >> endobj -1401 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F39 863 0 R >> +1457 0 obj << +/D [1452 0 R /XYZ 56.6929 281.5778 null] +>> endobj +1458 0 obj << +/D [1452 0 R /XYZ 56.6929 269.6226 null] +>> endobj +1451 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F41 910 0 R /F48 925 0 R /F53 1002 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1419 0 obj << -/Length 3262 +1461 0 obj << +/Length 2933 /Filter /FlateDecode >> stream -xÚÅZÝsÛ6÷_¡é“|c±ÄI°O—¦Nšöƹ³Ýéôë’`‹WJTD*Žï¯¿]ì"%ÊrßÜxÆÀXü°_€Åð'F&‰b•ëQ–ë(‰E2š-ÏâÑ=Ô½=ÜfâMº¾½=ûúÊFy”§2ÝÞux™(6FŒnç¿_ÿꟷ—×ç™Äã4:Ÿ$i<þöÝÕwDÉéçõû«7ïÞþtýê<ÓãÛw﯈|}ùæòúòêõåùD(H` ˜Å¯ï¯.©Ñ›wÿ¸<ÿãö‡³ËÛ0åî²D¬p¾Î~û#Íau?œÅ‘ÊM2z€8y.GË3¨(ÑJyJuvsö¯À°S뺉)Q&JŒÌä$Õœ’<JT¡œn–£Í¸œÛU[¶ø•ci«9U5k;+¥!BAVÅ’;×¢ôùPVóY±9fÌ,°)HP‰x|Uo–EU=ž!ÆÔ¯]”ÌÚÿ¶4¯Þ w{U·7ïÞöÇÂïqÇðOàÞ€€&BDy’H·Ú?-¬OÅùxÛØ9•Úš¦Õ”÷+¦ ×h=/Z.»ÅØ[Û´°mÌøç…åýÜþxù•ì§Ù¢XÝs×EÑÐS{.Æ®|ìÍ - -›s3ÞV–: -ú¹Û‚bž|Øíw"œP™4¹Ûš¶;“5Y”+iž=uäÑ>®íçMÝéQgÎéçcQ:þ†˜¨¼kéD¤”–ÑF’*ÊE¬¹ÑÅ -¶`Y Y
3I
SçcaMPZøázX®y Ÿœa²Á@òƒï¯©-W÷ò“ø”–|HI=ÍЂá§SƒIìí1©hÁoÇÕ‡ÚCÂÀ2ÕæÄN#‹¾æ8€—/8KS9ênÄ—m.ÂHAàáñ¢^/±‰¤‚eÀ0Ê2aNªª>h2CøA˜Àïð>9” -DbìÙôãf4²t;ÃRß±~qÎü‚.¾ -QK”H?¶dð#1€¿ÛBrñÈôÁ)Yi†‰BÙºK=ŽÇîFxvx4 -ìð~>Kßã(!xŽÒÌœ2I -g%OŸòs†”™€}û)Àgû‰5Ád>”Jy·Äû‰Ä°ŸHïq`õ²owºHIMñ¯ÔGtøÍ`ѲgøñtV®öõÑ$QòÈÁ C°¤N<¡òƒƒó-yþåýªæì -L_UÕ¬ °MÐõŠ9qRDŽ×ü`ŠõˆÑ¤ûŒbX‚våŠCÑq›ˆ-´¦ÄS·Šw¨ïn£-Ŷ^¥.£QSqʤíhî¤`*&NEBF± ˆ§#WÔÓ'¦Ü€˜9£â.CàêvIÞ~çidâ72Ê´"£ö·Á-Or34è%Ó±$H%qác㦵›²ùÓ%É3Yyýì½ÝYÑØ㊹«ñ¾L‹þO}Mj˜¯9åkjƒÄ¹9;zšiÜõ4ó±'6岬Š
íšD¹ -1ö±Àü·]ÖÊ~šÙuK´œ‹ËwÞ1]ß
Œ&„Aù®¾ #3Èá4dLf*=•Î¼lXò¢a¬Um’,;ˆáUž'§rCXQq×1‹Ù™‚߀üÆ -øúI¢Ob%‡ÅîaÅñtXÁR½ªyÐj\Íj&Bê(ÏÕ×ãO€53ÏGJg^ -)»[¦ÿGÆE€c¤2ÑD„¤2Ý뮃k/07‘‘98õÌ‹P‰~úÚÉ2–äP¾'´Ú)ðæâ©25€i!??€ÜO¼:v÷ø‰WÐ…pZBâ•LÖ»;²+g£ÁQ¥!Ráý¤C¬Q•³²u ê¾=Åõ«p§:Ž46Üe †‡^&Ûé[ __óå Яn.ˆxóþ“02s¤«›Ë×ÑnÏóxì¸
øBËâÑg8¥Ðsðà<î’œ…Xͪí<d(~—R¿ºú˜ -3rìç
3lšzVrâÆ]ݶ‹Î%¯ âÔ¹¿x5ž£k(*ZØÙŸ~ƒî|bÇ$0Œ{˦
yÄþù,‚ü#>h !t¤4è>8i0(@™*òCÀÎ@|ÇñøWç_»ú²²»®~Z®«ŠÁ!¡k$¸óƒ½@üÚ6õv3³þæ8ovÙpWø™ód»\çO
w -%4Ÿòó“5ËËn>ú§'S~=ã‘‚š -j7Í¥¼„«öóoÃY'êÒ˜_øø8Hà¤ïAÓ¡MÍ´»†Ù¸©7l::=;·ì@u²’,$¬ífY¶tbá“,NnÝBPñÿ:[n7¸…
ZÚOžû‹!èy½ßsð|à\½.|œ_g‹Í”“8û@»)½†ÁMܸH¸7ÖîJƒ'œŠ¬„‘ -âWp‰©rs?¢Âuׇöí'݇>ô!_\ïµ!gFØüðƒ€E@0.WoNÞ|hub&Æ +xÚÝ]sÛÆñ]¿‚ÔŒy¹/|\ß[J”ÉÈ)ÅL§Mò +^O‚HAYJˆÄMÍ.ô¦¬üniä~Xj¤H3åâR¡xñNÃÍ’¿o›ífîãи`Òdü„…47ôü¹å³'¿:â,€ŒVÙaØKŒKP¦®ljà¼ÉÓqE<~ô!ÆC³ æ¹k’|¼¤÷ÍOoÞܽåM¾oÊßÒL&âΛšc@ñÆ,è•.Ž;Ï{:b
M§¨È¼°^Óô:=•fÅ6Ê°. ¬ä¹m‹Qob]6¾ö%jaÁzû +£~GGMfƒww÷¢W€¨;_ÂOÛÄÅèª8Þ…ÝÓ*ª8…
úÚkìqÕ<«lWèuò>Àà8„4eC´4W0J³ð(›ÜŒ¯Ip¤ÑS±ÞúŽ62’Ñí©@Ë\êˆú®uô©8?ýߧK¥ÔX“Ï,(ŠU|8Âáð<r¸•Ãà mèñ<b˜¡ÇºØtå|K)¨U‘o0 +*{ΛպiãñüÖÃÊ¢c\PB,€“³§£¾“Ìo(>+/Hld©JF^;N“ˆ…mùXaBxbPPâ€äýâ +ŠAH¹öhzY¬F¬3”X8Ü´Ú§„ƒÎÞ±&åÑïdEŽ€ûžd…=¤)‘™0XC¼ÊŠë%/wCJ¸D°ZíT¾_#Ìbh +ª/èÃ|'ºÉ>°ò2c9¼bß"0¹yF5ÜŸQLló÷ÈqÅɾ”§PBç'$Ò÷=L–ŠD²[hžëhÓä8u¹M/ŠÃFÏè-w‰BŸSL¹uU¶1©ÞÖ¯4 †ô~vM‚ØEø‚í$c27çØšZ‘$’â#V—“Ô¦Éø +ÙçÒ±¯ç‹ †ºd¬ÒÉCÙÑć¢Úz²?„]ÙÆ©ˆ¶Fœ`Ã)Ê$Yn(Zï7{g¿¨yER|©vŽÍÀ§ÊìlWœ–6óì¬@m–Ç^gö#*q’•>~–+?x©Æ“ªüÀÀÀì,2;K@ÙA¨4BЮ§à,èÕh–8€JÈ˃Ù!^}Z^Ûºì¸Î‡gâª!ôÛXà86EÖ›rUlJêŸd¡^¡ÑçØ5¤A +Ï‘$®Š‹RìÌõӘBÌe~(°ƒ"_ŸšgÈqÕ„T(
Y*m÷ip¼Ž¿l†N§Œ
«§f[-ö³’EÙÎÎP_Óêº|ž +~Uÿ£³LÀ¿sþG;-rîÌ+(@µìÜÐÿäÿãvþ'ïý;¨²p® ʼ›®™7A–Å +õíˆ÷µW‘mWÔÑõõᶧ%6dÅ—òC_Cb‰&ÍÎ ,Í…“9¹¡é;úœƒÿ]aƒ!µ\-æúXqÐEÑ`Šîí0©\¤q(ÊrÅÝ ^@£P†Á“b Ž°S»#'BÇÊ£cäÐ4Œ+}UʸW„·ãÊÿÝ'LÈlÿK×+Ÿ´NDî^ÿ +¶«ðSJN¥Á+Æ« ‚°:Ib¿*ÍlúVÚ@Üï)8*¶ÝÐOÑ.|ÛÁ2JÜÞÑ3Ôj¿Ð7„ÒÓ†> +¼Æ$",üéÈh¾™=â„ßqh>h†¾$€'ÉiÓ2åKÙîW(€T’ +§Ï@*•"Qì×®àø[«4pôCʆµ'7ìgœå_ž§¯ðo@Ø—ªt@^yšü‘/¬qÅiþi%djÔ9þ
ôWÀ°TƒêŸæŠ rø¹÷!YíµŠêÅ»/aŒØn—8…‘æã.úpÛ[á—¨#@‚.ëEÉõ÷S“ð…žžô½AÇîa¢‡E®IÔƒiëè>I6Ø£H}w¼‹Ê]Ìám€•Ä$&Á“ËèЩ¼þ¸öâCrVTª¦MI5áIª ?N«æ@柧G_5¥r™ endobj -1418 0 obj << +1460 0 obj << /Type /Page -/Contents 1419 0 R -/Resources 1417 0 R +/Contents 1461 0 R +/Resources 1459 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1368 0 R -/Annots [ 1425 0 R 1426 0 R ] +/Parent 1416 0 R +/Annots [ 1465 0 R 1466 0 R ] >> endobj -1425 0 obj << +1465 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [341.1654 110.9312 414.8187 122.9908] +/Rect [341.1654 414.164 414.8187 426.2236] /Subtype /Link /A << /S /GoTo /D (the_sortlist_statement) >> >> endobj -1426 0 obj << +1466 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [434.6742 110.9312 508.3275 122.9908] +/Rect [434.6742 414.164 508.3275 426.2236] /Subtype /Link /A << /S /GoTo /D (rrset_ordering) >> >> endobj -1420 0 obj << -/D [1418 0 R /XYZ 85.0394 794.5015 null] +1462 0 obj << +/D [1460 0 R /XYZ 85.0394 794.5015 null] >> endobj -1421 0 obj << -/D [1418 0 R /XYZ 85.0394 668.4044 null] +478 0 obj << +/D [1460 0 R /XYZ 85.0394 624.4743 null] >> endobj -1422 0 obj << -/D [1418 0 R /XYZ 85.0394 656.4493 null] +1463 0 obj << +/D [1460 0 R /XYZ 85.0394 592.3687 null] >> endobj -474 0 obj << -/D [1418 0 R /XYZ 85.0394 321.2415 null] +482 0 obj << +/D [1460 0 R /XYZ 85.0394 592.3687 null] >> endobj -1423 0 obj << -/D [1418 0 R /XYZ 85.0394 289.1359 null] +939 0 obj << +/D [1460 0 R /XYZ 85.0394 562.5129 null] >> endobj -478 0 obj << -/D [1418 0 R /XYZ 85.0394 289.1359 null] +486 0 obj << +/D [1460 0 R /XYZ 85.0394 505.855 null] >> endobj -899 0 obj << -/D [1418 0 R /XYZ 85.0394 259.2801 null] +1464 0 obj << +/D [1460 0 R /XYZ 85.0394 483.5438 null] >> endobj -482 0 obj << -/D [1418 0 R /XYZ 85.0394 202.6222 null] +1467 0 obj << +/D [1460 0 R /XYZ 85.0394 397.2275 null] >> endobj -1424 0 obj << -/D [1418 0 R /XYZ 85.0394 180.311 null] +1468 0 obj << +/D [1460 0 R /XYZ 85.0394 385.2723 null] >> endobj -1427 0 obj << -/D [1418 0 R /XYZ 85.0394 93.9947 null] +1469 0 obj << +/D [1460 0 R /XYZ 85.0394 205.1478 null] >> endobj -1428 0 obj << -/D [1418 0 R /XYZ 85.0394 82.0395 null] +1470 0 obj << +/D [1460 0 R /XYZ 85.0394 193.1926 null] >> endobj -1417 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F48 885 0 R /F53 962 0 R /F39 863 0 R /F21 658 0 R >> +1459 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F23 714 0 R /F53 1002 0 R /F21 690 0 R /F39 873 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1431 0 obj << -/Length 3073 +1473 0 obj << +/Length 2887 /Filter /FlateDecode >> stream -xÚÍ]sÛ6òÝ¿BôL„âàÝ“ëØ©ÛÔñÉÊÌݵ} %:æT}"e'ýõ·‹)ʱÈä,ϹËå÷{°qøWŒŒe6•éÈ¥š.Ìhv{ÀGŸàÝ»iÆ
ѸKõãôà‡SåF)K´£éug-ϸ÷b4ÿ–X¦Ø!¬À“8?9KÓӳ÷ -âZÌ Ý 3zT2 -PŲÎ?£Cºånq—EË(G¿cÒZΫ7ð¤y’-ç„."Ùݪ¸ÍVÅâ=®«<\EI¼*÷ù*Îc¦=´>‰<|*N²"™e³ðÙ -SM†u].åC*šOô‰ÀôNu7g÷¸e;o󑊨¶~8l¤°‘ª1Jp żÉ調=i«éŽ•þOà/b¾
SKÙo¾Æ -Á)šõ5¾ÂPóy~(
Æå–»- X΋XïÔE‰fh –qæ -ÀñÅG¨X«AA "R‰xH%謱Æè¡«Íð&h3>#Oê~é~½Ó^C‰´žY§T\zͤˆiÁÙåÛs¨¹¸q˜'E……UÀFR×Â`‘HåVÛ"ÇäŠQÿ¸¸áB|C¸è¯»_º/¼@“L*É<w‰«´ð\ûÀ•ØWÛ]©àßqh¢Â!*„w¨€Ï:³B0G -@—gï°IƱ6½ª¶5[Í?@¥Jô¨WGn¯¸Ï%ÁµúÔ™õ‚"jTJù'¤#B‰ÇÞì?Tÿ¾IA°ŸgPÐÝx¼.#PÇ¢qR)µ]¤IŸfmòx©x0:_ùŠû]"µ,…‚z@œ3#Óðý€!B,LNoÁaV`ót^'SH?. [,¯ËпU[ì’ ëÒGVBxg#é¶CÞÅÝî¶_ñqƒ°‚qg<©ðž§È“þ -ªnRñ•ªc +xÚÍ[YsÛ8~÷¯Ð#]cqµOÇÎxÛ+)»Ù™Z¢mVQ#Rñdýv£A™ÒX’§$o¹Re6€&ôù5Àˆ‡¢g,³A†žš.Loôåˆ÷îaìÑH<'-ÓI—ë»áÑß.”무½á]g.ϸ÷¢7ÿ’Y¦Ø1ÌÀ³ÿ\_ŸHó‹ËŸ€J™}z3<ïÓ€M¬ß]^½§ž@³ë«‹Ëû§ÇNgÃËë+êîŸ_œ÷ϯÎÎþpt>\.¹»-Á®÷÷£_~ã½1ìî‡#ÎTð¦÷
ÎD²÷åHÅŒVªí™
Žþ±œ°3_}NLš&¤Q 0δ›•~ï&R*p«?z"x`þ€äµf<ð'ÉKÕ‘¼†iïzÎf¡äÏ®N1+«Cv9.¦Mù+粨At Äæ¡@Âd£|ZMËQ>¡þiþ%
TwÔ“O©Oʼ)¯³÷E=š—·Å˜XÊÄÒ¿8CMôœfÁ Dàz`†+J¢ +°ôÎ÷šÒž)°?Pˆc^r÷¦lßب,“6øz€:)BÜ÷û¤rë³I>Š:.kŽEÕ +<4¤‰hàvrzÌ·“rDôçâ ,¯ëjTæM”($Ë~z«.笠áW¨ó¿Õ´À$P#'›M}»²4Wz‹²:R8T(z
eÁäZçveY˜'ðŠ@ŠVJ³¢(’ˆ`²‡¼~ +½Ÿ9q´:Ä®¨Ã8ÖÑ!2‘—o™¥‘FnÔ׊^÷R^G*‡R^»Ð—OÙ¾±YyÊ2ôÝi@ŠÛ(¡7× =íµÍˬP¯E®ûIu39гª.›²š&±³òͼ.Æho“+þt}¶E O+Ýoó¯ëB2ã•Û!Pé¡é(Ðï/¯.®A¢ÂËu|$\)g7‰È§(6pÔv,ê(H ¢ a$§æCU7˜6BX1f‰ÆŒ{ +"f
Nk?)Àõ–Ó» +åUW¾À]ú$KèÞÙĺ‘7Š·³îCW¥ÚÆÝJ¹gÆA¢Fñþ¶n‚ø“cÃ‡Ê $žÕ;µÈÖ D/,ËgèLÁHªvaOnˆè”Cï¶$¾‚X¦±òö"ûšO‰ÄÐ6©£Ïye5ußMSÌ1äQû®š ×8~£'-^C,D]©Ò +²ø3§K›$T+‰VÁéwë©{+–ê*òP±õÜY[ ¤°ÛíMCÙê¸'½^Þû +kwd,m9sF‘‰^
No@¨ÎÛ씤1-šÇjþ™u1ÿZŽZYF€I;‚^1ˆt#ÞtÜnog݇ÈZ +#@¡¸ctš¢¤ò)Š¨ö@5¦³b×ÊoŘ/
íö¼Úò¼Zy³2»Œ\jæ!Y'-œŸÅƒß¢r%ŸKàLͦ¢g]Œ”IâÉq|a\Ž H|yCT¿Ÿ^MePù6Äÿ8EkÙæ
ƒ=9=FżɩO.¹DcÛW,tLši–ª!¢ø£¬›õùž©ðd +Oï-v$:{ƒÖ#í
¨~ŸžÍ·Y,”È.ÏÉ¡¿SÓRG´ZššžqQ'ÏeGbq¾Ýû¤¬k‡:“69gÂ_˜’Þð[,XfMØ‘ü”sŒ[›âȧaIJ*°öNµo
˜úÐzñ¹j½ÄÝj8òE
# ²^¤ÞªõŠ·a½²c½A·Ö«µLºÁNº÷RÝòzŸÊ{h¬•÷Б&<)\¥ižùéeÄz¡Ó`¾Åi:Ö¸Ÿ…¿j5®¸`N‡ Žœ#K‰xÑXÚ(—è06(Ðë§[ÇȑϢ⅟N÷H´5 +ÒdÔHÅ+><ñ j¯ó¸™¹»÷7|}#!by¶k¼‚)Ï©†¼Áó0Ïì&zCõµÇÒ;(™f3ð±Ô‚í±(¦Ô ©á¥$‚ž€øÄ4ç©oõu£bvz°[ŽJ;{~ÃG× b¤ß‘q$T9ÚqºKèßDÕÈìr +QñK:±–NfísVÌëjZS#‰zåm¼Ë†N‚°®-ôì@XçèßÛâ6OGÞ/‰tÛµ»RxËn¤8ã°‘ÊÒ†‚·ýþàòd uÙY5ÅÜsºèb[íe¼»Ì›E›±kœ79Þ'ðÕ’‡_ÈM7;c·²îVÞðE‚ÀoªŒÜqú%¥`VŠ\ýc(Ȇè"ì¯Z4ÅIó@AlqÿŽë—D˜ l[ÎÙx|TI()DCøŒh(råT"SQ¦W|mö”qú€e„ J!žD%̃èLwêû8´v×ä[·|ò;ïžnšÖ Ø>ÎØ•ù¡ª^Ã4ŒgMv8£€ÂÃyMŠˆÎh|gt’/q:Òkžˆ]'"M@)”ª(¼’›óX.•X¿;R‚À%Ž¤`]͈ի#¥D¼:Šé²yâeÑ3&î-þO7G]m¼á›#1Ü›ÑÐ'<…“Áõ)Öw4Ö¿kOɳn":9øŽž9±PM´2°<BijP·zfädúÆQîsußÙé†?ð—ikwÀ!-ãÜüôÉþ‰õƒÕ«HY endobj -1430 0 obj << +1472 0 obj << /Type /Page -/Contents 1431 0 R -/Resources 1429 0 R +/Contents 1473 0 R +/Resources 1471 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1368 0 R ->> endobj -1432 0 obj << -/D [1430 0 R /XYZ 56.6929 794.5015 null] +/Parent 1416 0 R >> endobj -1433 0 obj << -/D [1430 0 R /XYZ 56.6929 579.9063 null] ->> endobj -1434 0 obj << -/D [1430 0 R /XYZ 56.6929 567.9511 null] +1474 0 obj << +/D [1472 0 R /XYZ 56.6929 794.5015 null] >> endobj -1429 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F47 879 0 R >> +1471 0 obj << +/Font << /F37 779 0 R /F23 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1437 0 obj << -/Length 3183 -/Filter /FlateDecode ->> -stream -xÚÍZ[wÛ6~÷¯Ð[és,”¸äöÉuìÆÝÔÉÊê6g›>Pmq#‰ª@Ùq~ýÎ` -»6Liƒ¢S&ÄZòBv$Ï•d©”ºg`œDÂ;ýÍÛ!ÈJqýjËñi_¥YTÍñ™F/nno//ˆ×Ôô´e±Zžò4*§O¡÷¸*ò¦ôý&yCÔ``‰x¬š QùuÐ3ŠeZãÊ9Â-¤~œ—Kè&x4Ïg8š´àäô(Êe“O´½8ôjÊåC>%þ¸ö£Ô
å‡Ê6Ûãá:âÍ|¬ç0 Ô ¬sLÄzoØzt{Cj0 gó´(-’&ÊI*Ä_PÖsÿÁ]½CÓÓ-ª¿¹r†j~6›)·A0d¥„×
2q"“Q½¬î«9©¨As/¦y>=ÑóÆ©Ó³C4̨²0äqô¢´Å²¹aÀ‰ÜÜèqWD€k¶íV -üÊ$‰èu¬ñË\ª”I½¾,;誟¾Øë3Iª˜äÊqš$ËXªåäôf8À -»Áàöú'8† ÞEõ`w°óõqMÙê~ž7«p"kœ79ˆ—DZîÊ_ÈN¾{5¤b©È¼³›ç:DË4ÑåÐ -_ìº6 3<Ç„+&¸êƒSi¢!zI -&X¯š²ßL(îM ©£¢¤HLjÛX" ‹!…˜Ÿ¹^ùC:••ÿ Ø~UŒ+RlPJ"ª—DyäƒMÅÑÂi½|ï_mÊ~<síz©IÛó-þK'ÛAì -ýËùumCÅ --t”Ž‡ÚýÉÃoÿ¼õ…Îq¯šTì×TGÏ¥¨`&Ÿ?døb¿¢RÎb“¤G4~Ã’Dº"I¡kxš ÈÝ’‡?k÷nÖ|ØÞ»ëû²=]{׆ñ$9VkRF0§"ˆ1û†±k¡ƒ±#ù8©Š ’‰·{dz»G²µ{ììþì@~¼ÂáÜ!à…Û_†oN¹È¢3j{œ„=è2r¤íj±¨—MPîËÊ6õ -Ä.{UØ‘Í·²¤dB'Çb–‚5˜ÌdN˜o…Fì¡!S.;E®¶RIå
x¾eØ©u ‚Æ6"4q¶…ÿv6}vwû\JY×yŽñ›Âñßû*,„'“”G,„ŒÍ‚ó'…g',™Á4ˆÄd{ôªâ25,U¾à5t -7Uî‚ pú–L›"Pc\>”ÓzAyZJDÆåw–H_6ÿ/|öšá9í« -Z¤Ñ5f+xɆYˆ6‰w#;Yß’¹Û¸nÊïCÊïòeU¯üHöÉî,5åÌ XÜå¶5±OA¬fÞÞûJÚ"0Kwc·Š¶¦'Xá^ëjî¹ì[Á²ÕXòÏÄ )gZÆBÀ.µÒk\!! -ùÛ_$ýÖ¦¬y×”sÏš-¦UQ5®’”FËÜß° ‡â}'´*WÅF`¢‚ï—±å¯ãÜàás?ë`Àˆ¸ªýÈ処-ýœ³|þ´ËiÝè‚Ýõ’¦Ëéy>u‘^ââˆjÈJêç¢-p'¹ÇB‡4Z¡ŒgÛü÷ÿigf¼4<£bq¥¢bBÉLªéNy°kòŽózì°¸âÊidÇÍ0 -”Ÿƒ.YˆXä¨ðøHËÛiˆð {Râ~2ŽŒÜk -²Á¦*}Oç‘ðéÌÎ P.0™¨ØÕý}i=2!ï'ª´¾šõ'õjêÏÈ¿&€#Â!#"ŸÐÒÙ%ü!„÷¥O~Òc÷ˆ”„á±·|ŒJ`×þÛœíç÷;c9¬ÈüªPÞ
ìs<ÛT&˼%ñÉG$ÓñŠ.~€Ø‰Öšyœ×Æ/¦ó2ëX -‘•—‡|ºú¤Ö±ÃiòÍøÌ;e’$ö…ewá4ÆÆ™B,›`zâìçŽê„â2Š|¹¬(‹ô¨6¡‚%¾«g#ô[? -oGAîòÉOÓ,ý¯^’ ´¤SëLè‡w–í²¶Ð-ºî;J2>4þ¹êÔdV" '„ò¿›²Ho*Çÿt*`ûýÕ¶ïg€²•r¶1kÜ;z¯ð¹?ù\ÿìU&Ó}E–$ûE¡HM¶½rx;fÇÒÿEkøendstream +1477 0 obj << +/Length 3214 +/Filter /FlateDecode +>> +stream +xÚÕZÝsÛ6÷_¡·Ê3ŽøàîžÒÄi}Óº=ǽË\ÛJ¢%6© +¤÷¯¿]ì‚¢dªn¯Í\n2`±ØÏ ËIÿä$‹E¤™¤Öˆ8’ñd±¹ˆ&+ûâBòœY˜4Îúüîâ/ot:±Â&*™ÜÝxe"Ê29¹[~?}õåËoï®n/g*Ž¦‰¸œÅI4ýüúæ5Q,}^}sóæú‹ïn_^¦fzwýÍ
‘o¯Þ\Ý^ݼººœImb4³ø÷77W4éÍõWW—?Þýýâê®yx,i”÷ç‹ïŒ&K8Ýß/"¡mOöЉ„´VM6&Ö"6ZJuñöâ=ÃÁ¨_:¦&I!U¬'³8FÊó»ÒìÊM¥…E97…C§ÂÄ)jÞÙè y¥š—F‹Lëx’ÆV$ÆPõïTºÊâtz[lw—2›®¨Û¼-›úr¦3=mîéûNàTlÕE»ovï©“/—¼ÌôžFvzõa[ìÊ
ò©ª}’a㥕ØP~ï×…[ìÊy±$•5ôÍ+jH™iqj5fK“DM†§ýcÔ&œq2;î9OÀ5i”žx·*"+t +†™©TDé±=ñ$%"S6»ËD$RŸ±{pó".ɢ̫þn]Žï›ªjöe½B=C¬ÚÁÊâÂf¶Ã%‹*GÓ¼£”Jƒ 4ý9³W4o,Š!uÑøïÒ1'*uÝŽºu[=é!¯Ê'iÃ^ß¼ýë©ô!‘€Å2MÿWÿÛ½4¬8çI*Eœ¨çâ<Ic!¥{
Ù2Ñqr°üuÝ;åó6ÜçÉ~ˆ0‹,‰Ë°â¼:`FbÓç´‘hàþM’ž…ìõj7”ðt’ªiŸ$~õkK’M)#6m³h*¢,È7óÖg-˜›·4ðõõ¼‡<›r9“6Üh*$óÜrx—zÚ9Ï_*БÊÖQc]º¶Ù•‹¼¢þ¶ÛmWàT4w-‘‰á#,¬Ÿù8ú'J1ïʪ…sÅî¡Ø…°ƒå® +Hø¥©÷‚Ú…X‰”Œê>³‚Æ)/ +F%ÍÛ¯K͆r’Mí ªä£>)&€¢ƒx)Å£)˜Zòy5zNòŒyîö5]ñ¿—,‡’y?)R;˜uQœ m?6ŽqçiY¸âˆ^¼TX†ñÒlŠœ,¡Ó˜\8e‡@h((_Q-©ãà Fsž]nxzUnÊ–ˆ>ÃwÝìy¬¡]¨° íŽýEÎsçÌæ}±e.e}´Ó"_¬ð/ +5±$"Ôð¸s,ÂÑyؘ´lxϦ\³ätÛ`j +²£GŽŽ¸XãEÃÛ/øå] ‘Ý,› +cعrU{á€ê%±æÀ#_Bžƒ0€4ès•åì€K6¢Ös%—ßô$P説«ú‹9ÄÊ¿Öåi P¶s |‚L¢ÔŽZÞ%°1/èË`2#³áÞ”¿aÁõç¡‹
‹>¿¸M¿
5c¯Ë9!Ü'|81J¶ÜÛ²à™>"á.3£I Øy`R/¨¸nµ*#Š~jŽg 9ž¼nºŠÏœ‡ à¨PdÔ”¯³T»!–xd.dÇáȔᱳn\ëaW2½æµ9} Û׫ÑÜF«,K…únÁa·x5ÁÚf²°™eO„Æ“E¤Óe· pg;‘¬–qÞ€
3´À^Y÷©|ñH¤e·ãêM¦ñ>âûâ®!
·pírá±hž/Þó4FueÈÜhìpoyÈ«îÉKÇq§ÍOòóð•$‰8¤°E·»PpTTˆä +A á“¥ +ê—LÏéØ5¼ +¥ÿŒAqà‚GAÚcW2V(Î*5þKL?(>UÉËw½BÎëc°Ó'¬¥ø‹|ÎaT"¤Ž(©{„ÿ *Âd•ZÔ‘Ê„ ’:¯™ÁžŸ°fd$â,³ÏyŠ4B¦qL¿±%À& ƒøWtà¹ÛO[øG%„}Æ7"%”Šè†}€ñ†ž‚‚RTzV)ƒý>]¥d‰HÒ,yÆ-, +~y=
}Væ’~Çï“¡ÊÍ°(˜Èø¿ˆËL*Çþn.š<k¦ßúWz‡¿T4©ÐY¦ÆàìÕ±@^h¥ÔžZ%†"gªŸ5ý?”
pendstream endobj -1436 0 obj << +1476 0 obj << /Type /Page -/Contents 1437 0 R -/Resources 1435 0 R +/Contents 1477 0 R +/Resources 1475 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1441 0 R +/Parent 1484 0 R >> endobj -1438 0 obj << -/D [1436 0 R /XYZ 85.0394 794.5015 null] +1478 0 obj << +/D [1476 0 R /XYZ 85.0394 794.5015 null] >> endobj -1439 0 obj << -/D [1436 0 R /XYZ 85.0394 385.037 null] +1479 0 obj << +/D [1476 0 R /XYZ 85.0394 695.8713 null] >> endobj -1440 0 obj << -/D [1436 0 R /XYZ 85.0394 373.0818 null] +1480 0 obj << +/D [1476 0 R /XYZ 85.0394 683.9162 null] >> endobj -1435 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F47 879 0 R /F39 863 0 R >> +490 0 obj << +/D [1476 0 R /XYZ 85.0394 381.0098 null] +>> endobj +1481 0 obj << +/D [1476 0 R /XYZ 85.0394 356.3075 null] +>> endobj +1482 0 obj << +/D [1476 0 R /XYZ 85.0394 170.7633 null] +>> endobj +1483 0 obj << +/D [1476 0 R /XYZ 85.0394 158.8081 null] +>> endobj +1475 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F39 873 0 R /F41 910 0 R /F21 690 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1444 0 obj << -/Length 3130 +1487 0 obj << +/Length 2891 /Filter /FlateDecode >> stream -xÚÍ]sÛ8î=¿ÂÊL£?ôÁ{˦ɮwºéžë½éÜvd›¶u•%Ÿ%'õ¿?€ -•ÉâÑ3|D¡0FŽ6W:Va¬•ò=åÕ»«töFÝÔA1‰(”*‘r’bHN± %U''JKEÁôZØOí>/‰Uûi»³MSÔ}×KÁ¤AæaÕÛ"ÝH-´[‘n¤‘A¾»Y`éƒà-5Z»À!ÌŠ*ß^Ö»
A4*‚vÍëlóùGÛòŽ.h»Ñ×ïŸ6ªÛz^—¯®oT¤‚¼âOèÚ7Àuyø,‘Žà9"4q,§ëbµvSØj^/:|0ýi<¯mE}M[ÓºŒSpNM•o,MiìîÉæ–)ªKÕUIŒ+šBü#ŸòͶ´
}±žŠÅù¦“‡;š úª_òF¦”£Ð$P}(-ƒÅ¦(Av]ç-B‰›`n‚í&oZËø¢H:ºðã9gÀ±õá|ÉiaO¶A³®Ÿý¦LÒ¼†#ªZ^
µ[P@N'šP4Cˆç”· RÆÁ¦n€ [“ÓÓhpÿŠ@g‚ÎGŠjUZê*‹Êºu—íºÞ¯Ö4€´Õ>oɪ`¢6ö6‚c«Áôf%o»ÇÕy€Ñ*@cIÏR%3ÇÒ”TAÁÉå»–@g&ж~wFH«â‰´¥7 -l’þ
ÌœLBÆ<’Ó:~EÌ쪨xÉç¢]÷Ð`°Ì«(8œ–Mcxç‚—È›f¿
PQTôJ3K--@C¶*
¡šö]Y‡ÌÖþTÔûÆ{¹€ZýYášÝY¹åZËN²¨æåž,
¾–Ît ì|‘ÏŠ²hÎמÜC]–õ³;l´mRr -NA¢½½ÿ?(9ÐÁ£š}K É,”š¤þRBRFaf`F‰0S‚Ôö¥Hnßw¹,ÞNß±<DÊ̘/iŒ0a–&±“Ç©F`´zÞ*5(#`Û„@’¼,ÜÓ|çr‰t¨”ξ¤'¸7ÉÏËN° H þŒz«¿2ÐF†*5ÉtC›:º
NL‚¼¾f -z83ñŽòG.av!µöE,i²0'>‚È Œ”ø:û2ʾÌ×D’ßÀÉy–œïˆÒ8»äúÁè"x- Œ®¿÷ïÃ7wïÂ_ÆSŽ'¥Ié=‡1ØXwàŸÖ/=` -Ž3yööþ«Ð|ã[à( …BFÉ¥K -vŠT ‘d‰dôW—¼ûÜE±D*–Ö'U»t»ZWIéîŠ% -13að|u˜zŒÅ_Jy]4óý@á¯Jç[í¼Þ-¾¢ˆrërp2XØf¾+fî†Ã¬gД9z]짚Ïé*
4VTtÑ¥ã9ãåÝÜÂråÕ@&G©wÎ)µÆÑ!XÀýÙt«\¶|õ¹Ä”pç \¢-æ{WZpß…u© -á:§†ÐõàQ:wNÞ™RPâu峦.÷¥¯Í+ÊÈÎ)SêJ=z'(iÎýšÄúnɈ^ˆøhõ›:ÆÖÛèî÷n©ž“ÀAÊÝ»ýݱ›×“llR²±ÅúhŒ±öÞ;îê:K‰¹Ê€Àîdç]oM·¹SDg{±?l„f~[²FòåLÓ¸¥ØE÷‹£Œ#úÀk³oÚÂxÎ$ŒÄ¹Ø&'9€NdaCŒzªÒMSÏ‹¼«*½xbŸ;>ìûþ–#0.†ÜÂ?¼ tìóxûËýé•@z†ÁëÞEˆè6æ…}q?d½rKB¦šM@:7´¼.ò%u:¥ñU¤Œ«žY0«©Tžúu<aIö’EÜê -¾@æ͹üt «OJÊPÞ‘O÷Åg™RÙvÀñ°§0\Œ‡¶XUõQu4èü¸‚k;wN<ò§ÌxGd¢EN4ºÈëÿ“ŸÞÏeÞö®IGEųünŽ3 5зÅÂloŸëœÎêeî”ÂK¿SðêRjè÷[Ñ苯å¯ýµØñs:
U–ÉáW[÷ºc¢ìÅ[˜V¦Hÿ/§'» endstream +xÚÍ]sÛFîÝ¿BòLµ·ß$ïÍMœÖÆé9îLæÚ>ÐmqJ‘:‘ŠãþúX’’iǹ6sg²Ë],€ÅX +•ez¶9±Îg‰#ÕÉû“õG³a锘´Q"qf¶0V¤@~ô8I…M¡ºLx£M/TèNÕ*èd.õz]œ.`Éüílíüꪥuþ‘§òš§^“Ðð¿3šj‹eW65}ܯËåš@—MÝ–mǨš[FD“Ê/nÊŽ†êýæ¦ØQÿ¶©ªæ¾XÔÍÃh‘™¯šM^2#u¾)`¡”ÈœÓÃnð8óÕjwªÒyѶ|¾WÜÙ·„š¶ËëU€W4rñÓ8n›Ý&ï¨ß5ÔÂF»ÀץѴ?ì—uWìê¢{„rà?™ÑÉÿ7ÍGîŸòͶâvÝÜ37mù©ßÚ7Ô»/»5³wßí;2^äK†ÁS °kâ‰IDAc}Ìi8}_nÊ*ßUL™oÊ»5j‹âŸÇÆæì
¨¾•M”K_bMƃR{íé[ù©Í“Ð: ¸¸W¢ZÄ=-¼÷"ñÒ÷ÖgÕÈú”tBÊÌÂÞ†MHa?|?¾z/Þ^\‹ó×?ƒÏÒYâæà”¼”hdÞ)=WRàŸµÇò´>i–€@G´ÿÜvPpÚÛ¯" ÞL:;- 0 +({—
’Ï«ïÇ’PóAP8ª–O‹dDí/Éà±ÿJ«’L¤6ËÐã™^ÏÜ +ÀÁlíó·‚—pä¢*Ûç½Oï`F.ü$žÊ±$Z(”ä„æüc©>õšÁ¿yÊ{±Ï]•·ÈÅmAÌÔì„–Uή°«þ€=L;‘ªÏ× ¥dÒ" + êõºl—û¶
÷Û˜$^•Á·Ëf·j'xÿÚœYeÒ3¼½ž¯Šv¹+oÂ
ç
9yؘɯ‹ãm±ûXìxMÛ5´%š+kº…èÒ…ùœáò~mYðP¸vaŒÏ§Ù‡Î² Y]öUøP,àñjºÕ.[ŠÇøêÃC7*œ4Û|וË=\
ü]H»A|Ðl!,½iöx^FF,wåÇ‚'ûëúxQïWé$‡%3±o÷yw’WcÜü†PÃâ†;yuŸ?À~'⢂Чi; ÀÍØ,á ÆÛm¡Åм2`¡aŒp [—õï4„§tDxuEŸÈ'~ç±å…Û 0²ÍË
+|ò.ÇÃÑiïufI$؉.Q5gL•‰ÒñWÅÇ<ØŠµHh¿A©Y!ߊ{õão1p¦ ‡=p%žf^á· Û¡™Ã£†6A».ª-£yh»bÓ2DK›²æå÷ë"®ƒM¨àGûÑ[75¶„(tàHùi0ï
-¨R8è…ã5ꈦ¢‰UQžîè+œ´N…Ù‡3¬9 +‡H½vGT,Ë_¥Ô‘B8L¤ÁÙc È%5Û]ÙìÊŽ‰‡ó¢Ù 1õ +cŽÃõIÜÁØ—õã}¶4ßE@f(ìðI8}øÃPØ=uGâAØ–`óŽ{Û+ÔéDE5SÁ$ +ðí¨î÷ÕÈIà$7L?+À±yMé+›ÖllÎÆèlôÞÐcÀn°gÙžîr|bm¨6wlÏÅÃÆÞM$KÖH¾œyºè(v1Ù(v1™ó +¼6û¶›ˆp ¼lÆ3× +€LNr +ùhü.väÓwX½ ˆL ;¡µì) *EåÁ¶¼«›Au,èüE
×vœ¸”ÑkdÑerÉÒyŒ×grp½Øߎ®ÉÀEÍ«"µ°ÿlBk`lÛ`ée 3±Ï›‡X +‰êI‰ÿE”$BYk?#¢TŠÄ¨^BGXž‘~ZDDÜý•"zyañkÜhq©„}aaQ[,W&îùÂbxË‚´ŽòoŠ´e‡Z«-Àxˆ íóDú¤ü¸¤è”PÒÛª™ÁDØQÆ°•ãŸc¬`‰áÔŸAª¤©NcÄŒñjUp5o°Ïœ1lý†ó¿0©Wú0<)¹ÜX%ç&6M|Èj÷ËeòéPäêäbó
Fec±
þsJjZ(ú!Çá¡ãÈ.¼-ñY=Qiõ +}••VßWZ
WZß]G)`»¾þñ5U~*óó®Ü‹®YT”ÒÁÉ(‰qç2‘±Q胊Ðásx´óáÑîŽ$î9¸ÜržRpP Á¾.»vLÙã³($êô,£ûž¤Çz“ïJz<K¨ÔôT|:ªßV\QEYJKLLƒ¡·Ì—”`½±Å;À¦,&©R'¡Óº¹§NÕ„ð†r*Z^&uSŒâØm3d@fDˆuèu³¯z˜É¢TÙ.ùÝ5dFÉáý“ž‚{•8z¢Äc{h´=ÔÅž,ÿïwñ= ¾TR]žf^þhê"&œRWÅ£8"‡¦d6SZ +ï¬zÑ;PfD"ó…ï@“«F!¾7¦eòWP\qtÅ=--Rˆ¦]9Ø÷®RZèÔQ¸úþܘÜH<4;¯òP!‚ldh†ål£9Zª¹Ò]ÄPw9—fé«@Ð_A@ñqÊU*qµuÍ;2£{b
w®/ö@w(ÔaF×æzc‚nÝ,ÀÅ®Ãø>þòÃëwoÏ..c!Štø6¡ó·Äí†ôì¡Ù?ÿ+†Mþ©ÜìýÜð¾Æ7à .9×Pþ0Ô€5îÚ¡œbÖô¼qã$pæ*Kf#møsúeµZcÈ$ÂJi§~î"gŸ
_úãšáFÀIS=Ð}âB©§ž’Ä‚ÚøjÄúOýðXendstream endobj -1443 0 obj << +1486 0 obj << /Type /Page -/Contents 1444 0 R -/Resources 1442 0 R +/Contents 1487 0 R +/Resources 1485 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1441 0 R +/Parent 1484 0 R >> endobj -1445 0 obj << -/D [1443 0 R /XYZ 56.6929 794.5015 null] +1488 0 obj << +/D [1486 0 R /XYZ 56.6929 794.5015 null] >> endobj -486 0 obj << -/D [1443 0 R /XYZ 56.6929 769.5949 null] +1489 0 obj << +/D [1486 0 R /XYZ 56.6929 691.0694 null] >> endobj -1446 0 obj << -/D [1443 0 R /XYZ 56.6929 750.0533 null] +1490 0 obj << +/D [1486 0 R /XYZ 56.6929 679.1143 null] >> endobj -1447 0 obj << -/D [1443 0 R /XYZ 56.6929 564.5091 null] +494 0 obj << +/D [1486 0 R /XYZ 56.6929 591.4009 null] >> endobj -1448 0 obj << -/D [1443 0 R /XYZ 56.6929 552.554 null] +1491 0 obj << +/D [1486 0 R /XYZ 56.6929 567.0613 null] >> endobj -1449 0 obj << -/D [1443 0 R /XYZ 56.6929 384.3846 null] +1492 0 obj << +/D [1486 0 R /XYZ 56.6929 349.274 null] >> endobj -1450 0 obj << -/D [1443 0 R /XYZ 56.6929 372.4294 null] +1493 0 obj << +/D [1486 0 R /XYZ 56.6929 337.3188 null] >> endobj -490 0 obj << -/D [1443 0 R /XYZ 56.6929 286.7057 null] +498 0 obj << +/D [1486 0 R /XYZ 56.6929 201.7848 null] >> endobj -1451 0 obj << -/D [1443 0 R /XYZ 56.6929 262.3661 null] +1494 0 obj << +/D [1486 0 R /XYZ 56.6929 174.4803 null] >> endobj -1442 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F39 863 0 R /F47 879 0 R >> +1495 0 obj << +/D [1486 0 R /XYZ 56.6929 133.0078 null] +>> endobj +1496 0 obj << +/D [1486 0 R /XYZ 56.6929 121.0526 null] +>> endobj +1485 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F41 910 0 R /F21 690 0 R /F39 873 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1454 0 obj << -/Length 2777 +1499 0 obj << +/Length 2598 /Filter /FlateDecode >> stream -xÚÍZÝoÛ8Ï_á‡}P€—ߢöÛ¦½,¶IÏÍÅuû ØJ,œ-y-¹iﯿ)ÉŽ¤×[ˆ¨!9äóEYL8ü‰‰3Œ«\O²\3Ã…™ÌV'|r}¯ND“ÆAéxÔoW'¿¼TÙ$g¹•vru3âåwNL®æï“çÿxöæêlzšJÃËNScyòÛùÅ¢äôx~yñòüÕ¿¦ÏN3\_^yzöòlzvñüì4J T`ñïË‹3ôòü³ÓW¿Ÿœ]õ[‹%¸ÂýþuòþŸÌAºßO8S¹3“;xáL乜¬N´QÌh¥"eyòöäŸ=ÃQ¯ŸzHMF9fœÌèIªCz29³ -ºPO/›
‰S~*Vëeùë¾HyƸ4r’iÍ´…
>E&™3“‰lW¦ÿoVÜŸ¤B°Ü˜v@ó8ð -Í8c—UeJ3%™zÀU>Ò Ó\¨I¦,œ&·^aAOlÖ¬ -5Lˆ*`Ö¨ %àœ'oË®«ê[âvuõG{`â@Ð̵ yµð‹Û¤«VeÚ5)ŠMÒQ: -„锞r.Ëåœ^ª–Fôªdz]u¡«îÊ[Ò¸MüÁ•kz´eM˜ô£ˆÁ¶®ºv¼²MÚrÖÔóÖ óhI›¬7ÕªØTËÏA[ø. -šu“‚›]¤ó¼eM4ôóï^\¾~v~^¨ÁX×MÝ–í!ÜßÐnW„µÏÍ–²ýÞVŧjµ
£Ñ×EÙÄè0¨‹ÕŃjy¢è¹i#Â
WÜôýŒei- fˆ¯ÂYq¨‰R©Xþ`åeœq·Æ2ÉG`#d…™×íOÞYhÈJHÍ -b1Ñ”ÌÀ/ÑÎH«ØYtôìh4D–fMt?žùÁyêF}=å30‚RoaÑ6¬zÅÁw–7ÅvÙí¹¾å -¼,°Â>†íð*ŠÜYÔ•O@ ÎTrö„Éš¡NiB4„Æ¢ðF‚¤>|oéI.MšP{p‹ðRÕ{#§SŸ‚ZTq嘛±¯;îá( ƒÑÕñÁÕñ±«ãA–à6blê!Œ´û@ðô"è{U‘C -žH¾°Òê§íÃErdЂŠÑgxœ*ä<r‰*Ç\I=$ÎËS‘+÷ƒ²M$Ñ|1Ê6µwEÍöv±7XÐYã¬ë°Tùi½¬f•OŒÞ{_JhÀ ÷'ØÊŸŸÔ{aK,?T"Aê\+Ž#eBs¯JСJ8¯ºž¯‹õzˆtÇço>êÇK‡iø¨âg!U¹|H³·]ÕÔÔ‹Ž»[xÿ#*Ò1Ø릨ÛeÆAÏÔqÖù¢óy`ÚR‡?DèÀEƒÏÏ)Nûá»aks¢böÔU k‰œlÔK©³ãGQÕ©_?Ó +6ëâ€^ŒS0±n¹
€•JålòæjJC‹åE&yr©ò&Ñd"›'ìmÁwï¬ÓGDèXór—Ó²„t‹»Ui¥¯•ãžwâa[ÝÖÉŠcœ“CÁ«£SÈÓbÅœF,Ë?VùcAʦº]€×£Îb† TzÆY¯×M[u%‘‡…|gäFC©V|& -¢Ÿ#T”õP´@ÿ¶ÝK_®àìMÕ¥‡Ä®¬™Ob`§[Ä¥âØ2>Dv9E~"{oà)÷á)¾°C€‹d«sÏ TrÐb^Þ¯xÞ9Ù#"úÞÁË€ú~¡")XotØþt¥)û¤ßENP;÷u&PÃîbMï¼øM{ë³’ºw!M#ïâ½ -PŠ® ⨔qý½A”ãÍP1ê¢}îgþ£cñø$`*ŽˆBWâO]AT•¬ÀùWëe˜@Â@cωè/‹ò;høÅ „ÄõE¹êu?žP{ˆ#Q„–²áû×8øyBdÌÞ®Ë>„[)oó¿-©%–Ôx3÷÷ÕÔßì¦zHB¥°LææØ´˜„J¬©)ñ§Ëéù+¼•6Bñd×z7~0'/öu9Ù÷Ð ×Li.Ó ÏX.#ÇpšºÔz±àæ¼)`ã¦iþ8Ö+g´ê·RΔ°:NŸž&¬ôšá÷´T f¤}ÚÇw!YŽˆ:f2N1gø¥Æ{JíË`9ËqŒÙô(EÌ¡W@¯ -FE憛Ðuƒ]”ÿód½iN…I>Vá‘„¥(MïF©íQæ>uÃr•ËÝ ÑÔ¾þjK™QY@nèó†žuÓ…F9ƒŒR¦öTÅéP”HS?½ "î;gäTÔÞ¶Åm‰â`ŒÓtç<¬F -€Æ°±c×óPScÀËå|𬠚]¤úºZ4ÒI˜ÑÒsSb5ññj‹=žýÜeÕÒ§h7AøÛª¾çótž1« +xÚÍ]oÛ8ò=¿Â÷ 5ËI‡²©Óó¢Mz®÷ +l·Š-Çdɵä¤Ù_¿3R–%í^{¸Cj2g†óI‹‡b”DŒ+Ž´ YÄE4ZnÏøèÖ^Ÿ G3ñD“.ÕÏ‹³——J3±ŒG‹u‡WÂx’ˆÑbõ1¸øçù»Åt>žÈˆ1O¢˜?Ï®^ÆÐçâúêröú×ùùX‡Ábv}Eèùôr:Ÿ^]LÇ¡ÂHåXüv}5%¢ËÙ›éøÓ◳颹«–à +åý|öñ@»_Î8S&‰F÷ðgÂ9Úž…‘bQ¨”ÇgïÏþÕ2ì¬ÚCf +¥b±ŒÔhq +ñô©t‡S;
ÊÙ?t"DÈL¤ÑòaȸáGËKÕ±¼‚)¥¢‘Ž‹¬¡éÿ¶X¼ƒT‰ +›l<Q2q8%u°Ê÷c‘Ù²ÉïÜbÚз!j4ÕŽ0ÕÚ!<Ÿ?ªÒA¿s.Gÿ;øM¶®ˆó ³÷×ç°.{‡ÖîT¼¼Q¦‘Õi5XeëôP4tÏVr¿²»lÿà<ÅyØ}ÞlªƒÛ‘Ò§ÞeËÅ\ž0ª³†zNÄ&ãXŽºÿ¾[TF11šx‚é(.¿æ*bZ +cÍꆀ;Z«`š.7 +Ë-íš½#lºZ9¦5-ØK„<Ô%}Àæµ#_nrmEØ›Ân38‹Ptá£VKež¾Š¼œØó¡s`é~—ØŠ·0‘t·²ª¶inõÑAŠéJ%qðn1'ÀUEªa«Ú
HÁRn+l¢Í±+mq"‚]îÓ–DXئ«¬Ï©ÈÒº™4Õd[ÕMy/s¯ ÖùmI¥,-±È%$hfOǤ +.O‡¥+¢(²µ¥UöZ³Ïo7õ&!×Ðൠ–¾ÊeFd½ÛUuÞd„>d=/G‚ûô0èøíxEæX·fÀõC}H‹âÁíÞçÍÄjÎû*7YÉl’Ð/§ÊŽ.ƒž„ˆ4Tú m³½sOyêžÒù.H‘L2åT[¯`ÁÕ<ÓžþàXì Q<¢G?ºxé¼¾=¨§y¬‚3ô¥ìt;(ª”ôW%žS¤ƒz㤬“°)!¬óâß>´Xf´Üwi¢¼ßTµ[^¥MJÈcÍ4É }¡ì +cí%>>O¯¬s-Ö?É1GÂTbo]AXl!ùç»Âm e +Xh‡¶öF{oû©¯<orß°ã €ÝbiïÉ®ÒÖùå!WAvÆB€Z3 ª7uöù•çv“e%AÙèøWÙŠÑúaƒR=×…µ*ô¬Ñª`_xê¬X;Ø? i]û¡z•íðÌÒ¿Úw( +ÇÛ'k2¸+Ô6ñÑL$îMÛÆ."Þ–m7Ù„çâ€Ø½(›ôËOr)èËD<X‚¢žÑ4SBöŸ&vRz|x]Zú‹ø8À
z.¡½Ý ÓÛ¢OÜôD¡òŒ>
ˆ^3 -¦÷'ýµË=dèï¡ÎëW»«h_3d$ÛIPøÌ{½ˆ<^Ú:…‘ì(+ú¦å‡ò3T*÷G;¿½(¡ dîÜ”vþᲟpÑ,ìàº÷/'^•^ºè<‰ˆb¾6£º!ÑÈNLÝr¾¥§Ã¡¨‚ÖLéÄ9ˆèÅLÌŽOOxYÔL‡ÐgªÖqŸ§úd“xVÿªÇŠ
&#ãý†¢Ô\ÜãF9¤)s¢ú´u%K†]@sWÙÉÐΩìµ)D¼x_kûé·}ì ƒ³k]Ø^ØÒ³ÔíaÛ–€Ü—‹¦_6lkf³Ù}@ÍØÀ‚1L†'…s4ý‘GºÓqî´¼}øðÁ>uñàâêü-þ +íON(Ô(&_•°(‘z@ô?ÕcÕendstream endobj -1453 0 obj << +1498 0 obj << /Type /Page -/Contents 1454 0 R -/Resources 1452 0 R +/Contents 1499 0 R +/Resources 1497 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1441 0 R +/Parent 1484 0 R >> endobj -1455 0 obj << -/D [1453 0 R /XYZ 85.0394 794.5015 null] +1500 0 obj << +/D [1498 0 R /XYZ 85.0394 794.5015 null] >> endobj -1456 0 obj << -/D [1453 0 R /XYZ 85.0394 756.8229 null] +502 0 obj << +/D [1498 0 R /XYZ 85.0394 647.5054 null] >> endobj -1457 0 obj << -/D [1453 0 R /XYZ 85.0394 744.8677 null] +1501 0 obj << +/D [1498 0 R /XYZ 85.0394 617.516 null] >> endobj -494 0 obj << -/D [1453 0 R /XYZ 85.0394 609.3337 null] +1502 0 obj << +/D [1498 0 R /XYZ 85.0394 528.2228 null] >> endobj -1458 0 obj << -/D [1453 0 R /XYZ 85.0394 582.0292 null] +1503 0 obj << +/D [1498 0 R /XYZ 85.0394 516.2676 null] >> endobj -1459 0 obj << -/D [1453 0 R /XYZ 85.0394 540.5567 null] +506 0 obj << +/D [1498 0 R /XYZ 85.0394 321.0565 null] >> endobj -1460 0 obj << -/D [1453 0 R /XYZ 85.0394 528.6015 null] +1504 0 obj << +/D [1498 0 R /XYZ 85.0394 296.4844 null] >> endobj -498 0 obj << -/D [1453 0 R /XYZ 85.0394 359.8869 null] +510 0 obj << +/D [1498 0 R /XYZ 85.0394 226.88 null] >> endobj -1461 0 obj << -/D [1453 0 R /XYZ 85.0394 329.8975 null] +1505 0 obj << +/D [1498 0 R /XYZ 85.0394 200.5523 null] >> endobj -1462 0 obj << -/D [1453 0 R /XYZ 85.0394 240.6043 null] +1497 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F41 910 0 R /F21 690 0 R /F39 873 0 R /F62 1035 0 R /F63 1038 0 R /F53 1002 0 R /F11 1343 0 R >> +/XObject << /Im2 1024 0 R >> +/ProcSet [ /PDF /Text ] >> endobj -1463 0 obj << -/D [1453 0 R /XYZ 85.0394 228.6491 null] +1508 0 obj << +/Length 2207 +/Filter /FlateDecode +>> +stream +xÚµYOs¹¿ûSÌ!¨ +²þŽF{cmœÇ–ó»ÙÚlcfª€!̯¿ýk©%ÌÄK^*•ª¨iõ´º[îŸd–PøÇ•’Ôp“h#‰¢L%ÓÕMaîÝ2½(ÔkJý:¹¸¼:1Ĥ<M&󆮌Ð,cÉdö©“Aº vþº
º=®hçfxRñÎÕúï'ƒ1N¤Aô×áè9‡«ûÑÍðÝïã~WËÎdx?Böxp3FWƒîçÉoƒÉÞä¦[Œ +gï—‹OŸi2ï~» D˜L%OðƒfOVR ¢¤‘³¼øpñß½ÂƬÿ´5LŒ.RÞ'ÉÚâ$5IµÆ8}üø‘þìß½¿«û;DJÁïQÿn€ä]8ê}ŒÿŒÁõËÞ\€&=©Õ`nÜE8Dœ‚žÉÂbðÞGW·¿_‡=¹.¶vZ_mÐ'ŽõqIŒdÒëûð¼®ó~iYX(¢Xªà'·_Àª¦F楂Áy±´ë|Õ¶´‚x3X?µ¨ ã’å¶x,Ö-zÀ²,UQì3úܦÎÆ•rÓrµ²ëºEŸd$“{>; ’`„J®“ÓÄ ÜäØæ3XOd|í ÝÙl»,ë”S[U8SûMâoJù2â(ic€2;+d,Ë¢yX¡˜ãÒE¿Ÿ¬·!,[¬§ËÝÌóŠu]¶Ûå§ó:NAù¦„O eM;ÃyKbp& $€™ÿ¶M(L‹ê«Î0ÐZRI2e\ 1Jq/^ÇÌÞ´×c#äÞM`=õ¢ÅVi*8Y|?¾ŽÚr@Cêíå*[£Z;7.òÀùš/wö-Ò%X¹}**…1ÝmqCöévd“†Ý×ò{mŠÎïÀg‚¡ZC‘¢ÙqŽbQYÜOcºÊ˜Òégfå*â>=…2_í6Hùˆôd +uó¹‹<¬·ÙåöôÓ–z“2¢u{½á/ë”1¯ÊõÔ©…Œb)É îgT3‘y惵k¤ÐÏCÛÖ~T…|>§ÿ0NŒQ²½ÿ@ 6‚pž¾¢¿£ +ñ‹cU‡v.A +K'_W6(Ô ½«‡xÆåpÅ“ëJ>EŽ¦fïôãFuÏHÁúÒ@?€íôÍU·'µé +™PQ‘*ç8‚y«ðíÄ·(Çœ¢þYëªÆ}ÛÙê΃xŽÃÌvÔï"ÇÐÓ
§páá:ëÌ·å +)ŸLŽpÉôÉ<9]6¯w[Û…5ä¯t0:?N +‰L
á™É’ÆQý±ÃïÊŒ2Àï앦f=9`/oƒ½Re +ŽðÊÆ_†wJ¤o]ô<õ7Uœ‡!cj÷PÙ/;lì&¶¶iéÇY…L˜<µ[Ϭ+k¥Üz“Û +Îœ„ÿÃ-/‹ÆŒ£X'ß#N`»Ã9:Z¡äëÇ´Ç™Ô2©ÔÈ©À°õ¬úÆÕ§³ÃVóoouDIM—r]O46ÖltÊ^Ô׃DcŒ¦ûÔNCb.´wyå˾¿\þ©íº‚ròÔÖ€…oÞ
F¸öBH'?ñ¦v´Êi2§€Þ©ˆ¾±7ËEÕ†¶8É(?÷p´Ÿ°¸‹ßya[æU›EÚ}¦M󘽼‘‚ÉY´¹~Þ·JØo8ÿ?åø¿Ø(¸S¨ü毷lØq}âD«T4œ+
@ÊÃjžv¦ÂÖù9•Ý6|ä*Œ(Y•;Ox +Në„ÓŽ7÷ñzùŒÔ. 2÷¹¿çx[¡›Oá„Ž|Ÿæk889t~÷Ôvö{Ñë£&ý¯¡’„¥,nÁÔ-&ÒABªCÌÇÅÌ6€ôŒô£];›‚¬?µŽ
wÁ +)I`ê$Nn™_vGëh(É›Mé®P^ãî‰K.›Ã%« +X*:räýÌ.ícî€Ê¾ÈUÓmñðJ‘c:¡+w˜–øF3€?û××cÒ¿wÁìG}qÒòjA_¤m¸·ú-¸êœà¤¡·OÚ`VØÁIxc=à0ú€#¾½Ù?Ž¥Šq䛓·7„¶WئG±w¸]„[-öO|x%Øœ\ +:l[>oʪpPïôb¨!òÌ褱?–’ûc÷9 +5Šš¶¿qÐ=ìýῨ4®šˆ,ãÍg¨rÓìïÍ–á?yp‹z R
Óÿ»„m‹endstream +endobj +1507 0 obj << +/Type /Page +/Contents 1508 0 R +/Resources 1506 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1484 0 R >> endobj -1452 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F39 863 0 R /F21 658 0 R /F47 879 0 R /F62 995 0 R /F63 998 0 R >> -/XObject << /Im2 984 0 R >> +1509 0 obj << +/D [1507 0 R /XYZ 56.6929 794.5015 null] +>> endobj +514 0 obj << +/D [1507 0 R /XYZ 56.6929 720.5366 null] +>> endobj +1510 0 obj << +/D [1507 0 R /XYZ 56.6929 694.4596 null] +>> endobj +518 0 obj << +/D [1507 0 R /XYZ 56.6929 472.8118 null] +>> endobj +1511 0 obj << +/D [1507 0 R /XYZ 56.6929 450.5356 null] +>> endobj +522 0 obj << +/D [1507 0 R /XYZ 56.6929 369.5968 null] +>> endobj +1512 0 obj << +/D [1507 0 R /XYZ 56.6929 342.4358 null] +>> endobj +1513 0 obj << +/D [1507 0 R /XYZ 56.6929 134.5831 null] +>> endobj +1514 0 obj << +/D [1507 0 R /XYZ 56.6929 122.628 null] +>> endobj +1506 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F21 690 0 R /F23 714 0 R /F53 1002 0 R /F62 1035 0 R /F63 1038 0 R >> +/XObject << /Im2 1024 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1466 0 obj << -/Length 2187 -/Filter /FlateDecode ->> -stream -xÚ½Y_sÛ6÷§àCè™ -Å_èÜtÆuäœ:¶ÜsÔ¦Ó4´Gœ‘HG¤âø>ý-¸ -¬B)M¯ÛµÝ¡ŠÖ•õV+7žzQîì²-?ØÆé
ÜEt -45$gBulk÷‘ÖéUÑ´S =+mÒ‹z·-Z}($ʪlËb³yÄוý‹R^ÙU˜ÅOo.Îq -½µ@…víõîUX£Wè²mìæÎÓ
>—›¢ñd ÛÝ»=+¿”DbwÊ@ eÝ=Wýr¿êSÛo÷gvëGj/@/wSlm$é•ÔD*Ç?ÎNÃÓöR-7û•õGÏ¢£gBgÎ!Ëï®of/gó‘’hî‰ë¾a%‰ÑLF³ùùåo/¦#œ'*ç²ç„ö78fÉ%Bççbq‰†˜ðŒe(DNþ(ó±¶J
áóqðê±j‹?ŽÈ%Q,ScFS£åD0ÎýºU½-ÊjR¹£=Þ<Ó„KâÍ7Ìò°é²ÞnOŽœ#ZŠÀèíˆøf2€€&ïOòs‡zpΡ±mçW,¸+óª9š§•w]7AÆÒ‡£†yçiqßEÕʯ¬ñYTHì«÷ûbS:Á5üi¼& -#
ôÕÙl>y5½ùj£Qp‹÷2C¦-?›^78…c™Ÿ|Û“égW¿^NÉùõA¡½(ÙP’áÂã3ÖàZ0A8?‚ðNþ×>ž¯°«¡Prù…whŸAp…câK¼Þ•ïнŸðÉt¦TàÎcìÀ¹Êÿ›„ -¸A¡.yzß¹½´]E3Ÿ@¸ÀÛØwaà«JJýE&cº‡ÂïÐÅlÝż?pØÍb1ãÅ+«7Fäꦋ6L–žù}
Ÿ¸äA³tv7Vt0½Ÿ=& -&Æ4`C& -Š2ù3j/l„#‘É°=”íz4ÑÀ)Šª¾Ò ƒ÷Ñîñ2”À{닲ÚeÀ‡²±OŠÓO§–ÃéçòïÊ”ß7®¼GÐÏs(S¨–½ -R‡“éhtW¼@šÝL_£ -£)‹k\4t‘àFÃ2•bô¸f]ï7+\é -t7¶³M[ï¬-îºVÓM³‚÷dêôÿCáæ'Îùþ@eèæ …òCo(¥JoO9À‚“]f]Npƒ.ܳ)±vqt]ᚇµÅÛ7ˆ& -{úÉêàéô8B õ5×F'q¬~]ø; QÆ'‡K´¯§!¢( 뢷ã›IN9¶)‹ªSqT.—ßîvÁ1?®ý8ä -bxkÛáiô¥³^GýEåáÁpà®s? W„ø~|g|ÉÔQû*¾tû-.ÝýÿÝm]lÊhÆQÌ·}^”î~Îô}åÓØÚÕ;ïÔõ°Ðh‹Læþ*«VÍ3ÍÏà¦?jþüQ‡:)V)ê|1¤p…ÓaÏ(UN¿ ôÔ:ƒê;¸væûp—>~Å8u·°
àÉî&*¿{9OoÎœIÓoƒ]Ž9ƒúŠâ£³Ù¬›ñûHMù—Çx„±œÁõßmÙºkæ‘7š"3¼Áö¤ rÙÓ>Þ{w£ -ºþâÿ›„ÿh% åŠc¿wÐÞ¿úוŽ»6Bk†‘)sˆ/
L¼PNpÍ$?ËþÎsŒqendstream +1517 0 obj << +/Length 3616 +/Filter /FlateDecode +>> +stream +xÚåZÝoÛ8Ï_á‡ç +nîý'¹™÷ËÛ·÷—Ÿ–¿\Ü,Ûô)¸ÂÝÿëâã'>Kᬿ\p¦â(˜=Ág"Žålw¡Å”ï).î/þÞì}µS§˜¦¥b¡Ôl!bÅ"ó²´‡e]S„†)#õhÙ…šÅI„œõ¨“„=I)˜R*˜™ f¡’ÊŠ¢ØÖÈ«zc
’p ³ÜæõåB >O³z}ÈW™}óf›QõTfê+“ïÜŒF.E4ÏêêhëŒ>SﺲÏÔ-ÔTô\¹Ak•4YÊp¿°388nRÚ-^—'|<¯óò¡ÈÜ‘úÇ€µQ»#½™:4ÂÀø“<Š"9xº%ô xM«O»UUÔôé)o¶yIð¬Ï×ÄrãhOó\€"hÒ˜:O3"ŸÐщ>µ÷E²ÎRú¼:Y~,¤ +ÁÌ„ùfP™c—sÉñ©z–ƒ½Ör°{}<j—
}±lH +9ß@ÕëÑk…›¸ }N³u¾K +ê³Á«ûö5£M,¦,pŸ¤)…Þ/¾`´Ç§3bˆ¹bį1Â<&y‘¬ŠÌ¶„ڛ갫©ÙÅ:˜ÞíÑ®ðI7‰Gx–§2 wѸr[X7@œäcÀµóHMòÌ’Š)a¼²U,P±ì-ˆ.ÍX—fýáT¹=~9³P3Zƒù2é´neÂà%‹:ÿœ‚ +¢ïÓˆ‡2ÿJ0'°NŸy™æ>úBâq¨†'_ÃlôED¢ç}ÞÐÃ:Ê>ƒÈ±qnpg€;ûÙ¦y +F4´ +ÚF¾ËMµ(òG×cã~PçG=d%"Foô³LÑ!„[7‘ìu»jêW%4ŽeOVyPŽ«Ìx›òÆ8—lm¢•WäA^R®Ý¨Ãe4?YÍ^OyÖ»Ly©b6 ‹ðH`¼§™ „ +C‘–¹eµ{q‰..aWÆjcùº“Qþ=¨J5Ýv:ƒuûq$NSéÆ} +†¢ýеÏÀ¨,¼Ÿµ=3ÿçé^çh[ÄÙC½Ö©õ’-
x'ôÉ–æL†*rÉ–v©Vÿç{8¿”q.½ŠäǪŸ>†Âþn0IJ(Àjø_SoQÙ8ºÊ+ôÔuÛŸ—$0rá3VüÒBæ4sÔêìÑ]Ù‰˜7ÉÚ$PZM?¸>ËÉPÒO«,ñ5†êlªsQ ÀWÜÛ¨z!ݾJõÓœá@zÏËuqLýX€&F«c ñ³¡½ªØ»h=emâñ|5 +5¢Yh°d}ÛP3<œ®\-8DÏ(X)GÂ?Bå³W+œßú“×îGÀÚþòENW¾Ú +™ +ÒB¶GêY=QE,ˆd;ª·õR+§endstream endobj -1465 0 obj << +1516 0 obj << /Type /Page -/Contents 1466 0 R -/Resources 1464 0 R +/Contents 1517 0 R +/Resources 1515 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1441 0 R +/Parent 1484 0 R >> endobj -1467 0 obj << -/D [1465 0 R /XYZ 56.6929 794.5015 null] +1518 0 obj << +/D [1516 0 R /XYZ 85.0394 794.5015 null] >> endobj -502 0 obj << -/D [1465 0 R /XYZ 56.6929 769.5949 null] +526 0 obj << +/D [1516 0 R /XYZ 85.0394 408.8853 null] >> endobj -1468 0 obj << -/D [1465 0 R /XYZ 56.6929 752.162 null] +1344 0 obj << +/D [1516 0 R /XYZ 85.0394 384.5457 null] >> endobj -506 0 obj << -/D [1465 0 R /XYZ 56.6929 685.5532 null] +530 0 obj << +/D [1516 0 R /XYZ 85.0394 174.3152 null] >> endobj -1469 0 obj << -/D [1465 0 R /XYZ 56.6929 660.2382 null] +1519 0 obj << +/D [1516 0 R /XYZ 85.0394 142.2096 null] >> endobj -510 0 obj << -/D [1465 0 R /XYZ 56.6929 468.978 null] +1520 0 obj << +/D [1516 0 R /XYZ 85.0394 79.8825 null] >> endobj -1470 0 obj << -/D [1465 0 R /XYZ 56.6929 442.1289 null] +1521 0 obj << +/D [1516 0 R /XYZ 85.0394 67.9273 null] >> endobj -514 0 obj << -/D [1465 0 R /XYZ 56.6929 217.1462 null] +1515 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F14 717 0 R /F41 910 0 R >> +/ProcSet [ /PDF /Text ] >> endobj -1471 0 obj << -/D [1465 0 R /XYZ 56.6929 194.0979 null] +1524 0 obj << +/Length 2855 +/Filter /FlateDecode +>> +stream +xÚÝZMsÛ8½ûWè(W". +âPăéâ,<@ÝOgÂꌜÒÈ×z?>ûÇ•2ƒ4HµÔƒñ½×W„I"ãÙïCDÁ9ôß¼þždïÆç&¾ÃÿÆïÆ/îÎGišÈáÅÏï>/oYK{
Yb›_Ü\_}üé·[ÛÁÍ5‹o/¯.o/¯/.Ïÿÿrv9î&àOR„ +ÿ|öûŸá`sýå,TšÄƒGx ‘¦r°8‹bÄ‘RNRžÝýÚuèÕRÓ>§E±´Œô`¤¢ ñ_7¬L¨ûG
#©‚T„Ñó]q»º²En¡öºÅ&ÐB€qFÅ‘"í–T*oI5´NŒ°KjXm\ÒÕ´^Õƒõzþy7m³ïtš Öq4ðGø>£»._°Z hLwÌÏs°Ø¤Ãj½˜ä+,'ÃúžeÅvNðöáúŽ«Wç"º RÕ}½Â™âb¤q,©ó<›ÎÙ7Ÿ.n>\˜S*Nè¸$Œ¶0üK +¼@ÞÚ$Ú>-ó#`<™~0Bx%:Ž¿aF®Ås`Ô&D”¾Æò=¤{tþͺ}¨_E¿ÿï3y‹Åã6o±èMPŒBÑAËEzv3ŠB¹…"V±pŠ±ÔE.5yÕbÉï)ÃÖ«1ÏY\Tm¾ª²’Åœ…›ºÜ€Y°å»£0Ñøwà/Ÿ±×—”â¡°)òÇóTŸ‚Ó-Àß8%ë8’ˆ»|> +´ÖJxݯ³Enù^¾Ú¸å¸k³¶hÚbz$ ¼¡N•œ›ß„o¿géH)=œÖk„¥}Ë&\ôò´Ò>g苆%#~š7
49Ê“9áå)Ù+,_+½ +òøEâåXƒ×ô…WÓÖ3_IÄñOŽ/(LyI°8ËÚl’5pþ„³±ôz/ú†h:ÙþÑ$%P=#0¤(ÐR%þ…âÁÅ¢4I%Jî ™† +5Ö|à±ê%–Â@Åø>,©Û9Å-(PÐhwo¾¨Û¼|b%ös1á¡!‹ 8hÇz×›"íVr74@<gU•—\IAOâg\ÅA†é¡l7}ÁšÄ1R{mòmŠ8ÍÍÚY‹„Q€¼rhè÷ ¶[NPÀ»Éóç¾TEö¥$"vÅu«‡nû>ÌùúG¶§EäÒ7›FŸÚ$¤Ê}k„ F;æìGÖVöFùØÈáêÁ"´3+ )VÆÝ×DØBÏG"C‹ÀÝ3½_½iƒ.y„03Q Úd…ÊYp¯SU.Mò‡Â‰] ³ð(à¼uÅÿåÿì™[—å²ãÍ›7ýÓøÐØ© nR£Lš¤Qê¹Nõuï}÷’³ýÄÎ[!°ËÌ%QÜ[iŸ?ÀÕÌÞ%p«ßªâl¥O¥í¹-`#h³Å&®¤.ò¬Yoi"´Èl—M¡1s/]5`ñ—¬Zg«'VoûR¥HMˆ©'ÔÃ+`õ#_°G˜|iÍTJÎçÅ*<3Vá]Þ‰îÀsguA¡¨p£Ó)`q£-Mñú›BFx +W%xÈeF”´ˆ]ú`dv½Xd˜¸¸jg••Øùº!-XQο¾AYÊûc+‡Ç1ªp¨£+=²˜>h+G¬;»Þö%EÖèòûvQ7h†@óÊõ¢âÂŽp¤*³IžÁ3–7O‹I]²2ß!b‰¬ÂÍQtG.{¥ÂÏ°’;iìH°±†ÃLª\Ÿ¯Ã”w›EǬCKùÌ”Z…ÌVÿ<bÉNOPc¹,f$•8J“WÅÃÜz´ä@|}(6¹µÄ6ÂÓ%§4þ½ŒcºÛ‡®£¬gºMÓXÂÚYÙÔ,q™ËÞÌîtµ35#¶|ÙHŠ®Éº¥!´×´°º³zºF¢nmXÖtÖxâJ»Bƒ¦D¿ôÁnQψÒOí¢¨ØýÈ +“¼¥ÝË€l–MŠò=F:E:|7›Ø˜rhBº¦Øƒâ"{â{‚ûä§N3–vxž–ü8Œ‡ÿ¡suÖ·V‹b6#¯IÓ
–é~¯á2Ìç1§Óto¬> ·
i‡h-Z–:ظ/õ¬iá͈ïì$v8æ}æ Òîn.½c²KÏ,’}nÙOqoyÑrY®1){~ÜbO;*"Å?mÙ?³„]NþîŸzg0§šç.»K;¶Šç˜.Â@*-–gúÿ)%¦endstream +endobj +1523 0 obj << +/Type /Page +/Contents 1524 0 R +/Resources 1522 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1484 0 R +/Annots [ 1526 0 R ] >> endobj -518 0 obj << -/D [1465 0 R /XYZ 56.6929 110.3497 null] +1526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.6967 418.2465 116.8967 429.6386] +/Subtype /Link +/A << /S /GoTo /D (statschannels) >> >> endobj -1472 0 obj << -/D [1465 0 R /XYZ 56.6929 82.4166 null] +1525 0 obj << +/D [1523 0 R /XYZ 56.6929 794.5015 null] >> endobj -1464 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F53 962 0 R /F11 1303 0 R /F39 863 0 R /F62 995 0 R /F63 998 0 R >> -/XObject << /Im2 984 0 R >> +534 0 obj << +/D [1523 0 R /XYZ 56.6929 404.633 null] +>> endobj +1237 0 obj << +/D [1523 0 R /XYZ 56.6929 381.6542 null] +>> endobj +538 0 obj << +/D [1523 0 R /XYZ 56.6929 179.3483 null] +>> endobj +1527 0 obj << +/D [1523 0 R /XYZ 56.6929 154.7696 null] +>> endobj +1522 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R /F48 925 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1475 0 obj << -/Length 3204 +1530 0 obj << +/Length 2809 +/Filter /FlateDecode +>> +stream +xÚÍ[[oÛ8~ϯ𣌹¼_öm’n3I㸃bgæAµ•ÖGr%9iö×ï¡HÉ´-[vâF’¦HêðãwnCzþ‘ž3Ã{Êp$0½ñÃî}gïψï3¨;
Â^oGgÿºdªg‘TöF÷Á\aIo4ù3z÷Ÿ7FÃþ€ +IÔ‰£·W×ç®Å¸âÝÍõåÕûÃ7}Å£ÑÕ͵k^\^/®ß]ôÆh +ãy0ƒ{7²ƒüÈ»ÑÕ»»þߣ_Ï.FÍÂE̬ôßÎþü÷&°Ö_Ï0bF‹ÞüÀˆC{g\0$8cuËììî춙0xZ
mM0„¦ª5JÚPIFY…š](A¤? ãè:~HüZ“ü1É}½ŒËiQNÇ…Ç0[¤e’ë«7v£§8«½Ïâ’®®ýEƒjpo@2BÐíïwã0Lå«õˆÕ©n=E5"L\4ª’ô#HQê¸x÷üð9›õ’Z1H{$};£œFçI1Χórš¥ëH +ÆáLöü»åëcQæP†Áü€)ݶ
Ì¥ðMÖ5øƒ”T<ÃäÛ")ÊGÞpÅx4¼µ +ÒBjœÞÆ‹Ê}BHNñÅØ.Òb1Ÿgy™L–`»8ÛÂ:‚C +ìÿ$ãrìá’NvÍ‘T¬#ŒZ#*qFŒkÔ¹ Pß'ŽÖ¾Î@ÔãÂIŽ§¢HÝ$%ó6áÓ}^A)Ddß.‡ÝXþ7K=Œe§Å}}º±Í>t"H}²D•’nÖ7ÉãÆÅ
瓸LQ%e€.´t£{þœÆÓ±s«9^ o úÉÂq«·v£+(ÌÏë0¢˜giØ€`ÑÝ›´ØÇ +¸A¿"I˸-e:Y}‡8UÚŽgF4Œªü+_¤ãØ&PÝ@ßX²é¨°ï@iO–ˆªj£:â +¢»ëø˜x7ç/>XÔq?“ïÓDz,Ù;ÅHkÕØòayjÏ1术!m[*cÞ<ñ“V-+v\V[AÎ7¬`›EÏ|NÝnœRxóí‹ì·ô‚)\nƱ¾þ1`©‡è~=¢/L +ÓqǘBÙØÊOç7¿¿¹ºPá +¿ñ³„ûYâý,<©çFî§÷©PÛÌ,Heû¶dK-–ЃkÙÂIöOÓÁ¹FœjúÓ|j¸ §êT©8ð.CG¢†°eV}†Éª½µgâ—O“Û©âÓÜŠñ¢p|a.#¶•Â_¸¬3WΓü>ËB®Õ‚´Ð¥¢3öc2ôœT“qì&ƒæ¿0¦éÄ·Uo]$ˆ×"AUgô¶ß&kÝÌ/dm®c¶ŒùO£mH‰cùgaRâM¨Gl¡-•ÝRá6Û8_ÌgÓqõ%†Q&¢!4B[*Ms:Uwx•šª¶—eò0w^ÅöÉ\¹$«óyQºÊdZÚh3Î|掟$°Ñ•Éw{÷8ýâ~Ùƒ£>‰žÝ/}ÚZ%œÕf[»úà'šL<w‹_ÚÞl/dýÂ1ÞKQ]Wm›Â„þqù<OÜÓØj’}:žÅEáÛfî5ñäÙ=ûœTbÛªcl6h;ž²ÇDÕUHiš#(Õ¦rÊá[•íJ&_Ú·‘“fÿ[´ôQ5=-³sƒö¸0Ø„9ãkhU÷^¿NQ~œî ¹)§‡°”($¹ibãó<›Ï÷ùJÕh›P*º·lÅ«V̶•Zíl´hEal›U[&ßQ:æo +Ö–è
’• +U劲8¥Azºvöû + +éy,:vxN +Èß´âÍ¡®M#yÒB7°‘ð¢6àLÊè¾î6ßW!^ˆ6^Hϱí,‹Ø Üø—Þo•nÐôüÉçû!̧z§0ªé ,ÉH¦–—}¾ÛO7ûÞ½¬“ÜÿmÜùñ¸Ž³‡ù,ÙyÅKzÒP±9^Çi¡a{‡×{¾A +Ó
çÇyÀ<Å>ÙØäRÈ“ÅVRvœXÏ€ã+@ó"¹ò{_(9OKû7ˆ„t|ç°¸i4
÷;7ÜzÓ,ÀÐ7À|»Ðt’žôeM‘²#ïÓÒ®‡`îg,[Üß<’*x +#‰IGÔ¡8"Z™‰/¥a±í±^‹œF¦ÑꘌHÍÚþ<÷:aÝ÷‘—žÍbZ~gå)
™=&±sY´´Ø„ÃÿÕ²ïˆþr[NRendstream +endobj +1529 0 obj << +/Type /Page +/Contents 1530 0 R +/Resources 1528 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1535 0 R +>> endobj +1531 0 obj << +/D [1529 0 R /XYZ 85.0394 794.5015 null] +>> endobj +542 0 obj << +/D [1529 0 R /XYZ 85.0394 769.5949 null] +>> endobj +1532 0 obj << +/D [1529 0 R /XYZ 85.0394 752.4444 null] +>> endobj +1533 0 obj << +/D [1529 0 R /XYZ 85.0394 752.4444 null] +>> endobj +1534 0 obj << +/D [1529 0 R /XYZ 85.0394 740.4892 null] +>> endobj +1528 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F39 873 0 R /F23 714 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1538 0 obj << +/Length 2152 /Filter /FlateDecode >> stream -xÚåÛrÛ¸õÝ_¡‡ÌTž±°¸Ù7mb§îdÔv;;Íæa‹³”¨);Î×÷€¤$Èö6»Ó‡Ú€p9À¹_@1âð/Fi̸ʢ‘Î"sæË>º‡¹÷'™øE“áªoO~¸Pz”±,‘Éèön -ü,WNw.ÞRG*¡ÿ -'P³*ošÊ4nçåÕdúîÝ5›^BbN=<€c‰ÊÄåpÍ2bnyññúòý%¨kÂù˜3ÔÉp§†ÝuÈAàžÝ'&Ò æê†Ú›óë_¿aç?Oúôáüu „ÔÔ}CÍÛ«éOnò
ãqÙètÄA.>ä•Yµô˜ø5R» pH‚RâRâ8,H>Kñ ehÝ+¹'_ T¾(¡ÌX©_‹‚[y伡w"‚t4Šµb™LõküƒÊÓ\ïù‡ÿn—¿ «b–&q|ü´,×õ;vAM:¤¬âàXÂÞGHÁ”Rñ(Nbž”È¿ÉW÷& :"‘-½]XíHR²ªØA«Šm½²MÞÚÇš:wõfÙ ŠÀèµù¦4m½v»6Ôöã?4Y34ˆj|éA-Ü!¿p.7M<e)0´hçÏÐî €×Íð ³Þ]–:ÖƒB+àô(NÆÓª¢‹®ÄK:ˆ€˜¯ -?íA/·ƒ93!Y_×MÙ–æ@0cž2™$r4dá÷‰ - ‚hnh¦´Œ~ÌnËQYSš³$ãéK²&!ÔɢĢ_-šWJú,ïÞšŽ•4^?®0¬À±U¾ôƒw{«cœ>ôÝ‚“—†væõ‘T4MÓF310¾\ÝW&¾Ä@Ú4ÍJoBHƒÆ~Á/<æE]UùÆý_Á˜@Ùçãæi9««†¦Ëva=L ®‡g‹H±$áÚÁÓ\$,Ð¥5MYŸêŸúë*ŸSˆ‘agã)@Jeº ¸˜IõÑý¾tkÐlGÙøÚÆïMKœš7nóŠÚZ½m×[«~°÷©ÞÒèÊP¥\¥€Ùó|mú͇¤ÙÓÆ_P
yäè²E@™Ù;B3Ëç¿6K-h«ˆ†[èa"ÝÞU -ó5h¢¨ÓfP”€ÂK–ö0~…^ò.Ô»³Üi»^“ÌAŸ ›ä)ëì‚ÂÜåVºðGï1Å2d|&O
Šº[4øn+ÄÏxX[!“Vlµ8ÑÀâÄÒ%:Ñ+¬Áâ#¹8Û)¼UÝR'Ÿ5uµmúö U´£ä!N£dæ±ñµž -sbkô°-WEé½/¸!žíW1瀃õ¾hƒ¨©l´â¬Ï›Ýr^G 2cÇSÇaFöi^Ÿ;þ U -¥"–ÊX½9ªD2%¥“–¶z1s¼Yƒ³†Å0r¹ í”K3iëI©7X‚3ÕùU¾ --w âiz_Ú%ƒoþâc1c:Ù*ò6÷ÊeSˆy»íkb| Ú€b|ÖéMÌž|þ¿–ùæW „+—ÎÜ?f5Uýh9ÌûzJÕØŒJ…™-=.-ad&ð³¦Ó÷y·ÈèuF!sEÇlPìÞ øëœÛáàà -ñ´šÚ™»Å0ò†Ÿƒò+ äîßé`WUˆ˜LÅ^UÁa®$a-9êªÖ裋 –SÀºø~ßáGœ·ò°v 悉32ê¿1›×hKžºOÎü‡_µÿFloKñ—(çô¯€²¥\–àtÂ.߶\´åܾ2ùØÂcüB/ði½_½öCÀþcÈÈVÞeØívîÙ] -©—ªƒ`Æ1xxõÿ +xÚÝ›[sÚÈ€ßùz„ªÃœ¹_²l%8vOêìîƒäX»XØH8å¿=Œ„ÆHÕ‰+ †éQ뛞 †? ‰¤¡&R†#‰ˆæw}…ïÞwHÙ§_uêû½ÞÍ:ÿ2d$•ÑìÆK#¬5‰f‹ßºqÔƒp÷Ýh|ez}*pw:ë)Þ½°/³Ñt6ºœöúÆhÚ½üéâÓl0q½¤'èZJñËëñpôþ—I9ÀõØ5OÃÁd0¾ôþ˜ýÜÌvà_$ÁÌjÿÐùí-àZî`ÄŒÑ7ø€1†Fw.œ±ªeÙ™v>ïô¾ÝŠ¾s
¬€LŸiÄ…ÐûOëNá´å!!Èñò¬}IbFTpE˜µ›J¼y®Ò¨H ƒ$£l;¿Ü/â"y/>“uò`óĈ6 °áp.+põ”ÅwéÜ¡Ýl¥s÷aÝ#º›ü•Ì‹dáZ›Ä+÷~ïú¸×‡Mš§EÙã&N—׎^ÍæHE"ÿúNCÆ9CX2õë© +Î=ÈpIŸOýw UjP"‘â0%}jÂZùóÊr¨ƒÑ`]}E2L‹·ç¹2kxAšb¾[oÑ^Ÿ`Œ»ÿ]e%÷qšIgó²aZÄEšé¼œÕËÕ:¬ó—“¦„¼DR1ª™c20~…kÆðm©Jõ«I>Ù,vÕ—°¨`ÔK‰MS¡")92ÖuXÄÓ§»?WË^_rC»WI>_§÷EºÊ^’Fœ+]Ÿã4½-!¾õÇ à1¹ÏÚv(µã8ï>^éÍÓõ¦xäoxp·JpU:”Ñ'è´5µ¤~ǘV%O²í§ç©ÕfzÌêËX€ÇÈÀ¿ôä1ôäwÑóÔ:/=rVzàé¸Ð4@Ü'†ÀêÑe'™ž‹Dó$}L zÚµÙ ¤%8dDAvfäs†§à‘kåÚŒÈì”0ÄƹÇp’üF˜ÍWwiöõF—VÀè)Øâõ,l2i¨:ÌQ†ˆ2eX½¾hH@Ä<l’uzœCô5k±! +¥ yW`,4äz”`“¥ü] +$5
xC!
¢R»x|ñe8™$LÐÊøë@æ°¯W›0lqU€,àªaú¾&ØŸ§W›Ã^=HÄ„v¡xôÆ7jL¯V«Íð ÍÓD‚°`°ãÆŒ?£×ÄöšÓóôjóÒ…OCšÀG ‚TÚÅÞ/7ëéf>Oò<ȯ.)ë8Ëo’õ+†U±#&‹ƒD=UÛlï,CÁúsÃHEt§Ë3â´•³ƒ,=%ÏÅòø¢Ù¨øÎL¼&e3õ¹H×Í8§ˆ õÊf¬,›M’|µ|¬¦âØJYUžå²ZfÔÿ¦ÖxÎ2Ù®àÌ¡Ñ\¼]%« +Îœ€i+B^WÉl _—4ËvFùÁêÙ®ìŸû\ÅàóbIºÏæv„0…"\ºùrî'Ê…²;~[|—åëàNÙw}å΋œ¡Vˆ*N#dCÈÀÊC(#”Íz浯 +Áó1bÁQ,\Ú ®î~•å‰µ*Ž¥êN&MŒÐ…)7Ä1å šgi‹qJ†à¿ð”†)ï¿ìxÊf<å©<=U[T@Ò‰aÇs¨àÈá"óøËÕõÇ‹Ñ"ã¢;Ïa µP‚N7Õr‚’LÁD€ Õ€ã2&öFù¯ÃžÝ‹Ñ0L¡yw²'?}ÒJƒHÛ[öVºROÙ#¥AÝŒ„5w¡{x=ù8€•Ýç[›Öë0ÉP€žj- Á +Å]\§ø¸m»þŽÆðBê<èéÕóùŒµ‚ç¢È¤u¢‰«¨$öQ¤R!EiÀUR#%ÆEïi~ó[0J# v_mîßž”V/CxÝTÙ&ì1)îþç6ÉÜ·ùíê[yø˜Æî Þî‡üÍœ=ÑO³Ù'ˆƒZvsoOj?Ïoã,K–ÿi»¸M«v·WuªÆò„Û¦òÖÕó–÷÷ã»êq‘d½wCœ'óíÎЪìõ§»êÇ´xêXáûÉŸ¨ÓæþG.J*RRÂ1Á\˜˜m/|½Éæ±}V*hH³ž±ŽLw+‰ÓrB_ãö:; +ckBуreOá¢Ç‡Y*lãÆö8HöÃÎÉ2ù[{mÆÒÓ²½[h +IŠ=Hañ€Õþ¯°®Ër +îîˆýóç:Z8vE½‰¾OÖà +GÁ endobj -1474 0 obj << +1537 0 obj << /Type /Page -/Contents 1475 0 R -/Resources 1473 0 R +/Contents 1538 0 R +/Resources 1536 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1441 0 R +/Parent 1535 0 R >> endobj -1476 0 obj << -/D [1474 0 R /XYZ 85.0394 794.5015 null] +1539 0 obj << +/D [1537 0 R /XYZ 56.6929 794.5015 null] >> endobj -1477 0 obj << -/D [1474 0 R /XYZ 85.0394 586.2823 null] +546 0 obj << +/D [1537 0 R /XYZ 56.6929 710.7531 null] >> endobj -1478 0 obj << -/D [1474 0 R /XYZ 85.0394 574.3272 null] +1540 0 obj << +/D [1537 0 R /XYZ 56.6929 685.6325 null] >> endobj -522 0 obj << -/D [1474 0 R /XYZ 85.0394 166.8772 null] +1541 0 obj << +/D [1537 0 R /XYZ 56.6929 685.6325 null] >> endobj -1304 0 obj << -/D [1474 0 R /XYZ 85.0394 140.1236 null] +1542 0 obj << +/D [1537 0 R /XYZ 56.6929 673.6774 null] >> endobj -1473 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F39 863 0 R /F14 685 0 R >> +550 0 obj << +/D [1537 0 R /XYZ 56.6929 460.614 null] +>> endobj +1543 0 obj << +/D [1537 0 R /XYZ 56.6929 435.4933 null] +>> endobj +1544 0 obj << +/D [1537 0 R /XYZ 56.6929 435.4933 null] +>> endobj +1545 0 obj << +/D [1537 0 R /XYZ 56.6929 423.5382 null] +>> endobj +1536 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F39 873 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1481 0 obj << -/Length 1085 +1548 0 obj << +/Length 1029 /Filter /FlateDecode >> stream -xÚ¥VKoã6¾ûWè(ˇ(QÇlêl½(²mê^º»Ú¢m!zU”7ëþú9”‰EQg†Ãy~3‹(ü±Hf$+xåEJ$e2Ú43íàîýŒdRJ.µÞf?>ˆ<*H‘ñ,Zm/l)B•bѪügD9X ñŸó„K?,Š‰Tòøþç»_W‹'¼È‚ê»åãO()ð¸ÿøø°|ÿÇÓÝ<OãÕòã#ŠŸ‹§Åãýbþeõa¶XB¾L‹QáâýköéJÈîÃŒQ(½ -5³T -"S!&I=û}öÛÉàÅz³LŒ.2~£N\ܪ“,H&àÊÕigZ3èÑ”óDdiü™JZm‘ç,ÞW™m74zDz’ÙÞlªÏ”òéõúèN{ã*þÙ…HÏE—CÔÎs£íh÷¼6I0.ƒVœpª¦7]?V]A2tø²7í
OYJ¨L³ð¨Õ
øÖ´HIÆr´ÊCÓ‡¼\øžø»k}"Q"4@q%Œ‘BJîßlºv4íhzù ézjtk·“¼§õ}}¬ÚrýPM*‡¾„¶XâýSð›“B@ -ïÖ‰!H eE¸Ðœ`ZhNZµááMÀÀn!¦èß“Ñô
bÀh7 “F?›«XÎõvµÞ<úÏöœæ~ª}Ü-´ +xÚWMoÛ8½ûWèhËo‰Ç4k·.°IckÚd‰iØ–jÊ5úï;”(Y²e¥Å.$¤ø8oæÍÉÃñB0SÜGá%» ö¾ÁÚû q¿ù]Ô»hòvÁO!%©ô¢çŽá0$^”~žÞ¸ûÍW3Ÿ +<•h执ï–Õ_Týçþña±|ÿÏênði´||¨?¯æ‹ùjþp?ŸùJ…öóŽ·wÙMnç:ZÞ¯g_£“yÔÐ
’`f½ÿ>ùü{)Äúq‚S¡ðN0Áˆ(E½Ý„†g¬ù²¬'OÁÎjµuH4ÁB$B¨FÉjB!É(«T³Äg>ÁÔÉwE\f›l›•?ë OYùbÃ|»¢cŒÐ +N!ÌÇi[Ô +§ª+(¸ô¼}Î_»þ·Q|endstream endobj -1480 0 obj << +1547 0 obj << /Type /Page -/Contents 1481 0 R -/Resources 1479 0 R +/Contents 1548 0 R +/Resources 1546 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1441 0 R +/Parent 1535 0 R >> endobj -1482 0 obj << -/D [1480 0 R /XYZ 56.6929 794.5015 null] +1549 0 obj << +/D [1547 0 R /XYZ 85.0394 794.5015 null] >> endobj -1479 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F39 863 0 R >> +554 0 obj << +/D [1547 0 R /XYZ 85.0394 769.5949 null] +>> endobj +1553 0 obj << +/D [1547 0 R /XYZ 85.0394 749.9737 null] +>> endobj +1546 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F65 1552 0 R /F23 714 0 R /F39 873 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1485 0 obj << +1556 0 obj << +/Length 69 +/Filter /FlateDecode +>> +stream +xÚ3T0 +endobj +1555 0 obj << +/Type /Page +/Contents 1556 0 R +/Resources 1554 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1535 0 R +>> endobj +1557 0 obj << +/D [1555 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1554 0 obj << +/ProcSet [ /PDF ] +>> endobj +1560 0 obj << /Length 1324 /Filter /FlateDecode >> stream -xÚ•WKoã6¾çW99@Ĉ¤HIÍi7ÛmS,Š¢›žº=Ð2m‘EUdÝbÿ{9R¶b!ÛÀ08¿Î‹]ÄöG™ 1Ï“Eš'DÄT,ŠýE¼ØÚµŸ.¨—I'"áÜNfV#Á3"2–.¢S÷7]°˜HÉÄâa3ê’iJ(gÙâaýçòn§š^·Wñ2½úëáÜ–4K)l‹Š”ˆœånÃûû_? tŽÃg]mÙpvgê®\ëVõ¥¥F<šžHæñ¤ BrgM¹ŠhÇËwE¡»nDé[SáäSÙõ‰/r’K&=§„3)RØÏ™ßE³%` -Ñç¼–Mÿ˜Ú«ºôØ*½|ÅÕþÍrhü¾½êìµ=kЦç¸ÜßœÂß¾%ª>LýÚùf?3d£ÌƒËtNùø»½‹$¼ƒ€V¸&Ðä9M°&€1ÞŠ–Þ`£ßãlïC˜u…wìT¤
°vʯ´®QU¸!KûT£ËZ&°×eÍ–ÝʺþÅã×eøf„W¢ýûþ"ÑQ?>'ÐXÚ4f⥶ñSö\Ý°Úáhendstream +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Ãù»<Wm; t.qò©h;ÄgɈS™ÉïçÌí¿£é0€–üÆá»ÇOé½añt.¬Âu¹^ãÔƒíe—ï,0ÝNvHtD.+$Zå–úÚaVk$ª"®äÞ©Úè:ßô]jCß*80‘R’Å1³G,ªÁ¡G7SfdAD–¥~
*ݛÄÏbA¢(Iœðý\DÒXŒÀþîU3‰›˜²·Cºš@KBÂÒ8ûÜ €x
ä^[LšÜH©x“}Þ´©0éGÿrUÊüy§K5AFß›A¥™˜"w™AD×Ȫݘ:¾TÅcQqTekJu9A<¿ÐŒ$<Â"ÿ£-ª‘¦,M© ep´Íy :ãN¾(¤¾„!«lGtž?Òù±§_p5œ¿îÜn[9V‡o¨ÃÉaÅ +ŽÛýâþá-ñÕa|ìkç›üÌYˆ2K›éœòá=4v{Ix¬°7L ÉsaM endobj -1484 0 obj << +1559 0 obj << /Type /Page -/Contents 1485 0 R -/Resources 1483 0 R +/Contents 1560 0 R +/Resources 1558 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1489 0 R +/Parent 1535 0 R >> endobj -1486 0 obj << -/D [1484 0 R /XYZ 85.0394 794.5015 null] +1561 0 obj << +/D [1559 0 R /XYZ 85.0394 794.5015 null] >> endobj -526 0 obj << -/D [1484 0 R /XYZ 85.0394 769.5949 null] +558 0 obj << +/D [1559 0 R /XYZ 85.0394 769.5949 null] >> endobj -1487 0 obj << -/D [1484 0 R /XYZ 85.0394 573.0962 null] +1562 0 obj << +/D [1559 0 R /XYZ 85.0394 573.0962 null] >> endobj -530 0 obj << -/D [1484 0 R /XYZ 85.0394 573.0962 null] +562 0 obj << +/D [1559 0 R /XYZ 85.0394 573.0962 null] >> endobj -1488 0 obj << -/D [1484 0 R /XYZ 85.0394 542.127 null] +1563 0 obj << +/D [1559 0 R /XYZ 85.0394 542.127 null] >> endobj -1483 0 obj << -/Font << /F21 658 0 R /F23 682 0 R /F47 879 0 R /F39 863 0 R >> +1558 0 obj << +/Font << /F21 690 0 R /F23 714 0 R /F39 873 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1492 0 obj << +1566 0 obj << /Length 3437 /Filter /FlateDecode >> stream -xÚ¥Zm£Fþ>¿ÂßÎ#1ý4Ñé¤É¾\&íæv=º‹’|ÀÀØÜbp -ÙZ´þXÏ‹Ž¨EKóöuÛë2'ªõ' 6·f~¨ˆÆ¡ -¨óN&ÜFŠÈCí'¤[rHðÈ)™Uèqä&çÕsAÓ«]^u´Æ/~àÚ¢Ú°`ÎWåðÔ…zF÷Á=µ‡oÂ1µ®ñdèÇ<ýéP¥vìd»èú„/¡†bOûRƒ -/Ê/í>O‹§“•I)ee‚œÿ"¥æ<0´ÄÈ÷ŒŒ\ Yt9ö4Åò±¬ë= -†¹"0óÕ•…¥IEÏ·y¹§Q±ãØ÷œ¡=µ]¾£ùmžš¢;Ñ“5_÷e’ò&$k×rbÞÉyS-˜ßºþ‡wt2FBp”‘;iå>n‹tKfz,Ê’Fe±+ºs µƒ,Ù%7®+—žØÖG›qœOk·Í]Ñæ™MóhùÃz_Õ°¾¨m®x: $ZÌŸò¤;ô)GûdÇð€ä;pe1o)Á}ýD3Ø €bEÒnS@HÖEiÏØRkºö4\&Kòcœ0›„ïÕ¾)ž‹2ßÇØÝ
Î6Äg‚ö=amˆ‚£`k;Д`dmûgþ–ãµIÈÑ}FC× ->a¯ÀŽ ]¯ÎHÌz¹m‚UgB°)WeÎÔ+ØÒAÊ~‡éŒSÙtºÀBeý°-£9Aâw¬e8ª¢OYL S -ñªÁ€¨>7^%YäŽGËëæQ8Êîó¦<ѳ¢r’Є¤éŠôP&,iF\x[à‹S0@õ`×¹›ˆX -¬ÄôÁ*Á™ò ¸H¿/1 c¢x±Ð#‰5 -U€ÏYÀˆT`_®éšdÿ;´ÝÅzÏIyÈÛ~5{:"Ä°ãã!¬Ô:Ôñ%Œ®'‚mÊÐX/[îDm§ [†.àbTœ -[(a„i|Ý$Ma
Î d±‘Ÿ…´Û#Qœ' .ŠÍü»ú˜&‚(¾Ï«ŒàÌ·ˆÏô- ¤@xÙ©¶ñ±ßQ¡Czê.9Ñl>GcÁå -—V9aî{ó©6í¥ŒKH!Â%Üe–?/ÿÈ›z -!(/Šû¶ØTˆÑˆÊôU¾Bí2Äb”~™2+ëÍ}éGgàâjå \¬ î1ϼK tÅnÊMB7uö¦ -ïq©Ø9(6B(n·ÁzÓü#(&¤<´”€Éú.ˆº¾T&¸-¥Û¤ÚäŽn#¨¥C|ÌÛ–+&Û -â®Î -œ”º¦!žh³uU?œ a¤ôe¦hþ´À€Û‡òt[§´£¤ËP]í‡ë2×{ŸìµF³Î`?K'ц‚Šóà"ãžÄ ÊvÜ÷TÞ8–¸„rn2÷󛢣Bhª—¬àÔt,ƒ¯j&8‰0Úd·ŒBL‡á˼è=xñнqÑøë? HÛm…úuÐs¸%€…°Zd2”¤ò¡Ô5òÕWˆ‡‰ù -þÊù»«.¬ôüHFPƒqHˆƒ°ôì·™ð|ÇŠ&
Æv¯ç3°„åÃNÎÞÖ°£Ù`SŽñbÈÙn -bÏÀ‰
•Ö7°Œ‘†öTw$iGa„=¢°i‡£Àkèd¯bÁh1fÒå(0÷–®`"ècRûDj†{,öí¤sÅoÉhý`wÔK(Xj‡ -µv°Îøøy”RcNÖ·’úTD€¯Pçec -å0ïH7MÞv,TÚå<soðŒ–îm -9l™¹õW@ôVsB†`±e‰e>7¢F]å0¸uh¬ÍþÑÓ€pþ2ó×¼sìRP§ë³KZÕnžôÑHcÅyNq–{{S*R --û,ér׬æ¾ã«íê{ðJ(î7¸¾ªóÌñGêùãø)I9ðâ]»eFã5¿ -e—<Ãö"Q[pU[s#µÌøÂ0ã#ÌxeÀ< -žUåiªCw´€-V\×èyVóý–ª)°wÛÒ:i© -RßcíJ)5ø‘I–Fmù%*º”›©çÛšÊ&E˜4ÿ
*&†•Ãitrwì_,dYôS5µê^XzqRÖB/ë¨s ¨LoŠÿ-åð߉n›y±ƒÅol¯VõdjLÇþà²9·Ë• -¸]Žä]ÞmëŒÅ`hœýHpt(åó³Œvv[Ó÷`¬\Ñ•¤¸_•ËȘéÇoñtl¡¤_˜^¬<i[ÈÀø‰šAk°Ø‘¿/ÛšO¼îzQÇâi$|DZó2ö|©
kÈ^ÔŒŠ•'e
_ÑÌ¢Ÿ>Q›Ã2¶‘d;&tCÂÂ`|²@°VŽèÒ–É3Oí?`ÇŠv¤ÀÞò?"·D€á‘Ê;.Â\û‚7´ûeL‰³H»ê±fÊðSêiS˜‘8-v¶¹rÒu¨ÛŒ®™ÚöÕ`àÜ<PÓÐÏœËÁîúŽÆ=ÆSý×=Ü#=¢o-¬x7ü¾mø°Šaz ÀŽÀg›ò/júä0Qëœ=cÏd?øReQnç¾›ø†b:óÄ'ûå[ói-Š8ô%-Änq˜ösš„Yßöï66ôs±ŸÛ&·åDª·ºY3÷´9í»zÓ$ûë5àãä +xÚ¥Zm£Fþ>¿ÂßÎ#1ý4Ñé¤É¾\&íæv=º‹’|ÀÀØÜbp +Êú`ZFs‚ÄîXËpþT7DŸ²˜@§âUƒ;P}n¼J²È—;ÖÍ¢p”ÝçMy¢gEå$¡ IÓé¡LXÒŒ¸ð¶À§`€ê7À®s7±X‰é!ƒU‚3å…Ap‘~_2b@?ÆDñ b¡!Gk +÷ìúÀWlÇK’?yh{zþžÓíÜíeä7ÈìoTãàZae㳩 HÏE~ÄØ<uÄ€c –_BÈìAäâfÁëÆñ1Êž#²[›R~ñ}Yæ„=`g`ËO(ª +€©À¾\Ó5Éþwh»‹õž“ò·ýjötDˆa%ÆÇCX©u¨ãK>];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á¿çÒóÏ +õë ç<pK +aµÉd(Iå:B¶k䪯?óü•ówW]Xéù‘Œ (ãaéÙo3áù:ŽMŒí^Ïg` ˇœ½aG³Á¦ãųÝÄž@+¬o`#
í©î,HÒŽÂ{(DaÓG×ÐÉ^Å‚Ñb̤ËQ,`î-]ÁZEÐǤ$ö‰"Ô÷XìÛIçŠß’ÑúÁþP°Ôj(ì`3ðñ!ó(¥Æœ¬o%$5ô©ˆ +€èæ„ÁbËË|nDºÊapêÐXÿšý£§àüeæ¯yçØ¥ N×g—µªÝ<飑Ɗóœâ,÷ö¦T¤Z÷YÒå®YÍ}ÇWÛÕ÷à•PÜop}U!ç™ãÔóÇñS’ràÅ»v[ÊŒÆk~4Ê.y†íE¢¶àª¶æFj˜ñ…3`ÆG˜ñÊ€y <«ÊÓT‡îh[¬¸®Ñó¬æû-US`ï¶7¤uÒR¤(¾ÇÚ•Rjþð#’,#ŒÚòKTt)7SÏ·5•MŠ0iþTL+‡ÓèäîØ¿XȲè§jjÕ½°ô⤬…^ÖQç@P™Þ +*þ[Êá¿Ý6[ób0ŠÞØ^¬êÉÕ˜>ŽýÁ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‰ +ä¤ëP·=\3µí«ÁÀ¹y ¦¡ž9—‚Ýõ{Œ§ú¯+z¸GzDßZ&Xñnø}Û,ð3`;Ãô€9€Ï6å_:ÔôÉa¢Ö9/zÆžÉ~ð¥Ê¢ÜÎ}37=ð
Å0tæ‰O<ö'Ê·æÓZqèKZˆÝâ0íç4 ³¾íßmlèçb?·Mnˉ To
t³fîisÚwõ¦Iö[×kÀÇÉ$¨°ýÐåÌhÍkìò¤š>[4A endobj -1491 0 obj << +1565 0 obj << /Type /Page -/Contents 1492 0 R -/Resources 1490 0 R +/Contents 1566 0 R +/Resources 1564 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1489 0 R -/Annots [ 1497 0 R ] +/Parent 1535 0 R +/Annots [ 1571 0 R ] >> endobj -1497 0 obj << +1571 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<</Type/Action/S/URI/URI(ftp://ftp.auscert.org.au/pub/auscert/advisory/AL-1999.004.dns_dos)>> >> endobj -1493 0 obj << -/D [1491 0 R /XYZ 56.6929 794.5015 null] +1567 0 obj << +/D [1565 0 R /XYZ 56.6929 794.5015 null] >> endobj -534 0 obj << -/D [1491 0 R /XYZ 56.6929 723.0302 null] +566 0 obj << +/D [1565 0 R /XYZ 56.6929 723.0302 null] >> endobj -1498 0 obj << -/D [1491 0 R /XYZ 56.6929 689.3491 null] +1572 0 obj << +/D [1565 0 R /XYZ 56.6929 689.3491 null] >> endobj -538 0 obj << -/D [1491 0 R /XYZ 56.6929 552.677 null] +570 0 obj << +/D [1565 0 R /XYZ 56.6929 552.677 null] >> endobj -1499 0 obj << -/D [1491 0 R /XYZ 56.6929 525.9649 null] +1573 0 obj << +/D [1565 0 R /XYZ 56.6929 525.9649 null] >> endobj -542 0 obj << -/D [1491 0 R /XYZ 56.6929 411.5673 null] +574 0 obj << +/D [1565 0 R /XYZ 56.6929 411.5673 null] >> endobj -1500 0 obj << -/D [1491 0 R /XYZ 56.6929 383.9327 null] +1574 0 obj << +/D [1565 0 R /XYZ 56.6929 383.9327 null] >> endobj -546 0 obj << -/D [1491 0 R /XYZ 56.6929 225.6356 null] +578 0 obj << +/D [1565 0 R /XYZ 56.6929 225.6356 null] >> endobj -1245 0 obj << -/D [1491 0 R /XYZ 56.6929 193.4614 null] +1285 0 obj << +/D [1565 0 R /XYZ 56.6929 193.4614 null] >> endobj -1490 0 obj << -/Font << /F37 747 0 R /F67 1496 0 R /F23 682 0 R /F47 879 0 R /F11 1303 0 R /F39 863 0 R /F21 658 0 R /F53 962 0 R /F48 885 0 R /F62 995 0 R /F63 998 0 R >> -/XObject << /Im2 984 0 R >> +1564 0 obj << +/Font << /F37 779 0 R /F69 1570 0 R /F23 714 0 R /F39 873 0 R /F11 1343 0 R /F41 910 0 R /F21 690 0 R /F53 1002 0 R /F48 925 0 R /F62 1035 0 R /F63 1038 0 R >> +/XObject << /Im2 1024 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1503 0 obj << +1577 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 +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 endobj -1502 0 obj << +1576 0 obj << /Type /Page -/Contents 1503 0 R -/Resources 1501 0 R +/Contents 1577 0 R +/Resources 1575 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1489 0 R +/Parent 1579 0 R >> endobj -1504 0 obj << -/D [1502 0 R /XYZ 85.0394 794.5015 null] +1578 0 obj << +/D [1576 0 R /XYZ 85.0394 794.5015 null] >> endobj -1501 0 obj << -/Font << /F37 747 0 R /F23 682 0 R >> +1575 0 obj << +/Font << /F37 779 0 R /F23 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1507 0 obj << +1582 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0 endobj -1506 0 obj << +1581 0 obj << /Type /Page -/Contents 1507 0 R -/Resources 1505 0 R +/Contents 1582 0 R +/Resources 1580 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1489 0 R +/Parent 1579 0 R >> endobj -1508 0 obj << -/D [1506 0 R /XYZ 56.6929 794.5015 null] +1583 0 obj << +/D [1581 0 R /XYZ 56.6929 794.5015 null] >> endobj -1505 0 obj << +1580 0 obj << /ProcSet [ /PDF ] >> endobj -1511 0 obj << +1586 0 obj << /Length 1964 /Filter /FlateDecode >> @@ -6654,86 +6973,87 @@ i ·¥Ý3éÀ–yíˆùðŠ&Â8K<æcø¡›‚hïCû™<»úÐŒêhüýÔï Æס\@•‰ó÷w= vV ýf3GÕ51b‘æi‘diNŒ‘Œâ±ˆ±0·"ð0àâÄßZÕ7’\sÂw"ó‡&0ÍåþF—?$cRÍZº”í(õåŠ:éH^04g¢°û(½ÀÙWáÓ7˜¿S,[>°úŒ¹…;î3`ô¦'bÕÀ¤Ö^ïöEy˜]¹œÞv‹íçÞa¯Úák@n@þzh|ÇütÓOÓ0J¿mºã—¿ÞeÚâš(°ÁiÇEðá
êÍâÀz҃ѣm§žæˆ§çOŒ$ è×ØÚ:‰óÎÐÃ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ˆÌ¨W ¥Ìrcø-Š¼ûãËü -“¤%œ¡i±Iæ² —â~ÚøÑŸ/¯6³Âv¡ám’rá÷Î.zïá°ú‹EØûÛxà8KQ”×ñܼÍBw1\ýÎÆð»•s^ÀÍQŠ’säjMkç/Ú,ÜÚmR¡ÈEzís³ã¾‡ê +“¤%œ¡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ÿ¡’Œèendstream endobj -1510 0 obj << +1585 0 obj << /Type /Page -/Contents 1511 0 R -/Resources 1509 0 R +/Contents 1586 0 R +/Resources 1584 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1489 0 R -/Annots [ 1518 0 R 1519 0 R ] +/Parent 1579 0 R +/Annots [ 1593 0 R 1594 0 R ] >> endobj -1518 0 obj << +1593 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<</Type/Action/S/URI/URI(mailto:info@isc.org)>> >> endobj -1519 0 obj << +1594 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<</Type/Action/S/URI/URI(http://www.isc.org/services/support/)>> >> endobj -1512 0 obj << -/D [1510 0 R /XYZ 85.0394 794.5015 null] +1587 0 obj << +/D [1585 0 R /XYZ 85.0394 794.5015 null] >> endobj -550 0 obj << -/D [1510 0 R /XYZ 85.0394 769.5949 null] +582 0 obj << +/D [1585 0 R /XYZ 85.0394 769.5949 null] >> endobj -1513 0 obj << -/D [1510 0 R /XYZ 85.0394 576.7004 null] +1588 0 obj << +/D [1585 0 R /XYZ 85.0394 576.7004 null] >> endobj -554 0 obj << -/D [1510 0 R /XYZ 85.0394 576.7004 null] +586 0 obj << +/D [1585 0 R /XYZ 85.0394 576.7004 null] >> endobj -1514 0 obj << -/D [1510 0 R /XYZ 85.0394 548.3785 null] +1589 0 obj << +/D [1585 0 R /XYZ 85.0394 548.3785 null] >> endobj -558 0 obj << -/D [1510 0 R /XYZ 85.0394 548.3785 null] +590 0 obj << +/D [1585 0 R /XYZ 85.0394 548.3785 null] >> endobj -1515 0 obj << -/D [1510 0 R /XYZ 85.0394 518.5228 null] +1590 0 obj << +/D [1585 0 R /XYZ 85.0394 518.5228 null] >> endobj -562 0 obj << -/D [1510 0 R /XYZ 85.0394 460.6968 null] +594 0 obj << +/D [1585 0 R /XYZ 85.0394 460.6968 null] >> endobj -1516 0 obj << -/D [1510 0 R /XYZ 85.0394 425.0333 null] +1591 0 obj << +/D [1585 0 R /XYZ 85.0394 425.0333 null] >> endobj -566 0 obj << -/D [1510 0 R /XYZ 85.0394 260.2468 null] +598 0 obj << +/D [1585 0 R /XYZ 85.0394 260.2468 null] >> endobj -1517 0 obj << -/D [1510 0 R /XYZ 85.0394 224.698 null] +1592 0 obj << +/D [1585 0 R /XYZ 85.0394 224.698 null] >> endobj -1509 0 obj << -/Font << /F21 658 0 R /F23 682 0 R /F11 1303 0 R /F39 863 0 R >> +1584 0 obj << +/Font << /F21 690 0 R /F23 714 0 R /F11 1343 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1522 0 obj << +1597 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0 endobj -1521 0 obj << +1596 0 obj << /Type /Page -/Contents 1522 0 R -/Resources 1520 0 R +/Contents 1597 0 R +/Resources 1595 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1489 0 R +/Parent 1579 0 R >> endobj -1523 0 obj << -/D [1521 0 R /XYZ 56.6929 794.5015 null] +1598 0 obj << +/D [1596 0 R /XYZ 56.6929 794.5015 null] >> endobj -1520 0 obj << +1595 0 obj << /ProcSet [ /PDF ] >> endobj -1526 0 obj << +1601 0 obj << /Length 2543 /Filter /FlateDecode >> @@ -6746,41 +7066,41 @@ RÜŠ1ÏuL~”6`l¿‚~ZѨ¢<ÓCƒÚ̓ ’
r”OœBç=Á 1j"«¢ºÑpQɧUäzý"GöÄÙ G,ØÝfS6äÐBdz˜€z²Ó„Q™DÏ
B0q ã”U#7Cã@Q²€.ÿ¾ô ÝD‘øñðñ^=:\è±æí -®o¬ƒñ+ñ'E\2}8Ç’;i%Ò‡ï&ª°Wõ\~jÀaÛÍ{³˜¢GË!zeoA_^†NmÞxš^Xð”Ð;’ù‚Ïr{z8Ø'"Hóȃ…×UØNÑô +®o¬ƒñ+ñ'E\2}8Ç’;i%Ò‡ï&ª°Wõ\~jÀaÛÍ{³˜¢GË!zeoA_^†NmÞxš^Xð”Ð;’ù‚Ïr{z8Ø'"Hóȃ…×UØNÑô endobj -1525 0 obj << +1600 0 obj << /Type /Page -/Contents 1526 0 R -/Resources 1524 0 R +/Contents 1601 0 R +/Resources 1599 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1531 0 R +/Parent 1579 0 R >> endobj -1527 0 obj << -/D [1525 0 R /XYZ 85.0394 794.5015 null] +1602 0 obj << +/D [1600 0 R /XYZ 85.0394 794.5015 null] >> endobj -570 0 obj << -/D [1525 0 R /XYZ 85.0394 769.5949 null] +602 0 obj << +/D [1600 0 R /XYZ 85.0394 769.5949 null] >> endobj -1528 0 obj << -/D [1525 0 R /XYZ 85.0394 573.5449 null] +1603 0 obj << +/D [1600 0 R /XYZ 85.0394 573.5449 null] >> endobj -574 0 obj << -/D [1525 0 R /XYZ 85.0394 573.5449 null] +606 0 obj << +/D [1600 0 R /XYZ 85.0394 573.5449 null] >> endobj -1529 0 obj << -/D [1525 0 R /XYZ 85.0394 539.0037 null] +1604 0 obj << +/D [1600 0 R /XYZ 85.0394 539.0037 null] >> endobj -578 0 obj << -/D [1525 0 R /XYZ 85.0394 539.0037 null] +610 0 obj << +/D [1600 0 R /XYZ 85.0394 539.0037 null] >> endobj -1530 0 obj << -/D [1525 0 R /XYZ 85.0394 510.2426 null] +1605 0 obj << +/D [1600 0 R /XYZ 85.0394 510.2426 null] >> endobj -1524 0 obj << -/Font << /F21 658 0 R /F23 682 0 R >> +1599 0 obj << +/Font << /F21 690 0 R /F23 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1534 0 obj << +1608 0 obj << /Length 2893 /Filter /FlateDecode >> @@ -6789,843 +7109,864 @@ xÚksã¸í{~…¿Õ™‰IÔ3ÛéL.›ls×Ë¥‰;íÌíÍ”–h[]Yò‰r²¹__€ 'é<%Ø«Ô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‰§ -~H¿°OQ4Áæ:“¥$o…Ù=ŠR©–fì-DM¸û"çËm/Èá¤ÝÒÌNßöæ@1t$ê÷Š,s¸b,Â)PøTE&u;aBá9±èèðV$ÑÜ\{؆,CfáCƒUP9'°ÐßHI"ð掉zÛ›äÄ”‰ïˆDø¼ùuõöžè‚"FHÜm,$BŒëàæV4P}#¡ô -±AiÏK:·úCÛÅÂñCa×R¾_~à‰-³¤üœö -É‘9R P)0¦†Œi‚4`(M§6ó'óÃ^S(Wr7dg51™hïŸÏ=¨m/̹?5YŽ¥ÚlË7“ìÌ(Ø… ¾È5o]÷"L¸6xc0¡q²m -©—´¦5õÃD œ$ŒlH„r«å&Âçݳ5º?¾·hdµÁk+ §/-UçI0> +~H¿°OQ4Áæ:“¥$o…Ù=ŠR©–fì-DM¸û"çËm/Èá¤ÝÒÌNßöæ@1t$ê÷Š,ví-#‚؈p +þU‘IÝN˜PxN,::¼I47׶!ËYøÐ`TÎBÄ ,ôÆ·R’¼¹†c¢Dàö&ù0!eâ;">o~]½½'¤ +æíœH¸>ø8þzduÖ+ž™ ‰èMY¯0† Ð:„™¼‰(5Dòâ=@¶«‡›}´ÁãBnÑŠw|º»!&ñÅÔeúìûÁ'ãL'Ž©‡â àÎläࢩìÒG¯ÃÍqIô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%Û -·KÊÿóWÞþCw;"Iüé¸~œ8Ô¥V(<AêŸHn?ŸŠþ_a52…endstream +(–"—ÜYi4¹B™º¦qfèY'ÉíŽÑ–\z
¬nÌ\³&ÊKŸ ‰•v(Äð1“‘㣓Æ|ÒØŠž«Ëˆp}µ6eè£[SWöj›ŸMñ¢Âú`K@®Ö j]¼©VP%Û endobj -1533 0 obj << +1607 0 obj << /Type /Page -/Contents 1534 0 R -/Resources 1532 0 R +/Contents 1608 0 R +/Resources 1606 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1531 0 R -/Annots [ 1538 0 R 1539 0 R ] +/Parent 1579 0 R +/Annots [ 1612 0 R 1613 0 R ] >> endobj -1538 0 obj << +1612 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [253.7995 146.8976 417.685 158.9572] /Subtype/Link/A<</Type/Action/S/URI/URI(ftp://www.isi.edu/in-notes/)>> >> endobj -1539 0 obj << +1613 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [63.4454 108.9117 208.8999 119.0735] /Subtype/Link/A<</Type/Action/S/URI/URI(http://www.ietf.org/rfc/)>> >> endobj -1535 0 obj << -/D [1533 0 R /XYZ 56.6929 794.5015 null] +1609 0 obj << +/D [1607 0 R /XYZ 56.6929 794.5015 null] >> endobj -582 0 obj << -/D [1533 0 R /XYZ 56.6929 652.1213 null] +614 0 obj << +/D [1607 0 R /XYZ 56.6929 652.1213 null] >> endobj -1536 0 obj << -/D [1533 0 R /XYZ 56.6929 614.8935 null] +1610 0 obj << +/D [1607 0 R /XYZ 56.6929 614.8935 null] >> endobj -586 0 obj << -/D [1533 0 R /XYZ 56.6929 614.8935 null] +618 0 obj << +/D [1607 0 R /XYZ 56.6929 614.8935 null] >> endobj -1072 0 obj << -/D [1533 0 R /XYZ 56.6929 584.5024 null] +1112 0 obj << +/D [1607 0 R /XYZ 56.6929 584.5024 null] >> endobj -590 0 obj << -/D [1533 0 R /XYZ 56.6929 289.5256 null] +622 0 obj << +/D [1607 0 R /XYZ 56.6929 289.5256 null] >> endobj -1537 0 obj << -/D [1533 0 R /XYZ 56.6929 251.3901 null] +1611 0 obj << +/D [1607 0 R /XYZ 56.6929 251.3901 null] >> endobj -594 0 obj << -/D [1533 0 R /XYZ 56.6929 251.3901 null] +626 0 obj << +/D [1607 0 R /XYZ 56.6929 251.3901 null] >> endobj -900 0 obj << -/D [1533 0 R /XYZ 56.6929 222.7156 null] +940 0 obj << +/D [1607 0 R /XYZ 56.6929 222.7156 null] >> endobj -1540 0 obj << -/D [1533 0 R /XYZ 56.6929 53.7852 null] +1614 0 obj << +/D [1607 0 R /XYZ 56.6929 53.7852 null] >> endobj -1541 0 obj << -/D [1533 0 R /XYZ 56.6929 53.7852 null] +1615 0 obj << +/D [1607 0 R /XYZ 56.6929 53.7852 null] >> endobj -1532 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F47 879 0 R /F53 962 0 R /F11 1303 0 R /F39 863 0 R >> +1606 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R /F39 873 0 R /F53 1002 0 R /F11 1343 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1544 0 obj << +1618 0 obj << /Length 2824 /Filter /FlateDecode >> stream -xÚµZ]{£6¾Ï¯ð¥ý<-’ KÇö¤É4™4v·Ûα›g0¸g&ýõ{„>äζûä" ôâóžO <òà"†<ÊýQÈ}Ä<ÌFëý•7ÚÂÜíV2×ZèÚ–ºY]ýó
Gñ€£ÕgkyQ„G«ÍÇñôéiñ8¿û÷äš0o<E“kæyzt¶XN®Ã€‹ *¦o|swóã݇Ûçéӿʇ~ó˜7}œË›åÏ··‹åj¡nŸÓùÝã-ˆàɧÕýÕbe^ÛþiØ£â¿úøÉmàÞ_yˆòˆ¾Â‡0çd´¿òȨTdWË«ŸÌ‚ÖlýhŸª‹HØ£+‚G#Îi)‹qPBke-«8ßÄÇM9ø[¨(c—h²¤$4í£IK äÏïf $ÿS3EÞÝ m¤Î±}ÛD0c( +xÚµZ]{£6¾Ï¯ð¥ý<-’ KÇö¤É4™4v·Ûα›g0¸g&ýõ{„>äζûä" ôâóžO <òà"†<ÊýQÈ}Ä<ÌFëý•7ÚÂÜíV2×ZèÚ–ºY]ýó
Gñ€£ÕgkyQ„G«ÍÇñôéiñ8¿û÷äš0o<E“kæyzt¶XN®Ã€‹ *¦o|swóã݇Ûçéӿʇ~ó˜7}œË›åÏ··‹åj¡nŸÓùÝã-ˆàɧÕýÕbe^ÛþiØ£â¿úøÉmàÞ_yˆòˆ¾Â‡0çd´¿òȨTdWË«ŸÌ‚ÖlýhŸª‹HØ£+‚G#Îi)‹qPBke-«8ßÄÇM9ø[¨(c—h²¤$4í£IK äÏïf $ÿS3EÞÝ m¤Î±)·°1c( )kƒÏ‹}œæ’ÐÇxŸ”ŠwBBy5+òur¨Ô8èH^¼‹×i–ViRë«ó3qè!„¼ Àø‡|äi‚ £Érì¡X‰IuLK%õX¼&û—ä(ï0B4ÈÀVüKŒXRF´”Ås0₶éb0bƒ_dänÈ’}’Wq•y‡—å!Y§¿yYËÙsr&@¿ö’#oþ>Š(½@‘-5L‘‘ÒñÐá3N䆡3è~†ZØqš©Xœª4ßv8¨v‰¼°©\¾•U²ïs1Òç¼ÍÇLiÿ)>‚æ7ÛDßÇù)>¾ÕH-ÙŠpׄøˆG Z*~€O꥟ŽÅ¡(m)—^@Eäw–”ƒ;-eÜ‹s‡{9¡-òºØäÙàwùú8ÁÑXzâñ?E®([M0Æãcœ—ŸµkçË>ú|Œp ªèf1ˆ{²¶À,@^C-·{FæBþ¿9•;yµÈþЉ픽ý&A$¢ä–”ƒ -e˜ ^ä`Âm1ÑÅ`ÂL¶ ÒWÕâõÎT:è~:%Dz›r„I@úSÑ4ßÈÄ÷U×qq=°Þ½GÃz‡¦CP½ wKÊ¡w-eô„.pA[zïbèÝ_|«’¼4 Æ$§²“ŒòE?¼€;Ow½gF¡€ùŸóŽÃô1|‰KÊA–²( \Ð]ì -lðÇ"¿–EWrܧ¹®ÈŒÆe‚©£G²I¥¯ÃC$d´ßfÇø«`VØôëžêÞ^"ˆ|nÝÛRú7RF÷‘洞ÐîÏ°ûuß_&ª* lü>y“M¯UýEÐ䄼JMM’ÒEàBÂEVË»Û!„"/bØâj<nÀCüq:Ácå$”?¨©ÛÓfé»”E¡Ñx®fqY]˼o Zy?‹¿h—£-#0}Û2”_&œŒ“,ƒ\Iœ:XªôD<(›í$QQ~ÁN,)‡h)c'œz;qA[vÒÅ°¼e' i'"}—Uü’¥åN4S®˜¹z¿P;ŠÏÏC¡3âÈçAgÓh®8ô2¸L•µ#áfÈçˆr‰!KÊÁ–²r$2'´ÅP{€!Ü(û9ùý”èf,»ÇŸ…ÚÒmW'ImÙ%׫s\9äÆÔ”ðÿ7[#àKlYR¶´”f‹z^è`Ëm±ÕÅ`ËRZ?ß'jòj¨-ÀqM†|D·kâF¶k½Á#ƃ6IÎ0×ÞÛssƒ)è7–”ƒ-e¸ œ9ÑmqÓÅàÆ¿Mr¨¯…bÃP•V"Ú…Ü_Óu"§¦Ù¶€©Ý^ÎÉ°'ib%ÜËX =>(–éæT{-éÕp!è¿].e~ót^“§<®\ËÏüN9´Tô¿ÿç}õéì -¶º/ÓÃi&·hÞêß¡fÔ_¦/Å«=sß²²~e|–pu?øCœejîú*ló£ýû›<€æ©»¿Ù4ª
mõÖÒwm{RßCKqšµ-5lÖFʘ5!³vB7f}†ÝoÖ-ð»|SÛ˜n+Ÿ“²È^µ¢—§Ã¡8Vgçr1ëËԃرþØ?+ò£¡zž¬Ûᆠ-±ŠSzIï–”CïZÊè=¢Ô¡w´¥÷.ö€ÞmðÕNFƒ”/]xœ½•i)Źµfk
®ÕÖ\éL ®íLÐð©p’f¯M¬Šxõ%Í´Ü-ƒ‹g= P’Šàã@wFªžV‹¶êi Ó$“pŒ"^Ø#µ¥†É4RšLßs‘é„nÈ<Ãî'³^Ìí¼€y¾UÉ|\lN*²‹ÑZÁBX”disæлsùбØÅ”ÕĈç§òYèzº†11ú FŒª;òdw$^æ!.ËDGn¹9ª [œ6LjHp•IÿnÐφé0 -=|a¿Ô–rЯ¥,ú1Ô mÑßÅ ßWgU±.Ä.øÌC±él FD¥oíÕbD&&áÈMb‚;¹û}nýlŸ3C¯îs;s,“&,Ú63a;²}PâÚ,”G«•[ìëÞ2–Îñò_´¨‚™èÌÝvaI9ìBK5vá;΃Ж]t±ì¹TÖó¢8„È#ëB”õMm”F*ÊSU׉‹ÆÄÙì5,>}ñ}ʸ޴#š‰È21ú ÄMŒƒsu\bZFñ÷ÃY‚©À²¸ ¡£ùÈ -’Xï* -endobj -1543 0 obj << -/Type /Page -/Contents 1544 0 R -/Resources 1542 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1531 0 R ->> endobj -1545 0 obj << -/D [1543 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1546 0 obj << -/D [1543 0 R /XYZ 85.0394 752.3015 null] ->> endobj -1547 0 obj << -/D [1543 0 R /XYZ 85.0394 752.3015 null] ->> endobj -1548 0 obj << -/D [1543 0 R /XYZ 85.0394 752.3015 null] ->> endobj -1549 0 obj << -/D [1543 0 R /XYZ 85.0394 746.3107 null] ->> endobj -1550 0 obj << -/D [1543 0 R /XYZ 85.0394 731.5461 null] ->> endobj -1551 0 obj << -/D [1543 0 R /XYZ 85.0394 728.1497 null] ->> endobj -1552 0 obj << -/D [1543 0 R /XYZ 85.0394 713.3851 null] ->> endobj -1553 0 obj << -/D [1543 0 R /XYZ 85.0394 709.9887 null] ->> endobj -1554 0 obj << -/D [1543 0 R /XYZ 85.0394 651.9592 null] ->> endobj -1016 0 obj << -/D [1543 0 R /XYZ 85.0394 651.9592 null] ->> endobj -1555 0 obj << -/D [1543 0 R /XYZ 85.0394 651.9592 null] ->> endobj -1556 0 obj << -/D [1543 0 R /XYZ 85.0394 648.8377 null] ->> endobj -1557 0 obj << -/D [1543 0 R /XYZ 85.0394 634.0731 null] ->> endobj -1558 0 obj << -/D [1543 0 R /XYZ 85.0394 630.6767 null] ->> endobj -1559 0 obj << -/D [1543 0 R /XYZ 85.0394 615.9121 null] ->> endobj -1560 0 obj << -/D [1543 0 R /XYZ 85.0394 612.5156 null] ->> endobj -1561 0 obj << -/D [1543 0 R /XYZ 85.0394 585.7959 null] ->> endobj -1562 0 obj << -/D [1543 0 R /XYZ 85.0394 582.3994 null] ->> endobj -1563 0 obj << -/D [1543 0 R /XYZ 85.0394 567.6349 null] ->> endobj -1564 0 obj << -/D [1543 0 R /XYZ 85.0394 564.2384 null] ->> endobj -1565 0 obj << -/D [1543 0 R /XYZ 85.0394 549.5337 null] ->> endobj -1566 0 obj << -/D [1543 0 R /XYZ 85.0394 546.0774 null] ->> endobj -1567 0 obj << -/D [1543 0 R /XYZ 85.0394 531.3128 null] ->> endobj -1568 0 obj << -/D [1543 0 R /XYZ 85.0394 527.9163 null] ->> endobj -1569 0 obj << -/D [1543 0 R /XYZ 85.0394 513.1518 null] ->> endobj -1570 0 obj << -/D [1543 0 R /XYZ 85.0394 509.7553 null] ->> endobj -1571 0 obj << -/D [1543 0 R /XYZ 85.0394 483.0356 null] ->> endobj -1572 0 obj << -/D [1543 0 R /XYZ 85.0394 479.6391 null] ->> endobj -1573 0 obj << -/D [1543 0 R /XYZ 85.0394 464.8745 null] ->> endobj -1574 0 obj << -/D [1543 0 R /XYZ 85.0394 461.4781 null] ->> endobj -1575 0 obj << -/D [1543 0 R /XYZ 85.0394 446.7135 null] ->> endobj -1576 0 obj << -/D [1543 0 R /XYZ 85.0394 443.3171 null] ->> endobj -1577 0 obj << -/D [1543 0 R /XYZ 85.0394 428.5525 null] ->> endobj -1578 0 obj << -/D [1543 0 R /XYZ 85.0394 425.156 null] ->> endobj -1579 0 obj << -/D [1543 0 R /XYZ 85.0394 355.0758 null] ->> endobj -1580 0 obj << -/D [1543 0 R /XYZ 85.0394 355.0758 null] ->> endobj -1581 0 obj << -/D [1543 0 R /XYZ 85.0394 355.0758 null] ->> endobj -1582 0 obj << -/D [1543 0 R /XYZ 85.0394 352.0499 null] ->> endobj -1583 0 obj << -/D [1543 0 R /XYZ 85.0394 337.3452 null] ->> endobj -1584 0 obj << -/D [1543 0 R /XYZ 85.0394 333.8889 null] ->> endobj -1585 0 obj << -/D [1543 0 R /XYZ 85.0394 309.8192 null] ->> endobj -1586 0 obj << -/D [1543 0 R /XYZ 85.0394 303.7727 null] ->> endobj -1587 0 obj << -/D [1543 0 R /XYZ 85.0394 278.3282 null] ->> endobj -1588 0 obj << -/D [1543 0 R /XYZ 85.0394 273.6565 null] ->> endobj -1589 0 obj << -/D [1543 0 R /XYZ 85.0394 246.9367 null] ->> endobj -1590 0 obj << -/D [1543 0 R /XYZ 85.0394 243.5403 null] ->> endobj -1591 0 obj << -/D [1543 0 R /XYZ 85.0394 173.5556 null] ->> endobj -1592 0 obj << -/D [1543 0 R /XYZ 85.0394 173.5556 null] ->> endobj -1593 0 obj << -/D [1543 0 R /XYZ 85.0394 173.5556 null] ->> endobj -1594 0 obj << -/D [1543 0 R /XYZ 85.0394 170.4341 null] ->> endobj -1595 0 obj << -/D [1543 0 R /XYZ 85.0394 144.9896 null] ->> endobj -1596 0 obj << -/D [1543 0 R /XYZ 85.0394 140.3179 null] ->> endobj -1597 0 obj << -/D [1543 0 R /XYZ 85.0394 113.5982 null] ->> endobj -1598 0 obj << -/D [1543 0 R /XYZ 85.0394 110.2017 null] ->> endobj -1599 0 obj << -/D [1543 0 R /XYZ 85.0394 95.4372 null] ->> endobj -1600 0 obj << -/D [1543 0 R /XYZ 85.0394 92.0407 null] ->> endobj -1542 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F47 879 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1603 0 obj << -/Length 2889 -/Filter /FlateDecode ->> -stream -xÚµš[w›º€ßó+üh¯Õh£·G»‰ÛÄͱ“ž½WwˆMV0¤·Í¿?#tA`Ý笳ò
֧͌ÀþðÄõ’p⇹v'Ûý™3ù}WgXÊœ+¡sSêâþì÷ÔŸ„(ôˆ7¹2Æ -xr¿û2E3Á™^,/n–Ÿ®ÖÑÝõ_³sâ:ӿ׉Vsq³y¸ºZlîòv½ˆæËÕˆàÙ¹ï…Î4º»[¬æË?EÄGutëåb3ûzÿálq¯_ÛüiØ¡ü¿Ÿ}ùêLvð?œ9ˆ†;ù 7ÂaH&û3æRä2JUKv¶9û—Ðèí*ì B=Ò3WO0F¡ë’Öd¹!ò(¡õd“²8¶‰œ‚d[vâú~3ðöš”ƒ¿’bä» -vL+õà%ø@ïà)âL/ÑûYH¦HŒ±ø‘f8˜>LJªÀÓÙÕÿÉô6ÞÇ/E){ײ÷!ËöqžËAã|'šïf˜„jðÛbû¿&Õ!…§áý`&Ô+‹e ìãÓ¶*á=jÊ°è4DØCxl„°)5LXKi¾ã
¶ªnŸèî%ÜÒ-ÀÂO_m¢;µì¹p0mCèźýÐ
Ì Äÿ[€”æßÄÀÄG“½—E–dY,Ÿér`Ã|ÐO±?ÂÁ²pPRšCàÛ8ØTººû9˜º#¾–ýémƒ9Á¥7}*¢mñ뵦‘”¥˜Lè¼)¶17=!±ÌAx¯¼i*;ªçD\Ì‹}œÊÎU¼—›·²Jö=X©ƒ‘˽hƒ•b°^9Xü#-e[csÐñyæºÓôWšH‹ÓÃœkÇ£ÝÏ|6Eï:«b)WÅ<ݾ¤yYäRàCœãÛ^Þðº`°í1:fŸ†”e]()µ.ˆã˺°©6ÖEWwÿº0uú ØfJ1«ý/o¨W¿Ø¼&Ûôé^ü¾FÎ%›%›‹')ž~¤Û¤D=Ô‰"L‰AaîŠù“WÇìñ -jt¼G¯~c¬úqe×õ‚ÐZÂN{»îH`dJY¨*)M{–}ÕªÚ ÚÕÝOÕÔý ,fBò‚‹e^%‡<©Ä - - -þC§)vŽ¶á‘·‘±02Š ÅØâ^-J
~mýô<ÐÝ\GçX`Èl„ÈP—Â%D‹L^àJj±ªÞ£z‹uõ7®G¶Ë -<¢8´3„†)!
Ì
-¥›ÞXWq/0S±¨¡þª’¼¬O*avDMþ—Ç××âP ¡åhü‘JQ6‡F¯¯2ãcäx¡±2âN7H<qÿ\ìE¾À[/eëõ1[eëg]0‡®ešÇy%»D -ͪ§µµiqLË2í«ÿ -w,!0¥,””Në(¶ìZVÕ†®î~¦îË,.ËL‡‚ËÕy4Ÿ¯Q´Þ%úé†åw&ûZUUÒ]ž('t%w’æU=÷EQu¿Âèx¶æ(¿Ùð¹.†ìÎÁÁȱ½)eA¦¤4²€X¢I«jYWw?2S÷2ºP[/Q$ÛçÜS¦>gÚs'÷¡îaÓCž~?&Ý`ôn:®ç·Á¶e$Q@XÙ±Ô‹"îTÐ~§rÀÏƾ²0„†i)¡¦lB,•j›Þ†UWq/*S±öq,P>Ž…ÜÇÍ ®Ý;UL\F«H\]B®î’C<ô}#/iz¤uú#Ö)5<n¦ÔÐl¤Ô¼S -]Ô…<Ažÿ»¶¶,Kã½úbQ+iÅþÚX;ŸÙ
š–:‹‹ø÷´=“ïè˜ôþlרŠûˆÁ@ðBü +lðÇ"¿–EWrܧ¹®ÈŒÆe‚©£G²I¥¯ÃC$d´ßfÇø«`VØôëžêÞ^"ˆ|nÝÛRú7RF÷‘洞ÐîÏ°ûuß_&ª* lü>y“M¯UýEÐ䄼JMM’ÒEàBÂEVË»Û!„"/bØâj<nÀCüq:Ácå$”?¨©ÛÓfé»”E¡Ñx®fqY]˼o Zy?‹¿h—£-#0}Û2”_&œŒ“,ƒ\Iœ:XªôD<(›í$QêÝvbI9ìDK;áÔs؉ڲ“.ö€Øà-;H;黬â—,-w¢™rÅÌÕû…ÚQ|~ +G>:›Fsʼn wÁer¨¬ 7C>GŒKYR†´”Å#‘9¡-†ºØÙàFÙÏÉï§D‡4cÙ=þ,Ô–nó¸:Ijˆ,é¼^ãÊ!7ö Ö „ÿ¿Ù¢Ñ +¼ú’æ +Zî–Áųž„N(IEHðq ;#UO«E[õ4é’I8F/ì‘ÚRÃd)M¦ï¹ÈtB7dža÷“Ù¯æv^À<ߪ€d>.6'ÙÅh`!,J²´9sèݹ‰|èXìbÊ‹jbÄóSù,t=Ý Ã˜}P£?ÆGÕy²;/ó—e¢#·ÜU-N›cD¤¸Ê¤·ègÃô…¾°_jK9è×RýŽê„¶èïbÐoƒ«3ŠªXb—|æ¡Øt6P#¢Ò·öj1"“pä&1ÁÜ}‚>·~¶Ï™¡W÷¹¿9–Im›…™°YŒ>(qmÊ£ÕÊ-öuoKçxù/ÚTÁLtæn»°¤v¡¥»ðçÁNhË.ºØvaƒ‹\*ëyQB䇑u!JŒú¦¶J#婪ëÄEcâÎìFöŸ¾øÖ¾ e\oÚ‰ÍDdƒ}Pâ&FˆÁ¹:.1-£ø{Œá¬€AáT`ÙÜÐÐÑ|ä +X9Sƒ35ø˜€´I:zÝÏÞsç¤Û¡8óf™9ñý>“à"~¸-Â6-Ô|P9N\¸9tûÁF^&ÇT•<žškZoI$Uºî«2!3ÿütÖÅ´çâ¸ö{?’ˆ<±¡þ·„†®…š4ïúìË…Û(¼Ü¯pÙxÔùiù’ìâ×Td},»…®ÖLKç„}R[‹ÈªFïž^y5ݨYÈ°½Ž@óañEXóDý*Å1-wiKIŒ¯„—(™û4ß'©vB½fkÉ>Ü®Þ U‹Op{Të™Üþ—¿ôµvCD£hà0zŠõK‰_ÁÃî››O‚Ï_ý¿m1bªendstream endobj -1602 0 obj << +1617 0 obj << /Type /Page -/Contents 1603 0 R -/Resources 1601 0 R +/Contents 1618 0 R +/Resources 1616 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1531 0 R ->> endobj -1604 0 obj << -/D [1602 0 R /XYZ 56.6929 794.5015 null] ->> endobj -1605 0 obj << -/D [1602 0 R /XYZ 56.6929 748.5056 null] ->> endobj -1606 0 obj << -/D [1602 0 R /XYZ 56.6929 748.5056 null] ->> endobj -1607 0 obj << -/D [1602 0 R /XYZ 56.6929 748.5056 null] ->> endobj -1608 0 obj << -/D [1602 0 R /XYZ 56.6929 743.7078 null] ->> endobj -1609 0 obj << -/D [1602 0 R /XYZ 56.6929 719.6381 null] ->> endobj -1610 0 obj << -/D [1602 0 R /XYZ 56.6929 711.8197 null] ->> endobj -1611 0 obj << -/D [1602 0 R /XYZ 56.6929 697.0552 null] ->> endobj -1612 0 obj << -/D [1602 0 R /XYZ 56.6929 691.8868 null] ->> endobj -1613 0 obj << -/D [1602 0 R /XYZ 56.6929 665.1671 null] ->> endobj -1614 0 obj << -/D [1602 0 R /XYZ 56.6929 659.9987 null] ->> endobj -1615 0 obj << -/D [1602 0 R /XYZ 56.6929 635.929 null] ->> endobj -1616 0 obj << -/D [1602 0 R /XYZ 56.6929 628.1106 null] ->> endobj -1617 0 obj << -/D [1602 0 R /XYZ 56.6929 601.3909 null] ->> endobj -1618 0 obj << -/D [1602 0 R /XYZ 56.6929 596.2225 null] +/Parent 1675 0 R >> endobj 1619 0 obj << -/D [1602 0 R /XYZ 56.6929 569.5028 null] +/D [1617 0 R /XYZ 85.0394 794.5015 null] >> endobj 1620 0 obj << -/D [1602 0 R /XYZ 56.6929 564.3344 null] +/D [1617 0 R /XYZ 85.0394 752.3015 null] >> endobj 1621 0 obj << -/D [1602 0 R /XYZ 56.6929 549.6297 null] +/D [1617 0 R /XYZ 85.0394 752.3015 null] >> endobj 1622 0 obj << -/D [1602 0 R /XYZ 56.6929 544.4015 null] +/D [1617 0 R /XYZ 85.0394 752.3015 null] >> endobj 1623 0 obj << -/D [1602 0 R /XYZ 56.6929 529.6968 null] +/D [1617 0 R /XYZ 85.0394 746.3107 null] >> endobj 1624 0 obj << -/D [1602 0 R /XYZ 56.6929 524.4686 null] +/D [1617 0 R /XYZ 85.0394 731.5461 null] >> endobj 1625 0 obj << -/D [1602 0 R /XYZ 56.6929 500.3989 null] +/D [1617 0 R /XYZ 85.0394 728.1497 null] >> endobj 1626 0 obj << -/D [1602 0 R /XYZ 56.6929 492.5805 null] +/D [1617 0 R /XYZ 85.0394 713.3851 null] >> endobj 1627 0 obj << -/D [1602 0 R /XYZ 56.6929 467.136 null] +/D [1617 0 R /XYZ 85.0394 709.9887 null] >> endobj 1628 0 obj << -/D [1602 0 R /XYZ 56.6929 460.6924 null] +/D [1617 0 R /XYZ 85.0394 651.9592 null] +>> endobj +1056 0 obj << +/D [1617 0 R /XYZ 85.0394 651.9592 null] >> endobj 1629 0 obj << -/D [1602 0 R /XYZ 56.6929 436.6227 null] +/D [1617 0 R /XYZ 85.0394 651.9592 null] >> endobj 1630 0 obj << -/D [1602 0 R /XYZ 56.6929 428.8043 null] +/D [1617 0 R /XYZ 85.0394 648.8377 null] >> endobj 1631 0 obj << -/D [1602 0 R /XYZ 56.6929 414.0996 null] +/D [1617 0 R /XYZ 85.0394 634.0731 null] >> endobj 1632 0 obj << -/D [1602 0 R /XYZ 56.6929 408.8714 null] +/D [1617 0 R /XYZ 85.0394 630.6767 null] >> endobj 1633 0 obj << -/D [1602 0 R /XYZ 56.6929 382.1516 null] +/D [1617 0 R /XYZ 85.0394 615.9121 null] >> endobj 1634 0 obj << -/D [1602 0 R /XYZ 56.6929 376.9833 null] +/D [1617 0 R /XYZ 85.0394 612.5156 null] >> endobj 1635 0 obj << -/D [1602 0 R /XYZ 56.6929 350.2636 null] +/D [1617 0 R /XYZ 85.0394 585.7959 null] >> endobj 1636 0 obj << -/D [1602 0 R /XYZ 56.6929 345.0952 null] +/D [1617 0 R /XYZ 85.0394 582.3994 null] >> endobj 1637 0 obj << -/D [1602 0 R /XYZ 56.6929 321.0255 null] +/D [1617 0 R /XYZ 85.0394 567.6349 null] >> endobj 1638 0 obj << -/D [1602 0 R /XYZ 56.6929 313.2071 null] +/D [1617 0 R /XYZ 85.0394 564.2384 null] >> endobj 1639 0 obj << -/D [1602 0 R /XYZ 56.6929 298.5024 null] +/D [1617 0 R /XYZ 85.0394 549.5337 null] >> endobj 1640 0 obj << -/D [1602 0 R /XYZ 56.6929 293.2742 null] +/D [1617 0 R /XYZ 85.0394 546.0774 null] >> endobj 1641 0 obj << -/D [1602 0 R /XYZ 56.6929 267.8297 null] +/D [1617 0 R /XYZ 85.0394 531.3128 null] >> endobj 1642 0 obj << -/D [1602 0 R /XYZ 56.6929 261.3861 null] +/D [1617 0 R /XYZ 85.0394 527.9163 null] >> endobj 1643 0 obj << -/D [1602 0 R /XYZ 56.6929 199.468 null] +/D [1617 0 R /XYZ 85.0394 513.1518 null] >> endobj 1644 0 obj << -/D [1602 0 R /XYZ 56.6929 199.468 null] +/D [1617 0 R /XYZ 85.0394 509.7553 null] >> endobj 1645 0 obj << -/D [1602 0 R /XYZ 56.6929 199.468 null] +/D [1617 0 R /XYZ 85.0394 483.0356 null] >> endobj 1646 0 obj << -/D [1602 0 R /XYZ 56.6929 191.7053 null] +/D [1617 0 R /XYZ 85.0394 479.6391 null] >> endobj 1647 0 obj << -/D [1602 0 R /XYZ 56.6929 176.9408 null] +/D [1617 0 R /XYZ 85.0394 464.8745 null] >> endobj 1648 0 obj << -/D [1602 0 R /XYZ 56.6929 171.7724 null] +/D [1617 0 R /XYZ 85.0394 461.4781 null] >> endobj 1649 0 obj << -/D [1602 0 R /XYZ 56.6929 157.0677 null] +/D [1617 0 R /XYZ 85.0394 446.7135 null] >> endobj 1650 0 obj << -/D [1602 0 R /XYZ 56.6929 151.8395 null] +/D [1617 0 R /XYZ 85.0394 443.3171 null] >> endobj 1651 0 obj << -/D [1602 0 R /XYZ 56.6929 137.1348 null] +/D [1617 0 R /XYZ 85.0394 428.5525 null] >> endobj 1652 0 obj << -/D [1602 0 R /XYZ 56.6929 131.9066 null] +/D [1617 0 R /XYZ 85.0394 425.156 null] >> endobj 1653 0 obj << -/D [1602 0 R /XYZ 56.6929 117.2018 null] +/D [1617 0 R /XYZ 85.0394 355.0758 null] >> endobj 1654 0 obj << -/D [1602 0 R /XYZ 56.6929 111.9736 null] +/D [1617 0 R /XYZ 85.0394 355.0758 null] >> endobj 1655 0 obj << -/D [1602 0 R /XYZ 56.6929 97.2091 null] +/D [1617 0 R /XYZ 85.0394 355.0758 null] >> endobj 1656 0 obj << -/D [1602 0 R /XYZ 56.6929 92.0407 null] +/D [1617 0 R /XYZ 85.0394 352.0499 null] >> endobj -1601 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F47 879 0 R >> -/ProcSet [ /PDF /Text ] +1657 0 obj << +/D [1617 0 R /XYZ 85.0394 337.3452 null] >> endobj -1659 0 obj << -/Length 2544 -/Filter /FlateDecode ->> -stream -xÚ¥ZKs㸾ûWè(U€ øÈM¶l&3¶#y²IÍî–`™ŠTHʳ³¿>
âA" ɦ|0 4ñýu7º›ÂxS‘$˜DIàQ„éd{¸B“=ÌÝ_a)3WBsSêúùê/w$š$^úáäùÕX+öPãÉóîÛtñôtû°\ýs6÷)š.¼Ùœ"¤Fon7³y&|‚ð©M¯WןW÷ëÅÓlj‡~E-–âfóõþþvó|+o×·‹åêáDðì·çOW·ÏúµÍaDø;ÿçêÛoh²ƒ~ºBIb:ù7ÈÃIâOW%
Q#ùÕæêïzAc¶}tLU”ÄýhDW>ž`ì%”ú=eÑĉOZe-6b[GV¥MVµuWÃ[\ Kˈ cd Žþm}wŠ"¿
11E^œÀû;@µÌ50MSêÅ¡&ì²<¤Y!öîY‘Õ
l¾¬j1Vvºhï÷§lÇ<þŽƒ-ázAÆðB|ÝBü‹'þ.Xsjâ¡|g‡V‰;œÄ‘gU6çKr¨Ûr(\Ii•S9Tî‚6”>Ķ¨Ý¿)‡R*^[Þ2mRqu—åL\ݔůùû“àAÞVÕÇSNÓ Ì HŸŠ§ö“©äãš±ªa‡TÎ=n›Ò #!V2ÂúªL);ZJ“‘`ßN†º#ã{œŒø(:¤¹ôb÷g)ñ1õÂ8öû”,ieúÆ{©fñô”V?4#¡‘vNQ|CÊÁˆ’RŒø##.hƒ‘!¶…üLù7UÖ°*“îñZJc]—e##Jz³aÕ;«êÑ(Åà‚qØçáZòð%-Š¬ØØî9Î?f”N³ß3fñO 0Âhê„,I!M’I\ƒ£°…"ùk-Õ]¾g‘giÍêS¬ù^Vÿî(ʶlœ£0ö"?ÆO’é!Ëåtš¤µœþ…ûQ•íßA‘‚ì%sŸ$¥WÌ߃V¸*Àæ -i‡ÙL‚™‡&7;kž@£Ä‹¾)˜RvÖµ”¦=ö©v'tÇûö8ñ=ðì<§Ï3Œ10°Ï[½„(ßGSöò×ÙœþtU×§Ö -`¦µxf…ã‡âR+¦[%òñHQ -ͳpUÉç[BX#îŽ"â6å¶ÌÇ¢.ñ¡Ä<`µ¸ëj¤uk“¹–ŸÓ†¾L3Ø¢2ÃTÆd!dõuD^FhK!E: G@vᜀ-”È?1’ÐŽCHGh‡Å.ŽÇ<ÛêôFx5±Z>,TÉ0<& `&„ÁC] -/¦”O-ÕñIÉ£ºãó{œÏøB÷FßYѵEï”Kɬ`à|*û㽜ÚÑ]9+áU}ŒÖÛtÙî&6Fãà/ƒ)¤Sz9j8®AÊ -§ý©n4‰•%ˆtÓ`ÙYPBÝ'©ÈQG»p;†Àã˜ÈÂÉb§áY…Hvà¾)ù³¸†A•áÊ8åÀ~/öê»~¬¼VY³âÄ-}¼'`(ŠÌ¦Gœºâ>]ݲòÜ”öÜêF}î<eÆï4>òŸùüÄÓ -2jëHøÿûYF2òHlë¹B¦žDê¥øæ:|sýËóWÿ/ÿ÷Ãendstream -endobj 1658 0 obj << -/Type /Page -/Contents 1659 0 R -/Resources 1657 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1531 0 R +/D [1617 0 R /XYZ 85.0394 333.8889 null] +>> endobj +1659 0 obj << +/D [1617 0 R /XYZ 85.0394 309.8192 null] >> endobj 1660 0 obj << -/D [1658 0 R /XYZ 85.0394 794.5015 null] +/D [1617 0 R /XYZ 85.0394 303.7727 null] >> endobj 1661 0 obj << -/D [1658 0 R /XYZ 85.0394 748.4854 null] +/D [1617 0 R /XYZ 85.0394 278.3282 null] >> endobj 1662 0 obj << -/D [1658 0 R /XYZ 85.0394 748.4854 null] +/D [1617 0 R /XYZ 85.0394 273.6565 null] >> endobj 1663 0 obj << -/D [1658 0 R /XYZ 85.0394 748.4854 null] +/D [1617 0 R /XYZ 85.0394 246.9367 null] >> endobj 1664 0 obj << -/D [1658 0 R /XYZ 85.0394 743.3452 null] +/D [1617 0 R /XYZ 85.0394 243.5403 null] >> endobj 1665 0 obj << -/D [1658 0 R /XYZ 85.0394 728.6405 null] +/D [1617 0 R /XYZ 85.0394 173.5556 null] >> endobj 1666 0 obj << -/D [1658 0 R /XYZ 85.0394 723.1655 null] +/D [1617 0 R /XYZ 85.0394 173.5556 null] >> endobj 1667 0 obj << -/D [1658 0 R /XYZ 85.0394 708.4607 null] +/D [1617 0 R /XYZ 85.0394 173.5556 null] >> endobj 1668 0 obj << -/D [1658 0 R /XYZ 85.0394 702.9857 null] +/D [1617 0 R /XYZ 85.0394 170.4341 null] >> endobj 1669 0 obj << -/D [1658 0 R /XYZ 85.0394 688.2211 null] +/D [1617 0 R /XYZ 85.0394 144.9896 null] >> endobj 1670 0 obj << -/D [1658 0 R /XYZ 85.0394 682.8059 null] +/D [1617 0 R /XYZ 85.0394 140.3179 null] >> endobj 1671 0 obj << -/D [1658 0 R /XYZ 85.0394 668.0414 null] +/D [1617 0 R /XYZ 85.0394 113.5982 null] >> endobj 1672 0 obj << -/D [1658 0 R /XYZ 85.0394 662.6262 null] +/D [1617 0 R /XYZ 85.0394 110.2017 null] >> endobj 1673 0 obj << -/D [1658 0 R /XYZ 85.0394 599.7666 null] +/D [1617 0 R /XYZ 85.0394 95.4372 null] >> endobj 1674 0 obj << -/D [1658 0 R /XYZ 85.0394 599.7666 null] ->> endobj -1675 0 obj << -/D [1658 0 R /XYZ 85.0394 599.7666 null] ->> endobj -1676 0 obj << -/D [1658 0 R /XYZ 85.0394 591.7571 null] +/D [1617 0 R /XYZ 85.0394 92.0407 null] >> endobj -1677 0 obj << -/D [1658 0 R /XYZ 85.0394 565.0374 null] +1616 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F39 873 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 1678 0 obj << -/D [1658 0 R /XYZ 85.0394 559.6222 null] +/Length 2889 +/Filter /FlateDecode +>> +stream +xÚµšMsÛ8†ïþ:JU1† +< +}w„°i5LX[iÂã¶J7„O´{ ·´Xøé«M|§–=w¦í½˜A;ˆ‚ÈÀöHü¿HiþM|˜øh²÷²ÈX–%òž.w˜C +†•…‚²Ò`¯·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º¦i5S[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[ +id„ý4¦Õ0m¥Ñ¡¥ +°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Å‘˜a4Li`^d)
Øt`]á^`¦°¨¡†p"üU±¼¬ŸTÂ숚*ü/¯¯Å¡FË;ÑøƒJQ6‡F¿¯2`äø‘±ºÄ›n¸ãþ¹Ø‹|·^ÊÖëc +¾šÈÖϺ`]Ë4OòJv‰šU
N«µƒiqLË2í«ÿ +ŒÛÏ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‘‡ü€ºíÉÿ ã +.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ñ +endobj +1677 0 obj << +/Type /Page +/Contents 1678 0 R +/Resources 1676 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1675 0 R >> endobj 1679 0 obj << -/D [1658 0 R /XYZ 85.0394 534.1777 null] +/D [1677 0 R /XYZ 56.6929 794.5015 null] >> endobj 1680 0 obj << -/D [1658 0 R /XYZ 85.0394 527.4872 null] +/D [1677 0 R /XYZ 56.6929 748.5056 null] >> endobj 1681 0 obj << -/D [1658 0 R /XYZ 85.0394 502.0427 null] +/D [1677 0 R /XYZ 56.6929 748.5056 null] >> endobj 1682 0 obj << -/D [1658 0 R /XYZ 85.0394 495.3523 null] +/D [1677 0 R /XYZ 56.6929 748.5056 null] >> endobj 1683 0 obj << -/D [1658 0 R /XYZ 85.0394 420.5376 null] +/D [1677 0 R /XYZ 56.6929 743.7078 null] >> endobj 1684 0 obj << -/D [1658 0 R /XYZ 85.0394 420.5376 null] +/D [1677 0 R /XYZ 56.6929 719.6381 null] >> endobj 1685 0 obj << -/D [1658 0 R /XYZ 85.0394 420.5376 null] +/D [1677 0 R /XYZ 56.6929 711.8197 null] >> endobj 1686 0 obj << -/D [1658 0 R /XYZ 85.0394 412.5281 null] +/D [1677 0 R /XYZ 56.6929 697.0552 null] >> endobj 1687 0 obj << -/D [1658 0 R /XYZ 85.0394 388.4584 null] +/D [1677 0 R /XYZ 56.6929 691.8868 null] >> endobj 1688 0 obj << -/D [1658 0 R /XYZ 85.0394 380.3932 null] +/D [1677 0 R /XYZ 56.6929 665.1671 null] >> endobj 1689 0 obj << -/D [1658 0 R /XYZ 85.0394 365.6884 null] +/D [1677 0 R /XYZ 56.6929 659.9987 null] >> endobj 1690 0 obj << -/D [1658 0 R /XYZ 85.0394 360.2134 null] +/D [1677 0 R /XYZ 56.6929 635.929 null] >> endobj 1691 0 obj << -/D [1658 0 R /XYZ 85.0394 345.4488 null] +/D [1677 0 R /XYZ 56.6929 628.1106 null] >> endobj 1692 0 obj << -/D [1658 0 R /XYZ 85.0394 340.0336 null] +/D [1677 0 R /XYZ 56.6929 601.3909 null] >> endobj 1693 0 obj << -/D [1658 0 R /XYZ 85.0394 325.269 null] +/D [1677 0 R /XYZ 56.6929 596.2225 null] >> endobj 1694 0 obj << -/D [1658 0 R /XYZ 85.0394 319.8539 null] +/D [1677 0 R /XYZ 56.6929 569.5028 null] >> endobj 1695 0 obj << -/D [1658 0 R /XYZ 85.0394 295.7842 null] +/D [1677 0 R /XYZ 56.6929 564.3344 null] >> endobj 1696 0 obj << -/D [1658 0 R /XYZ 85.0394 287.7189 null] +/D [1677 0 R /XYZ 56.6929 549.6297 null] >> endobj 1697 0 obj << -/D [1658 0 R /XYZ 85.0394 272.9543 null] +/D [1677 0 R /XYZ 56.6929 544.4015 null] >> endobj 1698 0 obj << -/D [1658 0 R /XYZ 85.0394 267.5392 null] +/D [1677 0 R /XYZ 56.6929 529.6968 null] >> endobj 1699 0 obj << -/D [1658 0 R /XYZ 85.0394 252.7746 null] +/D [1677 0 R /XYZ 56.6929 524.4686 null] >> endobj 1700 0 obj << -/D [1658 0 R /XYZ 85.0394 247.3594 null] +/D [1677 0 R /XYZ 56.6929 500.3989 null] >> endobj 1701 0 obj << -/D [1658 0 R /XYZ 85.0394 223.2897 null] +/D [1677 0 R /XYZ 56.6929 492.5805 null] >> endobj 1702 0 obj << -/D [1658 0 R /XYZ 85.0394 215.2245 null] +/D [1677 0 R /XYZ 56.6929 467.136 null] >> endobj 1703 0 obj << -/D [1658 0 R /XYZ 85.0394 149.4956 null] +/D [1677 0 R /XYZ 56.6929 460.6924 null] >> endobj 1704 0 obj << -/D [1658 0 R /XYZ 85.0394 149.4956 null] +/D [1677 0 R /XYZ 56.6929 436.6227 null] >> endobj 1705 0 obj << -/D [1658 0 R /XYZ 85.0394 149.4956 null] +/D [1677 0 R /XYZ 56.6929 428.8043 null] >> endobj 1706 0 obj << -/D [1658 0 R /XYZ 85.0394 144.3554 null] +/D [1677 0 R /XYZ 56.6929 414.0996 null] >> endobj 1707 0 obj << -/D [1658 0 R /XYZ 85.0394 120.2857 null] +/D [1677 0 R /XYZ 56.6929 408.8714 null] >> endobj 1708 0 obj << -/D [1658 0 R /XYZ 85.0394 112.2205 null] +/D [1677 0 R /XYZ 56.6929 382.1516 null] >> endobj 1709 0 obj << -/D [1658 0 R /XYZ 85.0394 97.4559 null] +/D [1677 0 R /XYZ 56.6929 376.9833 null] >> endobj 1710 0 obj << -/D [1658 0 R /XYZ 85.0394 92.0407 null] +/D [1677 0 R /XYZ 56.6929 350.2636 null] >> endobj -1657 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F47 879 0 R >> -/ProcSet [ /PDF /Text ] +1711 0 obj << +/D [1677 0 R /XYZ 56.6929 345.0952 null] >> endobj -1713 0 obj << -/Length 2122 -/Filter /FlateDecode ->> -stream -xÚ¥YKs㸾ûWèª*Bðà37ÙÒ8žñÚŽåd33š‚%–)R+RžÑþú4Ð J$µ•”n ?ôQø±‘ç?âÑ(ˆ\âQæ’Í`ìöŠžIÍ4±¹®_®þöI£ˆD>÷G/o–¬Ð0d£—åWgJƒê\ß]ßß=Þ>OŸþñÛxÂ=ê|£>Ì°³øõöv¾x™›îó|:»{¸6ž~DéÓÓüav÷oŸ*©´¡ÞÌãï/Ÿ¯æ/Ͳí1*Ôš¿úúŽ–°ÃÏW”ˆ(ôF? C ‹">Ú\¹ž ž+DMÉ®WÿlZ£zj§©%\ø¼ÃVœ#‘çñ–±¼ˆø‚m¬ÇײÈd%—¸ÇÙÃÂØF&û]ZŒi>Ý”½›.4htG‹×&ºp¬¹ÔÒ¾‚VN}ïû©fÆ9XņU7\çº]û1mݳb§ùxârê<Ä©ZÌYÊJnz4™ÿ¬d^¦E®Ít²;R„ëR²ÿ -S|á̈™—U¿Ë1Ã×»1%ê‰sÓ¸1ü_âýÛ&ΔÏq¾w¥¶\+š4°ƒ>8WéEº$Ä£: -‰"ïÀà—Xw“uƒCÔƒ’Hò’Í5€CÍUã (
pRmápª»[wƒCƒƒjÕ8èvƒƒ'!,æ7˜5GºÊÓ|…é¾Zšÿ'î3HW‘î8w® Nü×8âŽÌ2T:Šqá<ró*wÆêù(Æ)¥ý˜‰ˆP7º„™Å5€YÍuÄ,¢˜
©¶0;ÕÝ™»'7.‚Ý›,Þ¥ß(åI\5ÄúûŸ"¯]®Š«}—Sqð°íUsãU÷òGZv; -p¹™Ll«ežúï…ÔƒÈyx¡Î³¹ú!m¸H}o -ÌWP%ºQ…A=-Í@Rà:Mb;4ظýØp¸`ÂØX\ØÔ\6—¥AÕ6§º»±±u7õ¹[×…ªÕÔçÐÖL5LI}ãE@;ñ"M1^df/B±öåúó¼Ú°ùT¤yuœµ˜?§}ÊâUÎ.»|±ZÇĆڊ‰µs~)²w¼;«ÞgC]$ëìPµŽ„Ž¾}…u£<1PÈ/¼t“°¹úOLÃÕœ˜p¨T}<1gº;OLKwOUzzaÐ>ù³BëB®øZ\ϳéØóœå™S$}*v›¸3ú°ò»mçÀqº_íËê«Ó‡±‰€á2ª!áA¹Gýæ‘'.Î]rsi$Ívñ[ÕULSHÊ.Dæj ֬ЫgA¾»Yi¬ -ë˜èÊÿ€\åºØg†ªµªÆ«ÄïïûßUQg5 %©!¹Ú>Zcn„½©SŸ!Ñƺû<3þ$)6“.|¶qžjéŒ:¯ü≀Æ2-“,N7:‡ê¸jXóñBçç®:s%võrá‹(+d-K¢øpuüa„ÄøÉÒ7YÂò°§O+|Ëô'66E^Í\8ïõ¬S¸lvlԬسW¥´^²“©¶~Ö3¯f*IM=ëÇŒ²38Ðó LPxuµbá¥ÂÎk±7±âúîav”ëB±ê7r)‰X}y“;åF½Ïì<„RïÂõËæ:O&°lâ(LgÖŸGµóÈ™ÚÎ<ÒÒŠy„zƨo[Ê^´5Vć9Oñ>ÃIÓ.\œHºSá¤É»ŽÐ¿O÷j"s¡âÜvéj“ˈ!lÀ
Õß+Ô¼ '¸ˆàÇ%L8 üöiñ}£ÌëºpØbXWŸ,ŠB\ÛB¾ÆeUlM ÈÞLÿŽ#y†‚43OøÜSºN®tM52…kE’ÂY.{‹8¬ê£¼hs¬ÿïÿ¥¬ê% "컊p°¯‚³(µ—È?[yýÖùÒÿš¸¥endstream -endobj 1712 0 obj << -/Type /Page -/Contents 1713 0 R -/Resources 1711 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1531 0 R +/D [1677 0 R /XYZ 56.6929 321.0255 null] +>> endobj +1713 0 obj << +/D [1677 0 R /XYZ 56.6929 313.2071 null] >> endobj 1714 0 obj << -/D [1712 0 R /XYZ 56.6929 794.5015 null] +/D [1677 0 R /XYZ 56.6929 298.5024 null] >> endobj 1715 0 obj << -/D [1712 0 R /XYZ 56.6929 749.4437 null] +/D [1677 0 R /XYZ 56.6929 293.2742 null] >> endobj 1716 0 obj << -/D [1712 0 R /XYZ 56.6929 749.4437 null] +/D [1677 0 R /XYZ 56.6929 267.8297 null] >> endobj 1717 0 obj << -/D [1712 0 R /XYZ 56.6929 749.4437 null] +/D [1677 0 R /XYZ 56.6929 261.3861 null] >> endobj 1718 0 obj << -/D [1712 0 R /XYZ 56.6929 746.6461 null] +/D [1677 0 R /XYZ 56.6929 199.468 null] >> endobj 1719 0 obj << -/D [1712 0 R /XYZ 56.6929 722.5763 null] +/D [1677 0 R /XYZ 56.6929 199.468 null] >> endobj 1720 0 obj << -/D [1712 0 R /XYZ 56.6929 716.7581 null] +/D [1677 0 R /XYZ 56.6929 199.468 null] >> endobj 1721 0 obj << -/D [1712 0 R /XYZ 56.6929 701.9936 null] +/D [1677 0 R /XYZ 56.6929 191.7053 null] >> endobj 1722 0 obj << -/D [1712 0 R /XYZ 56.6929 698.8254 null] +/D [1677 0 R /XYZ 56.6929 176.9408 null] >> endobj 1723 0 obj << -/D [1712 0 R /XYZ 56.6929 684.1207 null] +/D [1677 0 R /XYZ 56.6929 171.7724 null] >> endobj 1724 0 obj << -/D [1712 0 R /XYZ 56.6929 680.8926 null] +/D [1677 0 R /XYZ 56.6929 157.0677 null] >> endobj 1725 0 obj << -/D [1712 0 R /XYZ 56.6929 656.8229 null] +/D [1677 0 R /XYZ 56.6929 151.8395 null] >> endobj 1726 0 obj << -/D [1712 0 R /XYZ 56.6929 651.0047 null] +/D [1677 0 R /XYZ 56.6929 137.1348 null] >> endobj 1727 0 obj << -/D [1712 0 R /XYZ 56.6929 636.3 null] +/D [1677 0 R /XYZ 56.6929 131.9066 null] >> endobj 1728 0 obj << -/D [1712 0 R /XYZ 56.6929 633.072 null] +/D [1677 0 R /XYZ 56.6929 117.2018 null] >> endobj 1729 0 obj << -/D [1712 0 R /XYZ 56.6929 609.0023 null] +/D [1677 0 R /XYZ 56.6929 111.9736 null] >> endobj 1730 0 obj << -/D [1712 0 R /XYZ 56.6929 603.184 null] +/D [1677 0 R /XYZ 56.6929 97.2091 null] >> endobj 1731 0 obj << -/D [1712 0 R /XYZ 56.6929 579.1143 null] +/D [1677 0 R /XYZ 56.6929 92.0407 null] >> endobj -1732 0 obj << -/D [1712 0 R /XYZ 56.6929 573.2961 null] ->> endobj -1733 0 obj << -/D [1712 0 R /XYZ 56.6929 558.5914 null] +1676 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F39 873 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 1734 0 obj << -/D [1712 0 R /XYZ 56.6929 555.3634 null] +/Length 2545 +/Filter /FlateDecode +>> +stream +xÚ¥ZKs㸾ûWè(U€ øÈM¶l&3¶#y²IÍî–`™ŠTHʳ³¿>
âA" ɦ|0 4ñýu7º›ÂxS‘$˜DIàQ„éd{¸B“=ÌÝ_a)3WBsSêúùê/w$š$^úáäùÕX+öPãÉóîÛtñôtû°\ýs6÷)š.¼Ùœ"¤Fon7³y&|‚ð©M¯WןW÷ëÅÓlj‡~E-–âfóõþþvó|+o×·‹åêáDðì·çOW·ÏúµÍaDø;ÿçêÛoh²ƒ~ºBIb:ù7ÈÃIâOW%
Q#ùÕæêïzAc¶}tLU”ÄýhDW>ž`ì%”ú=eÑĉOZe-6b[GV¥MVµuWÃ[\ Kˈ cd Žþm}wŠ"¿
11E^œÀû;@µÌ.;TL©G„š°Ëòf…Øwº;dEV7°ù²ªÅXÙ颽ߟ²óø;¶„CêqÃñu?ñ/žøÿ¹l`ÍY¨‰‡ò^X%îpGžUÙ@œ/mÈ¡nCÊ¡p%¥UNIäP¹ÚPúÛ¢vü¦<J©xmyË´IÅÕ]–3quS¿"äïO‚1x[U3O9M#T€2ƒ0 }*žfØO¦’kƪ†R9÷¸mJƒŒ„XÉèB¨2¥ìdh)MF‚};N莌3ìq2zà£dè0æÒ?ŠÝŸ¥ÄÇÔãØïS²Tl¤•éw쥚ÅÓSZýÐŒ„vF"Ø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ŽÂØ‹ü ?I>¦‡,o”Ói’ÖrúîGU¶k,E +²—Ì}’x”B^1|^DX᪠+D}`k0ùzH‹v:–<ó÷‘<k˜¹mP7,ÏKÍt²}Ó|Û³" +Ç;%þ…ànJ9WRåØA¹Úà|ˆm!ÝçŒ +cGðiJîú즩ÀÔ–'<1â©+kc?Ÿ‰£|^™Ñqthq'¶éà +;Æù2ãb–p>óE®é~§Åö5‚ð &PA]:ÍM);áZÊ Ü‘;¡;ÂÏ°Ç ï?ŠÛrÇx +d¦ÎG7?€…ƒéD)'x·€1·¨^²¦jë!1[i„E7/§Æ<"™U5yªÈWY—5+^ÒÓAŽó£]FñT/X8«b)k@.”`†E%¤IŒ°£%äÂí8Sh"K.xVÕOâ»N{9í÷œ…‘Áfâa¯<o
–PZº@I`Wq +O¶y)ÒÙÑÖkÚ'áQ·
šžöo")3}{” 6_('L)JJAGé„6ˆb[ˆ0Áõ‰ê€_ŠÜ
.nÊÃ1-~tâjÍ Þ³w o„‚Ä÷‚Øìî„L?yâɿ嬀“©õµ{ð™_8;eþ*Яp/ç¡þ«_~´AQ>®9<-b+Ÿ~D½(¼t\˜Rv>µTÇ'u$NèŽÏ3ìq>{àÝ}gE×½S.%³‚ó©ì÷rjGwå¬P„Wõ1þYoÓe»›Øƒ¼tBZ¤NéQä¨á\¸)`'òšA5FØÖÈ™-¢¹"Nô:Q•:¢ þ0lyCB»/ÁóêAÓ¯%k”"J¼8ù÷'IQ猣oHÀ±&B½ +e'´AñÛB± ~úØúœ¾0U3gg'íhM![ –z" ’ñÏ`7UúýUôHv*œö§ºÑ<$V ” ÒMƒ!dgA uŸ¤"GíÂí8S`"'‹1œ†g"Ùû¦äÿÍâeT†+ã<”û½Ø«ïú±ò +XeÍŠ·ôñ"œ€M (2›q"èŠûtuËÊsS>Øs«õ¹ó”¿ÓøtÊæóO+Ȩ#àÿïdýÉÈ#±çBP™z©—â›K’á›ë_n¿ú %÷Üendstream +endobj +1733 0 obj << +/Type /Page +/Contents 1734 0 R +/Resources 1732 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1675 0 R >> endobj 1735 0 obj << -/D [1712 0 R /XYZ 56.6929 540.5988 null] +/D [1733 0 R /XYZ 85.0394 794.5015 null] >> endobj 1736 0 obj << -/D [1712 0 R /XYZ 56.6929 537.4306 null] +/D [1733 0 R /XYZ 85.0394 748.4854 null] >> endobj 1737 0 obj << -/D [1712 0 R /XYZ 56.6929 510.7109 null] +/D [1733 0 R /XYZ 85.0394 748.4854 null] >> endobj 1738 0 obj << -/D [1712 0 R /XYZ 56.6929 507.5427 null] ->> endobj -598 0 obj << -/D [1712 0 R /XYZ 56.6929 477.5928 null] +/D [1733 0 R /XYZ 85.0394 748.4854 null] >> endobj 1739 0 obj << -/D [1712 0 R /XYZ 56.6929 453.2532 null] ->> endobj -602 0 obj << -/D [1712 0 R /XYZ 56.6929 369.7201 null] +/D [1733 0 R /XYZ 85.0394 743.3452 null] >> endobj 1740 0 obj << -/D [1712 0 R /XYZ 56.6929 345.3805 null] +/D [1733 0 R /XYZ 85.0394 728.6405 null] >> endobj 1741 0 obj << -/D [1712 0 R /XYZ 56.6929 310.6805 null] +/D [1733 0 R /XYZ 85.0394 723.1655 null] >> endobj 1742 0 obj << -/D [1712 0 R /XYZ 56.6929 310.6805 null] +/D [1733 0 R /XYZ 85.0394 708.4607 null] >> endobj 1743 0 obj << -/D [1712 0 R /XYZ 56.6929 310.6805 null] +/D [1733 0 R /XYZ 85.0394 702.9857 null] >> endobj 1744 0 obj << -/D [1712 0 R /XYZ 56.6929 310.6805 null] +/D [1733 0 R /XYZ 85.0394 688.2211 null] >> endobj -1711 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F47 879 0 R /F14 685 0 R >> -/ProcSet [ /PDF /Text ] +1745 0 obj << +/D [1733 0 R /XYZ 85.0394 682.8059 null] +>> endobj +1746 0 obj << +/D [1733 0 R /XYZ 85.0394 668.0414 null] >> endobj 1747 0 obj << -/Length 1917 +/D [1733 0 R /XYZ 85.0394 662.6262 null] +>> endobj +1748 0 obj << +/D [1733 0 R /XYZ 85.0394 599.7666 null] +>> endobj +1749 0 obj << +/D [1733 0 R /XYZ 85.0394 599.7666 null] +>> endobj +1750 0 obj << +/D [1733 0 R /XYZ 85.0394 599.7666 null] +>> endobj +1751 0 obj << +/D [1733 0 R /XYZ 85.0394 591.7571 null] +>> endobj +1752 0 obj << +/D [1733 0 R /XYZ 85.0394 565.0374 null] +>> endobj +1753 0 obj << +/D [1733 0 R /XYZ 85.0394 559.6222 null] +>> endobj +1754 0 obj << +/D [1733 0 R /XYZ 85.0394 534.1777 null] +>> endobj +1755 0 obj << +/D [1733 0 R /XYZ 85.0394 527.4872 null] +>> endobj +1756 0 obj << +/D [1733 0 R /XYZ 85.0394 502.0427 null] +>> endobj +1757 0 obj << +/D [1733 0 R /XYZ 85.0394 495.3523 null] +>> endobj +1758 0 obj << +/D [1733 0 R /XYZ 85.0394 420.5376 null] +>> endobj +1759 0 obj << +/D [1733 0 R /XYZ 85.0394 420.5376 null] +>> endobj +1760 0 obj << +/D [1733 0 R /XYZ 85.0394 420.5376 null] +>> endobj +1761 0 obj << +/D [1733 0 R /XYZ 85.0394 412.5281 null] +>> endobj +1762 0 obj << +/D [1733 0 R /XYZ 85.0394 388.4584 null] +>> endobj +1763 0 obj << +/D [1733 0 R /XYZ 85.0394 380.3932 null] +>> endobj +1764 0 obj << +/D [1733 0 R /XYZ 85.0394 365.6884 null] +>> endobj +1765 0 obj << +/D [1733 0 R /XYZ 85.0394 360.2134 null] +>> endobj +1766 0 obj << +/D [1733 0 R /XYZ 85.0394 345.4488 null] +>> endobj +1767 0 obj << +/D [1733 0 R /XYZ 85.0394 340.0336 null] +>> endobj +1768 0 obj << +/D [1733 0 R /XYZ 85.0394 325.269 null] +>> endobj +1769 0 obj << +/D [1733 0 R /XYZ 85.0394 319.8539 null] +>> endobj +1770 0 obj << +/D [1733 0 R /XYZ 85.0394 295.7842 null] +>> endobj +1771 0 obj << +/D [1733 0 R /XYZ 85.0394 287.7189 null] +>> endobj +1772 0 obj << +/D [1733 0 R /XYZ 85.0394 272.9543 null] +>> endobj +1773 0 obj << +/D [1733 0 R /XYZ 85.0394 267.5392 null] +>> endobj +1774 0 obj << +/D [1733 0 R /XYZ 85.0394 252.7746 null] +>> endobj +1775 0 obj << +/D [1733 0 R /XYZ 85.0394 247.3594 null] +>> endobj +1776 0 obj << +/D [1733 0 R /XYZ 85.0394 223.2897 null] +>> endobj +1777 0 obj << +/D [1733 0 R /XYZ 85.0394 215.2245 null] +>> endobj +1778 0 obj << +/D [1733 0 R /XYZ 85.0394 149.4956 null] +>> endobj +1779 0 obj << +/D [1733 0 R /XYZ 85.0394 149.4956 null] +>> endobj +1780 0 obj << +/D [1733 0 R /XYZ 85.0394 149.4956 null] +>> endobj +1781 0 obj << +/D [1733 0 R /XYZ 85.0394 144.3554 null] +>> endobj +1782 0 obj << +/D [1733 0 R /XYZ 85.0394 120.2857 null] +>> endobj +1783 0 obj << +/D [1733 0 R /XYZ 85.0394 112.2205 null] +>> endobj +1784 0 obj << +/D [1733 0 R /XYZ 85.0394 97.4559 null] +>> endobj +1785 0 obj << +/D [1733 0 R /XYZ 85.0394 92.0407 null] +>> endobj +1732 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F39 873 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1788 0 obj << +/Length 2121 /Filter /FlateDecode >> stream -xÚµX[Ûº~ϯ0Ð>hˆáE¤¤óÔÜÚì²)š-úìƒÖ¦m!²¤#É»1Šþ÷ÎpHÙòÊÇ(ŠÖäpøq8wJ,8ü‰E¦Wy²Hó„i.ôb¹{ÅXûÛ+áy˜N”‚ÉÌj¬UÆt&ÓE| -òîþÕ›¿J±œ#õâ~=žeÒ”ñ|q¿ú½m[[¯ÊŸ7±Ô<zwópÿ+íJXš¥wq8!eFiãv|.ê}Q[ll?î S‰‘~ÑÌp¹=‰ç<Z•äG•2e‰qWì¬ÇQ‹œåF£SÈŒ\¸Ùû]Ê”Fî¾Ò jšû–Æû¡¬ÊápL°\ë X"˜Ì]æë¡nÚ¾twxõñ~Ô©áL(Ðh":Wsz §ÔÉ£dœÁíw„p6QùÉ
ƒIF®ñž´õí/½ížl÷à§ñ#ÝIŸ*Ið”éÜh87«Ug{o•ÉYpñ,QÂó˜ËL¥Yft€\VÅ, ÌY–¥ù9àú*ຬl=š|*dÊ2ÉÓsÌÿÌv3Vèë:Ëñè5°§mºáO—4ÿvUØ‚JÅrÁÕ9Þpo8´ÿÞÏ«xèDsx “æ…½Wá¾mwÅò—¼õ/?ìa9ç,ɹ9‡NÆ‘ypy#V€œ+.§öù†Ð•ÆÎuÃä·½íM;0Æ.E¼J%KRñG"þârÄ\Óˆ·—EÓ’™\¥D´ˆß-pMEÛTÍcQÅ-ÆBŽš
j½’s?|üúþ·¿¿ýr7rOR¾ÄÇ”ÿ².(ŠGüÎ5_5»¢¬!ý'<*ëuÓ튡l òhÓ݈,jZÛ«ðL=4ýι²?ËÇÊyhšŠV -ë.¦‰’vÏnbÅÓèv *rõÄÛœC‡»Lü™ª°*"Ö+H,ž}[O¶–ÈEÝ?ÃqZ~›“ÕóÐxØwµ]Ñòš®²;£[ ‰nÊíIm¸|„‡#>ÌÐJ»‚+k˜}nú!”ùÓk9])# ¿ìʺ¼Q?tÅÐ8á¼ïíŒK€0ùXg.¸ô@Ê„?48Ð%÷`×~Û4(ºáG1ZZ†Õ]OKvY n¹YÓo9øÕà%Ô^€\ÑkXÈ@ÅùÂõÈЊ3
RP‰µµC0׸àf÷»Úý€þ#xôlÓ½lrÐC{?´è!D¤ßmñdýìÜh½¯—E5žÖ¬g®0›hþ¾Â–'*Ô>²s²<×pÇœ¥iJÿ¶¶Í~³9*ÑÐg*uÍ´2¥çÁÀUJF5ÆxUpæÔ½"ús9l‰¶lv;Ð~\•µ¥5 -‰Í~gë¡GÓi Æ%î¢êâÚ½'Ñü±–r׬<”³3þBXSªq -0 ¤PžLÝ~L!1ÅŠ’GrbPÈ´Ô>GCgÇL%+ër‹‰ÞíboMÃ~—î4i<Ñ90ž1U‰C=U‰'9oÂí-^¬æLD·¦Eä7Iô¼µ50¼,òi΄0‰7d¼÷*™Ð -;‘ -¢ô]–è„Kš‡²§|Á¸IÈŠ/(yÎàõ!¯)PÂ[Æó<—UåBØCQú -o§¾÷Pcµ·ž¥>"†ÞÑÒÊ®ŒžÖQ¨™ž 5P~DrÍ›ÏC‰z*‹9?€ww¼àÏÿþôåóÇÿ¼a€×-g3ÅLfähg¨ð*ºß†«Rn>½~6æ|â C¹¨D97ù2"ó„%BžÕ®ç&/ÚòÞ*dT×qñrn˜q²YkÞ»ÆJÍíýR7 -ƒ÷Ÿè—¾¸VsAOÔb±*Zšøš£á*ÜдVÙ'[º{ìÕ'i},©9B:u\þŒ™ +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žÇ[Æò"â.´±_Ë"“•\âgc™ìwiu0¦ùtSönV¸Ð Ñ-*\›è±¦RKû +Z9õ½ï§šç`/VÝPë‘¥›ñ€x<hëž›8ÍÇ—Sç!ÞHÕbÎâPVrƒ£G©™ùÏJæeZäÚL'»c!%Aø°.%û¯ÀâgFk\VYü.Çg\GìÆ,t–¨'ÎMãÆЉ÷o›87R>Çù>Þ”VØrhÒÀúà\¤=ê’ê +›ª‹†ªÃ~4¨úˆÆ™îN8Zº/Û¿h†ý($Š¼ÿƒ_bÝMÖ
Q?~H"\ÈK6Õ +¸÷‹Š{Jð/qYÊŽéZA/‰E©¢ +\§Il‡·îLx‹j +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†\m17ÂÞÔ©Ï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ý²©Î“ ì‚ +ÓÙ„õç‘AÇ<r¦¶3´´b¡žq+êÛ–²íC@
…ñç)ÞgÈ4ÍàÂõlj¤8Nš¼ëøýût¯™çö°KWk\F,an¨þ^¡æ9Á%@?.aÂIàG°O‹îe^×å€ÃúúdQâÚò5.«b[èhAöfúwœyüË3¤™yÂçžÒur¥kª‘)\+’ÎrÙ[tÀaUuàE›cýÿ/eU/aßU„f¿^”6 ¥gK¯ÿÁ:_ûøØendstream endobj -1746 0 obj << +1787 0 obj << /Type /Page -/Contents 1747 0 R -/Resources 1745 0 R +/Contents 1788 0 R +/Resources 1786 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1754 0 R +/Parent 1675 0 R >> endobj -1748 0 obj << -/D [1746 0 R /XYZ 85.0394 794.5015 null] +1789 0 obj << +/D [1787 0 R /XYZ 56.6929 794.5015 null] >> endobj -606 0 obj << -/D [1746 0 R /XYZ 85.0394 769.5949 null] +1790 0 obj << +/D [1787 0 R /XYZ 56.6929 749.4437 null] >> endobj -1749 0 obj << -/D [1746 0 R /XYZ 85.0394 573.0107 null] +1791 0 obj << +/D [1787 0 R /XYZ 56.6929 749.4437 null] >> endobj -610 0 obj << -/D [1746 0 R /XYZ 85.0394 573.0107 null] +1792 0 obj << +/D [1787 0 R /XYZ 56.6929 749.4437 null] >> endobj -1750 0 obj << -/D [1746 0 R /XYZ 85.0394 538.4209 null] +1793 0 obj << +/D [1787 0 R /XYZ 56.6929 746.6461 null] >> endobj -1751 0 obj << -/D [1746 0 R /XYZ 85.0394 504.6118 null] +1794 0 obj << +/D [1787 0 R /XYZ 56.6929 722.5763 null] >> endobj -1752 0 obj << -/D [1746 0 R /XYZ 85.0394 432.7569 null] +1795 0 obj << +/D [1787 0 R /XYZ 56.6929 716.7581 null] >> endobj -1753 0 obj << -/D [1746 0 R /XYZ 85.0394 303.3232 null] +1796 0 obj << +/D [1787 0 R /XYZ 56.6929 701.9936 null] >> endobj -1745 0 obj << -/Font << /F21 658 0 R /F23 682 0 R /F39 863 0 R /F53 962 0 R >> +1797 0 obj << +/D [1787 0 R /XYZ 56.6929 698.8254 null] +>> endobj +1798 0 obj << +/D [1787 0 R /XYZ 56.6929 684.1207 null] +>> endobj +1799 0 obj << +/D [1787 0 R /XYZ 56.6929 680.8926 null] +>> endobj +1800 0 obj << +/D [1787 0 R /XYZ 56.6929 656.8229 null] +>> endobj +1801 0 obj << +/D [1787 0 R /XYZ 56.6929 651.0047 null] +>> endobj +1802 0 obj << +/D [1787 0 R /XYZ 56.6929 636.3 null] +>> endobj +1803 0 obj << +/D [1787 0 R /XYZ 56.6929 633.072 null] +>> endobj +1804 0 obj << +/D [1787 0 R /XYZ 56.6929 609.0023 null] +>> endobj +1805 0 obj << +/D [1787 0 R /XYZ 56.6929 603.184 null] +>> endobj +1806 0 obj << +/D [1787 0 R /XYZ 56.6929 579.1143 null] +>> endobj +1807 0 obj << +/D [1787 0 R /XYZ 56.6929 573.2961 null] +>> endobj +1808 0 obj << +/D [1787 0 R /XYZ 56.6929 558.5914 null] +>> endobj +1809 0 obj << +/D [1787 0 R /XYZ 56.6929 555.3634 null] +>> endobj +1810 0 obj << +/D [1787 0 R /XYZ 56.6929 540.5988 null] +>> endobj +1811 0 obj << +/D [1787 0 R /XYZ 56.6929 537.4306 null] +>> endobj +1812 0 obj << +/D [1787 0 R /XYZ 56.6929 510.7109 null] +>> endobj +1813 0 obj << +/D [1787 0 R /XYZ 56.6929 507.5427 null] +>> endobj +630 0 obj << +/D [1787 0 R /XYZ 56.6929 477.5928 null] +>> endobj +1814 0 obj << +/D [1787 0 R /XYZ 56.6929 453.2532 null] +>> endobj +634 0 obj << +/D [1787 0 R /XYZ 56.6929 369.7201 null] +>> endobj +1815 0 obj << +/D [1787 0 R /XYZ 56.6929 345.3805 null] +>> endobj +1816 0 obj << +/D [1787 0 R /XYZ 56.6929 310.6805 null] +>> endobj +1817 0 obj << +/D [1787 0 R /XYZ 56.6929 310.6805 null] +>> endobj +1818 0 obj << +/D [1787 0 R /XYZ 56.6929 310.6805 null] +>> endobj +1819 0 obj << +/D [1787 0 R /XYZ 56.6929 310.6805 null] +>> endobj +1786 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F39 873 0 R /F14 717 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1757 0 obj << -/Length 3971 +1822 0 obj << +/Length 1916 /Filter /FlateDecode >> stream -xÚÍZÝsÛ6÷_á™>T™‰X€ -ç\9æ=5`½Z7õ¼êñ¼j×Ëâ©œ'Ç<uf!úéÌ|ÞS÷G÷ÔqîÑ3½·¨I. |vÑ0èpÑÁÉÙôOçÃE«ö¨èš»½®`[ߘ
¨32¿ù¾¤ãüM´U -Æ—K½]6ØçtBؽQŸv…ûÑ{TØŸ[t'ìýEÇ…Ý_´ªç€x:o&N*ðR‚–çÆ·¼ÐáIAÍ7+N‚þ´¨1'êoij°€òêŸSÇ?ßýÌëË7Ü+OÆœœÓ“"8ƒ# -“mà -[Á6ÄÚé=¨ôœ>QܼjÃOð`ì™xSÈó×’øEˆL·eÉPÜš÷ýv—"õrO_v¨÷bÑNV±êl?TkðI.ØOrñ5¤/ ZÆÅsœêñ %Lší«°T¡Ê5\ -)¶;) ~cSÔ-î둾Ò:ºC“b<ˆÈ'ÿÿÝbÎN¾rv¨‡1ýÉA+#¯Óîþ;Ì«Œy•‘!p‰†õ#Æó$@ À‰S‰<8v¼dÚEm˜ù²£¸rÎòz D)û¨zÇÑ㢢0,#ÅTdWòkOýâòê»~ ßGžÎód’H{Þ¨Ýâi\<å•O.ð?ríd[/)‘3é‘Ð"]ùüNiÿ8r\¹=<®Ýº±O+5ÜËuS‘\E™w‚z¼çûç.Û”:·ç*½^Þù0ƒÑM~ð15MûˆÑg{ØõD]>
¼£9Ò"“(‘à(P.~þîCB$º~@bX¨ªg´ÖW|ò žiß=dϧ[0eVþõv˜kÊ^ÕWèz>V RIžŠì„†ƒVíÊcã¶ì"z)ˆ`$^RTÜmþq52¬Dd=ã o1 ØY,*í‹èʱE蘈.L6[õ}Ù†¬%ä„ý£:ƒ5z³§!´ª¢ÀU¹WÒ…ÈZ…+Øå3¾ëÄi¾æ(yýãÅñÒïcѹ?d8ŘDùÞ4””>1;‘þEw°=ø¼é§qûU:Û‡†Éw«ÃŽõÎݪÝ5Æ1w˜Q@ŽG’¤Cw+L -œk,]IvfRqé`%ýK»q—Ž8$ÏNW`r -0+–þ*J÷,ø‚¤/€D)ïãúµI$‚éAðe_'œÿ^fĪ0ÊĪ&¼)ÓDªŽ©ª§¨XI±Y£Î7K2mÌàæ–a×+ƒë»j-4ÚI±{!p}ïo>!òe]¹»é-g]õP.Ãw"0 -”Ø¢/Û†H½m„ËH Ž0]um¹¼#"‰*ß+—R‰ÊõÔ¸9.Ã;ÈGtzX†«¡à ±Jôtäj£ ;þ۱ˣ,DŽÅª˜C¹—)‰‚ˆ˜:¾—èuÝÐgØŒé9|ûîâåôÝ«l,§ÌÒw"¨#KñÐx¢@u”'jáÑñwÞFÔÐ
ñ`ìA<Å>s"Q2ïC=Lbò -œÀ4d‹V ½K²Üì]½„Á…s¯I°Måz°“âcÉÝ‹ÐbKöýãjmÁL8¥×BªÃ>]ÁãsZVM!äm˜¿§ürK?ŠvÇ€oxóEÉSy¤·‡‡ª|0ÆØ8È9÷]Wá -êyŽvQ.—_3¤¼Ý5TÉ -weþ>Kô@yðÐd·cá„` +xÚµÛŽÛºñ=_a }ÐËHI穹µÙdS4[ô!ÙMÛBdIG’wcý÷ÎpHÙòÊÇ(ŠÖäp8œûEbÁáO,2͸ʓEš'Ls¡ËÝ+¾ØÀÙß^ “hÅt¢lfNc2¦3™.âS"ïî_½ù«É™1R/î×ã[&MÏ÷«oÑÛ¶µõªüyKÍ£w7÷¿Ò„¥Y*ð‡Rf”6îÆç¢Þá·ÅÆöã‘0•éïÍ×™»óŽ‰›XpΣU¹A|DP)SÆwÅÎz:j‘³ÜHãÉ(ÁT<#^vï~—2¥Õ‡»¯´¨šæǾ¥õ~(«r8,×:0–&3AÂ|=ÔMÛ—N†WïG΄&Â0¡s5§w|J\0JÆH/ð¹# g“DœHL2brÐÖ·¿ô¶{²ÝƒßÆ$“>U’à)Ó¹Ñð.^.V«ÎöÞ*“·@ð,QÂã4—34•f™Ñä²*f ÊœeYšŸ\_%¸.+[&Ÿ2™²LòôœæÿÍv†f¬Ð×u–-âÑkàNÛtß.i ;'üÛUf/0*ËWçô†«ô†Cû?Ðûy•:ѽ„IóÂÞ‡«ä¾mwÅò—”ú—ö0C9ç,ɹ9'Œ+óàòF¬€r®¸œÚç’¸¨Œ°v®6¿ímwhÚ1öp)âU*Y’Š?ñ§$.Güˆ5øx{™5-™ÉUúGX;!ñ;¬¬)k›ªy,ªx¢ÅXÈQ³AWrî‡_ßÿãöï÷·_îFìIÊ—â˜ò_Ö¥Cñàˆß¹æ«fW”5¤ÿ„Ge½nº]1”
Tmº‘EMk;@©§³‚¶ß9WögùXYMSÑ Ð +dÛ¥
¯7„IÎ]L;%ížÝÄŠ§Ñí@Pxùê ¯9‡²Lü™ª *,Ö+XH,ž}[¶–ÀEÝ?ÃsZþšãÕãÐzØwµ]ÑñšDÙ#)DR r{RÉÓ>ìÐJ»‘5ì>7ýÊü©XNWÊÈ/»².oDÔ]14Žy +‰Í~gë¡GÓi Æ%ì¢êÂÚ½Ñþ±–žä®YyRÎÎøaM©Æ)À$By2uû1…PÄ+JɉA!?Ð!R?øqQÜ3•¬¬Ë-&zK°Gˆ½5-û=ÝhÓx s`|cªGõT%ä¼ ¯·(X?&Ì™ˆn;L‹ˆo’èykkZa:yYäÓœ aoÈx;ïU:3¡ ˆ¤KØð»)Ÿlâký³®Ê–à¶èªÒ +l0ý"ë¯q›Rv“FGïnï>Fî©îZ~½8¾Ô¬gcf01vÏë’NuðfðÎæ™´'8På"™ÿn_
e[ÙÓèüè˾ß[å'~á‚Ø£xãzb`a6Zì$Ag”ù¾TÊC V+‚¸çâ +; +‚ô]–è„KÚ‡²§|Á¸IÈŠ/(yÎ`ú×(a–ñ8ÏeUyƶÀP”> +©,ƒqI +³SßûÆ + α +ÙÕu<¼œfœlÖš÷®1„Rs{G¿ÔÂâý'ú¥¯®ÕÅ\дX¬Š–6¾&Ãj¸JnhZ"VÙ'[Œº{OÙ=ªOÒ,úXRs„pê¸ü3`¹>$ð0TOÌ{¤³éÒ·pçžÕÌÈà]ñr¾šI(“jæ”ÏïÐQ¸tº>x å2Aó¼‘Ñ°›!5#Ì…©ò=f¸73s˜çä8„‡Ï3‡öïóS®Ä:Y endobj -1756 0 obj << +1821 0 obj << /Type /Page -/Contents 1757 0 R -/Resources 1755 0 R +/Contents 1822 0 R +/Resources 1820 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1754 0 R +/Parent 1675 0 R >> endobj -1758 0 obj << -/D [1756 0 R /XYZ 56.6929 794.5015 null] +1823 0 obj << +/D [1821 0 R /XYZ 85.0394 794.5015 null] >> endobj -1759 0 obj << -/D [1756 0 R /XYZ 56.6929 752.2728 null] +638 0 obj << +/D [1821 0 R /XYZ 85.0394 769.5949 null] >> endobj -1760 0 obj << -/D [1756 0 R /XYZ 56.6929 504.0748 null] +1824 0 obj << +/D [1821 0 R /XYZ 85.0394 573.0107 null] >> endobj -1755 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F39 863 0 R /F48 885 0 R /F53 962 0 R /F11 1303 0 R >> +642 0 obj << +/D [1821 0 R /XYZ 85.0394 573.0107 null] +>> endobj +1825 0 obj << +/D [1821 0 R /XYZ 85.0394 538.4209 null] +>> endobj +1826 0 obj << +/D [1821 0 R /XYZ 85.0394 504.6118 null] +>> endobj +1827 0 obj << +/D [1821 0 R /XYZ 85.0394 432.7569 null] +>> endobj +1828 0 obj << +/D [1821 0 R /XYZ 85.0394 303.3232 null] +>> endobj +1820 0 obj << +/Font << /F21 690 0 R /F23 714 0 R /F41 910 0 R /F53 1002 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1763 0 obj << +1831 0 obj << +/Length 3970 +/Filter /FlateDecode +>> +stream +xÚÍZÝsÛ6÷_á™>T™‰X€ +@Š$Uy‘@*Ï¥Ll–¥#d6ÉUªœ®/ß½ÿá5íë§kØî ÞTÙ‰sèNTž÷ÊîŸÖõ¬\Òºyhge_·
ýnïx9˜D’S7ϼ¾,&M¢•Îx̲m?v4å²þX}K/èá¬S)u¢3ÝTI +ÿÂìÓNî_]µy¨6ô£)Wµ€ý*²ü4K¬1ùx®Ç¼/‹ ?:q™)ósM’kU9!4Žr¤‹ˆŠ†Q¸43¿·¬M“,+ôç—õƒ—íØš$SÖŒ—QèHiâJeÁ!©ÝÐóò=õ”ó9 §ãwàì½ë©}K´OÛjóôLJ9SSÖNn~õYÙÐØ[~ßývk?è#«×<dÞö}5Ÿ¢äà0áTµ@
ñæ€RÍê•SàBMš¶÷ê¿hŠ×S¸^ΔñzŠ×S“Y»l›é¼ZÖ«Ï +;ÓÂNþ³¨x4ÉÝv½^Ö0Þ©b6<eLRX#Ùvš°w€ªHòB[V:öxßZæIV„}“׻߮ª¦g»eã*é±h»OëyÔzA´§Wy–YRíò¡âuúEÉ+³R@WNîZL$§usü%–†ÑNk$¨Äi#¢LÁå ´æÓ¢TåiQ¦cQê‚D ϵ{«}¨çÕ<&G+“"ÓéI1Ê<ç1³¶é¶Ë¾‹8?`Ø ï§ßTýì›x/ÝEf†ðþÒPÙ̉ix]ñH9u0\ ‘ĸYw¤á4–.!1¥:Od*åXN7>6»^>ÑÏ;’ÕÊŸsuä˜÷Ô€õjÝ6ón¬Çóº[/˧jžóÔYÑOgæóžz8긧£pŽé½E‘äÂ÷gõƒ\‘þé|¼hÝ]{·×åqë³uFæ7ß—t˜¿
¶JÁârÅ£·ëã»ÓàœN{0ê3Âö£pß>zG…ý¹EwÂÞ_4.ìá¢u3ÄÓ;3±P“´7®å„O +j®Yópô§mM9QKSƒ- +ïŽ +)´w-.ÂÁœ·¼²a¶Êe=nÆ™·‚×Èò±yãRÅ
kÀÞÒª“j!G.8±|àŒºØ")t!¿ +‹¨íÛ5»¬–ÝQÉP÷"fGIàj +ëÖþñýÍåWןÞyð¢‡!@Z€ÿÒðF¦·±½b^`}8iקçà_{'OãÝFÂÎúù +¢QœcÝnz¢¯Ê'jÜ2?Ý`ëoF¡qOÔQ®×8¨Æ);ªÎp[¸âW$i9²lùù{ä(Lbtá8¶'T ´ÚÞšÅI…0•+§Z„Dòê®ÐƒY¹
šôÙ²tG +ÍßD&.¯¨Mf CݱÀAA§¤®š‡·€$6õ|î08üFÁá}Ô¬`Dbeêw5Åí*×éØ®bžYéÄÂÃJÚA|B¾f2ï™=×äM¯Ü^L~p¶`ßœ)ðÿÒŒO¾dùözϽººÇœ¿á¾|»÷æËEÙv âè»IP¿½Sz.k´Ó\‡™f·{ÏÆǪ‹øþ\ª°'|?°¦Ãy´àò!ªÓ´5O[ö WZ©s'™šå¥36G(ñ!0&¹"Çî-På®ïˆ‚¨ +Ÿœ2Ìœ³BBÀÅ”½B¬’E®ö‚.YŠž 3XV1µKAí¼vÞÕËÊCÔ}wyf*ÌÀÝÚb˜Þ)$}YCºÖtD(éÑlW.‹ÛÐOà {E"$¨¬…tÎ×õ¬© + AdMÅ+¾.QâH„`OæžQz
$Þm6`GOºE»]Ή~Ën +'i#ZšÃÔÉ,PfÆ;„mG ñçY»ZA7E)úmqTâ|L F&BA‹ª~ˆÒ”pǧ„°ÖL»&*}€„°wCTôKøtº}..‰Œ÷p``q̧*™dªð†7]Ç}ªµÿ‹+kD5yYpØJCÕWq'kÓ´8Y·ían¿çl°gMùÐá!N•¶‰ÉŠ=e;z˜i±7!|ƒþÌ©U;(¦²ú µd»ä!ΰ<:IXÀèÔ°ëÕÕ55h+Øò[Á6ÄÚé +â —õw›\Å`@†•ˆl`<0áÍ"$ûb"‹E¥C± +ÈZ0>ÆB|w'0oë.b\sX3í|9åÒã“øàý†Sò_¨§RsYÉ«r½&/#G·ŸN£DZ;ž™´{¹ô—z8¢«Wà\CéJ²3“êˆK+^ÚÅ]:â<;]ɨ¦ÃÊcÜ߈]%µæÝ8_ ì;DEe+a-Õ^åp\q4|3O¾‰Þ]7C°ðÃÏéÛ¡Y —ôÆá]² wÐft +.ÜþbÙ (},‹Å7Äò¼d¸¸‹•)5ÀÄŸå +îOh…;•šUj÷Á+íî´q âÑræ?_*÷eÏUÒ¾¹¾|ƒ¢~Λ:€FÀF•«Dí]ïâk8(Ÿ|tõPPíP…bà$?–› +"BVhù^bÐuCŸ`3¤ç8ðí»‹—Ów¯²X0N˜¥5öDPG–¡ðDê(OÔ£ã±'8âÁؽ0xŠ}æD¢d>„z˜(„äŒië| +qÿu¢È¹šc>âwš¥E˜ ¤ÇmÙUÓ\S_ÕÌÚ9Á'ïÑþ´ô_Ð.y’ûªÁ‹(œvN”[N`æ
«Ù81hÈZ±‡ö6Ér³w9ôÎM¸&Á6•ëÁNÊw?.|‹-ÙõÇÕº +Ÿ+вz +!oÃü=uà—;úQv;\Ù/JžÊ#ƒ=<Ô]í‚1þ€ÀƨÀBιï¸ +¨xÛ¯·=]
2(èYw(Yéïù#PVhÍst‹j¹üš!5àí¾¥J–¿+s÷Yb +endobj +1830 0 obj << +/Type /Page +/Contents 1831 0 R +/Resources 1829 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1675 0 R +>> endobj +1832 0 obj << +/D [1830 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1833 0 obj << +/D [1830 0 R /XYZ 56.6929 752.2728 null] +>> endobj +1834 0 obj << +/D [1830 0 R /XYZ 56.6929 504.0748 null] +>> endobj +1829 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F41 910 0 R /F48 925 0 R /F53 1002 0 R /F11 1343 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1837 0 obj << /Length 2761 /Filter /FlateDecode >> @@ -7633,33 +7974,38 @@ stream xÚZßoÛ8~Ï_áG»QI‘”Äö!m²EÝ6»I=´yP,9jKYKNÎÿý
9Cê‡%åpw(PKÃ!gøñãÌ _0ølj ˜Ðrk(ÆÕbµ;c‹'hûxÆIçÂ)]tµÞߟ½ûUÄè(Œ÷ëÎXIÀ’„/î³oËËÛÛëÏW7_„Š-ß犱åï—Ÿ¿^~BÙí¹——¯ïà5R,%nÔ"¶¼ºùxþpÿÛÙõ½w¦ë0gÂxò÷Ù·¶ÈÀïßÎX t¢¯ð®u¸ØI%%…p’íÙÝÙ~ÀN«í:€I ’0A c(Dšu¾É÷f®zÙlÒÆ<%Ë¢FÉ߇|_ä¾”yžÕØÞT(úQV¯®oŽM?ò#JÒ’ú¥Û§j_4›õ%+Ú[yÌ‹ò už¼BDË›[ßß|¾úÙ)꾃YUæ4ÈÑ, rÁy • -íôž÷ç<YV/EF&Ø2}&áó¾H›Üô x(ÎX a03†™*uÑä:`:¤c&;2„ŠA}:”€¥¢È©5àÕ./›ý-Jì"t§Kj&©K™î -ûþµ²Æiù‘³ù*Ï&z<o4x]<‘¹ïL±‘
|’(Ih;ü4¶qÇ.*À0&ï„Z;ñ¤ëaÖ.œXÄû,2Ž–ÈWÁà ‘‘ì¯'Âdͨå=q“IØ -fžLA¤FÁ -ê<æ@ˆÂìcóf¢–Q±”C³øðõê–¨Žk5Øчr›×nåJü½üë×?)&Sì¾ñ3Éb~¡¡n£zAC¹Ä«´¦(žâ…öTe‰Y¥?0ÖzS4 -EÀB½A£ŽÖœ–§ÑËê„E!,wªyÃ^ëÔò€EØ&’¾id‘ô,bÄ"éY$=‹˜c‘ä=1Ç"Ùe‘J ã9°…SÚPiÕŽe“þŸŠ¶ªWÊ$‰/@»m˜’x2ÍI± )C(.T?jt*<JäkÇ·Çtõã5m—%Éî9mŠÇb[4Çsι S‚3ÜFã{Ê—•ùßÕP!Ôƒ‘R±oé–Æ-¬™Õ¡hLÛ$ßd¬ƒP†jžo]i¾y-&djŸŸpN1(š¡n™5îµN÷9§ú’÷ÍßË®ª…³m³?‡SV¹Jq?‘73ÃHbT3<CÌ·Å93vša;fÙNaFù8Ç<Ô14æ¡6«hÞQL΄îBDg$(êˆR*HÂd˜†ýDL™™ïMvœ !R¨@*-ÞXÒŽÖÌ’:-»¤YµK‹òSOÛÝ8\W<JX<ï×:u¡¿®àCÉ»çÂ)èDäJx¨s„ÇÄc™2¤v*þBnR³Øý~°x[zÆyDˆC1ª¥;Dv'>ðVB -™+î`…†€TãøÅ}«Ÿó•¯¼my•Ž./„Ђ’§O†®¯ýÓtÈH»`–Tª6…®">~ VB pGõwy³z·Ïëjû2u¬Ö°*¦Nh'šÐIÑLàyÜ’½þÊðÎÊPˆ\AŠÆð}¬¸;z
„ë$€³€ó÷'cÆ?uÜ‚ZQ‹h¬Ò§$žw÷ÕàTNî)±%†0¿§ºZÓ{Êkù0ÙÎb4LÎoÃä‰õñ0Ù3oS³ I65ƒS³‘`j6Otæн5
¸¢¦%Ë
K<2:Žö¤>œª0ø%Fã8}ÚšæQÚBN‡g¥ˆDY:ã®ü¡°‘Œ·‡Mfø‡Uã‘Ξ½l܃@y:åHuåý£;ÿÛ,0Í2uZÄñ,ëhÍ°Ìiµ,ÛT¯L‹e3ñ†^ëÔƒÁ…—† --Ø»ãžÎ®3®o¡ë#ëXÝÿbð楀¹ØæM^B5<Éa®Â Iâ7Ît]i{-ÏáÕ<‡g·>±>ÎážyËa`Uð€A‰Ãæ #(<|¸Â_ÃáÕ&_ýÀb -LCÖ ç©ÐÑš¡‚Ój©°¼!œ5ÜÞžX¿!왾Â/†SÅ!}P|$ÔŸ.ïîÜ…l^v>Ãù"ÑëRmä?‰L€ÇAGo`ÛQš†Ö)µ7‹
¬ú ¸R ìˆYÃ^éÄrZ ;8õLÿwÈÞßú?áêJe˜¿æ™óäÿç?iÿ$FÆ +íôž÷ç<YV/EF&Ø2}&áó¾H›Üô x(ÎX a03†™*uÑä:`:¤c&;2„ŠA}:”€¥¢È©5àÕ./›ý-Jì"»#Gà¡f’º”é`[UåzdtXí–œT驪i½¸5ð+N`IDŒ!x|½þó\©å?Ñ‘/·÷7_>ßÌ@ã Ö\Ú~Yñ4XðÇäG»0¹™'š˜ŸdYv– ªÖ(34<’è¹)ª’º¼nŠs¾\mh€µr¯|GJ‚è5¥ÎEI‚Má:m«êÇáÙ¹`¢^»4ËIl™Ì7¢^¢^}ØÂ"Ö]¸Éù8áP?oÓ#2šEË»jgú‹'&b3`M¢:o¨mmdÉ¿3&Ò'|~,,9@ÉÎH8ÏD´mr˜Áþ<–K³}$[ÖÞ~–7ù~W”ôêð€N5ÀG +ÆØ¥»æá•b<»¼:4ƒžDc§¯u³‡
òTäuà}ÒA‡‰õé:Å¥[Ö$ÄÛÐ2`^Ù +Y¾N!§ Îc„(Ì>6o&jK94‹_¯n‰ºà¸Vƒ}(·yíV®ÄßË¿~ý“b2Åî/q1“,¶áê6ª4”Kð¸JkŠâ)þX8lKU–˜Uúc7E£P,TÑ4êhÍÐÈiy½¬NXÂr'¡š7ìµN-XÄm"é›FIÏ"F,’žEÒ³ˆ9IÞcs,’]©:n#° +š2äâBõ£F§Â£D¾v|{LW?^Ó6qY’ìžÓ¦x,¶Es<眛0%8ÃÍa4¾‡¡|Y™ÿ] +¤Òâ%íhÍ,©Ó²KšU»´(1õ´ÝÃu…Á£„ÅóxSúë +>D¼{.Ü™‚ND®T€‡:GxL<‘)Cj§Rá/Äá&5‹Ýï‹·¥gœ×H„9£ZºCdwâo%d¡¹âÖYhH5Ž_¬Ñ·ú9_ùÊÛ6WéÈáòB((yúdèúÚ?M'Œ´fYA¥jSØê*âãj%! +wT—7«wû¼®¶/SÇj
«bê„v¢ ÍD +ƒ_b4ŽÓ§i¥-ätxVŠx@”¥3ÞèÊOÐ +Éx{Ød†X5éìÙËÆ=”‡ SÞ!€TçQÞ?ºó¿ÍÓ,ƒP§E¿Á²ŽÖËœV˲Mõ:Á´X1o8àµN=\xiðRõ]¸Å¼…@ Ûº`QZ{è•ÒC°Íü}¦=OB,ðlì+v{;5
137Ôú-ˆ;Z3;-1,ðhbTÀȘÉyë^ëÔ|߈±âqßþUî.'Òö¼Ò ÈHغð±¬Êã®-&G"®9†¡îÉã,rè…q@
óÄ]iˆ½–·¦U¹=NÆÊYãm¬<±>+{æ¡ö¨w¦´NÓ¶6÷—•³¢WÆ3&–øSÐAX“J¼]Gk:§Õn½MŸ¦¡›3Þnh}º®ùËÿ˜n‘†IúþÁŠlE`J Õ½á•%Aª·@íhÍ€ê´Zï²yPçŒw@ZŸ +&Ç¥—M±Â¦,mR“ëPá± Alqª”Bö|…’.p W®¯„sçCOÙlض±<¤3G{¸MÝå3$öžÓ¼X"دdÖ9ôÎl¦UÁ ”WÂÏyØ/ÔŒƒ‡”Žß(Ђ½;î©áì:ãúº>²ŽÕý/o^ +˜€mÞä%TÓæ*’$~ãL×Õšæ°×ò^ÍsxÖxËáëãî™·PE +*8– +ÛÉÂYÃí
á‰åñžé+üb8UÒŇABýðéòîÎ]Èæeç3œ/½.ÕFþ“ȸq„qô¶¥ihR{³ØÀªŸ€+eÀŽ˜5ì•N,÷¡•p°ƒCQÏô‡ìýý§ÿ®®TVùkŽ‘Ù1ÿAþþ£‘öObd`ã8N¦lBs甉31tÝÿyÉ©ïÿœ‡®cendstream endobj -1762 0 obj << +1836 0 obj << /Type /Page -/Contents 1763 0 R -/Resources 1761 0 R +/Contents 1837 0 R +/Resources 1835 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1754 0 R +/Parent 1840 0 R >> endobj -1764 0 obj << -/D [1762 0 R /XYZ 85.0394 794.5015 null] +1838 0 obj << +/D [1836 0 R /XYZ 85.0394 794.5015 null] >> endobj -1765 0 obj << -/D [1762 0 R /XYZ 85.0394 695.9587 null] +1839 0 obj << +/D [1836 0 R /XYZ 85.0394 695.9587 null] >> endobj -1761 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F21 658 0 R /F39 863 0 R /F48 885 0 R /F53 962 0 R >> +1835 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F21 690 0 R /F41 910 0 R /F48 925 0 R /F53 1002 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1768 0 obj << +1843 0 obj << /Length 2838 /Filter /FlateDecode >> @@ -7672,206 +8018,221 @@ xÚ¥Z[oܺ~÷¯ØGITR¼H*ЇIrОº'Z ñƒ¼¢m!Zi³ÒÆp~}‡wR·=m±¢Èg8óÍ…äâ‚Þ1žò2+wyIS† Y·G†R„Ø…xHµaKåsl6‡Õ³ÉÛç˜óåq7é˜.¹CÓ:¹l®î‘/JÐêIÿ ŸrÍ06ûáÏò‡ÊÕO7ù8à¤KPhªZ¼–ÛPìé†æ§pÖ÷4Ú‰íËÄ‹cî¾ÛDǽ€ê¥±Ü?’2ƒzÈ/}A$ócˆ¤› ©Ö䨂¾Ÿ¦|Ë"eä[C3ç:©Š TÏ9‰ÙÞx|©–TLvêº[×—Ýz4×À •ÞÅÕßëõÉìÇ1÷s5¹çøBÁRm˜ÂRySÈ$&h-¸n²÷ÁuÆ9¸FX£È:EÅÖ'n·"Â3¿ŸpÒª·Aìý‹ÞÏUjJ¥qhšÃW˜§2´®|„¶²·›àñ|êtùOKåzë%Ë]´Â+ðìý‹EXøuH ¹ñÉéHT°T¾X‹ï:2H‹œl3wTsî“ ;¢a3¤Z7Œ£ò†1g½ó=Ò¼ÄÛüÕ\€Ø6ࣄ#KàmCm¨µ
lCÝI1J¼ÈêÕ›‡”Ú<T›‡.™åÆ<445æ¡Æ<4:]Þ6ìX‹²¸JCª
óX*ožºnäêªvn.ïZòmÕ\‚Ø> ©ÜvGæáÖ<Üš‡GæÉyxˆ¬Þ½}(7öáÚ>|É>¥µíÃ}¸±Oî죂)/Óœ“ºhÃh¸„½¢æCªu£9*o´¶]=¥ÛäìOéf¬—Oé"ÞŸ„‰4¶„Û·¢2M)Ò<ê|EˆTëæ4EüÂaF@´¡$C¤o›ƒøËíJ¹¶ÅÓVkS–ËÅZÈt£ðcó¾l€Pœ÷êÄÞõÕ4*ý°Ù^’öKW¢P§ä,·Ç÷·G(î6ü ïê!BYr-“Äg Óøû·V_ë99
é¸ 0¨BpŸn.;*{6jVëÎ`oÒ!6'éÅ—9HðY/>IŠV¿Ö b—r{»{ ®ÝIê^agÇstaRm ÖR™ïFsÌz·Þâ¸õ”õŠ[‡¼
tí}—l¸Ãsé¦A–®7O¥jh|~£ö–("s§7ºoœŒ‘´Ä˜m"½ÌXašnEUOä³ÂÑ -.FËMley9ƒt(¤]A°C',ÉR}øóYý´Í·¥³gð”´$q,ÖqféšÉÿßXOp˜´h«{1=hº}{®§GŒêBÎB=üûÕÊï€/]þÚYçú¿ÿ”çÿrHsȘkw“YÎRø˜[¡¤&0BsÇAiF íÎeÿ/Nýýendstream +.FËMley9ƒt(¤]A°C',ÉR}øóYý´Í·¥³gð”´$q,ÖqféšÉÿßXOp˜´h«{1=hº}{®§GŒêBÎB=üûÕÊï€/]þÚYçú¿ÿ”çÿrHsȘkw“YÎRø˜[¡¤& endobj -1767 0 obj << +1842 0 obj << /Type /Page -/Contents 1768 0 R -/Resources 1766 0 R +/Contents 1843 0 R +/Resources 1841 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1754 0 R +/Parent 1840 0 R >> endobj -1769 0 obj << -/D [1767 0 R /XYZ 56.6929 794.5015 null] +1844 0 obj << +/D [1842 0 R /XYZ 56.6929 794.5015 null] >> endobj -1766 0 obj << -/Font << /F37 747 0 R /F48 885 0 R /F23 682 0 R /F21 658 0 R /F53 962 0 R >> +1841 0 obj << +/Font << /F37 779 0 R /F48 925 0 R /F23 714 0 R /F21 690 0 R /F53 1002 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1772 0 obj << +1847 0 obj << /Length 3317 /Filter /FlateDecode >> stream -xÚ]sÛFîÝ¿B3}¡§Õ†ûśɃS;9·iâÖNïnÚ>P"ms*‘ªH9qý,EŠ”|Ó^2 w—Øß -hGôU¶.j@«Š…Š"É@pþø ©Dh4C\Nœ‘ -•a€ûÚÕöiŽ‚ßaYWM™Ã½e9ßgÑÔ«][<}6WI$”’Èr)Rk•;ùÎñÍŠûl·jiò”v¼^6ôdÎ9È_ÃPU
LwM \«<齃é0lÚ¬-ÖEÅû=cuÚgYb„Ýâ¿*Úå«mxp·û)YéYø
œ˜Àñ pHF… -`£ ª‰:NA‰àê0©*µŽT¸
S‹+%¿ÙÀ2°7PGx
vnŒ >€ -0Èç²}Ä‘ î‹Ï¨ƒ¸èÏ6¨X(>¶j‹í†VZd¥ƒàƒhy•µåSAoª=–¬bèÏåjEK§„À ¾¹¯¦ ŒËGw>¸+§F8 - -¸Þ¥¸8AÇj bCÄù†¯KE¶|¤Åáh
Í¡2šb`#Ä*À»@"jtÚ{Ÿ-Aš˜ -q•”áÚm‚,_<¨#‹R¸W¬‡ŠâIu1÷±Deu™ï´«CwV•ªBKcWÝ´»E³bø¢€*¹í‡ÛUCÔÖžV>ÔqÕé :ÕYP‹ÜƒkhG -ð`ú:¨1Öâ -{;$ᢅÂuƒÉpDžBEàFÊf³ÊžyÑ1PH´ètÆqV9]nhæ…É^LF¨l…ίÈþ°ÇÂþà¤lØBÊ®;Ô JR¹4¯£&ŽÉUõis\¤ uQÇ/ˆ´uB¤ª)„î¦XŽÄiC¨DTry5Æ>'¤5qläýO$
ÊHBÕÿöê[‚—¤²Ú=×p+Ï~…s%œ88<ðã÷¼£ä¿†6¼üÿKšcd”i´ßýñænŠ’¹±"Q‰F¾QŸåyÙBêÒÙ6u5Ž(½DŒRþ#Š ÓP@M~R
ö0Ç•€a:hʇåcÖLä8JÄp ¼äïPüPCÆ*Õ}Äß:„s9…”RX³>TY»ëÌQaÃ{!h‹°Qg¸ËÐÐk·nàÒV…Í·õ¦\9ãêRÍ/'šÀ&Q¤ÚôîøRXAHK’éð¼;ï$CH UŸ!·×ï¾ýçÅíÕqéCÚ
aé%ù÷ Nh€‡r:ÐnwØbšÿ^<¿þ -þŒô ‰Dd}š„jLÃPR)"FC"\í…Ì™»«TðK«‚ÆèÔAØÔÁv¶çI°£îÎ~ÞŒþŸÞ¹k<ŒÓ‡‰†§6¦]ëìë¾IÐo!í…¤¦kFÍ{å’TD -F“~JÅèBM:ªñrúo{ªîÄyÿȱ¹*p-±ÔñóÿäT!?J_HZúPǽUÕE¬¶Þ¸ÆÙ(k‰ ÏÍiìÔýAØ’"¶2âÿ*æ\¹N~Æ¢L÷A^1éƒ7ÅÓ?šd´.4çV tí¢2ÏZ×ö -°¸¦ÌfÅ„aŠX:@*Z$_Øg¡V·Iêãà3Ý’‰ÆŒ”}¦äi"õÐ×Ñýt¨©,§ÏQäÖ§¿<…,:ôás>õG‘Æ©çÍ"k1b" -Pç2À[â´Þ ˜šã7½XrlEäî2€´®m…KOp}™1õ‹bOýªtßFa•ô×]Pu'~®Ò}º&Ä ‰P¥…Ъ³‡æÉŽÔÆ—qù¨¥Ê -hÈð×Φ[Θž²Ê˧2ß¹²E«î:î•'¹`ŠIç¸mˆ+Í3˜ÉçE³Ü–þ2—!Di>yg‹ú©À_i€ScI«¾ »ÚgNî¿ä<÷WO8hZ #óÂv²Á×N68ØËoÿ3Xv¿ kÚ¾à9æ:oÞmxŸS3åÅ›¦>ôôëÏ›â@G–«¬9Ôw»iê¾ôpÒ<Ö»U>Ì'2¯êý^þ~ËA}y¨¤w«zA‚É$ÿpŸ&Dž.§i×IÁMž2þ9>÷”ño%Ü¢Ë&ùT°`>jIjˆï›švøc¼1»Rеe\ LõD—IÖØ)î¿.ßÖ®ÓÌÝļ W¤ðýÒ–À`u·Yñ:y!å”B'QÚnh{\Â=݃©d¨Ž’×O6¦™—Æp°>˜~°\'ÀYIpáT -…²‘Ü»w&9ãK,øà¶Û2Ï‹Ê÷\AM£$š×âyðAËÝeÞÕ;Kßqi‡Ý–)×쾯¾õßc‹/Fûûµ˜†Ê]멼2ìÒ“¿ýK²ýïäL,4~}ŸL› n àŽôD!_ ’n1+IT<AûœÓ4endstream +xÚZÝsÛ6÷_¡™¾ÐÓ +!¾øq3ypj'ç6MÜÚéÝMÛJ¤mN%R)'î_»ØEŠ”|Ó^2 p] +éë*¯Ûæõåáv¥V"‰B9ë¯9âÜQY+Ýc-u,#xßíù\ë8hjT»õ¢Øb; +ê{Cù<YƳ'žÑÖôÌ6›â\Ù–ºe…zõÖö¥Pa*¢Ä(ÙWÙº ª¬**Š$Áúã…¤¡ÑLq9±F*´V† îk/TÛ—9 +¼‡e]5eû–IP伟ES¯vm!põÙ\%‘PJâ‘K‘Z«ÜÊwîÜ,œQqŸíV-už²ÕŽÇˆž|rŽò×0T•cÝ]S©UžŒçU|èÐlÚ¬-ÖEÅóýÁÙ?²ÄØâ
¿*Úå«mx°·û©²"2Òá7°vbwNÀC2+€‚ª¦3Ðq + ‚΀EU©u¢ÂnXZ)ù͆áxã +Ût¨þë²bÚ8u[h¨‰ÞŸícÉ#ƒýB¯ÑЉ¬Õ–ÇŠB#¤‘5Âéêù\J ÈiüŒ!š[Ïu×¢%°NÂ`›ÁùIÇzÆ®]謁ȧÌÀnCŠáu?¯?³NƒÃ£¹›m º'—‡rátÀÂÖÛ‚ŒWø“<NM=6HÐZf»†õ1£Þ:µþØÛg^ˆ'.˜–Ìê1]“‰PZ§/èZê„®y*§kE^5¯¿)šŠÀОfÜQ9„/hßt2d}(ïÝi$^ْ + +%ÃkŒßÐ)Ä‘%§€ã]ˆ‹4¬26Ä ö7¼u*²å#
÷Dc¨ŽH•Q1VîQ£ÓnÙûl ·‰0‘¬am¾Ü½¡&õÙ +þŒpD"²‰>-BG5–aˆ†TŠH§ÑP—{a%³pêî2|àЪ 6uÀ«:èÎö< vTÃ>ÈÏ“ÑþâsÁ3w§qx˜(xj#lڕξî«ÄüÂ^jºbÔ\Á²W.HE€æï¯þãœp-Iz0†±Î%À6†Ù—7eëS~_(À¸Vt!k +ù+Ÿá5Ú””CÖ¬é5Ÿ +[S¬@ë—ÂVŸçùg¬êúwbp?Y<´1$á]Þçê{=ˆ ø7ÅI)aÃØÏ»8Y˜¢Xy™_^5U"’]ªêLtêi ÿ’,
'4”7—0•ÑT#÷5κo®¯âÀN¹‰ÃîÙ)z;I;¥b4¡&Ô¸9ý·-U·â¼¿äX]˜–XêxÏù²V*—¥/-}ªãÖª£ê<V[o\álµDg„æ4÷ŽjÌþÀmI[ùÿ9W®’Ÿq†(Ó½ƒ‡NLz'FíM±Åð:M‡
͹(]¹¨Ì³Ö•=àzÒC8ÁVWÌÄDÚxhbþÆ$Öuð¦-¦oÆþ}Œùçý%'0†jm”ÝsaÌÙ®n‹÷˜‹Æ`/´yxº>½ÇôèîúæýmõÇOW?]_ÝN؆ §ûoo +Ò½7×.±•)
”ëÍÊ}ƒÊ8~3®=¶¨˜ÛHÉ+2õõòf·Ù@:Õ§†*„*àâŠ2›†!bé +%htèÝç|ê#Ž4"S6‹¬E‰,ÐAË +£„wNÕø¹bJ÷éšxÐÉH„*=Hì@V=4ß°Kv¢6>ËG%U&˜öÖx)Zû¯ +ÐZBÀ+눊^ã¯1±ÌûgÄg⣜*LüASjû°ão¨À†ìílºáŒå)«¼|*óK[´ê¶ã^y‘–˜0ÇeCižAM¾P;/šå¶\ð‡¹ÁãHsðÉ;[ÔOþJŒß´ +éºË
±çî]â—œçÞ€âì Mbd>¢BÚînðµ»lìïoÿ3v¿ kš¾à>Æ:OÞmxžƒ™ò×›¦>ôôëÏ›â endobj -1771 0 obj << +1846 0 obj << /Type /Page -/Contents 1772 0 R -/Resources 1770 0 R +/Contents 1847 0 R +/Resources 1845 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1754 0 R +/Parent 1840 0 R >> endobj -1773 0 obj << -/D [1771 0 R /XYZ 85.0394 794.5015 null] +1848 0 obj << +/D [1846 0 R /XYZ 85.0394 794.5015 null] >> endobj -1774 0 obj << -/D [1771 0 R /XYZ 85.0394 204.5196 null] +1849 0 obj << +/D [1846 0 R /XYZ 85.0394 204.5196 null] >> endobj -1770 0 obj << -/Font << /F37 747 0 R /F48 885 0 R /F23 682 0 R /F53 962 0 R /F39 863 0 R /F21 658 0 R >> +1845 0 obj << +/Font << /F37 779 0 R /F48 925 0 R /F23 714 0 R /F53 1002 0 R /F41 910 0 R /F21 690 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1777 0 obj << +1852 0 obj << /Length 2180 /Filter /FlateDecode >> stream -xÚ¥ÛrÛÊíÝ_¡‡Î”š÷Æ[ßœØÉљ۔9í$y IÊâ„E¤ì£vúï»4%Ñ£t:| ‹Åb,.+&>1ñÄ2ž„±f>þ$.øäæ>\K3sD³!ÕÛåÅå{Nb2˜,W^ãQ$&Ëì‹÷–I6Üûõn±œÎ¤Hî]ÝßßÜ^Ïÿc4@Á¹÷ûÕíç«„»ŸÆÒ»úp³˜~[þvq³ì¥J,¸BQ~\|ùÆ'þÛg*ŽüÉ38q,'Õ…öóµRS^,.þÞ3Ìš¥£œIÈ1Äc*Ð!ÂTÓY -C¦#Xs ºfÓ
˜Gñ¨É?Ø $âÎ…~u])ÀE/31K6›²È3T¹”^Û¶['݈3G’ùQœWœâ“ŽÆÞâ™PÔEW˜“ÃÀYñý«$³”d+ - WÎèTBøõC:(ñ†Ü‚· ÿ'· ‘ãQÜJk.ÿçÛä4Ö˱™¤f2ÂÈ£|‹XÚùõ- °ø|÷iêûÞr<¸KŸÉ8hÕjÄ(1ÿóñ\E±39y›¼‡©€À[ÛÁ®(QÇÚ£ukB’˜€úÊ}fË·u‚N˜”Å¿L -ÔeBž_Zig±í4òvuûJ¸
r…Û÷óÔ[éû(¾^æ]z¹ÍÛ¦|bpÅW½FL„°?Òüåß¿Þý~óŸK¢nÓ1¸Û›,nnHWwçcüºi;Œ¶ãèZ‰ñ"Cd4@fuÛæéì{¾ÌëÁ¤ÙA[5@-¦{ý}zÿZ)¬4ˆXè÷tã -–Duê÷íç‹óGßs±6Ì>€í Ó5
•é—r•€T
@3¥g -Tú˜¨Æ{X -7tÀâõ¶§z9(6_fÉ»¬¬·íòùé›C¥c¥§Â&A»Ôš–IÛŽö)ÌICÔ3¼aZŠß¹b5Ý«üÂø˜á§ówÕC>Ú@LJ-Ž9vg9vûÍX¶‘ -¬Íõ1¿?Îò{NŠîU~ªçG-ZzŽË£/³jd—CVeò8¶‹f:ŒN´ {(°U2G¥Á·Ñ *Lâ0h\ß,Þ}šß/çw·#ya$,Ž·JGÃÒ/–4øk‹jƒéHÄQ'Í„©%Øä[€+S¬áØ\gì;$MC®ìëø×°&)KËCÂzÿ¶<¤M9z8?¿·rfÅ@ˆä-tí,IÕ1”OOEj1|~HL
¦¼?¨Klmk@ -;,Z[ymíŸçΰ½Çâ)¯ßŒ˜BB”àÚw>óš)$„Jß]nÓå¹]lí¸6e†wU•˜Pû6¶„,½{<"…„ø¾xÜ1Û'¥>‹¼QF]'IÂ?Ší”Õɽêñ +xÚ¥]sÛÈíÝ¿B)5÷‹_}sb'§›œíFÊ\;Ih’²8¡HE¤ìS;ýï»4)Ñ£t:| ‹Åb,>VL8|bâ,ˆe< cÍ|.üIº¹à“G˜ûp!,ÍÌÍúTo——ïU8‰YÈ`²\õxEŒG‘˜,³/Þ[&Ù8pï×»År:“~ ¹wus{=ÿŽ9Ð +EùqñåŸd øoœ©8ò'Ï0àLıœl.´¯˜¯•r˜òbqñ÷ŽaoÖ,Õ€àLª@Ž¨@‹1èaH*ÈŠÇé,€óýòcGÀóó3+š”Õ;;“TfÒ_Èqø
ÄUcÙU50õ\¾—ª'ŸÌ¬”qh¶oÖõ3¬¡ö +d’šÉ#òY,bmhç×·$Àâóýýݧ©ï{Ëñà.}&ã U«£ÄüÏÇsÅÎääm:ð¦oeû¢DkŒÖ® Ibê+÷9˜-ßU :aRÿ2 +ʡɼJ묨idˆ„„}ÈWävÜä•YJÁBrŒ¼á0X`ŒbëÎpWš–&·‘wmM¾{B™®íߪÞ#¡ü¶xBöò:ò6— ˜[žåDpI3q¨÷͈¸,LrïD‚ÿ~WhØ®\cëf(2yŒ9>›B¯Œò 9ÈISW˜-œ.7q7oˆùŸ^n(•¥KM¸÷QÑ)9\ÙØ'~(Y A€Ÿ(;%‹£(/:gÇYŸåiE)9DÏH‡/;£ˆ×óÅÕÛ7cÈg\k¨òê© ³U›c,*á)Ï}(sÌõÒe(PžÑ¹Ñ§Õ¹˜,³à'¸(³ØaBÁ0±ÕÔQÄu;Q`+l„mò– +ÔeBž_Zig±Ý4òöUóJ¸
r…Û÷óÔ[éû(¾^æmz¹Ë›º|bpÅWFL„°?Òüåß¿Þý~óŸK¢îÒ1¸Û›,nnHWwçcüºnZŒ¶ãèZ‰ñ"CdÔCfUÓäéì{~xÌ«Þ¤ÙAÅ}õP‹éNŸÞ¿ƒVÊ+
"úݸ‚%QÇCý¾ýüaqþhà{.Öá’þÀ†Ùp aÚº&`cú%„\e +ÔDıà浩•>&ªñ–…Bà
í±x½…í¨^ŠMç—Yò.+«]³|~úæPéXé©°IÐ.µ¦eÒ4£} +3AÒuoG‚–¢Àw®Xeuû*¿0>føé<Ãýæ!m &¥ÇÛ³ÛÃv,ÛHÖæú˜ßgù='Eû*?Õñ£-=ÇåÑ—Ùfd—¡@«2yÛE3F'ZÐXˆ*ƒ£ÒàÛhЦ?1×7‹wŸæ÷ËùÝíH^ ‹ã-¤ÒQ¿‡„ô‹%
þšb³Åt$⨻“fÂÔlóÀS¬áØ\gì;$MC®l ëøW°&)KËCÂzÿ¶<¤M9:œŸß[9³Œb Dòƺö@KRuåÓS‘ÚBŸSƒ)ïê’ + ¡Òw—Ûtyn[;®M™aÀýf“˜PûÖ¶„,½{<"…„ø¾xÜ1Û'¥.‹¼QF]'IÂ?Ší”Õɽªñ + +!zÆ endobj -1776 0 obj << +1851 0 obj << /Type /Page -/Contents 1777 0 R -/Resources 1775 0 R +/Contents 1852 0 R +/Resources 1850 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1754 0 R +/Parent 1840 0 R >> endobj -1778 0 obj << -/D [1776 0 R /XYZ 56.6929 794.5015 null] +1853 0 obj << +/D [1851 0 R /XYZ 56.6929 794.5015 null] >> endobj -1779 0 obj << -/D [1776 0 R /XYZ 56.6929 626.4701 null] +1854 0 obj << +/D [1851 0 R /XYZ 56.6929 626.4701 null] >> endobj -1780 0 obj << -/D [1776 0 R /XYZ 56.6929 517.4334 null] +1855 0 obj << +/D [1851 0 R /XYZ 56.6929 517.4334 null] >> endobj -1781 0 obj << -/D [1776 0 R /XYZ 56.6929 438.0429 null] +1856 0 obj << +/D [1851 0 R /XYZ 56.6929 438.0429 null] >> endobj -1782 0 obj << -/D [1776 0 R /XYZ 56.6929 376.8269 null] +1857 0 obj << +/D [1851 0 R /XYZ 56.6929 376.8269 null] >> endobj -614 0 obj << -/D [1776 0 R /XYZ 56.6929 339.1376 null] +646 0 obj << +/D [1851 0 R /XYZ 56.6929 339.1376 null] >> endobj -1783 0 obj << -/D [1776 0 R /XYZ 56.6929 306.6767 null] +1858 0 obj << +/D [1851 0 R /XYZ 56.6929 306.6767 null] >> endobj -1784 0 obj << -/D [1776 0 R /XYZ 56.6929 271.6646 null] +1859 0 obj << +/D [1851 0 R /XYZ 56.6929 271.6646 null] >> endobj -1785 0 obj << -/D [1776 0 R /XYZ 56.6929 207.5268 null] +1860 0 obj << +/D [1851 0 R /XYZ 56.6929 207.5268 null] >> endobj -1786 0 obj << -/D [1776 0 R /XYZ 56.6929 137.3205 null] +1861 0 obj << +/D [1851 0 R /XYZ 56.6929 137.3205 null] >> endobj -1775 0 obj << -/Font << /F37 747 0 R /F39 863 0 R /F23 682 0 R /F21 658 0 R /F53 962 0 R /F47 879 0 R >> +1850 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F23 714 0 R /F21 690 0 R /F53 1002 0 R /F39 873 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1789 0 obj << -/Length 4062 -/Filter /FlateDecode ->> -stream -xÚÍ[[wã¶~÷¯ð[åsV\\ì9}pö’ºMœíÚIÛ“ô’h‹'©);ίïf -ìVµWS²IQãÓNšMW5u±bêöJºÉãn]ÖQž—Õ|I]çeÕ-a&Oƒëb͆_Ý|à1?jÙò÷ÍÃÉoyüºèx9r°X½q9¯gÙ´ÝÈ¢§©†³HUÊ$7F‘–Ínµ ø´+·/Ô¬ê¶+¦#{øôìa#0å_n÷i-ýXUðù"EÜè|¥³Äê<ìÁë²›¿Þ–m³zJæMý0Â?,2K¥æìq9ÕZ%Ú s9Uа–tÿø<žR®g6HiZŒÌ!Ó$Mã.¿#ŠÕ -’—ê5ƒWÅ+-?íª§båµÃ˨ â躪~ì7ÂPÊ*â’¦Og9Úg ¨Y¾Eû+Nt¬N%RKõyµP2qƆ ÷ëâWÞêâH5¢6¼l¸Ïõí¿¯¤”qS`Ì,ÍÝpSþ¹,ÑÀ¤>!4ƒT‘é›1a€ž[™‡ô†Ï][.^ˆ$-”–gD¡’Ô¥¡ÓsµZÑ EוëMÇÌ7øT“EÕnVÅK¿"߸ûášdßóÆ?Ì݃wÐø½©YfÈ€L@Å-sàÀ›Ö½×ƒŸ¡Y3«g–1X½€1aíÁêi3‚}j•NŠ]·l¶UWtÕSI¤à~LoÕH&þ¡á‘oáJ0hhíÎÓppúšüZ?^:ܧ™,Ê_„Pu`höfánï¨ß¡PqbèΈ3¯¸Ô›~<4»`.ÁaEoFkàÁ¾Èä6hÉt>®§*ÍÕTKïU·Wn²›w¸tMîßÁ!¥ Â[¿hh å]ÉÉýò…ç|U´í˜ -I‘XÜnš|¯ÛP‡òĹèq‚åVÌÕ¼`†g%=Ñ®†¯šæ×݆h-ÛªY0ƒ[Ò;eMâ¤PÃíy³,š¶.y‹ˆ;ßäxØì|c^îSã†'¨Û‚
_/ʇb·:,øæ›[z¢#¿©»r3£7?ØlÏÙOÞƒ•ÛYÓúÑìºÍ®£6h'e]nm5õØ×H€ÆXyÖïæÊEgã#yÂ9ê$ƒp”n1)ŒÌ‚ÒmǦÔ&;n`ynz &$´Õ¼ÀósÃ"ópÏ=´{a’ƒ„/2ûúCb”IídY 3R©ô²Ú†|ÝSµð -Xí©7 -rrý‘ê_!y%‘G³œÞŽ#.mÍäJ5æajÒ -€„àí$uó0"ü©é[yà1No‚Ã=•{ud´Šº|,z ¦ô;-¥yu`z‘ù½ÊÚy °pm°2Øó3°™Û¦ž²åî »yâøõiw…é.ˆ-YpקŠævϳÄZ+wÛÚÝs“»P'¥ *f§á`œ+pOLï‚øø–¿ -œñj*Gµþ¾ÃEÞë½ÿØ×…yʶk¿®¾¯mLЦéxE"3ò¨¶g gúö¨·‰ÔÙùS(‘Åé½µX¬H¢¬•
Ù4n><¥D -± ˆ^&›fë3«N-ÑŸ‡ÅrØ4û?^c°ÂkÙˆbÇÒhXù×lµI]ðìÓn\NeG°ŽÓGçølD9òŸH!s 6E^ç"«H{Ù”cØ_Ú,6VAýëˆð -_Š‡·=öF`“³TaÆç
˜-µ¼Z¬¬¹ÿ’»·]±å3ü*‚BÅvÌdñÓ‚¿›…Ïzƒæx‘, -Œ¯¬ñ¸«¨ã%›bŽïW«æ9T²f/‡•¬ž=‚“Uøp?ÑF¬P&\Åžr:ø‹T:5™u#çÄ{5(èä‹'Üjèù\x3×|S=¸&âü$ñhª&{BSwäuVt§1Õ%ÊîqÉÓŒ[¾Q‰Íb3ýç‰×Ÿ Œâõ¨Üƃ˜çSÃdÿá5
üûx|561Y´‚/`-:%Xî©£¼LBü‹ùën»ÑiƒÓ:¬¾9eo‘Ø{´€¯Tt7-X]í-Θ|¼¬d4 xÆõE£ÒM=Y‘còê@—24à¤}§ G@ê×åkÐOÞÑi‡iK~M×7üá
²ÏÜó-O:M¢Sí>§$ebðêÀ²{ä”q”·§ok¹Df™=_~T+q|‚ÁË´šªSS¤·Á2]ÀkIÕ°£#^øÝ›*_HeÎFØ衽á}£ 7 6`%üMàÒ2ZËüÆxŸŸ‹ ØÁu™+¶ZÈ -H?| +1864 0 obj << +/Length 4061 +/Filter /FlateDecode +>> +stream +xÚÍ[Ísã6²¿û¯ðíÉU#>ܪ=8“™¬wgÞØÙÍÖf”DY¬H¤F$í8ýëF7@R¢¢™ÝË›9j‚@£Ñ¿nÀòZÀymM$t_§Y!Íõrw%®ŸàÝwW’ûÌ}§ù°×7Wo?èô:‹²D%×ëÁX6ÖÊëÇÕ¿f·?¾¿ÿöî盹2böMt37BÌ~¸½ÿéö{¢}¼ÉÔìö»÷ø3QØIa·DÌþòãÃãÍ¿ÿzõþ1p3äX +¬|¾ú׿Åõ +ÿ땈tfÍõü‘Ì2u½»ŠŽL¬µ§l¯®þ78xë>’€Ñ62V¥"0zJ&‹´ASž‹®ãí5ì³HÊTÁØlnæZ%³¼Âg:«÷mYWù–©‡igOÝ®¨Z¢¼lÊ冺úO‹²ÝÀLŽ-"VùŽ[5¿ºûÈc®VnÔ¢áïëõÙoyü:oy9r´X½±¯gS7íĢ籆Kª”QfŒ"!mên»"ø܇Wj–UÓ9Ó‘=|:ö°á™r/CZC?¶%|¾òC7ñg¥“(ՙ߃·E»|{(šzû-ëj=Á?,2‰¥æ"ìq=×ZEÚ +s=WÐHSÒýGàótJ »ž¤^Jó|bGql,wùE‘o·ð¼T§¼*^iñ¹+ŸóÓ'£Ú‹£mËê©ÜC («Kš?_ähÈ@^±|óæWœèT/¬Š¤–êÕBÉÈšÔOà¹ßå¿òVç'ª´áuÏ}nïÿy#¥›c&qfÇ›òM&õiÄ ì¤òŒÌßM ô<•ñ‘0pHgˆðìšbõfB i¡´¼ +Å6ö^Êí–ÍÛ¶Øí[f¾Æ§šÊf¿Í_û¹ÆÃ·Ô û^Öî¹bîÖÎ@ã÷ºb˜12O™ç&ØLa-Á{ÝõŽYõ<³ŒÁêŒ k÷VO›áíS«x–wí¦>”mÞ–Ï‘¼û1½U#™ø‡†sD®…+Á ¡µ³:GÃÁékòkýxñx<rŸf¶*~BUž¡Å«Ÿ…?º ~ÇBÅŠ±;#ÎœâRoú±®;o.kï°‚7£5ð`_äG²ÔkÉ|9§*ÎŽÕTKçU7vÖ-[\º&woÈà’á[·hh åÝÈÙ+ýr…çr›7Í” +I¥¸Ý4ù ÛX‡²ÈÚàq‚å–ÌÕ2g†=Ñ®Æoëú×nO´¿MY¯˜ÁéJMd¥Pãíy·Éë¦*x‹ˆ;×äxXw®±,†Ô°áê¶ EÃ׫bwÛÓÁ¼o¾»§':ò»ª-03zó£ÍvœýÝy°â°¨7:à€®Ýw-µiÄtöTTÅ!çЖ¢¦žú ð˜T^ô»™²ÁÙ8çˆCžqŽ:J \x¥[MG +#¯t‡)Å…)µI.„Dž„›^¨ m5ïðüR³ÈÜÜs`€é LrPàïE‚Ab¨0$F™8mrtF*¶ ƒN6@Û“¯{.Wn€BÆŒòå¯/yð¶ønYïöàÓå¶l_9>͵Èfw£áŠç²î]S ÆkxC”éíÐ&†`•èûË +%€}³ø¢M&*àè}q +û§Å1X—™5ûbY"ÈAã…\˜q +¾b'ž§ EÖ†~`¼ÇþwŸ¢v¦àN>‡ÃŽÆí26î>&ÑÝý#ýXÕ»¼¬¨kΟ÷ð‹á;¤Ü +*‹¸á&Ó|“FqªÌšæ¿!è¼+L)éQ®iʪžfjΊlt$5™9V–•õ8 qàæÓ³{Ø9~éü–k‹r÷–µ[=ÈÁcòhøÈÊð%‘·œe!¥êg!¿ë¦sîMYòTðl +šƒ2Rü|4…OöŽr!²õéŠÌq=ÇÏ1®éxoáÚ%;\^ÀÙÊØ€"ýo+;˜ÇêÔ?€(4áÌNô“¬XÍ~ú+l±
í¡,"°)—^Ác‹Íü¤„dv¼6yõDö¦X<^Tˆ_ö…œOg<”9A/§.D§‘T³«š,aª$¤eµ*— ø¼ØMýÂBÌ$të“Ò‹]^!Ëô¬-w“h àµV_,—(«“Q¹%ÙïïUr"û +NËÝnÁ†[ÕLz*¸çÅû=°ËX[Ž7øÝЧyŽ/\q*0Á +€ïí$u·žþ<é§òÈcœß‹{*ud´ŠªxÊ{ñ¦ô;-¥~sdzùAemÌ<X¸ÇÖXém†ùÙÌ}]ÍÙr;Ènž9~}în0ÝeÑÞ|àQ %+îú\²ÑœÁîY¥©
•»Ãí?…îÆÚÙƒ¯“Ò%³Ó‡p0Î-¸'¦·Þ|ú–¿ +ÿ:ÙfܫݸÀÉèí ¸Šä®é ){‚ Ô
2×C¾=Ê +j:2s>Ô¸?DšL¾A™\àénÆY$’äòfjé}vçr(• l•âÜ{áÃk–ƒÓQ}.CL(Š‰Êã9%µñ„’RåÂMærxºÄ)h„¿wÌ# +·—¾µÄ3©“I Mâ±Q;«§µHáÕ5ó)Ã^“f~ª,ƒ +@É»`a€7?÷¥ìÀÇb <Ò»/|OJñ¹+ƒÁë²}Ã';]•Â!g|úšÊI¿/Áp‘÷öçŸúã:?OÑ´Í×Õ÷u´y<]‘HŒ<©í¥„3]{ÒÛˆHêäò)”HÂôÎZR¬H¢¬Uê³i Ý}|Ž‰äcLöõÁe2©:·DwÊaóäÿñm^;H&;”FýÊ¿f«Ml½gŸ·Ób°*99€µœ>ZËg#Ê’ÿD +™µ)òZXEÚ뾘Âþ2M"‘†*¨;`À-+½—q¸
]ð<îmðõõSUþNž0ñ'ôæéìÝýíïßk‚äI \”mîáÇ[×QÍî¾ãÖßÞÓñ¯û)gh„ür?ô'Âðé/Ò\ÒÏÀŠò'É–k@éëe“ǹ {ØË®^¦±ÇGnËÍâö©¡©sæ/ßó1ÃþPBJÅÂÈt'*›Ö>Üz·¥ó²òo˜4ÈQ„séHÄâ^CMJãáI4›a•›T€Æ?SŸ£b'v˲٢ãa]EÄfçŽ+TiÙ›û»3z~žpÈWÀ +hQ„€—k3±>m¸,‚ýÊõ¤¹<È0ËmªO¼é„3¡SÖ9¶æ+ж]Îì’_uF÷t€KÏö²Þ[[À€öè;öU2Kév$Áho&oñDi–^/Á=x¤n¼b“$
WÒÇÆéjaþnMoó“ȱUsŸ;0hj9éÁs‰ +\Ÿœ~÷¦ÊW +b™±ÑC'6zèG`ðxh×Èé
Gƒ=X ã¹LÍ%ncœßÌDPíè:Ï¥ÿ°šÈ +H?\?ã7|‚ïQÿÓøË€¿•»nÇ7ø endobj -1788 0 obj << +1863 0 obj << /Type /Page -/Contents 1789 0 R -/Resources 1787 0 R +/Contents 1864 0 R +/Resources 1862 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1791 0 R +/Parent 1840 0 R >> endobj -1790 0 obj << -/D [1788 0 R /XYZ 85.0394 794.5015 null] +1865 0 obj << +/D [1863 0 R /XYZ 85.0394 794.5015 null] >> endobj -1787 0 obj << -/Font << /F37 747 0 R /F53 962 0 R /F23 682 0 R /F21 658 0 R /F39 863 0 R /F47 879 0 R >> +1862 0 obj << +/Font << /F37 779 0 R /F53 1002 0 R /F23 714 0 R /F21 690 0 R /F41 910 0 R /F39 873 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1794 0 obj << -/Length 2137 +1868 0 obj << +/Length 2134 /Filter /FlateDecode >> stream -xÚ¥X_sÛ8ϧðÛ)3Ë?¢$î›Û¸÷Ú4Wygî&ÛE¦MeÉkÉîæ>ý¥H“tæÆ) àÀlFáÇf2&±âj–¨ˆHÊä¬Ø]ÐÙÞ}¼`Ž'ì™Â1×»ÕÅÛ"™)¢bÏV›‘¬”Ð4e³Õú6xG¹ 4¸ºÎ²ÅûðŸ‹ÿ|\\_†L¥Ró››ÅõÕòß—!—˜•ÒàËüúùgÜ»¹T<˜\d—ßW¿_,VƒZcÕF§¿.n¿ÓÙ,øý‚7Ì~‚¦Ÿí.")ˆŒ„èwª‹ìâ_ƒÀÑ[{Ôë -F 1÷ø‚³cDIÉ'ΊĂëŒåÕ5•ýqsóõÛ¥”Áʘ‡ÅÈ‘tò˜¤Œ)<µq<lÄ“’4¢)°Žû¦í<r8#RÖ3å-\Î’àNëÚPipw,«7–Ý=n¢’°õ'•´¬;}¨ó®lê¼*ÿ«×øjÝìòÒ ©óV†oÚã~ߺ7°âQP:éEî˜ó¢Ð{·™×½´²ÝWùƒ×Ô¡±e -ø‰€°Ü -V̳÷Ë%p&ìQ -ñø‰QJT$^ó'4NÇ”ï÷‡KP¥ÙʼÓÕÞQ4õIºÖîóC^€wp©ë¢Y—õWÍƯ"RwzÓØܺյ=jf\Ê ®œÙ˜F9pÆ*ÀSuÛáFטgj’7Z}8Y€nÜÓùaÁ·&òöÖBXnÐì“}¯Q¸“™D䧈‘öÅCsüÇ™«ò‡«Ïã¡F6ðˆÝL¤*gFek>~mã§PppQcœ'8w*çmSCŒ ÖAôQ^ë9|û!rFaÀ¡ —î›»Ïà„Óˆp%Õ,V1(©_NTš¦~8 ‰áX$âæX7NÂÓ(y¼Ù¨xµÌæï>/<ÁIB£ˆ;St}*ñ³Õ;]wè„S‘{Wiƒ§†«{ç<ësëOçs»([|qbÝîwCáÃ( PO¿Pâš‘džîøyXãA/ -€ž ÄÄ®ÙûoË›Õò뵧0÷9ÔžAj¬ -¸âÁ±uïÜð -3ñº±¹—¨€ýfæ.3;åî`ˆbÔJio¾±½x‚£<À€µ©ˆÈj§4õÛWËÜ(+±ŸÑÍ=Ù|$ ME³§ƒê×zm‡ÑàC\²÷ž›Î
JBG¼äƒ¿¡ø©(¿©Ù8v0…we‘WÕÃÙx‚áDø£G-*ò-y3 dP¨^ÁŒ×˜ÑsMšÅ fÀ -'8
åÑ£àÉKCàSÿ
åÉݱêJ +xÚ¥X_sÛ8ϧðÛ)3Ë¿’¸onã¶ÞkÓ\å¹›l™v4•%¯%»›ûô”"9JÒ™?¤@€€ +F Ÿðg3ƈVŠœ¡4‰ÎË«k4*ýãææë·K¥‚•5‹#é,äIÓxjãyØ€'!‰¤ °ZŽûºi'äpF”¬cʸœÅÁ1•¥’àîX”-nþ,Ú{ÜD%aëOªhQµæPemQWYYü׬ñÕºÞe…Re;¬ß4Çý¾>´o`ÅePxéy晳<7{¿™U´¢Ù—ÙƒWW¡µe +ø±€°ëÝ +VÌÓ÷Ë%pÆìQ
™ð£”h)^ó'4ŠcÏ”í÷‡KP¥ÞŠ¬5åÞ‘×ÕÉÚƯî³C–ƒwpiª¼^ÕWõfZE¤î̦vøuc*wÔY͸ ”A\y³12àŒt€§þ:š¦Å¶¶ÏÄ&n4æpr:]û§÷/(‚-näí…°Ü Ù;/ûÞ p/3–䧈b‘îÅC}üÇ™Ë⇪Ïã¡B6ðˆÝŒ¤jgVeg>më§PppQm'8÷*gM]AŒ ÖAôQ^™9|÷å(¸&4æÊa{÷œp* ×JÏ"Rÿ + p¢“$™†“°—E:¬éÆiLx"ãÇ›ŠWËtþîób"X¥"TJîM1Õ©ÀÏVíLÕ¢NDî]i,žB®î½óœÏ?½ÏÝ¢hð-ĉ=´ö»Üõ…£@Y4þBÝMˆkV’}6¦Eâç=`Íz(2þ:|%*Öžép™Çjã°‘144‘NÜ‘ËÏX6Î~†¯oM›¿=˜¦.Or|3uKN´oþ9ýú:‚¯‹Sfaò
´h°¶›‰ÝX%‰Qw§„ãkR(šªãºj“‡?ÌÃë´‹€3–ŽõÚ"ͤR +øâî¡Á±ñïüð +7®Ø4¸ûÉ”å.«ºPe²—÷éËü}Ê€‡¸Ž¬‡|tt@ +3ñºv¹ë€ýfç.;;e-î`ˆbÕJhg¾q½xŒ£<À€µˆÈê¦4˵ۗÇÜ}('±›Ñí=é| My½Çƒê×fm‡ÑàC|²wžÏ
JBG¼ä‹¿¡ø±(¿©Ý8¶0…·Ež•åÃÙx‚áDø£C-*²-y3 dP¨^ÁŒ×˜ÑqšÅfÀ +hH^ÔçšPn„LÉx<Ö.Ý›¼p Ñ Ëß,QwwöïKÛü´Ï»¢õlº|ÈàO07MàÇ
%T‡U')¿¯‹ÜŒ%¹ÉÃÎpGÍBË˯;ùÎ +"œCÊE’Låñc¿áµTÞ÷jè{X°³¼GUçøgþ5††ÓþÕ;‘+´o)þï”ÿ9‡[$É3ešÇŠÀá¨SÊz‡Ñä)ùÿžŸêþ?^Ï‘endstream endobj -1793 0 obj << +1867 0 obj << /Type /Page -/Contents 1794 0 R -/Resources 1792 0 R +/Contents 1868 0 R +/Resources 1866 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1791 0 R +/Parent 1840 0 R >> endobj -1795 0 obj << -/D [1793 0 R /XYZ 56.6929 794.5015 null] +1869 0 obj << +/D [1867 0 R /XYZ 56.6929 794.5015 null] >> endobj -1796 0 obj << -/D [1793 0 R /XYZ 56.6929 751.8114 null] +1870 0 obj << +/D [1867 0 R /XYZ 56.6929 751.8114 null] >> endobj -1797 0 obj << -/D [1793 0 R /XYZ 56.6929 637.809 null] +1871 0 obj << +/D [1867 0 R /XYZ 56.6929 637.809 null] >> endobj -1798 0 obj << -/D [1793 0 R /XYZ 56.6929 571.6272 null] +1872 0 obj << +/D [1867 0 R /XYZ 56.6929 571.6272 null] >> endobj -618 0 obj << -/D [1793 0 R /XYZ 56.6929 530.4875 null] +650 0 obj << +/D [1867 0 R /XYZ 56.6929 530.4875 null] >> endobj -1799 0 obj << -/D [1793 0 R /XYZ 56.6929 492.9536 null] +1873 0 obj << +/D [1867 0 R /XYZ 56.6929 492.9536 null] >> endobj -1800 0 obj << -/D [1793 0 R /XYZ 56.6929 459.984 null] +1874 0 obj << +/D [1867 0 R /XYZ 56.6929 459.984 null] >> endobj -1801 0 obj << -/D [1793 0 R /XYZ 56.6929 390.8804 null] +1875 0 obj << +/D [1867 0 R /XYZ 56.6929 390.8804 null] >> endobj -1802 0 obj << -/D [1793 0 R /XYZ 56.6929 303.7532 null] +1876 0 obj << +/D [1867 0 R /XYZ 56.6929 303.7532 null] >> endobj -1803 0 obj << -/D [1793 0 R /XYZ 56.6929 225.6163 null] +1877 0 obj << +/D [1867 0 R /XYZ 56.6929 225.6163 null] >> endobj -1792 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F39 863 0 R /F53 962 0 R /F55 970 0 R >> +1866 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F41 910 0 R /F53 1002 0 R /F55 1010 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1806 0 obj << -/Length 2941 +1880 0 obj << +/Length 2940 /Filter /FlateDecode >> stream @@ -7879,91 +8240,86 @@ xÚ¥ZmsÛ6þî_¡ò4BðÊ—¹Onâ¼4‹”¹ëµý@K”Í Eª"e_úëoP DJ9g2 “bHa… ›U¸Ð×ïŒ B°$5 ™…TÙ&o¿oócYlL0àpj@:ΩS«(î‹7ßæËâwÎeÞÀöEÉ´}Ê©R¿Tù«éÔ Gë#Ô·üûµb -;¬"3]P{:}ÎÊýá«•ÒH31 ‚#¹
g:UÚ7û¦¥aó„ØQýÁÍúŸû»[jù¾®]w†ÃNfŠÇLàÉôŸ#íˆDJ -š5:š5êf„Gî›|w4uøï™jaÔhrªZ4nâݵ€=£‡eæ!EÕäÕ¬¿ Ú–¦h‹çi%Àqäël_¶
y˜¶¦Òí6Ôh½Æz‡ê98k‹ºb'¾Ætk´ uÞêCÔ¸Õw(kõË!«çL*ð¶Ääe ›qbòÒ0a’ä¼dj@´žÉ+pŒš‹¾l«U± - 6µSÎZ_Ë©ZÄŠœÒ¦-k[®¨sYWmVTEõxô‘*ÍS½/ú){Î{89m:—ãGDMàNódúqMmU턲hbÈL¢Ÿ×¢Oéí9)ÕV?ÞQY¸g`öjœJ2™$—ˆ ÎÁ£,N¼zª˜R‰<?¥
Ln0œÌJ¤¦?¥UaÀ»QðœUT~™ßüòÖ¼†bþáFP›wã¯:]¹w¨(É|]kþß-8ʪW',†º Î -âñ²¬_pÓàÏe;©?—ñAº¶Ê{û㚘¡
“Bó3*8•âÁ´ö‘¤IC+@‘ɧ à[&U·»b“Sumå©7ôò—wo¨Y•Rí¥(Kª=¸Wб¼X»ñê¦)Êüh|Zc øR4†4p¬(Æèrœ¼\³Të'Fˆ:C^²ä}:914ÓZ_˜Òƒ¦ì)ÓÒMùyWT>¸rÎðÓE³ßl²³øÚ.ä°a‹–™c+t^ì7yDm܇”H)cg•«ªiòå8lÈ¢ö+ñ®~to4„;ÚˆŽ%DïM‡²{ómloÎNÙíÍé”C{Ó›ò=™•ÓvÜö¾S1à(%²äÏû0&>zm\ƒZ¡¦£Pg4èQVƒÛ‹éðvW·õ².GÓá³ÂÒáSéÓážxpŠ£ß)\ItNÖ#‘H¶Ëå¶ØiܹAë’ =È
³•&¹Gx¬ö›ÜKlzÈÛ—<¯¨ƒ;˜eµ°Ž”Ç}g&±5w€ƒëß TXpŸÉAì39è»wd‚ªw¨ôÔåu^ØHçÖBÛ[rz£,J?QŒŠJëç±~Þ¸wÜúŽòÜ»“f¿\æÍîÆI¬’”s) -
Qã$îP–Ä»KQèį7«üù”Äxá$äyá:Ô€tý -%¡X>e»lÙZ78Ò€Cî¨ÄK×föˆw -·}«¬uƒâí–nv~AKQ)²U_”“hK„Ñ–»ßYøhÂ.2+éüì©.…0ŽGétéva5|w¨„ð+‚‹:!Û.û
öÑƸ]$D·†B΋w -òC‘Æâ‚Û PgÜŽGY·Ó\¼TjÚ]^=¶O§nG1žŠè¼pj@ºþÙ™0Ë´/Þ‘Ûáž ¥²€•Ì¶ø#”sG” -Rúd}ºw’.Í8ô„¤ðR2•èähQG’Ȉ núŸ¤3i‰÷$GSß|]|xs÷?g½¢¦»û“Fá‚î@=‘`ç¦ïôîîý»6ÄŠ|p…ÁY䂳¨';4a͸H~ïØ^Šcé‡ÌŠ²h¿÷{³=ôWU¾›; -¯„ËÞ ÍN:"wIßaìà:>¯–»ï[ç5qØqÆÃ^(}!¹@gøî@–îÏo}Êü9?Í+`à çÄê@§rõoÜ“&êÉE9E/i^åûÇÇîæ̊źô¸S9Ħzä˜ ¥‰Gïoïn¿Ü -·o»Äp>@zØ@ ¥ùÿzê’ê^.A€Ì3‡tC{}.ëͶÌÉŽãÔÇäë}Y®““‚v,í=] -’±—šò_Jû{#oܯ +;¬"3]P{:}ÎÊýá«êJŠ˜‰ØˆÉm8Ó©Ò¸Ù7-
› ÄŽênÖÿÜßÝRËïÜðuíº3v2S<fÚ +þۂ笢òËüæ—·æ5ó7‚Ú¼ÕéʽCEIæûèZóÿnÁQVí¸:¹`1ìÐu¨3êô(«Îõ€]¥,J”7«u™=žX•HX¤ 8+W‡¬gUR±HÀùÙ“lž#acáx•>Ïc<¸Êp3bt|GèC§ J—î-{ä†ÈÃiDCõí(Vî Æ׫ò;Õ<î±*þ©!+°¼(‰úVöiþ‰öÞÖÒáa^<V¿ ÕGL¡ÁKŒI™Òñ–„¨q–t(Ë’Çᘠ+ĢųÂyЀp=¦ðӸݞthŸJêž}âsFÅÛbe9@-ò²Ü õâC`©JK²TloŸÐÑãÂÒbq™Q—eý‚›Ž +wH‡O¥L‡{âÁ)Ž~K¤Dp%Ñ9YD"Ù.—Ûb§M<zpçK‚ö ?60Ìb|Tr˜äá±Úop/±é!o_ò¼¢î``j”ÕÂ:R÷™4ÆÔÜRþ
¬ƒRaÁ}&y°Ïä ïÞ‘ ªÞ¡ÒS—×y`#?Xm?lÉé²h(ýD1**ŸÇ +øyãÞqë;ÊsïNšýr™C6»'±JRfÌ¥(4D“¸CYï.E¡;¿Þ¬òçSã…“ç…ëPÒõÅ—¦/^ïNGq:*©W½·[±Ì©½9–$n•Û4LG†b”Û€Übè;l↺VµŸÇ&mØíØý\¬ÜëÙÀÂè(•Þì_ƒ¶^{J',֘߆œ&!N° +9/Þ%(ÈE‹n'@q;eÝNsñR©iwyõØ>ºÅx*¢óÂu¨éúggÂx,Ó¾xGn‡{‚r”Ê +üâIȬSï jÞ‡&3-Ø5õµiÁ zQA½omxçbIT4ývˆzÁÄð\XÚÏO.Žð+
¿WuŒøæ¯T‹öè¤éJ6öÅ\(É’dì endobj -1805 0 obj << +1879 0 obj << /Type /Page -/Contents 1806 0 R -/Resources 1804 0 R +/Contents 1880 0 R +/Resources 1878 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1791 0 R +/Parent 1883 0 R >> endobj -1807 0 obj << -/D [1805 0 R /XYZ 85.0394 794.5015 null] +1881 0 obj << +/D [1879 0 R /XYZ 85.0394 794.5015 null] >> endobj -1808 0 obj << -/D [1805 0 R /XYZ 85.0394 181.7045 null] +1882 0 obj << +/D [1879 0 R /XYZ 85.0394 181.7045 null] >> endobj -1804 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F55 970 0 R /F23 682 0 R /F39 863 0 R /F14 685 0 R >> +1878 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F55 1010 0 R /F23 714 0 R /F41 910 0 R /F14 717 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1811 0 obj << -/Length 1931 +1886 0 obj << +/Length 1932 /Filter /FlateDecode >> stream -xÚ¥XKsã6¾ëWè°¹2D -©=h„Ô‡—HPXÒh,6J€“G¬D¢(Œb¯yÐê`˜zòBC,-ÓWŒÃ\]‹Ñ²*›$+k3Kô_¤Ñ6ó_&¿™ÁîŠÄ#µ¬ÚÿÔКMÒX!IiOÊ -i¥ì÷eÕÀ"Ð7¤Ø&yV¯µ*Õ.ÉÍÄn“šÙV튬®³ªôâø¾#y€dˆðõ·}4B‚I‡vR¦~‹ÌÅwY„s)zÑ(D|”˜é‰°G5ž -k«wÔ‡¢PÍ.[š©*—»Ã¶c›Ï:CZ™õ~¹±Ò-å§ÛñµuOÇ' VíÛþÎ@ªžUiFͦگ7nl±Ý?åZ
=Ö ¢=x;Ñpšew²VìŸ{àÉÁë‘Ň;VÚp#I9kÕ™ü:¾½ÿ4ñ Œ`&¥a\èx -·9¤ÄwEÚ=˜¿HÄÁSÖè DîùØPš@iAÖsF ¤U—Äl×èØÞD_Afí¨þ—Û\¡eUx4Eœ:^.en»æyõ-+×fKQ8aí[µÏSC²ìàä{•þÛ£S -âh=×OËîg -ÈCAbþ[Z“ù€,Áršœ¦GoѶZc¿œ&î4ÆOÊÆ:‡‹…;ƒŒ«Õ‰¯e -ß‘O¶ýåHIôÆô‡P/ë;mÓw -3wÜw‹¾|1Ä0
9ûðzŒCº¿´Q«i/}»£2ºPð:¶@PÄDº uæŒgb lË7ƒ !q—„»
L ò8ã'1ùdóóñŽPxXte€ïÊSïêÏ'6MŽ?Íï. -…!O%Î.J¬«$€N5KòóÚ¨A‰_Ýê¢thÖÇjw^„9E˜ž6kΕÏB¡Ç¯<mÛvž½ú7`ULU¤êùÌýÆüàõeÀ›dל»áJ ¨+:©M7z>«´“ŸC7•”ûëÑV_±„l&edkÛ`a¸áN#„½™Z<‰¡é%“›Éüúaz¿˜ÞÍ<õíÛu•''‚MiÈܽԌ:;Ö–öÐþëÏT¹œŒ¦!¹öÖ2ÎL–„Ó, -!@¿‹zª"Ü]¢üüúòÐù‹ÆqèYL£h•ÒÇ$X¼RÝ=Ô¾ÖýÿÖ·endstream +xÚ¥XKsã6¾ëWè°¹2D +©=h„Ô‡—HPXÒh,6JâÇŒ±‰¢0ŠA¾æA¿«ƒaêɱ´L_1suP,F˪l’¬¬Í,Ñ‘FÛÌ™ü×vW$©eÕþ§†Öl’Æ +IJ3xRF +U6°Aí7˜Úˆ‘7
1¡Úí.{AxAjHX| +/#Çð2<JòuµƒsA½UËL3.
Ÿª<µÇáèC{j WOÏYµ·Ÿ×j¹‡ÏfÉ +¸$ÖÞqÏÞD_Afí¨þLŠm®Ð²*<š +Ž"N¯F—2·]ó¼ú–•k³%ˆ(œ°öÚç©¡?Yvpò½JÿíÑ)…@q´žë§e
÷3€S®µ=ä¡ 1ÿ--áÉü@–`9MNÓ£·è [±_Nwã'ecÃÅÂÁ +Þ%¸‹PªC™^í¡œ!vÎÚ U…ª2
š¬ðUã,‚¬‹£S™+Ì€†1â2:i ª}³Ý7Á*Ë}òûåC'Ý6ÝèwÏžpõëns—&ú †-:‹tâòËXHä,['1»(1Ó—ýÙÅÕïzê¤òˆtÅ-±Â[œ¡šH¦è+çøí¢Î¿e
(íCA 0dá©ÄÙE‰u•Ð©fI~^[5¨ ñ«R]”-ÂúïXí΋0§ÓÓf͹òYˆ#áø•§m»ÑγWÿì Š©ŠT=Ÿ¹ß˜¿¼¾x“ìšs7œC uåB'µéFÏg•vòsè¦òïr=Úê+–ͤ샬cm,7Üi„У7óB‹'1”"½dr3™_?LïÓ»™§¾}»®òäD°)
™»—šQggÁÚÒÚý‚*—“Ñ´1$×ÞZƙɒ°`š =<̧
ÿÆãdF +„&Wé~©úÛjE”•ö¬vuÛ$ë…je_¬Þ=lMÏ!c§5ã¶3Rº‡h,–Ð$~Ñ´]ÐR•«u¢{r»°2f¹Û Óˆ¶8 +Np£àÃáiœ>ËMÖvTVÝÚP]»íÞAŽ`{€£fÜ•·eÕ¾A™If‹«T5úUÅ( ó§Ãé€U¿ÔÄN^òtL\¹NÏãÿÐ „{^ÒSÑQ.“—,ÛÚ‡…diß(,¶êBçžX!èwQOU„»KôŸ__š!Ñ8ý/« endobj -1810 0 obj << +1885 0 obj << /Type /Page -/Contents 1811 0 R -/Resources 1809 0 R +/Contents 1886 0 R +/Resources 1884 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1791 0 R +/Parent 1883 0 R >> endobj -1812 0 obj << -/D [1810 0 R /XYZ 56.6929 794.5015 null] +1887 0 obj << +/D [1885 0 R /XYZ 56.6929 794.5015 null] >> endobj -1813 0 obj << -/D [1810 0 R /XYZ 56.6929 635.5323 null] +1888 0 obj << +/D [1885 0 R /XYZ 56.6929 635.5323 null] >> endobj -1814 0 obj << -/D [1810 0 R /XYZ 56.6929 476.3563 null] +1889 0 obj << +/D [1885 0 R /XYZ 56.6929 476.3563 null] >> endobj -1815 0 obj << -/D [1810 0 R /XYZ 56.6929 407.9215 null] +1890 0 obj << +/D [1885 0 R /XYZ 56.6929 407.9215 null] >> endobj -622 0 obj << -/D [1810 0 R /XYZ 56.6929 365.2162 null] +654 0 obj << +/D [1885 0 R /XYZ 56.6929 365.2162 null] >> endobj -1816 0 obj << -/D [1810 0 R /XYZ 56.6929 326.9947 null] +1891 0 obj << +/D [1885 0 R /XYZ 56.6929 326.9947 null] >> endobj -1817 0 obj << -/D [1810 0 R /XYZ 56.6929 293.3376 null] +1892 0 obj << +/D [1885 0 R /XYZ 56.6929 293.3376 null] >> endobj -1818 0 obj << -/D [1810 0 R /XYZ 56.6929 221.9809 null] +1893 0 obj << +/D [1885 0 R /XYZ 56.6929 221.9809 null] >> endobj -1819 0 obj << -/D [1810 0 R /XYZ 56.6929 108.6903 null] +1894 0 obj << +/D [1885 0 R /XYZ 56.6929 108.6903 null] >> endobj -1809 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F39 863 0 R /F21 658 0 R /F48 885 0 R /F47 879 0 R /F53 962 0 R >> +1884 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F41 910 0 R /F21 690 0 R /F48 925 0 R /F39 873 0 R /F53 1002 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1822 0 obj << +1897 0 obj << /Length 3191 /Filter /FlateDecode >> @@ -7971,170 +8327,171 @@ stream xÚ¥Z[wÛ6~÷¯ð#}Z±¸’D÷)mÜ4mâdk·»Ý¦´DÛl$Ò©8Þ_¿3˜o¢¤œ³öƒÀÁ iÏ—›3q~}¯Î$ó,ÓbÈõÝÍÙ7?èôÜÅ.QÉùÍÝ`®,Y&ÏoVD/Þ¿¿¼zùúßeEô]|±°BDo_\ýúâ
ÑÞ_8½xuy}±Y*S`2È–ˆèåÕõõå÷‹ëׯ®þóîêòâÏ›ŸÎ.o:Á†ÂK¡Qª¿ÏþøSœ¯`?‰X»Ìž?Áƒˆ¥sê|sf¬ŽÑ:PÖg×gÿì&ôú¡sÊ°:‹m¦Òm(y.eì¬U#uX'Zi¯Žwïo^¿»ºÞÛ‰ˆ…¥JÄN¥jÞÌ´r……g̸pÝE>]ÒéXëL_20Í,©K‚Áµtv¼äoRʨؖwÏdè|½¦Æ}QÛ¼-VôØ”÷UÞî¶2‹Š&>¤›$sq& qT7C®Ãºé¸¼n–¸ä7?X;à”"Vl+<Ër7ÍT0©l,m–—¬ãšm¨C©Á%cÙ®‹eùAU4¤¬ö¡ Ä5H6߬ï&Lÿ«â°BmÃb§:à:¢ÐÀåúqN¡2ΜլÐÅóž:¥‰³$µÇåê¸f©S‚
g(ÙÍ…9ZÞ^,´’QÓixEÍ7ò†Gtåýµ¬î'Ü@¬·9¯ž'ý°„ÎïD6¥£›‡’g¯Û²®¨½Éy‰Ûb_8Pdì„ÊP
Œ3°©ÍnÝ–k6y[nŽ‘´q";aó×›.oóõŒÍ]ÞŸ²ÉWõ&/«=«ƒÛ-’ã’u\3¢ƒdÓe{Åx JšS%6zùÏ߈Ö-QA@bZJ²RÛš¨WÐðVŞ -ˆÄŸ/‡–ä±ÕŠ—¸îfG»k‹v/¨µáûÑ–?>Õ*˜pC$Ömí%Fx•oŠÁO~¾¬ýïê°OØTÁ©'Òã>1ä:ì—÷‰ÕIX•ÛbÙÖÛ}4°"Ná$>*\`šnäÖÆ©4z,Ý›ºþHŠºyAµŒ2€Ç©ëñ -}Äsæ†l@ÛD2†ê:@59ûdV-ã<tnû“™m«,äSü‡¡dß9íu¦526J&'L;à:bÚÀåM{?“Od.9±d`šYr’Odi:YrÅxü]Ï:yoP:Êõª? -C·g®7ôĦõm¶«Ñåç²i=¤Ÿ\ñ©ÉÍí(ú6õ§bu8ò ËÐBÙæp1OàòæiN¦4M›oÛžû¡Sš$=.^Ç5#ß(ø؇n¶Ëk|b(¬BcEæš1ûÊ
w>=Õˆ_I ÿòT -ÔÜ7o°á¡Ÿòu †Y(gù0FŽe^Va -îÝKÈèEEÌá†ìÒóRË˧ðxZ•Ä¤=åö™×§Ÿj·¹
¢•<ÿïð÷öíË…ß‘Ÿ'/üñíÛëkô÷4ªê6ÇCïxVÉH ø³ ©1P³!¨² -<²‰èw<bÍ9©†-&&ù'µ.NS›1+{¤Ñ -S|=R‰ -’Uc3®è±G
PÅ…sÈA×Æ¿)ס¾œ€¬´/ì®'“Ã>L0ƒ¾â4j¸;m$ï;ªúé««˜ÚnØ;n*n&Φ^#c8Šì -Yw9ÔαK[é§>qA2ä:Œ]—Ç®»Ùb9ÉtÐT½kwíâ®\ï£$T&Môqñ:®ùÆé™MÓ±€¾LÕ2‰ªÿ!£
4˜†…&þ’M IX"úºç…Xh¡Î¥{`mÃÄx‰âDº¥‚\+ífÛƒ·/®XÓ3Ês€–¤±4P9cF)¥b¨¤åØú,Á¡’Nñ{wYùÍöå–à‡}H¸X›ìÄ…Ëëˆ.ïC{ø¸1'–L3KŽ*0Î`'K¾ß–Uˇ~ÎÁC½ee4»Í&ß>¸Œ k®0¸â¢,÷A~¿ÛÝÄ-ÎHÊ8ÀÕ]%U
Àì-ˆ¾3cÃÔĉs#?˜³ŽJ3˜×ÈN†\‡Óqy딧®Ã@•Åªýä|4¶£²u\3““Ú©K÷¯.ÓÈéç‘NOe½kÖÏ‹œØåì[%'yÓ„Þœi>(ðlj>5ñW›Ø¸-† ÄÙ -ÿLLƒí2fFo“Í.t»5 óQ ‡ÖqRÝL3ýçå:”a ÿ”3gÎS€kƒäwtg0©\„g5Méæ‹jaÒ]V£:k_Y¨®²ÈižP×e¬Û¹¦ÏQîàû®õar!h„Íf²Û,/ƒ½·LæÑ4b¸7“ºçV¿OeS»iÊUA#W¼rM¿·¼ª—’®Và©©ëÊOæ<4Ìå.íñ{–Çu¾ä*Ä…PK´ëÏ2 ‰Rw¤H§‚Þ›Û?5ÄÀn¯£¿wq ñq
{ÛnÒ’Ü·[-™~[´OEÙ€{ôª‹H*T]vˆÍþ2ªk%
âÞÑrÅ—ûñc- …Ô_« <B†?{'Š¸/.jCÈæa¿(ð´¬ ©O[Œür Ocº´)ÔK
¯5z³îðó–Ëi …›R“rºV§tK„Í„ëa aªŠLUÑisâ ñ”˜@‡? -…<põ :*¯-ýjØäJæ_+á°¢¿šr +ˆÄŸ/‡–ä±ÕŠ—¸îfG»k‹v/¨µáûÑ–?>Õ*˜pC$Ömí%Fx•oŠÁO~¾¬ýïê°OØTÁ©'Òã>1ä:ì—÷‰ÕIX•ÛbÙÖÛ}4°"Ná$>*\`šnäÖÆ©4z,Ý›ºþHŠºyAÍpKð8u=^¡x®ÑÜ
h›HfÃP]¨&gŸÌªeœ€‡Îm2³Mb•eA€|Šÿ0”ì;§½Î´FÆFÉä„i\GL¸¼iïgò‰Ì%'–L3KNò‰,M'K¢¿ëY'ï
JgãC¹^õGaèöÌõ†žØ´¾ÍöÃ`•"ºü\6‡ô“+>•!¹¹EߦþT¬GdZ({Â<®#æ \Þ<ÍÉ”¦ióm»ÀÓb?ô`J“¤ÇÅë¸fä_ûPÃÍvyOE€Uh¬È¼B3†b_¹áΧ‡¢ñëQ" ô_~JšûFâ-6<ôS¾.Á0å,Æȱ̫ÀJ +Ùk’©y€3:N°®ãš‘np +-ÜX¼à¤ãCpØò +!±øüÈYG6½àŽ'@¬9'Õ°ÅÄ$_â¤ÖÅij3fe4ZaŠ¯ÇAê1 +ôpÃ:Nª›i¦ÿ¼\‡Ò",áŸræÌy +pmüŽî&•ƒ‹ð¬¦)Ý|ñ@-LºËjT‡`bí+ÕU9ÍêZ Œu;—Ãô9 Ê|ßµ¾"ÌB.°ÙLv›Eãe°÷–É<š¦B÷f2P÷¼Ãê÷©lŠC`7M¹*häŠW®é÷–WõRÒÕ +<5u]ùÉœ‡†¹Ü¥=~Ïò¸Î—\…ø¡j‰výY&!QêŽéTÐ +9ú8Âe,2m«ló§C‹@:/35MçHò“I:Ï—¸Îöç½³Q =nKHNËõ3“!(ý›6ÿD%uB^ +ÏTFb‹‚«gÈòË%=„ôÛáµ’kž†[<ãj·y¤I€l‰d@Œ÷”‚Îœ¼˜h +z +¾ía}…v+†?ìôq +[ž¶8û÷G üRãã7”ÀZ †Ç,ƒõ^Éw†öªËUu;—lòárçïL°V(ª¦˜Ü3â&{5‡76Q"sø6C‰ÓaŒL"þ:•·ÿU¶-³³¯±‰Õ¿ÅÞ“kö%öP0JÙU’ôŸ¨$¥—ÙìSžÀGQB¾t«ÏÞè<v`ÿº¼+ðGøNÃG:@g +ŒÚ?S ¿lš]˜Ö{#ÐøýxÝÄ;Ïá·ÙýVR7M\ñ» ü²!¯ +_”t>ê2ʳP]ÂXÞÆ—Ò@)«%¿ƒì6õLdŠ endobj -1821 0 obj << +1896 0 obj << /Type /Page -/Contents 1822 0 R -/Resources 1820 0 R +/Contents 1897 0 R +/Resources 1895 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1791 0 R +/Parent 1883 0 R >> endobj -1823 0 obj << -/D [1821 0 R /XYZ 85.0394 794.5015 null] +1898 0 obj << +/D [1896 0 R /XYZ 85.0394 794.5015 null] >> endobj -1824 0 obj << -/D [1821 0 R /XYZ 85.0394 751.8312 null] +1899 0 obj << +/D [1896 0 R /XYZ 85.0394 751.8312 null] >> endobj -1820 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F55 970 0 R /F39 863 0 R >> +1895 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F55 1010 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1827 0 obj << -/Length 2975 -/Filter /FlateDecode ->> -stream -xÚ¥ZÝsÛ6÷_¡·ÊÓÁI -3wÅ·<Löº¸/Óæx¸f鎵X™˜›„`6†RšÝäD‹üxå›ÇšZõž iV”÷ÔU”kêÛåe“n=®·©ë¢ö}^懔x‚½Õ#ž<ìÇ}3L&I컬Ùå¶Ø䈧_22Ët[WÔÛøo]\þµ©}t (šš~?¦Û"K›êPûuÊÌOÏ@¢GÝ=ûÎ «:ú•×éšÔÇcÈ`wtÇVµ,*œ‚…Š
õlS·î½c™\–ÇÝí
cÕ†:?†kêû²ªü®¡î¾øÔ2mèëô -ε=Ð(´d‘0vžÈ5BeOÌZ³äÙ'Ø*âzyóñ -É’H¢Î jl#ïÅÉt?QòømÂhÈQN¸Æ7+ˆ]ðûU]wÛ¼]V¨éGzò4Ž®,øΓ¾ÿ2ú+Ï÷øs§àÈ-œ¸û¹W5hŠW#»DÜ4¼]=”óN[Ć)Ó --ÿùªÂ2kÕYõX_ѼL-Ê™…HËO8ÓT
Ú%Œ\ÀÙ€ÜÈŽ*A -駎fØ–p¦¹’/°ƒša[@MêKw -.œ±É< -j„†ï@[#ÍmŸˆwÝêp̵uš}þñjk¤÷›‡¢yØA𴮧™«8/’˜ÛAÍ07 ¦®MŸ·¢vÍSТFHèñ–d û4Üäÿ˜£!igt«M˜OÂdP!Í÷ÕúaÒQA>Å$0jÞQuQÓŽªE9GU‡ *Òmjr(î‹òL7X›yÒZÔmý(Ä0¹dŸ¸ÛÀÈo.Ppltĸp˜/ßm¶ã”9e¯†²hc½ ‰æ|uœºõíÂË(ëãng†0¶]#Ð5!?¸»Œ+#çå×EM˯E9ù}|)Ѐ„cl¦‚ŒÈà‰ç lQ#ö¤¹7Ü$Ó'ÑIQiîÝ?¶…ŽÚ3D&µƒ·¥I‹²€èÍvµsBÐmt$0~ -:N»Ö4u&èÐwsut4N8oiDã1‡×žÑ(!¶LÛÓDXü>Mí¡™@C: ´8“ˆè
ë f4, œ†í‡[& ãV¿°e -U×ëì$Mé±°!Љ=¾úUSÿ_ùó]Eúžù‘|;¬r©¤SÁq@ä3 -½\÷øýb,ö…+Q`É3ruZø¬ÒCº¦R-àˆy oëáî= YµæǼµã¾¤ß;¿»/ìBOQ‚R¤YŸ”fX[¤«ëùîã§6¾r‡LOU¶ãX][ˆ˜Å"žÈK!Ïid…X”Y±N›¼në{>ZëË‘jÄ.p$=TÇmÖ¶ðÌÓV‡k–Dò…«‹š±:å¬ÎYÔ”(¦¤¶ó[ÐÈ–]^%†)nUËO‡"$tu÷¿Æ<¬_Ð\W»ý6G¿1ɉ5ÉãyŽtQÓiQŽ#/&
Ûü1ßžÕ-5–\ä<a4BX?cY@æØ£²¶z™gùÝñþ¾ÍuaÓ,‹ ڲ慂`5ò€r,ûv¦D³V˜ù-hdËžAS+ÑßòÝ}YuVÞß¼o³•zv„ª;ÜEjø0Á1LØÎ& -ÊÒ A¦y) J¿p!»¨^ƒo@‡ -&Y’h;¿u -e nYÝ_Ö“ëT=]èObžÁƒ] -×Ä‘«8½RHiñ±üýõ¿©“HXÓ}tÕ -¿öˆÖšÑX9ø*øåfCbDk7•ùGÅuSž/…ËSæ4¹öÓ=[®ZÄ?G€NÖæÏ-Ï7hÁú'¨'LJM_ÿvõë§_®G"8„ìÃ%kœà“Òv[=7 þ§º#&Âî_S³ ý‘”;$oŸP
À%³õh´Œ~Þ$4²Ø¢y Í›@ÔÛ›+jQ††
§ãóòÈËú -cß!+kÈ_W°L
wáŽÆ&¼–aã}ç$ì{pß
ž‹˜OCN%C7å;Œj!K}ö?vǺ!ȇ¢áHæî(wí6 +1902 0 obj << +/Length 2976 +/Filter /FlateDecode +>> +stream +xÚ¥ZÝsÛ6÷_¡·ÊÓÁI +áÿ-š&?¬·¸2ÌjyXµoŠª¼\)!—õ>__8—yb™R¿_ʵŸŠ2«ž¨Ý<¤
ŸŠí–úîrúë<ó¨Š0‡fîŠoy˜ìuq_¦Íñp)ÌÒk±21366 Ál
¤4ÿº/<ȉùñÊ7Ž5µê=AÒ¬(ï©«(×Ô·ËË&Ýz\oS×Eíû¼Ì)ñ{«G<yØ9ú8f˜L’Øv3X+²Ëm±ÉO¿ÿdd–鶮¨·ñߺ +¸ük$Rûè@Q45ý~L·E–6Õ¡öë”™Ÿž€Dº{ö6@Wuô+¯Ó5©;ÇÁîèŽjY0T8êÙ¦nÝ{Ç2¹,»;Úƪ
uþö\Sß—Uåw
u÷ŧ–iC_§¨Óòœƒ¾›Qíü”í–ºÝêv~wY§‰½Ã‘-¹óRÞæµW•uUÞçõIÒ Í¾E§åa?Þg>ü.sTn7©ê*}ýàç6ôÝUu³};x"ÂQ;JÕ³M‚i!’E¢c&µI&l V]™1bX[2cU’]ˆã¸—Ny»P®÷p§„qŽ4˜¯YÂh„°®£Ë¢XÇ}Ênz&(Š½™ˆ"¯kÔ‰ªFƒAÍk9[`}ÐØhùæ™F²|“·
h¶Jà2”~ÕÓ +4±ðÛÖMzhœÐ¦òûæ)Š[YÞäk8{%u±¶ýëôöÓçiÉ*^G˜$ÛAÍH6 œd?ŽI]œö‚«t6£H·+8×ôt@£Ð’EÂØy"[Ô•=1kÍ"gŸLt`«ˆëåͯWØH–DuQcy/–H¦û‰’Ço@CŽrÂ5¾XAìڀ߯꺸Ûæí"°BM?Ò“§pteÁïpžôåøEÊè¯<ßãwÌ‚#·p>âîs¯jЯFv‰$¸ix»:z(ç&¶ˆ
S¦ ZþóU…e*Öª³ê±,¾¢y™Z”3‘–Ÿp¦©´K¹€³¹‘U‚ + +ºmÅüî-jdûž +‚³NìÿÎ[î²j-uVl†–Úé§3Ù^?ÝÒOÍ°-áLs%_`[5ö€šÔ—ï\8c“yZÔ
=Þ¶FšÛ>ï»!Õ?à˜kë64û퇷ÔÖHï7Eó°ƒài]O3Wq ^$/0·ƒšan@M]›>o%Dí&š§ EÐã-É@÷i¸Éÿ1GCÒÎèV›0ž,„É B›ï«õ䣂|ŠI`Ô¼£ê¢¦U‹rŽªAT¤ÛÔäPÜå™ n°<6󤵨ÚúQˆarÉ>q·‘ß\ àØèˆqá0_¾ßlÇ)sÊ^
eÑÆzAÍùê8uëÛ…—QZ×ÇÝ0Îal»F kB~pwWFÎ˯‹š–_‹ròûõ¥@Žý±™ +2"ƒw$ž'°EPØ“"äÞp“LŸD'E¥¹wÿØ:jÏ@l™Ôb@ Ü–&-Ê¢4WØÕÎ A¶}БÀø)è8íZÓÔ™ CcÜÍÕyÐÑ@>8á¼¥e]ŒÇ^{F£„Ø2mOañCú4µ‡f
éD€ÐjàL"¢4¬ƒšÑ°€r¶n™$Œ[ý–4²e÷tÀu®Í`ËÏ5ʲ†}³jE%삈?mR|zÈKêC=pλI; 7„¡‘t …õ‰ 6iÝPì +|ïüî¾°=E J‘f}Ršam‘®®ç»ŸÚøÊ2=UÙŽcum!b‹8x"/…l<§Uz`QfÅ:mòºïùh/Gª»À‘ôP·Y?ÚÂ3O[®YÉB¬.jÆꔳ:gQS¢˜’ÚÎo@#[vy•¦¸Uý-?ŠÐÕ
Üÿó°~As]íöÛýÆ$G$Ö|$ç9ÒEMs¤E9Ž<¾˜4lóÇ|{V·ÔXr‘ó„ÐaýŒABf™c2ÈÚêAdžåwÇûû6×u„M³,‚hËš +‚]ÔËʱìÛ™EÌZaæ· ‘-{JMDË÷÷eÕ}Xùpó¡ÍrTêÙªîp©áÃÇ80a;o˜h((_Hƒ0™æ¥H€*ýÂ…ì¢fxPx0n¼*˜dI¢íüÖ4²u—§ï£•ý[‹ÙÍ»|"±æ”¹L²N˜„é8~áævQÓ¬kQÞhŸUsÀNa±uvÏ +ú¢Z}Á¡}þ•‘'wƒ.@Õw:ôoªcé·NC£û‡«µ?`’áõé*üÚ ZkFcäà«à—š
‰ÜTæ×Mux¾B,O˜ÓäÚO÷l¸vjÿü:Y›?·<ß =ëŸ` ž0)5Q|ýûÕ/Ÿ~¾‰Hàh²C—t®q‚OJÛmõDÜ€øœêŽ˜c¸Mͦ}è7ƒr‡äíª¸d¶–ÑÏ›$`ƒ†A[4´yˆzwsE
2ÊÐð¯át#b|^yy@_a¬õ;de
ùë +–€É£á.ÜÑØDƒ×2,b|蜄}Îâ{¡Á³`QóiˆÀ©¤cè¦|‡±Ñ@-d©ÏþÇîX7¹óPÔ!iÂÜ¥à®ÝÆà endobj -1826 0 obj << +1901 0 obj << /Type /Page -/Contents 1827 0 R -/Resources 1825 0 R +/Contents 1902 0 R +/Resources 1900 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1791 0 R +/Parent 1883 0 R >> endobj -1828 0 obj << -/D [1826 0 R /XYZ 56.6929 794.5015 null] +1903 0 obj << +/D [1901 0 R /XYZ 56.6929 794.5015 null] >> endobj -1829 0 obj << -/D [1826 0 R /XYZ 56.6929 119.3275 null] +1904 0 obj << +/D [1901 0 R /XYZ 56.6929 119.3275 null] >> endobj -1825 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F39 863 0 R /F21 658 0 R /F55 970 0 R /F48 885 0 R >> +1900 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F41 910 0 R /F21 690 0 R /F55 1010 0 R /F48 925 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1832 0 obj << +1907 0 obj << /Length 1522 /Filter /FlateDecode >> stream -xÚ¥X[oÚH~çWð²¨ëéÜm?Ò„´é…d•Vjóà€o}ÉÚ†–þú=öÌÛ4Õ*R?Ÿsæ;W›1ü‘¡'f>º>G1\&<ÜÀ½·¢1Ž9mÔ›Åàõ
s‡>ò%•Ãź%ËCØóÈp±ú2šÜßOg×·*ðè
;ãѧÉìóä£Ú»ût4y;âJÆ$*˜Ä£ÙäÓôÚ¹z7½úpu7»?.Þ¦‹Æ°¶ñ³Êª_ñpgx?Àˆùž~‡ŒˆïÓa2à‚!Á3;ñ`>ø«Øº[?j#C0 º66|ÂG’QV³ñÇØ‘püUZáÒ)¢Mú3KCµélôo¦~ÃAò‡h™%ú©'t²÷•0^Ѷ9„ _Z+úÐB¢W³WĥܵA»bQeT¸ê‰66_ßÀQŽ§¬ ’ž+jÈmª|ZnÃjAFÁS¶“‘¾ÒzþÔ‚HKï#B<k›z*v]p xAá—ù˜x£0(âc -ŸÂ.¥M -w¹v&}©ëe™å‡10@ú{ ¢ÀòÙ–Ò&ìlÙn1ùb1ya±¤ùêíÔ2lvëó2 -žPo>*¶&çwöúA%ÂPFÛyîÛ„éWØöàÑõ‚wš
A›rñævvÔøZÛ*‰Ò¨(ó -tµnfêBzÙ2„Ž®Æ H .{³o ó:Òi™½ÑNçÞÓ¡“ªE”DqÇÓg&Õp{.¶ Á‚ƒäåÐjÎG–Õµ?I;¨¾¼¬Ï`Nõu’Î7º]}¶œÛÃ<Ü,Sߪ»§•Þ“!ß±l¿üF%Ö^ÝÀþ;i
/[Œ’ËÌ1ç‰×˜š÷ŸÞóè%er¢¬Ç:#¾h+»óu–'h„wMí‡8V½ÞÇj‘0ŠåÇ×7ìël—ßñN3B†`!ÙK^Ú[®ðÛÃ¥í# LnÕ—
+¸éiÿûÊñSTCæygš Ã02Ÿ£*à öû¦7ŸZNmÿãÜ’rendstream +xÚ¥X[oÚH~çWð²¨ëéÜm?Ò„´é…d•Vjóà€o}ÉÚ†–þú=öÌÛ4Õ*R?ŸËw.sl2ÄðG†ž@˜ù|èú LÄp™ðp÷ÞˆÆ8ä´Qoƒ×7ÌúÈ—Të–,aÏ#ÃÅêËhr?]ßþ=v¨À£7hìŒGŸ&³Ï“jï~ìÓÑäít>vˆ+¨`f“OÓkçêÝôêÃÕÝìfü¸x?˜.ÃÚÆÌ*«þ|yÄÃøð~€ó=1üߧÃdÀC‚3fvâÁ|ðW#°u·~ÔF†`u-lpbcCøH2Êj6þ;Ü_¥E."Ú¤?³4T›ÎFÿfê7ü$Ïqˆ–Y¢ŸzB'{_ ã-`›Cò… µ¢-$z…1{E\Ê]´+UF…«.hãaóõ
¸rô²‚xHz®¨!·©Ši¹
«OÙ~LFúJëùSjÓåûˆƒÀÚ¦A§Š]QPøe>&Þ(Ê°è +Ò]Ûª\zU!H-Þ¦Ÿ#ß#¦
<Ü\)‰T0a‘Ç ¢\¦iXxs¨/ç»]ú&Ÿïî~ÍÛm +%‘†:3燺ƒîHWYZdyí’£ZŽ—&\œ"׃Î[‰œÂò¤îÎr.¿™fQÇV W +·Ï +Á<çÚê¥má.<£ÏEã”źÎÙ"(ò9—]ó®¶õÙ”UÙË°_#§UËaöô¤k¯ïŽ!LYdZè6Ðâ£tïV¡º82ѾšŸk endobj -1831 0 obj << +1906 0 obj << /Type /Page -/Contents 1832 0 R -/Resources 1830 0 R +/Contents 1907 0 R +/Resources 1905 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1841 0 R +/Parent 1883 0 R >> endobj -1833 0 obj << -/D [1831 0 R /XYZ 85.0394 794.5015 null] +1908 0 obj << +/D [1906 0 R /XYZ 85.0394 794.5015 null] >> endobj -1834 0 obj << -/D [1831 0 R /XYZ 85.0394 562.7154 null] +1909 0 obj << +/D [1906 0 R /XYZ 85.0394 562.7154 null] >> endobj -1835 0 obj << -/D [1831 0 R /XYZ 85.0394 499.03 null] +1910 0 obj << +/D [1906 0 R /XYZ 85.0394 499.03 null] >> endobj -626 0 obj << -/D [1831 0 R /XYZ 85.0394 459.6249 null] +658 0 obj << +/D [1906 0 R /XYZ 85.0394 459.6249 null] >> endobj -1836 0 obj << -/D [1831 0 R /XYZ 85.0394 426.4105 null] +1911 0 obj << +/D [1906 0 R /XYZ 85.0394 426.4105 null] >> endobj -1837 0 obj << -/D [1831 0 R /XYZ 85.0394 390.6449 null] +1912 0 obj << +/D [1906 0 R /XYZ 85.0394 390.6449 null] >> endobj -1838 0 obj << -/D [1831 0 R /XYZ 85.0394 324.0377 null] +1913 0 obj << +/D [1906 0 R /XYZ 85.0394 324.0377 null] >> endobj -1839 0 obj << -/D [1831 0 R /XYZ 85.0394 263.3171 null] +1914 0 obj << +/D [1906 0 R /XYZ 85.0394 263.3171 null] >> endobj -1840 0 obj << -/D [1831 0 R /XYZ 85.0394 199.6317 null] +1915 0 obj << +/D [1906 0 R /XYZ 85.0394 199.6317 null] >> endobj -1830 0 obj << -/Font << /F37 747 0 R /F39 863 0 R /F23 682 0 R /F21 658 0 R /F47 879 0 R /F53 962 0 R /F55 970 0 R >> +1905 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F23 714 0 R /F21 690 0 R /F39 873 0 R /F53 1002 0 R /F55 1010 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1844 0 obj << -/Length 1852 +1918 0 obj << +/Length 1850 /Filter /FlateDecode >> stream -xÚíYKsÛ6¾ëWèHÍ„^$Á£b+‰ÓXvm¹éÔÉ!› Eª$eGýõ]<H‘c9‰Ûé¡ãÅb÷Ãî»"CdèùÈi8BŽ<L¼á|9ÀÃ[˜{3 –ƉÜ6Õ«ÙàåkCúÔÎ-^a!Èp_;¯FÀ;ÓñéäØ=z;9úå³édä’À§ÄŸŸO¦Ç'¿\êa bŒÓñôjüÞŒBêŒßL.GŸfï“Y#X[x‚™’êÏÁõ'<ŒA‡wŒX(¼át0"aH‡Ë÷ò8cõH:¸üÚ0lÍê¥}`pO r`áXýD2!È(郬¦R¹Ÿwõb4h‘õmYõlÉZ[ú1²î–îdfÀNó(N²[Ó‰Ìç¯<“1¦©4ýbD„#£Øôª;;ü9_Y”šN²°ßÊ|åפ¬J´w„§ -á\tý;Y'ÏìšÿõÀž=³|ψƒ§bO Åôgâðÿq³‰›º×=šÝì‚zð‚l¡óæ=ž\]œœÏNΦߕzÖÁnêɧAóœT”: auý„;å&«¢¯fÐfŠÜI {¹-쳞Ù$”™Êo2f3U Ä9©ÌàJ*LìmdÊ0´•ƒ;QÙ£'c %¥5¸ZÏí -1*܉Qq.sÁS`‚Ö¶À$ŒÂ¨¢sBÙ]Rš¹eôEö‰D•ÑéôF×>².åbš}:/‚F+[‚-ª0nPµ:ÜHEos{µÈ–n\s7S¸›9'A×q×Å6Ùº“K[;ÈtUg[a³"Uqdh£€·Rá®Ùa8æ}ãŠÝ×2&º-épa›d™¤‘Öž4µ n5CÈâáÓQ¥1#Je…pnÖ•ÙOT`«(}ˆ6V†x½\Ù¦1M˜¯¡×©j%³ª&Èíz+þJÎkØá•ræu-Ï–ÀL‘¬Î’öz3™n«\fÆ͵ªŒ1œq u’gQšnF„¥#¡ÖF3YÒD™‡fUɼ‚³ÓS*3‘Ê{™–føfc¾¶§øQuºP¢&4j•B§®,´5Ë×ÕJ¡ÊxU’¦¦¥ªƒêÖ›VTÚof¿óJU`tÛ ¬Z
4Äxf½úfÓc`v"…w 0™3ÛVt\S[aV¬—º”nL¯{ +xÚíYKsÛ6¾ëWèHÍD0^$Á£b+‰ÓøQ[n:ur EÈfB‘*IÙQ}R$ÍXN¬vzèxÆÄc±Øý°»À®Èúòý€#w8_ððæÞˆ¥WDã&ÕëÙàà
ó‡ +<ê
g‹/°d8‹®×ÈC#à€ÓÉÉôh|ønzøËg§Óјø%Îäü|zztüûhL]ä@Œ±s29½š|0c磀:“·ÓËÑçÙûÁtVÖž`¦¤úspý#Ðáý +)<Þð&‚ŒƒýOi¯ä?åü@ÉésŽ™G‘àcBPàºT“ +ì… e( ˜[^ÈRa½tÎ$ >|) &<My1]]œ«ùmDhàL>\çï8Ž©@Ä
ÌB-éXãó‘E>¯7"3.Áhkîim«Öj‹2,×v6³MÚ.sÍ'Ë-Ùƒ4|M/’¥œ—2ª6°
lY‚äq!ûÑ©ÄmÁs9šÅ“—g=:öò ƒ§Ã?òÊ,m e|»žÖüXÐ4m° ÆHuŽ¯O“ÀŠ-ã|ì7ËÍÐ…\XÒ¹Åá$L׋K QÏóž47m &W³wg»8NK™§Òžèå¦(åÒžÕa–Y^Æëåv[Ž÷¨åÃ}ØÔÞdpgaü>í@Ì|$|׸þ©
8Ec‰Àw»«µO'[®âDê
ôð'Jým<¶c¨|&q—ÓÓLë@^øŽ…«ñ2Ë’>ÄqÇæ6i¶*â¢BA_xlH!LúÄï½—hO]¸RŸíM:¾ò¾Ð^Sõ 7{p6×ãèsÕº«[_êÖŸuë¾nÍ
n+z]aÖ.çIX=“áÒ5T5ÇEGæ"á¹®%]dù2,ûbp‹¬æøfu(çD]TêÓå×㸋V$_f‘ìCB±®Ü_wÊýcü–/ãÇ»üNö,_ºgù²Ýçoß7ž¾Å^—gÑâFÁ´2ÇŠr“ÈçÛýåžµ/wò‹â.Ø,ßô0…ºG]ÒeúðO0=ª[{Ø{¶\ÆÙªÓU0ÈLÔ£½åµMè
ÏðÔ÷©xQxn°x"<WTðܼƺú'Â2H„]á>',‹îîÙ×ÿ(?f^!’‹ö¡ÿ ëxÏ®ù_ìéžåÛC öŸˆ]Ó—Äáÿãf7u¯}4Ý삺ð‚l¡õæ=š^^ŸÏŽÏN(õ¬2‚nêɧ~ýœT”: aUý„;Å&-ÃofÐfŠÜ‰!{¹Íí³žÙ$”™Ê¯3f3U Ä9.ÍàJæ*L<ÚÈ”#`h+w¢GOÆ@KJ+pµž=ÚrbTЉQQ&sÁS`‚Ö¶À$ŒÂ¨¢sBÙ]\˜¹eøUö‰D|•ÑiôFW>².äb˜}:/‚F#[‚-ª0nPµ:ÜHEos{µÈ–nÆæn¦p7sNü¶ã®óm²u'—¶vêªÎ¶ÂfDªâ sÈÐF>o¤Âm³Ãp ÌýÎûX{Ș趤cÀ…mâeœ„Z{RׂhÇ_åÁóQ¥1"Je…pnÖ¥ÙOT`«0y7V†h½\Ù¦1M˜¯ שj)Ó²"Èìz+þJÎ+Øá•pæ¶-Ï–ÀL‘¬Ê’ö endobj -1843 0 obj << +1917 0 obj << /Type /Page -/Contents 1844 0 R -/Resources 1842 0 R +/Contents 1918 0 R +/Resources 1916 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1841 0 R +/Parent 1883 0 R >> endobj -1845 0 obj << -/D [1843 0 R /XYZ 56.6929 794.5015 null] +1919 0 obj << +/D [1917 0 R /XYZ 56.6929 794.5015 null] >> endobj -1846 0 obj << -/D [1843 0 R /XYZ 56.6929 644.7852 null] +1920 0 obj << +/D [1917 0 R /XYZ 56.6929 644.7852 null] >> endobj -1847 0 obj << -/D [1843 0 R /XYZ 56.6929 574.187 null] +1921 0 obj << +/D [1917 0 R /XYZ 56.6929 574.187 null] >> endobj -1848 0 obj << -/D [1843 0 R /XYZ 56.6929 503.5888 null] +1922 0 obj << +/D [1917 0 R /XYZ 56.6929 503.5888 null] >> endobj -630 0 obj << -/D [1843 0 R /XYZ 56.6929 459.3803 null] +662 0 obj << +/D [1917 0 R /XYZ 56.6929 459.3803 null] >> endobj -1849 0 obj << -/D [1843 0 R /XYZ 56.6929 424.0565 null] +1923 0 obj << +/D [1917 0 R /XYZ 56.6929 424.0565 null] >> endobj -1850 0 obj << -/D [1843 0 R /XYZ 56.6929 386.1814 null] +1924 0 obj << +/D [1917 0 R /XYZ 56.6929 386.1814 null] >> endobj -1851 0 obj << -/D [1843 0 R /XYZ 56.6929 312.6614 null] +1925 0 obj << +/D [1917 0 R /XYZ 56.6929 312.6614 null] >> endobj -1852 0 obj << -/D [1843 0 R /XYZ 56.6929 165.1287 null] +1926 0 obj << +/D [1917 0 R /XYZ 56.6929 165.1287 null] >> endobj -1842 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F39 863 0 R /F47 879 0 R /F53 962 0 R >> +1916 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F41 910 0 R /F39 873 0 R /F53 1002 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1855 0 obj << +1929 0 obj << /Length 2702 /Filter /FlateDecode >> @@ -8148,28 +8505,28 @@ D„RÓšE©„jmÛ‡/Ǥ«Ûû§bY®?÷ÌèÔ ‡±‹.` ÃIÕ¢TB·.\2)Ht•‹paŠûcZ±3hàbÆüC[†<7:Rf¼Õû -tWµãQ†‰)l77ÔuïpªF…Áú±:˜JÆ\ßîÖ½…´½#Xø§æµŠ}ðXøÕ"÷·7ÇÒØ´,\vB&p¡éª:…$׺{Ç+¦[ÏW€œŸj÷²/ó¨yÀù)€É€gJ6
ð¶Ô8À£”øÛÀTexàܼjÓŠE©„f]€ƒÑ0КŽj¯*Ý
AóbÃüñ -8“'¾oh M|äæ…lXV§ë{p§1Ñ 49Gg|R³(4TšÜt?UÖÑíçËŒÏ÷ecR:#¡ýÎð±ˆg–àØ
0ÝýREe±ØÞ@o]žAFˆ
ó&^PóaÄpJñ!4?=¥ PfGÊPÖ©¹ ƒ“xP,RqVˆÆö¹ÍfŸƒ5\GÞÕ
€0g&Œ€uüFîln¤KÏØ(ÔoÒ|1Щ¶fŠ¦ -Ÿ×¥cF[U˜¼8Øõ(°CwÎU–¤8~úÅ_©¿Ç—3¥FŽ†9bL“ ”QœÒW=~Ï:ÔýüÃ’=endstream +8“'¾oh M|äæ…lXV§ë{p§1Ñ 49Gg|R³(4TšÜt?UÖÑíçËŒÏ÷ecR:#¡ýÎð±ˆg–àØ
pÒýREe±ØÞ@o]žAFˆ
ó&^PóaÄpJñ!4?=¥ PfGÊPÖ©¹ ƒ“xP,RqVˆÆö¹ÍfŸƒ5\GÞÕ
€0g&Œ€uüFîln¤KÏØ(ÔoÒ|1Щ¶fŠ¦ +Ÿ×¥cF[U˜¼8Øõ(°CwÎU–¤8~úÅ_©¿Ç—3¥FŽ†9bL“ ”Q¼ÙW=~Ï:ÔýÏ’,endstream endobj -1854 0 obj << +1928 0 obj << /Type /Page -/Contents 1855 0 R -/Resources 1853 0 R +/Contents 1929 0 R +/Resources 1927 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1841 0 R +/Parent 1932 0 R >> endobj -1856 0 obj << -/D [1854 0 R /XYZ 85.0394 794.5015 null] +1930 0 obj << +/D [1928 0 R /XYZ 85.0394 794.5015 null] >> endobj -1857 0 obj << -/D [1854 0 R /XYZ 85.0394 751.8354 null] +1931 0 obj << +/D [1928 0 R /XYZ 85.0394 751.8354 null] >> endobj -1853 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F55 970 0 R /F39 863 0 R >> +1927 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F55 1010 0 R /F41 910 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1860 0 obj << -/Length 2311 +1935 0 obj << +/Length 2310 /Filter /FlateDecode >> stream @@ -8178,310 +8535,315 @@ xÚYYoÛH~÷¯°û QOŸd÷£c;³$NÖÇì™<Ð$eC‘Zq<¿~«/Š”Z’]èÅV±ººÎ¯H2Ãð#3¡HQ5‹G ÆGÒ^’¦:"Eàè¡`”f£x°4/Y}šp1Í\½Mñ\Õͱ Íb˜²q…F'¡<g¢sÄu":=—‰Î. *¼²¢ºP7¯ûº¢PD"uZ¹+ ݤÉS -3¬t¤u™w9„Œ¢¾{›€ d,¤.µºNœø¢JË>Ëí
²±¯›Gë ÎWþ)Ç•Ocˆç:XQ»-ª°t2t¸5È<³õ¢ñˆLëaÒNË]³P•-ýäêbb/m±)ʤ)Ýj:ØÌ€]uÿ8[Bb„YŸŽ1×ñظLl½„*Ÿ†ÇçcËGÃI宀vÓØR8MÔK×Úà -Êé(ªŒLUšš‚½b£C»¥ÕÏþ±IÚ.oÆL–þûÇÛ«O×7ön/2]A“ÖŸ—ºùSWb‚áù†è¯.n\s¬÷Úên}jY¥ÃZH0Åà]ê-aÃÒc2šBñ.'“ 1>3ØŒ¹N§ç2Áy½¿e$¡+vzKÏØr|º˜!˜¢é–× -›z'Tb¢&v½||øÇ—»SµAö±‚FXå.>î_"oœç¯êª›®è7»mÁƒ<¢N€x.ãá¥ÿ -vÞð]…qÝ+
ÇËí€>àF<r°K4JcKM•×·6o~äMÈ@Øд‰¸×ªÞ¶E»_gT/±`8É1
•èüŠš7K§?ì$ØO&*ô%À1õ¾-ùwOE•:6‰
ÐЇ÷täÏËUQæá!D·{Q3ÈÍrÁV2þEx–?õÏË2ÿ‘—o»¨çÚ¶‚ªqâ_•ÉshîáˆÇ’ìïQä-™¤ˆ0ýBdgþ–nû6$Y!)cµ/y{Ö([H‹<†Ô
òÚê’§&Ü…§‘ÃQDÅ!ú³êÂ\Ù„
K£ƒÓÿ¨ŸgµM(ºÇBn:„~?öMTÕâ …‡$þŸ¿÷í¾gjeRÒ0< 1À´SJ+N=Cú”ÁCÝÿî›|endstream +3¬t¤uùø`\ !£(¤ïÞ&`éKí„®'¾¨Ò²Ïr{‚lìëæÑ:¨ó•ÊñAåÓ⹇VÔî_‹*,ÝnF
2Ïl=„¨A<"Óz˜´Ór×,$TeK?¹º˜ØK[lŠ2iJ·š63`GW@Ý?ŽÆ–aǧckÌu<¶.[/¡Ê§áñùØòÑpR¹+ Ý4¶”NõÒµö0À!~$¬ +œ€16öÑ27ۢ̀K2(=ï*ga®9íª× Wy.㪅ꈀøÁò‚Šƒ‰ñ´^ž) ×þÊ„àSņT#Þ—un&sc\S²TìFXç.!É7E¥=l-Ê,µ]"Ó endobj -1859 0 obj << +1934 0 obj << /Type /Page -/Contents 1860 0 R -/Resources 1858 0 R +/Contents 1935 0 R +/Resources 1933 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1841 0 R +/Parent 1932 0 R >> endobj -1861 0 obj << -/D [1859 0 R /XYZ 56.6929 794.5015 null] +1936 0 obj << +/D [1934 0 R /XYZ 56.6929 794.5015 null] >> endobj -1862 0 obj << -/D [1859 0 R /XYZ 56.6929 381.7644 null] +1937 0 obj << +/D [1934 0 R /XYZ 56.6929 381.7644 null] >> endobj -1863 0 obj << -/D [1859 0 R /XYZ 56.6929 321.391 null] +1938 0 obj << +/D [1934 0 R /XYZ 56.6929 321.391 null] >> endobj -1864 0 obj << -/D [1859 0 R /XYZ 56.6929 261.0176 null] +1939 0 obj << +/D [1934 0 R /XYZ 56.6929 261.0176 null] >> endobj -634 0 obj << -/D [1859 0 R /XYZ 56.6929 223.9137 null] +666 0 obj << +/D [1934 0 R /XYZ 56.6929 223.9137 null] >> endobj -1865 0 obj << -/D [1859 0 R /XYZ 56.6929 191.71 null] +1940 0 obj << +/D [1934 0 R /XYZ 56.6929 191.71 null] >> endobj -1866 0 obj << -/D [1859 0 R /XYZ 56.6929 156.955 null] +1941 0 obj << +/D [1934 0 R /XYZ 56.6929 156.955 null] >> endobj -1867 0 obj << -/D [1859 0 R /XYZ 56.6929 93.6598 null] +1942 0 obj << +/D [1934 0 R /XYZ 56.6929 93.6598 null] >> endobj -1858 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F55 970 0 R /F23 682 0 R /F39 863 0 R /F47 879 0 R /F53 962 0 R >> +1933 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F55 1010 0 R /F23 714 0 R /F41 910 0 R /F39 873 0 R /F53 1002 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1870 0 obj << +1945 0 obj << /Length 2748 /Filter /FlateDecode >> stream xÚÝZKoÛH¾ûWØÃJ€Ùé'» ,Hl'ð`âxc3ÀÌ(‰’ˆH¢F$d~ýVõƒ")J -ÙËÚ6›Åêêêz|UQøg#£‰éDE™Í6Wt´„gﮘ§‰QÔ¦zó|õêУ„$1GÏ‹/C¨1lô<ÿmüúññîáöþ×IÄ¿!“HQ:~ÿúáÓëŸÝÜã$áã×ïîžàVJ‘F²˜Ž^¿¿»üñüÓÕÝs#N[dFÊòçÕoÐÑ$ÿ銑5ú7”°$á£Í•T‚()D˜Y_=]ý§aØzj_R†(Ãõ€81F¥xG *!±àÂ*áöîéæãýãóý‡Ü}ç 7:Š¸&TIm‰·é&›{2Ñ"’HI5#U^N"!ãqê.·Å&Í·nü -:K¶ þß[ü?²© Úä‚´¨ÎXA ²‚ÏœàJµ§„ -W—«‡cv¼Ûí†t’ïl•n—R„ -ÜZp+h¦“vÿ Ç(&L6ll°>ÅÆ|/€"Å~~Ñ.ò)!,œ„²×áøj‰4EO7ÅuŠžÍ¬úú=@Ã×ó*y¶è§ÜÁ«¢ç¼÷O7}ÃäF*9f|îòü¥f)‡bõ?Ô*ŽQ›å±s…‰ü°2îìýÝû¾ˆT¨bó7ŠØp¼ ¢ -µåÆu|pzåÛz3µ‰_ºÝ -Êïfv>¾dÛÊM¸”ƒÙá ì;Ås«Œ,wàJíýÂÍäžiîW«·¾û$¥G¶%ߪèÛ»h¹f¾î"4š=Èìº[áÜ›nã:´ßåàa·ó“îÈ5ĶXÊóîئ:íŽ
•uÇÝEwÜûêØ)1R—+
ÈÕ…6yÜìç3mû _?B¬å_<P]Nƒ÷‹Šï8V¿œj¾–zv1;Râô™JI´Ð晶¨Îœi ²gZSÚ€*Î.ˆ–ìS:fqwÉ_ð›Þ>½Œ -JÅíâ£?G(d’GÕÛÝ´`'^Ýoø趀=ÚÛ -œ£6k»/½ý
¶h¨qí¿A<¯œ+馟‡c7ñ»³ëÊk‘áÙ¢wæ¾@hTµÿˆŒï$nbžM¿L¸ÂV+ä¿Œ/75ðF‚oî%¢5 þM1aÊ¿7Ê6Disè”âvᚺˢ®ê}æÆûl½äzd°° +ÙËÚ6›Åêêêz|UQøg#£‰éDE™Í6Wt´„gﮘ§‰QÔ¦zó|õêУ„$1GÏ‹/C¨1lô<ÿmüúññîáöþ×IÄ¿!“HQ:~ÿúáÓëŸÝÜã$áã×ïîžàVJ‘F²˜Ž^¿¿»üñüÓÕÝs#N[dFÊòçÕoÐÑ$ÿ銑5ú7”°$á£Í•T‚()D˜Y_=]ý§aØzj_R†(Ãõ€81F¥xG *!±àÂ*áöîéæãýãóý‡Ü}ç 7:Š¸&TIm‰·é&›{2Ñ"’HI5#U^N"!ãqê.·Å&Í·nü +*ýR¯²jöÊJE€Ïb@4ãé¯Ý9IÅÀ4yï ÚÒ¢†¿¹A¾Í«<]»›yZ¥ý#XƒÙdþLh8ø³ÎöyV’F©-w‚“ !çÆ®ûÁúÐÓQH #œ˜Ç‚
G1Oµ©‚G±† +×dÉD!?¿d X²xˆ—‚%ª»ä§ÒÛ÷ýã‹Þ°öŠÎ^‚óEÏCVEY¹Ñ&òŸÎ½ÌÒ]:]ûÉbÑ,“âJ‘ÄhæMÂi¡'<CGVÁjð¤LœMé`‰Q|™nuU§ëfë_gëºÌ_2rÊ +”NàcuÞ +ÚT§ ¡:>dg—l¬àxÉ!+è,Ù¶‚øoòÿÈ +¤&h“VТ:cÊ +>s‚+Õœ. +4n·vÐI¾³Uº]"HKUºr·²âÍ<w˜UÅþ›Ÿª37@qÚ×Ô]vEYæÓA$Á% ¥Ú +¡±Ó•ƒÑ3°K‹MPhÈ9°‹ó&Ø¢:c‚Êšàâæpx +º9»d X²sà!qwÉu¿ÐáÐé£÷páU¼tg\‡òkÜœdXy2Pnáf·E*´Óü¯‹àÓz¥ +P¡ŠÍß(bÃñ‚ˆ[)Ýñöîͧw¿Â_È(ÞC\¶.gû|šÍ›ð9PäJ³úW^Î^£’Õ¿¿Óœ +v‚AÙ¥h×¢:î•wÛ‹`ó³]]¼˜äg%k¨Dë¸<5´'ÚG@ÕP@Bͤî‹xŒß(£åa}„‰O0>˜û˜tµ>H?gn&¿¤ÛÊUx`kX¸n nÍwkOtóø©ô_4î=ø¬Üe³Ë™l>Ô.F+¥1½„A¡^.E/Öø¾1Dí +3€öû )Ô–×ñÁé•lëÍÔ&~évƒ´(¿›Ùùø’m+7áR>f‡ƒ°ïÎ.0²Ü+q´÷7“{¦¹_Þúî“”-Ø–|«¢oï¢äš]´úV¸‹Ðhö ²_èn…swlºëÐ~?”ƒ‡ÝÎOº#×Ûb)Ï»c›ê´;6TÖwÝqWì«co¤ÄHu^®@4 W~@ÚäqO°ŸÏ´í»j‚|ý,±–|ñ@u9
Þ/z(¾ãXýrªùZrèuÚÅìH‰Óg*%ÑB›gÚ¢:s¦Êži9PLiª8»d X²WLé˜ÅÝ%Áozû<ô2Lı‡‰VUZÁ±æ³òjÇ=–ü endobj -1869 0 obj << +1944 0 obj << /Type /Page -/Contents 1870 0 R -/Resources 1868 0 R +/Contents 1945 0 R +/Resources 1943 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1841 0 R +/Parent 1932 0 R >> endobj -1871 0 obj << -/D [1869 0 R /XYZ 85.0394 794.5015 null] +1946 0 obj << +/D [1944 0 R /XYZ 85.0394 794.5015 null] >> endobj -1872 0 obj << -/D [1869 0 R /XYZ 85.0394 751.7338 null] +1947 0 obj << +/D [1944 0 R /XYZ 85.0394 751.7338 null] >> endobj -1873 0 obj << -/D [1869 0 R /XYZ 85.0394 641.4745 null] +1948 0 obj << +/D [1944 0 R /XYZ 85.0394 641.4745 null] >> endobj -1868 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F23 682 0 R /F39 863 0 R /F55 970 0 R /F53 962 0 R /F62 995 0 R >> -/XObject << /Im2 984 0 R >> +1943 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F23 714 0 R /F41 910 0 R /F55 1010 0 R /F53 1002 0 R /F62 1035 0 R >> +/XObject << /Im2 1024 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1876 0 obj << -/Length 2377 +1951 0 obj << +/Length 2379 /Filter /FlateDecode >> stream xÚÅYëÛ6ÿ¾…¾Ub–/ñ~Ú\6¹-’M.qp´ý µ¹k5¶äZò>þûr(Y²eoiq“Ôp8œ×o†Ë ÿX’)¢,·‰¶’d”eÉ|}A“{øöî‚EšiK4íS½ž]üøVèÄ«¸Jfw=^†PcX2[ü’¾&šL€Mo.?\½™L¹”B¥—Ÿ>]ݼ¹þÌ3 -D@Biúáòæëå{\û4±<½|wõeòÛìç‹«Y'N_dF…—å‹_~£É$ÿù‚aM–<„f-OÖ2$“B´+«‹/ÿêö¾†c*Ü%”N@6"hÆþ̱ÂE˜ñci2µ‚H#íi^¸¯8lwYM
#™µY2U:#šõ,ÄE±Yƽ‰Œ&\žèÈ,×ÁDÿö”–dJ2O{2
ßi ¸œLO?‡ÿoà–^wcž¾;´QÄ‚uM51™
ºJþ -õj2”¥y”t¾ÜVUS”÷~;øž°„S¸gRؘÃ&ÒͶš»ºÆÉv2eYº+K¿5¬äíàçG<]T®.hpٕ˼œ;œÔn¾CEóŒKþÞþw]ÕqGý\7n]ÿ3A[-x§FÙ0ú'À$Ÿ -ƒÈÏ$e‘>XSgéÂýJ)/ƒÉ`š¯V•?õ1|V^=~¹SŸDëÁÕxã‡båî]ÜÜTøÑÕó|ƒ7œj/…GF€ÀŠwÀñïy±"‡¡!XÐX“ôõûb_@P+‰pºÏ_ß—™Àõˆ1Úz‡Å{Œ -Ì_@AΑ¤,ºœÃFP¡£êÇC–õãc3ÍA¸=ÔžåDZ£’þ‰GrµD#r‰ÞiV©í\_\³+Bìso{”±¿Kr¢ûŒ¬¹"†Ù6yæw
P–ój½Y¹Ïa¾ÙFw‹GV·Í}¨Cài½›/ñf‘ηfR—7–F>‹Õü›ƒ…&5˼Ám«¢´ŒÜKt`“)áæˆð»©¶M}ä¾-Î(jSÒü%(ND„9©G¡Ðm9…ƒÒ‚wj«_ÀÁj+dTp3†ƒ”d‚·9úcÀ¾Y@½«S¨— Яߎ¨Çe#ÒõÇ'PŸA½>ç3¨—i$ªPbŸ·¥Jß’1šîž^ż:pjðW¡Z§.ó58Áqö…óLë½ë×ÈÚ§þ0ø6á4
®ž¥¥[ý07Š4=óÛb…póµ›ÞõÚOuH³~y±68‚,ŽƒOÑm9ø˜êÀm²6Ü#upžænÓà%T6ÝËàW«Hb<CÈ“n‹rq‘$èdááÀ9ÇŸ¡lâj2• -îñÍ›“Ûôqéʯ`‘ÌÊ—½Vnz5ƒgÙÖG~f°¸ÕÆœpÂxÁüÚ*÷)=ŠgéÖGX` -R´*é3;:²%9²:Ú£=8ò³ó˜è2¦<¸mMLÊÝú½bâò÷T4Gfl¯¹…dæ%õì‰Îh'å<U”h(Ûf"Ÿ/ÝôüP4Æ!Ã{Nçd눎…´€ì ¬H÷¾Ê£jy“ãè.TmÕz¤¢[(-Õ¨ÜÇ)8M©öŠEº“¾µÂnVwßî.ߢ} -÷èßWNx’úþç^W^,ð44ëâyåˆNwj¡bâ…âN@'`¬Rï#‡†h%Ä_ÿÈÑç|¦Ü -Éèþ#‡Èö~¼µ_èÜa†°á{‡ÿõïþÎÀ•ã§Ž‹ÇkÝÅ/% C^Ø ûÕ××7opdñgX5dr+ß×ÔÃ÷Ø6‡,Íò:>„Ix‡ß[ØB.‘Ò%¶Úyyß.†wmÚ6ün×춓•Ëk‡…Ñ)´é{Ôwùè߀5·§Š›~¢ì¹}›)¡ôm†Ä†öúÝÍåû/#É,Á¡ù‘ ¯½9•!Qí Gu¸Ðõ¤PpÁ ¹/s_jøÝënåoãÎøŒÆã3 -Ïh
°Â=˜à‹/ß ™¸ù)ÊÚéXsÓÖzÛr1k»¡\†ü‰ö¢Kä½úâ|q¸¸0„sÊÎ#WŸê4tuTÑ ÿüúéèaCj;lK4rì -……ÙÕçGˆ]˜5Zž—¤£e ¾Ò¶‚hʲÜEè\Tåy%¥$ Pæ_X4±‚·©Ùõ•^w`Ü*½våŸtB}õ¿Â1±æÚ‡ž?½—"Œ‹H´+»×QÒÅU/gP2D[ÿññæíõ»¯Ÿ/½Òg×o^γ¶IØ“Y°§yQ°‚£)SÝûoUzQïw˜n|ß!R¿² -‰DL‚µ¦ªp€ÏiOøµ‰‹WÏ·Åm»§lW¡›YáØëÓ[€ø.˜zÜ÷”ñmÎõ¹lö‚àáÒ÷N>ÅÝw3L
[؇bÑ>¢=O ×—ƒ¿—eˆ9x}DPOmñçr±.Ê¢n@U4ëgwe/Û@þ—»|5¢\¦Œ¯U¿Ó:4?¤B¸ +D@Biúáòæëå{\û4±<½|wõeòÛìç‹«Y'N_dF…—å‹_~£É$ÿù‚aM–<„f-OÖ2$“B´+«‹/ÿêö¾†c*Ü%”N@6"hÆþ̱ÂE˜ñci2µ‚H#íi^¸¯8lwYM
#™µY2U:#šõ,ÄE±Yƽ‰Œ&\žèÈ,×ÁDÿö”–dJ2O{2
ßi ¸œLO?‡ÿoà–^wcž¾;´QÄ‚uM51™
ºJþ +÷ïL +sØÂDºÙVsW×8ÙN¦,Kweé·†•¼ýüüˆ§‹ÊÕå
.»r™—s‡“ÚÍwÈ¡hžqÉßÛÿ®«:ëÆëŸ`&h«ïÔ(Fÿã˜ä xS%”j€wý•f”ÃlDaù™¤,Òkê,]¸_)åe0LóÕªò§>†ÏÊ«Ç/wêñ“h=¡: +?ºzžoð†Sí¥ÐâÈXñ8þ=/Vä04¤k’~ ~_ìje!N÷ùëû2¸1F[ïp࢘cQù(È90’’E—sØ*tTýxȲ~<0bl&¢y!·‡Ú³œHkTÒ?ñH®–hD.Ñ;Íj"µ=ë‹kvEˆ}îm2öwIN4p?ñ€5WÄ0Û&Ïü®ªÀr^7+â9Ì7ÛènñÈj㶹OuÈ<wó%~ÂŒ ÒùvÂLêòfÂÒÈb±šs°ÐD¢f™7¸mU@”–‘{‰l2"%Ü|àÀQ +nÆp’Lð6GØ7¨wu +õ2úõÛõ¡ lDºþøêñ3¨×ç|õ2
DJìó¶Té{@2FÓÝÓ«˜WN
þ*TëÔe¾'8ξpx–i½wýYûÔß&œ¦ÁÕ³´t«&àF‘²g~[¬N`¾vsÀ›¢^û©iÖ//¶ÕGÅqò)º- +B‚šó•
D'ålP٠Ϫ\=ÇZFû,IõQÁ€"Ã=¾ysr›>.]9âµ +ÃM¯fð,ÛúÈÏ7°zàÀø‘N˜A/˜_[å>¥gA‘à,Ýú +ÿ÷I*_kP{¾@ê¨BX=jFAª‘V%}fGG¶D#GöCG{T£G~vóýCÆôƒ·±éI¹[ߢ·QL\~àžŠæÈŒíÕ!·Ì¼¤ž=ÑíD¢ œ§±ê‘
åcÛLäó¥›ÞƒŠÆ8dxÏéœlѱpb€„UéÞWyTÍ"orÝ…ªZT”`¥¥•ûà8§)Õ^±(CwÒ·VØÃêîàÛÂÝå»U´ïCáýûÊÉORŸÂÿÜëÊ‹ž†f]ü/¯qéâR-ÔAL¼PÜ èŒUêï}äÒ„øë9úœÏ”{BA ÝäÙþ‘Ãסö;Ì2|ïð¿þ½Ã¿À¸rüÔqñx£»ø¥$pÈd¿úúúæ
Ž,þ,«&€Lnåûšzø>ÛæE Y^ÇG‚0 ï0ð»uë +.$÷eîK
ÿ±{=ãÑüâmÜŸÑx|FááÁV¸³|ñå4Ó +Vp4eª{ÿJ/êýÓï;DêWV¡#‘ˆI°ÖTð9í ¿6qqáêù¶¸m÷”í*t3+{}zßSûž2¾Í¹>—Í^<\úÞÉç¯Ø¢ûn†©aûP,ÚG´¢ç)áú +15Œ£P^x½úQ¢¢P¥ƒŸËþ_á
Æ•endstream endobj -1875 0 obj << +1950 0 obj << /Type /Page -/Contents 1876 0 R -/Resources 1874 0 R +/Contents 1951 0 R +/Resources 1949 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1841 0 R +/Parent 1932 0 R >> endobj -1877 0 obj << -/D [1875 0 R /XYZ 56.6929 794.5015 null] +1952 0 obj << +/D [1950 0 R /XYZ 56.6929 794.5015 null] >> endobj -1878 0 obj << -/D [1875 0 R /XYZ 56.6929 285.8256 null] +1953 0 obj << +/D [1950 0 R /XYZ 56.6929 285.8256 null] >> endobj -1879 0 obj << -/D [1875 0 R /XYZ 56.6929 148.5666 null] +1954 0 obj << +/D [1950 0 R /XYZ 56.6929 148.5666 null] >> endobj -1880 0 obj << -/D [1875 0 R /XYZ 56.6929 77.061 null] +1955 0 obj << +/D [1950 0 R /XYZ 56.6929 77.061 null] >> endobj -1874 0 obj << -/Font << /F37 747 0 R /F23 682 0 R /F62 995 0 R /F39 863 0 R /F21 658 0 R /F55 970 0 R /F53 962 0 R /F63 998 0 R /F47 879 0 R >> -/XObject << /Im3 1108 0 R /Im2 984 0 R >> +1949 0 obj << +/Font << /F37 779 0 R /F23 714 0 R /F62 1035 0 R /F41 910 0 R /F21 690 0 R /F55 1010 0 R /F53 1002 0 R /F63 1038 0 R /F39 873 0 R >> +/XObject << /Im3 1148 0 R /Im2 1024 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1883 0 obj << +1958 0 obj << /Length 2318 /Filter /FlateDecode >> stream xÚY[oÛ8~ϯðÛ:À˜åýò˜&™NÓ4›¸‹:}Pe:"KKJ6ûë÷P$eI–³QäÑáÇÃï\H“†?2ÓaføLŽ&b–nÎðìÆ>‘ ³ˆB‹¾ÔÇåÙ‡_™šd$•³åº§K#¬5™-Wßæww×·W7ÿ>_PçÑùB`<ÿ|qûõâßwwnèüâÓõƒ{…ïAH;1‰ç÷·W—çß—¿Ÿ]/;4}Ä3寳oßñlÀ?È-f¯ð‚1†Î6g\0$8c±'?{8ûg§°7Ú~:e.4”ËÙ‚q¤%蘴FXÀºJ$e¸ž²S”rvú`ëôC‘lì -¥e±¯š(ŽfdÖW} -J“0Ýkæ …ÃK¶²+ß“Å5ä¡£Í5.Ì`Œ„À42Øo¢Ï1¹M*[Áª8Óó›õx‘æ4‚?fq†˜ŽÏHà -ë»ËÛ ¢MŠðLZ´ÍÆu©˜aP_û¶»:ƒœTOÎ=ÛѪYvoAÝÚ[j^Êð(9×±DƒMuîmW1´8CÒóˆ¡Ñ‰'/I–'?òðºÇ?’ÎB^¬M“Ø@1‘'Mk „u$ßlš"K“ÚQ‘)îZ-R¦d ´ëŠyҵˮ•øÇòòÎ˃ç6³s2/°:Ç -¾,VYñè%÷¦i?o`¦¢nA¬õÈ¡#ø|•=fuâÒ³LÙc‘ÔM¨¼%9ƒòÃKzkƒTÚìBuTû@_Eˆ°Ãcÿƒ€@µäïr˜c
ÚZýâE–·•à„Wø™.¶\•>;æo¾Õg™ÏÅ£à¸q-ÙÐq“ü±Ü 7 Z²ÖÛÜó·Ï—‹ÏWÂÍhÈüõ)KŸüHSÙ “øGõä9èænßmêßkÿîâ¡{Ú$ª°E+ÊÛé:<§ 9R°c’8éDD½ UÅ‚¯ÏƒåÃͧEU¿å*=6AÛ·v€I'Ôû°á^<ì¿[ÕAGéäé¥êHaüUÿûjü±?¬ð"ÏMB¯<ýœ»wõfÒ§lŠÎMSÉ1¼ -bñxÁzÇC»SšÃ}ûÕ§j7Üy©wå°Œ‹ºìàö½md+Àš<6Õôm -l8zçr¥ñ\ '/â¦ëÎ ¢ ÒF°£gÁÌ+)6'u"chÃÂI ‰)íaûZÙ‰2›b(7¥8q@è/aZÄSGÒæ8s)m¿wdLpŠ|0 ’>rdø„ôBeÐUŽF~ã -Q¨eÂó»Aªï0 çp*ü$²NèÚ`cáü§ `;Ê㮺¦.E:áX†¹2=PËdÊBFž.
R¶ßt7Ð:;i:Nl:ijôÁ¦‡‚e„M)¤°ÞßJB LÂ
8Ì 98S 8I%û3ùXUR‡±ð -0ºÑ$b~Í\]G‰òu<!¯®|«‹ðì`\ìŸýˆŠU_ïo<²¯-];[ï'ÒbH(ò³^nAkUÚ -P5ýOOendstream +¥e±¯š(ŽfdÖW} +Y´ï ã€\XÌë6C£ÜÚ®Dq¯kÿLü#„h")!¢ŸßÔa
•]ÙžæCÔ”Ø hšiÌ°!Òù¼—‰¡*(MÂt¯I˜'/ÙÊ®|OׇŽ6׸0€1ÓÈ`¿‰>Çä6©l«âLÏoÖàFšÓþ˜Åb:<s
H/ås‹ªõ׬~òÝEé{"7ÚÎ<+¬ï.·nC‚Š6)Â3iÑ>6[Ô¤b†A}í?Øî2èrþQ=9÷lG«fÙ½uko¨y)ãä\Ç
6Õ¹·]Å<ÒâIÏ#†F'ž¼$YžüÈÃëÿH:yi°4Mr`ÅDž49¬Ö‘|³iŠ,MjGE¦D0¸kµH™’Ю+æI×.»VâËË;/žSØ´ÎÎɼ,Àê+ø²XeÅ£—Ü›¦ý¼™Šº± +Ô †ŽTàóUö˜Õ‰KÏ0eER7¡òr”äÊ/é
Ri³ÕQíG +sn-&–j~¿Œ}¸tê¾…s´ð¾á0³ñ©ºŸÊWßïÇ[Eu’Ö¡ó)ˆÅãë/híNi +÷íWŸªÝpç¥Þ•Ã2,것Û÷¶‘®@kò0ØTÓ·xX8}ik¦‡c÷+°áèË•NÄsaêDâEÜtÝDôÃ#AÚvô2¸uy%Åæ²NdmX8 $1¥=l_+;QfSå¦'H½à%L‹xêHÚGb.¥í÷ŽŒ©õN‘&AÒG.Ÿ^¨ºÊ‘ÀÈoœ 'i͇´ùÜäu¶õFVTuR¤¶êWalëØ^w•LtÔ$Ï=ó«Öu›ÎÛX¶Q©ltߥoî^ø¨¤.”ôlÑŠìma«£7~’)sw¾§IÙ“:ÁË(ÕR3¢&†’9Äx 4”³Óø:© €Ãç¢@£Âi‚º#€¶9gôJ²Š÷ØIL`1ÑuƈèÚŽ5Gý‹ÛwbØþópIùËÔ ÃÎ(Q¶wÐ.twWÐc7Ü3%ƒ6n{Øi.ô„ŽS! +µLx~7Hõï4àNå‚ŸDÖ Bl,œÿT lG9`ÜU×Ô¥È@'Ë0W¦G +‚á0ž@F7šD̯™«ë(Q¾ƒ'äÕ•oµqžýŒë‘ý³Q±êë}áGöµ¥kgëýàDR E~ÖË
á1hJ€eB—jtB°ÿɪûŒ än]&øŒ»òâoÿB¶ÿ»<z¬Æd˜#‹ˆ zˆ”cè‚i¨šÀþ?–•endstream endobj -1882 0 obj << +1957 0 obj << /Type /Page -/Contents 1883 0 R -/Resources 1881 0 R +/Contents 1958 0 R +/Resources 1956 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1892 0 R +/Parent 1932 0 R >> endobj -1884 0 obj << -/D [1882 0 R /XYZ 85.0394 794.5015 null] +1959 0 obj << +/D [1957 0 R /XYZ 85.0394 794.5015 null] >> endobj -1885 0 obj << -/D [1882 0 R /XYZ 85.0394 686.1157 null] +1960 0 obj << +/D [1957 0 R /XYZ 85.0394 686.1157 null] >> endobj -1886 0 obj << -/D [1882 0 R /XYZ 85.0394 612.8143 null] +1961 0 obj << +/D [1957 0 R /XYZ 85.0394 612.8143 null] >> endobj -638 0 obj << -/D [1882 0 R /XYZ 85.0394 575.0344 null] +670 0 obj << +/D [1957 0 R /XYZ 85.0394 575.0344 null] >> endobj -1887 0 obj << -/D [1882 0 R /XYZ 85.0394 542.5339 null] +1962 0 obj << +/D [1957 0 R /XYZ 85.0394 542.5339 null] >> endobj -1888 0 obj << -/D [1882 0 R /XYZ 85.0394 507.482 null] +1963 0 obj << +/D [1957 0 R /XYZ 85.0394 507.482 null] >> endobj -1889 0 obj << -/D [1882 0 R /XYZ 85.0394 443.2139 null] +1964 0 obj << +/D [1957 0 R /XYZ 85.0394 443.2139 null] >> endobj -1890 0 obj << -/D [1882 0 R /XYZ 85.0394 372.8773 null] +1965 0 obj << +/D [1957 0 R /XYZ 85.0394 372.8773 null] >> endobj -1891 0 obj << -/D [1882 0 R /XYZ 85.0394 191.4417 null] +1966 0 obj << +/D [1957 0 R /XYZ 85.0394 191.4417 null] >> endobj -1881 0 obj << -/Font << /F37 747 0 R /F48 885 0 R /F23 682 0 R /F21 658 0 R /F47 879 0 R /F39 863 0 R /F53 962 0 R /F55 970 0 R >> +1956 0 obj << +/Font << /F37 779 0 R /F48 925 0 R /F23 714 0 R /F21 690 0 R /F39 873 0 R /F41 910 0 R /F53 1002 0 R /F55 1010 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1895 0 obj << -/Length 2131 +1969 0 obj << +/Length 2135 /Filter /FlateDecode >> stream -xÚYÝoÛ6÷_á·Ù@Ìñ[äcÚ¦[†6íw°îA±d[˜,y–œÀÿýîDR–d%ÙС@MNÇ»ß}ðŽaS -ÿØTi¢-·ÓÈJ¢(SÓÕnB§x÷Ó„yžE`Zt¹Þ,'?¾ÑÔ«¹ž.×Y†PcØt™ü1{C,™ÿ¹üåÇ÷Jtx9#šò‘éËÝ»·äí§»÷Ž³'•b÷¬×Ÿ?ßܽ»ý}¾àŠ‚ôùBQ:ûx}÷õúƒ£}ž[>»þéæ…Mn–][hÄß“?þ¤ÓLþeB‰°FMŸàf-Ÿî&R ¢¤’Oî'¿¶;o›OÇ°“ÊÅ¥ÑÕã31L‘0Äj[„9C8p!"‹Êã«:œŒ.ÀQ´*=<¦‡!Œru„)æy.õêy“шD}Åλ‚]vd’2x4«ÀoÖÎêmêE¼ó«òà~ã$9Ì™™¥•ç-׃oü^Íúi›¶n¹‹ëÕ6õÅ—¬U×é.-j÷˜±«²X Ó…V`ŒXሪ£”oŽ‡¸ÎJøRÞPò×l¶.ƒñ]ˆüÈ›~(’Õ>œ ÏQ5»];¡Eé6 -V
lhÇý>ÏÒÄ=9•˜3 «r·‹‹ÄQó¬H¯æÉT``³mYÕŽ]àNŽ„\
LŠ>IºŽy½hÁ…D\åñ±JݺA~²°(÷ZåºnÀwë3ó%€\@ºIñ -„–"ànì» -¥Wáú)Ës·zðÐ<!ħ©†šÄ´°/çr—ëù\n¹š\Þå2#ƪ`ð¾<ÔC½,'ÒšWô -L#zu‘³ŸèuŸbÜ4NuAäW—îwùö³[톂[""¡6¦‰¤,”…¢ªÓ8éGěۻwneð*øÈÚuS)JïÎÕ6.Š4?+wå?‡Òý¬w¥="ùŠw;\/x7p5Þým¸¥†º©¡n¾¸e`Ù²‹^•ZrÝßò¦ˆBCb>”!!ór³ÉŠÍó 0°@Qó -®@\
§ñTv®ÿ+=
Õ2š¨ˆF=µ^;¼¡cÆîExiBO1c‰RV÷MÈ’Ë£”Ådô2l-×nýãÁjÖßõkã:íë5.<Nƒ\S°¤êy,YɨÿG,ƒÀ,{fAE€æ˜C Ï´:´‡k—Ò»ù—Uˆ®ª“ÑÛ3=Œ1ÐþoÀ¯ -E`Gvå‚62ÐMèAê†9ËšÙ ‰ŒæùÜï«~¿/ýè¡f{?]´/\¨ZÌ“Ø“°9¾BM4jZ8¢dÛÿ6hà‡mó/ËumótrSí[„ŠdÒ³»²Æo©
QãÅQ;RámÛÞ:†:Κ
áMµ½‰{{NeÏ(xç9=à•(½(×"ãQ©³“ôa¡´f£¤þTƒ -óÑÙïðªmyÌ“v>pêËVMQzÞmüèI›´H±ßØñ¶¥ŸVž Êyî -MU_ !(n0•¼û@cÞ7_ÉÈû@j´fŸ§ WMYrãz tŒ*jЋ6h¡ÓؘÃ`⤊ý‡Qñ*lž”óm3¬#\'»¬È fÇu°äKºöh+ÿÙǸ8h¡`'ÃúN
àæň0«Qñ3¬é¶ÕàcïB›#¦Â Rœ™8[†7Û4ß»•?PH«Q›VPUÖq8dR’ˆj—kn?Þ.››#üoyûéî~Ĉi˜d˜RòߟI™VƒÀ<¥!š] x[ÃÚÉýéŽÅƒiÈŒÎÉš@÷h\Ufñª.бÎò¬>Íc³þPk-W>þáËy°=·®ŽÂïêxð!Tç'Gjª0ü>ÅžP{‚«¹åc–4BB9ƒ7½úÄm¿Õ€gWœ9^è¸ëBÛµZYpªÒ/uyq™Jð¤DO~—ç.ºÝõhW3l-‹Ìyã—º<>’`ò±r]·g¼.Ë?;}0Æ,$¯¦¶_ÄîÓÇsQLçBBûªB¶57ܬòÔ{é0äl4Óh?ÅîonÜ·×î?X=’\l[£Š*ø]ˆ‰fHgOVæf[Ù»`†i+R"Ԩ΃×vP+4¬•@:×Ê¡/5ô{Zëö:o¬$‰¯í &]]þüéËëHÝuz(BM¹?UÐãxϽ…6 -LvÜ÷ÅùP·²Ä(+Ã]½ÇÇt¹ ¼u$»dƒó˜ÀEà]àoä/‚ïðL¿LUØ]pb¬£‚Eÿ&›öÏß8ü¹ƒU-Üü<{Å7zx‰ý=å¾Êª‹’Á`F‚~SCI5zK…Ôòæ’î哳„Ë -ÑÞ—x¦TÆþšç²c»ÒÖàïþKÇùO@2"Â>~qÁ!Œác”BÀìË;&üë`~©û?¥zo«endstream +xÚYÝoÛ6÷_á·Ù@Ìñ[äcÚ¦[†6íw°îA±d[˜,y–œÀÿýîDR–d%ÙÐ!@D‘§ãÝï>xG³)…?6UšhËí4²’(ÊÔtµ›ÐéÖ~š0O³D‹.Õ›åäÇ÷"šZb5×ÓåºÃËj›.“?foˆ%ó?—¿üø^‰-gDsc?}¹{÷–¼ýt÷ÞQö¸rÃâžôúóç›»w·¿Ï\Qà>_(Jg¯ï¾^psŸç–Ï®º¹Gf“›e«GWWF*ñ÷ä?é4•™P"¬QÓ'x¡„Y˧»‰T‚()D˜É'÷“_[†ÕæÓ1ì¤2Dq©EEtDõ8ÂŒDŒQ$1‚ÚaÎÆTˆÈ¢òøª%£„0”Jéaˆ£œDfc‚yšK¹zÖd4"QÄD_°ó® F—‰¤Í*°›µ³z›ºAïü¨<¸gœ$‡93³´ò´åzðß«?m³ÕÖ
wq½Ú¦þ£ø’´ªã:Ý¥Eí^³bÀvUT`ºÐŠ€ãŒ«ÀQôo”òÍñ×Y _ +Û™<Å1›Ë |׆<?òªŠd5‚§DFÂÓ€‡GTÍn׎iQº‚8‡6sÇý>ÏÒĽ9‘˜S'Vån‰›Í³"½š/$S€Í¶eU;R4'|8¹)¤j@—`Rô‘HÒu|ÌëE.â*UêÆ
²ðtÈ Ü#h•{éš×ÖgâK +0ƌ݋ÀðR…ž`Æ¥¬î«%—G)#ŠÉèeØZªÜúÇ)‚Õ¬¿ë×ÆtÚçkxœ±¦$`IÕóX²‚QÿX†#XöÔ‚Œ" +ê•+Éjÿ^ ¸±;ì%–o@‘¸z@5õP3di5ÛAaoüŽqž%í9ü;W«å…à®ÂY¨‡.M-¬‚³‹óçM-‚[€VS‰í…þn[·]–—Ɔ3˜pÃØyçg
Õøƒ2Þ‡µ³€¦§Ú§«ý=M®Fê$È–qýJ$ˆ<×I®BÞÈöÐTƒÏŠò/aI;g³ƒÇnÁm¡ÜÃ1z +%Ñ(iá&}£ Ûú·A?l‹_X,×Y˜h‹ß “ë2h_#” ‘žÝ•5~KmˆÏŽÚ‘D«myëê8k6„•j;}·zeO(Xó”n-à…(=+W"áQ©³(“ô•a¡”f£•¤oþTpƒ +ãÑÙ¯ðªmyÌ“¶?pâËVLdQzÚmüè§6i‘b¿±£mKKß<A–óÔ1$šª">ABQ<Ü +3x÷ʼo¾’‘·Ô¨Í>O0]5i¦ÓÃDGY˜ÅF
jÑMX|8µ9:NªØh¯Âæé@8_6Ôu×É.+2ÈÙq4ù’®=šÅÊö1.Ž +i%jà +²ªÂ<‡ìBJQíbíÃíÇÛess„ÿ–·ŸîîGÔŸ†N†)%ÿ}ó™”i5pÌS¼Ù9‚×5ô m“Ü‘n[<è†ÌhŸ¬ TßÁÆEe¯ê‚ë,ÏêÓœ16î¹Öâqåýß)¾‘Ûsëò(<Wǃw¡:?¹©&Ãó)öµŸp9·|Ì’†IHg°ÒËOÜöK
xwÉ™ã…N£ìi,Ué—ª<‰¸L%XR¢%¿¿Ês]ŽÍÁß“‹AË"sÞø¥*Ĩ|¬\•Åí¯Ëô“:}‚WSÛOb÷éã9)¦Îr! } endobj -1894 0 obj << +1968 0 obj << /Type /Page -/Contents 1895 0 R -/Resources 1893 0 R +/Contents 1969 0 R +/Resources 1967 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1892 0 R +/Parent 1932 0 R >> endobj -1896 0 obj << -/D [1894 0 R /XYZ 56.6929 794.5015 null] +1970 0 obj << +/D [1968 0 R /XYZ 56.6929 794.5015 null] >> endobj -1897 0 obj << -/D [1894 0 R /XYZ 56.6929 470.8431 null] +1971 0 obj << +/D [1968 0 R /XYZ 56.6929 470.8431 null] >> endobj -1898 0 obj << -/D [1894 0 R /XYZ 56.6929 355.3786 null] +1972 0 obj << +/D [1968 0 R /XYZ 56.6929 355.3786 null] >> endobj -1899 0 obj << -/D [1894 0 R /XYZ 56.6929 281.517 null] +1973 0 obj << +/D [1968 0 R /XYZ 56.6929 281.517 null] >> endobj -642 0 obj << -/D [1894 0 R /XYZ 56.6929 235.0409 null] +674 0 obj << +/D [1968 0 R /XYZ 56.6929 235.0409 null] >> endobj -1900 0 obj << -/D [1894 0 R /XYZ 56.6929 198.7213 null] +1974 0 obj << +/D [1968 0 R /XYZ 56.6929 198.7213 null] >> endobj -1901 0 obj << -/D [1894 0 R /XYZ 56.6929 159.8503 null] +1975 0 obj << +/D [1968 0 R /XYZ 56.6929 159.8503 null] >> endobj -1902 0 obj << -/D [1894 0 R /XYZ 56.6929 83.0669 null] +1976 0 obj << +/D [1968 0 R /XYZ 56.6929 83.0669 null] >> endobj -1893 0 obj << -/Font << /F37 747 0 R /F53 962 0 R /F21 658 0 R /F55 970 0 R /F23 682 0 R /F39 863 0 R /F47 879 0 R /F48 885 0 R >> +1967 0 obj << +/Font << /F37 779 0 R /F53 1002 0 R /F21 690 0 R /F55 1010 0 R /F23 714 0 R /F41 910 0 R /F39 873 0 R /F48 925 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1905 0 obj << -/Length 2901 +1979 0 obj << +/Length 2900 /Filter /FlateDecode >> stream -xÚ¥]oÜFîÝ¿b{¨Üf'ó¡’''qz.7׸@^”]Ùª•Ü•Ö®q¸ÿ~䣕ÖÚ8ÅÁqF$‡ßäZ-$ü©…·Bš<]dy*¬Tv±ÚœÈÅ
ì}¢øÌ2ZŽO½¹:yùÞd‹\äN»ÅÕõ—Ò{µ¸Zÿ–œ}üx~ùîâ×Ó¥¶2y#N—VÊäÃÙå/g?ìãi®“³ïÏ?Á«Î3‡rqúûÕ/ß[3Boò\d©E®ñÏ—ïÞŠ·?]¾Ç£'çW»ã+)i×?O~û].Öp³N¤0¹·‹x‘Bå¹^lNRk„M‰úäÓÉ¿„£Ýð霈¬ñÂzÍÈH«…R"·VO„dsáŒ6á.ïÎ?½ýùâãÕÅO—tq“.. '‘û”o›õJ¬Ú暎걌l&t.=‹¨êN—ƪ¤¿-q!øêßRê›Ý¶è«¶¡]„Ô|àºÝ2V5ªt*Œ‘£Efhk)ÒÌð™€T9P~sqùŽÈåhŠMI€®ÜÞ—ÛÁ~{ª|ÒÖ´¹ë«ºêO•R ØŽS:¹º¥{Éç*¹-X k 1©…ÌS»X¶ºjSÕÓ6途Ov«~H–-š5o?6}ñûvF/*•Â§.^o´>ª°]P9E/06ùÔ}¹)›¾cÒc>ÊfU·]˜I“ª!èçm±*»Nûr»©ÀÅïU¥ …ÓZG)Oài9 -~S-WmÝ6ÀOjÒäm]ì:Ä®Á#‘"ž -*D@7â7nÃKݵ|lÀÊßÌ1•«ˆp×튚Ú
bf¾úÇ:r‰àmä.wwwíð¾v½p)ÊvßRp ¸^X”L^~K°o_N?Èèƒï¾›ùä%Áú–ž%Ší5=ëª)ç°ýÒT=E÷¯Äö4 -ï‰o(²û’wÈÑk¼:Æ‚K…´Î2îuy]ìê~ÉxÊŠw˜B5' -Db®ÛºnB$·Ïô¤8‹¶ƒì²"M¥š†–6ÄVˆë5©¹ë€&6èÁá_c:UI`7KC`Ô&†xؽm»žVU]Óê3¹ãè{·eÃx[|Ê ~N/°ŽXoªûøAÁ "¾¶ov¬!€ÄØ?I‰±èkR"Þ-µG©3á3íôˆæù«Ë…ÔÖ*Q{¾_>V"@ƒuÎJ@NÎZñ¤Oî€ð‡Û -CÆgµ‰Th ‡x‹¹ûäJ¨ÌE&ç/¢•Ð2ÍÇŽ±$ãJ5ø–ÕùTÊäŸKç\rŒ;ú~J‚ TqfO»ZÏP7PÕÙÜŽk%—'wT~ÜW`•ëpS -$„„² ]Ù3 Tª°¸øxŸÒˆr|¼¥þpŇG¥MÙ±;EÞ¦EºÏ…z£ŽMìL³rvÝï‹ò9å¤Jd¼ž‹ËútŸî³ÊC˜X¿ˆµw¬ºc‰<®éµ‚¾s·.¹ð.¸oè·hï…ú¡Áðb¹Fa'”ðLaR"€Ç‹¥—Bi{Фäå±J1“ðõ¡£#쌊iø„† -S -š²1ÕŽ:Ád¯y¤@šB3¤ì2?pvÁOÆÙ؈•#Éìz©T¹×ÐBÊÜ?Q¤Mó&L(pf‹PæË`&¡Æðú1$P²À&¦„RðÀª[Èx3ï).¢ !ºã¢hc›(2—t›<[ÞD³,ê›v·ÙÌÏÑ•2Ãmßúb~1ŠŒÑ8¥Ý>Æ:6öHÃë‘yz%“ú§cÃéûC¡š3¡œyu]š¬v[²Œ¦¯i³mh¥“~8{»üðÎòœ,·P}=•eo·¤<ÚɆûž¡Ø³ ´ ×®\=‡ë¡Vºpƒ+@VtåÒ¥i¶k.42rÙñÙA¸ßts}¬‹8Üc³ÂáëUôÇ=É0øãÊÖUç²qô ŒnÝîB ë?wÐeuÇf…Ã[†ýKwèl¨ñÉ’‡â±ã¨%ÈMÙ”[j|ÇÑÀ7B#߸¾S·ý˜ÎtƇšKØábàpN -A÷ÜBm7´Žú}A¯Tmfû -zês¹Z]!þÜ +xÚ¥]oÜFîÝ¿b{¨Üf'óQòä&nÏE“æ(Ð냲+ÛBµ’»ÒÚ5÷ßr´Úµ§8øA#Έäð›\«…„?µNHSØE^Xá¤r‹ÕæD.®aïûÅg–éÐrzêÛË“—ß™|QˆÂk¿¸¼šà +B† —ëß²³Îß¿½øõt©Ì¾§K'eöîìý/g?ìÃi¡³³ïÏ?«.r‡ +qúûå/¿sf‚Þ…ÈC®ñÏïß¾o~zÿ=9¿Ù^IIƒ¼þyòÛïr±†›ýp"…)‚[Ü˪(ôbsbΓ ÍÉÇ“'»ñÓ99„:Ÿ‘‘V¥Dáœ>’+„7ÚÄ»¼=ÿøæç‹—?½§‹[5¹¸\€œD,Þ¶ë•XuíÕS¹\èBQÝŸ.SÙpSáBfðÕ¿¥Ô×»m9Ô]K»iøÀU·e¬S”¶Â™3Zd`†¶–Âæ†Ï¼ +ÀX*ù$A õA˜¹(ã7V>Eàäf9Ô*¹tùsâñÒšc=Nb6€žw‰L,<i^7å°ºaa‚ŽDð*zjÝ^Ï(Ýõ¨‘§ÂˆÚÕ…G
®n•)Eþ‚JvL/d\A&OìÉaôä@©!åd
ö¶Ô!ÙÑäÐ.¾b:¬~#ÑÃIŠ@,(}ÈSÅ-„lŠ±yþ„kz……º=rM,=f$“[̈|Sz°î Àz°.XŸE¼q5€v´„$ÑV«ïè“h”2ÕØ +èÔ-x.ÔMjbgš•³«a_”Ï)Ç*‘cðz..èÓƒÝg•û.2±~‘jïTu§yZ[Ók
}çn]qá]rß0lÑÞ#( Û†±Áñb¹Fa'–ðLá D +‚rÏ ®®ôgÝêG é$!÷¨æ¼Ð‘AOJM'1éT×éiù´pò¸uÚì°ÜÖÞPŒ£%i×[Ö‚bà +Ï’ÔFù}àq†°Ç`¸%4©¹LPŠg¸jw›OÑ.8Õ›ý–tž] c‚Œç:&pqu87àéÇ\Ó«Œ^_"i:)Ž3¼ÖT•áM£UÝéÀaäˆ +à¸úć8^!¾¶ª’_¢ÄS©$†5*&vß&;/£Ú©‘Ê¡oPV9ÅK
¢,ÿ¨hE‡ù²¤ð8¥ ++Ñ4¯ã„×q¶e¾Œf‚j¯b‚@ +cÿôÔð +÷«~.°Ou‘†{lV8|½Lþ¸'\ÙÀºîÓ\6Þ#”Ñ»],!pý纬þ©Yá8ÆÇ–aÿ’GÃ;j|òì¾|è¹êr]µÕ–ßic4òÐÄ7®¯âÔm?¦Äñ¡æR +›²MCþ(¨6=ǃUu”¨Ï={÷áÇs>Œé6ሡ%þ€Bëq<‘~ºéWP‹íÅ7ùBT68úE7ÑÉXÐIxìö…=ø¥aé¥Ìþ%“pÏw×\)*
ç›nU6ئ½ž¡ÓÁ3D™.ﯹգôßddÇ·Jdý”ê³LGÊyxž²ú2ʦ‡éûs¤µåá¹- endobj -1904 0 obj << +1978 0 obj << /Type /Page -/Contents 1905 0 R -/Resources 1903 0 R +/Contents 1979 0 R +/Resources 1977 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1892 0 R +/Parent 1983 0 R >> endobj -1906 0 obj << -/D [1904 0 R /XYZ 85.0394 794.5015 null] +1980 0 obj << +/D [1978 0 R /XYZ 85.0394 794.5015 null] >> endobj -1907 0 obj << -/D [1904 0 R /XYZ 85.0394 752.0756 null] +1981 0 obj << +/D [1978 0 R /XYZ 85.0394 752.0756 null] >> endobj -1908 0 obj << -/D [1904 0 R /XYZ 85.0394 252.6303 null] +1982 0 obj << +/D [1978 0 R /XYZ 85.0394 252.6303 null] >> endobj -1903 0 obj << -/Font << /F37 747 0 R /F53 962 0 R /F21 658 0 R /F39 863 0 R /F23 682 0 R >> +1977 0 obj << +/Font << /F37 779 0 R /F53 1002 0 R /F21 690 0 R /F41 910 0 R /F23 714 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1911 0 obj << -/Length 1788 +1986 0 obj << +/Length 1787 /Filter /FlateDecode >> stream -xÚ¥XKsÛ6¾ëWhr)5
QâA€l§Åq%µœÚJ§“Ç&!›
E:"UÅIûß»À‚%3µ3,‹}~XˆŽøÑq(‰ŒY<V± a@Ãqºã+X;QÇã·L~ŸëÉbôÓ3®Æ1‰%“ãŲ'+"AÑñ"{ë=!4 xçó§GþÑÙüÙÉñ|âÓX(áM_½:ž?ý9ñY -•ª -laî)‹cWÓß.ÎîO~“æY™çÀcw;÷îÀõ¶HíSéˆýÿ¨2wkAñû<q×*#ƒ¹²K‡¯ø\Àû
Úè}ïL_/žŸßï–`׺lÁõⶆP»ã:§|³Ú+ ’m4àé«<ŽÚ?N&>5ëÃÎÂK‡i}†ƒì—ŠÝíO¬>ïàÕ³‹Ž°eÛ]$ø@1ÙYUÅ×þ‚eL'7ð‡IÐyö»ÿžÙý
%áQĺ^ö; +xÚ¥XKsÛ6¾ëWhr)5
QâA€l§Åq%µœÚJ§“Ç&!›
E:"UÅIûß»À‚%3µ3,–‹}~»ð£ãP³x¬bA€†ãt5 +ÆWpv2¢ŽÇo™ü>דÅè§g\cK&Ç‹eOVD‚(¢ãEöÖ{Bh@& "ðÎçOü£³ù³“ãùħ±P›¾zu<:ûsâ³0 +°†qÉ|!hÏ4€SÊåX…1‘œqëŒ$ËÖº®u=ñ%˜ùE•&ÅuU7¸½©Önòÿ‚Ë1æ}JI†l·0bÝa0ö#a·ê}‹ïÖÉê¦ÐÝö‹e”WÕ:o®W¬×«$õWYØÉï3×:]kÔ4ðÉg§Ë¿?«?‹âö’‰³™fùÉñç¸XÒ¢xqöcñùÑ°
ô!64ºn¾ÑùP˜0œóç³è•|òr¿Ùþ¹ó?Þ¼Üüþë¯Ðú§gß]ì}’H†!,"d’a•ö&¯¹Ö°à±—\Vk¤éO6D°~"A-)Jèn„¬Ë,¸‘1…q蘶yQ ÜË[¼*ÓËdS ©Þ¦v + &@©õúo½vZ9®^Rò» +„C¡0Ƽ¦rO{£{Ú½3 +wÕòk +}¥à»«¡µ€¨¢ªm ag ϬÚ\ÚHÀúã¦'‘NXD¤â(l¶¨ÖˆÄÐúÅ +µ@=ßXÄ™E1—w‹XE$ܽ›×øæÕã6¿ÊCA”à÷ãƒRê endobj -1910 0 obj << +1985 0 obj << /Type /Page -/Contents 1911 0 R -/Resources 1909 0 R +/Contents 1986 0 R +/Resources 1984 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1892 0 R +/Parent 1983 0 R >> endobj -1912 0 obj << -/D [1910 0 R /XYZ 56.6929 794.5015 null] +1987 0 obj << +/D [1985 0 R /XYZ 56.6929 794.5015 null] >> endobj -1913 0 obj << -/D [1910 0 R /XYZ 56.6929 343.1761 null] +1988 0 obj << +/D [1985 0 R /XYZ 56.6929 343.1761 null] >> endobj -1914 0 obj << -/D [1910 0 R /XYZ 56.6929 255.6488 null] +1989 0 obj << +/D [1985 0 R /XYZ 56.6929 255.6488 null] >> endobj -1915 0 obj << -/D [1910 0 R /XYZ 56.6929 192.0319 null] +1990 0 obj << +/D [1985 0 R /XYZ 56.6929 192.0319 null] >> endobj -646 0 obj << -/D [1910 0 R /XYZ 56.6929 152.6743 null] +678 0 obj << +/D [1985 0 R /XYZ 56.6929 152.6743 null] >> endobj -1916 0 obj << -/D [1910 0 R /XYZ 56.6929 115.923 null] +1991 0 obj << +/D [1985 0 R /XYZ 56.6929 115.923 null] >> endobj -1917 0 obj << -/D [1910 0 R /XYZ 56.6929 83.7361 null] +1992 0 obj << +/D [1985 0 R /XYZ 56.6929 83.7361 null] >> endobj -1909 0 obj << -/Font << /F37 747 0 R /F39 863 0 R /F23 682 0 R /F21 658 0 R /F48 885 0 R /F47 879 0 R >> +1984 0 obj << +/Font << /F37 779 0 R /F41 910 0 R /F23 714 0 R /F21 690 0 R /F48 925 0 R /F39 873 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1920 0 obj << +1995 0 obj << /Length 3196 /Filter /FlateDecode >> @@ -8490,80 +8852,88 @@ xÚ¥ZKoãF¾ûWø(QO?Énìi’™v'³X ›ƒ,Ñ61’¨ˆ”ç×ï×O‘TSò`áÛÍRu±ê«'É®)þصV„ #¯K#‰¢L]/7Wôú÷~ºbf‰æ}ªïï®Þý(ÊkCLÁ‹ë»‡/M¨ÖìúnõûìýçÏ?}¸ýÏÍœ+:ûžÜÌ¥³½ÿôÛûú½Ï7†ÏÞÿôñËÍœYJ1jé :ûõÓ‡æ?üòéÇŸ>~ºùãîç«wI¬¾èŒ +ÓŸW¿ÿA¯Wx‚Ÿ¯(F«ëüC 3†_o®¤DI!âÎúêËÕ¿ÃÞ]÷Óœ*”ÐDi^ftÁÙ5cÄ(ÅÊP†‚§Œ/¯Ûf×ÖíøQ -È#À´‚Ð’ëÜÑŠæJb5%TAåó>o"“3Q¤²Rí·«å|Ùl«íͼ€y~Ÿ/þˆ«{+컕è±a‚áÙ³-ƒ¯Õk[ÿ]yÂÁy’-t‰ç2ÃS(¢¥Ž,êõ7°|J«¯æ…"¥òÈ|»Ø|óÝEyw;Ëðã‚‹Í¿}†ß\ÀK~=O0²ÆYlWÍfBÀVY*=fß^w±Zí«¶}»º‹,—Oû¦éVõ>''<TfÌôp‘é¡rü¸$¼ÇÎÝo.‡3k,4)òÁèÃÇ/?üzûùîö—OéGG®ôz΢”Q§ná©„S!šj¿èª1M›~ö_Jùã{u³õ›vg)š}F&))"M"dŽæ”È2‚ -‘RòrvÛ…“á´ûÊ_¡Â•_-ÂÑ‹$ãsµ«møåbÝUû-ä}¿ì}Ù×ÝÜŠýð’-‹!Fëí#(M1ëžr(E¬1.¬¦g"V™S)%xöúòœáv¡ÜngÙì÷7LϪv×lWV„Œ:¡)®LD -Níöͺ͜,‘EaoOËp3D3ÆA$Ã4ÐJäÓv€Än½Ìõ6£žgtdkÓjJ?'%OáäþÕs}‚¸ÄÛG2‰Ü%ÍÐ>ï–]¿Þ0Æfßá—òXÓK@#•
6ö7zv{/u÷äw“y‡jQš0-Ë Õ|‘S%¥PQðfœÜÈÀ»:¿qØùEFU¥&†2ÖGRÞÊÚ½äc ½’åÿÜÔ« ÃSxìmU…-ëž“b0®ˆ*ËAÿøˆ^2êŸEÜ嬉`#)ˈŠÈËhu#BP¨ûM¦¨*ÆPœ×]óXáÁ÷7¨¸H6„2ª‰`b¨Ó/.|~9©ÆB¢$â®.‹óUJŸ*O§UJ¢:âª$ò¥pœ³GF¢Ì‘}e¡dpä -U”LÎ*'÷ÇU13~#v
!þtĤ‚ê¾±ÀЕ'àjZ{D8{å\·ÙÍë »wåÝz±L~èÓzOÖr¦ce+ ÕÅÈ&A¡Rž -!çøk±Ùc -„"š¹;pÓt½ò[H={mž }jëDìJïŒ.PDóc*¹Üž*“2´^ƒ - ê2¸Õú“Wûå¥ù> yU Þdíx.áBåã!UVΞùôÍ9/ߘ²( -ï4°˜4
7ZnøôYÓô©¦M“¨œi¾¾%Ç7Ù|V¶c>.ƒÒ
b°eƒŠÐ"aáDs+oǯXìj–#[—Ÿ¶Ã(76ß©ô^øËóbí¦gX®šÍ¢Þ% gBð]ÄÕ8gšV;ˆ‘ý6a~Σ‹‹°Qý3½àÑ}ª3°‰T6»‹°‰o‡˜á”Øç;+W$ÊÈ%FItø#Á†Y;ŒçÝ"µãÂôÚq{ÇIêV/¶×tU~Ư)J8^ˆK}¯„0©OZ£—©¶AWu{Qpø2+΃ïä6¹¾KPÂhj·ßøv¤”:ÎElõƒœÇ™|Ce -Î|KûóbÔB
hÄt•\Ä~ä“qš¾*ø¿?Ñ<~Š*í‡Hz¢ƒT!‹BYÁ3cÑÓÇœ§²ÿ^ŒŠendstream -endobj -1919 0 obj << +È#À´‚Ð’ëÜÑŠæJb5%TAåó>'–d9E*+Õ~»ZΗÍöá±ÚÞ̘ç÷ù⸺·Â¾ûQ‰&ž½Ð8Û2øZ½¶õß•'œ'ÑR°@—x.3<…"ºPêÈò¡^˧´úša^(R*!Ì·‹Í70ß]”w×ì»?.ˆ±ØñÛgøÍ…ü¸ä×ó#kœÅvÕl&tl•¥ÒcöíEq«Õ¾jÛ·k »Èrù´ošnUïsrÂCUaÆL™Ú*ÇKÂ{ìÁÐýæ‚q8³ÆB“Ò(Œ>|üòï·Ÿïnù”~täJ¯ç¼ Juêžz +ovÁ)Àݼ۪ó‡ßXdTUjb(c}$åÍ ¬ÝK>Ø{ YþÏM½ +2<…ÇÞVUزî9)㊨²Èô€è%£þYÄ]Κ6’²±Œ¨ˆ¼Œv‘Q7"…ºßiŠªbÅÀyÝ5|ƒŠ‹dC(£šHf!†z0ýâÂç—“j, J"îê²8_¥ô©bñtZ¥$ª#®úG"_ +Ç9{d$ÊÙWJVÁøG~pÁçÐ5¸Ï2c¸¤.ÏlÁy/õ“ƒ
àˆcwOuë[ú¸³Iáv!’Á£TH“_%Ù5Ž€ +ƒ™fí®ZÖVÖ_íF¼ñòdkX»úþöÓ‡°oÞêua™ÿ·ƒ¨®ç˜Õ (>ð´ñÕ]ÀSËs…¢²àì‚é9‘,E¾‰Ä‚g¥Úô3@Ο91Gõ5á1á×ûî°#6p€(‡«K^§á +m®ÖÃt1™ÙL‘„LáŠÊÙª²ÿmZ©rhu»‹Ãºóÿ,›ÍÆG5,‘°¶ÕÚßI»p²6ƒùàg±h¶Ʈ×ÍK>͆¢QuÑŠšh.—w‚d‡=² +:A:C/¦†:qI0ƒ$d)å%Ë "QT÷,gC°Ï:X¬›åbí—OMtȺXm}8ì]¼vÿœÄ';ê'Î5šS‹ +éEÿõ°Ýæõ†ZŸª–†m Òg>•—¨PEÁä¬Òzrïq\3ã7òh×òXáOGL*¨î]yþ¡¦µG„³WÎu›Ý¼²{WÞËT€á‡>÷d-g:V¶’P]Œ\a²*àù`è$L‹¢ï¦Œj}áÑyŽED3BFõWÝv¾º¶Ã“ 3õ2ãv ©Ê¤×Ku$âør€/K+x„Ÿ[Ü>Øs}çPÐÙ¦ñÚõ›ÕzqßØÞÇÿ{Úú`¡ö¸ê<—Ø2üûלIt¸fÐ;ô!j¦!ªË—VAêeþóPûÅÊÚ¤àxŽ¿›Ý:F +æŸz\{к•en¯Ötöjj¯@(¢Ù*»7M×+¿…Ô³×æà Ú§æ°NÄ®ôÎèE4?¦’Ëí©2)C[à5°^Öll&Ζð¨ +UŽJxËÏ…p÷U8ÁÖðîN§xr[„UËßÒrROòIyê“òÛѿη +¸X‘dªºE½<"žnûTÓÕm¢r*c65T¹6Éà½)[_4f‹óh?+[¢Ê'ÆeØPº/©Ü²p—ÜG(»p¹Uó0º…„>ÈævÏes»¨ÃÆ}ݵvÖ‹Êñ_›ûÜf¯ÝKUJ¸:°a¡·áXüK
Œ ´êb±cEs×ÁìŒëIkÛR@+À쬵ûTÓÖNTÎÚËœµáÞ¨dN Ck—„1y^´H”mhkN¨Å×@¶ßBníg«|Ä($N +³“}¿N…Yêû{¹ÎUò¯±ñMÝ©Xô +¤ã/ÓälèÿÚ6z—; Y¢¦ežM™žƒ®ÚØ>ÕÓG*§¦§“6V”ŽŒD™#m¬!Ò¾$ùy_‡ˆºnµþdçÕ~y@i¾hFˆ7Y;žK¸PùxH••³g>}sÎË7¦,ŠÂ;
,&MÃM–>}Ö4}ªiÓ$*gš¯o‰ÁñÍA6Ÿ•íƒO…ËÆàtƒlkÙ`£"´HX8ÑÜÊÛ±Gã+»‡åÈÁÖ%ħí0ŠÀÍÁ÷#E*½þò¼X»é–«f³¨·G È™|q5ŽÅ™¦Õbd¿M˜Ÿóèâ"l”@ÿL/xtŸêl"•ƒÍî"lâÛ¡f8%öùÎʉ2r‰Ñ@þH°aÖãy·Hí¸0½vÜÞq’ºÕ‹í5]•ŸñkŠŽâRß+!Lê“ÖèeªmÅUÝ^¾AÆŠóà;¹M®ï”0šÚí7¾)¥Žs[ý çq&ßPÀ|Ó`Bb3ú–ŽDg ˆ’ö$Rh‘Ü`ð6p +Ú”{=¾ qÑ¡Cr #bvT¾M§1väÈhV‰®¾,¨Ï[ø?ŒŒ°So‹ÅÊo{ÝÆ‚ÇÙÇY‚ø&Ãç«"”©nJØóPe_Kkt–ýÞZ`•ŸÃK–¾Ÿ¨·+7€=ŽHF6Ä=gÃ0©1}´#Ô‡Q‚`÷!ÙÚgŸeLp +þ;~Eµªí³ùx,à»×~ª¢hL]¾í5©ÉQƒð`듉p_ÄÜ P»)4þ÷ÊZÇog¬ +þïO4Ÿ¢Jû!’žè •DâPVpÆÅXôô1ç©ìÿÁr‹Ïendstream +endobj +1994 0 obj << /Type /Page -/Contents 1920 0 R -/Resources 1918 0 R +/Contents 1995 0 R +/Resources 1993 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1892 0 R +/Parent 1983 0 R >> endobj -1921 0 obj << -/D [1919 0 R /XYZ 85.0394 794.5015 null] +1996 0 obj << +/D [1994 0 R /XYZ 85.0394 794.5015 null] >> endobj -1922 0 obj << -/D [1919 0 R /XYZ 85.0394 748.9271 null] +1997 0 obj << +/D [1994 0 R /XYZ 85.0394 748.9271 null] >> endobj -1923 0 obj << -/D [1919 0 R /XYZ 85.0394 674.5821 null] +1998 0 obj << +/D [1994 0 R /XYZ 85.0394 674.5821 null] >> endobj -1924 0 obj << -/D [1919 0 R /XYZ 85.0394 573.362 null] +1999 0 obj << +/D [1994 0 R /XYZ 85.0394 573.362 null] >> endobj -1918 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F39 863 0 R /F53 962 0 R /F23 682 0 R /F55 970 0 R >> +1993 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F41 910 0 R /F53 1002 0 R /F23 714 0 R /F55 1010 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1927 0 obj << +2002 0 obj << /Length 961 /Filter /FlateDecode >> stream -xÚ¥VMoÛ8½ûWè(+–ß"NâdS$N6v€mª-;ÂÊ”×’äßw(’Žì2ÈaÀJÃyofÞ" †?’‰¤¦:É5G‘,·#œlàÝ͈xŸ,8eC¯‹ÅèË5Ë´¤2Y¬±ÂJ‘d±úž^ ‚ÑBàôivu™]>Ì®o¦³qF4Ïy:y|œÎ®n¿3*08ƒ'Æéýdö<¹sÏÇš¦“›é|üsñu4]i
©Ì,§ÿFßâd|aÄ´É+,0"ZÓd;â‚!ÁOêÑ|ôÏ1ààm¿5V -.”K( -E -Óx½Ê Ÿœà¨ßëEI¬^ÁËÖ+;Ø<¿\1ð$)-€XïrhËýy14E\+™ÿàœ"¼Ø +xÚ¥VMoÛ8½ûWè(+–ß"NâdS$N6v€mª-;ÂÊ”×’äßw(’Žì2ÈaÀIÃyofÞŒD$IMu’kŽ&"YnG8ÙÀ³›ñ>Ypʆ^‹Ñ—k–'iIe²Xb)„•"Ébõ=½@£1„ÀéÓìê2»|˜]ßLgãŒhžótòø8]Ý~gT`pOŒÓûÉìyrçî=Ž5M'7Óùøçâëhº8ÒR'˜YNÿ¾ÿÄÉ +2ø:ˆi%’W¸ÀˆhM“툆g,Ü©GóÑ?Ç€ƒ§ýÑX)¸PHP.¡()Lãõ"('|rN€£~¯%±z/[¯ì`óür-ÄÀ“¤´ +ï2D +æ±oùËgpBË,ã}¶…9µOµ1¶Š›4ä÷—»»«ô`¼ªÔ +ÞDÊË5â8€›bcðQ}µÝp¡Ÿ*‡`ˆ]¨K'2nøtÎæөÙÜÍ>6ýXÁ ƒdì1xÐ';ðÒá%‚¦.ngWî¨ö¤VÛÊTm³ÔøUòT®K§1³ô£yïÆ/Òx©•Ð3>¾~¼58¼{Oë2y^üýðôyAnMWîMéWâümùýwÙ˜¶ÙwÕaûÑ' endobj -1926 0 obj << +2001 0 obj << /Type /Page -/Contents 1927 0 R -/Resources 1925 0 R +/Contents 2002 0 R +/Resources 2000 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1892 0 R +/Parent 1983 0 R >> endobj -1928 0 obj << -/D [1926 0 R /XYZ 56.6929 794.5015 null] +2003 0 obj << +/D [2001 0 R /XYZ 56.6929 794.5015 null] >> endobj -1929 0 obj << -/D [1926 0 R /XYZ 56.6929 687.41 null] +2004 0 obj << +/D [2001 0 R /XYZ 56.6929 687.41 null] >> endobj -1930 0 obj << -/D [1926 0 R /XYZ 56.6929 561.6045 null] +2005 0 obj << +/D [2001 0 R /XYZ 56.6929 561.6045 null] >> endobj -1931 0 obj << -/D [1926 0 R /XYZ 56.6929 501.5525 null] +2006 0 obj << +/D [2001 0 R /XYZ 56.6929 501.5525 null] >> endobj -1925 0 obj << -/Font << /F37 747 0 R /F21 658 0 R /F55 970 0 R /F23 682 0 R /F39 863 0 R /F48 885 0 R /F47 879 0 R >> +2000 0 obj << +/Font << /F37 779 0 R /F21 690 0 R /F55 1010 0 R /F23 714 0 R /F41 910 0 R /F48 925 0 R /F39 873 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1134 0 obj -[650 0 R /Fit] +1174 0 obj +[682 0 R /Fit] endobj -1932 0 obj << +2007 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 -1495 0 obj << +1569 0 obj << /Length1 1628 /Length2 8040 /Length3 532 @@ -8573,7 +8943,7 @@ endobj stream xÚíte\Ôí¶6Ò ˆtÃÐÝÝÝÝ¡Ä000Ì ÝÝÝÝ’‚R"‚´t ÒÈ‹>ïÞûüž³?³?½¿w¾Ìÿ^×Z׺î7¶‡Œ5Ü ¬‡¹rðpr‹t´P(ÐWç…CfL9g0ЇÉ]Á¢ -Äü{fXE +Äü{fXE 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 @@ -8596,82 +8966,137 @@ $OíœàÅ€DÈ t‡Í=žÝbóÆÃwî6ß"£“˵?”JËOP2RÐoQo+†â1)©w†¦ÜèådîI½ÈZ¿VÍ(e÷åû È"[vQÔü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>è.<Sâ¢éX3p7«Á~ª"럽Ÿ“lË´ÍÔDQÿfŒ°Ì -*s"}Y
;Ò‰¢ú{YÌÝÇí]p¶Òݯ€Ž¶Xo³êÙ} +*s"}Y
;Ò‰¢ú{YÌÝÇí]p¶Òݯ€Ž¶Xo³êÙ} endobj -1496 0 obj << +1570 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1932 0 R +/Encoding 2007 0 R /FirstChar 67 /LastChar 85 -/Widths 1933 0 R -/BaseFont /UEKZXT+URWPalladioL-Bold-Slant_167 -/FontDescriptor 1494 0 R +/Widths 2008 0 R +/BaseFont /MWGRYO+URWPalladioL-Bold-Slant_167 +/FontDescriptor 1568 0 R >> endobj -1494 0 obj << +1568 0 obj << /Ascent 708 /CapHeight 672 /Descent -266 -/FontName /UEKZXT+URWPalladioL-Bold-Slant_167 +/FontName /MWGRYO+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 1495 0 R +/FontFile 1569 0 R >> endobj -1933 0 obj +2008 0 obj [722 833 611 0 0 833 389 0 0 0 0 0 833 0 0 722 611 667 778 ] endobj -1302 0 obj << +1551 0 obj << +/Length1 1630 +/Length2 6133 +/Length3 532 +/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¬@¼¼ +µµC‚XnxXÙÙ9þ²ürYzý‰ÜD" ¶0Ó̓;Äîì!o(þ×ZiÙ@! u
%5‹‚šHƒ¸Þ¡áf鵩@ 0„dw9þq +³rt³þ%àÆnÿ-ÈÙ~ãátƒÝiÀH„•+Ô ºÉª!+ÿ‡N¤òWnôÁmn<áVn¿JúÝÐÜ H(BB<‘¿rYB@ÖP„³£…×Mî2gWèon(Ìö/ Wˆ…«µ#¸¡¹áþÕ¿êýSõÎÎŽ^¿£á¿½þ¡ŠD@m¸ +ÿóü{é!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‘þ.Ù”OuJåÊߪݎË;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‰å +b݇a›yKÜ£%t×TcaÖËF˨?B:äÐ 3ÚZP‚ÌÆŠ}
fñφôˆƒTU‡J鉽žj:»«Ï‹ºôN)/ÂÕ äE½¬^gº‹ ^/«k¯&6Ö7%³"”-ήQËòÍ“ñÆ‘r¾“'# +ñÀè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*¹ +·³®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“ +‰ÌÙ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 +ýL¡T÷Æ{ši®G3È¥ã"y+â3’§[cͽ<å†Q@òæì+}·÷¼Íñ0þ’Dâ%ßéfL¹7®‡SìDnŸ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Ú +ö”bÇЃ 9µ³+&ì“[8Y) + ‘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¡ª†ziRûRž2ã ¾~æ9 ¶hKI<üORdÑ*ãAŸYëêà“ºñp0Ÿéj<°÷8KgQ»$`¹dÌù4à|ÐÈ¥ñ„î±ÃäÂñœð*S +(Z¢`‘®~VpùEaAzy÷UwJs÷Œ?´½‹š|: }Ò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¾<B‡›&ª½úŒ×ž´)„Æc+¤ œ?µÆ(_¹à™ñ0áNZ¬/ˆ_c24íŒË¢—'{.ö¥dÖî§Çz̓¯ÛKÃ{u`‡:s±¹ Á<º'—0— HMq±LåRnC@x›ôs̈W6ß>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Àkœy½endstream +endobj +1552 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 2007 0 R +/FirstChar 66 +/LastChar 78 +/Widths 2009 0 R +/BaseFont /OTTUUC+URWPalladioL-BoldItal +/FontDescriptor 1550 0 R +>> endobj +1550 0 obj << +/Ascent 728 +/CapHeight 669 +/Descent -256 +/FontName /OTTUUC+URWPalladioL-BoldItal +/ItalicAngle -9.9 +/StemV 114 +/XHeight 469 +/FontBBox [-170 -300 1073 935] +/Flags 4 +/CharSet (/B/D/I/N) +/FontFile 1551 0 R +>> endobj +2009 0 obj +[667 0 778 0 0 0 0 389 0 0 0 0 778 ] +endobj +1342 0 obj << /Length1 771 /Length2 1151 /Length3 532 -/Length 1713 +/Length 1712 /Filter /FlateDecode >> stream -xÚíRkTSW‘ª¡¬òRIÕzX%2yj b( ‰¹7ä–ä^z¹¤D|PIU–EltÉST” -«Š@} Ô«0|‘VXŽƒTŠ€¯¹`]]¥?g~ÍšsþœýíïìýïlšG”Œ!‚°p(†“#ÁR©„Ãä™Í¦ÐhÁ8¬
Q°p°Z§Ü€ÍòVy| -
céIUÀ+˜>Iâ‘Æ¥R¡†µd
¥Bd˜ ˆ4°nòFXgÀx&1)€%6©JaMj’ *ðßÂ.ý]*Æ3HQÀkJ&"!Õ -ídù)§þ’Wháw¦M×0¤ãètj,üVœ†vzVB(4ˆR„¦j`Àà¬d²W¾Å‘ŒPDCQ¡T•B“Oá0 -MWBú7¥ƒ%Œ‘ÅxÿþµSÉ(‚цt°ÿ`OÅœ?bÒ$у6“ÍæDr¿;%Mk&F•„ ©€Ëó -W(ä‘9 -Ã)“ÿêÃ,
œ‘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(IegÖì…åÿ¼[tuâAV…Y«/ÏOÜÿÌõµ•Úz§;í¶£Y`*“ÚÝ0û¿œÃ¦ëUýδÅÖ¸RÁj™pöBŸëòr3°ùÐßÃÐÜ!ýuö@]0àa~¿[’ŸS+‰]p¬ÂEY³@ãVMµ…ë[×·hЋƒõkó]Òê;¹þÅœôƽ´u)ã¯h¿-Ù9óiÒ‹½Ïߘ¨-•F÷3b½}fzyÓÛÙTûk_X<âê¯î¢Àð^‡U¦6íßû³›Ç¤ Np#ÏíæÑ/<\Ê}á¸v_ùߤ뽿m²ìIëmñ—Ðû+ýëR‹é -ôÜçGã:òíÞÏ)\M¥~†š–Öé÷×…—öÝy)+æÃË]/¹{©¸äµm¼¼n¨Ý¶,ñ0WèÒ¨l¬7í¹XYìø±\Œ—Fç+Ûn'oY=,k8±Ûaç:»¸knAó¬…;7ÿìöxY¦¬âëõçùù™òs¡¼¾À9ß{..RPrÎÉ¡"qõÁÔ{âžðìç?| +xÚíRiTSבª¡¬2©¤j=,Œ‚”$7BB„A¢a”Abî
¹%¹—^n i +(vš.tkŠî+Îf;pÇÇxè~á3øcI´±qø°×‚\ëÁÍóÒv2ïG-Õyÿnu.¼6EÛé]{Âøýœ%{á¨lÏ5{ÓŽÕ„×lSiñgí9ʯY•gŸ}"lúN^F:·ðO—º·1Ö_®}DÚE>¯LañþgZZ13Óerά^ÏõIL}ÕíwxíÁjÝ®Ý\¾`ûzšÀ¦¿g€OO}Z’ûzËHOˆÚÆ^ÔÔž`Âî5Üþ¾ål>{Ð^íê÷Õb¿zÝù_FW¬ñäØË£tle¼G¡eÿ8n®TÕ:1`'ó¥ +0Éâ°SÊ¥ÓnO}\âl~Jl:p5”×P¾ö¿U¹n¤bÜ÷N׸:ÏñòpaÇϧ—‰åâ× ’=)såYZM眬¦®Òyvåš@O·-§Wë>ç|qJ߸Éb c©hßvÍñJhŒ +ÚË×pž‰ëÈ·z7§p%þ ¦_\7ªÙWZjî;²ãbVôûÆ;n1Î¥¢’W–ñ1uƒí–e‰‡8‡FYc½~÷…ÊbÛb”DiT¾¬íVòæ•C⺆ã»l¶CÙÅ]³šgÌß±é'§GK2%_®ó;ÇËÏŒ9ÌíóŸõëÂ" 'çœ,UH½+ê Í~æÿÝ{ð;ÖA#‹Çž1<7+zO{—‡
]îÞlÝͨíR6U—ìÏ®qXÿNˆÝ¡öË‚«v¾»Ú‹Û¹Ÿ´Ñ—/^%œ\êôµ6¥ +êÖ?iY•c‡[ð ÛˆÞF‡6f^ž°4 ëúÎaErCǵ²¼Ÿ±hI}¼jß,(:å×6ƒXÈ·šqïƒ+ñŸ~“RÍ=/jIºÚóùÈš¼¦$–{R‘§”\ÑÍcÚð$+òP~½¶Ÿý.ÚÿüO))Aâ*)‘FûVŒ¯endstream endobj -1303 0 obj << +1343 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1934 0 R +/Encoding 2010 0 R /FirstChar 60 /LastChar 62 -/Widths 1935 0 R -/BaseFont /VNUSBU+CMMI10 -/FontDescriptor 1301 0 R +/Widths 2011 0 R +/BaseFont /OKNSTP+CMMI10 +/FontDescriptor 1341 0 R >> endobj -1301 0 obj << +1341 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 -/FontName /VNUSBU+CMMI10 +/FontName /OKNSTP+CMMI10 /ItalicAngle -14.04 /StemV 72 /XHeight 431 /FontBBox [-32 -250 1048 750] /Flags 4 /CharSet (/less/greater) -/FontFile 1302 0 R +/FontFile 1342 0 R >> endobj -1935 0 obj +2011 0 obj [778 0 778 ] endobj -1934 0 obj << +2010 0 obj << /Type /Encoding /Differences [ 0 /.notdef 60/less 61/.notdef 62/greater 63/.notdef] >> endobj -997 0 obj << +1037 0 obj << /Length1 1608 /Length2 7939 /Length3 532 @@ -8682,127 +9107,139 @@ stream xÚívgPTݶ-HPPÉ™&çÐÉ™–œƒº–††î&K(HÎQÉH’sÎ 9#$ˆ€øÐïžsn}ïüº÷üzõvÕ®ÚkιÆsŽ¹VmVF-]^Yª„p@óùž4`ö–Î(]°ƒ¯ÜEXYå‘P0†pP G8ÚCзÿãºP( ²BÂÑ€Û¬Z -JñDÛ‚Ñ¿s£`·n -uƒZ|™BX‰¼LLIB—Qdt
(<okbu:æ}Ò{ŸíûÑ쓼,Vôâº4¯rèéMûäŽãÏõg\=-äpöæxèA3gkö£¶Qî
~ó<¤]ÃpÏà µ%l“Ç+Ú:æ¹×w醄x‡ß9}™]²}IYΉ¼*"ÉVb—åìì²Å|ý~ÎÞÑÛÝÕÙ|ŒÓºNÉÏ*î‚MÈæë”N#m¢_äa™ŒéøÛÔªÏ!´0sL^µ$0ÙÂÿTh5ë¹[Fúù{ª\™ÏíßÉúÐâ¦Ùé%üföC ~–fí*!Î:‰EvýÔzð´÷Û6гßÕ•Ü ê³º£Âgü«e‰;}ƒv©b]ùßÖÒï6”‡ùÚ}sø.Gj¢T«$Kñ£•I
âQ–®‹Â~ÒìEÛ1w.ì*Çbr|¬½}$oÖ‡·Gs]> Ã?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 -ušÅ?Ó<–“G¬ -hEá$=k -jK‹ê\ô#Œ²Ô_j$ø>Û}~';Äë08~Ⱥ:{¤j7l˜ŒEÖÉ/‘ÕØô 5³î*Tô#ÛýêŒm¥(Ÿ¡\B½MÈb\Zk³u -ÂKJ^'W²Ù3FÁå¤éÉ.ðÊüÊÕúìðã‹’c=,®¬3jÉ/Ì ¬}橃”.‡Ó6Š& êÝîU¸¨Ûkh•kgݺKÙ!ì`M«a'x0¡ƒÌ ùts«,t-¥§†ìC+µýÝû¡ÝÒ^aâBý" ðf°Üpûš±›õvV¥³ƒÃ÷Ì
×pJs®a¯—ÀœÉAgÔ6tå„è/ZÅkQ^î›íF“’Ô¯[t#¾]°rÛÅ‹60^Ùý”ðzFYËP’OI*ÄmÉ×d«òñ¦¾âWfÖòûé!ou¾qÊÜCZhµÐÞ“iQ'÷|(D¦¶xÙ*ª÷d_R½˜Ñ%8Z?Èb+ -à‹)קw&¬š>òÕäø° DxùAt€næ£`öVkøqvëð1']/¸t¡yô8,TÎ.a Os%/i5 -ÉzY`yÖP@-ª¤9¯ŸÇæžÓçý¤>Vo€Ì¢éªd>Í/ˆöõÏ}êY -³¸~h—•¸8˸ƒŒFF¹õ•Šû?ih -vžj ×`Ú[›öÇ|-…>°ë=].žàŽJ,}”›ûÈi±ð!æÛ‹õÛ‰ÌJ«—–r•øœEk±9,ð”ˆO’ܽ…n®Ðq!páxÓ“1¶¥©~à]ÙDXÞÑTtÿXwd‰–¸rϽ”T…³k«eÛ?ƒ6òg¶òõPªj~«YÏZš{JÃÁp´hü@AÓœlú)ÿ€úBè×@aS‡ž”Y2(õ¡r‹¼û^*84å¹uÞVi¢¾¡HÑÂé…ØÊÏ–)ŸÃ;c4¢ž/{Ž¬Ûe/HìEˆ…jŽÚ¼9CÖ•Š‚ŒüsB—W¨Èòè!&÷E*l.\ÙÈL4´ÚËÚ÷h„¢Æ·GñZÍŽ<çYÎz9†CÅŸäá¦TKñÅ3c/ÕQYV;Ò+Q%_Vªdá¸ô¿ð‘8ܳ
v4e$2iä*õ Œ9csõ3k~YžØaí¼zf¡äö•Á’±¥;Éb1ª"(GO_XLô>ÅGçë%:}¨=Â[#™µ¿Nôp½vCžªÂíu>N1
¬Ê¼íQù„8¬ì¨`æWn-aö§m+´Y¬~5A”XĽh§"hV לÞ_9æJqB—¡Ìh'·ïžrs)¤<ÃÑ!]‚ŒšÙZ~\ÍHÒzU´NÏh“[€Hái3 -RgT$vÊ®éï9‡á׺ù§ßWŸa|…psØ´"ÀÅÑÁñgð~¸¿Õxy¿oA‹z¾Â¼âÕëPúí -GZ÷±Z6ÂlƒÝI§(²‡ -?Uôü¬Ë÷ -žä¶5Äõv!.[7$›\ÙÌù ö %Ü-DÇ9øÓ\¯ÔÍŸÄ7& Oâ×ÏžÅÚÅ8“£òÅff\Æ
--â×6™…ÈXÓØø¬ï¾ÆÇ„)h}YÆð–êA±>–?qhYêJÁoȯü¸"Š˜‰œñµŠýVw$ˆÇÑ5-C¶Ãö&šgŸI}2Ñ»5ãùáö¶DăuéBÿ;¤»¥ªïÕ\rþhüæx€Í?‚^z:“Å„ê!Ïå¨Ú -DЃqB[äßTœB<ug(°Ø˦×ý9J~¿|º#ß*ý2üÌ‘ÔLÉ{¾OO±ÏïùƒiÌ‚øœÎ'=Ú‰dž•TŸT¿ÇÍ8ÕíÌ¿Þó£œÁ8©È«ÚÁZ±€,m³2ÓDŽñC£{p›®
Î>*«ic:5uª ÍÐåS;ùEÑÎÙÀHoÑÏWçx ×ØÄИ0uÎlPÎ5—¢ú½»<>ÕW:‹ƒoY2’˜HJyf€ÇòTcª§Y½ªÄæ'Jçx{êI_Í[¾ÆuE^n¥ñÙ±pmËISDx°ñ¸U -JŠ+Y–¾^#Y%ÿ GpXŽÒ0Nãˆ&^-`iªiðŸ;ÐNU‡UîS’7K±Åüð[Žç&“vñ;ÁsZ§â§u‰ö´{§¸àôò‡ëòÔˆBW
×B‹CóáiòT£ÊÚÿ“±'ŒÒÞÚ¾
ZwÕ¢‰?UÛ.[
h‡)qŒÐÇ -¯5Áƒ ¨“¹Ýa%µxkÐÏ_WÃp)ÉâüdÃS<C&fåc—ÅoFÏT±Õ„ú° -)è@#{ë>Y]K¢þäWOk‹à0É -m›Hi‘œô
d„†q. „WôâPløFûÐÀî±Ü"“[¹É`¬?sòŠô£NÙêqüiv Ž&#‘ÑPb6G¨4Ùpòã¹>¼¾_$”ì¹J‘Nx?~«=!ädœGû¥ªw³ -‡¯0&;ì8u¶IýÚ¼ü?"¦ûø}¶lÞK©#«ÞÓBüFçõ'Ã÷bc-~Žò8îêÜÕ,|¦,kÏ%äq†Ö‰~^÷ŽÓ×™E°~r¥¡˜[©¹Ùéù _T¾lÌâÍî -ù¡M½Þöxhá,ÿ -áHQ þY»Bå<GJÞ,6]JOU?ÀÕ«Uh´\ï MNñÂçzŽùy¬˜+߸+¤„#äoàùØÈ)ÏøÅPØ -Û9ÔB1®¥Ò[Yù=cÁöâS§¹óp—ü›ÏUÞYKf†mˆ¡ãž\%¬,Ü1õ È<o«»—ÆØ1D*@„ã¯O‡¿q¡ùî)uô¼ÍÌâýükjgWØ!›ÖöÎÏb¶wéÜ/žbmS`¼•9yì>ÕjªâD^ûÐ."߷ƽú5Zï°Æ溱@²¬®fµ4ðÎ^‚›M²¸©ým|ÿ ¯©‰É«ê4 -$L¦nW`6»SN™’h܉¥::`í ?ä·¾:*Q “ן”„y·±,ˆÅ’·õç?‘²}ùT{·BV°£3ëÉZmmsÇBkÙ-’Ãøá+@™d׾€ËM¥Üšô³lŒ~‹ûÛ«/xôñTpïÅM~âÓ¶•˜IÓAéoc_3¥KNI/6Và&âûßÕ{´adÂ{Þ@:C&][°A=Ûe¾¶5YØøJ>ªí®(íPãHš(b"»,ŸÚšíÑ)„Ï\˺_ºw‘©¿cð>b»¨Oœ»ÛybôÃ$N`ðöL~kñ^óÛSïž]ÞÙXƒ‚AW°}´e•!]¨µØìà×fÏHÍ·Œš’ ƒGïa:Õsg«1ì8ñÍÑ –äiöÉñhCìò´g¯Ë8ßêô-Ì–~‘9V|T±&Nn·äML†‘§ÚDü”¹Ú>I^Ž”[û•ÞJ¶½ÕÉò<
ë•Zv·yÁ<ü0ˆ¤5ºŒ„hO!ƒÈ÷sÿððd‡åÁúÌ´Jb+"ä(2mfƒ77Ê¿”Í -8*v4ºÏÄ^±ûà+h5zê2¶;šÞþ,-õQü! C$yw9†CšJO ™Åˆq\`±"H,Þ)T<icº ¿ª}ZþK§{«Þ®ûªè&4CSQ~åâ7ê -QH;ǘ¢&šùŸe“ô¿žUÙ|µ°Sc0R2YE]¨ -‡á{__bçâ.°ßþ -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 -<¤þdÑ
_IÒõ.˜ê¢Ï\9¾§é-xÚÖ-9?›ìÐv_wóý}¾éH`…Ñ'>Êß4¬>äŽT‹¬ÌÛúGäµGÔà…$Í ï‚7LI›u`žUJ2ì„΃79ç¯~f´láÊΚìïW5?|¸':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–¬ö…Àÿò!øÿ +JñDÛ‚Ñ¿s£`·n +œ6B†NšVµúz9S,nq2BÙYÒ_+Ÿ¦Þsà›`n'.@b%iî§ZüwœJ¯îsúð{^¥’¸úCHW—Z“èŒÁv,!ieí1«¥O˜–©í[oF‹£‡y‚öƒÛ¢Aùx@”SÜeMIƒZ| +úˆJý€•<.%sõJŽÅ?ANïÝy¯2}oÁ[+B”z1’áž ‚`Ïtf¶¢tÈwŒ°ÏŽ·xÀ©þ™Ììè)‰ë{çqéœÅâêsn¹ÁâÑÈ!áLâ|®Å–êjÙµXùPüðáæN…:ÍâŸiËÉ#V +.¡Þ&ä±.µÙ:á%%¯ÆƒÀ+Ùì£àrÒôdxå ~åj}vøñÅ +E“õî
÷*\ÔíÀ5´Êµ³nÝ¥¿ìv°¦Õ°“@<˜ÐÀÁæ„|º‡¹Uº–ÒSCö¡•Z„þîýÐni¯0q¡~‘ +5¿Õ¬g-Í=¥á`8Z4~ iN6ý”@}!ôk °)„COÊ,”úP¹EÞ}/šòÜ:o«4QßФháôBlågË”O„á1
QÏ—=GÖíÎ2‹$ö"Ä‚B5GmÞœ!kÊ€ÅÁFþ9¡Ë+TdùGô“Àû"6®ld&Zíeí{4BQãÛ£xæ +Çžó,g½Ã!‰âŒOòpÓª¥øℱ—ê¨,«é•¨’/+U²ðN\ú_øHîÙ;š2™´@r•zPÆœ±¹ú™5¿,Oì°v^=³ŽÐŽrûÊ`ÉØÒd±‡U”£'„/,&z‰â£óõ¾ÔáÌÚ_'z8ƒ^»‚!OUáö:§˜VeÞö¨|BVvÔ0ó+·–0ûÖÓ¶Ú,V¿š J,â^´S´+kNï¯s¥8¡ËÐ f´“[„wO¹¹Ržáè.ÁFFM„l-¿?®f$i½*Z§g´É-@$ˆð‰´…G©3ªV;eW„ôÆwœÃðÇkÝüÓï«Ï0¾B¸9lZàâèàø3x?Üßj¼¼ß· E=_a^ñêu(ýv +-gھ蟖¤§I„²kZKéä”ð +›û,¥ñº“ÛýÙU@žXÒÖrÝ}Â;´w`D.à™Œ«ž¥ÅÇ3\™»ølð…Ébñƒ¥‚U³¢ÌöMÌœÞÎÛJ”…¶WkÓhý j¢’«qµD¹Kz瑳³B|óG\Caî+þ¹*ÊÛ~¡ñ¥ÎGÙ§}–ΪJæÄäû§ W÷HíÚ>ÛÀaòœúò4ó üN$ÕYYšžÇï_œ••W+vqƒÛSš:± 0ZÌ©„›a‚â[‹”%sˆ{¬Þd?zä7~ÞÛsý3M{öži17ÍÖ‚\"éýGeã3mì7 +Kygm/®SÉçÍÄ\ÊqÈbO;z¸‰ð«-4'¤§€+k=ž~(6¸hLìÈÒúô<6»¯´yjÊ^"þxNLÝ°Ç%3jz˾‘e2 ÃÏfĺEÎ>_žÝ(¸š¤²uy•“®ƒ›{!Þ4l"ùíóQtñÚIÝE°ºÙu²¯‡Ån¹¹ÄùÂGˈÃÄ › +?y“w¾G$ÜË×ß™‹<Ê™2ãtÏ¢Þ}ÿ†@´yIGbc‚²Kê·HŸ|ëÖ
x°–Ñx½Ùþ2—€_M”+=‘Û~d˜„“•/tŸ†ò³vLFd*°Ä¾ù±b«&}¢¥çË/à¥2?‘©"B¾,|BÊ1û楛æŽÈkf}°¿Åø«þŒ„g“IÆÞyã8‚©.ͲmhïF`”ÜN‚”ƺʨjÊéž=wþ¼æuußÆ?ÀTÓˆ½~.%º·2¢_½¥’()“5”ôe-èÍÜhxlšŒS+é\d®ýÞ¢Ïd=ºñbfýFÇO¹!3‚"Ž±6÷'íjCœ´¾X‰Œ]Š*ÅÂBùwK‡õiŽ€hn"d²¦…Œ·âg쎓š™Îë`ÎÓp¦»²'UJfaþ»f[Ĉ]ˆ•á®þÍz´&—À$ñZ¼¡®i¾—fG‹LßÇzbÕû\dÊÅï격|X“Ý\sÉ•ŠØÊ+¾ÿfÜŸ|>„%ýHÎÌÚ`=6"æ’P«ô9#Ñ\Ó#3z-Rô|%ñ¨$¾Gc^¤‹M]÷²³Ôú{'¢_ýDÊû1éÍ*õ,θÈêÝþ²â³Gƒg¸LMa2B Æ»é»*+M[TÏ•´lm§2!ž7V¦Ôˆ·nŠæ‘’¸†pj7ŒÙ>ò"$›XêÐ:{—¶^˜u^9Ì’„‡DW¬9%%^ÑËå,W0ß²¦ÜÝ™ZÒ×ý/õ{øúÆ>²Ý” à/"ŽDkúmù0§_ì>WTxìÑéƹœ ‹› +zƒ½Ê-%¯Oà¸L5“‡û’ªV,î½øÊáÃz‡>ò&ïw¼´rY6Ç—ÆJwŽGƒ±Â*ÜA5ƒ +ëšSùSÕi…Ÿ*z~Öå{OrÛÎâ¿z»—’M®læ|Pû„î"‡ãüi®WêæˆOâ›Ð'ñëgÏbíbœŒÉQùb³ 3.ã…ñk›ÌBd¬ilüÖw_ãcÂŒ´¾,ã
Ž +¢&tG÷ü©Ï¾2¤ûôþÌÓ(v'«.Š +òôÿÑü0íû¾€Žˆtß +sožbrÌûvE ²ÁÅ/ÍWRÙu/w¦ØÒÕÛïòxœ‘h<LšøÖ‘píÇâa
®”Y +Kqh|>6œÊ³(æÀ’ßë. + a‰ñµoWkrŸÔgÔÅÖº›Ð˜wÜ6îÂÞN¾Ùö
i± XüÐ~ýÅ´á´ÙÞVóÞ³6÷³Ý>EŽ +‹^±Šî±nl#šñ‰65%,ç_°Oê”+µNý%Ùz¯>W7¶]•fzã}A}H›ÎÀSÝÀ~ƒQrNÉ)îs¬þr]Lf¸á“ +<á¼ØËûò
Aê)¡³k¯×ývuSøGlVªs#Nu¥¬·OŠE•?.j?øÿ©ÓwGä“øݺ23oªkvSÛë>Ñ=¶ Ðz¸^"èÁ8¡-òo*N¡žº3Xl‰eÓk‹þœ%¿_> +Ý‘o•~~æHj¦ä=ß‚§§Øç÷üÁ4fA|Nç“ž@íD2ÏJªÏ ªßãfœêvæ_ïùQÎ`œTäUí`Ø@–¶Y™i"Çø¡Ñ=¸M×g•Õ´1š:Uпƒfèò©ü¢hçˆ Šl`‡N¤·èç«s¼„klbhL˜:g6(皊…KQ}ÈÞ]Ÿjƒ+ÅÁ7„,IL$¥<³
Àãyª1ÕÓ¬^Ubó¥s¼=õ¤¯æ-_ãº"/·ÒøìX¸¶å¤)"<XŠxÜ*%Å•€,Kß‹?¯‘¬’ÿ„Ç#8,Gi§ñ +D¯°4Õ4øO‰h§ª‚Ã*÷)É›%ŠØb~ø-GÈs“I»øNà9-ŽSqÈÓºD
{Ú½S\pzùÃuyjD¡«†k!ÈÅ¡ùð4yªQemˆÿÉX‡Fiomß¿»jÑÄŒŸ*m—´Ã”8Fèc…ךÆàAÔÉÜî°’Z¼5è篫a¸”dñF~²á)ž!“F³ò±Ëâ7£gªØjB}X€‰/‘'™“š"ZtÍCöEqË’¼R7ö¿Õð®ÒÂö@.)¨F…t ‘½uŸ¬®%Qò«§µEp˜Çd€™ÑÛkï#ÝýFø‡‰0A³KE*3Æ€F ‚é®0BÖLqÄ`nÿ‚Š%P爉䅟Ú*›X‹²Å·jÔi÷b¶‹ôRáó"¿¬žû6vTZRœÌ°T3Séèv\ã«%øÜýI¯”Þ¯é¡ëæ®ZÖ·mpßú”Qn?ø&Å—Â#Ôߟ›ì}ÅÀ^í° ª"Á"çt{RH:†×¼woŽ¸ÏhFO°™§éç€oÊC£B÷~”… + sœçã¸!q?Oƒ¶•G¯îW̳ŒÔ)HænÉøoÌF–A£Êå{Ç‘æä8£jýäUu;W+Aà¢ïóÇ;X;{¥ð”ÇÎwÆ}x"
Æš=×N¿nc}&±Éy[µ~œ ¿öµh¨»š«¢³ñ©"Ì‹üEmÊ`;µ +Lj +â³ß +Ì Q=w¾?‰¦6ª~ûá¤àõd‰xW/aéÒÛ‹†Cú\»UÒâàfÒ~…¶‡Í +¤´HNú2HBÃ8—GÂ+zq(6|£}h`wŽXn‘ÉÖ\ƒd0ÖŸ9yEúQ§lõ8þ4»G“‘Èh(1›‚#Tšl8ùñ\^ß/Jö\¥H§¼¿Õž‹r2Σ}‰RÕ»Y€|áCžÓ|ƒi
xCªÝªÌZ-›Çð0ÜJLÕ—D9dkùåΞ‹üÀu!!‘}U?³9Ü«eŒiÒF̦ì½Äõ–çwNRi¸Ž~ÑqÂzÊ—eh)¶M#±M¤µ.?¶%aÿ5ßóÀ€L]t“ö´ƒÓÈÙ‹CM³Sꣲlµ^÷³²ÚfÉÔë'7±‹÷bqÛG2®K œ¾’j…Ã×?“ vœ:Û¤~í^~ŒÓ}ü>[6ï¥Ô‘Uïi!~£óú“á{±±?Gywuîj>S–µ¿ƒÆçò8CëD?¯‹{ÇéëˆLŠ"X?¹ÒPÌÔÜìô|/*_6fñfw +=ÂRŸó>ÍjóðÔv)Ùyÿ¹[G¼Ü5)…ðwÃä¼Ar«òqsV +…üЦ^o{<´p–…p¤(„¬Ý¡òž#% +o–›.%§ª¿ƒàêÕÎ*4Z®÷„&§xás=G‡ü<ṼǕoÜRŠÂò7ð|lä”güâ(l€Â(Ù‘(8Å|)ÿ¿wÆô/þQL™uG«ØâÐÏœÎÎ~N*{cÀt(û6HÝB=viˆÀ%ŒÐ/ÌÐà>^P䶊ŧ¡¯ÕrȈ=ÂÆé2¾ldÔD4“kêœÐw§3\Wd†@$B}vÓmwÝK&à#ýÁ?¡e6êœÿ¸¥*IÖÔ*Àií¨²Q„É¿åAFÜd@+íy‡íj¡×Ré¬üž±àV{ñ)„ÓÜy¸KþÍç*ï¬%3Ã6ÄÐqO®Vîz +Pdž·ÕŽÝKcì" ÂñקÃ߸Ð|÷”:
úaAÞffñ~þµGµ³+ìMk{çg1Û»tîO±¶)0ÞÊœ<vŸj5Uq"¯}h‘ïÎ[
ã^ýŒwXcsÝX YVW³Zxg/ÁÍ&YÜÔŠþ6¾ÿ„×ÔĈäUu&S·+0›Ý)§LI4îÄR°vò[_•(ÉëOJ¼‡ŽÛXÄbÉÛú󅟃HÙ¾üª½[!+ØÑ™õd¶¶¹c
¡µìÉŠaüð L²ëb_Àå¦RnMúY6F¿ÅýíÕ<úx*¸÷â&?ñiÛJÌ¤éŠ Žô·Î±¯‰Ò%§¤+Žpñýïê=Ú02á=o !“®…-‰NØ ží2_Ûš,l|%ÕvW”v¨q$M1‘]–OmÍöèÂg®eÝ/Ý»ÈÔß1x±]Ô'ÎÝíÎ<±úa’'0x{&¿µx¯ùí©wÏ.o†l¬AÁ +Øο>Ú²Ê.ÔZlvp‡k³g¤…æ[FMIÁ‹£÷0ê¹³ÕvœøæhPKò´ ûäx´!vyÚ³×eœï?uúfK¿ŠÈ+>ªX'·[ò&&ÇŒÈSm"~Ê\mŸ$¯GÊ-ˆýJo%ÛÞêdyž†õJ-»Û¼`~DÒ]FB´§Aäû¹xx²Ãò`}fZ%±ÆÈr™6³Á‡å_Êf +í&2PƒóuíIŸ[^|uÊàïíŽl«0x¦ŸøpÙ(ÈÅ%mé…ÆÃð½/¯±sqØo +ŠÉËQfþNÒúðÄCzòÛgêg_åD6ºq¸I“ª¸ÊFØ2ËvÖ¦™˜¤Pé¿g¦Uu䂱~Õ#ÉUz$¼ +ÇHÄ•vËÕ$«x-‘–ß™š¦#{eöòÓ`ÐhšDŸâ°º ë«×^9ÁB0¤ñ뫽‡í»˜m×ÖÜ¢Ò ¯-‘+ÖŒ!ÇBPŸÕvî¦è ·?§¡ºƒ¼E^$‡ý…’*O*n˜.—Çw2wÏ5N¨°xNÂø,†éõG#ËÕ€ª“ŸêÅUOr3~\Å[kÒ¸!9×0ϵ +CÝ_‹{™éÉYŠúð["šgì2eàß$‹îy;Þ;Ú +_ƒ
ÃižòÆv==·%!Ãd2KVûBàùü€ÿ' endobj -998 0 obj << +1038 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1932 0 R +/Encoding 2007 0 R /FirstChar 36 /LastChar 121 -/Widths 1936 0 R -/BaseFont /VUTBGQ+NimbusSanL-Bold -/FontDescriptor 996 0 R +/Widths 2012 0 R +/BaseFont /HHFDIQ+NimbusSanL-Bold +/FontDescriptor 1036 0 R >> endobj -996 0 obj << +1036 0 obj << /Ascent 722 /CapHeight 722 /Descent -217 -/FontName /VUTBGQ+NimbusSanL-Bold +/FontName /HHFDIQ+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 997 0 R +/FontFile 1037 0 R >> endobj -1936 0 obj +2012 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 -994 0 obj << +1034 0 obj << /Length1 1166 -/Length2 8264 +/Length2 8309 /Length3 544 -/Length 9079 -/Filter /FlateDecode ->> -stream -xÚízUX\[Ö-4Á½p'hpw×*(¤€*Ü!‚»înÁ]ƒ»kÜÝ/çôºoŸîûtßîw«öZcÌ=æœcÍýíz(*r%U&3[ÐG[¨+3 -në3Áù -|ØGè´£ÇÀNâ¨Ð× éÛb®=R‡äEÚTBbCøª¶DÞ¤W:›[öŠ¨$dEY%Š[Ót¼/oü¥¬½”ùP'û[Ä–~ X2µc×42:Xµ{—%ÍøFSÓ]¢8œÞ“’˜•G&$ÚÜ|-Cl7…à›ò~»,Nv}»Æî,@HíŒÅfMè\ƒ•jLw~˜,rÿMüF]_© -ýÍ8¶öOáÏoëÓ‚úïLîÓ¼¿œ+è¶kÎ6ÙAÝ$=43Žºoô°Jü¨rOwVsr¶Ê¬ðšz¾Ž~ÿ²ºþëÁ‹êËõ-!蔄Wd=R9‹ò”l:VŽhÔïÀ³¼LôÃaìtþ8QIVæyU&Á¡û«ü\žj_E‘{<óéYàôDËæúløa½ê£D–Îîç„xô?¹é$Ì|’"Xûü"rø—Xu[ÊÚ6·èNâ÷AŒ»®qmƒ½Éý¢¹Hx7žMxÃ_Õ[±½z -¼*K«™Zú¹úÕ°×Wý¢Øø¹.ÔR¯æESúLkéDÐ?«áäv%. -šI-b´zŸŒU íÑ—þDÅyMß\…‹ÙCó«ïÓÖSätRR˜…$ùÛˆFy/Áê}äYeOÈZñ¸ÕÏ«¥¬øïc}͹ü< ÂåŠ^úRX¿T[ÅgÝñF/yo\ky“Wb“Ë·Ú{že”Ã_¥b1‰¯ç(17•®LsT/“ks¸àýÄR–Ê8à׆h0ƒÄcsâð]€¡í"Z°p¬Ì¥`ÓTÚÕ¼V£ˆ™×Þš¥”¾Îé;»WžÄi%(¶ØÄ5œ™,—»ì>N*Yƒ?åïyÚóíʈfüλ»²É½ø7ãáFWqÊZS>M…ùdT„Ǫ;£Qס3˱_‹§ÙL_¥Ÿ€(U}Üh-²CöF;5œ}ó.T²¶/0žyÖ]±!3f\CÕ1WR|#¯o‚Ǧ?}Fq?¯ÓfÏ ‰²¾RŒ2Á œðäÞ"# -hŠÚ?åðP‘||èuæsSQ2¨•PbHRóŠêÐ8ꎜ¹MS^MýÜÝ´Ó›û¶ÈnØU´]IÜl(óš–ªÉô˜ÔpXò,Î%0Œ1µky„Òæ®qú§°Ä ßÉ`hˆ Y›½ goû[rð`jϾªN¸tÇ\®»–ü»bIBj¬÷¯Âµ^‘•HÝ{”é·ÄÞê -Ô
+¸'º]÷ñ@f̼ÀÜGgìdô—éËùêÛðFÔ!k£«Ã*.$|™/mßFàŽùyAO&—2Ö…Õªõ¾1Ù«<Žø+vˆý–Dce”µEx`Iµ5úÐçK:™¢¦ïÝOÜtó‡ž.erƧbÛ,H/«äíuåí™RrŠò–WW“OF3³gÃ)‡¬Då"\ßžâjèßÓ”võVسïuÔt2C
«Æh]W*é„g̯%ä"‡È@Šr¤Bqf„•4†Fóó<ÐP+]°¹Ng…8à„q/•ãȼ¹b–Òdù&Ê´ºdVNšùÞÕç6bÎNé?ï…çPÒZWïn›vÊ -bší‘v\aۺΤ:×}¸½øÚ"¤#"tl~–ŠÂó5‚ws¬@ö|KéêyÏ’4%Óù|ô}É=ƒ-RK¨Ö{Öˆ“¤‹xwwa@â©Ûæí‰ûÂŽKˆ0oýwËŠµºÕ6©M8³q¡ºïˆoâ³·àßYF¤i{#ØHjî˜/„†HP,9;]D»¢ôc¢bÓ*ÃzøüÆísüe¹ÔÊâ°?»ÔÎTùw}ãΗÊâÜšTÆýjy¡<w¹ï…ʼOŽ âéMÉwï¿ÆUQ8øx¬È¬¿àñÆ3…}ð^ëaÑÄà|Ý’¯¼~¢Zw(í -kA,Èž¼ÃR*(^?X5ðÙä,|í0&æ)q¡35QýQ”>1(`ãóŸ©3;çó~•…jffl¯©È{>ë²SÕ†¬[ZÆ€ñí^m5 -îlúôü4
} -¸iÛ¬[ -AEÂiæ·Ü¾^Ápš¡¶²S‹q”)ä—®}ÀÈ™’X¦‘Ñê ½ž¹I|&åYöd§œçI»Á~hÜ%i}ºZùñfǤXÂx,¯ðçÝÀŠÆTÀ;=ÝJi×î^‡É¦Öèz,€h?R9Ìó;@Öÿj—þY) Ƀp9:•I߸ùG« -gwoÔЇ¼V}ŽCsg@ˆÑÕ†šÒm
^©‰iÙ;4 -ú‹®fºÐ61^Ô˜±õƒøåiBž•1•ƒ—ÛÉŽ¸ïõ+üèªicöe 3+âòÖÛ'˜–ÍN¥ê“7ðÉi˜ì§ï´½~2¤bêó²ãò½õþ•`×Êê¯áÞØC?¹ÕÔÌ=u¤ÛˆU¸…Í"â#øŽ\f£N2ú -wŸè’¡µ¸§¶”¬Õ¾Ï®HÁ=ˆÒT“³šÌ6X’>3¡6º1•üVŽ mjƒ3/7¯=Íôþ
&!nIy<<QDð"'É[nt”;D[sZæZÿÄŽ¥¾v™•8`±ÝÆfF—ÚsÔ|¯ï7G 9Î+
?Iæ†]KkÛdìÓ½çÓô+(–¶ÿ5ß(äþCT°‚\ÚŸ§l±npOhÃíÜ@tþ¹3´6PäUi·QñGŸð*íwõÌx¿©1)mvj"§f6¦F0±ÎýèªêµÌY™i õÞK÷òUQNÉg_;;C4‹±o%bTèŠÍ†d^âFG
ÐÛk—W·>`e%aŠ{ƒ#0SÌ=²\:×Ñòz¤ØGàU%˜YMçËá.žÜÃ_bÔõ~¬›ÖwŸXöçÏ×{7¨‡¬MÅ6ê£BÊæz‘×´‡ïÝpä÷¹QØì‡G2n2ªDö.×hE#£“ Z½¼Y‘ñ&ÐëE\(ÃES¥cùlgK„ŽT@â91D±èc™×Àj…¤ÐiÞÚDÅëÁ»ÂЯ0Tµµ£bÅ$㪌íéyÑdö¸Ì„ýn&¢›\ ‹Hè^¶ÙôX\JÆÇH?!Ê -F‘PÖçhé!ÍFµù„複ì‚4ãE¢Q¢ªÈŒêË¿$Æ£}IÅD0I>àÅlPól&ÕFXÞáÅâ‹×Ž^ì÷êÑ!W‹ é·qV`ç¥Óz"!׌_j¯Ñò«E’µeä—QúŸŠGÌå«P•['ïkÈôZðÛ5%K…š†Â¸ª¾àÛ㼿°è/©äGZÖ¸µ²¤Ë›w f§þĺ#7^•Ÿ?<Žàa¶Úñ9" ç*‹æz]à•Öˆ·Ñôv–ý £-ÉTqÿ.åó%‚8Þkeÿ3¿[M£6ò¢@Gò‰ƒXúÞ¥çˆS&2ØŸjF[fzØ.½„ø'eCL`KI -g.£Êù5õ\Ïc¯ªO]ffå,§m¾¼@+¬—q[¹ ,<¸¡ÎIPŸ©if8§”MIe({—Jœ~À$:`š‘-éé;±‘¬y~`²ŸâÑjr+Ö-±˜…>IEƒfçl±¢ZV®ô
ÛûUM½5
ßOÇRòˆœN@Èd£èF_ó³òÌu³Gö–l0êYiQ¶ˆrœÔÑeY$î9Ùq+SÊbÁ9+²ÀYƒŒá—)mdA(Å”µˆm;ÞUÓ
ŠÊˆm-Œ/=ŠÉ?ˆ)CHÙrS¶Ô-“×ìª0Kƒk}öWjõ‰9‡ý@F#iÍKû½D;¦$*µ±¯ˆ:vÍuš - ¢6G4ÚWó÷mq£Mo’¾íü0zt™žà[ΛÙóïÄ3ÕÝZsÆÈP:dVÔ/fyŨV³Œ§²·ÞŽ%ŸðG5¤ÆA«ÀÞ«§hÏ}Kœ¤=ª4¢a3¨˜– xMPn”ªÇ#qp´ų́çxk lƒ<¶ä¥ùÁãÊ¿aLÆòË+&ç0qwl$^dnÜðy(ÙBÓ¶ûo‘#@¹×M±®@S#8±CjQðç}ékŠ»*lí,¡µ=êïΘexí¬„¢h‹®•ëö¥°gЇ™N¬/U
tùM-w*Û¼¿<ý\ɽ~,($ۥDzÁÏ5dèrÐ ®Êº=¸’+•"‹~tó%Ê"â…,iãä, -û -àÑè.šoÏxg6åëÚ†ÇËVDU±N…;ZÆÒ5oùOhú—Ð>IîÌ:h^$¼Ôlz×ÚÁÓT @ÿ}&YƒHõEŒ(=‹qåö6õÙ¨ôW=wš’xsDs‰¼:ŒëöÊ-¶¿{´1öFi”"}±FêÃLf_ÜÅÅ;FO5æøþ|y~U¦Î ‡ëÄCš¢Õ„’+ê´Èø–u{Ó&d¹¿*¯’E牊ô‡Mâ‰t/&%Ï©H6ÛÒ¥Š‡¬GJ×:Ìøö•¿ÒÒ•ß:–”eˆº —ýq«É(LdOÅ"^$·u1§&j¶ÀZ¬ -Ú=;ˆðá:ØÓÏäÁÏ/én¼¡,*¢`\ÜäK}["ÊHTÆÞˆo`ÝÙýz„N¢&j¸'µ2ó‹|K×c6Qén)' üÖœëv?.ßüê´–®PÌ£§åZ]GOŸIªvIbŒµ³ÉЄH\Ô‡óÉ}vÆé¾°å1ù{'¾ógâ݇ûmœ‡½*œ‰VákÑJÃÙ9ÿ¾<§µÈi¥ßgCL‚¶áX±rX¯=Gó‹Ûìö.BÒÓ oû~o‡´~8:_ª˜WzåHTº{‚,×d?u-ôR,ýá²ÍþcQk®‰î•üâŒ'ÄݹQ쪡³¾§Æç‰g\&ÚQ„#J©Yð#Õ²á[ƒËEßE(@˵¸x†üœ³/ö®:g]!$…US ](%v¨ åÑÜ팼`‰jî&^Ûœ?-ó@öùàjÙ÷<³ïlY?XRr$Š™£-ÑTù†~ŠÇ/0‰ÌB¯7Ù×ìYSB{@&A^UEs $DH@ -Ù¦ÏÓ%"Òð9Ó --ý¸Bçhµ0ÊnnL¿ñE~„éMÇv¡“LYd< gñÕ¾ìQ±íÅ EþoÉ|Ľ„\cvê´ -Y
É4j"¼ÒÜçÞ»6ð¯ø»(~7qBËb“½L*&=¤ö4P'©ð·@Xáѧ†÷§€R§ ÙiîÌ#k]3§&M<~èêÆŽ¬y×–=¶÷.Ö}ìh"rr²Ë«À±æ<³$wt•°CnEÕ@¸*ùwN.߆Z r™LŽ:øõŒªOâTãPêŽ".!ÉMù?dð<Ÿ½h·Õð¯=B›B] oº×dûJèoÛ°Æ°TFØQêP¢úC@qSÁÅùÖ÷¥7_±¸Ôˆ²»ÞÌ3å³_Ž¾«š’ñ #¼Ì‚
¸~sOsÔ|ùƱ-J?§>8_@1.æXIg5ßRic¹Rc +/Length 9124 +/Filter /FlateDecode +>> +stream +xÚízeTÛÖ-– +Ìj +àsÛ@C£†Ùþ~ÄA¦0°DÂöŒkX» +r¶Cž! s{¦îâèhY¨ .Îæ (ÐòyeÿY(îàèᶲ†é4Õ´é™þaçååšyü… +²spü£Ò3…4r~^´Å¹*–¦’`Øíé¬a0G>VVGKSÐsŒjÉÁXéŸ* ±w°ÿƒ +øC3 °3Èü¹)Ö¿ëfqpƒxýGرø³%GVMØÉ$+ñ?ÉÏ!À¿bV ›ƒ—r‚ÜÍYÿ(©ááúdÿ#l +±ðörtpZšÚAAÞ`KÐóà5uaÎ. o¯ÿø÷€h6‡Í@VÏÛð/öç0ÈòsES˜3بÏÆÂÆÆdûãÿÏ‘áó†Z8@ì<þ•®dj²ªJ)ª«I3þ½÷f‰‰9<S2³¿ã2s¼ç~vÊ3#/7çßÿ©Å_:üU1ÿÏ:ÙþE)±t +ÝØ)[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‹ +8ÆßÆûOvj(øÏñTÔ¤\¥+Ö#2\…¿n5;ÿH¯i}¤ß®£Ñå~º9$m`Ƶ'4É)ù6b›•½.†eC[•+ÚËG}*”µ>A¼dÏGæjøf¬%€Ê4ìªÉ$›ŠÛwÃPoÄd‰÷ú´ÊÈÓƒ8~Gžõ‘÷<Yqðæ3z©ÞÆ 2[¢ÉIJIH>Èe¦_h‘Q¤Ç‹×g\<©‡3Ѿ¯òJ’ûÁ«‘e‚gìºN¦bŽO+ÞÀ“îS™cHœ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¾¿–_ +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+ž +VËkþy…Šä]WzÃÈ”}ÑDE\Mó½}ºŸ záuÙ Ë +Ec'b£cƒâºb+"±¡ežê±3<}MëMÖM6À–è¿ùùn¬¹˜¶´30ÿ=
ùƨÔc¿¯¸§šŠQ½¤ +cª†O\—aðIoìì}¦êZzPoë +Û¸Áü—%N㞺°Åøjâ6c¹×tÔ¶æ§dÆ#ÒÎIî!QLé=+£oì·Ìl‰Hžñ
EF˜‘gr8™!söw’RZ¥÷ªëEËpÍxé(R”Iã½E£"ŒÖ!$ÿŠ+3þà\aø-ñ^Ønàêdb{QÉ°n«D75¡¤Ý`:4ä¾é-TËu—6"Ä;ü¶·M9—sïôñ«£#ÚO1èÒ{!Ìá8„‚_Ü2ähh.‚LjÚqÍŒè• hê1€RàZlƒ‰N?Lä&ÍÀ÷ÝÛ@Tý¾‘VÒb\0í¡ë0ÿª…É0N‚%»î•+1¶•Ì1ÁÙ7Lûêš_Ô>X–ÙG]td1KâƒÑŠQ¶SF$‰·U¥8:ï¾Ó5Ÿ½OÜÇ'vp¦3gGp|wã›À„J÷Wó¯c¶LLËFÊY7pŠäh·nK.q ¥'Œ/®Â9bŽ‡±Ïw9_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×ò +ÓsñŸ¬5ŠN!úŠNÌJiJ¥…+kkŸÏÆròæ¢ßÛŠ)Äxžcé\Œ>Ð~í.í¯râ<èªëf׌Óy¬VÑ‹ÌYÝn§ FÈKRd"1f…U´†ÇŠŠ”> ¿¬öH‰Bç9Ÿâ‚â%¨„$‘ûò$,gÊóMV0êôÈž·ñQÔ‡‡´ +åƒb3èu¯ÃízSHø”Ç!=ÐSV«ènÞèõÐ`åÍ’ª;qg?Ìj†o+ÌÊ€/F;=!`ž· ÀË!¢Ëþiú)*z‘ñÄïø.ëœØ½ 8Òà4AgÉ—õ:fÞv\JÞ +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ܹïÏ›ËèÓ} +ð(8ôðY&Ò”}„yäÖ5ð±KêÑ&Ek)Oá†x°ñîs=BˆFÆðïDœxѯÁÛìÍ㓶‹]Õ¼ô½ÓlIÃÏ6<<*°OÖehÞÁ»GÝ„1S¯¿–Z +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¤Ó + +j¤¹‹4;X£O<eïc¯¿ðK’s…]䆎sÇï#ó ThäP•©îyÙú¼Ø¤× ‰"i§¿wç}¨Þ‡øÛ¾yI¨A¤ÚáTŸÑ8{Z/|&jêãõ®Ý>]ãPò÷2×EQà{‚°rëáÞ8,~;;ÁWâŒÄ¯Fõ9ŠCá• +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ŒYgtý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-<u¯Âû]ÍÞ¨6ÆÚÚ”u0ÜôæN;q3ŒN³Pq]Øw'çjªóMõÜA0”‰R‡Àâ=ùé.Ùèí'wÜÒÛD†äúŸu®ûÍ£\y6EGíŽC¾ô/èÆbIÝ72Š#ÜrnTözêñ k7Ób’Q|{wy™ÉsŠBd‰êqzðõåñ·D‹,j1^U‰pðá—‚[vžgVD#vR…ôz¤uí3íë œ¬ûvªÈ¤©³q.ÑA øƒ„£Â«|Ìon<oÌaJ‚P4„¶@“
bIðò)R!%|rÏOì6&Ö¡‡Í +s–¬7ôäP"sÌœ9|p]\ÉlfÏ'ªv7K¶iÍÕ$¸Áî}S[ÜVK cب0D×”ê0Ø5ò«¤gitËZhg7ñí¢•dÞÚÇ_ê¶~XD¦pô§Æ%=Ñ*F꟱–⯹ߟþžª+ ýê»\~d+Gϼ%OÙU2ª©³g(÷|˜KÞ8åº~ý=M¿¨U;µ +ëAv4>ÂâÉb[&èëÛXåõ‡ R'䄉¥ü"Üñý"É)¥F{WqÜj³‡h!YNéðˆ~~ò"ÙÐ5Œ©»Xçà ‡‹-Ýxä%ñqÉ>ÿó1¹rP*#7 +¶²çìÞê’ñ¬Õ(àmÆÊÞš± ~µnH¤a0³•JT½6‹’¾eËŒL£õ•ÃSóM <zÉÞ7B“Ü¿‡Ì/ñd=£TªÂ÷!Ö«7#.lG‘e‚ª'6;?3n*Ìö{<^iÿyŸÇ5½ÆL
ž›4Ûã6P_†† +Ëȯúô$šü=Z¤ïs£öjïM È"±óBc!¤d³£©Ëb”ű‰„g²@›€³y‹u +¢ï,Ý™Š£°ƒûüµ±Ò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ç¬``*<L5f¾ž‹•3®h¥ÞÞÃI‡€Ú;¿ ñXú¡}JlZaÒÝO—˜‹s1ä¥gH—Mî\åœàdH +_„á}<É!‹à¨'…K^y‚ë:C†j½Åê%½2šI‚£Dϵé¼H +Å2ÑÈùðîì”í
êzTóM¥ŸýØc¶ªáq_Ø™ endobj -995 0 obj << +1035 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1932 0 R +/Encoding 2007 0 R /FirstChar 2 /LastChar 151 -/Widths 1937 0 R -/BaseFont /UXHWAQ+NimbusSanL-Regu -/FontDescriptor 993 0 R +/Widths 2013 0 R +/BaseFont /QFMSRG+NimbusSanL-Regu +/FontDescriptor 1033 0 R >> endobj -993 0 obj << +1033 0 obj << /Ascent 712 /CapHeight 712 /Descent -213 -/FontName /UXHWAQ+NimbusSanL-Regu +/FontName /QFMSRG+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/emdash) -/FontFile 994 0 R +/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 1034 0 R >> endobj -1937 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 0 1000 ] +2013 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 -969 0 obj << +1009 0 obj << /Length1 1624 /Length2 8351 /Length3 532 @@ -8814,138 +9251,158 @@ xÚíweT›ë¶.R´¸;A‹»Cq-î‡ H!P¼x‘Bq)-îîPZ(VÜÝݵ-íº{ï3ÖÝ¿ÎÙ¿î¸#ß;Ÿ9Ÿ©ï_˜è´t9 ‚l °… qòØ€l1¹5 ðG— -úhÄÃó7LÏt„ü.¿à_bó÷Øõ'rn}%¹Æìÿn·þÑÔzœ¸ž—ðܪCmþyøÍ#+õøp -ñ8ù„E -â6/ÄN;0|ës2©¶òÄXˆÇ`kmH[Ǽà*õp+?ýä†5€Á#/€ˆñÚǘRóŽ¸
¯ *ÿ€9a÷æúÙ—þ¯½=g(Ÿ6)Ù³Þa0‰{<ÁfŽ -pÍ¢”2Ö/õ‰`”TèÄjš 3L¿àƒíá!ŠH» s…?VLãT‘¹Jˆ&‰g: ÉÒѧLy‰À¸Šge0å+÷&|ÂýÀê~sóTšù‡²©ttÔRmñIëëd°9:6+¶@›ÿ䧗%«ŠA~ªÎA ý¨£±bíè0TóYòs¢1…Ðg{Ü™ü_8X—Áx!Öy4´Ê3æmü,qÕ¡Fôž¸Uœ1”=Ê™gÊ™gÆȲüwâEÉw#A¯òøJàú•BþS›•¤ònë®”{w‘?ßW#·TæJZ…å˜>}‡Ñ•ÁJJù‹”ºŠÑäÊj¿¸°[f"u¬x^Ø( HHŠ}Q¡‚ßaŽRz8Œ¶¦µ“;jÇÐ:šÈƒÏó%^%QÓ±¬v˜iŒ¼Æ¤|hÉÊUq”J÷¹ù»Ìã:aẖ²Åà2]½Rô¶°÷\xT;
µ7L4T3FÁ°.ÌkÛ4ä»Ïuä‰qÑÅÓÅŠ ›c´ã¨ˆ“Ÿ¾Ú:‰Á˃NG!òç»EŽfµ4ƒvZi•M–Þc’þÆXÓ"Ã-íêÆáP‡³ÕÌ$’_?Nˆyéå…ÓÕ½mÞ+à„_½‘sãÙ’I%pazÏl›€ÿ¶uçU«
·\Û×Ðbjêìb>U¸)}{QŸNßà—¨ªw%=Ák±äfZ%Åêos[1øÉ]·êñZ¬w¹fsƒ\û¾cx‰¾¾‰ŽµMÌ(}–"Ú\ñ|1wNkõTƒh,.Wèçh7)m|°Íü'gˆ5’S¯ŠJ2ÇM<'sÖ+±UÇR·¬§ëÁµ&I"AkËðÖíƒÜc»Êþª'ºø®¾bÒ^XÛÒV¶ãž‹c&jžüõ«{Aî.5ûÛd -Ž{âA‚ݧL3bü
J?ÙnÁ›C#ŒGÖ:ÂûSÅŸ†¸XJ½·5^9%4•Õó’‚Ò¨î_Zúäu¼AÁÜ݇€,23sËÛZÉzÎgIÞf35TìQ›Ã_
?Ôn¹)-ödÙ¤!á-æÔ‡$J›½Àzö‚õ˜»‹Š)Nü‹:¸¶’{ý[}ð|ͯÍ*Úe™à€\‡v,:j±ªÖÙH’R<[ݧ¹}I¡ÊíÐRò´hst4ý¯3¥{Þë—àe¶A¥ÆÈ)f!ÁîÎÈWn];FuéÅTK&|Õ‹æ¾\c…GîàèE9#½‘lý¤z‡X,¾t8íèëàvO¿šåj›@’ò»²·1Z1–ÈÈWc7Ü^q7÷õÛHm®#Í4š‹9.<qÆ–7]Ï>é"घ»Ž;ʆW=™PNïÞmMj§%·™Gô(àØ/õ]-÷'?E4œ¥ºŸêЗBáNIV}f…×–Ÿý•‰ÓBýó®aˈ -ÝìËI–Ø+¥®kª+…k{p¶MÍÍ$]Lj&”?M(ìzŽh¾ÏöÄÝá6è g*⪈}Æôš.lÄÕÉ^wïkæXÏ7eKxvù»‡ù5QÁ°Ç•Ê.ܥ˯ŒZKòQóÂsÅhã˜\«l>[êßÝ“Ñ"bÇ -idguÊ ÛáÜ‚Ñ9¤ëË‘'jM.~×ÿfêKÃÔŸ’ SêkÉ'ë,Fèø.JìíÜÎXѶ%Ænvâš’¤¼ò\¤ëVù¹r>guΆɩ,hè‡ÓbѤÏ_9¶¯Ë`ÔT•#ÅW}gƒ|³f<×ð8²ÿ5È âõm`cÚ—}çêã[ÿoöþ-ΣÆgLÊôµF&Žzê_Ùºœ['Xæ tqu“G.¢/bŸºâi$g¿Ð ÿ -#ÄÎÝSDº“l
¹ügTù®„B'æ|pÙž2SXÁÖ=‹ç~õÎK–DÛ+Ïk¢·ÀICÇCÜ0SApðäcZ:³ísž÷½Z÷•âKíÀDÙl”osúòÖ'+˜EŒ;úØÏb]RN;-¿Œº(·]({5ׄX’³øö÷ô~™Ÿ=ÇŒpy¾7rB>Ý#ÛÁr{Yƒ©3ßrƒlšê¼õ~±Y¬Ø)Õ`qyûT±ŸIJ\^Òº2¶5ù¶…ŒÂ¨ÆÙ½C+âa¹ÜmyüÊ€=YÙGzm’ÕŸ>ÖÃI)ª~•¢•¾·wZ䥗QyyŒRÂfff8û“‚ -¸ÜÏ„e) ªÔ5‡Ðz}Í=1¶à‡v‰ÓG<˜'}îpÂ/òʨ^ärÁÍ)¤ƒÇ¼V²YYÍsSsôaÛA ŽPWôÔ/U®øGÎ8G”„X×ö¥ïôgd” ŸŸËÀ¿ÚrsŸc¡W8DN0|’t&sõ™9©~ }Y%ÛZˆÝñ4Ã@hÁwKÇÊ0º7ñ¤‡>–"OhIåà"5àÊtþ]ÛŸe»ÝÁ†UyåÞå¼ë\_¹j†œO" o‰¾é~iŒµbâÔwyu«•¾Ö: -ÓEWº?Kûß“IœñáÕtÍ{Be-ë Uu£tië9ÙVåøë_onw®YH°íy‚Þ|˯©KâÉ'zÙuLÔ‚™I…¾?Cfà.mQn%¥Ÿ•I\zQ[°³D]Yí7öT¬$&+ázªŠÜ^„§P•àÇ´ômÖSXS„α¿çd±³Á¡Y>RêÑ™½²†ò…*Ÿ~ûzr”46:bŒ*Ç´H]ÅúÉêXË—P/f Îëîw¸ÑV%.Ð-HÙ¤œùÍØÁ°ù¦µŸÏ™¿Ï³Ú/€V>ÖG—ç™~]I§ÐRúå”ù5ÝÙo<…zÅ•—Ã!rÀÜC)4ÜKÿªdÞÌ5YG¨Ò!ŠUa dV¦Ä`ȆՃ¶å|þFĹšÆ#\XZ•c…–exÍØ⻫‹ -ðŠâÅI´ÁAM8îe¹åÌ4+Ÿ`,NÍ| -‘†“u -jTC©i–Tu#s¥§Ú'¨jzÇ¢’‡‘]ž>û Ó›ãé4ý}AB1ö‰pvs!œÀZý¶Ù0¸øÖ5=YÙ‘Õ®¨=×`«²Š©«åU:¯ -$¨éå,3£¨{Q¾Qê5¨§6µh¸‰Üüß<ü‡ŸP1[½;džFoU—%÷UÒÞ,²Éš5Vo1 -=JƒË¬À<2Í¢îÿ¸£»|µºÂmïÝa²‡kv¼@ˆw÷ÎÖý¢AŸyÆ«ïÌvÒDYœ32² -©òc¦Y+«Æ€§Qùsýò:ŽrM£ÅÈ*iÀ· Kö î0ÐÇkøÄ<æçó|;€^QÞâÝ@öE<YÍ4Ë.8XÉË@¶ÞIǽL» ïk[¯irWÏE/f؇jÈ)RàXý¯œvb~ƒŸCL?;Yt^8+¾ç/*7í2êì)É=fIï#!½öôžcháîÌÃ{ØV°#ré\šùˆ58»ƒ¬«1Éz—xÝ…È®ÊÖ¡@Ñüâ—¿GÈvÄð*†b> -ăڙ~»À?(Ç«Ì_aè3µœÌÀq•Ò·'ZÍMÈòqZ£¹§ËSÅv8à‚¼Ô[=Ä2MV*ÇE¸ì¬Ömpx†“‘ò°Œ¢Ç¸
+4a¯ã§À!¾Â2J ’¯Ôc2Ä»îú£ GЙÓØQö(„ªž0ôéÊ ÕZÅÅ`¹‰ÞÍ>QqÜY·TÓlFrÙ9Ä>‚$s™| -cúÝå99¯ vµI÷ðJÐ?½›ÉÇÎlâ—2ãÁ¯Ú÷ýŒ€%Í4ïÚ]zôMy\U¯_éCùÅ‘Oaðáׯ™Im>jzX <Pû0[:?Ñú"§¤ùñ’¤\H)Ìn®ö£d©üN_ºmíDÕã?³íÙÑÎ*–=ï;ÜRO†vhÁnOxŸŒ={ƒ³{oà¢;ËùNÅZϧ&ˆœ–#)¶[>P’·ž¿Á©Øô©:Ïûô.)¿¨h^iyˆpdÎ<öL#ÑÆ¥{¨Òܺ¾E¨ózÛ'¦îIÐÔñ`Ïõ®±G‘ -F¸lqF÷wã!ïlgVc8Agbf–FLD¿¦x9Š|s ý5þi.ñ½5ò.–so–¾¨ìû4§e5<eÑ”7t>CÚ±CŠH›zrŒøòx³÷ÛÅ»+Vˆ-j¼pÎén
J™m–›Ñs°pÐ@úEƒsFÚ-V^@6êI]§gIëEJ‚J[eƒÏ%K\ñ¸\%kÕבÊ}½Ï±ª·—´Æs‡2ßwýÕk“Òhý€×U%'ˆW(“ûh?œGØâˆÏlíä7+#ÐÖO'›Þÿ²ºéúÅç78' K*ûTâàÃF\Úÿq$qƒqê¦tMŠ+éM4Îâ§7·!…
û9B²cr˜xÔ©*ÑEö¬!ü¯¹Š G_á¹É³Ìkñ¹ïEãA GþHŸ#ÑÙfÓT¼äû<û˜}!gÆÁ¥¬…X
Wϲlq*¿ˆé©°MWfüp]ýÕST”i;Çéyù>.¯GxfœÕÛ[$«LTmç¨m–fîîe¬¢¦§P*†tÑ5[=ÑTQ3<“)uk¥}²ùbâŽ4¯w -E,˜µ´´&¾Þ6º„¢ï¨Í$¹°ÁÜ<ÊÅ|˜oÏLŽ8ßx'%ì-ià_~±úáÚuY߉•ü]<ócÉÞ„Ä:g}äA™l=iÜ’Ù›Añþèuúéצ<ÛO˜àmæ5 ÜT…ò‘êÕkjÕ‹IG ¦X%-úú\¶qŸt§D Љ64>–_ÚÒâ[Nlòí3«KRÁp²–Âb]ÌJ—^»6m4×Ë'rÕÏ"d^D›y!!o<¥fN¸È%PZQ¯÷nœ•7Je( æ%.ÜÆÐFœ—Q Ú›v¢î*ï&Q_Ç1éÇ»OµMí÷S]Ðê—âO -,öŠú"Erq‰3×{1NÛZ2ú
©ôeeE?qx -‡N$ÝE¾ã!Nz(Ý}Xn×ü½aב´˜S€¯q=!ÆUwŽÛ-ÁWá‚}Ø\dæ”Qf¨ÛÁsZY THƒ-´/â«Î-k×ÖôïÒÉRZ¤™2ûx°.[ÿªt8HÕ«XE¥2‡U-äbO¶’g×Vs£I5üŒõ¤JÒ´Ù¼ëâ#LAôfvñͳýn™ÖM6H·Þî,ÙŒšípŸBIN"±Š…:2 íÀlÇV=+èw9fš ÷˜±ÁÕ"ÙÛ½ìøù<´ÓÇ™R]Y4B²,LˆéIL׶—=™ùôÜ3BÍ]²'ÿÔ¨ ’]döŽ -ÝݦDJ)ÙŒáÉ¡fl°«Sa¬c€²cý×Øh}ë
–7‘:©„ÑÅeƒ+"Ï ^Œæ?õl^}âï.<œEÖöþÒë’QzM‚iDÓÂÂLTª¬õºÒk=mùP©ú'·UŒ´/€›0òû -ä–“Tf0kˆ¯¨éÞ6¡"¸FÂéq$îDY7Êôµíª‡æ¢_Ä+ùXDLI¨#%ò8ß[”:¨ËA|’z,¯ -ø¿BówÚ]ŒßxÅ®ªÙÒš› -rÒÛdê9ñb÷Cæ½óG„á·|9]°Qˆí3ˆ¥8ö•'|2
jK¢´”6¾Y¦·ü–ū؆Mì{"¶¶¤~lú…W²ÌÅ£¥ZI¼ýÇCLTb¼Ø¨ñÉ®-üGOdfEæ—ôk'Ì,³q½Š°ÊšBa›=As_|û¢Õå|šEñ ¦Ùá`uͶ‰:ïp0nÚ”Û+•¥`¯|,_ -Q^ ±ëkB˶ÉÝÏW)´XI6°,}¥¬>Ñ -ff|óéæîDÈ[(-’°1MXü’µÌǨæ¹Ð1½æÄCÍ`SN¡‡ÒÅ»ïaÏB±³7,PÄ_ˆ•Žp²Ï‰çó×CG®t¹=6Jøwº‡P×±f×öËÌŸ õò–ÙÍ·¿)—UôÑþN¶Õ2¤C.®;—ÿÔvcƒ‹&çî¼Ð›íø¡¢ ?’!sÛ yvØ·ïœÒÎkYiÌçhbÏ0¾IDê.¶Y_^¤+<@<«Nk¿±eopô³…+¥ºêhC‹0Hó³cŒÆÜHf
Õ»uÎTÉ"[1ò™8ÍQ áMBšHiô*ó]ƽ¨Y©ipá8iÞñó°žÇª<FßèÍNa¼°ã¹Q[£ðbd
Yfwp“—µ©Â·{äBŽT.‡)çN¨5# Ü\8£
¦oåc—j9^ÐbYHËoùIà3Ò"¾œ½OÒU›7œëí
Ú£xÖ°´ =|MÆË•’ëé÷\Êã®›½›ÊLs(iï*{–2w}À ‚Sq¤”œz¬4XBc°ˆ/ùšNߧ}‹ÆO"¼¸ò^µ¯Å•m¹•÷h„‰rd,ŒÛà½ûJtF ˆÛÑW¤\ʯ¡q—9-1;Š’‡Vû·U¢“Äç
- a¤)•Y°žeDÿö‡Ú—«~‰ÕofØB8ûzIÅ‹‹—ç"ç6ZŠõæï?|ÙÊËûêÞVÓjˆóý ª¾$ù…è¾™A_%ãè -½=7c…ÙG¬èÎ35µmªâÊÉmqZ†\B‘[›¸46ÊÎõÉé1‹äp#T‹ÀY̼†Ü¼²µ8c1@Ìõb$ýZÃ>ËA‡ýÿ Z*9/‹[ qM%ÛZîÔ3Ÿ"Å÷OÙýklT¢HFkmºYüéA3—¾OpkÄ·\;±©ô‰ãìµêOX.š²ÃÙZ|©9K>ø -[L-‘×_ÎlrÉÁ~Õ?·åSç& ‰Å¬}+ž¾†¸WfÊ5na¸À®ª|êkS=öê[¢8ˆžºÐ(ú°Oæ*ÔØ…ª\LêÊ°_PÄê:‚܆Ÿ0 -o¶d©W<DÐ?§|)"¶úšzœ8…û>r‘ÓÕ$EŠÚÜÍyÆokjÄÀ”*€Ò¤'ñË']Çåú®8šŸªBžß%[Ž1FôõU~zË7†Ÿ¿Ñ&¤”D·=.Eå°¹úiˆH×
|v`—þ/õ«”WÕw°õ‚I ¾ª@+a®ó(©±ãA5¡=y=£ñxç>USåD»<çÆÍMUÔ›€ÙlE—û†wRŽ{ÞÉíkGo-îçDq±¯R®¾…ù ¤í€‹p¼ìoB:04B»Ëß
*pº¤¯O*=¾oFäÉ°ïCÀIüŠkú$ÛÆò
wLv' -OêX¡gŠÛm9#Êó2Ôq -ÓRLvÏÍŒÆ/Ï7Xy!r8Ë!MÔ4ócKv&½›Ä4á”UO-EyÂTóTâÑÕì}3Þ5ªV¡H·>”œ³"M*œjnøÏ3°ï|Ú÷×’4²{óÝéL¬!àW”¬Pfœ«ÙýFGó¼Õ‰}j™j컓íRÜAñÓ5Ý«rà)vw º'-¢ßGrËpnvÙ1AÛõ ·ºó\<užèÃbð‡ÖhQjÄcñžŠ:DqŽz,|¸>1sNñ&b®]?Mr)smWÅ€ÑûäÌuQØÉ -aàùÚîjäßÜš¨SÞ‚{ÈTvø…ùî)x“›”Vˆc†šçùÁüÿÿO -æˆù_ØŠÐTendstream +úhÄÃó7LÏt„ü.¿à_bó÷Øõ'rnY#%#ö·[ÿhj=Î +hçëÔðUÑRË_•¡\uÃb÷Í^Sû.w›/ضúºHœžu&ƒŽs©üX?åá/1· +³oq›b§¾õ9™T[yb,Äc°µ6¤c^ð•z¸•†~rÃÀà‘@Äxí‚ãL©yG܆W‡@P•¿Àœ°{sýìKÿ×ÞžÎ3”O›”ìYï0˜Ä=ž`3G¸fQJë—úD0J*ôâ?5M¦_ðÁöðE¤]ÐιÂ+¦qªHŽ‹\%D“Ä3ÐdéèS¦¼D`\ų2˜ò•{>á~`u¿¹y*ÍüCYT::j©¶ø$‹õu2Ø›[ ÍòÓË’UÅ ?Uç „¿~ÔÑX±¿vt˜@ªù,ù9QŽ˜Bè³=îLþ/¬Ë`¼ë<Zåó6~–‡¸êP#zOܪΘ ÊåÌ3åLƒ3cdYþ;q¢‚仑 ׉Fy|%pýJ!ÿ‡)‡ÍJR +y·uWʽ»ÈŸï«‘[*s%ÂrLŸ¾ÃèÊ`%¥üÅNJ]Åhreµ_\Ø-3‘Ö:V</lP$$E>Š¨PÁï0G)=F[ÓÚIµchMäÁçù/È’¨ia‡XÖV;Ì4F^cR>´de„ª8J¥ûÜü…]æq°p]KÙbp™®^)z[Ø{.<ª†Z‚&ª#ƒ`XæµmòÝç:òĸèâébEÍ1ÚqTŠGÄÉO_mÄàåA§£ùóÝ"G³ZšA;´Ê¦… Kï1Ic¬i‘á–Öö +uãp¨ÃÙjfɯ'Ä‹¼ôòÂéêÞ6ïpB‰¯Þȹñìɤ¸0½g¶MÀÛºóªÕ†À[®íkh15uv1Ÿ*Ü”¾½Ž¨O§oðKTÕ»’žàµXòN3’bõ·¹-‡üä®[õx-Ö»ÜV³¹A®}ß±¼D_ßDÇÚ¦
f”>Km®x¾˜;§µzªA4—+ôs´›”6>؇fþ“3DŒÉ©WE%™ã&ž‚¹@ë†Øªc©[ÖÓõ`Z“$‘ µåaXëöAîDZ]eÕ]|W_1i/¬mi+ÛqÏÅ15O +þ…záÕ½ w—šým2Ç=ñ ÁîS¦1 þ¥Ÿl·‰àÍ¡Æ#káý)‹âOC\ +¬?¥^‰Û¯œƒÊêyIAiT÷/-}ò:Þ àFîîÃ@™™¹åmd=ç³$o³Ö™*öŒ¨Íƒá¯…†j·\Ž”{²ìVÒðsêC¥Í^`={ÁzÌÝEÅ'þE\[ɽþ>x¾æ×fí²Lp@®Ã ;–Ö@µXUk„l$I)žîÓܾ¤Ðåvh)ù€Z´¹:šþ×™R‰=ïõËp†2Û Rcä³`÷ +gä« +õµä“u#tü%övnç¬hÛc7;qMIR^y.Òu«ü\¹Ÿ³:gÃäT4ôÃi±hÒgŒ¯Û×e0jª…ʑ⫾ˆ³A¾Y3žëVxÙÿäñú60ƒ±?í˃¾sõñÿ7û‹
çQc‰3&eúZ#“G=õƒ¯l]ÎŒ“ ,sPº¸ŠºÉ#Ñ—V±O]ñ4’³_
h€RøP/2³Vî¶ü3oÙáný™0>u˜`²X£¼¨‚Ö:·bÀ;
mH +¥FÌÏ?-UtË´·(o¨u¨È
ÞÉorì¹JØn-%^sj¦ø=DÎïæº: ¦MiG¼@Œ +ÄøÀŽ"”™“/8*î©Þ|Ts8ó•^®¼öÀ;d¯0{í‡r 1¶¢1µi¹<CPb¤Ø"ô‘$BºÂ™vwvJÀî,6-u³T/‚Àßé µû^å]F9»Ï]V,gÀœ¥‡iw¶X Ï‹ø´ðÞª^uËg˱7,ÎJà‡¥ÏVšþjÁIäÏ‹´Èò8¤î<Au¿ô²Kzª#^7Ù{•ÙÅïÈR€‡…³Ö©Mõ¶‰GÙ¬5ØÊÑãúBbI·w|ˆ^àTm‡ ôº8³®Ü¤%>‰Ë¬ÛµDª¥:O,±"A"ã÷ã)%~-ñ…ãziÝÚ´Š™v~ÊÃüZ/hÒœn{ ˆ]`|CèÖð{Lyü…;Nú—PbF.¿àÈÀWŸ™žiÊ€ÑÞËTàtR‰¬"8Q°†ÄШlTIÝ0W½b^OeoN½³ó>Þè‘*Éþt…bçî)"ÝI6‰†\þ3ª|×B¡s>¸lO™)¬`k†žÅs¿zç%K¢í•ç5ÑÛVडã!n˜© 8xò±?-Yö9Ïû^ûJñ¥v`¢l6Ê·9}yë“Ì"ÆN}lˆg1†.‚)§–_F]”Û.”½‚kB,ÉY|û{z?„ÌÏžcF¸<ßH9!Ÿ‡î‘í`¹½Œ¬ÁÔ™o¹A6
MuÞz?Ø,Vlƒ”j°¸¼}ªØÏ$%./ia]Ûš|ÛBÆGaTãìÞŽ¡ñ°\î¶<~eÀž¬ì#½6ÉêOkŽá¤”U¿JÑJßÛ;-òÒË(ȼ<F)a³@33œýIA…\îg²UêšCh½¾æž¿ÛðC;ƒÄé#ÌŠ“>w8a‚yeT/r¹àæÒÁc^+Ù¬¬æ¹©9ú°¿í PG¨«zê…—*Wü#gœ#JB¬kûÒwú32JÐÏÏeà_m¹¹Ï±Ð+"'>I:“¹‰úÌœT?о¬’m-Äîxša ´à»¥ceÝxÒCK‘'´¤rppe:ÿ®íϲÝî`꼃roŽrÞu®¯\5CÎ'‘„·Dßt¿Ž4ÆZ±…Gñ 껼ºUH‡J_k +|»;Hƒ>«]®™_Êæ¬æ +ö¿µ‚Û%ÛJØ¡ñƽˆã‚ÑÜ–;2ÓÝçù(ƒ^|2äÜsŸª(®¾é†çp™fv͹$Ø
ÆŸà—FÜL2qøÆ-粿vkÅÒÑX¥RpΧ±|ª`Æ-õ³Y²©ã[‘–ýæÛíÑn©3kKYìÀ ‹Ã_°0;p7K_Â…v˜w×
t*ˆch +ä¥Ç³˜Å'GNø-žÌôÞz¥öIÛ(úÝ‹*óýŒ^Ï96|®®ù’]V~w}9Y˜ÝèvýHáÐ×:6D-ÕRòýÈ›µ·¾':±^n$
-Q-p†Ä5H_†QÞ&Ð`¢Sðš¬úCŠö÷±¢¥)QuûÙ±T«ÁþSÒgׄ¥ê½ÉF=’wEp(%
ØîÎõËâÑÅHo¸vöTŽD7ç÷¥okækÙÕOõã£T£ï‡œc›® ¾Ý”^«¢qmN„؉1§[×rò4mnU…é¢+ÝŸ¥}ˆïÉ$Îøðjºæ½G¡²–ˆõ„€ªºQº´u‰œl«rüõ¯7·;׬$Øö<Ao¾áÅ׉Ô%ñä½ì:&jÁ̤Bߟ!3p—6‡(·’ÒÏÊ$.½¨-ØŠY¢®Œ¬ö{*V“•p=UEn/ÂS¨JðcÚú6ë)¬)BçØßs2‰ØÙàÐ,)õèÌ^YCùB•O¿}=9JšN1F•cZ¤®‡býäu¬ƒåK¨3g‰u÷;Üh«è¤ì RÎüfì`ØÀ|SƒÚÏçÌßçYíŽ@+
ë£ËóL?®¤Sh)ýrÊüšîì7žB½âÊËaŠ9 `î¡î¥U2ofŽˆš¬#TéŪÀ°2+Sb0dÃêAÛr>#â\MãÇ‚.,ÖʱŠBË2¼flñÝÕExEñâ$Úà &÷²Ürfš•O0§f>ŠHÃÉ: +ãƉbT†§I:Ÿêj2Œë±¸` H[¢|~e=ãØX]Ê:Y +6ô£¡L«Á°’ÐÙ¯WiŠñD½ÕÑ•©x}Àç +ioHÙŒdÍ«· +ù1Ó,Š•UcÀÆÓ¨ü¹~yG¹¦Q‹bd•4à[Ð%{ÐFwèã5üNbóóy¾@¯(oñn Fû"ž¬fše¬äe [ï¤ã^¦]Ð÷µ×4¹«ç¢3ìC5ä)ðF¬þWN;1¿AŽÇÏ!¦Ÿ,:/œßó•›vuö”䳿¤÷‘^{zÏ1´pwæá=l+عt.Í|DœÝAÖƒÕ˜d½Ë¼îBdWeëP h~q‰Ëß#d»aÂVxC1Ÿ@âAíL¿]àŸ”ãˆUæ/‰0ô‡™ZNfà¸JéÛæ&dù8ÑÜÓe©b;pA^ê€b ™€&+ã"\vV붿8<ÃÉHyXFÑc܆š°×ñSà_a¥IáWê1â]wýÑ„Ž#èÌiì({BUOúôePƒjâb°ÜDo‹fŸ¨Œ¸ î¬[ªi6#¹ìbA’¹L>1ýîòŽÎŠœW;„Ú¤{x%èŸÞÍäcg6ñK™ñàWíû~FÀ’fšwíÆ. +=ú¦Œ<®ª×¯ô!ˆüâ‡È§0xÈðë×̤Œ…6ŸG5=¬
P¨}˜-Ÿh}‘SÒüxIR.¤f7a +WûQˆŽ?²TþÆG§¯Ý¶v¢êñŸÙöìhgKƒž÷îG)'C;´`·'¼OÆž‡½ÁÙ½7pÑ€å|§bçSDNË‘Ûˆ-(ÉÛÏßàTlúTç}z—”_T4¯´<D82g{¦‘hãÒ=Tin]ß"Ôy½í“S÷$hj‹x°çÆz×Ø£H€ïtNDº,"˜\`JP˜-Z9¢M +Ä5
^¸çt·¥Ì6ËÍèÀ9X8èV ý¢Á9#í+/ õ¤®Ó³¤õ"%A¥²Áç’%®x\®’µêëHå¾ÞçXÕÛKZã¹Ã +™ï»þêµIi´~À몒Ä+”Éý´‚Î# +lqÄg¶vò„•Šh맓ŒMïYÝô
ýâó›œ%•}*qða#.íÿ8’¸Á8uSº&Å•ô&gñÓ›Û†ý!Ù19L<êT•è"ûNÖþ×\Å„£¯ðÜä‡Y浃øÜ÷¢ˆq‰ „£ +¤Ï‘èl³Ži*^rˆ}ž}̾3ãàÒ@ÖB¬†«gY¶8•_ÄôTXŽ¦«3~¸®þê)*JŽ´ãô¼|—×#<³GÎêí-’Õ&ª¶sÔ6K3w÷2VQÓS( Cºèš‰žhª¨™žÉ”º‰…µÒŒ>Ù|1qGš×;…"ÌZZÚ
_o]BÑwT‹f’\Øà@nåb¾Lƒ·g&Gœo¼“ö–4ð/¿Xýpíº¬ïÄJþ®FHžù±ŒdoBâG³>òÖ L¶ž4nÉìÍ xô:ýtkSŠíÖ'Lð6óš +PnªByŽHõêµ +µêŤ£S¬’€}}.Û¸¿Ï ºS¢èDË/íNiñ-'6ùö™Õ%©`8YKa±.f%Ë
¯]‹6šëå¹êg2/¢Îͼ·ž¿R3§F\ä’N(¨×{7ÎJ¥2ónˆ?ch#Î˨GíM;Q÷•÷
“¨Fˆ¯ã˜ô‡ã]Š§Ú¦öû©.hõKñ'{E}‘"9Œ¸Ä™ˆë½§m-ý€†Tú²²¢Ÿ8<…C'’‰î"ßñ§=”î>,·kþŠÞ°ëHZÌ)À׸žãª;Çí–à+pÁ>l.2sÊÎ(3Ôíà9,P*¤ÁÚñUç–µkkúwéd©
-ÒL™ý<X—ÇÆU:¤êU¬¢R™Ãªr±'[I‡‰³k«„¹ŽÆѤ~ÆzR%iÚl^‹uñ¦ z3»øæÙ~·Lë&¤[o÷N–lFÍv¸O¡$'‚¿XEŽB +Ðv`6Žã«žô;3MÐû +ÌØàj‘ìíÞGvü|ÚéãL©®,!Y&Äô¤¦…kÛËžÌ|zî¡æ.Ù“jTPI‰.2{G…înS"¥lÆðäP36ØÕ©0Ö1@Ù±þkl´¾õË›HTÂèâ²Á‘ç/Fó„z6¯>ñ÷Î"k{éuÉ(½&Á4¢iaa&*UÖz]鵞¶|¨T}“Û*FÚÀMù}rËI*3˜5ÄWÔto›‹P\#áô8
’w¢¬åGúÚvÕÃsÑ/â•|,"¦$Ô‘yœï +ŠèÑüXÔùågF¨f«%
²ÞŸV$>`"õÏ,‹Š"Š
¾"ªmè•&«Uzˆ=õSº
‘™‰žâÉêýŠÍjÇê‘Î8,”–0·õÏÛsïSuïÂ9Ú|L8)³[P7·ë±‰ù=žs†=÷3¥žÈ³8Ö¸(IŽÁ»I_
é½s§µ1EhXÌ+Öµ±’iªà‘Z×ßùåŽx3lú>ÉÃø¥ÚüŸ¦àÆ%m©‡Ä}¢ýVÌ^ø&ž3uÍ >'ÇFx†÷~Ÿ®²åí:ú×ÅlF"j› ã;Ñ`_õdû©m™J$ÖÎù§)ˆEÙzûÊ…MD´dz"–Ý'“9ºáj-ž˜M8¼f¦^ñÕ±ûevÂÄGçMò›ícÜ=iàfg.»lȹüê;É8yÜÁÅ1šTFã›w£rSmèmʼnö‹ùJ…¹ +Œ¢âêôYÜ[aßå¶@GEoaY8½nퟴχû³±¯Ù»³éx[$>_ñŽbt½wí¸û"ÈÊë-AÑø©~Óqšý`à-®æj0{“IŽ4…(¯„Øõ5¡eÛäîç«Z¬¤X–¾RVŸèV…
33¾ytsw"ä-Iؘ&,~ÉZæcTó\è˜^sâ¡f°)§Ðà ébÈÝ÷°g¡ØÙ(âÆ/ÄJG¸NÙçÄsŠùë¡#WºÜ%ü;ÝÇC¨ëX³kûeæOÐzyËìæÆÛ_‚”Ë*úh
'ÛjÒ!×Ëj»±ÁE“s÷
^èÍvüPQɹí„<;ìÛÆwNi絬4æó +§0Þ@ +ØñܨQx1²†,³;¸ÉËÚ +ŠTáÛ=r!Gª —Ôs'Ôš‘Pn.œÑÓ·‚ò±Kµ/h±,¤e‚·ü$ði_ÎÞ'éªÍÎõöíQ<kXZо&ãåJÉõÀô{.åñ×MŒÞMe¦9”´w•=K™»>`Á©8RJN=V,¡1XÄ—Öü +N57üçØw> +íûkIÙǽùît&Öð+JV(3ÎÕì~££yÞêÄ>µL5öÝ@ˆÉv)nŒ øéšîU9ð»;PÝ“Ñï#¹ƒe87»ì˜ íŒzÐ[Ýy.ž:Oôa±aØCk´¨G5b‹±xÏVE¢8G=–>\Ÿ˜9§x1×®Ÿ&¹”¹¶«bÀè}ò +ãL5Å8!á—˜ÐÀÀ7fyVY¨Qº9‚8Fìó3i›‘w˜z¦¼×£ý° MÊ£Nõi0vŸýp%”ZX÷–£ ìL <ó«lj#–:¢‹ÁË9ºÐÊžÖ“gtõÔ©b¸¾¥’`w<®¢£å&W&ªÐ!ð_$Sl£×‰ïm¼Eáκ5cá:ŽÉ¥‡M°„~<hÇ]-È0ð|mw5òonMÔ)oÁ=d*;üÂ|÷¼ÉMJ+Ä1CÍó¿ü`þ‚ÿ'€N +êlsÄü/´ÓÐSendstream endobj -970 0 obj << +1010 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1932 0 R +/Encoding 2007 0 R /FirstChar 35 /LastChar 122 -/Widths 1938 0 R -/BaseFont /RUGCJZ+NimbusMonL-BoldObli -/FontDescriptor 968 0 R +/Widths 2014 0 R +/BaseFont /BXRIGX+NimbusMonL-BoldObli +/FontDescriptor 1008 0 R >> endobj -968 0 obj << +1008 0 obj << /Ascent 624 /CapHeight 552 /Descent -126 -/FontName /RUGCJZ+NimbusMonL-BoldObli +/FontName /BXRIGX+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/y/z) -/FontFile 969 0 R +/FontFile 1009 0 R >> endobj -1938 0 obj +2014 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 0 600 600 ] endobj -961 0 obj << +1001 0 obj << /Length1 1630 /Length2 10420 /Length3 532 -/Length 11283 -/Filter /FlateDecode ->> -stream -xÚíteTœí’-îîNÜ%¸{pw·iÜÝÝÝ݃kp× -äh- -×u”ø¦ñWÉê!r6Y—fü…øÙGRŸ¾yKR‰vUå)0o+Xä - ø`8ï&-Ô§|_wñ˜7¦æ
奿i®™ÀÂÆC6K’kФZqÿ©Üõ-„8ª±Ïë½=Iæ¾xV@f³6Å-ýwËÄÎûñÌq#Eûu$u±ë5Äel&Qül‰x„ù»ƒ#MeȦ’9ázÚð¤Æ¯ëÃÈ E¸½ëâíŸ+óˆ°×CˆØ³Üg¨´ä·[¾Ñ÷pÒ!ìSðŸò“Ø›9"ÐbòMÀ8Õëq]yZsY£4îV¯—…d<¥siáøÞù%Þ«¯ÔˆÝ¤qg'ä·„ãKä´¾ÀGq!»:½mQ!!&ßa?F±1Ž»ÁÞ¥Y†eP.hNø1!/öã÷œ½ð&
‚¸a©7hèÛûŒýóÇÙ‡\š¯+D®ÉÑÐZƒœ0üÓvÄùØEýÉO¼ö~&ÙRm³ŽÊø=q¶qÊ¥¥»5ôÌ”ëb_
¸mÓa…©!RÇ<Ê)¯$KåT¾C’"ú3LºwìóÏ
#uCm…›®££¥b·B_iÊîð¼ ]7‰Œõ•
ðeQ ,®€”]®ì|va!Ø;ýF‰E=ÅÑ8³¬5)Å¢u,
ûÕðì^È ›Âê‡V+ƉC~~UY›¿>%<{ïè—ÒQs…ñpbÈNÖi¿KÚëC/`_IL»/\x7´×´mÂdšØÒeÖίð¸‡^ìë!>ûÙ;æ ê¹MQU,¯ÕêÓÉKQBäg~—šö–S£,QØú¹¸_ìMjŽCçqTlÉJ6È£¾šø (Ü×}Yô*NY&Xìs'«Q·’RïÍnƒa°1³'ù¶¢;\´ý6§eã3Qº7¢RÜ -ã>õû~ -[`Ï—Ì/ù®—o
MyYU‹â¢/ÿ¼Ý›Âœ¢ÝˆÓ[³¶MlÆ -ËšÕ˜±{[½¤-üyª!Ø¥ò6¯Ë,ÝÏ–r‡{ŠÒþŽ•ðRö¢i³4:»ŒNt8¬¼GrØ¿š&¦².ÌP˜ã®—ae‘©Ö’ГÖNTX/ïbmåV¡îé1âûœ9åì¾ú;‘ùÑ[BvÞÄÏdär{,‹&z¨½tEÒ2]A fS0ò}úö4kwçXN!ZÔ¿£I5·›_m—Ákˆìˆ±—|šÓC„8Ìx^]·=´–(LHžI3(ed7iwã—⋪%ú£%wÚS?{drS[nA½G›;õ>Òi´ý'mLG:dŒhfL{¤ÞzÚGÛH,UAw™Ö
PÖê=µàŒ dn¶h˜¥‚Jï
¡ßÜè{ruIîÏžçS?èôQÚØŒjT3§Ïñ¤ŽYΡ¯jã"»t¡EM>í'ÎÄ—·pýèþÉR
?©0 o‹Oï|ς®š!\Õsø” ¶ìOߨùu -/À/„¡œ‹œãWÃ5t/‡…û’ÀÈÍL´ÀhDÔËá磑À÷7 -Ö«LA‘G´D©(aÿ à;ÔAG´Õ JU;_^\‡uç.-©¤î,+»¼Z‘=•¿RæŸÐò…FIجóÔ~ÅÇ›º1“|÷dÈ…¾^¢§ =Ô**sç «n-Ø[”Ú¶Q¶ñ¦D•œ1ÃØu®KÁ¦¿µÜ†y€´Pä†c(âÏnh0(iX²w¬N¸×õ¡ÍI˜û„ùÒ¥Èæbd¶ùq0«s°ö؆¿-ÆN™¦}ümšŒü‡+ÈŽšœ=zàë…qãWÈÅ+¯|jeÅ5ÎtÿwˆŠoµé¼’{„Ùdã
å”=\bHv8†Nt{„¿_å<˜m«3²”K,Í"ëT)(ãú`ÙP¸&«Âo˜«·õ£C·’=øV–ŽŽ‚ä±à Ë1>F,.6¬z&·!^ý‚÷ž·9š/–_Ý‹ROnOs!ºð± -
ÍœçIËýMãèY=±Dˆ* -Xÿ÷Ô&?=b¬;”½î‚™ ¬«zGn£P6í±ÿû±Ù‘,œPýgµƒ6å Åù„
˜:vn‹ -®õgJŒGâÖÜ3ûRÄë,’ Órw¨¾}óã”sᓱx&á=¥Ì\_Îƈ߾lz'¦vC>_ €1Ä8ïÁ'nX«ÄÿÔ_>E듸è3cióú‚"“š¿X.,\Œ:ÚÎä½s¿
‹Šs©h‰74’žÅïM$úÚ”t¹A¬Å‰V%è¼Úï¯àFð¥ìÌšjIp0!{»¢”§îYý2™‡5¥C)›¬ÜgªïvPc,ØÖ1#H¼l€àT3%H°øófØúï{l;¸¼ûüÓ
¿@vt
MrO;¨|¡–Ï즪ègY§ÓùîîÆô[q£¿èÄ"
…W²Èj7ð!¸ÇŸnV¼ð’"ꘕ¤i$| ðæjlF -ÃÚ¶lóE7÷³3™N/,*+¿PC.m.>ÊÖSyüŠô¥–ƒ®v«~@ P2ÝÒfNMTP-OÏ<a-€…>oIBeqì†bHpæÔt‡“ŽÄqj
µ¥u!Œ»MB“†#z«Vk™…ó³;¨b„èC5ãAÆyÝYïØü£D@ìpøÃò¾×{àOÅvcwQŠrøŽ €e·52åeú/ZLé¹ÉË`~>\‚hX"'N¡Ã$wõ¶!•õ[5ièÑsh7â”›Ž›ã¥ä»l—Ý~ú,;>Â|¡bŒ»-挟 B—ík.D¿ÛµËïÅÓ€”ÖWQ”‘]H‰Õ÷gÆPіتïS+ØT
‹§y3ÕúÑ›:u–ù§™Ã×&_¡TT}4ÞÝÛ˜¤¢ÓM2²%Òì½#øE= -;½N -¸»v ½Ê…éÔÔqKoœâ\¶Ý€×Ÿ0 hïóÚR -¨T5=š€áÅ -•½*V^¾º1êrðŒ* -®é/Š)T,¯}«2lÍ,ʽÆÎ[ÙŸMÕ° Ú~(¤ÞQò«Žã¶ÚœuÁ3°QÑ•×46™›œö¬}Ù6tF-„zôôÏ -x0Æà K¾'¯g~y÷ý|Ž°ž¡CCëLFRçÔûCx“U2x’ì¤Ú€òzô8i½‚“ÀÀºP &&åËk剺âi-`JÜ&â,¿Ý¦¯˜Á¦¯z‚+Ý°G…˜Ö¬l†0ÏüÜÖ9oHƒT>vüŠ"nC1Ç=ˆ§XØ„?ýËzñŽ7½Ò!·51ضMcÿekxnºÒº1Èv&ÿ%V¯ŒQ¶Ù¾¡cÑ4~€Úgo¡ =;?§‹c6vÖÂ5NCÞ0è+wµ ý¶NùLCª•û‰r,Ïbj¿ÞÀ×Otm‹yã«÷Q±âm·/SVæK|“D|VïáEV<Q¡)…xú—7'Õ^'å´U6æAÂÉ¡ehSÃQúÙì6p5=‚ÔKÅ´t,ý‰>
¯-¢A–×pE¸6¥]“¼á£Êh3–©pD’&ä£Ä
É
+k«ût‹2üWŽÜª|nÈ<~'>m8MUš™Ö²Z†>?nÆšfcBeµvG5?ÛbêÀ:' ñ”"en<Ma f'2$ûÌ]R_I¬‹ÃXż #—ˆd}lu>ërv×Mq(‘¦aíÅýv&…æäüá —<šµWˆ¼üe®vz{óü·ÄÜÓòŽ¦G§IDÃ"b_ÖÍ%ËŒ‚²¢êx‡Ê^‘$Û„ù…üÆy
uÁéQ_p$@ÖU/Èãˆ(w¡id-êl¡å¾kT -K§4xÈÔP¶—ÛÛ‰Õ[û‹ÕÇo›_¶¤uÃwü`@Àr4ýÃ¥Šùâu.Çc^ʈ~¢{ªŽËûb²OÁw}ñx×—`c™ãø?$?q;a—C¸GKÁCÐJ&Ÿò"t¸§'¥=€gh¥Þ¹êýs§H½Q”þ¯ÙN0ViT®I‚ÀRÜ#Š,šõ@¯»Ï„S; —nÑ´„(ÁPþ±Óí'ó±÷t—¢ç©¤ç‹ûø?0õK*`ÁÎöÄË’&8¡ßçöìd„ÌV }¼·Õ0£¢²Ü}çŽ 3ѬÅ@‘Òµ13LëÃAÏNÓó.WN8™œ `c¥ý -üm££O<+„ºlMË´p~Mý™[ñ©ø·hÊW·N–&9_ 9øÂåÖ ÒgÙ0ª¸Lt»ÈéX+sÿõ„&ûI*ofʸèÊ
/ŒÀÐÀƒÔ[ü"¤}.¸ûæ¥c‘çäß>3D|åOVη}ðî -(ª4rQ¹!Yzˆ‘Yù_‡u¼‡Ó´Q½Þˆ®¸ËÛÌ« -|ø2C¸Yƒ~Y¤¬BþLŽË¬ðLÕûvè÷Í ³˜U@âçÖ¾”5Ù¹~ÜCåýŽœ—®‘ë†<…¡ÚÉ¡È„¿;÷Un¹ù¼‡ ã
à™9 ZTêS½D,f¥‘j@xqÒ–iEÐ+ž²J>`ýáìÃÕ´Eñϼœ#ÄñN%€õÐ7 -l^¹C8I‘èe«3ÅA¤Ã¯ðÿØòk¾Z¬nk¢ªh±¡FÃ]ðÙ›·²îtxrJ¼‰Ù¿bo
-d©‘¯l};¥ZòM«yŽÏ‚ÐÛe´Æ;Î÷kßíªêÂ×¢èCsú?êÂr؇VÚýV.K“.ÅÍ"ûUg§ ™áön~ vµ2Ävgè"àÃ\ôAm»)Zÿh”RøÉR¼.|y÷¹'"ˆ*&–ç>™#xr§cm¦Æö0žœn³‘=ǤslF&~k2E«jlþ¬ Ƈf„ÃLbJ&ÆRXc6¦KnÄÎäÖ¹˜O"êûðΕ¦#{äÚª|^3ŨÊ;è44Âr1f5)·g¼_
ì(1%Õ -rÒŽ½wÂø’>;Slêô‰‘5s¼uÖ²Å#&ëA¬!ø5çÈÔúÉÂbªªF%.ïîÐ{ãRU©ÉàëNyÐÒ6½/ÚÓNEg“É·Û¯êÏò¼hžNº–Ž¡]Șùj©<}crÑ¥d!]ìÜÎò>þ
ÞÄ ÷{€m6"ûªùø@P¡S†¸s}'V%ó.£zùˆí]¡I^(ÛùÌ6…–¯ƒÑ|4âsæþ>êYÈ-Ï:´¢Ù2åÁÅs(×±@¢
=}Åæ—U·n6ÈBC¯>Ç!Âû@u=å<²—1i=íÉú=ƒ-¨òZ—ÅM Â4÷–@tõJæv‘q½ãû´yç¾vr«Ï„¾VnEø„}j*7Si‹{=‹Áï£!æXàý1±J ='»Ê`W¸îÌÒìì;ïD}Âv-wŒ$ØM0½(ðö¨ÍéM$ÀzCç§ 3ß3XôåB£ -°œâ‘1é#V~Ö¤›½hBñ
åùjtw“bsYŸ´5 ¬˜ºÿ“,W²ýÖ»X,+'z7ÂàOe~a.!dÊ«+¼˜å¡ñÊVóÎçõîú…*>3 þ»m'¯¼ŽpFTYDº9HÁ†“lPËÁsà–Žý„Ä&ä’ÍåìƒÔ„¶“MÊBW{a -œây[ƒËu¦YÚr!ƒô$l³Øa£.†þÌGƒaW]èPj©"!w¦k?…Bm$¯œ:#ϯ˜R¡~+Oø0¹`5ÌP(ÅÍé=vÛ
„ú"þÀ‘—Ñî1+…¸Ý¸&ߘ óÚ*-‰Š ”8ÕÐYNÒcŸ˜¾üJìsMQj[F¸‹kzéú¸ä(ŽÀK¹öëÎá½gnä@@m35N-Í˨d²äí«hV]¨Áà^ƒì÷¾Þ uŸ÷ÚÖ¦k‰-¾·UÉ[~¡‰è%?Ôé·SrJvı}Ñ™¾Ä=3¯rêÅÀØ›uYoaQ•L}F¡©›§ü¡à:Ežir¢,sÊÜ[<z˜¦öÚwR–o'«èC=Rp3s*£_Ë•Fª!Ñ ŒLïЋ˜¦)§í>¸©¿ÄG€ÇàðÿÀï>Â6SGÄT¤®I;@|&ÞHJstÊk=Lig¤5è‰,þm!7ÿîág=ò"Œ -<uHîPe£C³PÍ2EíäÁ|ËMó«QX³g9(bçŠvà‹÷µ/’TÂèó¹ÂûàEÔ’÷¼¡¿J£ºV]CG ;f¥/ÁàL÷mˆª©’’ùê#°ð¯¸1¹C‚U=è3TnÌó´sS_vçahîÖ5ImŒ=_²ž‘•9–ãÆ›Öo!|>i÷.T+=a9?wô²ÅùÄ˺éN¡¼‡Q²¡\Ýq.¿³lߣ¯ÚÌMú‘á£óäPêç@lʼnT -¨JUŠÆ•ý¿Ñu3·àp G„‡ùbÃéÏÝDŒ%çwì´¯ïª9áÌ ó5SsÕþ†ˆKë†Üœ¼e}Vô™¡)‹$?·,V§¨$Uã½cNùÕTD ½³#éˆF»œ±´Å(EB‰w%È
{|(¬3-I™¢m8W‘r…XÍe«àÞVLL¥Q.*Gõt¹IÚ¯±™^_Ø“’ÚÖÈûR˜Sö «îÒžÿk./·9Ï•ÅyÊo •ÓwÉ×°ïJwYâ‘ϱî¸6eÉÑœEɈeósS}¯E±X8‚ÕË#¤y㼟KuEüì£!o´öUöä”óÏéŽÃZX©¨,M|eÍóÉÝ)ƒ^»D¥?OÜ]De×a$p*£<Ôu¸-‡•²·HÈÁÉ'.
JØ QíH2³&šÞ–é{IênÊf›êòËŽêõ0]\³Ç¸,Y|egσÜÍ–Ø,’ä¥à¦¥\ÂO°ÌA%hP
ŽmÀÙ3Y'Ä]ÄhÌýð±ÕÞì²›ODPxþõnº”å“]ç7CåÎm gªô÷ËÜÆu“óm‚5 :ª4kíusD󰈪KÀs¢'·»^Rå”XÄ
)>M“£<Áp©E^ˆž+vxE$¶ÆöÕ¸œ eMÁ$ ÷Š¡|¨•ùìü–îøÈp¹[䢧ªT«-ĺ ô{~Êfª~ý
WÑ8æôQT“yi¬W%>ùàw—3+¶ë‡IÕæŒ}'Î
'>š! ^ËÉ´¯ƒT%¼àn=0Z€ÞOi°nŠŒƒÔ'ó'~ -\´)(ät‹hß÷çuÌîÈÕyêáTÅD_.àÞM`¦_}\_i¥ê#k?×ziÓÍà‰Á¼zñ)90¥7€•ØIgx¶}/b -(Ñ-ì@¹ÀËq²<Þl™xüú0·¨gOyP} Å¥\’`ÀxªÃÆ°6‹9)ü<»^íéîä>ƒ@1è¥ôk5 ê¥5a*ìH¹4}YÕ #|ÿ§¦}ý68w…Ëj*6Ã㸟QmŽECÁ¬œ“§ÄƒOoül“³æoC’rR>s”Ù°ký“Xâ²Tþ--i»ê‘7`ù`/N…›'¶1 h<þS°=xÇ4î×ÚT¡ëÛÇÍs=@· 1~_¶ý)î;ÎnoŸ*CHÖÏÄÒú`^¨VY©êKŒ·€’ÃN±ÍÉÿ£†-$Û:5š›B§>™ÌwÍ? -qÒ¸#q¹àÞMn¢¾ƒÂ†ÇUÛòAö5 îQ¤±£-•²x^€’ÙtÉ¥óçw¸_Ü ý‡ýZ;Ô4ò#qó)ùtƒ/UåÐnp©á„Ͷ5ž‚B²W ÎQÝNk›‹v<§sïU'¦J*"Ñx«xóoŽú¡…ÁÇ••×ÕqƧÇãç‘œ^¬³“RöéEhæå)ôd6ºØ¦Nr?â¿®¼Ä½`„ˆÇÐS#£‹c†MéáßÞÀ>RÝNf¹h}ù)æ_Èt€½ -endobj -962 0 obj << +/Length 11285 +/Filter /FlateDecode +>> +stream +xÚíteTœí’-î\›à.ÁÝ qwm ‘ÆÝÝ]‚»®Á]ƒ»'HpÈ%ß7gάsç×Ìùu×íµÞ^ïS»jWÕ³ë-Je5qs{SŒ=Ä……ƒ•] +dàäpðóó£Ð +ÃÂÁÉÊþ·ì,ö +¼|ñ\8rxþ.Ǹ7ÒƒoK×:+ õ¥bè-ÄÞ mçeÚb3,CÏ8ÖŠñ>ŸnÂéò°kîmUQ5,}B ›lç„t~Ë@åV€K}ã€ágö±>¯« +§¶èè˜6ùàö†n`txh°û¾÷; Sn<2 :mt€c.‰¨®F¥w$Ó.LÝE\oR ŽÅ™Ì}jþD`ú|E¾Š†ú%_G®O¶</lij§ê¤RÃ_9ÖxíY„âWQ5^;4ùÞ¤Ö¸?›my˜Äö&ˤ˟‘D¹a}?þVÚY%ø•Óóë9ëÙ²Âe°}7Ú ‘pWª<9à‘€D^Åu’÷èáÍ.Þ,ƒ‹«ºAÄÑÝäa«¡ºh«ot×}GäÑû0öûß´<k…rQ#m˾àL…t9$óÿðo÷G¡z)üøTšÒAy‰\•îj^U×P¹˜Ä ^&©ËYg\˜ +ädJùæ%E-Ö^ždÙšg"yc9í$ÎÕ¤æ}_svŸ5¢áác¸n¨Åyƒ,Žjš(W«A½äöS5¨ý[0Id]·ç;QÒô=‰ÿô-Ê†ï½ mÇv#ñØφp +vk(jœâW«È‹o˜Å2%ãfo÷ý4” ™‹fDjèÂëz=¬
‚çv¯ +µ~.Í"Ã_õ#¿™â9E§£¸Ùô¹ºÓG æGü’s;ñ»…ÔZÄÔ‰›Î±F—ûÒÊgz•Ê¨C!¬FQ¬é,(„Þ¹‘ó{CÄt.¢gw±!‡XýÖVØwׇ,ÐqmŽŸò\vyb˼LR8Tž Õn(”r}o£G£G¿TÈŒè[]|NjÕçïYûºaõ k$ ƒb/pÿ·w÷ΦîkñhW–ˆ]“¢°`5×ûʸàÎ&ÌmIr¡ßô$=ò}´ó…2Δn–œrP"èì}ˆµ‰U*.Þ©Tg`¡Z_Ñç±I
€¡J ëw/E®£º´—*–SžûM†ìÇœ7æv¤?к'0sØ{„Ò³f²†‰‘ò¦ ö¼@C6`[÷¥_øª^t¸û´è°—?ƒm~ ¬ä|igÉè½Å®Ðæ;D"æ!ŒÁ•a¥A%¥maУŠoûL[ZÓ¿\6BüsEyuöê4„¼ïô GZ[Õ%ÎÝ‘13I»åj8q·3c)!õ.îíhàný–1³IBc»is˜ +–ꢼ +ÍY%Nþi«+™%Y«·«ru-ŠÄ”N×U¡˜ªe˜ÏϤêÞo¢ziM‘£Ðq~š?”%‚äýaúv`Žoœ§1AŠ±Bë +8WÐz¹úVµë¿Ëyʧš2߇[;BBfÕt +0CªˆC……¹Qdp±“wwÖ)<³ªX`>Xð¤>öðºE$Õ7gçÕ¸²»Ñì¡œD2ÜsÑE·¦A׉¥G·D讥~¶‰ÀQr“Ëá\ƒd-ßÚÑM +AggŠ…Z +ÒÊ| +Î_µW°]œæn‚ƒ×“Q‚Cá‘Ï_Þ]ƒµýékçy»Ô3£ú‡™“k¸Ò†Ê‘*8}¨Òþ?(O}^\R%‘¥û_ú”ùJÄvwøñ…ôv1~ ¸«šŸDGktRÐ*5 +!dlÆ)ºü4÷1ߌ +[â4Uǘ¤‚$yH\62Ì]”¥¥7˜IÜ
ÕŸÉŠõ=éXaÓ5ß”, +ï½Ç‰D{¬üNNiYZ†ˆ€9²>Ae[ÖS´®X»¦ìM°OeOÑ^vô}!í%Œ µñTW +>òf$ØþÄï5'“öù&òøÒ¤œpTËRƒû·7´ŸXNvg'¢d{&Ý©v(3dcoáw†¶!Á•2MY‹‰Jðײַ»ÃÂtìV¿Í˜ÞÃc½7Õ<†*4¨<”Û¶-ZdpÇêeû©CüOJbº¹½²èÌg½Ep|)— +@®•Äuôöñ§ewÔ$ÈïàÎÙe‚õxFM¸Ç–Ö[Éìõø>æ±Ð÷ùÌhw“ñ™è,;€½u1’¦ÑÎ,ÎŒS²]¦‰>`$HWˆÀùUJ‚Þ¢÷9`,þP,ßž~vЙ¹° –¾µøÔîÙ„ê¡´B•{LÇD)i½Æ[µ‚‹ˆ?~1h*õöÑ€)/lH)&(Óß"öáÖ^ÒTµ%>/½ed
çE….5iŠµã:P1œü†áÆbîÚ\A +±@ ³¶V¿¨vÁΡ"þNÇ›.+~æös»»³¡éÆ羜Rì¾Zø#+8æhP(UF¨ÖÑ· röÒ.`[ +Ž¨Þ•s£º[Ïàó>ù”OeW¸=ßݡʾU¥ñIíe’Ô–Rur‹£Øâ´:êÒïý~‘sg‰g²©ø˜¡TdaQBIÛ
ÏŽÆ=VvÍR±¥²™äáÏ·´px(ƒHTŠõ9|~¾vÙ#©ù¼ÿT˜×$¤ÄÙp¾øüàVrR{s’
ÕN€“o`ê”0KöPêgËÀæ#J\xóá`vNí7„©¡)•ŒìÒ^RPo® ÑüÊÆž63qì®ìþæÞFwƒÔú–6–¬SOÿA2Wt`¨Õ®ãa|¢
Í´sëä{7ÉÓG¬!Å°e“|…Ž˜ëÙŒ¹6¾«»Ñ×_ÔBë瞥çÁ©$Âä!8«ÎÏ–8jjÆ·Öª6ÊÖ@oGºíÝ™ÆQÖ#‡‡»~ºT݈˙O VÔý!˜~dܶ÷¶— +w-ÛèÞ¥Ãcù2ø>‰ºÕçýÁ³²q‰¡Â-ó„ÒbÖÎ>ßÌ—18“íï,Ÿ#.ãÅÌǤÜx?#`ìS|uýš_x+|§Ý<Q8ÍôÐŒhã…6LX²FF|ÞÞŸ2ºuÚ¾¬þìU²NoX„I^ðP†èÝb;Tå'tú3ל±ãÅ‚t€!§±ÖÀ’ ÷½ï<
äaDj?«i쵨Ž)ÏÞ#ÃUs0ò˜û»Ü—”òyP˜ÒXÐsP—ßS¤´³þìà&*ã8Gs:B½ºbµªßTK¼„åŠi'§¢\pïõÒÄ7÷½Ud4ÂÆ÷ãôti½úò°ÒÀ°…âdL4¸çß»Å
½Ìb…[~ 9Á„Eèãg0he>ˆ]ÕÆ3µ·<ðxðqkšÖ½æäè3ÞØ]å0§]vpòzya…ú!÷.¢v6p¾\Ÿ¦oˆRMlÉdm×8ÜæÖ!‹Ä<$ŒÖa>ëÂ'išûesþ.÷æ@¦ü ‚õ„cÙ md*¢Iäýþè"ÏÖw‚²Îø2Õ¬\žz?Hæ¹Ï½Eôñf¡ég#Z´{ÂæÌÇBøËŠóbG9¸¦eãó¸Sþ£‘D:Ñ=Õ‡]„DþFÜõAß=Mø´6lÚ\þVR +J;³6Æ ×s›fþÂè¸ÅcåÅSÁì6¾°4OsüØ]–*UWx[:?QÖ4OBòÐö)z£ÄäÍú…Η¡ £7°Fª½ âD +ðãFÁ{;r ½± þT³Y™Š5ƒq-Aµá°1RL±Í~Ñá«Çºí-²/δÓhÆôU&dÑ®ò\4à»m£‘ün-XqmýG ù¹´xMOz45]‘Ú
к¼¯P"ùЋ¹Êq˜ÂÄž¸Äw$ÕD´0^QVñV{gmR°”‚I?ÆÄž@»û–´÷M/¼J~–Žã–0Z9j¶¹‘!羽ò4š2ôd‡jj™Ü§½ohv|Æã§ëÚ·3N2Í +Y4TÚPëq‘Ó\5s”cI²f"±ý³Œš7ÅŸ8H£©0wÜÚS°L-ó£ÊÍÃH§–.™Ÿj_Ïå”n¯^Fa+‹ +å¤isµ ¢OïÀ¤#Øx´x*Ì+—wÐ!ý$Ú.LæancL·f‡o—O“l”C0×U –<Àô=že‘ókáðSÃÁ=.¹våmËÊÝ[¼P¿ n£C!ʺÆ6SyC~.ŽÍ€Dö&¸r]|;‘0·>¿jÕ_Èóݪ ÷胾KvÙ¢_ëAŽ¾hí²³ Ö€«pÎR#4-hß–½Ü`Éõ‰ м%×Àf5è)›\X“×$OJCü¼Q%~r•ö +×Rô¤ÊPìÑ ;,ŸäÄÖ†$oUDo“ Ì@Cº ºâ†s\øS•bD– +¿´G|½GŠÖÙr<Þ +jÞ¢µ›žÄ˜BXƒýdUh3™û£[BŽ,ÛjWÛ:o×Kã½;—×’™›ÕÎ93eî’J¯.o¸ÂS!Ä°¥]:Y›bévl£Ã»€ƒ\‚Þ£Û»ò…¾y>gdù.2F¢ùæyÜRÝlaŽŒ˜ßòã¢è’:,•0owÀâƘšà˘œ–òÆÈ,P$)¤c| R/“á’±Sˆfa´Žžu +Á[°ö¥Q,Ðâ +¡ +¿+*¯ï±7g3n}¹Fº•¬¦÷ëáú©èYÍ!¯6ØÚðG‰Â¼¥B(éëcÄX虉ŒñGÞ34—«’„kp–ÑϨ¨E¢Ÿ›œNÛÜt’í‹dhÙºð¾Jc8:½ßbë‚P§gª&¶6Î~KÎ,0?£nk¸·‡×Î#wgLÒ^°N•TFZ•w¤ØG…ÍÎå×Ï*iòN»ƒºé¡².ºî‡ÄÙHõƒ«‘§swíC‚ˆZC@lŠêN‰%³OCŒzjÂZÉ“RV™/²œ|
,)Çu‚zWÈùT‚‹Mß>¶o¸Ð0Âœ!ÁÄKqù¬¢±¶É@úMd»x¼Ù¼´¦-?Û˜Þ”Ñ Ûö…ƒZ½)0ô¶·)g×Û¶ø¨Â{ˆï¨[/¶ï +iÉ¿ÝvÇá_]pBŒ>Åû¢øJØŠ8ç <XãZ€—j±ù•~@a"<>*î<B>éž©<3<µ‰ÖFêýXéÍt„³L¥vIãÂQfЮxÞ~]'ß;wˆ¥ÆG +…7šl=š-‰¿£¿»?ûL-3[Ø-0/ôž¹GJaÿMüTgœ,Y¼#šÑ]vçöÇà©ŠA´þÏ·}#6ê¦Ô;oÝ°áF4)s‚Û×'è¼98h;ßÆàɉ$Q0¬-µ^@¿µ¹$X1Âè‹VtÌëHWþaW4oQy®P +‹%¯¸¶±ÖËùHÊ!æ/6?¡É†RǦcÚFLtÂ[šùÍ©Å×ÛÑR{±Pm#D}Z÷Ä + ØO¹!˜d$FÙãF¸kX8í}Júí
5‰DÌ_ŠôhétÓèDSÉ£•‹ÌÎÐEŽÈÈ…ZÐöHÕB÷dŒ%ºšã)m6E-Ïó +ì§ó°þ2O^†þ™û±¯Ì#EWüÛSì7GìB6A¨Ÿ‡8{ÒVägz±ŒŸî¶å<uœ‰]Öå)
üzR¬EGý>pð\f— +›Íº3]žØYÑ`Ť¿ÔHÆ`²%Vñ+LÜ4)\`ÃWRάݟ¾¿œ0/ü™“uˆ<Ò¦°êÿ +gQ…’v}ÂöS)®¨RFAÖºûV„@ +Ë{{œ]!!¢òsV—öj¦Dø(S
˜-¸‰ ò•F/ID\EÅ°È™òí-fWlŠ +u9b5‘Âý /f|ê†òyKê‰ØTÅVËeÍiŽ'Ê>íãq;ÊBü¬39µ‡Ot6¦´ì‘´K¯ëiÎׯ¿aÂê¹~÷²¯Ñ…g^V¢íÛ>´íòÆ(§ß~¬XF=d›oœÂÈ~6¹E©éÉgo8…ü”¾·‡~|ûÆ+£`z‰JµþÞÆe8€x]pWV¡áyÙu½ƒ:ß +FU,¥oÕ +<Êr'Ùm¾Á±·t$dp% +úRâêL®´¼Ä§]w¯d9ëtV㦗¯ì= î¹Ýrzæ´†1¡Ë"ÓÏ@Õgº‡Zô¹5¶îÅ'Ô£m¼/åè£!²«W¾Ü
UrIälö-V›dhÉ÷1²O½™r6(óc9ì½losÇ„QM
¾m3Yý)b-uéØqvÉ,˜ì +ÂÅA²œ¹¹‘‡÷žLOÅ:¢¾vQÐך{Ê»rJ9}gôG¡lÔÔÆ>²f¹}nT/íb2_Ç—®IÉÏ#3«±â¹Ðî«Ûà\C‹9%åäú$1¨·¥XØLnJô<¥t6>dšèÈév2Ÿ_qD;/˜¯ppä@ïdÊßoHñQòÐQ-Ä[ôe¡6…«ÅÔâbÏ£Õg~xÛhm´ÛÎ& ŸÞG¾]å„-fýbÛöÍ@©mÄ•"óÈó<3ƒuUïËrü@CŠ‰nËHwÕÞ0 ªËîìÿ”àÁ㦛…òi\¼SòšŽ€¶ÞAžp Ø<'ÌÀ3°$S çF÷bÔÉ𗶢d–BxÁR:PLr}Ks¸O`ò¿Ø)ð +Ö†(–Ãk ³m€|ï…3™+^~#”Õ
;~ÓàgYnÅSŽKÚÿÝîÄÆüÆåý˜JÃÇ=G®uGB~Ú~I>‹±Ô•ð>ê">H‡.Ã_·ß»8H'ùƒ½ô³GJ<ŒqÔsLó(ŸwgÕ”,n¨î9ja’öÔ…ÄÓçoG±Ó.?¯-5Qw“·œi>7ë|äƾ)ö.Ú7aЇ—ÜNc|²z'ªƒ28ÉñÈ/ÜÄ‹E"¾»*
?}Oâ3uë!ÛÀ|i?ºRaaÀï~›§U˜èNz°³ÅHn÷õgè Éä0&¥sciøªçÔ„ª‚^^iSþŸ¬ Îj[/ó!Û•ª—ˆí…;3i2qz”ðSð¸‹M,Våt—•D‘Döö á̓]}œ +!C¢…ØÙe䄃þ +^Öus•“7É7÷˜"}L˜
Q”9AøX$„…jd5eneÙÅÖ‡cè£'0Ü)qÂDçÃ=ùzüykxn +'²š[3z‡3¤?íTÂaéü€¾Ýbš4‚²ªíëNN3GrÕŒš%T+hè5³V'Ĺ5NãÅB´#ù²ïûéçìZG¾Ç
ÉáÂæ¥ãVÓ?ý±D¦ò¤Aü3ežboÙ(CHÎàðÃIöá Ú0ŽŽ'Jì‚ðHÓ'mfGAéÆ +j8¬=1¥ªâ;ÞŠÛëVcMLùL]i”_7ãRñHh:d€"üV´sü,G‹£Æч•û™y];ªýê¨}in¥¢x}¦mvnÿÕ)è1‘§©µê(7¯D·I$Ê>OÅ_ËþåÏMñ㡇JÅi‹*ŽXa{?5ìj¶ Ù;hÜ–ã1Ýz˜TgXÕ¦¥\¼EîøBü#ßàë4~–’ñ›¡M…^1êÇ”¼§öklLÝßQW‹¸†Èyr¯Ù‡%aÍñN vm“Ø_«ÓèÂW7½gº€q@BÜž]ËcìwÜ®nÆàŒŸ d5A9!š%Å*§¬Ñ^‚ŠöÛ…ÖÇûÞX6ÐìÓô„ª´ÖùPŽÝÒß6ü +iLÚ®5 +š÷uJI—)Úg¿ñJ¡®ÝšE]#êc̦
Jó€éú–©K¬åûÍ`ú Ÿu
#ùG¦MVK îÌWÙF5˜y¾e¥ —/0z!µ‹äfTþ¼+éSÇ1ßÉy‡Kãç7oѽ缉ÙÒ6}žox|T§2¨E…Àâ¢Eu•Æ˜Â·
,ŒÏ†G¦çÄ TPë¸7úx„©µ?¦9B#dî‰ÔàÓðEéRϖꜚ âÿ6æ½äTéwèS +Oìòv˜d_B³-aFªö‘ÍÝÅô®<>¡ß·ÑÑ{o°É¡0^ÖxÙ²m£Vl¡Ïù,§Å³¬ûqÀèê—÷9J†ýUÖ§Cd侻Ŏå°9.h¯'ZéÚ/V*þëkñ™
£½Õ4!׆£©IGÃ*³;>Š¦]åß9¬Ë˜ë°¡+›ËÊßÅÅËFR'@`m8Üïý–œB.ç"ž$ØÆÝóû”ÙÍðJá4jœ’ý ®èÙJf[ØÏ'¥[¢B.,EæåÅ:c”XÏ +µ†æ¹±úô]B¿%£pú““Ò÷c_ mmõ².Œ7«+笠r3 ²ä晴±ÿ/(ÿŸàÿ 3[‰“‹½‰“
ÊÿŸ–lendstream +endobj +1002 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1932 0 R +/Encoding 2007 0 R /FirstChar 34 /LastChar 122 -/Widths 1939 0 R -/BaseFont /HXIEUZ+NimbusMonL-ReguObli -/FontDescriptor 960 0 R +/Widths 2015 0 R +/BaseFont /LNTDLS+NimbusMonL-ReguObli +/FontDescriptor 1000 0 R >> endobj -960 0 obj << +1000 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 -/FontName /HXIEUZ+NimbusMonL-ReguObli +/FontName /LNTDLS+NimbusMonL-ReguObli /ItalicAngle -12 /StemV 43 /XHeight 426 /FontBBox [-61 -237 774 811] /Flags 4 /CharSet (/quotedbl/numbersign/parenleft/parenright/plus/hyphen/period/colon/B/C/D/F/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 961 0 R +/FontFile 1001 0 R >> endobj -1939 0 obj +2015 0 obj [600 600 0 0 0 0 600 600 0 600 0 600 600 0 0 0 0 0 0 0 0 0 0 0 600 0 0 0 0 0 0 0 600 600 600 0 600 0 0 0 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 -884 0 obj << +924 0 obj << /Length1 1606 /Length2 16437 /Length3 532 @@ -8956,7 +9413,7 @@ stream xÚ¬¶ct§_Ó%Ûv~1:¶mÛ¶í¤ÃŽmÛ¶Ó±mÛìØzûß3ó̺ßù4ó|¸ÖºNU]»j×9ë)(Ó šØ™ŠÙÛ¹Ð2Ò1pä,m\eíídh…ìmL 7µ3u2´(¸ÙXd,MíœM© -öÎ.ÎÆN–.€¿YDÄþÍÓÅÂÐåŸÜÎ–Ý +öÎ.ÎÆN–.€¿YDÄþÍÓÅÂÐåŸÜÎ–Ý UwQñtøKìÔ!koò¿ÿ` Ù{ ¤×+…O¿Pò¾^”ÙÓbcP;Ú›TTÒ+ù€ÀŸîdv‚º~¦ò'q+ðG#}r@ð5NmˆEïBjB©+<¿ O<}~¢ê¹ï;Äý‘MÆíOé˯¥ZéN½tœ1>iƒ!pÁ`Þ3,Éñ€Á¶ÆƽU9ìþóæÝ©<¾2숽â0‘륵“W`_â\¯?Î`Bç~@“ùo¢»êÎO4ñÄkW©s}¼uf¤S^¼48³åºáhI·ðèì¾¼h`˜“§hžÝÒ=h$!‰‰Æ_@¿¯Ãå>³’ÔÎT)mÐdù>æ‘nkÜH‘<»ûÒ9«Rè`ËPY³Ðë|\–ÎBbˆÌÏ‘ÓçñÊ}¶n»ƒÔÉqè<¿JºÄU݇ž~‰vE? +¨S7r+øv¿-Ž(Õò @@ -9025,35 +9482,153 @@ kSè%ŒG’~z.KWa§2ó…Kº¯Ÿ–½4I
Œ?}Ï}Úïx7_m¥‚vèÖ(@J6”)õ(FKˆÖBEZŸÒTûA-„_ ”}âJu¬ÍzݨºÙê–ë-VæS;'#rÛL¨y¼o·Ã¯óó;ö©tù^F'É2óyîh"+ȲJ5JÔÛga1Þ?µØ³ —hÖäJ„1‹þvE9ûÖ–‚X ¢6y`8E„gÕÂÞn"Ý—{QwÕZšpœîQ»MÐ×±û÷¡F"”ªMa[üMr†NÂ=ˆÌœ°ÿ‡IÓð‰ß '…)LÕÆ·_õ<Îün W¹±’‹;<V®®Vê«4«×Âõþ-•ÙÇåqjVŶƶ£)û©‡›'Gò¹Üþ·|B6¥ÛL!/:Í£ˆs-Ì)Ø|:ßx#mmRg‹sÂüU~qëà¨k -ű ïô¡ÿÁvú±3ÇãøïVÐTöíÈ¡Ìf À-7ÖÊË¢Ô¹òí1ú黳ÄH+ÎÊh½TÙ8MÈbQí‡PáÄ´Á%§kùÍÏÏ‹_…âË+Î@dí×>rÍÕ4¯Þ1HÍÅw]¿lh–ò(ÑÂBšùªŒîÖÊ?SÔúFi
O¿±¡æŒ#HnjMa±1§„‡ýù[Õ³0Ýàd.åÓûäè•O%êLþ¿•»íÒkž‘¼r¦„òª7¯fõîËbÞáÙ´Ùÿ €¿Ñ†Ò¥z¼ÛT¦|–Ùb°ÊîOôÔ3§féUÝ9Žþž0ÁË&C‚emŒ@õ—Ù¼)bG~´…~´; ä5¿ åìâuUë9·•°ìuØíivñ~P¾ëÖÄïϱ˜Ì,2™2ÿwQÈöSŽ_ß(,)øÿÁ¬ã¾G>s865ÏdšŸT¹B`©`݃À…g×Jq³kMâez몾-³éÓ“õžlÂçè-Þ¤Qý¸ÒSÉl¯—î¹E.¹awÃ6ü+]ãÅýdi¯CÛ7þ÷o_Zê6×kƒÀ¿Ú3×…O<ڕľ>.ÇT~IÜÏ$_ûo—>FNy¼êSÒE
“?«¦Em| 5Í™Sš¯ýñœ•›{æ￯z|fá› Ù1'2•
™'o¼iºýĆÿ!é¥ïnI¶N{_µ²èñ›òy¹¥Ißß³Ÿœæ±/+JqçtEþ+Œa¶ŽßߧÕÜ0ÖPùéw%bþâ~=ý‰ëV´0·…³>ç•ߥ˜žµ²vÛ›ÙǦ<¸eq-ëEj+˹)S¯2œÿJ%¼YjÒJÜc¢yÇ÷¾¸²™Ç}…ZköµÛ5>›÷-\þ-t~fÙÕ˜É6ÿ“µÓO/¿{±©ïšÿ£É?L•W–ÌpØ+ö®Í’ßLÄÄþbF¬-WÝëã¡â«§•\ÐÛ:£ë¹tϦ̣’,«ŽGßLŠyz½3»|Ê›'=íSìÖOH=k·Æ4íÒÚÛ-Âïþï°’K}x]›Y¨ÍªÂçÁ댈Àƒ?-*Z²åNÊú'/yw¬úd:a~rszòu¿*×ãÌW.Ÿºc´íó‚Gj¡7ÖX¼07 p0,HÎIM,*ÉÏM,Êæ +ű ïô¡ÿÁvú±3ÇãøïVÐTöíÈ¡Ìf À-7ÖÊË¢Ô¹òí1ú黳ÄH+ÎÊh½TÙ8MÈbQí‡PáÄ´Á%§kùÍÏÏ‹_…âË+Î@dí×>rÍÕ4¯Þ1HÍÅw]¿lh–ò(ÑÂBšùªŒîÖÊ?SÔúFi
O¿±¡æŒ#HnjMa±1§„‡ýù[Õ³0Ýàd.åÓûäè•O%êLþ¿•»íÒkž‘¼r¦„òª7¯fõîËbÞáÙ´Ùÿ €¿Ñ†Ò¥z¼ÛT¦|–Ùb°ÊîOôÔ3§féUÝ9Žþž0ÁË&C‚emŒ@õ—Ù¼)bG~´…~´; ä5¿ åìâuUë9·•°ìuØíivñ~P¾ëÖÄïϱ˜Ì,2™2ÿwQÈöSŽ_ß(,)øÿÁ¬ã¾G>s865ÏdšŸT¹B`©`݃À…g×Jq³kMâez몾-³éÓ“õžlÂçè-Þ¤Qý¸ÒSÉl¯—î¹E.¹awÃ6ü+]ãÅýdi¯CÛ7þ÷o_Zê6×kƒÀ¿Ú3×…O<ڕľ>.ÇT~IÜÏ$_ûo—>FNy¼êSÒE
“?«¦Em| 5Í™Sš¯ýñœ•›{æ￯z|fá› Ù1'2•
™'o¼iºýĆÿ!é¥ïnI¶N{_µ²èñ›òy¹¥Ißß³Ÿœæ±/+JqçtEþ+Œa¶ŽßߧÕÜ0ÖPùéw%bþâ~=ý‰ëV´0·…³>ç•ߥ˜žµ²vÛ›ÙǦ<¸eq-ëEj+˹)S¯2œÿJ%¼YjÒJÜc¢yÇ÷¾¸²™Ç}…ZköµÛ5>›÷-\þ-t~fÙÕ˜É6ÿ“µÓO/¿{±©ïšÿ£É?L•W–ÌpØ+ö®Í’ßLÄÄþbF¬-WÝëã¡â«§•\ÐÛ:£ë¹tϦ̣’,«ŽGßLŠyz½3»|Ê›'=íSìÖOH=k·Æ4íÒÚÛ-Âïþï°’K}x]›Y¨ÍªÂçÁ댈Àƒ?-*Z²åNÊú'/yw¬úd:a~rszòu¿*×ãÌW.Ÿºc´íó‚Gj¡7ÖX¼07 p0,HÎIM,*ÉÏM,Êæ endobj -885 0 obj << +925 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1932 0 R +/Encoding 2007 0 R /FirstChar 34 /LastChar 125 -/Widths 1940 0 R -/BaseFont /ISSFGP+NimbusMonL-Bold -/FontDescriptor 883 0 R +/Widths 2016 0 R +/BaseFont /RERPYV+NimbusMonL-Bold +/FontDescriptor 923 0 R >> endobj -883 0 obj << +923 0 obj << /Ascent 624 /CapHeight 552 /Descent -126 -/FontName /ISSFGP+NimbusMonL-Bold +/FontName /RERPYV+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/five/six/seven/eight/semicolon/equal/at/A/B/D/E/F/G/H/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 884 0 R +/FontFile 924 0 R >> endobj -1940 0 obj +2016 0 obj [600 600 0 0 0 0 0 0 0 600 0 600 600 600 600 600 600 600 0 600 600 600 600 0 0 600 0 600 0 0 600 600 600 0 600 600 600 600 600 0 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 -878 0 obj << +909 0 obj << +/Length1 1612 +/Length2 18760 +/Length3 532 +/Length 19672 +/Filter /FlateDecode +>> +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 +ŠšRò +üªm{|ÓÂv¸*Þk‚駹?ÛÜ—Ní>ö¥©F{1(zR€—ùøÞ$T}¨›ä4z%ˆé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Ÿ +쿵$
œÉ„®'~ +j8+¼="HOló‰à|V”LôIŽÅ_y·1A‘T5dSoEy%|Dm3N†Á‡P¥{ú¼ÞÆÙˆ +šÔ0ã#¢DËFwˆ(¤ ÙÓ§~¾f%ž©Y·˜"<Ø™Él¶‹Ç¹ÿúä2Ý©²HˆîKöÿ¢Õê’2|Cu˜Äï4‡Ùb +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†tY.ž±á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ë«J0VkÜ„},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þ`*?섨0V2 +p‡÷/ó¢nD(0ÂD +[Õ%:P+t¦*5Gil@ÐvmY‘ ‚œÁ‰~¦S JÖjn5£ë—ðys¬Ø0ÒÉð¹¼tOC»¯‰æ÷™ÄiÐDX¯Ð +Ù¿®;ªôŠ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—;î +??zÜ…¤Ÿ'PìE¶e6¹-Vƒú£ò>áÂPe†–½Í•Gèf5©{AuÔ¦JÑø^V¡ÌP +:Ù‰4GÌCe*Z:?ß"íÖŠS$`ë¾*~=QîFf†£¾d5 ?Užaú9v¢÷"“T!KÈ
õð;[ùÛ +ðþ¿$vCÎÛš,Ù‡¦_¡ÌÐpvœY4Ô}ay=,”¸Ý +׌’üïa,ZÆ¢O>c!Ö’&,î—AØ$l‹ˆ4`¿Ì™é„G‘9h{±IKàôáî·3ÂF£Ýйô±Peûw +
8ø=ÇC¦ñÙ"ê®ÒL¨ì:0%»¸vÕ´HƒŒ?˜ø¾âù¢õ3™VF_?Òí)Û÷³qoTŒ²>ô£‚ùvî[±~á+Ó
ñ¢øøhÂ…ª>çV©Ã{‰iÜÁɾ,ÓPhF°1J4‘÷Ò.’×l"ü<KÑ*ÊûY•eûÊ]XODÏ^,@+Ý4‘‚èbiœüÙÄÛù§ô¥‘mJ÷e g§÷H9×-7,z3’ '‘nKÜ‹)«ZÞu¯,Ú.«9¡²ûÚ3Ö¥$¯Ü šc +9P“½¥Þ8€Fl‘…RÜ⎩r«'¶&ÍÖr+v¤Ì•³7_¾‡ßm/!ÚûÑ9òÌÀæAVÔ•I°ÃL"ö„O]á²Â!³™¦WD§w<·¿
`Ÿœõ[A°)!䛽'2Rj:PCøÄfűbü]–¬L¡ÅpÝ·mñª}pÜf†Ë ÑSYá‚ë^0Ñx‘Ê·€ýÍEÛÝöEô7N‚)ÕmÑŒªæÀ á7Š•U÷ↇK›—ß²9¯É,‡…ŒŸX¨<™¡ÌÅ…cÆ"ûgÚùÏ=j³é b«*"ìëLZaì{oFðÂ{¹†âMAÆ ßQƒ(°Á0ÖkøcÇǦŽtDþ<`N%ìy0ÉB´¨þ•PPˆ?Ĭ‰…šåxùVày»—.Jª“ÈÌë/vg`ž0zðõà~¬ |ôiÄlTªœXöA¥j–çW¸ӷôµœñø€l/^ôŠ^ÿ‘XÕH6«3d"Èî:¤úá_T`‚¨KÆ÷Xž³¬¦€À›†ÚÐt¨bØ×82ºÙ‹°Y +g–w¸Ò_ÍÑf4…,lÕF¯tçÜ äÊåšv…è0‚Z„•åIÝX®E˜w²b!ZhÙ”áÉTëkS¸¼SÉômз}P¼½ËiGýÖ´b
Â/ÚãzNÓŸylQ]*+ ºÞ"†V!™s¾Ð›Íáüô¸Hм‘ôCÕ93Š+-q¤Õ01=*ã±ù¬uŸrÀeÂËÇ +{ÃbFg#‚˜–lyù>.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:Ò³ûÑ
+¢ð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<MÆOOìu h9ž&ZO{èìxö6"÷rWNÕ6Ù$Çøâ0™…´žUîÇ>‚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Úu5hJ»½
Ù‡,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@… +…eȤ½øÛ ]Ûq};—¼¿ý%W[J¨÷¡¼–Þè aÁþ[Ò-@^ŸFðGH¿ ìÏÈÜ°<·eÕ@wô¨‰Îy«(‘«xd;{”«‰U¸otÁªDÕL +˜ªˆÍ|Îóp—aÜ^§9Lî÷‹¥¨`=1OþL +^ú”ã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àѲœ&Â&9h°¼§!`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Š +í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,—ðóõè¦ +ÈïQš4Zl’€AÍMNÒ1B.NèL·YÏ¥£ÌÊ©“0d›±)š„¢«ëOØF'Í<I('Ó.DÁ=Œ”³‡pEdùØøõmQÜÛÓ +~z#ë6 å˜Mmné©^«ŠÒŽ†y§×ù{?¤¾ó
ÃN[„!H-Èâ–‘Ôyúê³Ból«nsªYòU4Mö¤
©0lÕÜ´~µÇê½æ` +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<Tº;ˆˆ³õì&> 5YC¶]Þœ}ËA… IñFÝi„—¤>4Å1 <ÏÜïQ»ÔäJ!¼@ïµ/g”Æ +¹?¯²YÉLµOÿº“oc€ùÃ^vu?ÂYáQbâÔò%hñ£›Þ|ù:µ˜Âôʼn "¶®œ%v ¾õ +U¨!š»N}œ Ñ“;æJ›ªÙCĵ?ûœôý+¼<¹è¾ŒÐp—³[»õþAN +ç´hô@ª{âN'H_È9S(rÚ·kEü&ßÏ•tÛª.Ü,çx>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ü¼ +¨ïÃÌ'l¿:¦ðè;{3¦Íäeµ—Ä;»¯McÕÒÚ-ÿXON´Â½²ùr0‘õC€ƒºÆ…L9ꉱSWËñÛÖþN2¼‹ÆvÃñ’ýÐ È*ö{ä•k^‡jogÊ"oØÊglÂóIüPÚ}tq(½Ÿ +QCm6õ +Ê’¸È˜”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æû +‡ +ïÔ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ÿ=<e¢w†|hó$¿åÜ£ëØÁSä<þxØI'è÷¤ïëÚ_tšd¯„§wòÒs_×àdI#ØÙÒ¿˜ +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›"&Œ›Å?c +áò¼\¶¿ûë¦n +Ý)¥ÀÓ,Ú €ž–ñ;Þ©x%ŽÇ*:GïÌ‘bàÞšÈÚ±ÓÀ'“('
ø·&ᦗ„Bfs^0©^T +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úê›»ÉÕ”^«¦ +endobj +910 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 2007 0 R +/FirstChar 33 +/LastChar 125 +/Widths 2017 0 R +/BaseFont /VVDTAK+NimbusMonL-Regu +/FontDescriptor 908 0 R +>> endobj +908 0 obj << +/Ascent 625 +/CapHeight 557 +/Descent -147 +/FontName /VVDTAK+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 909 0 R +>> endobj +2017 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 +872 0 obj << /Length1 1620 /Length2 20127 /Length3 532 @@ -9061,76 +9636,66 @@ endobj /Filter /FlateDecode >> stream -xÚ¬ºct¤]·.Ûv*I§cul'ÛFÅNÅFǶm۶͎í¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ú%ìí@,ŒÌ< -…ü5Òß1‡PP[B¼ªùÕy{Ju¡glŸÏßüC(»ƒ¢ÈrÓÛFÁ÷jð§fÌÁpC`¶ -f†é”/–é„ÐaÆ)¹–ìÉT_ÄAÇDÆ@G’_²V
ú¿IÂ>^"òœ’£\žpÖk×Ñí HNZl¸Š”»Ào{ö«OŠ—©™}½ŽÈïqM gÀÁõ@‰Î -vÌó™\Ÿäsi‹ø'o0=ÆK‘ wnÕÉÙë)ÕiÞ8©dÆî¦uË͈âL8{8yŸì'!HÄ`9õ'žz6±VÁ‹ÃDp.µh4ÇÛÛ8ôÌÊv]ÊB‡ºŒŒžš¿ØKÕËËÃÙÏ£€_ë%ç=ùäÚâô%N¥¡[é¡Zß—”Ž8¸³OÊÖÚvAÔÊ -ųÎ:]Ní®¯jï‚?Ú1Ü¡}ú߬Eþ·ß™ã…°ä]x‰©9 -¾@£dJî'¾T¨× -z õÊøjØNE'·M¼¼²_ÉHËq zÎ9W±O´à¼¢\Y`Gà^ùa“ñóQýÕùÒ^mš¿RDÓyYÕãľ¤w§fküV¥_d•ôúÁï¡qUåM»n<%ò„é±D}^õ…ï9ÜÚ™/˜zšâ.Øè×)ú/…0×Ο·×rþ¦›§›Ü:;Òé:of\ÛsG§ys÷ÌäxQåç!X[EsèAm®¿NB(^WÄÌoÑÎÉ…qeQoP½'“ÀäŠÛ±vÅTäŠËÔ›Ê`Þ£>G}òxeVÈ#E²Á¯¶b@:4ÖëOØ,Û“œÖ˜ w÷Ý@)Æ óeîG£J
(På[ývÞ²zž¹<ú JŠÔÂYCµŸÐÝ^R°¼keMÒ]@KòB ™ŽtFò°…&eð -îïø`—÷¹K³†>E9‰ú¢%óeKšb¥6$O÷Àw¯sjºN«–'šuYv™ÁuC0=õOS‘GQ‰þ¯Âì{êMüqûÊ¿ûw^³4)pD^W¾i
22øQæBæeëðÄø8Ü+Î(ä€#x2dßë~r%³õç:9ÿ8¯%è5.Ý‹IáÊ9ƒnò)6Ý(€É7ÇÅåÑÚ:T÷ ¼$ÓjæÏI,n›Ýƒ0C5r¦Ð{Ûôù4uJS·1Q¾àIÞ[°šùq™B·ã§ThBŒ¢$¹*3„ -j)ÔˆÀ9”‰©P͸\‘<«Cz„ w$;48™un¤£Üó -yÍ: -Þäâ¨Mœj‚ñí*Ã;øí3ÈñÈmľÎV¤>û¢{Ž'ûh„³vÁ›¤ÊŒ=N(ßÔ™Þ‡RÆÇâ-ë-U¸Õ¡AÉ^³Ø1!>•…k;oI™&Z£Åó²A`þH¤Žš“´¹žÞù=&¬;îõ4vŸ ]Â÷žå·£Ë Z±ÔNnbáÓ1¦[^ÏÂëMᬯij
ç_ÓTô²È§šl`îSñö—›.²XˆGe(p¤.¿¡CžFêJ)ËÂÀ€z®Œæ×Ô9øè¹'ÆÂ-ÉÆÞGܶ•[|ÛþTÿÞl©5· BZ«àà"—䬩¹9£ÈµÿT*qq„ÏÏ4dG<éZS{Ëèœz2T$g€E‡úÅ3P&¶ãäQ,À‹é$‡(YÐF¥›Ýúg¾ÙþËœ;HGŸ€UÏ0/ˆF®A¶¢ºhÝÂüÏɬSŠ›?…ð.zì$ƒþ¾‰OøBw
F9.é»°{IÛÖ]µYÎÙÛö>….¹©i>Öª®¤Á¹º·t’ÞѱûªÜI
r<Xh[_lÒíÅU1î¤â(ÛŸŒÙÂp—)^ðC7¾è£½k¡ú»¥FÑ…ÝL”ŽˆÃSù8Ø'ȸŽô‹òôÝ´àvÛ\ûƒªH(dÎWs<eúJR˜)[ÈùÒ;.ŒÛ=õM"%Z -H;\æ¦oyd÷5/‚ZY¦ØßY‚x/ ÜI(ê_SVò÷O”ßmÛQ(±Ò´È{u½î}"ƒª7àú(˜"äa-/ÅGSkA˜M™É~¥S/D+âˆä5‘<šèaŒÒeÍž€RŠÕªµ«™£Ö½KxfÕ%S_olË+ÇééG~Žá^׎ÉñHž‹cCñ ûKÅ r„i/©ÁX¨Eå[-6áËM*µÖ‡ßQ‘ÒY3œœüÎ$c;¸™îÎôœóð!¢¸†„À×Ü—Ç+šž\[²7¸¹7ÚÆȈ€Cà[VZÉŽ6|íd›®y>vWL«Ýa%´§AX™ée‹ÇXço^´¡€KE-éÍBòŸ’Þ®ü1Ò^Þ€8ä„áU„4‡Ü46 -`YzY,lsÿtψSòé’üZQ”²8!Êó@¨`öžnBîàñÃ`N€¥Nw§©Ç!ô$ÕæõÎ%¢ˆ(ÙâÐκÒC$‚é‹Q -=öRþ÷y:×S¨‡ÎG~.Ílñõ¤1Õß«Øg½ ?o!==çxQWP8?®~|˜Üÿ¸¾x¿¾tW õ/ŸU®kdY¸Åã–„ ¯iHxºâñ¸l±˜“¾ž?b™qé®yx@cÏ·è£P(&—.!ÕGÑ‚¢™þ=Wc7Ü1WÏ28'ƒ;2[.ˆxý‘×µèÀw,ÔEh@¡3§>WYˆ}ðùaæNy´59ƒ‚Oà -Û#ñ=X6µÈøÌý/ùj¨5§äÕ‰X¦NëxþU¢lµÅ•¬A2fNyë BåK@z«1ÅÓÅ¿fÍÈnÿÙÒ©ê¹4mmÒmyŸ;þ-áu -¶ŠyŒØœX6$ XbLÖ¯Æë6SÅGó´»k%¾PjãdÉ\c_¼œMMâ›7IJÑ1è‡ÛÒŒÆîC¡oÖ)ëÆ -‰}
âx†Ü²t¼Væ–67Î5¥ðž)‹ôÇ“‚õ\æb—qå‘!̸øglnëNò4ü ˆ -/ôÄ@þåí‰e2bƆwU†ŽUöq`æïâðÅFŽÓ⊂™¼ná{™š¢5¿áPƒ -\ÅT»à^7–4N’’Ÿ»$$Tƒ-L3éΚ¹¼Ìè-h’T8 @½Okè#ÁMÁ[¯/³xO:"¨4áxüåäL—<kcèyÇÛb¢q¯ÐRÐŒñyn–yÍÕ4ë1qÑŽ{¦í¾1'.ämŽNèÇ!Êâhkjìšû?nP:±³4¸§†ÅÜ9´mºAº‰=¥“º,fÂêhIôNÖ»ïü'hä<Vk -Á³‰Ek-˜B©äöVZq*ÜO³«ișꓛê¬ïžŽð°Á©ôÄÄ;Òª_俽Qì˜ÎcNµ{pÝïbÔNÏ£….Öï³J–Þ†+–½º5©jµÊâ?ÁGtiÉBs¸¯vëÔm)«[™ïE»yŒãn6Ägî¹ÖªÐR“?Áµ7ßûx ãcå«B55Ö°0§¾ê cu Çð'} - -ä+N‰Ø5ÞNj4xÐ]›€¨áàݵmï+Zf;ˆ?Çåe³ÝöPà·oŸÒÃüµ—¢I¹ë¼“F<{½*-5 …)ôcÚ -#oÓÂíçç‚ - -8À#D=ÐÚ–'¼ËÆ€7aî^MXÛsänjã„h1B–¤ÖÑØÞt\§´äŠúã=/t2K(¦H÷±X
į̀W2ál“åÇ W÷íÀyŠ|¸`¡ïì¹Æî§È…çÁ™kÙYÔë:½ |â±ôÈìÓDáw
E)³*j³sý«‹ÛV]öŠSl|œf&EÔô5L‘VÑ
V ºZ™ÜŠ2Mù…%VÐ`ß¿1¹¦²¿‡T@@jLªPèȘ֨s*ô½§Ëâå®è -I³ÙêéœÆ–T©-˜Q§5߇[„þÚ@ÂÇŒçoT§÷sa‘‚‚Ÿ£;?®IÖB,$Êq®G¶qÞâ¯PIJ •£Æ»¨(¡àœ•SÕ`RHáRp”·Í/i¼™É6vÁ³ªÈ»ÚôÎvñoU;]äW¸éysQ†$Zk›oÀëãõO„ö¤Î£ýÁË2Uø˜>¼sUàtO?úp '@úÂÜdÛ¹KuŸCí½ìe½oÄÜóÏrž‹ëéEÓ3ŒžÈèÎ#$ûYjŒ²äØyÇúÚIÂOÁu)–8 Çúƒ}Ú
|þ84G'.«2c2´GÂdL¡ÌàŽ6(1¥²ò&µÂgùð‘ôrœP$A€+ÒádˆÐíçÁ¼_äÓôèä8\áä'wÇT`S^JkÊ_HÿΡÇÐïK”.±®:¤vìÓîÓcˆä"AŽ¥Øm¤.l¬È¤÷4³å)¸ -4=_A€ï CÎyëºnlT÷SIÆlBŽãÇD‰gÿ¸e‡Ýl‚È¢s›y|œRJ¥sáŸÆ%÷›oßú§gªDT+êg&Ÿ‡ -û -ÀáRLæÃ2–6çW0*¯bö"QÛ8Òœ3,´~~ý¨yܵ±®ƒ!èk÷}“IU?û -^ºö.ÕÊ;â˜<\éæjB† :æ‹ãk‡o™ùžËýta˜A=«(ÓÔ'ŸÔÐH•ÄN!z^“kðw¢ëKËŽÌ´«öߪ&ZÎØS³_ž!¡ÑÐ9†˜mx,by5À,Ù{Ô´9s†s_=ªŒBÑ3ú§ÉÅé7˜MgðRSÙ
aÅL4äÆÍœdä’¶î¡ÁZ’Ô§q½ ¸‚’6ˆõA3†Švbwq]o§æö§%¡×+DðXÚ2ˆPvêð7?³Í®=Dø"EL‰ÁÀ}§Û#WYççÕ"úCø(øºÕèa ,Ù`}Ta¼R›L΋ÜW’ï“9Ž˜oÖ”c/9ŠÈÀ°º·‹*£ÈpOˆjêû‹ª`=à^SVnæ¶ô@&2†4.Ê0h-5zPÖz.Îxúƒ)Ë+™ÆÁ·ÙÃ!îˆF°²VóöqÓA#õ:ãF½À=Ca祥…1‰d1xýº¿ìø2ï«9Œ)Cí$§øV„" Æ1‰F¢rnêOèó$9žíÞŠòZ
«>’qXøŒúÑú‡¶úIÛ¦Q!yˆ|¨(wàÌh"¾n£K²ñúB© -/5ˆÝï9éŠ1)ëM÷çY¤Ò\Þ5ö£yLU!?䡳ìšýõÀªi›Ž}Ìn‹‘f^;àQbù¸RÿBr Ï¿I-9:5Å·À2>ÁÐ3d±†Fˆc,<oäæ£Ocî1ü±St~»|Yù51DP!£í¶“°P
¾¢®tþkºô¡ßk˜8Á¦ÌØ$õc°ã9•Qæ3EåŠü±¹ÙÞ–q«¿tÔîÙÛCCY^"fLzJ -ÛnÊ÷Ù'Î{ü®ÒÿŒŒ®AiL–Xg…¸N -£2„‡Œ°±hdw,}ýåÒps9KuN4ÒÝœ°T×£bK؆F–i$Ÿ‹‹'p‘}¾Ÿt¥™´ðÞɨ"3±Ut¢¡úx²Ø&x4D K¬ZógÜVú‘xC¶‹]äÂØý9¦yóï³t¶Úxæ‘…HÞ#ü¡ æh -ø>_@[›cQƒY«]®Á²´%! -ÚÕìΨwtŠÓ?oAZdævò6I‡¼)’þ‰èRUÇÜ(Á@Ú”µ²âi·¦Ð£ñ ÛåºÛšÖ/ì¢ó&Å%é±ACF÷Àa¾šƒ;öùZjûâ×QBÙŒãωÎYIN«ä{Ïy|—hT®t²RML‡WK&q¨aMPjÍ–_ê›Í2ÖÝmYL¡£Ý§ÎŒrîgs7¨NãÚ‹+Aׇ²‚·`¨ëÞÊN óoé…%¦~aÝ–o¥~F¼».û#3{9D«Áä9;â´æÍôQ¤m£ÆgsHœ;“¯0C[µÐñû8Z¹Ô€î>¿œáƒ¨ÃY„Üá€ø¨e{MA\\ˆbi©O»‚›îöŽÁAø¡Ö3 -'ˆqqµi½á¢C°z³(†Jœ=ã€àˆœý]ÔÞ8§š¶±×†3`žbµ^0Ï »©uDA"e‰57"jÍLLÇXÝ'N-ëZnˆhK$%JrrÛ‹y¬ewyä¬ÏÖlv-‡åƒÑ‚ûvô¿L‡|ä‹N*<‹c)u4¢×é²=hIë&a‰ ét•ÎÉV¢z*ºìÃfÞaJž¿+uÍçWâèÚK}¤¦ -cþ1α¼ZÞÃbi÷cžç„Š¢c;Ï\ºFý‚I¤Ø-óÒF ¡Ù¡·ŒhÌ$‹™òjLjڹÕTãŸLàIHJ+øæö‡dPßÜlvÈåAÞñ GΓ[ãŽ`Ñ#&ûîR…j—ܬ'VuUÎÔ‡íëÌÒ†·r€"˜Ž†(¾WwPßSè¤u‚3ØRUê·€¥~²ýbæ³u«jJäþnÏ×íºÁëi¯™ê'‡¹IÀ&JIÔô0>e¾dÞ>#Ç<®å³Ü±éúÞv‘¹‚ΪçñæWêÕ‰½˜¥‹ÞÛd³ªÐçÄsFÞLÖ÷ÍÝ">nfhx¬ºqŠ~K~áåÔZçW -D9ÐÄ×ý«ÌNcü -4Æg÷ÎüôL¬¾¾Ò?Âlœá¶_±Ã؈õ†ëî$àÝ-:ÇDpBÝu£Cbî›#13º;Ï -*‡Kò·¶‡;¾-’"+ܦ˳-ý<ÎÈôXüöYëÁ’áJÁ‚¡$üé¥Ò.&>Ùe¸R¸¡3ŸÁÿ]u7üaÂõñ.R8‹zAµÓã~nTLûçpYTÓìª[7ÒøUÒð=|¹üº*ÚÂ_AŒ/–*CØ¿?CÞúh67÷
Wáïx,V[ýªŽ?RÆò^oH–èÈ;Ǩ=käàkáÕÊu3®ÉẇNbnN’²‹Y)êctž-yá¬JHÇd`‹“mó®úí}KÕ4¬½9«–øWù…YÚá•M3
|•Ð§DN¿"æµdYDé@ÖáÄúÑ¥õÇ*1öEÒ.úMµü–r± ÒüØ -Á4õ5’+Äó}†#‘.礋R‹ë -õS׸oïÖ‚•fx{ì—?]Ž{øjA}øé{v$õFBÇÃh¾/oF"U¹»ý´P‡SkwUŽçî0€8â…lù9|2öêlá˜,RºÆ,;?…Y¦y$…ä¯ ‰+aÍB•¨ì5šEÇ婳Ž÷õ¾Ióþ†n$ŸJ±šÿHbN±ãHÿ^Ù’Ÿ¨aêºV§hÞšW>#žµºra·‰áWvdyóEúC
‰ÙãÃ/c7>+΄É6¸ôªû,,V>'$úÒµeP¹…'›ð3f3 -J̺6I>ìß
$‘–HåÇ(ÃÈ;LØAB¿ªƒKéíqrm”ü¼Ëµ˜+ู؂۾Ó&§døäNÃ0I¿r!7%tj[®†ð¼¸‡¿¬e°¢zñ÷pöZù¹Üvi3l*.p.&€Ñ·Kóâd¹¨É -ÃŽ¿NõÆç*匶ölIUQ8(±J 8a•˜· 5«X~+Õøëam:Êœ·jP¤^Jœ§î‘¸ÃsÀÿ‰û‡FmA@ [r«@æ [¼¼'O24ö‰¨-ç¯Ô‰Qy"ð빟z¿–2¯\ÅC]õõtQŸ;G@ -ƒmÕR¯
Ö$õìÔÛ6Áò´K·8}bS5Û €UÞXÈs^ƒ=$Bÿ©†Þ‚€`õ©£X&ýµ§=²w3ØÔ]ö§ã^êÌNóÊ»Aøðc0ÎäÚ5¯uÈòtœ)
¼Ã؆Fê|ZEò‹Vjê¹Cç‚¡þË€y·rûÌÂqëBªUèü õÉK%©BIhs”¨ƒr¾‰Ÿc\už…L}dþlùÅ#œsþµÝ -Ûä¾xP1S'¢Ä”ÀÏ/m*5blð•šZh—E5Ú°ZÊ‚?7/ ö®Ê¼¢¾Ø‡ç]Ï|Ö;ŠÔBùúéíôý'rUS”ÂŒ,ù³Ç?»FöÌ’±ÛõÚ$Ämk¥kˆ"ƒVa+±<•šºa¶>Sû%äù‡¸’øVî™ÏáEü4¬:ÀðÊT?ëðÎhx®‘ÕÓéUDÂãÚ%†è( -Djà&$ >g÷5«d( -xáO¶S.eƒ›»NÄÑűn5wÔÖ‹IêÞ(ˆÂ8ãÞ×Àn†hºkͬ½P#éQ'ÕíîaT¿£þ$RyÉà–&S(v±8m`iʽ]rþù¦³<zlVlÉ—œÂ`5”ËR¼Ï>íJùQ5x9–Bgaàž}x’2ÍDÑÔ1 IÐÏ4—ÆÇûèr¶ -´¡é
LŠ.Ô»4,›æË…Ü)]Ã*Vi}¾I&È éà1ƒs¸g´YÄ1Rë}}ã$¬Ë¶Ò|>”OÙ‰@½)Ûá`LÓïËñyŒoãwk5±ÈVð…SŠËm‘í¬Í‡Ÿê)"q%Uæ#}VíÈ·ŽGØlxR×{häYÏøç%»Œk#’–ñ -°û€‚ß_7ÖˆýõƯ¤øÖe÷®eßêT\qÓýÖ®Épswþ -Ü$(Wgœî‘·xeµ§²Þ¢Q«:p¶ÐšaBš³·ØÄ ô¥7'‡ÎòÌ[H›†{±_‡*ºŸñ´í!NTúû[ìD_lïñ (bÂ/Ý}¤)mR¼™~pÁþØL®†PèK¶ M5”ð?Æ®*äQF2±g™#ªûغà>~‚;H°‹¨-ƒô9ü·—5ûÎG 9„õKƒ[Óc÷~@H"…°Î–E(Mõˆ@å4/”š0ù{oNcáKC¹¶un˜íÌ——*ÕˆÏh1+(¸Ôýd04—DËÓ`IRïÐðý„ã‚çNÝÝ45öH3‚-]º5û`EJd>¯3Ãæ BgÍR™n"éK`~[›J:4qð7v®`=RŽ}EñŽ:è¼süôŒÍ˜4¹nÏñÈôQr,É¢ï°ÍkÄêãÉÌ^Iö-ûØLƒÙ£1#iÕ³q{ÁðÅÔ#…·¦˜&#¹–æÆÌ0žpk+«£ -†é68û½3¿âØ
€ÙAehD¡–~ØioÔQbØFÈöyÍpR<‰˜ÈfÏâŒ&a›æ(z -YìT”ÄÐ_ïCŽÆ} _zA-nuò®Z˜ÄögúvXPô‹•5tºÁúOÌ]šÛæÞÄUhN'u6V‹3án[ }¶ŽMïm9¤‚Ü.QÒ(Æ‚Ølšõ3EȽ¹²FÕ7CÇ¡¥ŸµÂü‹›¸¡• Ò†Ô·X>ÅrV¤«´þœùÈ87‹Ðæ^’Ü#ž³Ä…*[Ã00Άºª\-zÂ0³•CÄx:M«»ÄãVNcÇICÃOgUÛ¼¬*¶@ÚU·ae’+b˜ÀèÌ¥¯é¶QñóP/Anžóu–ÇúeÙM"èzpJ™Ïò®"U‰
ñ+“ãé?§ÙÂf%%íl¿çkíæ¿„òLO^‰ªãÃFÒò’Âiú,ÞTõg1ª -l•"\\â„o8½²b¯‰{åIPwví ËQæH¶$ÜÉ´¦ÕL`e·©Ñ²ÂJ»ýT‚Ε^jr˜²:ª×»‹¾n -¼ë0åà®ÏØÿîZŸÜªc~;Qwµê4è©HšñqÇÔø°7ò=³ž‰’ç™òÆú˜“duˆ?.Õ+rÞ9kÃf6q§œaÞÎ^bÁ;ÐÞ“ªC=?JÅЕd›dg‡|ÜÔúˆËz@øeaªCšs5ú QoFÐéDú÷8È«âX²DÛíŽO@Ñ%
U÷Méd>kZ|èdü%Î0 ,cYÎ]o5ÊÓÓˆP|øTëZBŒåæxM~`Ôä×P -Ïoé†-«ûç²`¹
Y¶ñα‹èÞÛ°ëÙC¼aßèß7åv¸×^ -뜻%CÁÌ‚¬UÖ´‰Maü€¤Ï¹uñçó„áÜê :œð؃C»(|cºÉ&§ëéòɼ¯È8'Ùx被Šóp<]BÌý «›[¤„ -¡à£"Ð<‘gÏ[îD~^ººÓÂÙ?Zn\Æ$ÿMŒù–1Äœ)Á×Bň£EGâcQóh¨X*úêÊÊ_>(”ëw+ÇœðaÚ¨F~¶zñyþþ{‡>gS(êá9‡&IdÑX2)Fžb¡8ÚËp¤«PX,Gæ(xõš2œsPº% fajU‰ªh.,w¤Ñ« -cLÇý2 Ža® -LysN<q›Žé;u %ý¡xCߥi67k]ýÔ•ðÓ*‰I -Ñ\‚°îÙª
[ˆ|¾[4Ã_ÆvNy|ü(—æl²½Fï·ïÊ»i¤ºõ–l -]ë4PH§rüIbÕä-àIæ<Œf)$Ü=¼ð~WÝ>Rú?]œã|DuVò=Â+÷œõç°üdË,󴵋¨t}ïæBÖ 9Q’Ž¹¡¥PÖ•g$±»ÖùW7‡È0‰dÐs`Å/]N˜Cñh¿5÷‹$YlÄžìžvÌ6èëZü¾Žñ:á3~|±‰Q¤ãïÛ_6tºs´“WÛïµÈßFgùè`æ}
|5*¦ -…3© ¤0.aõÃ’ AÜÿJ&ªƒ0C|R*ü(ô¯[\eZ¢¬ ÏÑZ
àú½á´sÅ%¶_,sEjâ’ñƒ]]¹QÙÄäã¤Óoxé{×ùÒT¬¬>ÔDu±:eƒ„Ž¬‹C5áj¬QjCìé÷¤›ìÐ̆£Y•Ãé²{G·$7wA”_sïâPs±¢Sš˜=ÍêïxEJI7z˜³LYò>‚Ý'ò.ä?4û™36L®PæØi¸Êfá]YIÍuÅSÛÁý²n’YWºjRdúAùú†ÄMw¼NÆÒ`´Š&'"—cxŒ?¦¾©Žd[ºhxB{ü¼ãXæ}•£689®ªíV3*àV,´NÃIæ®ÎúÄ’Ÿ]ñ]Ì&ßkÏ—Ê!ØEø>µBGD“ÊÚ DÄ`ŽÀzë†ÿD9ÜD•^ãP¹¹¡ÒC`pÞ¸q¶SÏ/@j»_»;Æ),H¿¥ÌNeÊ„cwLˆ^ŒM\Ú‘/Q„Ýr½Î«D¦F¡CzmbÍ$cÁïW %—õÛà”\Ù’æ’.îrËäU+ôŠÖ½U©+A´5ŸJ¤Ï)ªãÿä;z_{®ðø– ©ŒJ !uêˆÉ3e|Yüê*¹ˆcËûõ);ß.†úðò#ãDhö€ö‹G¸èFyç;u=2_–\?c«î¤~‘ -ƒÅÊ~Ïz_úà)ë¨R÷Ãfæ4Vf™k+{Çc–®ŸSxéüýpŸÀ–éò¢Žú‘›B6Uß\•AM{ƒo—áŧÜùþ1÷¹ž ƒG‹KÕeºd´fÙà&ö÷-
¹÷ŸÞ
ŸLHÁ¹‰àTLq>ã3ïçÙuÐ3õ.°ó»ÏDkr%[’û V!
=?(F‹V>Då†TÜ'LÞ»tðþDì0åœjiJWù¦¯:•º?˜ákÅtð·Dt,e¹Cëàì8´~¶^Wìh÷ðá²›ó&pÀs–K‘v£yª¤}ÜYhÇû/q˜š\—1άÄ.5HLUcß|{¨8óŠò^ß4à`äô·ÅPß½Q5ãŽèz”=ûý¯`ôô«î½A$äÆô¥=ÿ7<‰†ÐZLLSXëNŠ}Db6¶Ð,èÿv;=›#˜‡Ãc“(í„FrEƒÎUA7Á¾ºñ°¤‘ïÁ¼ Ÿ³ËÔ
0 -·•—Vh/†¸MƒD:•ÄÇNñú°•:#Þþ>PLÇÒwðQ5GbÌñ
Ò禪ð@` Ìf(iVþÉOëµ6‘ -’Yý”:®”èAèÂûXqQ¾®ãÜþŸœß,è'ì-¦E“qàO¹)• ìG³VÍ4ºf,§œR¢X=ÒÄ"Æ
œVpÕŽà"ç¸Éü4¥^Ëdw3{ñ¾T ¨Œþ)þ1²ðùfäI>EÄ÷ó…>W¹;A©jæG’òÛB¿¶ä®.L)y{kÂ^×ö
,”K@[âŸdOÜŲÝ_tNÖm,b -É´C™Ñ.ïðÖJ®{Ò¦sŽyZÍÊ;±êÈÂìÄk´3ѤFÈZ‰FÝmp ÷:%•Ùd -Ü)„lk2'¨á"”Öë±âµ|syùͱÕu€\çÊZ'YýMªI‘_£ƒ~Æ)bfÓíÝt=–ÙáÅbSÅ#Uk.`« -S‚DÍ(»(ë%ªUÎ)7%g:F—°ÞÆ {¡ßk·1SÊ»„]« -G7üæôÆn}Ò{«óef‚‰@ƃÚZt'ˆD©Ñuèb
ÕËáÿkŸ,Ûš +xÚ¬ºct¤]·.Ûv*I§cul'[£b§bÛ¶mÛ¶Ží¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ø%ìlA,ŒÌ< +šþô¯œtGLz¥ÈéQž7K²;P?8˜Õö¦””õJ>`ˆg:Yánžiü(\ +ü°¾<Ù£ø§6Äbw¡5aÔž_|M<}~¢î½…î?$¤Ë‰…§äuBþéçC(øCB¼ªùÕi{Ju¡glŸÏÏìC(»ƒ¢ÈbÓËZÁçjð§fÌÁpC@¶ +¦éÂú”/é„ÐaF)¹ìÉT_Äü AÇDF@’_²–
z¿IÂ>^"ò“£œŸ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 +b¤H#øÕVh@û€€Æjý)ûƒe{’Ó +3 á"Å8a¶ÌýhC©Š‚¡|«ßÎ[ÖGÏ3“GDBI‘Z8«µ¯öºÛK +’wi¡´NºóoI^0Õ–ÎÈ!C6פ AÅjc›a˜LÁýäü>wiúÁЧ('Q_´d¶lAS¬Ôæ‡äaíøîyNM×iÙòD³."KÂ.38°n +ݱÍAïOÇ4å|cåžä½Ë™à˺_…¤Bcbœp%ÉU™xíŒ`#Ë}Cºûð¥H"¹ºå)çØÑYi#,ج¿ßÁ;QÝqç·Äjí(^&+
MÌøkRÐ,7÷u¾!+o¹-}iC¼HBbÛ*1'O. Íþ~6'jïý˜ñ+gt5û¢PVÔÿ¤˜¿T?ÚãÔR¨s(S¡šq¹"yV‡ôî@v¨„3ëÔHG¹çòšu´ÉÅQ›8Ô%âÛV†w>ðÛeã‘[‹}H}öA÷4OöÖgí +„7N•{œP¾©3¹¥Œ/Ä[Ö]ªpCƒ’½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 +ï™°H¯Ñq<)XÍe.vUÀŒ‹Ææ6¼j÷(OóÈŠ¨ð"AÏ@ä_ÞžX$#–alxUeh[fdþ.Þ_lÔæ8-®(˜ÙÉë¾—©)ZóÕŸ +Ôû´Þܼõ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¢ + + +à+N‰Ø5ÚNjÔÐY›€¨áàݵiï+Zf;ˆ?Çåe³ÙvWà·kŸÒÅüµ—¢I¹ë´“F4{½*-5 …)<m‰‘·iîúó…sA€fÌTljò‰¹^›]¿w›H.’îŠI†m¸_|óÚ»b \ÝÛè#Úžƒðž1Êê
×åã–μmœh³fË]Ú¸¤„ž¯\ÇišÒ}EK¶
õ»›õx}3sŵÈûÔM¿=i‹ƒ)»o)=26¢QžÉªËC†;ß5T]hQ€Ð^šŸmúà|‰Z›!ç˜8ºs±S°È¾J¬f?ÝëÞìoåCˆ€ßlOŒ‰¯¸1]§Uxœ<Šzæ᥀•áç=ˆÎmòò‰¿½PÓ1ú”¢>2x¤iÎ#§·5ž.‰©sVñº^ñ¼ëÓýªÀ›`õVÙÅ¢UR¸¼ûpœ“åæ41$ûFÐ8ªŸ8lV{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@ˆ<E¾=\Ðwö\#·Sä‡ó ̵ì¬j‰um‚Þ>ñ€Ö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ÚŸºþ<˜÷|š‡+œüäî˜j +º.F5|EKÖ_kßU†Ä&“ó"÷•€äûdÎ…#æ›5åØK"20¬.Fí¢Jà(2\࢚z~"‚*X¸×”•›¹-=‰Œ!‹2ZK
…‹3…~`ÊòJ&qðmvpˆ;¢¬¬Õ¼}ÜtЈD½N¸Q/pÏÐ@Øy)diDÿD¡ +ÛIX¨_QW:ÿµ
]úÐÀï9Lœ`]fd„ú1ØñœÖʨó™¢r +EþØÜlgøÕ_:jûìe‚¡¡¬ +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Ý5oYÖᘠ+AÒà}…a™5‚>ÂÃNFØX4²–€žÞri¸™½‹…:'é‹NÎXªËQ±lC#Ë4’w‰ùŸÈ>ßOºÒLZx¯dTH‘™‡Ø*:ÑP=<Ylc<¢„%Vù3nË
½H¼!›Å.raìþ“¼ù÷Y:›Îxf‘…H^#ü¡ æh +ø>@[›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Á<S€\ìæ¬# +)¬¹YQkfb +<Æê> tjY×rCD[")Q’£#˜Øn]Ìcõ(ð(»CÈ=g}¶F`³k940ŒÜ§k¤ÿe:ä#_tRáYL©£½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@<gäÍd}ßÜ-âãf††Çª§è·à^.@uz¥@”M|Ý°Ìì4ÒÊ +à™<=²!>°ë_Â!¡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 +’úC¡ãa4Ÿ—7C‘ªÜ݃~Z¨‹ˆÃ©µ»*‡‚s·@qp![~_£Œ¿:[8&‹”ŽËNp€0ËtÃ"¤ü4q%¬i¨•F³høð¡<uÖñ¾î7iÞßÐäS)–óãIÌ)¶é¿Õ+[ò5L\Ö*ãÍZóÊgDسö@WÎìÖ1üÊ,o>HÁ81äј=Þü2¶ã³âL˜lƒK¯:ÏÂiåsB¢/]ûP6 +Q+ª''a¯¥¯óm@6úâçòg}»°4ï N–³š¬0ìHñëà´Po|®RÎhkÏ–T…£¿» ”àá€#V‰YR³ŠÅ·Rßx°îV&£Ìy«úEê¥Äyêî‰;|0üŸ¸Opˆ`Ôæ:5 × +dž°Åû€{ò$#ïˆÚrþ÷øúø +Ažˆ+‰o徑ù^ÄWòó +þ¤a;åR6¨¹;áD]ëVsGm½˜¤îý‚(Œ3î}
ìfˆ¦»ÖÔÊËÅ!’uÒPPÝöF5ñ;êO"•—ni2õˆbg+€ã–¦ÜÛ%çŸoÚˣǦÅ|É)–C¹,Å‹ñìSÑ.”Qƒ—#l )tæúnÙ‡')ó×LMšýLsi|¼n°Q!gZŠƒp2Äòf;|d·sJ5[èOú»·r• +¹0>“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‡• +RÐ%åØWÔ糖Î;ÇOÏØŒI“ëöL%Ç’,úÛ¼F¬>žÜÁ|á™ôaײÍ4˜m?3’V=·_L=Rx;`‚i<’kav`Äóè·¶²ú0 +pºs*Å"øVŸûå¦ä!¥`˜nƒ³ß+ó+ŽµÐ +çø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¹ +£fÍ6•9í]ØTÉ°bµ÷áú1K/š&‘9€‡e×¢hœj4Šß.Î[)Z +dCŽREm46¬8Ó¥N¸ «Ô6<É,ÆÐÍÉÎæi:ýx(¥Ët8ÐËn ÿ`’®! +¼ë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îÅ +×·³÷ŒAÿÞ]ÿ¹:#¥µIä +ÑÅÛ±å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éòù +H¦Ö¼9Gž¸M‡ôº„þP¼¡ïÒ4Š›µ.¾êJøiˆG•Ä$…hÎX÷lÕ-DÞßÍ›á/c;§Ü?‚Ë¥9‡l®Ñ{ÄÆ»òni†n½$›B×:õÒ©~’Xv + w/¼ÞU·O§”~EÁÏAç8Q•|ðŒGÇ=gý9,?YÁ2Ë<må,*]ß»¹5HN”¤mf`!”uåIì¦uþÕÕ>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‹O +Ò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»Ñ<TÒ>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›…H +—€_úØî*Ý– ·£ý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/&Ësgk7/;ô^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Ä +ܯ*ù 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 +G7ôæøÆnuÒ{«ýef‚‰@ÆÚJt'D©Ñeèb
ÕÓþÿkŸ,Ûš Å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<rüME‰J¬#Å<ÝþŽð»Z–êÞ§é Ö/y³¤¥6f,¹yK@ðcõÏ’bÖ3Jca~Äï¬]+)T!¿hê (ò‹gÙ׺Ñ9QÀî/LÆ. |ºy‹ÔOIûè{£dç*ÇU6j—áÅ+”S•ÙÏ=¡ …–› öHL @@ -9145,158 +9710,35 @@ K› ÀöYt^¬evQ&57Ñ„t9Æ©‘;ØQLV2²ûËI2U^¹¨%Ô~ŸŒ×ˆzW p íSß»bò7+Ö˜ß áænÍwˆ'£#µE°nx‹¢PšL~|ö4KQ¦–!¯jn£ÕªîØãVBGE”}œœ ŽýÐ{ƒéV³”Vã0¾ô.¶Tv‚Ì|`°SU[¸U!&ýø7 >hI£YÉì0…òÇ*껪¦úݳj€í¨ž¨ß`Ù?8sGx9g3ÎîèñÙt÷:n:—SúluHx‹œ›ÍÉPo·«ÃJAüÕh€ß¾ÅW'ˆÃô´B ¶q…¡Jˆ`“ý kaæ®´bg>–MO”¶æB8uk—ÄþÙ7)Çê®Ü¿5GVQ(ë¿Pm-FG*åTA¸¡WK2z)· Ž×?3Ì›QOl s¹ -¹ƒ%ÔÕÝÙêjý÷áöendstream +¹ƒ%ÔÕÝÙêjý‹´áåendstream endobj -879 0 obj << +873 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1932 0 R +/Encoding 2007 0 R /FirstChar 2 /LastChar 151 -/Widths 1941 0 R -/BaseFont /IAZDVK+URWPalladioL-Ital -/FontDescriptor 877 0 R +/Widths 2018 0 R +/BaseFont /EIFYGD+URWPalladioL-Ital +/FontDescriptor 871 0 R >> endobj -877 0 obj << +871 0 obj << /Ascent 722 /CapHeight 693 /Descent -261 -/FontName /IAZDVK+URWPalladioL-Ital +/FontName /EIFYGD+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 878 0 R +/FontFile 872 0 R >> endobj -1941 0 obj +2018 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 -862 0 obj << -/Length1 1612 -/Length2 18760 -/Length3 532 -/Length 19672 -/Filter /FlateDecode ->> -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 -ŠšRò -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ü -ôX‹ýv5FMç|.òöZSª‡æâû÷eµo®ºG¦|ß^£dìfÈ婯?ÿxñ¤}GðrçXQ†•¥ïí«°nãÄ"‘ìv¢t³íg•×ÛudkàXþæš1´¹û±¢þúgÔ\Ô®:è'& -yY·ŽeFÞÜÉe$WemDGóÒaž@²§—ñqfS–ô6BÙßõȽÒU?ùÏ žRÀ=²ÜçqEË4|Y²Õ7˜Yàýe•çŠuóL*”ÅK 㟠$HÙU&Ä–ÒòÈõ×€®8ƒw}_þ×ïÝk0žGFÔÃó'€r¥wŽ—mølËsöxRxÏ¢ªVæ±YD -rÆËo}s˜[,
Yw?Üg±‘g
x :Ëé²\<cï:—©w<5s ¡Ì²¯ … œö!±îÃøܦÉjª¥RC·Þî+~»ÌŽO¿H~Ëa&¶¼<“àô䊈ç¸ÿ潂I£Ÿ•æ {—]Ÿé10.ã=gVýé~Óàèñ“yß_¢‡qk£.nÈ2OS›0$a÷xb_¾÷ -'ëZ;/€Ü
–^dŸ”¹\
ô0:ŸæëFVEò‘¥0\^ƒŽ å³Ý1wé¡•>Rh’`ÛêüÁT~Ø QaZd -U~-UÙ1`¿ôB}èÿ[à|ýÛ¢˜‘èþà éz]n¡·†ätœÍOîø -é+¦ÞâwªÉ"=ÖšTÂb.Ê;9§D¿KBr•ZDIé°É¬/$h-5…œë¼_àï_æE݈P`„‰ -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¯¬|ö -
œÉò;Fª¥)Ò—³önEäûÆÀ%g5HF¢´`Æ÷‘1 -S4DB~Öõ‚iJìÞóex -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/Æ*.@¶<A¹;p`6{ü°ù]J©84~
ãK3½4¯À_<IpDK¦|è)ÍûA±¼INâ\œ%XCK e’ÿÞÇw‚è2V1Bˆå1 h=M¸Š=Ç3ÉÜF1×Ô¦Kgy@[²¤Î1ßÒ̪ص;#=˜³8–ÜK~.Ô/j¨°äôl×·_PG{ -Î(ª`¹ «8¦Ð®2hcöuõÆîþ2}¨±*ÔcN
§¸veg
"…”…X×…^¾ëfêHá?v -]›°¶wša|õ&‹r,
¨<P«¬ ¶ð.X ŸçècŒ#î™ç-£F¯Sÿ¬œÆ˜—å¬çXPAf'ËÊjÙ -T´Zu~¾EÚ§HÀÖ}Uüz¢ÜÌG}!Éj@6ª<ÃôsìDïD&©B–%êáw¶0&ò·†j·e£ÉIø’+ÿG"ºbnYˆ#ÎÊ…5Æ|èZ:éŸ_xØ0g÷à?§û3â£8®ˆÜ˲À˜Qïü±Ç7×X¨œÞmÙCìc#y¨àýIì&†œ·5Y²M¿>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* -´ÂØ÷þÞŒ4à…÷r
Å› ‚$Œ¾£Q`ƒ-`¬×ðÇŽMéˆüyÀœJØ
ò`’…hQý)*¡ $ˆY
-5ËñòÀóv3.]”T'‘™×_ìÎ"À<aôàëÁýXø èÒˆÙ¨>T'8±ìƒJÕ2,ί„q;§oék9ãñÙ^¼è½þ#±ª‘l VgÈDÝ/tHõÿ¨ÀQ—Œï±<=fYM[=€7
µ¡éPÅ°¯qdt³a³ -x^ðÁ=‰/‰Ž³'Bhùb£ÏX‚ghÃF/çœBÀî™ñ(qF¦ü¦S>à6æŒ#°ÅóŽùI4MœÑb¸ï=pû{níÒË%ˆfcY¨¬×¿þécaöyqÌÝ1¯Æ ì—n7 -4?äÀYÜ -Yت^éιAÈ•Ë5í -Ñaµ+Ë“º±\‹0ïdÅ C´Ð²(Ó©Öצpy§’éÛ …oû x#z–ÓŽúiÅ6„_´'Æõœ¦?óØ&¢6ºT&V@t½EB: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ðÀ—ˆ¨ÔÆ¿<—ªîïá -ï‹i’6RNbl¨°›
(¾/`Á%àÁ¶ -èý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ö!;¢ -AQé}lߧ‚>œ'Øoy=Û“õÀ!»šp£vSO`MÚ -ÂEdqðÏVŽ<[^/à•‚³mQB(ÉJ4åïPÓ%›ù5`¦—¼<áN]´ÍrªuÓD…8#¯U…ÑxšŒŸžþØë$@Ñr<M´žöÐÙñìlDîå® -œ8ªm²IŽñÅa&2i=-ªÜÿ:Ž}aÌG½o_ˆ<2smÔR·™ß.;¾ `¾sð3¹]ƒß9mg!€fLÒ^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„Ó -.^7=º6Š2#0Ÿ“8uGzƒ)?&¯~Ó&Î^ -)׆þ®ì¸}Ÿð‘„¨ÍŽà”ÿâ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À„ -Œè†²}°[^ÄÊ"<TÞØ€êä£jÈq˜`iNe“äR'l¡'
Iß<N³NK×?‚ÿ’Œé ªOŒÓœÅçÖ“© <À ½2a´/êZkДv{²Y–Ú¹¡u©¡BÍøÒŸnN;‘ÌøÈ¢+ä¼ÖοyKO€|DÛ/à5€" /‰)‰‰•ˆ½~»|fkYѵ7³C¥¼°´s›Ôªó`(4_çÏ‚5ܯ3·ªôF3eê)¼õ®#Ù—°mÀâÜ
‹¯aÍ—ó¿O(2Wr'ž~ÀU‘,〠-+ -Brãx€V¿…{x=p m9‡ãCäbÁ¼lº•ùWßǸ(Nn@¬vt&4Å03§Ø=:ËI{ñ·A -º¶ãúv$.yûK®¶”Pï By-½Ñ‚ý·¤[€¼?.à~ØŸ)¹aynË"ª ïèQóVQ"WñÈvö(W«pßè‚U‰ª™0U7šùœçá.¸½Ns˜ÜïKQÁzbžü™ -ó½ýÙÍËF£jkN°3½WäfÜÁ)8+í':º/¨%²+žG%$Åw·í=¾tÀÜ~ÆéÁúäi*¨ÐuÙ>lû2{†X’GVM"¹ï§¿äØÞóŠ-I¦./q*#Ú-ÍÌûSn®Þ~¿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ö(±VJ¸ã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œšÒ -БQöw>}N·>¢Z[@ßHÀ—ÞäN—÷“$wŽp»X0õ•Äƒ<±´Áí¼sÎ*`<Ñú¶øAF‹/© -¦£Ò턳`à*ùê™>÷)›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}ç†/œ¶C<ZÅ-#©óô;=Ôg…æÙVÝæ<T³4ä5ªhš íIRaت¹iýjÕ{Í!Á -ÛhÆ‚p!Þ
7©ÃïsíÝ!³Vðû”Sr«r ÏýØÛ6ç¼ÓÆÐè Y2f@Þ#'G*)†ó¬£sHj†AvÙøÖ£œw›ú<K%}9©CLû2Ý~a…z -¿zN@â{äye‰z•¢tø8h(òD¬LnbDw•i±Ž™1·mq±’™Õà‰¼V¡ØY`Ta}Võ–«Ô+@<‚wàGô*”Ú3·†™èÊ×ZO@X@eúåé3Ÿ!U›£×øª·ü|Nú‚,=[ÑLšH2ŸH÷’3?2Ã<ú1øŒÞ|/ÂM'6¹ÄÂæÚÎ[»Õš¾{/".¤´oIÁ®x¨tw!g;ëÙM|@j²†l»¼!9û–ƒ -’â;ŒºÓ/I}hŠb@xž¹ß£vÿ¨É•BxÞk_Î(7Œ˜ -—M±ñdr%´/™&HñæQÕ´+y–›=PÎ3këЗìº;KNrÉ
CMH°è-ª»Êìü9!…[ZÖ´DvI—4ê!\†Cj.©eœ’
0 -Â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"ë‡ -É5w½‚'☺²¡tg‚ÉGѺÐäQ`Æ9vÉlpúÿÖ§ÿ¢^ʆÁ.¸7%Ò` 㱬Fœ}a<õŽÞµªž2Ȇ´h¶”RÒ`k‰ÉÓUúÞê¤/˜÷¢ú¹«É«¿ð\”)$q‘1)Û - !˜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<wèÙÀ -L¦zRŠÑФtÔļaÇ;újwÛ³ -ž‘ÊòüÂœNBMßL¢váKÀ$¸èŽ`e2s®5‚}ا:Yo -}
v³m"ä¿â¶O›‘%)6HMí°uÉ]²GTšëseZ,Áa‡ýft{ñ«èÉÀ¡?*Xù å¥}’lºâç0íùË·=öâoÆ,˜ÂpÈ~“
œ¬L+̯Ú÷;Õ½²?¹®$Ó
wï¤Á,í`ô‚ -ÍøƒRëOIz6¥K1#:¥¬ìÃ4›çTPb§qø/:ÙsÉém½ É*Ácîowæ\·‡t‰Èâ’D…>ݳÝ
U1d•1°Æ½™Ä<‚Ǩ‹Ç/œapbÑþ?íÌ÷? -eËè2R¼ÄûÛûyŸ?à ·Cžtж‰ä€¢rªØt°W¨ÂÃ^Ã> -ŒÙí?Ä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öܬðrF -¨ì¿öžÓ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^µ@$<B'Ϙ½23n -ͬmwðôš].{aëyjø0}ïuÁ¸lƒÁ'ŽC»£"éƒíK±Ú¢@=Ñ~ºÈµÔÁ'pî,¿,Çî×/¶'™¯æµ‘Ʊiá«‘ œGäÂôÞtµoyOYú÷zšH™ -ŠwêˆVM¤¬Èôv£äGÓtøu #£yå\x¦CžšƒÇŸÇ˜ZçU.æ@ÈÄôÄe²˜=æ÷ÉáyÜuù^é"HÄÇ׬íôœ™Í ®h;@‰¦$ˆ;ï¼ã>ÛL‰†¸æVìP¤ýÄJÍÏD{¤>pV$QJ¬©ô=˜Ð9Úp€Õâ«ùD¤å0ù_‡b>éRêVtÃÖ ÄM -Úð,6äX€qÐ-}nJ®k^¨£ô@l€¼ÜI>Œ˜×TqÅOшتxín°úâ…õµ4JÌäÅVkw¨Š‘þI’€¥¤\°^0Vò˘íep«%"h*
êmQôB±Ýë“ÙÏXšEÿ¶Éµú0üöA•ÚªÏPbÑËöê6EL7‹:Æ6 -œ• -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å㧠-endobj -863 0 obj << -/Type /Font -/Subtype /Type1 -/Encoding 1932 0 R -/FirstChar 33 -/LastChar 125 -/Widths 1942 0 R -/BaseFont /XFBGNO+NimbusMonL-Regu -/FontDescriptor 861 0 R ->> endobj -861 0 obj << -/Ascent 625 -/CapHeight 557 -/Descent -147 -/FontName /XFBGNO+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 862 0 R ->> endobj -1942 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 -746 0 obj << +778 0 obj << /Length1 1630 /Length2 15892 /Length3 532 @@ -9307,7 +9749,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Ïð_–\ ø›UY\òßuºZ™¸þ“Ûô8Xüõ4w0sûgKÿÂþÒüE]M@ö. -`abû·Wÿ²kØ›mAöÀ¿šþ« +`abû·Wÿ²kØ›mAöÀ¿šþ« ™**À)—PHW£B¢ªU³m·WÛÔOrí]VÉ• $«ùqyĤ"õÂzŒf<0ëûë£Îðf}/Ÿí¤>bêFè,VØUd‹ÕƒæÔJlNÍo’©+¬OXÏ1Ï-¼§c-NÂ1ipÝ›í\AÖ úêì`uvdé,RHžê$žkK‚>&Y ¤ºÛ”OØ&â„o™kâÆœm§Ù WëÙÉ ¨œ/û«Ð[BÒó´`Ûtä¯äÍN¿GfáĈHªýmVéDÇÏ“Ÿ”Ä÷¦Y_kÉóÍ+èü1pÇÒ¨åÁ³ñÂjD•jÊ @@ -9369,208 +9811,210 @@ MIª\ÂuTØjGI-gýÂÓ–GâydføæÅxÃÃ,oÛ.رÌ*_ùSÕúƒóØCkëÚ™¨·>]ÙrÿÅ:K¥ÓS%œx ¿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ë … -¯41¶{ºQµÚâl·Pãg;‹($@QQ~:ú4¥ /麞e„¼æª't“Ê>~œÍÆTÂ={š÷ÈcW
äë6Å͆ÇIjË‚¶{Al ¸¸
²œísè¹”Lª £ÈàýÞùqœöÇ=*Y€þK +¯41¶{ºQµÚâl·Pãg;‹($@QQ~:ú4¥ /麞e„¼æª't“Ê>~œÍÆTÂ={š÷ÈcW
äë6Å͆ÇIjË‚¶{Al ¸¸
²œísè¹”Lª £ÈàýÞùqœöÇ=*Y€þK endobj -747 0 obj << +779 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1932 0 R +/Encoding 2007 0 R /FirstChar 40 /LastChar 90 -/Widths 1943 0 R -/BaseFont /RBWNCJ+URWPalladioL-Roma-Slant_167 -/FontDescriptor 745 0 R +/Widths 2019 0 R +/BaseFont /JYYGJL+URWPalladioL-Roma-Slant_167 +/FontDescriptor 777 0 R >> endobj -745 0 obj << +777 0 obj << /Ascent 715 /CapHeight 680 /Descent -282 -/FontName /RBWNCJ+URWPalladioL-Roma-Slant_167 +/FontName /JYYGJL+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 746 0 R +/FontFile 778 0 R >> endobj -1943 0 obj +2019 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 -684 0 obj << +716 0 obj << /Length1 862 /Length2 1251 /Length3 532 -/Length 1860 +/Length 1861 /Filter /FlateDecode >> stream xÚíUkTgnõJÀ+Å€€¸ -æ2@ Š&X4-w¤2$H20I0@(PÁ Bå"Pi¥´^€ÊÅ`EÁS#BAn¬\uÝôØ¥?wíÙ™?ó>Ïó½ß3Ïûó™™xxèl$vF„bHi€“«÷A€D2ÎÌÌ …!1îÄ0
-‰¹° -`ÃÉ
Áö‚1'ÿ
S+›;Kø|7H°Ø~)¥¿ð€Çz£@á1Œ®F…+¥¾ð²9W˜Í“V²L1Äç±èÂ>@"ÙšºLðDÎ<)Ìöà‰Y\€ñEðÙ+`ñ-!Ñé>þôƒVoæºDz@<¡xT8ß©—jð]¥„ò¤@ -Eá°„UT xB6,`)æ˜D"bl €Esà (nq¬ 5@bñPf-NM¼È.T€Œeÿ "S0…X0æü¶~/ýn‹áúÀ2À -³p½ÝË!)4¯:¹"ö³s·¿ÿ€¤õ¢RÝ«ÙìW›Ïcõ¦žõ4 —Ž+¯—ãÃúŸ³Nꢗ
2ÜÒ¿œ.ѽp%¨Ü/+žÚDìñÆG%¦ÉÖ¼²2eÊ#|N|4¤5¡Ï|³m{ïô¶¸6³lÃÿ\ãÜ`·öFK¯–¦›ízÏk¼¿ 5ð¸sëdm\Þõ¬‰[÷\˜x‘sš¹‚ã¨<
Í>Âr" -+ÏzË]•òˆ>{~½{zS€ô‰qªiŠÙ³VïréLZ¬aÌï7Ã5ñwRÇ2Šg¾r×Â53®
Ü–']W’2ã÷6»µ=´æ¾ÜÜfå&û(„<h½êâHA{è£?W)¯Uš›ËbŸ—Ca5¹Æ{žDG|W¿sî -%üc94¡ÜÜ—=7âjp¢ŒûLé^çP]flBìµ·Kê Ä9¢²¤våš'øÖAþûîSŒ#â²GŒ™xh躗Ë.;h'$Ô\—-”…Ìî°‰°œV*¦…FÔ=2À5½[wì™üPûR×ÈÉ?ª)–’Öokö³ƒîOWØô:ÓçYC?÷£°èÎú©_FäÍVS¹Ëúä—pïç7J¿üñ·¡ÒɈõùWoʯʉ΄։Öþ›E¶TÅ‘“Êk•×Ç$
7Ìe$å-Ê„ÓYì€Ò<ß?¨Ý£X—Uªš{êæS‚EáÐ]EÕÇ´y”óÔy¼Âa²²4€ö©÷¾_ã¨bÎ úó_N’^'v?רk••ù2ªR¦¦K´Z_oõÈjrÔ“ÍYY2(Õk$ûš @šýî~Ã{8sç—Ú·¬÷U$ÆØëx…4:á,?ÔyòÓæݯ¸ùOiĤȇ‹øÄu÷T«TêSFá´{òÀŠ1b]aÚù_Ýv*S’ç#·ä]k¬Øå“Çlöny`wlÃlÓËDÕ7™U¦«‹ûJ*ƶábuÁÀ$ñö²×}Â(5ñiQBCG„ÇÀ\—$§!7!ÇM~9šœù¸)ökµÑ)Ç÷Ä\uo€£Újoÿ=ÕñH׺™;wáÔúBÙ˜‹jUŒfŸîNç²QÝÖ…Zöî–[£Ž¡Cô«Z’`~›æO2ÿ¦@àï›—®9c³!1ÉIï.Ø®o¸.Ûh/‰ÃÀ‡7ÍãSÌnõ´ŸÊ¦Ñó›1ŠÇ!1çL~ø:ú°j$`mÄèÏ}-úªººÃ§:»’}c]LçÚ¥)§•Sw¶wŽïÊvÄ<Ñ÷9Ãå´Fÿœ\kuRy,»#´Þ;(é9ší¥Ñ+ã¬
êÍ༧CþÜÿüO4À®n#
ÃýY|þaendstream +æ2@ Š,š +„›‚"•!™@’I‚ÊeE*T.•VJëX`¹¬(xÖˆP›FÁ+W]Aw +¸!l®”úÂËæÜ`6O"XÉ2ÄŸÇróa€ +ø“‰d2ˆ ±÷ÝWÀŠÍ¾²6OP¨¶ +ÅKg‹ÿ]Íáa#ƒa)ÌÂõv#,‡¤¼êäŠØ/Îßùá#’Ö˶Ju¯f³_ml>ã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Ž8µÜS)é³ç×3Ó›ü¥OSMSÌž·z—KgÒb
£»¦‰¿›:–Q<ó5S×dL¿>pGžtCIÊŒßÛhìjÔöÈšûjs›•»ì“`ò õªK#µí!üR¦¼Qin.‹}Q…Ôäïyþ}ýιøŒâþêÓ‡ž•Ö˵»ëõ@Ý]÷z3_j¹wh¤QÜ$WgeµÜc$üð¸MG÷½¥âè|÷µg@
.ƒ ¹¼ÖÈh<~=Œ¢e*ë²32ÿêà+Æêòµ¢‹M¢’Kñc‰´þc`ÕÍÎ.ðj<ãHN,c’‘¦—|-Æ‘ãí«,›7ÊêôzjÎÊä}:Æšýʬ(=…‰¬RÈãœÑžÍLÏðp÷ôÛ¯w¤9/)€ð\î{Qñ¬9»clK˜¯:™q¢õåà„Õ”hÜ[›v©«Ô/ÅÐ<¾Ôàh3S éT~v½Š¡@rÚoÒý.útq“³¹QS©çþaú2nð÷Éï7…~Š¶šÐ@níËž‰q38YÆ}®dÖ9T—›{íÇí’zB"pŽ¨,©]¹æ)þ¦u`çá}(ÆáqYGÃÇL<4t™å²+Ú 5×ue!³;t"4矕Šia«õSpMïÖ{&?Ö¾\à5rjÇOjŠ¥¤õ»vàƒéê›Þd|ÞA×Ïý$ôoº³~êWáyóG‡ÕÇULYŸü2îÃüFé‚ßÿ2T:¾>ÿÚ-ù59Ñ…Ð:ÑÚ«È–ª8öpRy½òƘ¤á¦ƒ¹Œ¤¼M9p&‹í_šç{ñG53’uEeñ¸ª©±§n>%pP´ÝST}J›G9Ï\Æ+&+KýiŸ{ïû5Ž*æœtzñ÷S¤7‰Ý/4êZ¥Fe¾ôª”©éÖ7[=²Ú‡˜ƒz²9+K:¥zd_3H³ßÝo¸cgîÂoRû–u㾊Äh{¯àFgœåÇ:O¾Û¼û57ÿÙqèùpŸ¸Îÿ¾j•J}Ú(Œv_P1F¬+L»ð«û®BeJò|Ä–ü¡ë»æ1š½[Úß0Ûô*ÑBõmf•‡éjãâ¾…’J€¾m¸X]0ðI¼½lÀ-\Ÿ0JcM|^”ÐÐî10×%ÉiÈMÈq—_‰"g>)EŠýZmtÊñÅ=Ñ—EÝà(£¶š†€;Mu<Öµnæî=8µ¾P6æªZÙg {·Ó¥lT·u¡–½»åö¨cÈÓ5-I¿MóçÙᦠendobj -685 0 obj << +717 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1944 0 R +/Encoding 2020 0 R /FirstChar 13 /LastChar 110 -/Widths 1945 0 R -/BaseFont /AAVZAY+CMSY10 -/FontDescriptor 683 0 R +/Widths 2021 0 R +/BaseFont /BOTYKT+CMSY10 +/FontDescriptor 715 0 R >> endobj -683 0 obj << +715 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 -/FontName /AAVZAY+CMSY10 +/FontName /BOTYKT+CMSY10 /ItalicAngle -14.035 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 /CharSet (/circlecopyrt/bullet/braceleft/braceright/bar/backslash) -/FontFile 684 0 R +/FontFile 716 0 R >> endobj -1945 0 obj +2021 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 -1944 0 obj << +2020 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 -681 0 obj << +713 0 obj << /Length1 1616 -/Length2 25291 +/Length2 25334 /Length3 532 -/Length 26183 -/Filter /FlateDecode ->> -stream -xÚ¬ºc”¤]°%\]èª.uÙȲmÛ¶]YV—mÛ¶mtÙ¶ºlÛÖ×ï{çÎug~Í7?rçDÄÙ±#ö9±Ö“™$òJ4ƶ†@Q[GZzN€Š¢š¼••±¹4¢µà¯™š„DÈhàhnk#làä¨Â@# -Ó¿rÐÓÒÿ‡ÑÜAÔÜh,oîhd01°úÛ§í*6Æ@{+sà_=ÿm%€†žþ¿ù”ÍÌ,mþi<˸€6Æÿû_‰þeN§&)!¯)Nõ¿ÏÔãäÿjï¨ìf÷—Úÿ(EÆÖø.þA´uxÐ0°²hÙ™þ^9F -4‚^ùckÄh‘š‘æX‹ž34!¬Õ×à -¥$T³ØÄ^×âs:‰¿„³Ót»©È i+3«0€Ö~Z¦Ò‹Áº*ã¹®.òzbdÄhn“<£c¿§¯ -ë³ü>Ëä1os´˜™(ÏÂß_Ø⟣ -Üiv^ëå‚áßcHdð8âzî‡ù&v'ö@¹v -Ý}ÈâJK3î„ÕžÖõlµüÁçÓDÓRfd‚ICÖFJ$GKó¾¯D˜ü‘·vŽ+À$kPSöc«¶U|R·Æ
‹‡hX'œQýSÁàØœ¸5£ -•LŒ{Œ›h1X+ðaÃ1©GÌ$“ñ¥l&HÝoÿÃ5Ÿ©qΧ©uAÑÇÁÛ9+.ÅÌAK¯lrD‡2||ÀÞW™òqoÅU{´@ÎÜ^ËÜqøHΧ6U½SN0} ì Šz,sE¬˜¶a;<Zt$N}Dzë³õPô:–šÕú. Nž³¤Ftȥ͜hR=l>eŽE/Í:P–ÒÝH“OïQ\ÉŒm–Õ›ÝèIY湪
F'}P¡Éô”ÆiR¤ÞÑî •¼Æ-D1dšMZa·ø»ooÄPe0™ù{à3X|ªÕ(Æ5rcˆí“ªCch³Áó€n']íõ%®$Á÷pÙC$äg´ž/qº–Q„¬{kÐÝy¡ »ä(örïZÔ”*"ILÎÑŒè¹ÐbG. /“!C¡U†RmÊfB,@²¼NïÊ;ÉE–•@’O}64jÂ(æcŠ -M
J9‚®»˜=¾EMì¥Ç§SëøüªæÊgg æ·g˜èô\ %#B9%´®©b]cA=Ô -‹“Û,o2ˆC½³Ò=ÙÖk•/ØØK‘ÕœƒjŸQªÊ„·¨Ãy -@†Ä¿ØÜôH¢ì’×Z²øPAçGÆKX•©Èë7ÿŒQŒ±f´ý1ÜF-Ùw|¤$»\ÃD¿‰x¼ È€Ñ"õ†t?oånŒFÖÙ»s¤‡V@•RÈ2Sx p]½ùö]¼¦ÊCRë
".zî¼å§ð©PGŠŠÔƒ H>öé%WÀD|rÀ©ñËE`…zôGfìí¢t•„9—šÏ¶3Í7„ ir6s¼ŸÏ‹¼Á†(»µ›œM•_Ï^–8%ÃÒÌh<TÏø<G‰& žÕsŠŒï}x4ž"Ø`ñ ã?70„029t3™aŒh ~Áع‹&ì*ÇcGí\¤Šn
<_‰HB÷nV ^?z^
6~pÈ“!Tþ(Q4Î×"‹>§Üs: žlwÇjèQ›–óž…-á’æØŽ¬£öI:(i>·QÄJé|]ˆgZC—º’¢0'¡Üœó7Á¿†pyfãÎCûâtˆí&ž?¨Ó[åÏ蘚ç>÷bE‰ÌiòK)¿Oµ…µËÃmžÒÃúÔˆÒÒ³ü}'ð–ixiªûÂcá‰|^"íÆÅ>p&ÄñâüGÚ:[>´ŠX>µlºZ‹ÿZ9Ð[:ž}€Àe‡Fk;èpO©¿=–õySɱ¤T‰‚í)Üs<ZvkHJÉ=žEFék
Ê[} ´ÇHeˆ"y0OÍÁJzÍ
4M¬˜×Ír|L_hàüKå[ÃÔéê…ë˜Ùc™ØSF¶Ñò]ö™c(Î=©à=ñÁîEù©y†øÏ$¸«]K¶ç…𚵯Ô>m%¾äËï¨OZ¥8!'Ú76
ÅuþöÍqCS) (Ág-˜¾"Ÿmå:ºWV¶õÇ/ã|ÅÂY¿,F}ØÛu/ŸË¤°¨570]ç4eCØ¢Yøí–² ó—Z -JëØ -{Œ¥«KqHM+~ÏBO¨Ÿ?oiµxÍ+«7g7[*‰F]4HxD½I·È-÷€ðÚѦîº-v€á*hûT°ž½ g$+ªíá?t"+<äµ +zÒ´ÊßÇKÙ’«fÍ¡Ù”ø…È^fx—wÝ¡×Ú‘Q!·úwxm$,
ãûùyïìC8@„S+®dtóWÚ³æѶ9ÊN-*h³ÞºE¨‹@åðòuAIÒØždé°&#t›ÿ xªÅæQ§„
ó -9µÝ.Ý0{Z[Cdiî×É!âOø^)kUIÑhäëºCiµá{¾ç&KÚéçýoû›ÆîZ—‰ÜËlÓîÔù—6lÂKR:¶;y>ñuju¶ M¯²á3Ú©*cð!¼cpäï ½¿§$+7æ,ÌŸ; o&ÁÈbÓZlÑ~ËwÔ»¤¶”Y¶ˆ~ÂÞÉ)X‡[uçÌSX‰&©ìÈ-D rÄ-‘7Œ¿îV5Û—nþÙÓžÍÔÞš£÷âËì›tŽƒ‚õGQbEˆD>¤*꯴Â[@ÁÖ5Ƥö*>›9%§úýDHÔy µff3@h?L;¬îFÂð¡Íϸ/;*s ˆ¯cOåU®BÚ½/âAñ.kþÚ sHFC®Ü¨¬J½¯1þFn^×áöƒ¿¢WW)ËNV¹ŸQO‘Âömœi}Ü8åÑñ¶;áî=Ÿ8;2{¶†^ÜóJE9£n(tòx~˜Jþká)5þ–ÞBʨnŽ8Ʋ>>•m‹jS#®YR«—Í´…Á‰Ù\ñGkï¬1_d:mN;ªž‚˜"a’žq€‹©°Ê?ÌÐÄ#ìÕãÙ{½=#Ç™‰¢Òò¢äè{¶Êl¯=¨çPÒDZÒ‹Ýlļ÷Ù-:ñeD8å=ü*$YTÔO½xÑÜúÜ]µ©ÑÚˆ”I5ãþ±×©_)ºNÈ3¨6«äµõ«‰Nó"äD1¬ù „®ê0ö°7®<4ö(Ìuæ´SˆQÁ“pR/Á®E©`SŒ^ôÈÅÙ@D‚±ñ–§æxÌä}ú”:»º¶¥uÒpp—§QÿÐšÓ -ÒÎ&rs¿:Ÿ°ôåÌÄÜÏVèy.<Ó!f•ÛËiQØg:0ÖáéãÍs_E©3dΑ¹Ÿ:A=Ë×8‹´dÍAƒÊ½ïêÛRØ-À×SÄÂ'ãBØ\eá~›"›ÙRrD|©}Ýÿd¯qyIÇð1ó6§µ(‹‚hQCÀÛ#÷œ—é[6ED€ó‹%±˜úÍ<ZL9ÉAÒê“sõ“7\wêm’’¹Ù·—¬˜9ðwב0Êpø¢Ày&NߧBm4D”SD"«4*Èwît£&ˆÞWÄŠWÈžèHÌËKv3†;a4¥QoÚ®ÓA.óÎ`L›&<v×2•M\ü;C‰ï!Uê›^e_Å Ú*Ù³ä_ª¤Ø¶•ð -¢á`7z´|„yð•Ý™íýîkn:ð˜|—
ý -ã;[Ȳœ]P¿“ؤ¸›äNßñÕ§Ü
ÿH¬Ù|.´=hÄÎdr †E#†UPQE^}ÿv€ê¡þ˜(#û¢2ôVÌìôü“£
βÄÏcH®çy³>•q‘óýÁµÚi¦týL6OcG!,çj§eD=G83˜ø®eÁ鯑´^4ÒršXýŽ2Nä@È“mï†óD¼ <ÔýÙíŠÎ±6øpv\èÚž”%¦3+è¢W,K…êÙœçEÛhÃï`vÐyù'5‰$ع$rñ‹’ŸÅ[ -Ý(~®$"·jJZ«ö0V;XÁÖ9àL[ö÷ŽÃ=ú\µ$ÔeKE²¦ë•*VÃ%TÚÓì—£ácÒ㢎¯ô1 6`hÒÀ7>œm¸>/ÿge–‰—sªè²àÔ2Vú¤yîpwí¡úÜkÆƱg¬¯Ð·ˆ½P…ÊÔÆöÐGWð%!ŽlsŒÒe£•;‹8Ù1Ëk²àÚ>Ø?Fõ$é;wͺnæœÌ^Ü”/˜÷RºñTš„ŽzÇWÒU~WW›G0a–
@8§OQvˆk?UJ_xJ”³&ûˆ#p;'+ÍUv˜á#9¾}¶Qý•þÇ%ë<"w9>O“d°FT´pü;í&w°nð-gùo…ÁŸÒ3íâDã»;ÖC+Ò¸ïÅf@Ô -Æ° -á[xœŒ†÷\KQ}Þ£{ânUÃ{¨ƒÁÅð(¸ixJ -/ÀÅÜÍôx¢Pt|‚£»ŽPûβJÿ´ÌΧ•Í[…†%®§íßW´¦ú‡Ñá´L±ŒZLys)5œb[vb§¦ÖKÃB¬ÐüŽÛ|Å2Þ>‚µ¡XÉK©o[rHÔ\ñíq˜²?
ßyæùíoædÏfN/ÊÎMB-£ÁPˆ,÷#”|¬7a•´“YE8n¤
Hõ¥ ¨ùIHÿD}ž†‘#×Àä:>ƒŒlØ)_Æ1}NšLŠýö]ùNp’›±=’“j †/Gîr¶Ò£1,Â;c|6Ž4Õ‘a 'ýq*v¥Ú³§ '|iú‚â®ìL5³ÇI"wè{À,•|XÐì¯/û(3Âö-4Ø—•0dT@N&‚†E|ð4þç.ùiÛÑœÈ1àü[Ò pJÓT
†šžs;ícñU\ÂKÁ/m¨@‘§M=ò]“’Jí‚%ë_JXñÒ¹Žìhuó{¨øy¬–z¼ÍAWô{iaz¢˜š–mŽÜ󺳘;¨2¨/ˆþ/»ÄcÆѶˆäó?™Nû¸°Ü F`® ^å±Z§ôv»ÜÃR4êI¯d¸'|ß|ºÐzëÔ%†=-ÉjÅÐÕï¡ó-‡Õ´;ÌXåpMž8Ìæ-< -QPÓ-áê“&eÃÜÓªŠ^"q\SVÁkøD÷>©Ìp8ð=·[5<‚K‹ “óç/=¨^ï{"~jhõ^Z × -TSõ÷Ò‘òÍ?¡n¢‡ Ì>bO³3ÙØÈ#wÈVßÊ[½6´Éû‰V˜5xy`ï’ÙFC±èëŠY &³»ïÙXºÜR>Ñí.Žù’BpeŒ ¹Ž•®¶ºÁ¼ž¾ÖM‡çÃ{‰(Lv¹%Û<ÃDì¼Ù ÑÄ@^m„ï}(}屩 A?N'´89}¡ãÕ°àahg›ò…NyF=Ø,¨E$ª=ˆ -‡?wÔ]™{†]°á³Í4jÕâŠ”P)ssW;RëË„‘#•m“>®~Fí&û[¾ -Êçx™>]ù‘³±”íìÕÄõ3OSF}óÞn+QýíPR»Š¦½Ý5¨VÅÅ ç„þªeh—‡ÇŠûFe]mÿ‚e¤e¤RÕƒÓI¤MQÈ›.·—~#v‰XÇJ€Ë¦ïu»wgß´»Ù² -^>íª$¡‚ªN³°jQtˆâ¡'§"»BKº-¯”¬ØfOUÎ51½D:e;…"YE"^gŽLÖIÜ)Éæ#S|^o´¨/‘feý•á€•‰¶ 4ê|¶%ýý
.–î´0¶&Û$LèÐÛýÏk¨MLèOöc«¨ðæ[›L3xÒZsýZ”Óîd42)wàÐ!É5³ %aû+|ã=Ê.ÜÓ¹3ÜÙ8Þ- pˆh’•™ž^¿W¯ïEvÃhdBdwü¨øPy>h†L r%@÷CøÆ#œ(|HD‰ñÝ ¾W6ÀG~ùç+¢m+ç®_#É€'[.ÕF öÔ9”f÷iõD -ÇEE‹S9WM3×!ídòÔmAfoçõÄmî¦Ð[Òd‘F$ØíRUJt·äýÀ ÷ -0ê -‚‚DqÓÚ»uJ‡$m¨Ëâ\5%wËxƒëá¤ÝŠc×Ãäçò‘ ¾¶Ï· -:âP ÉÜgú–ÁÏÛç-R^üÀ#¥w…÷n²Q1šû£ö2ü8 -ßU‰òãTç[Fèšx],Z·Éðšsðð½Š+šž ÈS&×9hÁôœp4mYKØ…Ðl]ë³.)µ~gRšŽ_•Ÿ(ºë÷˜te“c»¼x„Ÿ×ŽÆ¡â]ôî2xÂÂ4–ÙO®°¤ë梨áq.svÞ}µØüDváð -7—s‹fYn‘iÌŽR0Ö˜Áp§¡G~)!×R%e¼k/“‡£%A0Ê|&á8¬
ºàµoŒ/t!„ÈÏ$»g¤—«â½Ú'xÆý+ß=Fœ‘è¦y@õST~£Ì½´,Ò~”B”Ê¥¦µ|ø2H‹%È_Øò'5Yh
ÂE8i´ÞÅ ï…Ø)uô_ƒ¯ òÉ`XÇ˶b”ëÈó“Ëã$]TÖHõŒn0F’¯h-òðíìaÝÛR]ÐÉËæ½PÉ$¯ Ðêm<²ètL?Y=àGWr&`Ðñ°êà8Cº+Úš!xr(<:Ž¶Üº±‚=6ûP.'…ºŸfzh?9>^.~-죦ª îêê>. ó¾_þAC鈮ëø:%cý6{L™n&¾[™˜â¨†énC–rMÌÒ( ¿Zv›ptúˆ c2{d„q¡D|ýü¢ó䊇•©|„¦3Ì‹ÀŒ¶¹S(·’ÖÿÎV‰Ò‡CýîδÐCM*y]?œeàq1œ®=à¨Ì>xÞd?O-G¼®·²µñ¤ç¿òºáåÞ¿ï¯ý _ŠS߃Ø#”ÍÝÈÞc³7—½û9˜X'!yf¿ÑìfÝ;ˆg3³Œ0¬`ÛemrG¨^²üzë ÓãÓÉ×eI’ÚuÓV¨™Wk))5ü÷pÝ3`ÜŠŽâf~€)`â¸ÒÉê¦GñF¬&ÐœíçMÃD@«UJ¾k¶¦»Öê^ŠdÔ«©ÒmÞ~9OºðQ†4Â>…£”ÈX>®è8#c -ÿ^÷É - ŽM·«*T$à&N_Òò,j5% -œì_ØË\ŸŽdµíY|ï—ô(®iÙ˜ï÷_<{‚ßnSéÓ7T³®lpá/Å=[ü][Ë6S[ÑM¹–3$`êMIuÀØR{,ÅWþ¤”µÎ–g-ÿqjòIý˜=ßôY÷idᜒÑtR˜)¸zéôªóe;úOt+%«Àã†Ù²ÇÙWË7pž>\¦
ÅxÑÍŸ*L³bæüQÄ'QÛ\˜èõžx˜:S,Q@²úIyîÛIÿAË)i^í·’ê#\>¡²ˆ×k¸ôpÀ/ðânoMe™3²ÌB¤ÿÆ]Ò§F¿"Ûà5~·±µÐÇVS´Öþ,&Tqx`•GYú®F/Í âå=TЉ¦ê&Ô%³S¬À#¯]âëI–7•„ -öšûDG¹_×
óæÕõôðªØtx˜†&ÍRueŠÖï:FŸ‚sy.!À\Ùs‡‡k¯EÁ€Ó•sö«x×CíÕ<©t¹KrgÆ/Y4Žö<KSUGYþúÌôJŠ>•V«‹§K¯€Kb1¸Ž†¤”,M1}}AÖW2Œ…á¤ÊùÛ8x¼3tã×Ã3Ï<º›©¼U³GüÖ†¤|D‘‚ZÚD…ûú÷÷>Ìâ’¾ÃÁÊ:ºŸømõA‘ÚõØ'º\ÝöH+Ì»tô¤H¿€áÖNÛstàmœŽ'1LÞd˜Í8¿Ê!©£lÄö'`•,áO›>ÖSÃâ<Ú…Ì¢î±D»Lôyº*mpÐœŸUžâ™Jš:‘¢`6Í؈÷+ÒÜ\ñ2¬aÃUÃ?wéöÛ<ÚÊë4'ž’!lž¾T§brÖœ-1_/&âXcb®ÓiÇD8ûæþŽu†åfmk7ÔõvüZÏÅ¢ã|$bŒAnÕ·Íê…¸bQ&¢½ÁRîX[ÂÅѸ¶ ¿øE·Ë¬[oÙ¶žÚ[£Ê«ïÌw>w¦{3ÿD)¯Iÿ#Ó)°Ó'×J‡£ÀŒÏF™¡ã×ö£M÷ß4ÙËáZuT»Ø²n“€9DDt”¾ôb5Û1g8õ!2õ¬j<è+Íy"
$¬ï¡1!‰ùœ«l_.‰‰´—k3q,7’•ˆ³F÷F¹¡ï_z=F¨ïœ:Gß¿q€*F yDÓ³–R3¡ÞPaZ¥~CRœúsF]ñµ«†, -áŠD(A~«ÌiðÔ–Eó—1+¥^¨„iyÖ¡dõgVs¥Ý_Çë t\û¥[Vƒ‹¢ 㟞4Ž«EUwS¦€˜”ÍƵßT÷Ün¯
°"@æs÷‚Ù¡h B^#ÓÞ€Ý~aG>aLÉ uò§p€ºf¦Î -ë`H“@$ÕflÕ=nUúÕ5îÙù-2?—+{žj•ð¡Òj›W b>H°ÿØ…9ŠÌïh‹æv =f÷{fÕüVì:Ç1["rù”SêƒoÑõ¾Ç’€šlOÕ‘äÌ]ªãuƒ0êôXPðkµ»9Ð…Ø:ÿÖ‹\þ±Öãà–{áÍÜÒ#ú}B*Q½‘W¢¢´ž…tZ…xœêÆ/*ÖV’^oá?Z‘F
‰Ô7”:ã
øcj¿?‰zz1ÿÍ^yãývÍð¿\û0Æò±ŒÄ†]dqá=¤¿@‚Öº›3IoÝûÂ"Ãp™çMLò"–Îw»h=y|+Õ(¹2#g‰DÛkœþUhÉ«ýƒh+V2™¹,ÈÎ*MYcœ´ð¬äOæ~‚ gï.ícfÛèMM““!TêÕ6ƒ8 .ƒ)¡
éU¾ïmS‹"Œ§Ô°5”
L4ûöã¾:‘Oìc³5hFWG8sË›æs-¡ëûç";÷\¬ã2•„ys8‹×ªlºP²XÎL|¹©‰ü4ÍÞ̯v9êNvsr‰…Â+xCü>c¯Xç§Ë'}ֲ߱ß1TÝçu#ß2çÓ -+¦É¿ìÚÖŠ^Ú®/\—sjÇOŒ¤+G4Õ–¬¨9 -,Ù°U×g·ù;ŸÐôl"•R’uEc°VÁ2^ºBRA4MæÀQ‰ç‰¶·#ÂÊ€ó#Šh5¾;•b‡§XæD””gX]åF¥"yM…Y@ÅZéxaxÕ49ìÍ|ÑÞŒ>‹ŠçââD’ü2¼C%4öÿ/ô»ènÙt§ÄŠeýú2nš±t
=_~ ¼}RÉ~>Ë »a0¬n.¿Î¥µ#M
HöíTiCÕNjŽØÃsûÖ‘ýaç_ÒÈ£ÑxF‰“Ô
EG^Èn Ý=†¨Œr&ª‡C0ŒwCÀ“`>ÒUÜFæœØXîØ}6ø[·ìfÇ·fíŒz¼–ç‡ñVÉSçä‘¿Ôìi€ÐgoLúº¨6UtY–S
ýS´,ãþXppjIíWÀž8›‘ÊsÇÞwZ„EyB¦È˜Ê}°w9zÌ^Ù®(ÿ÷ôÈЩÛ<KäVÕø>Q/ÚÜ#ï×Ø·¢yû!«oø~Aòô%“#¹ö÷ƒ¼BzÁ˜»ªŒï?_"’ ë‘Úë?w0ºŠüvˆ_…¡"=%_U[Œˆ|ð<"á6ìZƒ UcèzA²¿¯5`¢\î~ê×Sù©å¡ïÕšPÄëŠó+™ë -1·ð€š2åªvÙz¥›Ž³AfWæ›îs÷óK—i&ê¯Ózy¿ðƒþ#t°ZÚ)þƒÝ6Ö -kÈä+>x‡ÅôŸåÞ„PÁ
EEo-B1ЦL¥ŠñãÝÖ›²Ö›ï{ƒÎûZq"Cöá±âši¨èbyÇû[&Èïd_†/ -ÁÑ™i-j´ã/¾fXØü€ßÙ(‡.V’+®¿
² -½JTàÇÊcŒ†úJ$1³Ù«B«“HûS•°
î{ƒ)E˜ï@Ä|èÈö,›G|8fäUÜêg¾dÊÊSðõÀPÒ”¬^Ÿ¢õ±ûJ#„ÉòvÖœ¶2W¡ýâVø~-…3RüzÌýÝ÷ -3Üdc
×›+°É'©z8údÆÕùÛüÌ[Tòw@ÿŽ¦žÍ…gM/Ù›ƒéFŽ]á,ˆø½Åžlx+d±‹
9²ðä~OêÌKC†«hMŒú%ÎvkøæþÒ(„¼MW{B%8T ØdaèÒ…`[Ô¥Ýy¬CCtt?èhîÑâðïä÷`ãß1>ëÕÙu•î$= ›gSg¸W‚Åw‚¾H.Þ¬¬_ÕLz£x÷þç…«ˆ9ú¼Q³:²sðÖ9v®A%ý˲ùïß¡ãë’!CÒ¶è‰)YXP›Äîé•1*A‹EöRSîŸùÆš¦ÿ8L?#ºOYI(¬c,F‡n¿ô¤@É«ïE6ÊPdw9^Öäv]
ô%cND·y§;£ÙP™äµQFaØ®›qF?Æh¿µÚëè-Å×›ÞË#ôý<ë)%™<åàiÙFÏ -{@[s0Ÿ"¥²ŽÌdbÔǘ–´EVðMh^±i5q×B2¯^JO
^Ìê£oÜ'‹âØL¥ÆdýT<“øê²fjí7Dµ• 1X}2†7›€¤c½Bbá/?ãÒIxPp%‡Œ©SíCÖ…“La2ì‹i½I[«E8Ššå½¸çÌ Þ@Âî\ǸŸ29SQTw*ÑB1ï¼Ðå+Uïh®¼Ä¡Ê/þ‘Cå y[üAôŒŸ#2‰oLú*ÇÇUqQ½ -ó|,šZŠK§ -J˜UÀ·~SsÜ1Á¥Ã3ûtâ’”§ ¿ømƒQDf"x~ˆîd÷ôM”prB!4¥”N½Ëïb«@äÒë³q
§àάAÃêÕµhÛ„Œ°Ç³8vˆti¤E¥ÌU$ÕƒF#ãlˆè‹2Ž55JÁÆû -W—‰ÊGo#Jܤ±ÐLê yNב]IïðÔfñ+ZMv‡ï7{ä¶Ãê‚øíXºžXäó½Ý‹`*‹Ò‚jpj÷´?+› -|B@†-›&±í
ä5‰tkfÏ?B~½b:%Yñóà6uΣþ˜”£LA®ªˆðÁëX‹ÀÌWÿªïÏ,Ñoðö»¶ƒ1´†Ö®ûM")ûŠ’8H_Q@)ÃûÌßj”Yã*Fô&ù2ÙüB‘çÇ.Œ%nåÁ\Û†_ØO˜Aê;)çÓjÙ7 ÊíåÛsoÒ쪰1¯3Yjè@á³fæåE#ÚQÔYï”zpÒáš×,£»e‹\nÆnCþÙPÛöXCƒ -Û .]¿1èf‹Þ$‰V™ÇŒ[óN<š?ÜY ætLçN¢“v} «˜&…yncú(Å:ÉZ£Ÿœî,Õ„wJo ØŸq”é»»2ÛÔŒR⩽(Òue†·¦³‰Â€D…%ô¿Á„Ä a÷uZG“9ì4éÓ¤uy Ù¡]&PžàfÌeAÔ>X õ®pøN·¶±R`ÿläC‰ÚHlÐ$ðô²NæPh7»˜ è›LfŒ¨“ah¿Ïy8
¨ã q˜ác )ÿ_~1iSÕˆC¢aH
”Ó‰k0zÉæ.@ÉÕ—Rû“µl‚‘¿R
§´ù½Lý¥tû(Iðd˜î |ëm´ØÿSáB÷ÈVG:ý†®§DÚƒ?s¼Úö˜ ÎTëýô?ÿ?ˆ¹×”-.ûdÜ7”ˆì¾.îÐ -q· -<Š´yçö{e¯(×6鈔I»îbyö„•ZA„I³ªÙÆç`¼ÏÎS¼^™AáRup:ÓäGW@-!Äø«ƒèÕßèËs=aË‹Ü'vÉRýl+}¦Á_¾u0 -Öÿ“^)~ƒpàÕ²ô*²ÿ‰sY:ûyé×6Å€$ŒÝº½Å{‡êÑi×rL#¯(T‹PÆvœ·Qr†¤óVJôkH0¥rÔIV€«´*$ã®/ -ëÙO³!õxÉRdíhÜ!] úãUK+<7Öœjã«/ªM;Ë>ú‘ÕÃ}„ý甂ÜZV -bù‰æ1²y†#Ö6yéRØÙ`sßUJ öà‚Hø.ß°›GßôýMŒek½„¾Ûº¦¥CŽšËž…l^§¿\<…‡6ÂK̹çø$‡’vçÏ
%hf¥Ëm°¥sô |G'Æ[fûý/Ša¥¬3µrž®gS¬Ê~9^éÈŠSìꦘÏéNÐó á¢M>À]àpÀ -䀚Œ5åèÓíöRŠÙRÒ -Ì‚StRóùa¼âæøïŸm+ŽÞ¾µ¬¼/†m@”«†fDä)”y âXDl_`p ˜3‰Õé"p£ ùÓ½r§à‡¬i3N€‚_ø+iÝ‚WQô¥ˆlò÷ÅK¯Ë.XÐ:îîÐ0ûvפ¹,aÑ;‰<e8“z Uö¯ùšÒø\j^íÂÖ"œ‰7 s.G쯸‘U,™Ç‘–ÚUõ
ê…¶,?àE jÏ2 -K¼BPÒÇMÆÍÖßx)<¨„Ó«à?j¨¨[âs£ -#!ÕŸÝS‰¾¡Ú±á$j',göbõÓËÍÅ!:Ñi¼|ÓÜîÊûJpÙ‘ýéÞÇœ*ðáˆR7¢O&½¶$nÄP$sn¢ä+ouu*„Û“A–’
ã†ò/%£¸¾älÛñËÔk|*“š
HîÀ²äk|ßm: ÕU¥Õ6ØŸo£;§h™:Á„tè÷!©N|çÊ?÷`~Y`¶VG?Ãça}4¨äIßž=6Î,ºJ¥ÀV9uÖ”!þÈjYA‹¯ÏdJõæÕ…2–ÎÊ/«âÖV0ÙFìŒù.}3}ä–Ü&q—ó?xúœ¾˜þsóp¿]×U‡|y
#çjr¶24°E_ôaà´¢u¨‰C¡^¡Óå’&BŒ‹‚•M}ŽÀÙz) Ü…tMJXŧòŽ©:õCbX(—Ârj´¶45õèÚ{,3¶jòWó0_±Žª -þ®£¥?]ÄýŽ<ꯞ'°á1ÛÃCÃæKtð(Õ‚Ã'%ÔŸ8“ÓM¼æcûÕz&CA3þ×E®rÒÝ,”BªyK¤åNÉ×%‘/);ÐÖS˧‡v!ï]Àÿ_›ÓdðŒ¶6ýCŠŸTÝçÌôûî*®¥e轜Ódv*LáOhfòÕúÓ€oMºÜ¸‡_õxB5(Ceõº%-n„ôVDÆ„ç™6j®Ž\åoÕ”ƒºB¬çýû[ÝÌ›_œÿr¸HÔ;6é×ÑðÀ¼!Çrª¬
±£ -éNÀÐq
„Ê•GÄ`“Ïx]SJãõ_ê»G1ÁmÃðé²]„5½R)%hÃ+Ñ] -we:‰¢}‡”ëâ.ðUöÉ›±-ÏÒõwKP–ŒxÊÙl×Ê´ Õ®Hi¸®Àð”á6Ãìؼyn¼ -#"±91cÓ…†5BZÌ¡UQ}‚Û’á“ÓiþçáœBpØ÷=:¸Œ=ĪÈÃýïVƒ®Ì¾‡¡¤ã<Å‘J*=
ó2",^†B;TË}Ç\å€S ´rV„-ã•£‘c?5ä圣9zL’ž1dpAP³¡Ÿ63—ó[%Ò
MD´j&z\%djÕ2žS)Ü‚í:cExòCU}SÄ\ºáz&¶ð,GÂ{k˳Ô:•³D"¸
²„?.¤V5’0_‚Üö»Hñ´é¦Èݼ+ÙŽÚñ#ü™ëÊ°øm;•HP^vø+ˆoo|ú²®Ë7¨õ$0‚b…çþç<nhœBmWf¡Áy°+‘›¸Uë«Ð-‘±ôwhÒýi‰›õž+æ/Ã={W¬ÎZð|,'‘¿ó#hQlÍüyïírT¶Ô‰ƒ"~1]¹²?::·ç3ÝÛ¨wÎC -Òðš¦}dÔF\•È]Œ9@òµñ…¿[¡Ô´]z›»•K½Ÿ³™µŸ Pù -‚Ï€oD‚¯õ!ä]OZg*µ@D©(ú¢é¯NVÓX.ò_šï¾Ü@Üú$4Ü"_=‚1«qÓTnÌhž¹ÈuÑRý -lj
»•ª nÀC›žFåÔã€ë(RX¦ðròÚ…ïØÈzš¹]3èm8Y)HRï˜*w;6ü-$9Ô7ÈbVu|sÀùñ¯ªã°}¨$\ˆ%¼®ËDq–îÑAÃ÷Ð&8Ýß«ñ¨Âµ”(Æo™;Z{ŠrA y¤÷>[€Äß‘yO(³ÿ®™3hwr粂ˆ¢†;D¾J#Hù]øÝ/˜[>@çÆŒt.<‘I×S=RÌZ`Ï3Uó%ÖÑõ,Á>!ßÀÄt$9·žÒ›Q6óâ‚:ÕEðµ$î£?u&ÌIßIUŒûÍÛÜ¡½Àý—#û&y- -tkR¦ ÍûÀVùŒ -+Eª0»¹§“Í3M‡rN?ZeÜÔhSžK½c#B¯š`”Ž+ÞÁ?í@žâM¹ÓØ%qndzF¯ðIÏE8ú£ÖÚ¥dó½ëH’›Tz]¾7]37Ô—ãß?2œœÕ˜`‹Óý5ŒVY7Žâv‡ébŸ -2ã$5nµD錥öI …5;£·‘³â¥œš½œ¹ÎœI—¼ŠP¶–z¬{çÙÏšÐQÅhÆ- [/µ/þ%Á4¾Ù^—a‚ªßvè¨1¡x™6LÚëI –œ©n¾4âzEÍçõ3ù¬ßÇÖ%r—±(×Ù[!yŒk»¬Fy›˜µ›e5kWâìŒ(¯(j¶Y9›oæÔjCBçO›ƒ±æä9?}0‹ÀÃÒéstQ Óútƒy QÆä*¥[ ~R¨[E†¼Íx#è{¬=6OKâ#s‚{oq“7ë[›¹<nÃœ!é“q’§€
%ã¼ ×$21Ó‚åûˆY£®ƒ;YÕjįb§E»iœs'hœüÓò -xá¢,FÅ×V¢u=;”ZØn†•îµ"ÊÖÔêvС՛¶õÝäa®r¿=Ia‰›qììY˜f ‚¤H¸¸ÃซqõÛ#ø¢tÞDײØ)b»„ -•±ÒAëågѪ‡Öö-Ñ©3 … -iâwˆ]SwC''/ˆŽ‰~ðs - -ñ 8þ~|²oßÅ3ôv<*gÅײî_ÈŠZœëÁ -jf«ÕIˆ7ÛÑt":¤Ê˜f÷ºá|¥Ýn«8ËiòÙºi=7"*ÆZ÷T…½ƒ Jœ[É©L~¯ä÷úxô|×ôjƒsm #ƒYmèu#Œì .¨lÝPXUòÑ,‹÷âÐysËÓJàläy¨›Èß¾gVmè|Yɺ™IÎoÆÙ¥Ã}xªhx R§ªœØD"áíñmóC/·Û]Ë#ìß’œ|rÝB>ý†›Ýe‚gظ%ÛâÂ¥FK#¼Ü -VKëÏ°@öMêhµÕ{íÓ«k -ýñWÖ͸uòóɃɋ,In“„È ÷úÏh¬Záßrž×wç3÷¡nã)8FÕ°=ÀËÈS¬‡5÷*ÎoÕ`!Ú\:âÀÉGàb¸ØÖ:*™°Wɬ)÷Ðõáñµ.Åzxï¶Q+u -ßoÕüŠèg|)¢Ý”+媀B}lzr}/LŸè×Z - ¸Ä¦~Vyg²åŒ¡°uÆJ°Ê×´fM-€8¥K¬Ÿ«äCËš,J½|šj_6R#/&]ääæ|e@¸(óã#š'ò{Ì¿’˜qå »|ð¹L¹¹j - -0ís¬¦¬×&0/¾Ét‹ÕŸóëå;”Û9t;ÎÑÛ¶niaóÀvñ~¶"‘_ŒNëÁÚGM] Ñ#·8-z;aaZJpÙ ½kš -²°×³^Kè„…žåÖ#Ö »*0N” u ^8~=“²BÑóCŒüÛr/CÎà-À;0|ûÇ£‡gÊÒMNÄéa`œËßwª@É#—0ñŸ}Åà¦Åÿ“[Ž5^3H¸>x«0Ò"†„TÛp» -ÓhÙ$ål$zQœ€ì=´ö‚1d–®ÓÃû"sx(Ú*1¨ø¶z,ˆÒ'݇v!²§ðI1Õ΃ñ¦©»g [ÞC¡ç1Q1SÑÄl»Iz_TŸÊé–Éü¢Í«¹>Ð¥GâÈ…¬oa¦Ý—ÞëZ¼êɬÿDW•¸¼‹Uô‰ù;VtWí½ªŒä´p€4oUû¤I67Â]¯KÃ%µôN”ph»ÈØO{ViÂÔFìË¿ú°È‹!”éH8-“¨š -:B‡ŒlŽgú‚2ºaÒ"¦¹?| ÿ¢
t+ë+ˆùR–~h
,“Ø‚_s -h<…È™¸gßW ¯@Wç™áÜ;_y"ÙCü :mM`¢= ã;òtçÊXÈê
~Ô“'–6Ç3mœÄAÛ÷1Á¦±ÙMæŽW‰¡Þ®jjÚÔ2ä,Êb¡¦³ÿÊ<)yh+oÕQÑv‘j—3¦‘„å&‰ -ÃGÖÏ:¾åîø§¡û2M.ˆºD7–c ùWkx6Š„N+§Ls£ÙȶVaŽkŸÓÜ øœy#‡-ôØ¢xofiRTÚ´µlQNí¸ÙÕULÓ‚Mæ&ò“2ç‚‹D‡u£®#}J¡4×pÚ4emØ -ÖVxæ]"ÊÕ=¤¿Ëós÷ç~ÿ—41‚ó¸%ÊO:F§£43†Y\ô¹³*lT¶Š‚Tò3®³¡Ž¨Å°¸n«¼AoœsíêrO¼±¶5åd1
¢~ìËQ¢¸¾»Æ)56(ù×ÖÂ<ìÖåZ‰G¬LQ„pyC¯gŠ÷).è1 οy™ëßáÖO–‚\7ŒTQ|§uÎC†wv#†ææ¤MÊØrÌ\÷˜›d†À¡f¤Æ1`ˆ×J8>ùÔ~ÐõÔ&Ø`Y£Í˜¡cç?›2¡e‰ð D/Ô(–+ÉP×½L-Íaž -Z¦Ûæûa„Ék6kUqèL£%hp—´rÛ° ÍèE–r:-ÃdÆÊHP:ì‡2;P®…ÓêF{Ư<Q,JšãÁ~ +¡h[ÅRN]~¾…L„ÁßïüÉíä-—Ù¥ìŸ -»áY€»}€cù‡Câˤêðq£þ¤ÂeSê]èûgÚò6\LÀž/*X«–Ü>ДÏ@ÏœüO©ªtºG©÷Ž’4Å%ü’Y×ÞöPðüid‘˃8LÖU/p„h[×ÿ1õ˜åô×îE¥JP(òCˆ¤‚§t¢8ꜧÝÎQ‹‚j%U×¼±†ÙŸJXµ¿LF-.=5†Oí~Ñ -\jË9gWØÅ."FˆmßÝÔÇ‘ÓßAÌõ|ˆWj
p7MÐ"Kc20ȧåOh]9J°F®×Ò‡õíTNì)mC\Rà‰æ8èÄЗ|- µÂ¸ÅæßËlÏB@\ë®4Ʋó˜•k™_̦CÍö˜T!Ô½\!ƒÂD×$×&miÀ槻ÁLÝ¢»?a|ÿ¤þë™ú*$÷¼66ÛëðÞºR¨p`N‹8¹Îs©2õóŸÉ×®aLç%¢)K–9CJN -iÿót:ùÃûxxñÍš6ïÛ÷ÄKZ·ÏlŽ¸ŠŒbd|Oá±–kË¥þÎÏB™E‹¤» -èlLäšOnRZ~‡î&I°=w¦}æ‰l§b””Î÷g ÅTÍ‘ûûÁ{Ë1LxméÌ?b†‘Ü€±%Öé]¶çÛ'$5ˆç
}~Ü‹{Á47
ŒCS +/Length 26225 +/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ÈŠÈÅdU +ü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 +€gÍý¬ÌV” C†û3æèºnMp»-˜…Z‘˜æj¤¯gÜ\}–ʈ}—}ÍšP«¤{}ò#U/ÉXÑ…€¼ðk¬¾ëÜVÐ<´eÁºµýt.<Á0œ7Íw©~‹A“1²Ù°¢%îßD?âÝjÑä¤[,È4ý© +ÔI™Èüíç‘,ª!Û^ó&I|ú,~C¼ð O¯JëŽs/)'UgL—æªöÛ'ŒŸKnõætÉËÁ!;ÙÜ\õýâÚõþ#ˆ%æÈMµB”j!ˆªÎŒ o¢†PU&ø’¿ß¹PÃ$Þ;Ž‘»w©*t!ŠêŒ„|Õj”1íw-¡LÕÙ—›ö‚ߎ…>ßË>#ÈQƒ›a"¦´Ú×5ù“97Û +Ïþu¿^ù5cÔÃ[î˜4mô–CÌb^Ûe m¦Ýìž88ç}gõi.Ó 6Û²¡{ÇÙº[·:±’‚~s¼r^®µ{×y"j¾À`UŠ2f5?+ún ¸ ¼â@œî׿…@“%5£shàî‚Œš¶{++¬#ÂЙH¼GH–T
l™!Ñ+PHÞPË9«·Ä[ZYIçi\eyr*–¨Ö{Gnðx*yçK ’„èD2JG«L¸Vä±èG6<… †Žçð9‡X¹;‹X‡ã$]Hñ8ÇR™¿}t%بêŸZ¥ +´êÄÐÓ +Þkvßèåà?`Hdò8Ÿáz„û%u•$õAºu™\<bxÂ0×í°–h¹ÚU\£ÑÈÖ{¥ß\«E²È²æx,3wר•Ù.$UÚr¸kÀrJ“»Ü$œ)» +'Þõ¹TÒktÊ1 ÊYµœóý–,‚Åw†Åáù.Ûå•OسÐ-Ž^ö}ÃÊÔ§4¼°…ï¿•U;hŒIv@™È8Too?â.i¾NFNû²O
*¿‹Ÿ9áäu7é8ã› +|V뛚¢”ø±W’\úyëªb™=)ÎþWàöûI¢¥Í|ûBŸx§/i¾Úæ3“"¬ì!óYº&4«?©eL:ˆ˜¨^lHëž|´XÁSº)7x}:Z=n¸Ö‚žäQÊü˜‚>›+Gr*|wݨWÔÐæ>zuÚÐÜHq…ȃŠ0?‰Ù“]¢¨=+ûfUˆb9TV¶54ç,Te5®Åj +–€í֗ݯUÛˆ¢¿ß$»Zµg-SÃ]‚.(#º™‡`¿Ât´Üæ 6¿mà¯ò™9M}§’ˆù'WÃÙð´£ÜNæÜ‚é§$# ÁIÀq¯¹ +ýl…;œë‚$#¥Rј'ûBYâSö JLjN·—“\ð“ë¨zå0y¥~Сª{úë#Òsa¢¸²ÆfÙà´ñéöªðc~ßâ} ]˜V42lï +T ›+=Ý"N¸F{VwÜ«Ýê'O¼o3Mk¹‘)&
Y)‘-ÍÇaÊgþÆ® +˜r]w9jr‡šØ[O§ÎéåMÍÏÞ@Í?éÀ0ÕíµDJF„rFhS[ͺ.ÆŠz¤9dR’XL +fÎ$Ë\nÞq94e#q0r±MnJïù»1ç5Gö> +ª *Aº\Õ@^¿>V1Ö†ÑîçhµäÀɱ~°ìj-ýflâÉL8D¼ÈV©§p¤‡Ekc4²îþÝc=´BªÔ"–¹² + „›šíwp ‹ÚjOI{4°Ø˜…‹VxáOR¡®TÈGA ì³+ ®À©„”À3ã×ËbÀõøϬ¸»eéj .5ß?.4?‚w1¤ÉÙ,ðà_–yCQöê¶9›«¾_¼pJ-G¥™Ñx¨^ð5xŽ“L¼<k-Ÿ>ðh¼D°A€'áO¶0„0²8t³˜¡hÀ~AÛ{ˆ&î)'`Gï^¦‰m½\‹HBõoW"Þ<y]7}rÈ“!Vý,U4.Ð"‹¹ Üw9… ÆžîôÀjìS›•ó™…)å’æøUOí›|XÚr +j«ˆ•Úý¶”À´.u-EaAB´=?`Š)/æúÂÆ=šöÌé×K¼xX¯·ÎŸÙ5½È}áÍŠ•ÛìŸZñf6nŸÛ2£‚õ¥¥gÕv/ð^€axe¦÷Êcé…|Q*íÎÅ>t.Äñ˜êò[Ê&G>¬šX>|¶F‹ÿF9ÈG: +}ˆÀu‰‡FëOðѾÒ`g!ë˶’Si™Ûs„×dŒìΈ”’G‹ŒÒ÷¤úPXŸ‘ÊX*òp¾š£µô†;pšX ¯»Õ䄾ÐÐÅ·.ÊÆ™³õK· ó§r±çÌg<¢åûœs§0œRÁãýËdò3‹Lqø%$ØDë=+¶X—¥ˆÚHï´m%¾”+pÔg2œÐSíÛ&ÛÆ’ú +ˆ!Ýkk»†“×ÉÇ.¾á®ì6Ëq_6…áNÝ«—6™T¶Sµ–F¦›–‰0;4Kÿ½26aþ2+Ai};bŸÀ‰ŒIu)I£YÅï“y¨)õ‹—VïEeõ–œ+e"ÑèËF ÏèwéV¹Õ> ^;"ZÀÌ}¯å®I„ +ÚŒW?ð9ÉšjgÄO¤¨Ê£%Oy-¨Ê¾ÆÃtŠÉ2¶”êy(6eÅF~!²×9ÞÕ=¨NdÔ_Èí]Þ[‰+£øþþ>»`.‡`ÔŠk™½¼CæêU¬ùôÃÅN²3Ë +Ú¬wî‘ê"¹¼|=’4v§Ù:¬)ÈÝ%¿Ÿë°yÔÅ)aÆÃ=Ax•qÊ8úçUûƒòM[iñÊŽBËE7ø·džŒ¿_SMé)7ç \=aY„2Ǹ,DôÝØÌ¿ðÿtöÒãž¿â K‚7Ö–ªëÏ«wV÷ž®a@¡ §¶¦Û£;4É™ÕÖYYøuzD×/e£*)£‘ò9fS$ 6úÀ÷ÒlE;ûrðã`Û¸ËCë*‰{•mÖƒºàÊ–Mx¥PJÇn7ß7Á±^m©Þ®;±ùM6ÂqN;Me.”·k–ü¸¿mF²jkÁÒâ¥êv„,Î8½ÕMþk´«Á5 ܪUôæ^NÁ&ºg3w‘²X4YeWn)•#~…¼qòõh¯jH¨Åö¤Tpû÷ؾö|]–öÎ…¸GxÖÀ´K<$L +ÔUñ`•5Þ +¶¾¨1&µwÉù|ì9UÛ39TQ÷䆹í| ¡Ã(=̨º; GLâ§6ÿãì¸Ì¡"¾Ž•w…B|(iïˆ'Å'º¬ú[7ô
¹r+£²*iÌÆä;¹E}—ûOþÊF\]¦l{YåAF=AD +»÷I¦aôIãÔ'§»ÞÄû✨œùZzñ +´afÓ´s!(ˆ)§é‡¸˜Š Â
Mí0Âß<_°7;3s]˜(ª¬Þ)JÁsTæû°€½F’§Ò“_íç#¹ÏïЉ¯"#(àÖ!È¢‹ù£áõDóòöÔfÆë"S§ÔtN'Þf~¥ê:#Ï¡Ú®“×5¬'9/ŠÅ² +1«¬Ù]͊¼аŽÎžl_ø)J%r˜#sŽ-Àë÷Ýà,Ó’µÿV¨ðyºoèLLe·rÝLû—‚f{ûc†lî %Gä·Ú÷<{ëk†¯¹ey4X«Þ>¹×¢ìØÀª"¬‰åLóp å4I»{lî5<o„îÌû4%s‹_?Y sP[ϱ0Êh5è²ÀEÎÀ—B]X´sd«3*8w†çñOSDŸkâHÅkd/t$æÕû9ÃÝpš®²èwm·Ù`×E¦mSû™ªf.þÝ‘¤ÐjõmïòïË`m•œyò§oURl»î*8 +©~ó lP}EH¦à%ÄM¼·¾t›t‡¥âÐ{cöÞBÑP,Ì6@–0®ª7ëSB¢sÐãiÃ]î“ +á¹×»còh¹ÂY!Ä÷Kο™x¤õbVÑÄŠéw‘q¢†BŸíú·\¦å!ÎïÖt–N´AGsƒaÃ6ö¥¬0%˜Y—½ãX*íUϼ.;ÆëÚBØåŸÕ$’a’ÉÅ/KáKv2zQü ÜIDîÔ”´Ö# w±Bl*sA™vœFûô¹êH¨ËWŠeÍ6«T¬GK¨´gÙ¯Æ#&¤'E¶ÞèÛƒbmAФMÞùpþÀx¼(³L½†^PÅ”‡¤•ã°Ò'_ÊsGÈxh4ÒçÝ06‰½`}‡¹Gî‡)U¦5u†=¹‰€®qäXZ`”…*ƒ}^Ý›ZÆËYÝ…Ô
ÀüF0j ÉؽoÑuo·àd¶lŠôæ¦|•À|ÒM ÒÐ$<tÒ;¹–®ö¿¾Þ~<€·j4uuþe»ñW¥”ñƒ£D9ovˆ<Õ¹çp¶Ö\g‡=–ã;`×_LtZ±É'òãó2MiBE‹À¿×jö +rÂWf¯(¾ Ê.Tsûœ$rG~‡ÌR)G…-ú²O2cl?ÂBüX CÇäd"iXćÏà÷ÈÏ:ŽDN +ä¶Ôñ{mƸM¯ýœîdßË +‹¬)Ì Ÿž6Ö=jÖdÃ;í¡Ô¶„µ¼n:_>;y""¸ü,߸藵’ðȲd
Ëd¨Q TÇëìÙÚÏÜ•ïØ`.ø|Mõíº$õ´#É*šö7 ´¢Z•—Ã^SúëVa=žBžk#UõuƒKVQVQJÕÞL§Q¶Å¡ïºÜöÞÖøMØ¥b]k®Ûý7>ݳd«,B?.ÿ@uÏD®3uçæM‰0).WòòÉÈhW'Vws˜‡×ˆ¢ƒ•\ +=;3؇ZÑíx§fÇu1{©‚qnˆé%Ñ)(Û+Ë*jóºpd±NãÎH¶›áóú E‹´Ø*ë_ªŒ®MuL¡Q°èlq±ô¦‡³ý4ýCÂ4Š +õgðeµ™ ýÙabÎbg›iÏRZkaPC+ˆrÖƒŒF&õ*4¥vè°½4ü`o²O¹Û•{6oŽ;ǧ5M²*ËË»mýæAd/œvH&TvןŠ•×èë§fè"W"Ô ˜_©§D´ß-ê{IU#\Ôw€18_1mGwÃI&Ùj™6j%µÎ‘4»o»R.*Z¼Ê…jº…i7“—n+2{'oœnó„É^*½mp`6id¢ýU•DoPþOz¯@@W7Q!˜ã¯º|—qu
ËNƒò,ÖÆ8þÉòê’xÅ“œ-LÂæ“š¤Ö,Q‘ݾŠY]ò:ú©s¸÷8UsÞð„Œ)ü<²oD¹B2 +Q9ÁïÕ@[E£©ë|å»Þ¡–åq¡¢ pȫУá'¨h æl¥ËˆxKw,Š–Z=S÷z ë‹TgÔèŸ)¸ yXɶÚj"С~Ù·©y¾Wjǵ +)˜Y?þÄô‰H;§#ËaY‹zv,„krÇ)Æ-¼›è™«Ÿg\VÆAÜ®ô×f-²”xéH9ØM±·‘úÕ¿)ÇDEðHÅ#Àë-WΈbe8Ôç˜y•ÛaÈÓ¶#„ŠB€s¨Ô[¿Ñ¬å=%*žÞ$ŠÞµmu|6$)!¨z°ŸøǸô†áîÊMÌ]Ê„hf⃕ðH! +Z_!ÎØÏ™P°‚ž§TÙ
s§ÌÛ ˆo{V®!(H”4o|ؤvIÒ†¹./ÔPÒùä³L6ŠH±ÞNÛ¯9s=Nâkûrë¡¡ #Ž™.|eìÀ‡Ú½ìðâ+}(|ô’‹Ñ<w–ãÇûpÌ'ä çEFeÆZ +O>´?ˆw]°÷¨Ãæ'²€n]*¼½ZX6ÏvJgv’‚¶Á=£;–ðO
½‘*-ŸâÝx>G(
†Væ3ÀamÔ{b|¥%D~!Ù;'½Xï×>Å{2\ôsA¢›åÖOUiCYxm]¦ý,+“+ÎLïûôcK”¿´ãOn¶Ó†2pÖh¿EßµWê¼Ý†a#’Á°ImǨÐ5<,”ç'—ÇI$º¬ªêßbŒ>"1^ÓZ-âáÛÝ-ƺ%·£¹¤“—Í¥’IÙ ÕÛzbÑéš}¶~Ä©âLÄ6 ãaÕÁqðP2´6GðâPx,ro½sayjñ¥\Mó8Ë49öÑ~q|¾^þZ:@MSAÜÓÕ}$\æý¸ú† +ÔSßõ}FÆúcþ„"Ã\|¯*)ÕI
ÓÔ–,õ†˜¥I" +n½ü.ñø*ì AÆtþØãR‰øæåUçÙ
+KùMg”m{·Hn-dðƒ +'´ ‡úÃi©šTâ¦a4ÛÀór4C{$ÐI™}ø¢Ù>a‘Z(žxSomgìY/àOêÛ–·Go<Ü;œö£~NCbŸPT{ŸíþBÎÞ×pR½P¤ä¹ÃV‹»MÿpžíÜ*¨‚]”Yè=¡zéêÛCœ£LŸ3t7_>&IZoômG‘f~•¤Ôóþ{àMßq;:Š»Åu ¦€©ÓZOk˜ˆ<´XmümŸãT`»u6J+kŽ¦‡+Ö3ê~ªdô›™Ò]þAO†ðq†Â…“”ÈH®è$#c*ÿ1^ïÉ’^‹ÍR¹aéc‚ç'JžÂF°úÝŽH18LVÙë`¨çòö«;nQRGí\vß]"zÊ°¼~Ë*¬‰@ÔàÀ°··¹K +ª`Ί‹šXN”ÀU?Ž¢®ºëÈ5ËXrB0n9½âà!§æ®»u*PSçoiyµÚÒLNöolU®/'²ºNl¾+ +z·ô̇oŠ%ž}Áwiô[ªÙ׶K¸pWâ^níåÛiíèf.\«™CÐ
f¤: l©N}Vâk¿3Ê[‹æ+>C²W97û&Î_lûnú6±pÎÈè?9+Ì^?…ö z×û±·ÝIÉ*ð¸ãEu…nÄsA´Ç×ñ^dŒ–kC2^FvBñ§ Ó¬Yƒ¸†|óIÔµ%y$¥Í•Èƒ’¬¿BPÞƒúuÓ?fÒrJZÔø¯e¢ú +WL©,ãõ®<ò¼z8ØAÚBeåŽýAf!Òç.P£MX“mtŠž¼ßZ‰^`«-Þè|‘ª<:´N†„¥,ûP£—ærÌö)ìÆFSuê‘Ù-Qà‘×® +õó"KŒŸIF€¥%(³–_@k°„ +j-éù•_"R§‡7D.àúœµÁK`RŠcàÅRÓ¶µËê‘V¡€Â‚¾±Ð
‡‰ŸV':–ðê$íôÃDgènº¾Í·ìM‡k/‡&ŽNYúÞVÆ3‚tÓ¾Ýæ;["Û‰`Ëk•¬‡~bŒók-<ÓLÄHsH‡X®¡Ê%¨};É„ÞÌ“Äo·ç™HV²[]û:ûýã÷ön±Út‹©¯¼€ x-0å¤ò3(×|–¤á#¸Úª$xœ£“µ[=~©øwBˆ¢ÞЦîx´-«’Â@iaéLß +–qÇÙ¶â(ŽÇwû',»_eßùÈvôÕÝU]wùd}ðy0=˜$IyO›ÍÈ€œ=»U9e~5ÉŒœ¼uo{´Ñä¬nEhÕkPía˺OoÑQ2úˆ9Ôì&\`}ÕGÈÔ³ktð´bÖ¬5‰\5°ÀÃbC“ +8×Ù¾]“’h·À¯6æâYn%«çŒò2Ã>¾õúŒP?$8uŽÁp + ™ðˆfd;®"¤¹dA¾£B·KµAPùsF_óuª†.áŠD*Aü¨ÊiðÔ•Çð—3+¥]ª„kyÕ£dfÕp¥ß†ÜŒ&è tÝøgXÕ€Š¢ ãŸ6MªE×ôR¦™–/œÅOtÞÖôÝýÙbE€(àºè±GÑ@…¸A¦½¹ûÆŽJÉìÁÚ ˜‘êæ§p„¼a¦ÎïbH—@$ÕflÕ?îTù×7íÛ|¯œ1¿T({i•ò¡Òj[Tb>J°ÿ܃>Ž.èh‹æ +v¡=åze׶)ö\à˜¯y€Š|É)
Àµêú<`I@Nw¦éŠHræÔóºƒuy.)ø·Û‰Ýê‚í\üèG®øÜè8tÏ»ôanퟒJRo╨,ëE…cc!U!ž¤ºõN±“¤×[zçQ¤QC"5ä
ã‚Ê|7ù9s0˜L½I½\ðî §¼õq·aø‹_®sÅ$Ö꩜Ė]dyé=t°P‚Ö¦—3YoÝçÒ2Ëp•ç]Lò2†ÎïOñfÊäNªQJUfî‰8¶÷$ý›°‰¯öOv¢8ÉæòLvViÊZã¬à¥Wf¥ +<”â×Ҫܹçò3¼+çÓ2> $´‰G£éœ'¹’Ž¼ˆÔ +ªwQå\T1‡`ï–*!7Ñb¬§¤ƒÌ%©©Â+¨÷|¸M·äv×·vã„z²Žç§ñN4És÷ôq€ÔüY ÐW<o9tƦ7°6UL¡y¶s-ýsŒ,ÓÁDHHZiÝwà¾8›5‘ÊK×>8-²¼ +!STlÕȇ=f¿lOtÀGFFTØÌ]¾Žr»j€¨7mÞ±Ï[Üû)ѢÈõ|ÿ`yzŠöÒé±<‡‡a^!½Ì=UÆø×ÈÂúa¤Î†¯=Æ%L€®"¿ý%âwQ˜H_éwõ#"ÜH„-»Ö0PõºÞ¥@°lÛt´+Ã=¼~•¬Z>ñ~)E‚®8¿’…@ Ų!tiv6diü•â¨n©
J@u˜$íoá}ÝÉ–i3Áñ§EÊ®äK„o«9
‘9Px¶:lrÔpÊÕ²²`¸uÓ/µoî’h±†™º¤Õá¤Üôƒa30 ?GÝf×k!{h¢Ræ×;ì]OËÄ(«‹ž<üÓÎÃijW$Ä,=
B‘Å)HS†b@‚ÕIw´«–¨;¬Ùlͨn³]]CþÃzÃÅH4¯9¦d˜«çï¡~¬ˆÊ \ES ·Â>VjPÈ7³ßtë™LËYýUå€(ÉxpЋØÁß`›¿ÃTdߢ}éøO Éñ¬1°y°‰¼wx;l¦"–SH{ïÚË“°ØéÆÛ'µ‚ ‰œõO +‘xÑ6@·î“ü <SË~m!¾áº™Àƒøu’°ag¥Þ¼ÃæÚ ñŠw“ë•Î2zB•CÜ.7`˜Uy̨²Bzx’qê/›ä?º—d¾¨¢
ѧcŠA×<38æª"<ž ‚õÆ—½ +;i÷¤ð =¨?³F‰%dr,¯Ô=wxŽ$Ì„½‹eÐQ˜ }èax>,¢RÔ÷ÕüMoÖ+&Dù
={ùfs9µ¨<|ó\¡Ð’0së·§!Æì¡K^j1®!çóã7ƒÂF!2ùš/ÞQ ýW…!dHc±g±Ä{«£Pa,†S™"GÂd¯Íçe䶬ÍöáÇþ°ËV¼Èˆ€CaDÜøçf:*ºXþÉÁŽ)2Å·áV׫ÂPHLVz륚íä«Ÿ96? Í2åÈÕZrÍÍ »È»Tn¢"Öhd T3‡½:¬&™t0M ;Éà¡?„R„ùHÌ÷ŽlߪeÌ—cN^Žaî[¦|©"ÏP%]Éúí9F{ ,R˜,wÃy'kÊ?Ázï×J#ů§¼¶7èÑf[ØÖ¸Ü8m>é,Õ£ñgsöèîǼ–Ÿ >¢’mƒ»šz¶‡–œµýdïŽf[¹öEódd@â?õ–ûn±áH¬‘YÄ.·äÈ"R½¨³®®c41V8;MmàZË¢ò·ÝHu0”`QMĦ‹Â‘.;¢¯|í/âcbÇóŽ—GÛR>BŒÛb}7krê«<Hú€·Ïg†Îq¯Kîý \—|XY¿k˜ôÆñÚ.ŠÖ§ rõy£çu‚dàlríÝ‚KWe>À¡ê“ƒ BÓwè‰)YXP›Ålè•1«€KDà©)ÎýâÌ2~eœM=¤®%Õ3– Cu^yQ ä7ô£¿˜e*²»ž¬js»¯ù‘1'¡Û~POœÓü T™æ·UFaØŸsA?Áè¼³Þïê/Ã×›Ý/ˆ'xû:ï+#™>ãàiýƒžþˆ¶ âh1CJi•ÅĨ
0+íˆ ªä›Ò¼fÓjæ®3„":b^¿’ž¾>œÒGßzHűI
ŠÍ2‚W<—øî±aj4Dµ“ 5«\6†3Ÿ‚ c½Fbá¯8çÒIzTp…!‡ˆW@Ö…•Le2ˆm¿MߨC8Žžç¾|à̤ÞBÂîÞÄx˜1=WUTw.ÒB²è¾Ôç+Sïj©zx¡Ê-iSŒÌ¥ŠvÔ¼+ù$zÁÏ™FK0&}–ã㪼¬Y‡~9M+Ã¥SÐ%Ì.äÛ¼=éšâÒá™>uMÎWÐ_Jú±Å("3²8Bwú÷7Ôm´pJ°B4¥”Nƒk[‰urÙÍù¤†sH÷Ö°aÍúFŒÆ]bføÓy<;X†4Ò²RÖ:’êa“‘qXL¢e9G膥`ÓC®%…›ëTÕ“PnòDXup<§ÛÈž¤ODZ‹ø5¦/»#øí>¹Ý¨€º ~'–®y×âSï2ˆÊ²„´` l—Ú-|Us¡o(ШUó4¶ƒ¼&‘níüÅçcè¯7Lçdk~Üæî…MTx€iÊL1ĺŠœŽõ‰4Ábͯ†Á¬R=ÐFÿ‡ hC(íú6IÙÇ0”¬ aúÊBJiÞþv£¬zh7ùp¢wÉ×é–WŠ|WXva,qkOæê¸ü¢AÂLR¿i9ßv«!Uno¿¾Ó7…EýØé2CGÊHß
soo¹°®âîç´ÃÓ.·ü‰XÝ[ä +sŽ[ò¯ÆºŽÏ ZªT˜Fué†aw;ôfI´ª|fÜÚâñ‚ÑîB5ç:ô›C]Åt)´¨[³')Öá(Ö²Xý”©A8çŒFŠƒ9'™ûkóm
Áh%žºË!]Çqf°pPŠpÛhT€[LœPv?çM4™£nÓMZw ×Ð]ÚUå)nÆ<DíÃÐ0ŸJç!pºµB‡#_JÔ&bƒfç×M2ÇjH@§ùåAßÄt +Ópd½Ô[`çCDîãY`=O¨ã<IÅÿò‹I‡ªF<
óPZä„N|£Ñkÿh!Jž¾”Ú§x¼¬ÃÇ`3´üµj¥mÛ*õ·ÒÝ“$Á³a†£òÑ*ààw¥+}ü[=5êÔ;ºžiþÜÉzÇS^ dSuœÏóÿüÿ,.Ä2lsŽ¸@î³ñÀH²Ç¦¸c;däýHŽˆEpcæ2®ªÉ'ýœ²( HñíÀfº6¢~ãÍè’6yÏØlêÖ¿Œ·ð‘®ª_0°—j†BƒLgxN†N¼¸4tãr&ð$Òá“×⳦\׬#RdBÚsdz/¬Ôü(Lš]ÓÄ>º +Á¸ç‡ÂúIo>¢ž Y†¬ƒ;¢+A²neçΚ[czýMµm/p5@?¶~t€pð’ºF°‹[Ç + }W—ÔÖ¤í®dÏê3ÆÒ‡¿$ºÕVP› øÅVc%3¥@¡íä&žH˜.ÀýÁ6vÀáõ£…z…BqÛNÉš›2•TûD:½õ®àxü\Æ/(tùDѦ$C‹%Ð}B–ÌCÀèçQÅÞ§ŠµHËÅL9Ú~[[f︙¼mZŒ=6% Ù]NÐu¤s0E‚ÿYð»\I'T‹p>̵†ƒ"H=‘ª-ùQLO*I!P9RÖ°´ +tE$úoÜK‚†¥ocÙÙ E/¥ïµ +žž3¬ªA9^éH_ˆÊ3ìšæدÙnà‹)áâm>À}ÐhàÄšŒ
åø3ÓÝŸ•Tw²•ä!l}òrû´žMßÁž}µe¤Ä¨(ÔvÇ µþ«Š ÉpÝ8})Z¯ìfä8»8Iƒ~±žH.<³»k—Ã¥ÌdÕ¹<™Xð’hɤbÕs!÷Müÿ´/$¥nŒñIpƒR{Ä„'âcêRIÙ=\XÌDçl„ñÙ7<²´-œà SæÞ’ÇVûñâ¸bå#É^e‚ÏÙþ*Y¥µ +÷5bóWŸüÕôt³C9D$š)I®«K$j tR(PPÀ"“‰ìXjÄrÍq=L7Dã`f*n^˜ÑééÍz˜`ÕîÊ_Òºn°u|ù5Öe3Œ?Ä‚!×J„·LR8“*'²¸¢hŽ•ˆã€AŒe~ô"ž^'Ô®qiÙ&´fˆÄãow^xvÁoóÏRvÎ?îè†÷ÖlùÑ2ú«4Nc|mOdòpÝ.#8£²#îK²nd¹!6Hßçw¿Mï;ž†‚ìÞ BUuו€‚CTl®´ÔZ¡ØlAi!Lëö.¨N«¬œÏÂðNÕ ÷?õaØÞ&.8Gq2x4Sâ@ò~ê–œ%´Æj¤«¦³úN‚Ó˜N SˆWVµêYkÇ°¬5²¥áŽ¥ôbûz\séeñ½kQZy¤h*Z–E(ÚRˆ3Fè~˜;ã|$ªÓÃ[®ÍÖ-˜N]ˆÉáÙP<|Å:³èôFÎõSº6¾Ï,)£Tÿ¨²š +ÑåêB:ÃÖŠ
Êx$To9@H¸%±.¨Ì~jô&+A 7—ê³Óê®ãOºQœßÝÓ¼UëªðKŒGf´Â8Jý?âá~«¦°,i´KRQFÈ:çZÔ²öhÚO>Oɽfx‡2ȪA™`dµjgÞqÚþæb[{e=?_)ºüDÁêÊl[TÌ37Æ8)Ñn+àAíMõ¨Š"z´CE'h˜¹BÅQqzïªö0|#aÄ—loàÊ—v’³XfŒ´xè@—zÁÄJ/Ÿa‰¹2ŸÝ¥1%~¬uÂ…ÚÐ63íè4(ÖOHv´Éã‡6ø‚æ*ñ;yŸÄp+íKÈG?üþúI‹À7 \sNw%Ø’‰î;J¸To•Ö!NÉSenéN†£²p¬î“‹ +4úWM‹~©¡CÏßÊÿU-Ÿ}ìŽY¾†¢á_±@Yh€íu›øbÔnW,ø”=ízt<îKfp¥]“ŸqæÅÞ-3Æn’aZ|ìŠï|=AW?~†ŠŠ¬‘-šë\ïb;üšsî¶j÷Žmùé4§xßîh&ô¥ü"{kƒ³é|‡l#g nl+Ï7#R±´Ö>õŒ™Y©âeë:@³Í¿xçc…/}RÖ¸g´µõIßârÎëýM•4yþ^Ú'ȇ·ø§–ýͬ&‘^×Á7È:6'ó'r2!LÇ1¤Abw>ñg²*¯Ž¾O‚Gk(9ïu +%¶íV,ÜQòQÛÆtäf‡ÅuZý~J´A{3’ÀJ™‰&Ð0M\ý\¶XÀö1S¤³ô;5¯EaÏôJ0·/›Í4j³} +eOLÌq3©¶Ô}ÅÂù„× +³ÝMB®Oá÷£…ˆ¾b4Ûm5Ðo{\ˆciÿ™ÇWáÿ3Î%üg©çŽŒ¸Û¹J…QÒ‚Q
]¢À›ÿБ:™¾††4§VõÏ_$2}Y뤩ØÝððÙ ÿ¶cÚ¨"yog2ÃŽ‘} º8SJ)ì"Ko™†øžJ/ Æ´“+b<7H @,U¸)‹}ȼŒë§ü`J†g¹÷ûŠ¡tm +…™¡é*®ïÏZžx;À-Ïåìƒ"ïÚ†ùòù·)*¤¥3ËÚ^ý=äÜúP~Ø.†ÜTË‹ùæ(Õ¯
^þkΛ±¢é¤TrÌ°íåZãÒm5Xî3·#xæÓÄ·¼+»b{ÿÃ0œ}-å1˜Ë¾•áQÎÁz‰Â¬ÊÞ¹tEpyIêY`à7¢K KÀ½1«Òâ ++aëØ “)¯[L’ïµ' ò+Ÿ°Ÿl‘\ñ™ÛtôÍ<ÌÖëwÊ¢bð59Ð*ßCdŠã•Q¦T¹/®¬“¯}%%§º/»ï³t.fÌ
fMÚ˜Õ]Õ4}/ ÃÆѾ9ÿ5$ÉýÓ\úP/eë1WÞ³…Óv`ÓHT»Š@NùÛèjÔø«Â2¬ËXì^â{ËÆmô«—Ä 3¥è)Ç UGø:ÿ‚|…o?W6Á~ÇÈ!]ØâgÆ®±ê3_áoxFP²¾Nµ¢CŸs|’u(ÙR«ãòâü)ÞNcZöÒ¼°nPF›‘úâP‰6úÓ(1êv¾o*ï›”|QÐù#$!4SzâS#Ž·uþI6Då%3פx{ˆé´¯KKÁçÌ®CÌ|HuæË‚Þ +mèLj¿I¼Äyê4¢“xC‹´¾}í_dšÈb‡a¼Ð˜,ÇÁ”jÿ»¡| +ôÏ™¶ôúû¿ +h?IOø¿{EÁk–X4~Ôåqp„DuNLi’ã¨L’¸œKŒ}ƒ—Öxåp·UÚ¡e=.L,¾uêÀ±Ó>Ø6¶Ëh
¾I
©¥2ÈæýkæYל2oíˆ6KîØà|ž ° +4£|í4öî
#a`ãåƱÂcJN¿$DÁäÊ:ß÷”¶Sù¿š0'x\n)|”"<jÈàlZñL|ìó“ ¨EëhÈ`TdÈægòㄲ'{°›ö…`*ÌñN¦ÈKìí111—Q'ÁX¢‡^¡8fŽ$°}d+xÑW_Ìñ÷õ•Â
Rö>ü?ëáˆò$ƒ‚EÍ›z`…Ó.´ïîÞ9C˜Lö*¸`b@åMlå½/O‹EW9 +¦?Ä›Q‰ìó +€u“¶o-ռζÈFE£ð.åƒÊŠë>{‰*¨òwµš°s÷ãÁ±A +Ä¡gK°–jྤvÖ?”lMöV([®™4úÊáD3p½$V¶Å,t‰#”ò·k¼Í_y´©¡4A{;D9"š;ó;ée$X|9T7N®åüok½µÏÝ3äñ= àŠŸœó,çPzìýªk,AUóÚd¢`VX¬@a!G»¸¬³^„žÍdSïÄâzy’_W}TkÓˆ}¯µj,BMðî´¥{¦XS~§aN·¶®žc“£Ô‘«8³s&ëÊ‹·Å &èñÜ”?äý«>ÀÞ×]Q´®óP™Øk`ßäÕÝfû®‹Y×Z«ruì=È3€1\&ÀHCNXùlu[80ëFÝŨïØìNÄ]© +˜%0œÒAJ^ý´¼%¤w}/ö‡î²òAæìQæãžûnúéùÎÕŽÙPÒòçÌÃzÈ/Z;ž)\x‘ÚìëÖÞ9”U.‰Ó_>ò_øá5Uûc-@6
QEæ*D}X2a/GúGc1§OMc-Œ¾2å\¶ý„ÆP¶ó2¥‡`1”{݆àYšU!²TQŒywµÄB´¶BSÒhឤ2šA1±3_oyPüTIŠ¼û«õ[»TW”—¡6ŠÅ~u‘#·ëõpmðI„#³ZÕY$Øóyø2XõþÇ0†¸-{ñÍ·¾ªå¼2ñåÐèœ/ûY-T !ÓXÈ`lgÀðß‹Ù§¦ß +_ÃýS‡µ )1ŒÊOesLQ² +Ôqµwˆlød{ŽÞ‹t¢Þâ+ïí[^.\1}
)ÃÌÚtú¢à›%×ùRO|cÇŠˆ?ô€L]£µúem˜m…pRn7+o“Þ«¶›4s·Í–çë:yÊtôÒ²
ê+ã\æ—‹HöɈD#|q™eѺTÀ?È6@å¦}Òú”¶¢§†ñ®ÐJÛ?ûÝ( +!N™<‘cÞšó¬1¬ +Jµ¸Q +¸* ÞNK +Ä'ΕoäNïçÊòHª,—üw*»ú.|¶0ÚIÐ ž4[Vƒç›-Gy2½
û{(b'óXèŽïÝÕˆYzåeø’ºkSoðÕzN +…Ï\{¥?!݈¿Q圲,é“Ó{Ü™Óó½%·‡ƒR™ØKY,áëÎú¤ÌLŠšàßÎÐc+t_5ñ‡^€¨aà¹3n<‰¨t6.ôÌö›Šûƒì-w\£ÐZÆ.ž(¯íôúDÀëôèT!þYÑPêÒ•m‘Q•ôƒMƒhØ›‹Öš– Z¿,ÃCó +ËÝ@Á¢gßqìöD€¶þ¸µÿO™ë&Ñsu€r“·NŽ¸¬¸Ü/½à=Nº&F¼«F_L-C§ˆ}yï=]Ií˵¦² †¤Ä,Õmza®4@Aĺ@q‘s “†D(7–Øuç´qçGªw=cPÏú#ÆÅ·¹ªËPl²Uø¾d¤GË^ôë/mŠ¯,¾RÁ +¶Èãé©t²„4å¼Ð½”n_0gþZXßåì…×bKÀ!È*Š¢Só±[¸ùq]²Q¨ù +R㻯ÙQôÏŽ}ÔZ—7“Á ¬¤jžé
ñ"FOiŠ>?ÎyÛ!änQT)Æd§
Õ©Jü[—p1}àn‹ß¯¶ñˆ#ªU{¹SV}¿W†yT¼"~,*0W‰™ý.ÜXxäݾw‚”ÕÏ#hïyª ?N8,¬Ÿ¢Ò‚÷†—ó]ÅŒPpFÅKÕ~G‹kýjÝ¿þKIÕ$õºÁÞº©‰uVé¡OýC±ÉåMìi ž2C´gyƒ?’ËvH4åËÌŠJ
ÂCéØK!ÄÕãþIêf|ÐÝþs/ô³@Ä:÷8=]׆ËlÙím1qGoi{tÒ-3î.¡¡¡)òË“–š1®”9c¿X;È:Œ5ð4‘t# `bK)qA¢
©˜æš ›c´5ÁzZ1ŠÞÖª)\“²1ì×±u27Õ@}}·f RÙáÝoW9Ç\P¦0»EÆ}UB%×/y×—¶¤^â¡26ýù,bÍŽóPI2ƒM<¦éË:ª‚ »ûh¡1¢Yâl8.ì4„ãGóqj#ÊÑY +bJÁœ>ZÔ¶X-wJÂp²u©âÆ0S§±sª3KÅæóì“#‹yžÇ¶÷âÙØn¼ú}åÔ\C"…}ñõkRO‘"ÆÉصCŸ°Ç&î—»ýl#˜LV¢n÷‘¡ÈÀ)5~ÁrioΟeÓH²ƒ'¨ŠÒc~1GÙÏVÛÔ&¶b®Æz†(óÞçy]µu9Û³·ºSß<ñ‘¨¥ÔÆúµ•†Š·ý]n>+`½÷£¯´¢w¬lŤŸÊPh;w#7Ž®vUsË0 ÒÕ1©HÖW¦Bü0%Ï x4î/ƤúEGû ¤y+Ë(§ÛH·ïv²x¹1=›uBCpƒÉŒ5¾ÂÇ™Ò{A•0žÑ5'†:]+³lYô9²Ÿo
Û;O%í§æe½;ió]…J.Å*¸½ÚWféë]šÆ¨’IFD>’!(š
9$˜Õ{è{W»‰êå|rg,fi©†Yœž›V™êkS3ððŠ³Œê£s(h"ñÞJÚ¹‚ërG×ȃ®Ÿ¦Ô\ãûö!]aX +=ÄWDe1ˆ¦H”L9ʳ‹Šâ(ÉLU~f
3Š^ùž©DÃUBAB´m0Ap ÿØÁ÷4@-ð³ÅÌO‰D^¯-;<BÖ6÷¨qs LâãÔ#½×ÄoQ,Lñ¹½ +A™âõ2ѶŠŸÓ¶Äøí÷w6Ê+–IºÓœnµq×oúWïkN)ï‡mÖ8/1aÀÈ[ø'! ´ŒÄPxÉ¢rB<–ðœØEÔ?Pr|7°™2²3Dá ÄWUOš9¬hÓÄ5@)NI´°›s0ÇÖnŸ[fö½U¹fHɸ>›»|¾¸¬{ü*ÄØ*X‰À¤ø‹Ã’mdñ„]8Î̱r¯éúë$Ÿ5îyôÅ1™ú&àv(WØáñªLŽe½pò‰õTàb{´ŠÄB!ð¸YRE!ɾdä\ÁÔ| +Äôò} 0á·Ï<ðx׳5(©²ÓÇXõ̼‰h8L©m¢Í°]ºÓŒx$“ +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 +'óP4I×¥ŸÐ?`b¬FH.÷R}ÿÀ#]«iÀAñ7FÌÐ5øùq6O‰Ç/êúWbõÑFåq-¢´ð
§]xžök%˜Ã–td˜¯‘ŒÎ¼r¿ +ä&oH[œ¯A•9f endobj -682 0 obj << +714 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1932 0 R +/Encoding 2007 0 R /FirstChar 2 /LastChar 216 -/Widths 1946 0 R -/BaseFont /WJIPZH+URWPalladioL-Roma -/FontDescriptor 680 0 R +/Widths 2022 0 R +/BaseFont /BKPCDN+URWPalladioL-Roma +/FontDescriptor 712 0 R >> endobj -680 0 obj << +712 0 obj << /Ascent 715 /CapHeight 680 /Descent -282 -/FontName /WJIPZH+URWPalladioL-Roma +/FontName /BKPCDN+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/emdash/Oslash) -/FontFile 681 0 R +/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 713 0 R >> endobj -1946 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 0 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 ] +2022 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 -657 0 obj << +689 0 obj << /Length1 1614 /Length2 24766 /Length3 532 @@ -9578,7 +10022,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þÉmfaE÷ϨHØšÚ0Ðÿ›ÝØÅþ?|®&Žÿjù?3CñCÂÀØÎÖÚƒÀØÄŠNÖÎù'%ùÿ›Ê´ÿs"ÿHü?"ðÿˆ¼ÿâþwþ·Cüÿ{žÿ;´¨‹µµ¬É¿6üÇC MðÏ%óØXX{üßÂÿ{¤šÉ¿qü¿¡H8ü4BÀÖìGzZú3Z8‰Z¸›Ë[8™˜Xÿté_v[cGk[“5ÿÕHzúÿæS6·0²²ý§í,ÿæ2±5þïÔúq:eq!%qªÿó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þÉmfaE÷ϨHØšÚ0Ðÿ›ÝØÅþ?|®&Žÿjù?3CñCÂÀØÎÖÚƒÀØÄŠNÖÎù'%ùÿ›Ê´ÿs"ÿHü?"ðÿˆ¼ÿâþwþ·Cüÿ{žÿ;´¨‹µµ¬É¿6üÇC MðÏ%óØXX{üßÂÿ{¤šÉ¿qü¿¡H8ü4BÀÖìGzZú3Z8‰Z¸›Ë[8™˜Xÿté_v[cGk[“5ÿÕHzúÿæS6·0²²ý§í,ÿæ2±5þïÔúq:iYi!ªÿó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Ãë–aIzQ£Ø`{1®ËÊ›¡9sõ‰ór5úË<#¤=ø…ˆ´±36…è4Ó+òŽÇ¾a‘Ïp:‰é"“|:[5P6“Ó<M`IÍÍÍLÕ‘˜‡‰ŠŒDa_gÁ¡Ãœá½]é–§ 9ç8sêÓšÆô e¬bô:miØ*N±«z|+hytHOÛV77Ùa‰ @@ -9677,541 +10121,605 @@ Iö×~pºóE¦f}^!˜tQ°Ù’‹ƒEäì>‰ n|'ÆV²5D9_äå‹7â̬FJvõ˜2ÈÛŒ’ý;Û£K¿>Z&ú‰Àš¤þØɉ, y‘üP'càÜ^M#R°·ñÃ4
{LJB«œ»×ën¾HïŸMc–9|þ*S5ïV®ñKãÁ“üvÚJ¦‰‡’à°áR‹ÁPKw©ä;ÉͳðåH-ºOÖ²ÉâØÉ*Wü—¼éýšö•p…+èó®a7AÔºº;˜âR·~4ÿÕ|S®‘mƒ®W•~ ©Ãâ‡}DL×WF5J‰åéØ|¨i÷>#\2®˜ šÒ30D”€`Ÿ†§¾ç4}&1xÒ¤Ö¥ ÎdP•Ý‹$ȾCO‡Ù’jÛvëö?`C&W'aÔCJ•I'sŠFðìM˼k©¡¨»°+X ŠcAÐÀ«á¥£ùr!<s%!ÈbˆÀNÑ*d3³Ê6†Ø0´+3ïÍNYÀ8îj•ÛP³7Þ¨VäÎc=$0€Ž9€òõ
«£…WCÒ¸1å
Ô²9L±ž±~óŸ–äWÚyüInÐäöÀ'¼I3
ú]`+ò7vÃÝ!’ÔËö—k«Zœ–(&4¨j„¸`é+àpôxÿÅë«SüWâ$åM7ƒ[IZÒýš®ê~‚VƒÍ:Ø\é«…Œ€Øy_à£öý .ÈëÃ6‹û¯™ÅSßcŽ¾Q&É5 fd -ön’“,6"”@K;\ÿŸÁüø¯ +ön’“,6"”@K;\ÿŸÁüø¯ endobj -658 0 obj << +690 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1932 0 R +/Encoding 2007 0 R /FirstChar 2 /LastChar 151 -/Widths 1947 0 R -/BaseFont /THCASH+URWPalladioL-Bold -/FontDescriptor 656 0 R +/Widths 2023 0 R +/BaseFont /LUNULC+URWPalladioL-Bold +/FontDescriptor 688 0 R >> endobj -656 0 obj << +688 0 obj << /Ascent 708 /CapHeight 672 /Descent -266 -/FontName /THCASH+URWPalladioL-Bold +/FontName /LUNULC+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 657 0 R +/FontFile 689 0 R >> endobj -1947 0 obj +2023 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 -659 0 obj << +691 0 obj << /Type /Pages /Count 6 -/Parent 1948 0 R -/Kids [650 0 R 677 0 R 687 0 R 742 0 R 806 0 R 867 0 R] +/Parent 2024 0 R +/Kids [682 0 R 709 0 R 719 0 R 774 0 R 838 0 R 900 0 R] >> endobj -886 0 obj << +926 0 obj << /Type /Pages /Count 6 -/Parent 1948 0 R -/Kids [871 0 R 888 0 R 902 0 R 913 0 R 920 0 R 932 0 R] +/Parent 2024 0 R +/Kids [914 0 R 928 0 R 942 0 R 953 0 R 960 0 R 972 0 R] >> endobj -944 0 obj << +984 0 obj << /Type /Pages /Count 6 -/Parent 1948 0 R -/Kids [937 0 R 946 0 R 957 0 R 965 0 R 972 0 R 978 0 R] +/Parent 2024 0 R +/Kids [977 0 R 986 0 R 997 0 R 1005 0 R 1012 0 R 1018 0 R] >> endobj -1001 0 obj << +1041 0 obj << /Type /Pages /Count 6 -/Parent 1948 0 R -/Kids [986 0 R 1008 0 R 1018 0 R 1023 0 R 1027 0 R 1034 0 R] +/Parent 2024 0 R +/Kids [1026 0 R 1048 0 R 1058 0 R 1063 0 R 1067 0 R 1074 0 R] >> endobj -1050 0 obj << +1090 0 obj << /Type /Pages /Count 6 -/Parent 1948 0 R -/Kids [1042 0 R 1053 0 R 1060 0 R 1065 0 R 1074 0 R 1081 0 R] +/Parent 2024 0 R +/Kids [1082 0 R 1093 0 R 1100 0 R 1105 0 R 1114 0 R 1121 0 R] >> endobj -1093 0 obj << +1133 0 obj << /Type /Pages /Count 6 -/Parent 1948 0 R -/Kids [1085 0 R 1096 0 R 1102 0 R 1110 0 R 1117 0 R 1126 0 R] +/Parent 2024 0 R +/Kids [1125 0 R 1136 0 R 1142 0 R 1150 0 R 1157 0 R 1166 0 R] >> endobj -1145 0 obj << +1185 0 obj << /Type /Pages /Count 6 -/Parent 1949 0 R -/Kids [1136 0 R 1147 0 R 1152 0 R 1158 0 R 1164 0 R 1169 0 R] +/Parent 2025 0 R +/Kids [1176 0 R 1187 0 R 1192 0 R 1198 0 R 1204 0 R 1209 0 R] >> endobj -1182 0 obj << +1222 0 obj << /Type /Pages /Count 6 -/Parent 1949 0 R -/Kids [1179 0 R 1184 0 R 1188 0 R 1193 0 R 1199 0 R 1205 0 R] +/Parent 2025 0 R +/Kids [1219 0 R 1224 0 R 1228 0 R 1233 0 R 1239 0 R 1245 0 R] >> endobj -1218 0 obj << +1258 0 obj << /Type /Pages /Count 6 -/Parent 1949 0 R -/Kids [1210 0 R 1221 0 R 1225 0 R 1230 0 R 1239 0 R 1247 0 R] +/Parent 2025 0 R +/Kids [1250 0 R 1261 0 R 1265 0 R 1270 0 R 1279 0 R 1287 0 R] >> endobj -1255 0 obj << +1295 0 obj << /Type /Pages /Count 6 -/Parent 1949 0 R -/Kids [1252 0 R 1257 0 R 1261 0 R 1268 0 R 1275 0 R 1282 0 R] +/Parent 2025 0 R +/Kids [1292 0 R 1297 0 R 1301 0 R 1308 0 R 1315 0 R 1321 0 R] >> endobj -1294 0 obj << +1334 0 obj << /Type /Pages /Count 6 -/Parent 1949 0 R -/Kids [1288 0 R 1296 0 R 1306 0 R 1314 0 R 1318 0 R 1324 0 R] +/Parent 2025 0 R +/Kids [1327 0 R 1336 0 R 1346 0 R 1354 0 R 1358 0 R 1363 0 R] >> endobj -1334 0 obj << +1374 0 obj << /Type /Pages /Count 6 -/Parent 1949 0 R -/Kids [1329 0 R 1336 0 R 1344 0 R 1348 0 R 1352 0 R 1356 0 R] +/Parent 2025 0 R +/Kids [1369 0 R 1376 0 R 1384 0 R 1388 0 R 1392 0 R 1396 0 R] >> endobj -1368 0 obj << +1416 0 obj << /Type /Pages /Count 6 -/Parent 1950 0 R -/Kids [1364 0 R 1370 0 R 1389 0 R 1402 0 R 1418 0 R 1430 0 R] +/Parent 2026 0 R +/Kids [1404 0 R 1418 0 R 1430 0 R 1452 0 R 1460 0 R 1472 0 R] >> endobj -1441 0 obj << +1484 0 obj << /Type /Pages /Count 6 -/Parent 1950 0 R -/Kids [1436 0 R 1443 0 R 1453 0 R 1465 0 R 1474 0 R 1480 0 R] +/Parent 2026 0 R +/Kids [1476 0 R 1486 0 R 1498 0 R 1507 0 R 1516 0 R 1523 0 R] >> endobj -1489 0 obj << +1535 0 obj << /Type /Pages /Count 6 -/Parent 1950 0 R -/Kids [1484 0 R 1491 0 R 1502 0 R 1506 0 R 1510 0 R 1521 0 R] +/Parent 2026 0 R +/Kids [1529 0 R 1537 0 R 1547 0 R 1555 0 R 1559 0 R 1565 0 R] >> endobj -1531 0 obj << +1579 0 obj << /Type /Pages /Count 6 -/Parent 1950 0 R -/Kids [1525 0 R 1533 0 R 1543 0 R 1602 0 R 1658 0 R 1712 0 R] +/Parent 2026 0 R +/Kids [1576 0 R 1581 0 R 1585 0 R 1596 0 R 1600 0 R 1607 0 R] >> endobj -1754 0 obj << +1675 0 obj << /Type /Pages /Count 6 -/Parent 1950 0 R -/Kids [1746 0 R 1756 0 R 1762 0 R 1767 0 R 1771 0 R 1776 0 R] +/Parent 2026 0 R +/Kids [1617 0 R 1677 0 R 1733 0 R 1787 0 R 1821 0 R 1830 0 R] >> endobj -1791 0 obj << +1840 0 obj << /Type /Pages /Count 6 -/Parent 1950 0 R -/Kids [1788 0 R 1793 0 R 1805 0 R 1810 0 R 1821 0 R 1826 0 R] +/Parent 2026 0 R +/Kids [1836 0 R 1842 0 R 1846 0 R 1851 0 R 1863 0 R 1867 0 R] >> endobj -1841 0 obj << +1883 0 obj << /Type /Pages /Count 6 -/Parent 1951 0 R -/Kids [1831 0 R 1843 0 R 1854 0 R 1859 0 R 1869 0 R 1875 0 R] +/Parent 2027 0 R +/Kids [1879 0 R 1885 0 R 1896 0 R 1901 0 R 1906 0 R 1917 0 R] >> endobj -1892 0 obj << +1932 0 obj << /Type /Pages /Count 6 -/Parent 1951 0 R -/Kids [1882 0 R 1894 0 R 1904 0 R 1910 0 R 1919 0 R 1926 0 R] +/Parent 2027 0 R +/Kids [1928 0 R 1934 0 R 1944 0 R 1950 0 R 1957 0 R 1968 0 R] >> endobj -1948 0 obj << +1983 0 obj << +/Type /Pages +/Count 4 +/Parent 2027 0 R +/Kids [1978 0 R 1985 0 R 1994 0 R 2001 0 R] +>> endobj +2024 0 obj << /Type /Pages /Count 36 -/Parent 1952 0 R -/Kids [659 0 R 886 0 R 944 0 R 1001 0 R 1050 0 R 1093 0 R] +/Parent 2028 0 R +/Kids [691 0 R 926 0 R 984 0 R 1041 0 R 1090 0 R 1133 0 R] >> endobj -1949 0 obj << +2025 0 obj << /Type /Pages /Count 36 -/Parent 1952 0 R -/Kids [1145 0 R 1182 0 R 1218 0 R 1255 0 R 1294 0 R 1334 0 R] +/Parent 2028 0 R +/Kids [1185 0 R 1222 0 R 1258 0 R 1295 0 R 1334 0 R 1374 0 R] >> endobj -1950 0 obj << +2026 0 obj << /Type /Pages /Count 36 -/Parent 1952 0 R -/Kids [1368 0 R 1441 0 R 1489 0 R 1531 0 R 1754 0 R 1791 0 R] +/Parent 2028 0 R +/Kids [1416 0 R 1484 0 R 1535 0 R 1579 0 R 1675 0 R 1840 0 R] >> endobj -1951 0 obj << +2027 0 obj << /Type /Pages -/Count 12 -/Parent 1952 0 R -/Kids [1841 0 R 1892 0 R] +/Count 16 +/Parent 2028 0 R +/Kids [1883 0 R 1932 0 R 1983 0 R] >> endobj -1952 0 obj << +2028 0 obj << /Type /Pages -/Count 120 -/Kids [1948 0 R 1949 0 R 1950 0 R 1951 0 R] +/Count 124 +/Kids [2024 0 R 2025 0 R 2026 0 R 2027 0 R] >> endobj -1953 0 obj << +2029 0 obj << /Type /Outlines /First 7 0 R -/Last 607 0 R +/Last 639 0 R /Count 10 >> endobj +679 0 obj << +/Title 680 0 R +/A 677 0 R +/Parent 639 0 R +/Prev 675 0 R +>> endobj +675 0 obj << +/Title 676 0 R +/A 673 0 R +/Parent 639 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 +/Prev 667 0 R +/Next 675 0 R +>> endobj +667 0 obj << +/Title 668 0 R +/A 665 0 R +/Parent 639 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 +/Prev 659 0 R +/Next 667 0 R +>> endobj +659 0 obj << +/Title 660 0 R +/A 657 0 R +/Parent 639 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 +/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 +/Next 655 0 R +>> endobj 647 0 obj << /Title 648 0 R /A 645 0 R -/Parent 607 0 R +/Parent 639 0 R /Prev 643 0 R +/Next 651 0 R >> endobj 643 0 obj << /Title 644 0 R /A 641 0 R -/Parent 607 0 R -/Prev 639 0 R +/Parent 639 0 R /Next 647 0 R >> endobj 639 0 obj << /Title 640 0 R /A 637 0 R -/Parent 607 0 R -/Prev 635 0 R -/Next 643 0 R +/Parent 2029 0 R +/Prev 603 0 R +/First 643 0 R +/Last 679 0 R +/Count -10 >> endobj 635 0 obj << /Title 636 0 R /A 633 0 R -/Parent 607 0 R +/Parent 623 0 R /Prev 631 0 R -/Next 639 0 R >> endobj 631 0 obj << /Title 632 0 R /A 629 0 R -/Parent 607 0 R +/Parent 623 0 R /Prev 627 0 R /Next 635 0 R >> endobj 627 0 obj << /Title 628 0 R /A 625 0 R -/Parent 607 0 R -/Prev 623 0 R +/Parent 623 0 R /Next 631 0 R >> endobj 623 0 obj << /Title 624 0 R /A 621 0 R -/Parent 607 0 R -/Prev 619 0 R -/Next 627 0 R +/Parent 603 0 R +/Prev 615 0 R +/First 627 0 R +/Last 635 0 R +/Count -3 >> endobj 619 0 obj << /Title 620 0 R /A 617 0 R -/Parent 607 0 R -/Prev 615 0 R -/Next 623 0 R +/Parent 615 0 R >> endobj 615 0 obj << /Title 616 0 R /A 613 0 R -/Parent 607 0 R -/Prev 611 0 R -/Next 619 0 R +/Parent 603 0 R +/Prev 607 0 R +/Next 623 0 R +/First 619 0 R +/Last 619 0 R +/Count -1 >> endobj 611 0 obj << /Title 612 0 R /A 609 0 R /Parent 607 0 R -/Next 615 0 R >> endobj 607 0 obj << /Title 608 0 R /A 605 0 R -/Parent 1953 0 R -/Prev 571 0 R +/Parent 603 0 R +/Next 615 0 R /First 611 0 R -/Last 647 0 R -/Count -10 +/Last 611 0 R +/Count -1 >> endobj 603 0 obj << /Title 604 0 R /A 601 0 R -/Parent 591 0 R -/Prev 599 0 R +/Parent 2029 0 R +/Prev 583 0 R +/Next 639 0 R +/First 607 0 R +/Last 623 0 R +/Count -3 >> endobj 599 0 obj << /Title 600 0 R /A 597 0 R -/Parent 591 0 R +/Parent 583 0 R /Prev 595 0 R -/Next 603 0 R >> endobj 595 0 obj << /Title 596 0 R /A 593 0 R -/Parent 591 0 R +/Parent 583 0 R +/Prev 587 0 R /Next 599 0 R >> endobj 591 0 obj << /Title 592 0 R /A 589 0 R -/Parent 571 0 R -/Prev 583 0 R -/First 595 0 R -/Last 603 0 R -/Count -3 +/Parent 587 0 R >> 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 >> endobj 583 0 obj << /Title 584 0 R /A 581 0 R -/Parent 571 0 R -/Prev 575 0 R -/Next 591 0 R +/Parent 2029 0 R +/Prev 559 0 R +/Next 603 0 R /First 587 0 R -/Last 587 0 R -/Count -1 +/Last 599 0 R +/Count -3 >> endobj 579 0 obj << /Title 580 0 R /A 577 0 R -/Parent 575 0 R +/Parent 559 0 R +/Prev 567 0 R >> endobj 575 0 obj << /Title 576 0 R /A 573 0 R -/Parent 571 0 R -/Next 583 0 R -/First 579 0 R -/Last 579 0 R -/Count -1 +/Parent 567 0 R +/Prev 571 0 R >> endobj 571 0 obj << /Title 572 0 R /A 569 0 R -/Parent 1953 0 R -/Prev 551 0 R -/Next 607 0 R -/First 575 0 R -/Last 591 0 R -/Count -3 +/Parent 567 0 R +/Next 575 0 R >> endobj 567 0 obj << /Title 568 0 R /A 565 0 R -/Parent 551 0 R +/Parent 559 0 R /Prev 563 0 R +/Next 579 0 R +/First 571 0 R +/Last 575 0 R +/Count -2 >> endobj 563 0 obj << /Title 564 0 R /A 561 0 R -/Parent 551 0 R -/Prev 555 0 R +/Parent 559 0 R /Next 567 0 R >> endobj 559 0 obj << /Title 560 0 R /A 557 0 R -/Parent 555 0 R +/Parent 2029 0 R +/Prev 243 0 R +/Next 583 0 R +/First 563 0 R +/Last 579 0 R +/Count -3 >> endobj 555 0 obj << /Title 556 0 R /A 553 0 R -/Parent 551 0 R -/Next 563 0 R -/First 559 0 R -/Last 559 0 R -/Count -1 +/Parent 539 0 R +/Prev 551 0 R >> endobj 551 0 obj << /Title 552 0 R /A 549 0 R -/Parent 1953 0 R -/Prev 527 0 R -/Next 571 0 R -/First 555 0 R -/Last 567 0 R -/Count -3 +/Parent 539 0 R +/Prev 547 0 R +/Next 555 0 R >> endobj 547 0 obj << /Title 548 0 R /A 545 0 R -/Parent 527 0 R -/Prev 535 0 R +/Parent 539 0 R +/Prev 543 0 R +/Next 551 0 R >> endobj 543 0 obj << /Title 544 0 R /A 541 0 R -/Parent 535 0 R -/Prev 539 0 R +/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 531 0 R +/Prev 535 0 R +/First 543 0 R +/Last 555 0 R +/Count -4 >> endobj 535 0 obj << /Title 536 0 R /A 533 0 R -/Parent 527 0 R -/Prev 531 0 R -/Next 547 0 R -/First 539 0 R -/Last 543 0 R -/Count -2 +/Parent 531 0 R +/Next 539 0 R >> endobj 531 0 obj << /Title 532 0 R /A 529 0 R -/Parent 527 0 R -/Next 535 0 R +/Parent 243 0 R +/Prev 479 0 R +/First 535 0 R +/Last 539 0 R +/Count -2 >> endobj 527 0 obj << /Title 528 0 R /A 525 0 R -/Parent 1953 0 R -/Prev 243 0 R -/Next 551 0 R -/First 531 0 R -/Last 547 0 R -/Count -3 +/Parent 479 0 R +/Prev 523 0 R >> endobj 523 0 obj << /Title 524 0 R /A 521 0 R -/Parent 475 0 R -/Prev 519 0 R +/Parent 479 0 R +/Prev 507 0 R +/Next 527 0 R >> endobj 519 0 obj << /Title 520 0 R /A 517 0 R -/Parent 475 0 R -/Prev 503 0 R -/Next 523 0 R +/Parent 507 0 R +/Prev 515 0 R >> endobj 515 0 obj << /Title 516 0 R /A 513 0 R -/Parent 503 0 R +/Parent 507 0 R /Prev 511 0 R +/Next 519 0 R >> endobj 511 0 obj << /Title 512 0 R /A 509 0 R -/Parent 503 0 R -/Prev 507 0 R +/Parent 507 0 R /Next 515 0 R >> endobj 507 0 obj << /Title 508 0 R /A 505 0 R -/Parent 503 0 R -/Next 511 0 R +/Parent 479 0 R +/Prev 503 0 R +/Next 523 0 R +/First 511 0 R +/Last 519 0 R +/Count -3 >> endobj 503 0 obj << /Title 504 0 R /A 501 0 R -/Parent 475 0 R +/Parent 479 0 R /Prev 499 0 R -/Next 519 0 R -/First 507 0 R -/Last 515 0 R -/Count -3 +/Next 507 0 R >> endobj 499 0 obj << /Title 500 0 R /A 497 0 R -/Parent 475 0 R +/Parent 479 0 R /Prev 495 0 R /Next 503 0 R >> endobj 495 0 obj << /Title 496 0 R /A 493 0 R -/Parent 475 0 R -/Prev 491 0 R +/Parent 479 0 R +/Prev 483 0 R /Next 499 0 R >> endobj 491 0 obj << /Title 492 0 R /A 489 0 R -/Parent 475 0 R -/Prev 479 0 R -/Next 495 0 R +/Parent 483 0 R +/Prev 487 0 R >> endobj 487 0 obj << /Title 488 0 R /A 485 0 R -/Parent 479 0 R -/Prev 483 0 R +/Parent 483 0 R +/Next 491 0 R >> endobj 483 0 obj << /Title 484 0 R /A 481 0 R /Parent 479 0 R -/Next 487 0 R +/Next 495 0 R +/First 487 0 R +/Last 491 0 R +/Count -2 >> endobj 479 0 obj << /Title 480 0 R /A 477 0 R -/Parent 475 0 R -/Next 491 0 R +/Parent 243 0 R +/Prev 275 0 R +/Next 531 0 R /First 483 0 R -/Last 487 0 R -/Count -2 +/Last 527 0 R +/Count -7 >> endobj 475 0 obj << /Title 476 0 R /A 473 0 R -/Parent 243 0 R -/Prev 275 0 R -/First 479 0 R -/Last 523 0 R -/Count -7 +/Parent 459 0 R +/Prev 471 0 R >> endobj 471 0 obj << /Title 472 0 R /A 469 0 R -/Parent 455 0 R +/Parent 459 0 R /Prev 467 0 R +/Next 475 0 R >> endobj 467 0 obj << /Title 468 0 R /A 465 0 R -/Parent 455 0 R +/Parent 459 0 R /Prev 463 0 R /Next 471 0 R >> endobj 463 0 obj << /Title 464 0 R /A 461 0 R -/Parent 455 0 R -/Prev 459 0 R +/Parent 459 0 R /Next 467 0 R >> endobj 459 0 obj << /Title 460 0 R /A 457 0 R -/Parent 455 0 R -/Next 463 0 R +/Parent 275 0 R +/Prev 455 0 R +/First 463 0 R +/Last 475 0 R +/Count -4 >> endobj 455 0 obj << /Title 456 0 R /A 453 0 R /Parent 275 0 R /Prev 451 0 R -/First 459 0 R -/Last 471 0 R -/Count -4 +/Next 459 0 R >> endobj 451 0 obj << /Title 452 0 R @@ -10259,21 +10767,21 @@ endobj /Title 428 0 R /A 425 0 R /Parent 275 0 R -/Prev 347 0 R +/Prev 423 0 R /Next 431 0 R >> endobj 423 0 obj << /Title 424 0 R /A 421 0 R -/Parent 347 0 R -/Prev 419 0 R +/Parent 275 0 R +/Prev 347 0 R +/Next 427 0 R >> endobj 419 0 obj << /Title 420 0 R /A 417 0 R /Parent 347 0 R /Prev 415 0 R -/Next 423 0 R >> endobj 415 0 obj << /Title 416 0 R @@ -10398,10 +10906,10 @@ endobj /A 345 0 R /Parent 275 0 R /Prev 343 0 R -/Next 427 0 R +/Next 423 0 R /First 351 0 R -/Last 423 0 R -/Count -19 +/Last 419 0 R +/Count -18 >> endobj 343 0 obj << /Title 344 0 R @@ -10527,10 +11035,10 @@ endobj /A 273 0 R /Parent 243 0 R /Prev 247 0 R -/Next 475 0 R +/Next 479 0 R /First 279 0 R -/Last 455 0 R -/Count -24 +/Last 459 0 R +/Count -26 >> endobj 271 0 obj << /Title 272 0 R @@ -10586,12 +11094,12 @@ endobj 243 0 obj << /Title 244 0 R /A 241 0 R -/Parent 1953 0 R +/Parent 2029 0 R /Prev 231 0 R -/Next 527 0 R +/Next 559 0 R /First 247 0 R -/Last 475 0 R -/Count -3 +/Last 531 0 R +/Count -4 >> endobj 239 0 obj << /Title 240 0 R @@ -10608,7 +11116,7 @@ endobj 231 0 obj << /Title 232 0 R /A 229 0 R -/Parent 1953 0 R +/Parent 2029 0 R /Prev 131 0 R /Next 243 0 R /First 235 0 R @@ -10790,7 +11298,7 @@ endobj 131 0 obj << /Title 132 0 R /A 129 0 R -/Parent 1953 0 R +/Parent 2029 0 R /Prev 91 0 R /Next 231 0 R /First 135 0 R @@ -10864,7 +11372,7 @@ endobj 91 0 obj << /Title 92 0 R /A 89 0 R -/Parent 1953 0 R +/Parent 2029 0 R /Prev 67 0 R /Next 131 0 R /First 95 0 R @@ -10907,7 +11415,7 @@ endobj 67 0 obj << /Title 68 0 R /A 65 0 R -/Parent 1953 0 R +/Parent 2029 0 R /Prev 7 0 R /Next 91 0 R /First 71 0 R @@ -11016,2003 +11524,2079 @@ endobj 7 0 obj << /Title 8 0 R /A 5 0 R -/Parent 1953 0 R +/Parent 2029 0 R /Next 67 0 R /First 11 0 R /Last 23 0 R /Count -4 >> endobj -1954 0 obj << -/Names [(Access_Control_Lists) 1488 0 R (Bv9ARM.ch01) 874 0 R (Bv9ARM.ch02) 923 0 R (Bv9ARM.ch03) 940 0 R (Bv9ARM.ch04) 989 0 R (Bv9ARM.ch05) 1077 0 R (Bv9ARM.ch06) 1088 0 R (Bv9ARM.ch07) 1487 0 R (Bv9ARM.ch08) 1513 0 R (Bv9ARM.ch09) 1528 0 R (Bv9ARM.ch10) 1749 0 R (Configuration_File_Grammar) 1113 0 R (DNSSEC) 1056 0 R (Doc-Start) 655 0 R (Setting_TTLs) 1458 0 R (acache) 930 0 R (access_control) 1235 0 R (acl) 1121 0 R (address_match_lists) 1094 0 R (admin_tools) 963 0 R (appendix.A) 570 0 R (appendix.B) 606 0 R (bibliography) 1537 0 R (boolean_options) 1005 0 R (builtin) 1309 0 R (chapter*.1) 690 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) 526 0 R (chapter.8) 550 0 R (cite.RFC1033) 1664 0 R (cite.RFC1034) 1549 0 R (cite.RFC1035) 1551 0 R (cite.RFC1101) 1646 0 R (cite.RFC1123) 1648 0 R (cite.RFC1183) 1608 0 R (cite.RFC1464) 1686 0 R (cite.RFC1535) 1594 0 R (cite.RFC1536) 1596 0 R (cite.RFC1537) 1666 0 R (cite.RFC1591) 1650 0 R (cite.RFC1706) 1610 0 R (cite.RFC1712) 1706 0 R (cite.RFC1713) 1688 0 R (cite.RFC1794) 1690 0 R (cite.RFC1876) 1612 0 R (cite.RFC1912) 1668 0 R (cite.RFC1982) 1598 0 R (cite.RFC1995) 1556 0 R (cite.RFC1996) 1558 0 R (cite.RFC2010) 1670 0 R (cite.RFC2052) 1614 0 R (cite.RFC2065) 1718 0 R (cite.RFC2136) 1560 0 R (cite.RFC2137) 1720 0 R (cite.RFC2163) 1616 0 R (cite.RFC2168) 1618 0 R (cite.RFC2181) 1562 0 R (cite.RFC2219) 1672 0 R (cite.RFC2230) 1620 0 R (cite.RFC2240) 1692 0 R (cite.RFC2308) 1564 0 R (cite.RFC2317) 1652 0 R (cite.RFC2345) 1694 0 R (cite.RFC2352) 1696 0 R (cite.RFC2535) 1722 0 R (cite.RFC2536) 1622 0 R (cite.RFC2537) 1624 0 R (cite.RFC2538) 1626 0 R (cite.RFC2539) 1628 0 R (cite.RFC2540) 1630 0 R (cite.RFC2671) 1566 0 R (cite.RFC2672) 1568 0 R (cite.RFC2673) 1708 0 R (cite.RFC2782) 1632 0 R (cite.RFC2825) 1676 0 R (cite.RFC2826) 1654 0 R (cite.RFC2845) 1570 0 R (cite.RFC2874) 1710 0 R (cite.RFC2915) 1634 0 R (cite.RFC2929) 1656 0 R (cite.RFC2930) 1572 0 R (cite.RFC2931) 1574 0 R (cite.RFC3007) 1576 0 R (cite.RFC3008) 1724 0 R (cite.RFC3071) 1698 0 R (cite.RFC3090) 1726 0 R (cite.RFC3110) 1636 0 R (cite.RFC3123) 1638 0 R (cite.RFC3225) 1582 0 R (cite.RFC3258) 1700 0 R (cite.RFC3445) 1728 0 R (cite.RFC3490) 1678 0 R (cite.RFC3491) 1680 0 R (cite.RFC3492) 1682 0 R (cite.RFC3596) 1640 0 R (cite.RFC3597) 1642 0 R (cite.RFC3645) 1578 0 R (cite.RFC3655) 1730 0 R (cite.RFC3658) 1732 0 R (cite.RFC3755) 1734 0 R (cite.RFC3757) 1736 0 R (cite.RFC3833) 1584 0 R (cite.RFC3845) 1738 0 R (cite.RFC3901) 1702 0 R (cite.RFC4033) 1586 0 R (cite.RFC4035) 1588 0 R (cite.RFC4044) 1590 0 R (cite.RFC4074) 1600 0 R (cite.RFC974) 1553 0 R (cite.id2500250) 1743 0 R (configuration_file_elements) 1089 0 R (controls_statement_definition_and_usage) 976 0 R (diagnostic_tools) 911 0 R (dynamic_update) 999 0 R (dynamic_update_policies) 1051 0 R (dynamic_update_security) 1245 0 R (empty) 1311 0 R (historical_dns_information) 1530 0 R (id2465026) 875 0 R (id2466484) 876 0 R (id2467305) 880 0 R (id2467506) 881 0 R (id2467714) 891 0 R (id2467891) 893 0 R (id2467912) 894 0 R (id2467946) 895 0 R (id2468030) 898 0 R (id2470292) 905 0 R (id2470315) 908 0 R (id2470345) 909 0 R (id2470435) 910 0 R (id2470465) 916 0 R (id2470500) 917 0 R (id2470595) 918 0 R (id2470629) 924 0 R (id2470656) 925 0 R (id2470668) 926 0 R (id2470694) 929 0 R (id2470705) 935 0 R (id2470805) 942 0 R (id2470821) 943 0 R (id2470843) 949 0 R (id2470860) 950 0 R (id2471334) 953 0 R (id2471339) 954 0 R (id2473122) 981 0 R (id2473133) 982 0 R (id2473527) 1014 0 R (id2473545) 1015 0 R (id2473980) 1031 0 R (id2473997) 1032 0 R (id2474036) 1037 0 R (id2474122) 1038 0 R (id2474133) 1039 0 R (id2474172) 1040 0 R (id2474230) 1045 0 R (id2474343) 1047 0 R (id2474357) 1048 0 R (id2474542) 1049 0 R (id2474679) 1057 0 R (id2474748) 1058 0 R (id2474827) 1063 0 R (id2474970) 1068 0 R (id2475169) 1070 0 R (id2475190) 1071 0 R (id2475223) 1078 0 R (id2475370) 1090 0 R (id2476166) 1099 0 R (id2476194) 1100 0 R (id2476388) 1105 0 R (id2476403) 1106 0 R (id2476433) 1107 0 R (id2476584) 1114 0 R (id2476932) 1120 0 R (id2476974) 1122 0 R (id2477190) 1124 0 R (id2477550) 1131 0 R (id2477565) 1132 0 R (id2477589) 1133 0 R (id2477678) 1139 0 R (id2477837) 1143 0 R (id2477963) 1144 0 R (id2478084) 1150 0 R (id2478777) 1161 0 R (id2479480) 1167 0 R (id2479554) 1172 0 R (id2479618) 1175 0 R (id2479661) 1176 0 R (id2479676) 1177 0 R (id2481882) 1202 0 R (id2483682) 1228 0 R (id2483740) 1234 0 R (id2484373) 1244 0 R (id2485408) 1264 0 R (id2485422) 1265 0 R (id2485538) 1271 0 R (id2485739) 1273 0 R (id2486307) 1291 0 R (id2487541) 1321 0 R (id2488731) 1339 0 R (id2488780) 1340 0 R (id2488860) 1342 0 R (id2490419) 1359 0 R (id2490426) 1360 0 R (id2490432) 1361 0 R (id2490777) 1367 0 R (id2490810) 1373 0 R (id2492304) 1421 0 R (id2492629) 1423 0 R (id2492647) 1424 0 R (id2492667) 1427 0 R (id2492972) 1433 0 R (id2493933) 1439 0 R (id2494061) 1446 0 R (id2494083) 1447 0 R (id2494445) 1449 0 R (id2494582) 1451 0 R (id2494673) 1456 0 R (id2495077) 1459 0 R (id2495270) 1461 0 R (id2495285) 1462 0 R (id2495397) 1468 0 R (id2495419) 1469 0 R (id2495480) 1470 0 R (id2495618) 1471 0 R (id2495654) 1472 0 R (id2495716) 1477 0 R (id2496338) 1498 0 R (id2496414) 1499 0 R (id2496474) 1500 0 R (id2496554) 1514 0 R (id2496560) 1515 0 R (id2496571) 1516 0 R (id2496725) 1517 0 R (id2496787) 1529 0 R (id2496958) 1536 0 R (id2497214) 1541 0 R (id2497217) 1547 0 R (id2497225) 1552 0 R (id2497249) 1548 0 R (id2497272) 1550 0 R (id2497308) 1561 0 R (id2497335) 1563 0 R (id2497361) 1555 0 R (id2497385) 1557 0 R (id2497477) 1559 0 R (id2497532) 1565 0 R (id2497559) 1567 0 R (id2497586) 1569 0 R (id2497648) 1571 0 R (id2497677) 1573 0 R (id2497707) 1575 0 R (id2497734) 1577 0 R (id2497809) 1580 0 R (id2497816) 1581 0 R (id2497843) 1583 0 R (id2497879) 1585 0 R (id2497944) 1589 0 R (id2498009) 1587 0 R (id2498074) 1592 0 R (id2498083) 1593 0 R (id2498108) 1595 0 R (id2498177) 1597 0 R (id2498212) 1599 0 R (id2498252) 1606 0 R (id2498258) 1607 0 R (id2498315) 1609 0 R (id2498353) 1617 0 R (id2498388) 1611 0 R (id2498442) 1613 0 R (id2498481) 1615 0 R (id2498506) 1619 0 R (id2498532) 1621 0 R (id2498558) 1623 0 R (id2498585) 1625 0 R (id2498625) 1627 0 R (id2498654) 1629 0 R (id2498684) 1631 0 R (id2498727) 1633 0 R (id2498760) 1635 0 R (id2498787) 1637 0 R (id2498810) 1639 0 R (id2498868) 1641 0 R (id2498892) 1644 0 R (id2498900) 1645 0 R (id2498925) 1647 0 R (id2498948) 1649 0 R (id2498971) 1651 0 R (id2499017) 1653 0 R (id2499041) 1655 0 R (id2499091) 1662 0 R (id2499098) 1663 0 R (id2499122) 1665 0 R (id2499148) 1667 0 R (id2499175) 1669 0 R (id2499211) 1671 0 R (id2499252) 1674 0 R (id2499257) 1675 0 R (id2499289) 1677 0 R (id2499335) 1679 0 R (id2499370) 1681 0 R (id2499397) 1684 0 R (id2499415) 1685 0 R (id2499437) 1687 0 R (id2499463) 1689 0 R (id2499489) 1691 0 R (id2499512) 1693 0 R (id2499558) 1695 0 R (id2499581) 1697 0 R (id2499608) 1699 0 R (id2499634) 1701 0 R (id2499671) 1704 0 R (id2499677) 1705 0 R (id2499803) 1707 0 R (id2499830) 1709 0 R (id2499866) 1716 0 R (id2499878) 1717 0 R (id2499917) 1719 0 R (id2499944) 1721 0 R (id2499974) 1723 0 R (id2500000) 1725 0 R (id2500026) 1727 0 R (id2500062) 1729 0 R (id2500099) 1731 0 R (id2500125) 1733 0 R (id2500152) 1735 0 R (id2500197) 1737 0 R (id2500238) 1740 0 R (id2500248) 1742 0 R (id2500250) 1744 0 R (incremental_zone_transfers) 1011 0 R (internet_drafts) 1739 0 R (ipv6addresses) 1072 0 R (journal) 1000 0 R (lwresd) 1079 0 R (man.dig) 1750 0 R (man.dnssec-keygen) 1799 0 R (man.dnssec-signzone) 1816 0 R (man.host) 1783 0 R (man.named) 1865 0 R (man.named-checkconf) 1836 0 R (man.named-checkzone) 1849 0 R (man.rndc) 1887 0 R (man.rndc-confgen) 1916 0 R (man.rndc.conf) 1900 0 R (notify) 990 0 R (options) 1191 0 R (page.1) 654 0 R (page.10) 915 0 R (page.100) 1769 0 R (page.101) 1773 0 R (page.102) 1778 0 R (page.103) 1790 0 R (page.104) 1795 0 R (page.105) 1807 0 R (page.106) 1812 0 R (page.107) 1823 0 R (page.108) 1828 0 R (page.109) 1833 0 R (page.11) 922 0 R (page.110) 1845 0 R (page.111) 1856 0 R (page.112) 1861 0 R (page.113) 1871 0 R (page.114) 1877 0 R (page.115) 1884 0 R (page.116) 1896 0 R (page.117) 1906 0 R (page.118) 1912 0 R (page.119) 1921 0 R (page.12) 934 0 R (page.120) 1928 0 R (page.13) 939 0 R (page.14) 948 0 R (page.15) 959 0 R (page.16) 967 0 R (page.17) 974 0 R (page.18) 980 0 R (page.19) 988 0 R (page.2) 679 0 R (page.20) 1010 0 R (page.21) 1020 0 R (page.22) 1025 0 R (page.23) 1029 0 R (page.24) 1036 0 R (page.25) 1044 0 R (page.26) 1055 0 R (page.27) 1062 0 R (page.28) 1067 0 R (page.29) 1076 0 R (page.3) 689 0 R (page.30) 1083 0 R (page.31) 1087 0 R (page.32) 1098 0 R (page.33) 1104 0 R (page.34) 1112 0 R (page.35) 1119 0 R (page.36) 1128 0 R (page.37) 1138 0 R (page.38) 1149 0 R (page.39) 1154 0 R (page.4) 744 0 R (page.40) 1160 0 R (page.41) 1166 0 R (page.42) 1171 0 R (page.43) 1181 0 R (page.44) 1186 0 R (page.45) 1190 0 R (page.46) 1195 0 R (page.47) 1201 0 R (page.48) 1207 0 R (page.49) 1212 0 R (page.5) 808 0 R (page.50) 1223 0 R (page.51) 1227 0 R (page.52) 1232 0 R (page.53) 1241 0 R (page.54) 1249 0 R (page.55) 1254 0 R (page.56) 1259 0 R (page.57) 1263 0 R (page.58) 1270 0 R (page.59) 1277 0 R (page.6) 869 0 R (page.60) 1284 0 R (page.61) 1290 0 R (page.62) 1298 0 R (page.63) 1308 0 R (page.64) 1316 0 R (page.65) 1320 0 R (page.66) 1326 0 R (page.67) 1331 0 R (page.68) 1338 0 R (page.69) 1346 0 R (page.7) 873 0 R (page.70) 1350 0 R (page.71) 1354 0 R (page.72) 1358 0 R (page.73) 1366 0 R (page.74) 1372 0 R (page.75) 1391 0 R (page.76) 1404 0 R (page.77) 1420 0 R (page.78) 1432 0 R (page.79) 1438 0 R (page.8) 890 0 R (page.80) 1445 0 R (page.81) 1455 0 R (page.82) 1467 0 R (page.83) 1476 0 R (page.84) 1482 0 R (page.85) 1486 0 R (page.86) 1493 0 R (page.87) 1504 0 R (page.88) 1508 0 R (page.89) 1512 0 R (page.9) 904 0 R (page.90) 1523 0 R (page.91) 1527 0 R (page.92) 1535 0 R (page.93) 1545 0 R (page.94) 1604 0 R (page.95) 1660 0 R (page.96) 1714 0 R (page.97) 1748 0 R (page.98) 1758 0 R (page.99) 1764 0 R (proposed_standards) 1016 0 R (query_address) 1250 0 R (rfcs) 900 0 R (rndc) 1134 0 R (rrset_ordering) 955 0 R (sample_configuration) 941 0 R (section*.10) 1673 0 R (section*.11) 1683 0 R (section*.12) 1703 0 R (section*.13) 1715 0 R (section*.14) 1741 0 R (section*.15) 1751 0 R (section*.16) 1752 0 R (section*.17) 1753 0 R (section*.18) 1759 0 R (section*.19) 1760 0 R (section*.2) 1540 0 R (section*.20) 1765 0 R (section*.21) 1774 0 R (section*.22) 1779 0 R (section*.23) 1780 0 R (section*.24) 1781 0 R (section*.25) 1782 0 R (section*.26) 1784 0 R (section*.27) 1785 0 R (section*.28) 1786 0 R (section*.29) 1796 0 R (section*.3) 1546 0 R (section*.30) 1797 0 R (section*.31) 1798 0 R (section*.32) 1800 0 R (section*.33) 1801 0 R (section*.34) 1802 0 R (section*.35) 1803 0 R (section*.36) 1808 0 R (section*.37) 1813 0 R (section*.38) 1814 0 R (section*.39) 1815 0 R (section*.4) 1554 0 R (section*.40) 1817 0 R (section*.41) 1818 0 R (section*.42) 1819 0 R (section*.43) 1824 0 R (section*.44) 1829 0 R (section*.45) 1834 0 R (section*.46) 1835 0 R (section*.47) 1837 0 R (section*.48) 1838 0 R (section*.49) 1839 0 R (section*.5) 1579 0 R (section*.50) 1840 0 R (section*.51) 1846 0 R (section*.52) 1847 0 R (section*.53) 1848 0 R (section*.54) 1850 0 R (section*.55) 1851 0 R (section*.56) 1852 0 R (section*.57) 1857 0 R (section*.58) 1862 0 R (section*.59) 1863 0 R (section*.6) 1591 0 R (section*.60) 1864 0 R (section*.61) 1866 0 R (section*.62) 1867 0 R (section*.63) 1872 0 R (section*.64) 1873 0 R (section*.65) 1878 0 R (section*.66) 1879 0 R (section*.67) 1880 0 R (section*.68) 1885 0 R (section*.69) 1886 0 R (section*.7) 1605 0 R (section*.70) 1888 0 R (section*.71) 1889 0 R (section*.72) 1890 0 R (section*.73) 1891 0 R (section*.74) 1897 0 R (section*.75) 1898 0 R (section*.76) 1899 0 R (section*.77) 1901 0 R (section*.78) 1902 0 R (section*.79) 1907 0 R (section*.8) 1643 0 R (section*.80) 1908 0 R (section*.81) 1913 0 R (section*.82) 1914 0 R (section*.83) 1915 0 R (section*.84) 1917 0 R (section*.85) 1922 0 R (section*.86) 1923 0 R (section*.87) 1924 0 R (section*.88) 1929 0 R (section*.89) 1930 0 R (section*.9) 1661 0 R (section*.90) 1931 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) 474 0 R (section.7.1) 530 0 R (section.7.2) 534 0 R (section.7.3) 546 0 R (section.8.1) 554 0 R (section.8.2) 562 0 R (section.8.3) 566 0 R (section.A.1) 574 0 R (section.A.2) 582 0 R (section.A.3) 590 0 R (section.B.1) 610 0 R (section.B.10) 646 0 R (section.B.2) 614 0 R (section.B.3) 618 0 R (section.B.4) 622 0 R (section.B.5) 626 0 R (section.B.6) 630 0 R (section.B.7) 634 0 R (section.B.8) 638 0 R (section.B.9) 642 0 R (server_statement_definition_and_usage) 1219 0 R (server_statement_grammar) 1327 0 R (statsfile) 1197 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) 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.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) 478 0 R (subsection.6.3.2) 490 0 R (subsection.6.3.3) 494 0 R (subsection.6.3.4) 498 0 R (subsection.6.3.5) 502 0 R (subsection.6.3.6) 518 0 R (subsection.6.3.7) 522 0 R (subsection.7.2.1) 538 0 R (subsection.7.2.2) 542 0 R (subsection.8.1.1) 558 0 R (subsection.A.1.1) 578 0 R (subsection.A.2.1) 586 0 R (subsection.A.3.1) 594 0 R (subsection.A.3.2) 598 0 R (subsection.A.3.3) 602 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.19) 422 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.24.1) 458 0 R (subsubsection.6.2.24.2) 462 0 R (subsubsection.6.2.24.3) 466 0 R (subsubsection.6.2.24.4) 470 0 R (subsubsection.6.3.1.1) 482 0 R (subsubsection.6.3.1.2) 486 0 R (subsubsection.6.3.5.1) 506 0 R (subsubsection.6.3.5.2) 510 0 R (subsubsection.6.3.5.3) 514 0 R (table.1.1) 882 0 R (table.1.2) 892 0 R (table.3.1) 951 0 R (table.3.2) 983 0 R (table.6.1) 1091 0 R (table.6.10) 1428 0 R (table.6.11) 1434 0 R (table.6.12) 1440 0 R (table.6.13) 1448 0 R (table.6.14) 1450 0 R (table.6.15) 1457 0 R (table.6.16) 1460 0 R (table.6.17) 1463 0 R (table.6.18) 1478 0 R (table.6.2) 1115 0 R (table.6.3) 1123 0 R (table.6.4) 1162 0 R (table.6.5) 1203 0 R (table.6.6) 1292 0 R (table.6.7) 1322 0 R (table.6.8) 1362 0 R (table.6.9) 1422 0 R (the_category_phrase) 1156 0 R (the_sortlist_statement) 1279 0 R (topology) 1278 0 R (tsig) 1030 0 R (tuning) 1293 0 R (types_of_resource_records_and_when_to_use_them) 899 0 R (view_statement_grammar) 1312 0 R (zone_statement_grammar) 1237 0 R (zone_transfers) 1006 0 R (zonefile_format) 1304 0 R] +2030 0 obj << +/Names [(Access_Control_Lists) 1563 0 R (Bv9ARM.ch01) 917 0 R (Bv9ARM.ch02) 963 0 R (Bv9ARM.ch03) 980 0 R (Bv9ARM.ch04) 1029 0 R (Bv9ARM.ch05) 1117 0 R (Bv9ARM.ch06) 1128 0 R (Bv9ARM.ch07) 1562 0 R (Bv9ARM.ch08) 1588 0 R (Bv9ARM.ch09) 1603 0 R (Bv9ARM.ch10) 1824 0 R (Configuration_File_Grammar) 1153 0 R (DNSSEC) 1096 0 R (Doc-Start) 687 0 R (Setting_TTLs) 1494 0 R (acache) 970 0 R (access_control) 1275 0 R (acl) 1161 0 R (address_match_lists) 1134 0 R (admin_tools) 1003 0 R (appendix.A) 602 0 R (appendix.B) 638 0 R (bibliography) 1611 0 R (boolean_options) 1045 0 R (builtin) 1349 0 R (chapter*.1) 722 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) 1739 0 R (cite.RFC1034) 1623 0 R (cite.RFC1035) 1625 0 R (cite.RFC1101) 1721 0 R (cite.RFC1123) 1723 0 R (cite.RFC1183) 1683 0 R (cite.RFC1464) 1761 0 R (cite.RFC1535) 1668 0 R (cite.RFC1536) 1670 0 R (cite.RFC1537) 1741 0 R (cite.RFC1591) 1725 0 R (cite.RFC1706) 1685 0 R (cite.RFC1712) 1781 0 R (cite.RFC1713) 1763 0 R (cite.RFC1794) 1765 0 R (cite.RFC1876) 1687 0 R (cite.RFC1912) 1743 0 R (cite.RFC1982) 1672 0 R (cite.RFC1995) 1630 0 R (cite.RFC1996) 1632 0 R (cite.RFC2010) 1745 0 R (cite.RFC2052) 1689 0 R (cite.RFC2065) 1793 0 R (cite.RFC2136) 1634 0 R (cite.RFC2137) 1795 0 R (cite.RFC2163) 1691 0 R (cite.RFC2168) 1693 0 R (cite.RFC2181) 1636 0 R (cite.RFC2219) 1747 0 R (cite.RFC2230) 1695 0 R (cite.RFC2240) 1767 0 R (cite.RFC2308) 1638 0 R (cite.RFC2317) 1727 0 R (cite.RFC2345) 1769 0 R (cite.RFC2352) 1771 0 R (cite.RFC2535) 1797 0 R (cite.RFC2536) 1697 0 R (cite.RFC2537) 1699 0 R (cite.RFC2538) 1701 0 R (cite.RFC2539) 1703 0 R (cite.RFC2540) 1705 0 R (cite.RFC2671) 1640 0 R (cite.RFC2672) 1642 0 R (cite.RFC2673) 1783 0 R (cite.RFC2782) 1707 0 R (cite.RFC2825) 1751 0 R (cite.RFC2826) 1729 0 R (cite.RFC2845) 1644 0 R (cite.RFC2874) 1785 0 R (cite.RFC2915) 1709 0 R (cite.RFC2929) 1731 0 R (cite.RFC2930) 1646 0 R (cite.RFC2931) 1648 0 R (cite.RFC3007) 1650 0 R (cite.RFC3008) 1799 0 R (cite.RFC3071) 1773 0 R (cite.RFC3090) 1801 0 R (cite.RFC3110) 1711 0 R (cite.RFC3123) 1713 0 R (cite.RFC3225) 1656 0 R (cite.RFC3258) 1775 0 R (cite.RFC3445) 1803 0 R (cite.RFC3490) 1753 0 R (cite.RFC3491) 1755 0 R (cite.RFC3492) 1757 0 R (cite.RFC3596) 1715 0 R (cite.RFC3597) 1717 0 R (cite.RFC3645) 1652 0 R (cite.RFC3655) 1805 0 R (cite.RFC3658) 1807 0 R (cite.RFC3755) 1809 0 R (cite.RFC3757) 1811 0 R (cite.RFC3833) 1658 0 R (cite.RFC3845) 1813 0 R (cite.RFC3901) 1777 0 R (cite.RFC4033) 1660 0 R (cite.RFC4035) 1662 0 R (cite.RFC4044) 1664 0 R (cite.RFC4074) 1674 0 R (cite.RFC974) 1627 0 R (cite.id2503298) 1818 0 R (configuration_file_elements) 1129 0 R (controls_statement_definition_and_usage) 1016 0 R (diagnostic_tools) 951 0 R (dynamic_update) 1039 0 R (dynamic_update_policies) 1091 0 R (dynamic_update_security) 1285 0 R (empty) 1351 0 R (historical_dns_information) 1605 0 R (id2464966) 918 0 R (id2466572) 919 0 R (id2467531) 920 0 R (id2467541) 921 0 R (id2467713) 933 0 R (id2467734) 934 0 R (id2467768) 935 0 R (id2467852) 938 0 R (id2467945) 931 0 R (id2470250) 945 0 R (id2470274) 948 0 R (id2470372) 949 0 R (id2470393) 950 0 R (id2470423) 956 0 R (id2470526) 957 0 R (id2470553) 958 0 R (id2470587) 964 0 R (id2470614) 965 0 R (id2470627) 966 0 R (id2470721) 969 0 R (id2470731) 975 0 R (id2470763) 982 0 R (id2470779) 983 0 R (id2470802) 989 0 R (id2470819) 990 0 R (id2471156) 993 0 R (id2471161) 994 0 R (id2473080) 1021 0 R (id2473092) 1022 0 R (id2473485) 1054 0 R (id2473504) 1055 0 R (id2474007) 1071 0 R (id2474024) 1072 0 R (id2474062) 1077 0 R (id2474081) 1078 0 R (id2474091) 1079 0 R (id2474199) 1080 0 R (id2474325) 1085 0 R (id2474370) 1087 0 R (id2474384) 1088 0 R (id2474501) 1089 0 R (id2474569) 1097 0 R (id2474707) 1098 0 R (id2474786) 1103 0 R (id2474860) 1108 0 R (id2474990) 1110 0 R (id2475148) 1111 0 R (id2475181) 1118 0 R (id2475329) 1130 0 R (id2476124) 1139 0 R (id2476152) 1140 0 R (id2476346) 1145 0 R (id2476361) 1146 0 R (id2476391) 1147 0 R (id2476542) 1154 0 R (id2476917) 1160 0 R (id2476960) 1162 0 R (id2477175) 1164 0 R (id2477604) 1171 0 R (id2477621) 1172 0 R (id2477644) 1173 0 R (id2477668) 1179 0 R (id2477827) 1183 0 R (id2477953) 1184 0 R (id2478005) 1190 0 R (id2478766) 1201 0 R (id2479401) 1207 0 R (id2479611) 1212 0 R (id2479675) 1215 0 R (id2479719) 1216 0 R (id2479734) 1217 0 R (id2481874) 1242 0 R (id2483741) 1268 0 R (id2483800) 1274 0 R (id2484364) 1284 0 R (id2485399) 1304 0 R (id2485414) 1305 0 R (id2485529) 1311 0 R (id2485662) 1313 0 R (id2486233) 1331 0 R (id2487651) 1366 0 R (id2488403) 1379 0 R (id2488454) 1380 0 R (id2488673) 1382 0 R (id2490165) 1399 0 R (id2490172) 1400 0 R (id2490178) 1401 0 R (id2490592) 1407 0 R (id2490625) 1408 0 R (id2491981) 1457 0 R (id2492238) 1463 0 R (id2492257) 1464 0 R (id2492277) 1467 0 R (id2492718) 1469 0 R (id2493680) 1479 0 R (id2493808) 1481 0 R (id2493829) 1482 0 R (id2494260) 1489 0 R (id2494396) 1491 0 R (id2494419) 1492 0 R (id2494823) 1495 0 R (id2494948) 1501 0 R (id2494963) 1502 0 R (id2495075) 1504 0 R (id2495165) 1505 0 R (id2495226) 1510 0 R (id2495296) 1511 0 R (id2495332) 1512 0 R (id2495394) 1513 0 R (id2495800) 1519 0 R (id2495822) 1520 0 R (id2496217) 1527 0 R (id2496233) 1532 0 R (id2496307) 1533 0 R (id2497825) 1540 0 R (id2497831) 1541 0 R (id2498208) 1543 0 R (id2498213) 1544 0 R (id2499129) 1553 0 R (id2499317) 1572 0 R (id2499394) 1573 0 R (id2499522) 1574 0 R (id2499602) 1589 0 R (id2499607) 1590 0 R (id2499619) 1591 0 R (id2499636) 1592 0 R (id2499698) 1604 0 R (id2500006) 1610 0 R (id2500194) 1615 0 R (id2500196) 1621 0 R (id2500273) 1626 0 R (id2500296) 1622 0 R (id2500320) 1624 0 R (id2500356) 1635 0 R (id2500382) 1637 0 R (id2500408) 1629 0 R (id2500433) 1631 0 R (id2500456) 1633 0 R (id2500512) 1639 0 R (id2500538) 1641 0 R (id2500565) 1643 0 R (id2500627) 1645 0 R (id2500657) 1647 0 R (id2500686) 1649 0 R (id2500713) 1651 0 R (id2500788) 1654 0 R (id2500795) 1655 0 R (id2500822) 1657 0 R (id2500858) 1659 0 R (id2500923) 1663 0 R (id2500988) 1661 0 R (id2501053) 1666 0 R (id2501062) 1667 0 R (id2501088) 1669 0 R (id2501156) 1671 0 R (id2501191) 1673 0 R (id2501232) 1681 0 R (id2501237) 1682 0 R (id2501294) 1684 0 R (id2501332) 1692 0 R (id2501435) 1686 0 R (id2501490) 1688 0 R (id2501528) 1690 0 R (id2501554) 1694 0 R (id2501579) 1696 0 R (id2501606) 1698 0 R (id2501633) 1700 0 R (id2501672) 1702 0 R (id2501702) 1704 0 R (id2501732) 1706 0 R (id2501774) 1708 0 R (id2501808) 1710 0 R (id2501834) 1712 0 R (id2501858) 1714 0 R (id2501915) 1716 0 R (id2501940) 1719 0 R (id2501947) 1720 0 R (id2501973) 1722 0 R (id2501995) 1724 0 R (id2502019) 1726 0 R (id2502065) 1728 0 R (id2502088) 1730 0 R (id2502138) 1737 0 R (id2502146) 1738 0 R (id2502169) 1740 0 R (id2502196) 1742 0 R (id2502222) 1744 0 R (id2502259) 1746 0 R (id2502299) 1749 0 R (id2502305) 1750 0 R (id2502337) 1752 0 R (id2502382) 1754 0 R (id2502418) 1756 0 R (id2502444) 1759 0 R (id2502462) 1760 0 R (id2502485) 1762 0 R (id2502510) 1764 0 R (id2502536) 1766 0 R (id2502560) 1768 0 R (id2502605) 1770 0 R (id2502629) 1772 0 R (id2502656) 1774 0 R (id2502681) 1776 0 R (id2502718) 1779 0 R (id2502725) 1780 0 R (id2502782) 1782 0 R (id2502809) 1784 0 R (id2502845) 1791 0 R (id2502857) 1792 0 R (id2502897) 1794 0 R (id2502923) 1796 0 R (id2502953) 1798 0 R (id2502979) 1800 0 R (id2503074) 1802 0 R (id2503110) 1804 0 R (id2503146) 1806 0 R (id2503173) 1808 0 R (id2503200) 1810 0 R (id2503244) 1812 0 R (id2503286) 1815 0 R (id2503296) 1817 0 R (id2503298) 1819 0 R (incremental_zone_transfers) 1051 0 R (internet_drafts) 1814 0 R (ipv6addresses) 1112 0 R (journal) 1040 0 R (lwresd) 1119 0 R (man.dig) 1825 0 R (man.dnssec-keygen) 1873 0 R (man.dnssec-signzone) 1891 0 R (man.host) 1858 0 R (man.named) 1940 0 R (man.named-checkconf) 1911 0 R (man.named-checkzone) 1923 0 R (man.rndc) 1962 0 R (man.rndc-confgen) 1991 0 R (man.rndc.conf) 1974 0 R (notify) 1030 0 R (options) 1231 0 R (page.1) 686 0 R (page.10) 955 0 R (page.100) 1789 0 R (page.101) 1823 0 R (page.102) 1832 0 R (page.103) 1838 0 R (page.104) 1844 0 R (page.105) 1848 0 R (page.106) 1853 0 R (page.107) 1865 0 R (page.108) 1869 0 R (page.109) 1881 0 R (page.11) 962 0 R (page.110) 1887 0 R (page.111) 1898 0 R (page.112) 1903 0 R (page.113) 1908 0 R (page.114) 1919 0 R (page.115) 1930 0 R (page.116) 1936 0 R (page.117) 1946 0 R (page.118) 1952 0 R (page.119) 1959 0 R (page.12) 974 0 R (page.120) 1970 0 R (page.121) 1980 0 R (page.122) 1987 0 R (page.123) 1996 0 R (page.124) 2003 0 R (page.13) 979 0 R (page.14) 988 0 R (page.15) 999 0 R (page.16) 1007 0 R (page.17) 1014 0 R (page.18) 1020 0 R (page.19) 1028 0 R (page.2) 711 0 R (page.20) 1050 0 R (page.21) 1060 0 R (page.22) 1065 0 R (page.23) 1069 0 R (page.24) 1076 0 R (page.25) 1084 0 R (page.26) 1095 0 R (page.27) 1102 0 R (page.28) 1107 0 R (page.29) 1116 0 R (page.3) 721 0 R (page.30) 1123 0 R (page.31) 1127 0 R (page.32) 1138 0 R (page.33) 1144 0 R (page.34) 1152 0 R (page.35) 1159 0 R (page.36) 1168 0 R (page.37) 1178 0 R (page.38) 1189 0 R (page.39) 1194 0 R (page.4) 776 0 R (page.40) 1200 0 R (page.41) 1206 0 R (page.42) 1211 0 R (page.43) 1221 0 R (page.44) 1226 0 R (page.45) 1230 0 R (page.46) 1235 0 R (page.47) 1241 0 R (page.48) 1247 0 R (page.49) 1252 0 R (page.5) 840 0 R (page.50) 1263 0 R (page.51) 1267 0 R (page.52) 1272 0 R (page.53) 1281 0 R (page.54) 1289 0 R (page.55) 1294 0 R (page.56) 1299 0 R (page.57) 1303 0 R (page.58) 1310 0 R (page.59) 1317 0 R (page.6) 902 0 R (page.60) 1323 0 R (page.61) 1329 0 R (page.62) 1338 0 R (page.63) 1348 0 R (page.64) 1356 0 R (page.65) 1360 0 R (page.66) 1365 0 R (page.67) 1371 0 R (page.68) 1378 0 R (page.69) 1386 0 R (page.7) 916 0 R (page.70) 1390 0 R (page.71) 1394 0 R (page.72) 1398 0 R (page.73) 1406 0 R (page.74) 1420 0 R (page.75) 1432 0 R (page.76) 1454 0 R (page.77) 1462 0 R (page.78) 1474 0 R (page.79) 1478 0 R (page.8) 930 0 R (page.80) 1488 0 R (page.81) 1500 0 R (page.82) 1509 0 R (page.83) 1518 0 R (page.84) 1525 0 R (page.85) 1531 0 R (page.86) 1539 0 R (page.87) 1549 0 R (page.88) 1557 0 R (page.89) 1561 0 R (page.9) 944 0 R (page.90) 1567 0 R (page.91) 1578 0 R (page.92) 1583 0 R (page.93) 1587 0 R (page.94) 1598 0 R (page.95) 1602 0 R (page.96) 1609 0 R (page.97) 1619 0 R (page.98) 1679 0 R (page.99) 1735 0 R (proposed_standards) 1056 0 R (query_address) 1290 0 R (rfcs) 940 0 R (rndc) 1174 0 R (rrset_ordering) 995 0 R (sample_configuration) 981 0 R (section*.10) 1748 0 R (section*.11) 1758 0 R (section*.12) 1778 0 R (section*.13) 1790 0 R (section*.14) 1816 0 R (section*.15) 1826 0 R (section*.16) 1827 0 R (section*.17) 1828 0 R (section*.18) 1833 0 R (section*.19) 1834 0 R (section*.2) 1614 0 R (section*.20) 1839 0 R (section*.21) 1849 0 R (section*.22) 1854 0 R (section*.23) 1855 0 R (section*.24) 1856 0 R (section*.25) 1857 0 R (section*.26) 1859 0 R (section*.27) 1860 0 R (section*.28) 1861 0 R (section*.29) 1870 0 R (section*.3) 1620 0 R (section*.30) 1871 0 R (section*.31) 1872 0 R (section*.32) 1874 0 R (section*.33) 1875 0 R (section*.34) 1876 0 R (section*.35) 1877 0 R (section*.36) 1882 0 R (section*.37) 1888 0 R (section*.38) 1889 0 R (section*.39) 1890 0 R (section*.4) 1628 0 R (section*.40) 1892 0 R (section*.41) 1893 0 R (section*.42) 1894 0 R (section*.43) 1899 0 R (section*.44) 1904 0 R (section*.45) 1909 0 R (section*.46) 1910 0 R (section*.47) 1912 0 R (section*.48) 1913 0 R (section*.49) 1914 0 R (section*.5) 1653 0 R (section*.50) 1915 0 R (section*.51) 1920 0 R (section*.52) 1921 0 R (section*.53) 1922 0 R (section*.54) 1924 0 R (section*.55) 1925 0 R (section*.56) 1926 0 R (section*.57) 1931 0 R (section*.58) 1937 0 R (section*.59) 1938 0 R (section*.6) 1665 0 R (section*.60) 1939 0 R (section*.61) 1941 0 R (section*.62) 1942 0 R (section*.63) 1947 0 R (section*.64) 1948 0 R (section*.65) 1953 0 R (section*.66) 1954 0 R (section*.67) 1955 0 R (section*.68) 1960 0 R (section*.69) 1961 0 R (section*.7) 1680 0 R (section*.70) 1963 0 R (section*.71) 1964 0 R (section*.72) 1965 0 R (section*.73) 1966 0 R (section*.74) 1971 0 R (section*.75) 1972 0 R (section*.76) 1973 0 R (section*.77) 1975 0 R (section*.78) 1976 0 R (section*.79) 1981 0 R (section*.8) 1718 0 R (section*.80) 1982 0 R (section*.81) 1988 0 R (section*.82) 1989 0 R (section*.83) 1990 0 R (section*.84) 1992 0 R (section*.85) 1997 0 R (section*.86) 1998 0 R (section*.87) 1999 0 R (section*.88) 2004 0 R (section*.89) 2005 0 R (section*.9) 1736 0 R (section*.90) 2006 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.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_statement_definition_and_usage) 1259 0 R (server_statement_grammar) 1367 0 R (statschannels) 1361 0 R (statsfile) 1237 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) 922 0 R (table.1.2) 932 0 R (table.3.1) 991 0 R (table.3.2) 1023 0 R (table.6.1) 1131 0 R (table.6.10) 1470 0 R (table.6.11) 1480 0 R (table.6.12) 1483 0 R (table.6.13) 1490 0 R (table.6.14) 1493 0 R (table.6.15) 1496 0 R (table.6.16) 1503 0 R (table.6.17) 1514 0 R (table.6.18) 1521 0 R (table.6.19) 1534 0 R (table.6.2) 1155 0 R (table.6.20) 1542 0 R (table.6.21) 1545 0 R (table.6.3) 1163 0 R (table.6.4) 1202 0 R (table.6.5) 1243 0 R (table.6.6) 1332 0 R (table.6.7) 1402 0 R (table.6.8) 1458 0 R (table.6.9) 1468 0 R (the_category_phrase) 1196 0 R (the_sortlist_statement) 1319 0 R (topology) 1318 0 R (tsig) 1070 0 R (tuning) 1333 0 R (types_of_resource_records_and_when_to_use_them) 939 0 R (view_statement_grammar) 1352 0 R (zone_statement_grammar) 1277 0 R (zone_transfers) 1046 0 R (zonefile_format) 1344 0 R] /Limits [(Access_Control_Lists) (zonefile_format)] >> endobj -1955 0 obj << -/Kids [1954 0 R] +2031 0 obj << +/Kids [2030 0 R] >> endobj -1956 0 obj << -/Dests 1955 0 R +2032 0 obj << +/Dests 2031 0 R >> endobj -1957 0 obj << +2033 0 obj << /Type /Catalog -/Pages 1952 0 R -/Outlines 1953 0 R -/Names 1956 0 R +/Pages 2028 0 R +/Outlines 2029 0 R +/Names 2032 0 R /PageMode /UseOutlines -/OpenAction 649 0 R +/OpenAction 681 0 R >> endobj -1958 0 obj << +2034 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() -/CreationDate (D:20071031133547+11'00') +/CreationDate (D:20080506014144Z) /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) >> endobj xref -0 1959 +0 2035 0000000001 65535 f 0000000002 00000 f 0000000003 00000 f 0000000004 00000 f 0000000000 00000 f 0000000009 00000 n -0000066894 00000 n -0000672242 00000 n +0000069906 00000 n +0000696437 00000 n 0000000054 00000 n 0000000086 00000 n -0000067018 00000 n -0000672170 00000 n +0000070030 00000 n +0000696365 00000 n 0000000133 00000 n 0000000173 00000 n -0000067143 00000 n -0000672084 00000 n +0000070155 00000 n +0000696279 00000 n 0000000221 00000 n 0000000273 00000 n -0000067268 00000 n -0000671998 00000 n +0000070280 00000 n +0000696193 00000 n 0000000321 00000 n 0000000377 00000 n -0000071531 00000 n -0000671888 00000 n +0000074544 00000 n +0000696083 00000 n 0000000425 00000 n 0000000478 00000 n -0000071656 00000 n -0000671814 00000 n +0000074669 00000 n +0000696009 00000 n 0000000531 00000 n 0000000572 00000 n -0000071781 00000 n -0000671727 00000 n +0000074794 00000 n +0000695922 00000 n 0000000625 00000 n 0000000674 00000 n -0000071906 00000 n -0000671640 00000 n +0000074919 00000 n +0000695835 00000 n 0000000727 00000 n 0000000757 00000 n -0000076184 00000 n -0000671516 00000 n +0000079198 00000 n +0000695711 00000 n 0000000810 00000 n 0000000861 00000 n -0000076309 00000 n -0000671442 00000 n +0000079323 00000 n +0000695637 00000 n 0000000919 00000 n 0000000964 00000 n -0000076434 00000 n -0000671355 00000 n +0000079448 00000 n +0000695550 00000 n 0000001022 00000 n 0000001062 00000 n -0000076559 00000 n -0000671281 00000 n +0000079573 00000 n +0000695476 00000 n 0000001120 00000 n 0000001162 00000 n -0000079531 00000 n -0000671157 00000 n +0000082545 00000 n +0000695352 00000 n 0000001215 00000 n 0000001260 00000 n -0000079656 00000 n -0000671096 00000 n +0000082670 00000 n +0000695291 00000 n 0000001318 00000 n 0000001355 00000 n -0000079781 00000 n -0000671022 00000 n +0000082795 00000 n +0000695217 00000 n 0000001408 00000 n 0000001463 00000 n -0000082709 00000 n -0000670897 00000 n +0000085723 00000 n +0000695092 00000 n 0000001509 00000 n 0000001556 00000 n -0000082834 00000 n -0000670823 00000 n +0000085848 00000 n +0000695018 00000 n 0000001604 00000 n 0000001648 00000 n -0000082959 00000 n -0000670736 00000 n +0000085973 00000 n +0000694931 00000 n 0000001696 00000 n 0000001735 00000 n -0000083084 00000 n -0000670649 00000 n +0000086098 00000 n +0000694844 00000 n 0000001783 00000 n 0000001825 00000 n -0000083208 00000 n -0000670562 00000 n +0000086222 00000 n +0000694757 00000 n 0000001873 00000 n 0000001936 00000 n -0000084294 00000 n -0000670488 00000 n +0000087308 00000 n +0000694683 00000 n 0000001984 00000 n 0000002034 00000 n -0000086004 00000 n -0000670360 00000 n +0000089018 00000 n +0000694555 00000 n 0000002080 00000 n 0000002126 00000 n -0000086128 00000 n -0000670247 00000 n +0000089142 00000 n +0000694442 00000 n 0000002174 00000 n 0000002218 00000 n -0000086253 00000 n -0000670171 00000 n +0000089267 00000 n +0000694366 00000 n 0000002271 00000 n 0000002323 00000 n -0000086378 00000 n -0000670094 00000 n +0000089392 00000 n +0000694289 00000 n 0000002377 00000 n 0000002436 00000 n -0000088906 00000 n -0000670003 00000 n +0000091921 00000 n +0000694198 00000 n 0000002485 00000 n 0000002523 00000 n -0000089158 00000 n -0000669886 00000 n +0000092173 00000 n +0000694081 00000 n 0000002572 00000 n 0000002618 00000 n -0000089284 00000 n -0000669768 00000 n +0000092299 00000 n +0000693963 00000 n 0000002672 00000 n 0000002739 00000 n -0000092491 00000 n -0000669689 00000 n +0000095505 00000 n +0000693884 00000 n 0000002798 00000 n 0000002842 00000 n -0000092617 00000 n -0000669610 00000 n +0000095631 00000 n +0000693805 00000 n 0000002901 00000 n 0000002949 00000 n -0000102946 00000 n -0000669531 00000 n +0000105984 00000 n +0000693726 00000 n 0000003003 00000 n 0000003036 00000 n -0000107915 00000 n -0000669399 00000 n +0000110971 00000 n +0000693594 00000 n 0000003083 00000 n 0000003126 00000 n -0000108041 00000 n -0000669320 00000 n +0000111100 00000 n +0000693515 00000 n 0000003175 00000 n 0000003205 00000 n -0000108167 00000 n -0000669188 00000 n +0000111229 00000 n +0000693383 00000 n 0000003254 00000 n 0000003292 00000 n -0000108293 00000 n -0000669123 00000 n +0000111358 00000 n +0000693318 00000 n 0000003346 00000 n 0000003388 00000 n -0000112549 00000 n -0000669030 00000 n +0000115620 00000 n +0000693225 00000 n 0000003437 00000 n 0000003496 00000 n -0000112678 00000 n -0000668898 00000 n +0000115749 00000 n +0000693093 00000 n 0000003545 00000 n 0000003578 00000 n -0000112807 00000 n -0000668833 00000 n +0000115878 00000 n +0000693028 00000 n 0000003632 00000 n 0000003681 00000 n -0000120116 00000 n -0000668701 00000 n +0000123188 00000 n +0000692896 00000 n 0000003730 00000 n 0000003758 00000 n -0000120245 00000 n -0000668583 00000 n +0000123317 00000 n +0000692778 00000 n 0000003812 00000 n 0000003881 00000 n -0000120374 00000 n -0000668504 00000 n +0000123446 00000 n +0000692699 00000 n 0000003940 00000 n 0000003988 00000 n -0000123205 00000 n -0000668425 00000 n +0000126280 00000 n +0000692620 00000 n 0000004047 00000 n 0000004092 00000 n -0000123334 00000 n -0000668332 00000 n +0000126409 00000 n +0000692527 00000 n 0000004146 00000 n 0000004214 00000 n -0000123463 00000 n -0000668239 00000 n +0000126538 00000 n +0000692434 00000 n 0000004268 00000 n 0000004338 00000 n -0000123592 00000 n -0000668146 00000 n +0000126667 00000 n +0000692341 00000 n 0000004392 00000 n 0000004455 00000 n -0000127494 00000 n -0000668053 00000 n +0000130570 00000 n +0000692248 00000 n 0000004509 00000 n 0000004564 00000 n -0000127623 00000 n -0000667974 00000 n +0000130699 00000 n +0000692169 00000 n 0000004618 00000 n 0000004650 00000 n -0000127752 00000 n -0000667881 00000 n +0000130828 00000 n +0000692076 00000 n 0000004699 00000 n 0000004727 00000 n -0000127881 00000 n -0000667788 00000 n +0000130957 00000 n +0000691983 00000 n 0000004776 00000 n 0000004808 00000 n -0000131500 00000 n -0000667656 00000 n +0000134576 00000 n +0000691851 00000 n 0000004857 00000 n 0000004887 00000 n -0000131629 00000 n -0000667577 00000 n +0000134705 00000 n +0000691772 00000 n 0000004941 00000 n 0000004982 00000 n -0000131757 00000 n -0000667484 00000 n +0000134833 00000 n +0000691679 00000 n 0000005036 00000 n 0000005078 00000 n -0000135199 00000 n -0000667405 00000 n +0000138274 00000 n +0000691600 00000 n 0000005132 00000 n 0000005177 00000 n -0000138273 00000 n -0000667287 00000 n +0000141349 00000 n +0000691482 00000 n 0000005226 00000 n 0000005272 00000 n -0000138402 00000 n -0000667208 00000 n +0000141478 00000 n +0000691403 00000 n 0000005326 00000 n 0000005386 00000 n -0000138530 00000 n -0000667129 00000 n +0000141606 00000 n +0000691324 00000 n 0000005440 00000 n 0000005509 00000 n -0000141010 00000 n -0000666996 00000 n +0000144088 00000 n +0000691191 00000 n 0000005556 00000 n 0000005609 00000 n -0000141139 00000 n -0000666917 00000 n +0000144217 00000 n +0000691112 00000 n 0000005658 00000 n 0000005714 00000 n -0000141268 00000 n -0000666838 00000 n +0000144346 00000 n +0000691033 00000 n 0000005763 00000 n 0000005812 00000 n -0000145452 00000 n -0000666705 00000 n +0000148530 00000 n +0000690900 00000 n 0000005859 00000 n 0000005911 00000 n -0000145581 00000 n -0000666587 00000 n +0000148659 00000 n +0000690782 00000 n 0000005960 00000 n 0000006011 00000 n -0000149858 00000 n -0000666469 00000 n +0000152938 00000 n +0000690664 00000 n 0000006065 00000 n 0000006110 00000 n -0000149987 00000 n -0000666390 00000 n +0000153067 00000 n +0000690585 00000 n 0000006169 00000 n 0000006203 00000 n -0000150116 00000 n -0000666311 00000 n +0000153196 00000 n +0000690506 00000 n 0000006262 00000 n 0000006310 00000 n -0000153650 00000 n -0000666193 00000 n +0000156728 00000 n +0000690388 00000 n 0000006364 00000 n 0000006404 00000 n -0000153779 00000 n -0000666114 00000 n +0000156857 00000 n +0000690309 00000 n 0000006463 00000 n 0000006497 00000 n -0000153908 00000 n -0000666035 00000 n +0000156986 00000 n +0000690230 00000 n 0000006556 00000 n 0000006604 00000 n -0000157771 00000 n -0000665902 00000 n +0000160851 00000 n +0000690097 00000 n 0000006653 00000 n 0000006703 00000 n -0000160870 00000 n -0000665823 00000 n +0000163735 00000 n +0000690018 00000 n 0000006757 00000 n 0000006804 00000 n -0000160998 00000 n -0000665730 00000 n +0000163864 00000 n +0000689925 00000 n 0000006858 00000 n 0000006918 00000 n -0000161257 00000 n -0000665637 00000 n +0000164123 00000 n +0000689832 00000 n 0000006972 00000 n 0000007024 00000 n -0000161386 00000 n -0000665544 00000 n +0000164252 00000 n +0000689739 00000 n 0000007078 00000 n 0000007143 00000 n -0000166285 00000 n -0000665451 00000 n +0000169432 00000 n +0000689646 00000 n 0000007197 00000 n 0000007248 00000 n -0000166414 00000 n -0000665358 00000 n +0000169561 00000 n +0000689553 00000 n 0000007302 00000 n 0000007366 00000 n -0000166543 00000 n -0000665265 00000 n +0000169690 00000 n +0000689460 00000 n 0000007420 00000 n 0000007467 00000 n -0000170308 00000 n -0000665172 00000 n +0000173305 00000 n +0000689367 00000 n 0000007521 00000 n 0000007581 00000 n -0000170437 00000 n -0000665079 00000 n +0000173434 00000 n +0000689274 00000 n 0000007635 00000 n 0000007686 00000 n -0000170566 00000 n -0000664947 00000 n +0000173563 00000 n +0000689142 00000 n 0000007741 00000 n 0000007806 00000 n -0000175098 00000 n -0000664868 00000 n +0000177956 00000 n +0000689063 00000 n 0000007866 00000 n 0000007913 00000 n -0000181525 00000 n -0000664789 00000 n +0000184266 00000 n +0000688984 00000 n 0000007973 00000 n 0000008021 00000 n -0000184795 00000 n -0000664696 00000 n +0000187786 00000 n +0000688891 00000 n 0000008076 00000 n 0000008126 00000 n -0000187652 00000 n -0000664603 00000 n +0000190633 00000 n +0000688798 00000 n 0000008181 00000 n 0000008244 00000 n -0000187781 00000 n -0000664510 00000 n +0000190762 00000 n +0000688705 00000 n 0000008299 00000 n 0000008351 00000 n -0000187909 00000 n -0000664417 00000 n +0000190891 00000 n +0000688612 00000 n 0000008406 00000 n 0000008471 00000 n -0000188037 00000 n -0000664324 00000 n +0000191020 00000 n +0000688519 00000 n 0000008526 00000 n 0000008578 00000 n -0000194604 00000 n -0000664191 00000 n +0000197034 00000 n +0000688386 00000 n 0000008633 00000 n 0000008698 00000 n -0000202603 00000 n -0000664112 00000 n +0000205352 00000 n +0000688307 00000 n 0000008758 00000 n 0000008802 00000 n -0000219854 00000 n -0000664019 00000 n +0000222778 00000 n +0000688214 00000 n 0000008862 00000 n 0000008901 00000 n -0000223372 00000 n -0000663926 00000 n +0000226450 00000 n +0000688121 00000 n 0000008961 00000 n 0000009008 00000 n -0000223499 00000 n -0000663833 00000 n +0000226577 00000 n +0000688028 00000 n 0000009068 00000 n 0000009111 00000 n -0000227712 00000 n -0000663740 00000 n +0000230855 00000 n +0000687935 00000 n 0000009171 00000 n 0000009210 00000 n -0000230808 00000 n -0000663647 00000 n +0000234179 00000 n +0000687842 00000 n 0000009270 00000 n 0000009312 00000 n -0000233931 00000 n -0000663554 00000 n +0000237215 00000 n +0000687749 00000 n 0000009372 00000 n 0000009415 00000 n -0000241657 00000 n -0000663461 00000 n +0000245043 00000 n +0000687656 00000 n 0000009475 00000 n 0000009522 00000 n -0000241786 00000 n -0000663368 00000 n +0000245172 00000 n +0000687563 00000 n 0000009582 00000 n 0000009643 00000 n -0000245605 00000 n -0000663275 00000 n +0000249012 00000 n +0000687470 00000 n 0000009704 00000 n 0000009756 00000 n -0000245734 00000 n -0000663182 00000 n +0000249141 00000 n +0000687377 00000 n 0000009817 00000 n 0000009870 00000 n -0000248983 00000 n -0000663089 00000 n +0000252166 00000 n +0000687284 00000 n 0000009931 00000 n 0000009969 00000 n -0000249112 00000 n -0000662996 00000 n +0000252295 00000 n +0000687191 00000 n 0000010030 00000 n 0000010082 00000 n -0000253078 00000 n -0000662903 00000 n +0000256271 00000 n +0000687098 00000 n 0000010143 00000 n 0000010187 00000 n -0000256388 00000 n -0000662810 00000 n +0000260104 00000 n +0000687005 00000 n 0000010248 00000 n 0000010284 00000 n -0000264852 00000 n -0000662717 00000 n +0000268639 00000 n +0000686912 00000 n 0000010345 00000 n 0000010408 00000 n -0000264981 00000 n -0000662624 00000 n +0000268768 00000 n +0000686819 00000 n 0000010469 00000 n 0000010519 00000 n -0000270896 00000 n -0000662531 00000 n +0000274993 00000 n +0000686740 00000 n 0000010580 00000 n -0000010629 00000 n -0000271155 00000 n -0000662452 00000 n -0000010690 00000 n -0000010746 00000 n -0000274528 00000 n -0000662359 00000 n -0000010801 00000 n -0000010852 00000 n -0000279551 00000 n -0000662266 00000 n -0000010907 00000 n -0000010971 00000 n -0000283053 00000 n -0000662173 00000 n -0000011026 00000 n -0000011083 00000 n -0000283182 00000 n -0000662080 00000 n -0000011138 00000 n -0000011208 00000 n -0000283311 00000 n -0000661987 00000 n -0000011263 00000 n -0000011312 00000 n -0000283440 00000 n -0000661894 00000 n -0000011367 00000 n -0000011429 00000 n -0000286034 00000 n -0000661801 00000 n -0000011484 00000 n -0000011533 00000 n -0000291265 00000 n -0000661683 00000 n -0000011588 00000 n -0000011650 00000 n -0000291394 00000 n -0000661604 00000 n -0000011710 00000 n -0000011749 00000 n -0000295447 00000 n -0000661511 00000 n -0000011809 00000 n -0000011843 00000 n -0000301339 00000 n -0000661418 00000 n -0000011903 00000 n -0000011944 00000 n -0000311696 00000 n -0000661339 00000 n -0000012004 00000 n -0000012056 00000 n -0000315963 00000 n -0000661221 00000 n -0000012105 00000 n -0000012138 00000 n -0000316092 00000 n -0000661103 00000 n -0000012192 00000 n -0000012264 00000 n -0000316220 00000 n -0000661024 00000 n -0000012323 00000 n -0000012367 00000 n -0000327286 00000 n -0000660945 00000 n -0000012426 00000 n -0000012479 00000 n -0000327674 00000 n -0000660852 00000 n -0000012533 00000 n -0000012583 00000 n -0000331107 00000 n -0000660759 00000 n -0000012637 00000 n -0000012675 00000 n -0000331366 00000 n -0000660666 00000 n -0000012729 00000 n +0000010636 00000 n +0000275121 00000 n +0000686647 00000 n +0000010691 00000 n +0000010755 00000 n +0000278582 00000 n +0000686554 00000 n +0000010810 00000 n +0000010887 00000 n +0000278711 00000 n +0000686461 00000 n +0000010942 00000 n +0000010993 00000 n +0000278840 00000 n +0000686368 00000 n +0000011048 00000 n +0000011112 00000 n +0000287116 00000 n +0000686275 00000 n +0000011167 00000 n +0000011224 00000 n +0000287245 00000 n +0000686182 00000 n +0000011279 00000 n +0000011349 00000 n +0000287373 00000 n +0000686089 00000 n +0000011404 00000 n +0000011453 00000 n +0000287502 00000 n +0000685996 00000 n +0000011508 00000 n +0000011570 00000 n +0000289734 00000 n +0000685903 00000 n +0000011625 00000 n +0000011674 00000 n +0000295929 00000 n +0000685785 00000 n +0000011729 00000 n +0000011791 00000 n +0000296058 00000 n +0000685706 00000 n +0000011851 00000 n +0000011890 00000 n +0000301098 00000 n +0000685613 00000 n +0000011950 00000 n +0000011984 00000 n +0000301226 00000 n +0000685520 00000 n +0000012044 00000 n +0000012085 00000 n +0000316788 00000 n +0000685441 00000 n +0000012145 00000 n +0000012197 00000 n +0000320751 00000 n +0000685309 00000 n +0000012246 00000 n +0000012279 00000 n +0000320880 00000 n +0000685191 00000 n +0000012333 00000 n +0000012405 00000 n +0000321008 00000 n +0000685112 00000 n +0000012464 00000 n +0000012508 00000 n +0000328396 00000 n +0000685033 00000 n +0000012567 00000 n +0000012620 00000 n +0000332073 00000 n +0000684940 00000 n +0000012674 00000 n +0000012724 00000 n +0000332331 00000 n +0000684847 00000 n 0000012778 00000 n -0000334263 00000 n -0000660534 00000 n -0000012832 00000 n -0000012884 00000 n -0000334391 00000 n -0000660455 00000 n -0000012943 00000 n -0000012995 00000 n -0000334520 00000 n -0000660362 00000 n -0000013054 00000 n -0000013107 00000 n -0000334648 00000 n -0000660283 00000 n -0000013166 00000 n -0000013215 00000 n -0000334777 00000 n -0000660190 00000 n -0000013269 00000 n -0000013349 00000 n -0000338704 00000 n -0000660111 00000 n -0000013403 00000 n -0000013452 00000 n -0000342023 00000 n -0000659978 00000 n -0000013499 00000 n -0000013551 00000 n -0000342152 00000 n -0000659899 00000 n -0000013600 00000 n -0000013644 00000 n -0000346338 00000 n -0000659767 00000 n -0000013693 00000 n -0000013734 00000 n -0000346467 00000 n -0000659688 00000 n +0000012816 00000 n +0000335585 00000 n +0000684754 00000 n +0000012870 00000 n +0000012919 00000 n +0000335843 00000 n +0000684622 00000 n +0000012973 00000 n +0000013025 00000 n +0000335972 00000 n +0000684543 00000 n +0000013084 00000 n +0000013136 00000 n +0000338788 00000 n +0000684450 00000 n +0000013195 00000 n +0000013248 00000 n +0000338917 00000 n +0000684371 00000 n +0000013307 00000 n +0000013356 00000 n +0000339046 00000 n +0000684278 00000 n +0000013410 00000 n +0000013490 00000 n +0000343375 00000 n +0000684199 00000 n +0000013544 00000 n +0000013593 00000 n +0000343504 00000 n +0000684081 00000 n +0000013642 00000 n +0000013682 00000 n +0000347194 00000 n +0000684002 00000 n +0000013741 00000 n 0000013788 00000 n -0000013836 00000 n -0000346595 00000 n -0000659609 00000 n -0000013890 00000 n -0000013941 00000 n -0000346724 00000 n -0000659530 00000 n -0000013990 00000 n -0000014037 00000 n -0000350987 00000 n -0000659397 00000 n -0000014084 00000 n -0000014121 00000 n -0000351116 00000 n -0000659279 00000 n -0000014170 00000 n -0000014209 00000 n -0000351245 00000 n -0000659214 00000 n -0000014263 00000 n -0000014341 00000 n -0000351374 00000 n -0000659121 00000 n -0000014390 00000 n -0000014457 00000 n -0000351503 00000 n -0000659042 00000 n -0000014506 00000 n -0000014551 00000 n -0000354942 00000 n -0000658909 00000 n -0000014599 00000 n -0000014631 00000 n -0000355071 00000 n -0000658791 00000 n -0000014680 00000 n -0000014719 00000 n -0000355200 00000 n -0000658726 00000 n -0000014773 00000 n -0000014834 00000 n -0000358965 00000 n -0000658594 00000 n -0000014883 00000 n -0000014940 00000 n -0000359094 00000 n -0000658529 00000 n -0000014994 00000 n -0000015043 00000 n -0000359223 00000 n -0000658411 00000 n -0000015092 00000 n -0000015154 00000 n -0000359352 00000 n -0000658332 00000 n -0000015208 00000 n -0000015263 00000 n -0000383375 00000 n -0000658239 00000 n -0000015317 00000 n -0000015358 00000 n -0000383504 00000 n -0000658160 00000 n -0000015412 00000 n -0000015464 00000 n -0000386207 00000 n -0000658040 00000 n -0000015512 00000 n -0000015546 00000 n -0000386336 00000 n -0000657961 00000 n -0000015595 00000 n -0000015622 00000 n -0000404272 00000 n -0000657868 00000 n -0000015671 00000 n -0000015699 00000 n -0000411809 00000 n -0000657775 00000 n -0000015748 00000 n -0000015785 00000 n -0000418149 00000 n -0000657682 00000 n -0000015834 00000 n -0000015873 00000 n -0000427649 00000 n -0000657589 00000 n -0000015922 00000 n -0000015961 00000 n -0000430507 00000 n -0000657496 00000 n -0000016010 00000 n -0000016049 00000 n -0000436910 00000 n -0000657403 00000 n -0000016098 00000 n -0000016127 00000 n -0000446426 00000 n -0000657310 00000 n -0000016176 00000 n -0000016204 00000 n -0000449575 00000 n -0000657217 00000 n -0000016253 00000 n -0000016286 00000 n -0000455680 00000 n -0000657138 00000 n -0000016336 00000 n -0000016373 00000 n -0000016742 00000 n -0000016864 00000 n -0000024693 00000 n -0000016426 00000 n -0000024567 00000 n -0000024630 00000 n -0000653001 00000 n -0000627058 00000 n -0000652827 00000 n -0000654026 00000 n -0000019727 00000 n -0000019944 00000 n -0000020013 00000 n -0000020082 00000 n -0000020150 00000 n -0000020218 00000 n -0000020267 00000 n -0000020314 00000 n -0000020647 00000 n -0000020669 00000 n -0000020837 00000 n -0000021002 00000 n -0000021171 00000 n -0000021350 00000 n -0000021659 00000 n -0000021819 00000 n -0000026052 00000 n -0000025867 00000 n -0000024793 00000 n -0000025989 00000 n -0000625846 00000 n -0000599367 00000 n -0000625672 00000 n -0000598682 00000 n -0000596538 00000 n -0000598518 00000 n -0000037759 00000 n -0000029108 00000 n -0000026137 00000 n -0000037633 00000 n -0000037696 00000 n -0000029642 00000 n -0000029796 00000 n -0000029953 00000 n -0000030110 00000 n -0000030266 00000 n -0000030423 00000 n -0000030585 00000 n -0000030746 00000 n -0000030907 00000 n -0000031069 00000 n -0000031236 00000 n -0000031403 00000 n -0000031568 00000 n -0000031730 00000 n -0000031896 00000 n -0000032057 00000 n -0000032212 00000 n -0000032369 00000 n -0000032525 00000 n -0000032682 00000 n -0000032839 00000 n -0000032996 00000 n -0000033150 00000 n -0000033306 00000 n -0000033468 00000 n -0000033630 00000 n -0000033786 00000 n -0000033943 00000 n -0000034105 00000 n -0000034272 00000 n -0000034438 00000 n -0000034599 00000 n -0000034754 00000 n -0000034911 00000 n -0000035068 00000 n -0000035230 00000 n -0000035387 00000 n -0000035544 00000 n -0000035706 00000 n -0000035863 00000 n -0000036025 00000 n -0000036192 00000 n -0000036358 00000 n -0000036520 00000 n -0000036682 00000 n -0000036844 00000 n -0000037006 00000 n -0000037168 00000 n -0000037323 00000 n -0000037478 00000 n -0000051123 00000 n -0000041075 00000 n -0000037844 00000 n -0000051060 00000 n -0000595987 00000 n -0000578906 00000 n -0000595803 00000 n -0000041665 00000 n -0000041828 00000 n -0000041990 00000 n -0000042153 00000 n -0000042311 00000 n -0000042474 00000 n -0000042637 00000 n -0000042792 00000 n -0000042950 00000 n -0000043108 00000 n -0000043264 00000 n -0000043422 00000 n -0000043585 00000 n -0000043753 00000 n -0000043921 00000 n -0000044084 00000 n -0000044252 00000 n -0000044420 00000 n -0000044578 00000 n -0000044741 00000 n -0000044904 00000 n -0000045066 00000 n -0000045228 00000 n -0000045391 00000 n -0000045553 00000 n -0000045715 00000 n -0000045878 00000 n -0000046041 00000 n -0000046204 00000 n -0000046373 00000 n -0000046542 00000 n -0000046706 00000 n -0000046869 00000 n -0000047033 00000 n -0000047197 00000 n -0000047360 00000 n -0000047524 00000 n -0000047693 00000 n -0000047861 00000 n -0000048030 00000 n -0000048199 00000 n -0000048368 00000 n -0000048537 00000 n -0000048706 00000 n -0000048875 00000 n -0000049044 00000 n -0000049214 00000 n -0000049384 00000 n -0000049554 00000 n -0000049723 00000 n -0000049893 00000 n -0000050063 00000 n -0000050231 00000 n -0000050400 00000 n -0000050570 00000 n -0000050737 00000 n -0000050898 00000 n -0000063946 00000 n -0000054652 00000 n -0000051221 00000 n -0000063883 00000 n -0000055218 00000 n -0000055381 00000 n -0000055544 00000 n -0000055707 00000 n -0000055870 00000 n -0000056032 00000 n -0000056195 00000 n -0000056363 00000 n -0000056531 00000 n -0000056697 00000 n -0000056865 00000 n -0000057022 00000 n -0000057184 00000 n -0000057351 00000 n -0000057518 00000 n -0000057680 00000 n -0000057842 00000 n -0000058004 00000 n -0000058166 00000 n -0000058333 00000 n -0000058500 00000 n -0000058667 00000 n -0000058829 00000 n -0000058991 00000 n -0000059146 00000 n -0000059301 00000 n -0000059458 00000 n -0000059620 00000 n -0000059782 00000 n -0000059939 00000 n -0000060094 00000 n -0000060251 00000 n -0000060413 00000 n -0000060569 00000 n -0000060726 00000 n -0000060882 00000 n -0000061039 00000 n -0000061201 00000 n -0000061358 00000 n -0000061520 00000 n -0000061677 00000 n -0000061838 00000 n -0000062000 00000 n -0000062162 00000 n -0000062317 00000 n -0000062473 00000 n -0000062630 00000 n -0000062787 00000 n -0000062944 00000 n -0000063100 00000 n -0000063257 00000 n -0000063414 00000 n -0000577940 00000 n -0000557973 00000 n -0000577767 00000 n -0000063571 00000 n -0000063727 00000 n -0000064391 00000 n -0000064206 00000 n -0000064057 00000 n -0000064328 00000 n -0000067519 00000 n -0000066709 00000 n -0000064432 00000 n -0000066831 00000 n -0000066955 00000 n -0000067080 00000 n -0000067205 00000 n -0000557084 00000 n -0000535753 00000 n -0000556910 00000 n -0000067330 00000 n -0000067393 00000 n -0000067456 00000 n -0000534981 00000 n -0000517360 00000 n -0000534808 00000 n -0000654144 00000 n -0000072030 00000 n -0000070848 00000 n -0000067643 00000 n -0000071342 00000 n -0000071405 00000 n -0000071468 00000 n -0000071593 00000 n -0000071718 00000 n -0000071843 00000 n -0000070998 00000 n -0000071191 00000 n -0000071968 00000 n -0000316156 00000 n -0000359416 00000 n -0000076684 00000 n -0000075648 00000 n -0000072154 00000 n -0000076121 00000 n -0000076246 00000 n -0000075798 00000 n -0000075960 00000 n -0000076371 00000 n -0000076496 00000 n -0000076621 00000 n -0000092554 00000 n -0000079906 00000 n -0000079346 00000 n -0000076808 00000 n -0000079468 00000 n -0000079593 00000 n -0000079718 00000 n -0000079843 00000 n -0000083333 00000 n -0000082192 00000 n -0000080017 00000 n -0000082646 00000 n -0000082771 00000 n -0000082896 00000 n -0000083021 00000 n -0000083146 00000 n -0000082342 00000 n -0000082494 00000 n -0000083270 00000 n -0000271219 00000 n -0000084419 00000 n -0000084109 00000 n -0000083418 00000 n -0000084231 00000 n -0000084356 00000 n -0000086504 00000 n -0000085819 00000 n -0000084517 00000 n -0000085941 00000 n -0000086066 00000 n -0000086190 00000 n -0000086315 00000 n -0000086441 00000 n -0000654262 00000 n -0000089409 00000 n -0000088541 00000 n -0000086602 00000 n -0000088843 00000 n -0000088969 00000 n -0000089032 00000 n -0000089095 00000 n -0000088683 00000 n -0000089221 00000 n -0000089347 00000 n -0000253142 00000 n -0000092743 00000 n -0000092306 00000 n -0000089520 00000 n -0000092428 00000 n -0000516704 00000 n -0000505122 00000 n -0000516527 00000 n -0000092680 00000 n -0000096528 00000 n -0000096343 00000 n -0000092867 00000 n -0000096465 00000 n -0000504587 00000 n -0000495073 00000 n -0000504410 00000 n -0000100912 00000 n -0000100521 00000 n -0000096691 00000 n -0000100849 00000 n -0000100663 00000 n -0000161450 00000 n -0000103198 00000 n -0000102761 00000 n -0000101049 00000 n -0000102883 00000 n -0000103009 00000 n -0000103072 00000 n -0000103135 00000 n -0000105889 00000 n -0000108420 00000 n -0000105738 00000 n -0000103322 00000 n -0000107852 00000 n -0000107978 00000 n -0000108104 00000 n -0000107531 00000 n -0000107692 00000 n -0000494214 00000 n -0000484842 00000 n -0000494042 00000 n -0000484280 00000 n -0000475197 00000 n -0000484107 00000 n -0000108230 00000 n -0000108356 00000 n -0000654380 00000 n -0000107360 00000 n -0000107418 00000 n -0000107508 00000 n -0000202667 00000 n -0000233995 00000 n -0000112936 00000 n -0000112001 00000 n -0000108572 00000 n -0000112484 00000 n -0000112613 00000 n -0000112157 00000 n -0000112322 00000 n -0000112742 00000 n -0000112871 00000 n -0000363441 00000 n -0000116550 00000 n -0000116170 00000 n -0000113087 00000 n -0000116485 00000 n -0000116317 00000 n -0000117799 00000 n -0000117608 00000 n -0000116675 00000 n -0000117734 00000 n -0000120502 00000 n -0000119925 00000 n -0000117898 00000 n -0000120051 00000 n -0000120180 00000 n -0000120309 00000 n -0000120438 00000 n -0000123721 00000 n -0000123014 00000 n -0000120640 00000 n -0000123140 00000 n -0000123269 00000 n -0000123398 00000 n -0000123527 00000 n -0000123656 00000 n -0000128009 00000 n -0000127111 00000 n -0000123846 00000 n -0000127429 00000 n -0000127558 00000 n -0000127258 00000 n -0000127687 00000 n -0000127816 00000 n -0000127944 00000 n -0000654504 00000 n -0000311760 00000 n -0000131886 00000 n -0000131309 00000 n -0000128134 00000 n -0000131435 00000 n -0000131564 00000 n -0000131692 00000 n -0000131821 00000 n -0000135328 00000 n -0000135008 00000 n -0000132024 00000 n -0000135134 00000 n -0000135263 00000 n -0000138659 00000 n -0000137900 00000 n -0000135440 00000 n -0000138208 00000 n -0000138337 00000 n -0000138047 00000 n -0000138466 00000 n -0000138594 00000 n -0000359158 00000 n -0000141397 00000 n -0000140819 00000 n -0000138825 00000 n -0000140945 00000 n -0000141074 00000 n -0000141203 00000 n -0000141332 00000 n -0000141837 00000 n -0000141646 00000 n -0000141496 00000 n -0000141772 00000 n -0000145839 00000 n -0000145073 00000 n -0000141879 00000 n -0000145387 00000 n -0000145516 00000 n -0000145644 00000 n -0000145709 00000 n -0000145774 00000 n -0000145220 00000 n -0000654629 00000 n -0000149922 00000 n -0000150245 00000 n -0000149667 00000 n -0000145938 00000 n -0000149793 00000 n -0000150051 00000 n -0000150180 00000 n -0000154037 00000 n -0000153459 00000 n -0000150370 00000 n -0000153585 00000 n -0000153714 00000 n -0000153843 00000 n -0000153972 00000 n -0000156780 00000 n -0000158029 00000 n -0000156654 00000 n -0000154175 00000 n -0000157706 00000 n -0000157835 00000 n -0000157900 00000 n -0000157964 00000 n -0000161513 00000 n -0000160679 00000 n -0000158183 00000 n -0000160805 00000 n -0000160934 00000 n -0000161062 00000 n -0000161127 00000 n -0000161192 00000 n -0000161321 00000 n -0000166671 00000 n -0000165754 00000 n -0000161625 00000 n -0000166220 00000 n -0000165910 00000 n -0000166061 00000 n -0000166349 00000 n -0000166478 00000 n -0000166606 00000 n -0000461387 00000 n -0000170695 00000 n -0000169553 00000 n -0000166809 00000 n -0000170243 00000 n -0000170372 00000 n -0000169718 00000 n -0000169870 00000 n -0000170057 00000 n -0000170501 00000 n -0000170630 00000 n -0000654754 00000 n -0000175227 00000 n -0000174907 00000 n -0000170820 00000 n -0000175033 00000 n -0000175162 00000 n -0000178416 00000 n -0000178037 00000 n -0000175352 00000 n -0000178351 00000 n -0000178184 00000 n -0000181589 00000 n -0000181784 00000 n -0000181334 00000 n -0000178528 00000 n -0000181460 00000 n -0000181654 00000 n -0000181719 00000 n -0000184923 00000 n -0000184604 00000 n -0000181896 00000 n -0000184730 00000 n -0000184858 00000 n -0000188166 00000 n -0000187126 00000 n -0000185035 00000 n -0000187587 00000 n -0000187716 00000 n -0000187282 00000 n -0000187436 00000 n -0000187844 00000 n -0000187973 00000 n -0000188101 00000 n -0000189726 00000 n -0000189535 00000 n -0000188278 00000 n -0000189661 00000 n -0000654879 00000 n -0000191214 00000 n -0000191023 00000 n -0000189825 00000 n +0000347322 00000 n +0000683884 00000 n +0000013842 00000 n +0000013887 00000 n +0000350644 00000 n +0000683805 00000 n +0000013946 00000 n +0000014005 00000 n +0000353439 00000 n +0000683712 00000 n +0000014064 00000 n +0000014128 00000 n +0000353698 00000 n +0000683619 00000 n +0000014187 00000 n +0000014243 00000 n +0000355369 00000 n +0000683540 00000 n +0000014302 00000 n +0000014364 00000 n +0000357603 00000 n +0000683407 00000 n +0000014411 00000 n +0000014463 00000 n +0000357732 00000 n +0000683328 00000 n +0000014512 00000 n +0000014556 00000 n +0000361918 00000 n +0000683196 00000 n +0000014605 00000 n +0000014646 00000 n +0000362047 00000 n +0000683117 00000 n +0000014700 00000 n +0000014748 00000 n +0000362175 00000 n +0000683038 00000 n +0000014802 00000 n +0000014853 00000 n +0000362304 00000 n +0000682959 00000 n +0000014902 00000 n +0000014949 00000 n +0000366571 00000 n +0000682826 00000 n +0000014996 00000 n +0000015033 00000 n +0000366700 00000 n +0000682708 00000 n +0000015082 00000 n +0000015121 00000 n +0000366829 00000 n +0000682643 00000 n +0000015175 00000 n +0000015253 00000 n +0000366958 00000 n +0000682550 00000 n +0000015302 00000 n +0000015369 00000 n +0000367087 00000 n +0000682471 00000 n +0000015418 00000 n +0000015463 00000 n +0000370526 00000 n +0000682338 00000 n +0000015511 00000 n +0000015543 00000 n +0000370655 00000 n +0000682220 00000 n +0000015592 00000 n +0000015631 00000 n +0000370784 00000 n +0000682155 00000 n +0000015685 00000 n +0000015746 00000 n +0000374549 00000 n +0000682023 00000 n +0000015795 00000 n +0000015852 00000 n +0000374678 00000 n +0000681958 00000 n +0000015906 00000 n +0000015955 00000 n +0000374807 00000 n +0000681840 00000 n +0000016004 00000 n +0000016066 00000 n +0000374936 00000 n +0000681761 00000 n +0000016120 00000 n +0000016175 00000 n +0000398960 00000 n +0000681668 00000 n +0000016229 00000 n +0000016270 00000 n +0000399089 00000 n +0000681589 00000 n +0000016324 00000 n +0000016376 00000 n +0000401791 00000 n +0000681469 00000 n +0000016424 00000 n +0000016458 00000 n +0000401920 00000 n +0000681390 00000 n +0000016507 00000 n +0000016534 00000 n +0000419860 00000 n +0000681297 00000 n +0000016583 00000 n +0000016611 00000 n +0000427395 00000 n +0000681204 00000 n +0000016660 00000 n +0000016697 00000 n +0000433738 00000 n +0000681111 00000 n +0000016746 00000 n +0000016785 00000 n +0000443242 00000 n +0000681018 00000 n +0000016834 00000 n +0000016873 00000 n +0000446100 00000 n +0000680925 00000 n +0000016922 00000 n +0000016961 00000 n +0000452504 00000 n +0000680832 00000 n +0000017010 00000 n +0000017039 00000 n +0000462033 00000 n +0000680739 00000 n +0000017088 00000 n +0000017116 00000 n +0000465188 00000 n +0000680646 00000 n +0000017165 00000 n +0000017198 00000 n +0000471294 00000 n +0000680567 00000 n +0000017248 00000 n +0000017285 00000 n +0000017654 00000 n +0000017776 00000 n +0000025605 00000 n +0000017338 00000 n +0000025479 00000 n +0000025542 00000 n +0000676310 00000 n +0000650367 00000 n +0000676136 00000 n +0000677335 00000 n +0000020639 00000 n +0000020856 00000 n +0000020925 00000 n +0000020994 00000 n +0000021062 00000 n +0000021130 00000 n +0000021179 00000 n +0000021226 00000 n +0000021559 00000 n +0000021581 00000 n +0000021749 00000 n +0000021914 00000 n +0000022083 00000 n +0000022262 00000 n +0000022571 00000 n +0000022731 00000 n +0000026969 00000 n +0000026784 00000 n +0000025705 00000 n +0000026906 00000 n +0000649146 00000 n +0000622625 00000 n +0000648972 00000 n +0000621940 00000 n +0000619795 00000 n +0000621776 00000 n +0000038676 00000 n +0000030025 00000 n +0000027054 00000 n +0000038550 00000 n +0000038613 00000 n +0000030559 00000 n +0000030713 00000 n +0000030870 00000 n +0000031027 00000 n +0000031183 00000 n +0000031340 00000 n +0000031502 00000 n +0000031663 00000 n +0000031824 00000 n +0000031986 00000 n +0000032153 00000 n +0000032320 00000 n +0000032485 00000 n +0000032647 00000 n +0000032813 00000 n +0000032974 00000 n +0000033129 00000 n +0000033286 00000 n +0000033442 00000 n +0000033599 00000 n +0000033756 00000 n +0000033913 00000 n +0000034067 00000 n +0000034223 00000 n +0000034385 00000 n +0000034547 00000 n +0000034703 00000 n +0000034860 00000 n +0000035022 00000 n +0000035189 00000 n +0000035355 00000 n +0000035516 00000 n +0000035671 00000 n +0000035828 00000 n +0000035985 00000 n +0000036147 00000 n +0000036304 00000 n +0000036461 00000 n +0000036623 00000 n +0000036780 00000 n +0000036942 00000 n +0000037109 00000 n +0000037275 00000 n +0000037437 00000 n +0000037599 00000 n +0000037761 00000 n +0000037923 00000 n +0000038085 00000 n +0000038240 00000 n +0000038395 00000 n +0000052052 00000 n +0000042010 00000 n +0000038761 00000 n +0000051989 00000 n +0000619244 00000 n +0000602163 00000 n +0000619060 00000 n +0000042600 00000 n +0000042763 00000 n +0000042925 00000 n +0000043088 00000 n +0000043246 00000 n +0000043409 00000 n +0000043572 00000 n +0000043727 00000 n +0000043885 00000 n +0000044043 00000 n +0000044199 00000 n +0000044357 00000 n +0000044520 00000 n +0000044688 00000 n +0000044856 00000 n +0000045019 00000 n +0000045187 00000 n +0000045355 00000 n +0000045513 00000 n +0000045676 00000 n +0000045839 00000 n +0000046001 00000 n +0000046163 00000 n +0000046326 00000 n +0000046488 00000 n +0000046650 00000 n +0000046813 00000 n +0000046976 00000 n +0000047139 00000 n +0000047308 00000 n +0000047477 00000 n +0000047641 00000 n +0000047804 00000 n +0000047968 00000 n +0000048132 00000 n +0000048295 00000 n +0000048459 00000 n +0000048628 00000 n +0000048796 00000 n +0000048965 00000 n +0000049134 00000 n +0000049303 00000 n +0000049472 00000 n +0000049641 00000 n +0000049810 00000 n +0000049979 00000 n +0000050149 00000 n +0000050319 00000 n +0000050489 00000 n +0000050658 00000 n +0000050828 00000 n +0000050998 00000 n +0000051166 00000 n +0000051335 00000 n +0000051505 00000 n +0000051666 00000 n +0000051827 00000 n +0000065187 00000 n +0000055669 00000 n +0000052150 00000 n +0000065124 00000 n +0000056243 00000 n +0000056406 00000 n +0000056569 00000 n +0000056732 00000 n +0000056895 00000 n +0000057058 00000 n +0000057221 00000 n +0000057383 00000 n +0000057550 00000 n +0000057718 00000 n +0000057886 00000 n +0000058054 00000 n +0000058211 00000 n +0000058373 00000 n +0000058540 00000 n +0000058706 00000 n +0000058868 00000 n +0000059030 00000 n +0000059192 00000 n +0000059354 00000 n +0000059521 00000 n +0000059687 00000 n +0000059854 00000 n +0000060016 00000 n +0000060178 00000 n +0000060335 00000 n +0000060502 00000 n +0000060664 00000 n +0000060831 00000 n +0000060998 00000 n +0000601274 00000 n +0000579943 00000 n +0000601100 00000 n +0000061165 00000 n +0000061332 00000 n +0000061487 00000 n +0000061644 00000 n +0000061801 00000 n +0000061963 00000 n +0000062124 00000 n +0000062280 00000 n +0000062435 00000 n +0000062592 00000 n +0000062754 00000 n +0000062911 00000 n +0000063068 00000 n +0000063224 00000 n +0000063380 00000 n +0000063541 00000 n +0000063698 00000 n +0000063860 00000 n +0000064017 00000 n +0000064179 00000 n +0000064341 00000 n +0000064503 00000 n +0000064659 00000 n +0000064814 00000 n +0000064969 00000 n +0000067346 00000 n +0000065996 00000 n +0000065298 00000 n +0000067283 00000 n +0000066186 00000 n +0000066343 00000 n +0000066500 00000 n +0000066655 00000 n +0000066812 00000 n +0000578977 00000 n +0000559010 00000 n +0000578804 00000 n +0000066968 00000 n +0000067125 00000 n +0000070531 00000 n +0000069721 00000 n +0000067444 00000 n +0000069843 00000 n +0000069967 00000 n +0000070092 00000 n +0000070217 00000 n +0000070342 00000 n +0000070405 00000 n +0000070468 00000 n +0000558238 00000 n +0000540617 00000 n +0000558065 00000 n +0000677453 00000 n +0000075043 00000 n +0000073861 00000 n +0000070655 00000 n +0000074355 00000 n +0000074418 00000 n +0000074481 00000 n +0000074606 00000 n +0000074731 00000 n +0000074856 00000 n +0000074011 00000 n +0000074204 00000 n +0000074981 00000 n +0000320944 00000 n +0000375000 00000 n +0000079698 00000 n +0000078662 00000 n +0000075167 00000 n +0000079135 00000 n +0000079260 00000 n +0000078812 00000 n +0000078974 00000 n +0000079385 00000 n +0000079510 00000 n +0000079635 00000 n +0000095568 00000 n +0000082920 00000 n +0000082360 00000 n +0000079822 00000 n +0000082482 00000 n +0000082607 00000 n +0000082732 00000 n +0000082857 00000 n +0000086347 00000 n +0000085206 00000 n +0000083031 00000 n +0000085660 00000 n +0000085785 00000 n +0000085910 00000 n +0000086035 00000 n +0000086160 00000 n +0000085356 00000 n +0000085508 00000 n +0000086284 00000 n +0000275057 00000 n +0000087433 00000 n +0000087123 00000 n +0000086432 00000 n +0000087245 00000 n +0000087370 00000 n +0000089518 00000 n +0000088833 00000 n +0000087531 00000 n +0000088955 00000 n +0000089080 00000 n +0000089204 00000 n +0000089329 00000 n +0000089455 00000 n +0000677571 00000 n +0000092424 00000 n +0000091556 00000 n +0000089616 00000 n +0000091858 00000 n +0000091984 00000 n +0000092047 00000 n +0000092110 00000 n +0000091698 00000 n +0000092236 00000 n +0000092362 00000 n +0000256335 00000 n +0000095758 00000 n +0000095320 00000 n +0000092535 00000 n +0000095442 00000 n +0000539959 00000 n +0000528372 00000 n +0000539780 00000 n +0000095694 00000 n +0000099548 00000 n +0000099358 00000 n +0000095883 00000 n +0000099483 00000 n +0000527835 00000 n +0000518318 00000 n +0000527656 00000 n +0000103942 00000 n +0000103544 00000 n +0000099714 00000 n +0000103877 00000 n +0000103690 00000 n +0000164316 00000 n +0000106243 00000 n +0000105794 00000 n +0000104081 00000 n +0000105919 00000 n +0000106048 00000 n +0000106113 00000 n +0000106178 00000 n +0000108940 00000 n +0000111487 00000 n +0000108784 00000 n +0000106368 00000 n +0000110906 00000 n +0000111035 00000 n +0000111164 00000 n +0000110583 00000 n +0000110745 00000 n +0000517448 00000 n +0000508028 00000 n +0000517274 00000 n +0000507464 00000 n +0000498378 00000 n +0000507289 00000 n +0000111293 00000 n +0000111422 00000 n +0000677692 00000 n +0000110412 00000 n +0000110470 00000 n +0000110560 00000 n +0000205416 00000 n +0000237279 00000 n +0000116007 00000 n +0000115072 00000 n +0000111643 00000 n +0000115555 00000 n +0000115684 00000 n +0000115228 00000 n +0000115393 00000 n +0000115813 00000 n +0000115942 00000 n +0000379026 00000 n +0000119621 00000 n +0000119241 00000 n +0000116159 00000 n +0000119556 00000 n +0000119388 00000 n +0000120871 00000 n +0000120680 00000 n +0000119746 00000 n +0000120806 00000 n +0000123574 00000 n +0000122997 00000 n +0000120970 00000 n +0000123123 00000 n +0000123252 00000 n +0000123381 00000 n +0000123510 00000 n +0000126796 00000 n +0000126089 00000 n +0000123712 00000 n +0000126215 00000 n +0000126344 00000 n +0000126473 00000 n +0000126602 00000 n +0000126731 00000 n +0000131085 00000 n +0000130187 00000 n +0000126921 00000 n +0000130505 00000 n +0000130634 00000 n +0000130334 00000 n +0000130763 00000 n +0000130892 00000 n +0000131020 00000 n +0000677817 00000 n +0000316852 00000 n +0000134962 00000 n +0000134385 00000 n +0000131210 00000 n +0000134511 00000 n +0000134640 00000 n +0000134768 00000 n +0000134897 00000 n +0000138403 00000 n +0000138083 00000 n +0000135100 00000 n +0000138209 00000 n +0000138338 00000 n +0000141735 00000 n +0000140976 00000 n +0000138515 00000 n +0000141284 00000 n +0000141413 00000 n +0000141123 00000 n +0000141542 00000 n +0000141670 00000 n +0000374742 00000 n +0000144475 00000 n +0000143897 00000 n +0000141903 00000 n +0000144023 00000 n +0000144152 00000 n +0000144281 00000 n +0000144410 00000 n +0000144915 00000 n +0000144724 00000 n +0000144574 00000 n +0000144850 00000 n +0000148917 00000 n +0000148151 00000 n +0000144957 00000 n +0000148465 00000 n +0000148594 00000 n +0000148722 00000 n +0000148787 00000 n +0000148852 00000 n +0000148298 00000 n +0000677942 00000 n +0000153002 00000 n +0000153325 00000 n +0000152747 00000 n +0000149016 00000 n +0000152873 00000 n +0000153131 00000 n +0000153260 00000 n +0000157115 00000 n +0000156537 00000 n +0000153450 00000 n +0000156663 00000 n +0000156792 00000 n +0000156921 00000 n +0000157050 00000 n +0000159860 00000 n +0000161109 00000 n +0000159734 00000 n +0000157253 00000 n +0000160786 00000 n +0000160915 00000 n +0000160980 00000 n +0000161044 00000 n +0000164381 00000 n +0000163544 00000 n +0000161264 00000 n +0000163670 00000 n +0000163799 00000 n +0000163928 00000 n +0000163993 00000 n +0000164058 00000 n +0000164187 00000 n +0000169819 00000 n +0000168903 00000 n +0000164493 00000 n +0000169367 00000 n +0000169059 00000 n +0000169209 00000 n +0000169496 00000 n +0000169625 00000 n +0000169754 00000 n +0000477004 00000 n +0000173692 00000 n +0000172549 00000 n +0000169957 00000 n +0000173240 00000 n +0000173369 00000 n +0000172714 00000 n +0000172866 00000 n +0000173053 00000 n +0000173498 00000 n +0000173627 00000 n +0000678067 00000 n +0000178084 00000 n +0000177765 00000 n +0000173818 00000 n +0000177891 00000 n +0000178020 00000 n +0000181229 00000 n +0000180851 00000 n +0000178209 00000 n +0000181164 00000 n +0000180998 00000 n +0000184330 00000 n +0000184525 00000 n +0000184075 00000 n +0000181341 00000 n +0000184201 00000 n +0000184395 00000 n +0000184460 00000 n +0000187914 00000 n +0000187595 00000 n +0000184637 00000 n +0000187721 00000 n +0000187850 00000 n 0000191149 00000 n -0000194732 00000 n -0000194413 00000 n -0000191313 00000 n -0000194539 00000 n -0000194667 00000 n -0000198800 00000 n -0000198431 00000 n -0000194870 00000 n -0000198735 00000 n -0000198578 00000 n -0000270960 00000 n -0000202861 00000 n -0000202412 00000 n -0000198912 00000 n -0000202538 00000 n -0000202732 00000 n -0000202796 00000 n -0000207067 00000 n -0000206701 00000 n -0000202973 00000 n -0000207002 00000 n -0000206848 00000 n -0000212148 00000 n -0000211017 00000 n -0000207192 00000 n -0000212083 00000 n -0000211200 00000 n -0000211357 00000 n -0000211541 00000 n -0000211714 00000 n -0000211898 00000 n -0000655004 00000 n -0000279615 00000 n -0000216361 00000 n -0000216170 00000 n -0000212340 00000 n -0000216296 00000 n -0000219983 00000 n -0000219663 00000 n -0000216473 00000 n -0000219789 00000 n -0000219918 00000 n -0000223628 00000 n -0000222814 00000 n -0000220095 00000 n -0000223307 00000 n -0000222970 00000 n -0000223436 00000 n -0000223563 00000 n -0000223140 00000 n -0000286098 00000 n -0000227841 00000 n -0000227151 00000 n -0000223781 00000 n -0000227647 00000 n -0000227307 00000 n -0000227477 00000 n -0000227776 00000 n -0000346788 00000 n -0000230937 00000 n -0000230617 00000 n -0000227966 00000 n -0000230743 00000 n -0000230872 00000 n -0000234060 00000 n -0000233740 00000 n -0000231049 00000 n -0000233866 00000 n -0000655129 00000 n -0000237772 00000 n -0000237581 00000 n -0000234213 00000 n -0000237707 00000 n -0000241915 00000 n -0000241270 00000 n -0000237925 00000 n -0000241592 00000 n -0000241721 00000 n -0000241850 00000 n -0000241417 00000 n -0000245863 00000 n -0000245238 00000 n -0000242081 00000 n -0000245540 00000 n -0000245669 00000 n -0000245385 00000 n -0000245798 00000 n -0000249241 00000 n -0000248611 00000 n -0000245975 00000 n -0000248918 00000 n -0000249047 00000 n -0000249176 00000 n -0000248758 00000 n -0000253206 00000 n -0000252534 00000 n -0000249407 00000 n -0000253013 00000 n -0000252690 00000 n -0000252845 00000 n -0000256516 00000 n -0000256067 00000 n -0000253318 00000 n -0000256193 00000 n -0000256258 00000 n -0000256323 00000 n -0000256452 00000 n -0000655254 00000 n -0000261198 00000 n -0000260652 00000 n -0000256708 00000 n -0000261133 00000 n -0000260808 00000 n -0000260970 00000 n -0000474842 00000 n -0000472843 00000 n -0000474677 00000 n -0000338768 00000 n -0000265110 00000 n -0000264471 00000 n -0000261365 00000 n -0000264787 00000 n -0000264916 00000 n -0000264618 00000 n -0000265045 00000 n -0000283375 00000 n -0000267775 00000 n -0000267584 00000 n -0000265235 00000 n -0000267710 00000 n -0000271283 00000 n -0000270705 00000 n -0000267941 00000 n -0000270831 00000 n -0000271025 00000 n -0000271090 00000 n -0000274657 00000 n -0000274337 00000 n -0000271382 00000 n -0000274463 00000 n -0000274592 00000 n -0000279680 00000 n -0000279018 00000 n -0000274769 00000 n -0000279486 00000 n -0000279174 00000 n -0000279326 00000 n -0000655379 00000 n -0000283569 00000 n -0000282687 00000 n -0000279792 00000 n -0000282988 00000 n -0000283117 00000 n -0000283246 00000 n -0000282834 00000 n -0000283504 00000 n -0000286163 00000 n -0000285843 00000 n -0000283681 00000 n -0000285969 00000 n -0000287614 00000 n -0000287423 00000 n -0000286275 00000 n -0000287549 00000 n -0000289031 00000 n -0000288840 00000 n -0000287713 00000 n -0000288966 00000 n -0000291653 00000 n -0000291074 00000 n -0000289130 00000 n -0000291200 00000 n -0000291329 00000 n -0000291458 00000 n -0000291523 00000 n -0000291588 00000 n -0000295576 00000 n -0000295256 00000 n -0000291765 00000 n -0000295382 00000 n -0000295511 00000 n -0000655504 00000 n -0000301468 00000 n -0000298733 00000 n -0000295688 00000 n -0000301274 00000 n -0000301403 00000 n -0000298997 00000 n -0000299159 00000 n -0000299321 00000 n -0000299482 00000 n -0000299642 00000 n -0000299804 00000 n -0000299975 00000 n -0000300137 00000 n -0000300299 00000 n -0000300462 00000 n -0000300625 00000 n -0000300788 00000 n -0000300951 00000 n -0000301114 00000 n -0000306442 00000 n -0000304717 00000 n -0000301580 00000 n -0000306377 00000 n -0000304936 00000 n -0000305099 00000 n -0000305260 00000 n -0000305422 00000 n -0000305584 00000 n -0000305746 00000 n -0000305908 00000 n -0000306062 00000 n -0000306225 00000 n -0000311825 00000 n -0000309464 00000 n -0000306567 00000 n -0000311631 00000 n -0000309710 00000 n -0000309872 00000 n -0000310034 00000 n -0000310196 00000 n -0000310358 00000 n -0000310520 00000 n -0000310682 00000 n -0000310844 00000 n -0000310998 00000 n -0000311159 00000 n -0000311314 00000 n -0000311477 00000 n -0000316476 00000 n -0000315280 00000 n -0000311937 00000 n -0000315768 00000 n -0000315833 00000 n -0000315898 00000 n -0000316027 00000 n -0000316284 00000 n -0000315436 00000 n -0000315606 00000 n -0000316348 00000 n -0000316412 00000 n -0000320089 00000 n -0000319768 00000 n -0000316614 00000 n -0000319894 00000 n -0000319959 00000 n -0000320024 00000 n -0000323772 00000 n -0000323452 00000 n -0000320188 00000 n -0000323578 00000 n -0000323643 00000 n -0000323707 00000 n -0000655629 00000 n -0000327803 00000 n -0000327095 00000 n -0000323884 00000 n -0000327221 00000 n -0000327350 00000 n -0000327415 00000 n -0000327480 00000 n -0000327544 00000 n -0000327609 00000 n -0000327738 00000 n -0000331625 00000 n -0000330786 00000 n -0000327928 00000 n -0000330912 00000 n -0000330977 00000 n -0000331042 00000 n -0000331171 00000 n -0000331236 00000 n -0000331301 00000 n -0000331430 00000 n -0000331495 00000 n -0000331560 00000 n -0000334905 00000 n -0000334072 00000 n -0000331804 00000 n -0000334198 00000 n -0000334327 00000 n -0000334455 00000 n -0000334583 00000 n -0000334712 00000 n -0000334841 00000 n -0000338833 00000 n -0000338383 00000 n -0000335098 00000 n -0000338509 00000 n -0000338574 00000 n -0000338639 00000 n -0000340315 00000 n -0000340124 00000 n -0000338958 00000 n -0000340250 00000 n -0000342280 00000 n -0000341832 00000 n -0000340427 00000 n -0000341958 00000 n -0000342087 00000 n -0000342216 00000 n -0000655754 00000 n -0000346853 00000 n -0000345910 00000 n -0000342392 00000 n -0000346273 00000 n -0000472522 00000 n -0000463309 00000 n -0000472336 00000 n -0000346057 00000 n -0000346402 00000 n -0000346530 00000 n -0000346659 00000 n -0000347891 00000 n -0000347700 00000 n -0000347086 00000 n -0000347826 00000 n -0000348318 00000 n -0000348127 00000 n -0000347977 00000 n -0000348253 00000 n -0000351631 00000 n -0000350405 00000 n -0000348360 00000 n -0000350922 00000 n -0000351051 00000 n -0000351180 00000 n -0000351309 00000 n -0000351438 00000 n -0000351567 00000 n -0000350561 00000 n -0000350733 00000 n -0000352085 00000 n -0000351894 00000 n -0000351744 00000 n -0000352020 00000 n -0000355329 00000 n -0000354751 00000 n -0000352127 00000 n -0000354877 00000 n -0000355006 00000 n -0000355135 00000 n -0000355264 00000 n -0000655879 00000 n -0000359608 00000 n -0000358389 00000 n -0000355415 00000 n -0000358900 00000 n -0000359029 00000 n -0000359287 00000 n -0000358545 00000 n -0000358724 00000 n -0000359480 00000 n -0000359544 00000 n -0000366493 00000 n -0000362665 00000 n -0000359760 00000 n -0000362791 00000 n -0000362856 00000 n -0000362921 00000 n -0000362986 00000 n -0000363051 00000 n -0000363116 00000 n -0000363181 00000 n -0000363246 00000 n -0000363311 00000 n -0000363376 00000 n -0000363506 00000 n -0000363571 00000 n -0000363636 00000 n -0000363701 00000 n -0000363766 00000 n -0000363831 00000 n -0000363896 00000 n -0000363961 00000 n -0000364026 00000 n -0000364091 00000 n -0000364156 00000 n -0000364221 00000 n -0000364286 00000 n -0000364351 00000 n -0000364416 00000 n -0000364481 00000 n -0000364546 00000 n -0000364611 00000 n -0000364676 00000 n -0000364741 00000 n -0000364806 00000 n -0000364871 00000 n -0000364936 00000 n -0000365001 00000 n -0000365065 00000 n -0000365130 00000 n -0000365195 00000 n -0000365260 00000 n -0000365325 00000 n -0000365390 00000 n -0000365455 00000 n -0000365520 00000 n -0000365585 00000 n -0000365650 00000 n -0000365715 00000 n -0000365780 00000 n -0000365845 00000 n -0000365910 00000 n -0000365975 00000 n -0000366040 00000 n -0000366105 00000 n -0000366170 00000 n -0000366235 00000 n -0000366300 00000 n -0000366365 00000 n -0000366429 00000 n -0000373139 00000 n -0000369575 00000 n -0000366605 00000 n -0000369701 00000 n -0000369766 00000 n -0000369831 00000 n -0000369896 00000 n -0000369961 00000 n -0000370026 00000 n -0000370091 00000 n -0000370156 00000 n -0000370221 00000 n -0000370286 00000 n -0000370351 00000 n -0000370416 00000 n -0000370480 00000 n -0000370545 00000 n -0000370610 00000 n -0000370675 00000 n -0000370740 00000 n -0000370805 00000 n -0000370870 00000 n -0000370935 00000 n -0000371000 00000 n -0000371065 00000 n -0000371130 00000 n -0000371195 00000 n -0000371259 00000 n -0000371324 00000 n -0000371389 00000 n -0000371454 00000 n -0000371519 00000 n -0000371584 00000 n -0000371649 00000 n -0000371714 00000 n -0000371779 00000 n -0000371844 00000 n -0000371909 00000 n -0000371974 00000 n -0000372039 00000 n -0000372104 00000 n -0000372169 00000 n -0000372234 00000 n -0000372298 00000 n -0000372362 00000 n -0000372426 00000 n -0000372491 00000 n -0000372556 00000 n -0000372621 00000 n -0000372686 00000 n -0000372751 00000 n -0000372816 00000 n -0000372881 00000 n -0000372946 00000 n -0000373011 00000 n -0000373075 00000 n -0000379314 00000 n -0000375876 00000 n -0000373251 00000 n -0000376002 00000 n -0000376067 00000 n -0000376132 00000 n -0000376197 00000 n -0000376262 00000 n -0000376327 00000 n -0000376392 00000 n -0000376457 00000 n -0000376522 00000 n -0000376587 00000 n -0000376652 00000 n -0000376717 00000 n -0000376782 00000 n -0000376847 00000 n -0000376912 00000 n -0000376977 00000 n -0000377042 00000 n -0000377107 00000 n -0000377172 00000 n -0000377237 00000 n -0000377302 00000 n -0000377367 00000 n -0000377432 00000 n -0000377497 00000 n -0000377562 00000 n -0000377627 00000 n -0000377692 00000 n -0000377757 00000 n -0000377822 00000 n -0000377887 00000 n -0000377952 00000 n -0000378017 00000 n -0000378082 00000 n -0000378147 00000 n -0000378211 00000 n -0000378276 00000 n -0000378341 00000 n -0000378406 00000 n -0000378471 00000 n -0000378536 00000 n -0000378601 00000 n -0000378666 00000 n -0000378731 00000 n -0000378796 00000 n -0000378861 00000 n -0000378926 00000 n -0000378991 00000 n -0000379056 00000 n -0000379121 00000 n -0000379186 00000 n -0000379250 00000 n -0000383893 00000 n -0000381629 00000 n -0000379426 00000 n +0000190112 00000 n +0000188026 00000 n +0000190568 00000 n +0000190697 00000 n +0000190268 00000 n +0000190422 00000 n +0000190826 00000 n +0000190955 00000 n +0000191084 00000 n +0000192655 00000 n +0000192464 00000 n +0000191261 00000 n +0000192590 00000 n +0000678192 00000 n +0000194152 00000 n +0000193961 00000 n +0000192754 00000 n +0000194087 00000 n +0000197163 00000 n +0000196843 00000 n +0000194251 00000 n +0000196969 00000 n +0000197098 00000 n +0000201369 00000 n +0000201000 00000 n +0000197301 00000 n +0000201304 00000 n +0000201147 00000 n +0000347257 00000 n +0000205611 00000 n +0000205161 00000 n +0000201481 00000 n +0000205287 00000 n +0000205481 00000 n +0000205546 00000 n +0000209659 00000 n +0000209293 00000 n +0000205723 00000 n +0000209594 00000 n +0000209440 00000 n +0000214817 00000 n +0000213683 00000 n +0000209784 00000 n +0000214752 00000 n +0000213866 00000 n +0000214023 00000 n +0000214208 00000 n +0000214382 00000 n +0000214567 00000 n +0000678317 00000 n +0000278904 00000 n +0000219119 00000 n +0000218928 00000 n +0000215011 00000 n +0000219054 00000 n +0000222906 00000 n +0000222587 00000 n +0000219231 00000 n +0000222713 00000 n +0000222842 00000 n +0000226705 00000 n +0000225892 00000 n +0000223018 00000 n +0000226385 00000 n +0000226048 00000 n +0000226514 00000 n +0000226640 00000 n +0000226218 00000 n +0000289798 00000 n +0000230984 00000 n +0000230293 00000 n +0000226874 00000 n +0000230790 00000 n +0000230449 00000 n +0000230619 00000 n +0000230919 00000 n +0000362368 00000 n +0000234308 00000 n +0000233988 00000 n +0000231166 00000 n +0000234114 00000 n +0000234243 00000 n +0000237344 00000 n +0000237024 00000 n +0000234420 00000 n +0000237150 00000 n +0000678442 00000 n +0000241156 00000 n +0000240965 00000 n +0000237500 00000 n +0000241091 00000 n +0000245301 00000 n +0000244656 00000 n +0000241311 00000 n +0000244978 00000 n +0000245107 00000 n +0000245236 00000 n +0000244803 00000 n +0000249270 00000 n +0000248645 00000 n +0000245470 00000 n +0000248947 00000 n +0000249076 00000 n +0000248792 00000 n +0000249205 00000 n +0000252423 00000 n +0000251975 00000 n +0000249382 00000 n +0000252101 00000 n +0000252230 00000 n +0000252359 00000 n +0000256398 00000 n +0000255734 00000 n +0000252592 00000 n +0000256206 00000 n +0000255890 00000 n +0000256052 00000 n +0000260233 00000 n +0000259593 00000 n +0000256510 00000 n +0000259909 00000 n +0000259740 00000 n +0000259974 00000 n +0000260039 00000 n +0000260168 00000 n +0000678567 00000 n +0000264821 00000 n +0000264275 00000 n +0000260429 00000 n +0000264756 00000 n +0000264431 00000 n +0000264593 00000 n +0000498023 00000 n +0000496025 00000 n +0000497858 00000 n +0000343439 00000 n +0000268897 00000 n +0000268258 00000 n +0000264990 00000 n +0000268574 00000 n +0000268703 00000 n +0000268405 00000 n +0000268832 00000 n +0000287437 00000 n +0000271498 00000 n +0000271307 00000 n +0000269022 00000 n +0000271433 00000 n +0000275250 00000 n +0000274802 00000 n +0000271666 00000 n +0000274928 00000 n +0000275185 00000 n +0000278969 00000 n +0000278391 00000 n +0000275362 00000 n +0000278517 00000 n +0000278646 00000 n +0000278775 00000 n +0000283647 00000 n +0000283113 00000 n +0000279081 00000 n +0000283582 00000 n +0000283269 00000 n +0000283421 00000 n +0000678692 00000 n +0000287631 00000 n +0000286750 00000 n +0000283746 00000 n +0000287051 00000 n +0000287180 00000 n +0000287308 00000 n +0000286897 00000 n +0000287566 00000 n +0000289863 00000 n +0000289543 00000 n +0000287743 00000 n +0000289669 00000 n +0000291304 00000 n +0000291113 00000 n +0000289975 00000 n +0000291239 00000 n +0000292672 00000 n +0000292481 00000 n +0000291403 00000 n +0000292607 00000 n +0000296316 00000 n +0000295738 00000 n +0000292771 00000 n +0000295864 00000 n +0000295993 00000 n +0000296122 00000 n +0000296187 00000 n +0000296252 00000 n +0000301355 00000 n +0000299693 00000 n +0000296428 00000 n +0000301033 00000 n +0000301162 00000 n +0000301290 00000 n +0000299894 00000 n +0000300056 00000 n +0000300218 00000 n +0000300379 00000 n +0000300541 00000 n +0000300703 00000 n +0000300873 00000 n +0000678817 00000 n +0000306445 00000 n +0000304871 00000 n +0000301467 00000 n +0000306380 00000 n +0000305081 00000 n +0000305244 00000 n +0000305407 00000 n +0000305570 00000 n +0000305733 00000 n +0000305896 00000 n +0000306059 00000 n +0000306219 00000 n +0000312614 00000 n +0000309381 00000 n +0000306570 00000 n +0000312549 00000 n +0000309681 00000 n +0000309843 00000 n +0000310005 00000 n +0000310167 00000 n +0000310329 00000 n +0000310492 00000 n +0000310646 00000 n +0000310808 00000 n +0000310962 00000 n +0000311124 00000 n +0000311286 00000 n +0000311446 00000 n +0000311606 00000 n +0000311768 00000 n +0000311928 00000 n +0000312086 00000 n +0000312238 00000 n +0000312400 00000 n +0000317047 00000 n +0000316250 00000 n +0000312739 00000 n +0000316723 00000 n +0000316406 00000 n +0000316569 00000 n +0000316917 00000 n +0000316982 00000 n +0000321396 00000 n +0000320200 00000 n +0000317186 00000 n +0000320686 00000 n +0000320815 00000 n +0000321071 00000 n +0000320356 00000 n +0000320525 00000 n +0000321136 00000 n +0000321201 00000 n +0000321266 00000 n +0000321331 00000 n +0000324694 00000 n +0000324503 00000 n +0000321535 00000 n +0000324629 00000 n +0000328655 00000 n +0000328075 00000 n +0000324780 00000 n +0000328201 00000 n +0000328266 00000 n +0000328331 00000 n +0000328460 00000 n +0000328525 00000 n +0000328590 00000 n +0000678942 00000 n +0000332590 00000 n +0000331752 00000 n +0000328780 00000 n +0000331878 00000 n +0000331943 00000 n +0000332008 00000 n +0000332137 00000 n +0000332202 00000 n +0000332266 00000 n +0000332395 00000 n +0000332460 00000 n +0000332525 00000 n +0000336099 00000 n +0000335394 00000 n +0000332715 00000 n +0000335520 00000 n +0000335649 00000 n +0000335713 00000 n +0000335778 00000 n +0000335907 00000 n +0000336034 00000 n +0000339304 00000 n +0000338597 00000 n +0000336309 00000 n +0000338723 00000 n +0000338852 00000 n +0000338981 00000 n +0000339110 00000 n +0000339175 00000 n +0000339240 00000 n +0000343761 00000 n +0000343184 00000 n +0000339487 00000 n +0000343310 00000 n +0000343568 00000 n +0000343633 00000 n +0000343697 00000 n +0000347451 00000 n +0000346822 00000 n +0000343886 00000 n +0000347129 00000 n +0000346969 00000 n +0000347386 00000 n +0000350903 00000 n +0000350453 00000 n +0000347563 00000 n +0000350579 00000 n +0000350708 00000 n +0000350773 00000 n +0000350838 00000 n +0000679067 00000 n +0000353956 00000 n +0000353248 00000 n +0000351015 00000 n +0000353374 00000 n +0000353503 00000 n +0000353568 00000 n +0000353633 00000 n +0000353761 00000 n +0000353826 00000 n +0000353891 00000 n +0000355498 00000 n +0000355178 00000 n +0000354068 00000 n +0000355304 00000 n +0000495744 00000 n +0000488460 00000 n +0000495564 00000 n +0000355433 00000 n +0000355965 00000 n +0000355774 00000 n +0000355624 00000 n +0000355900 00000 n +0000357860 00000 n +0000357412 00000 n +0000356007 00000 n +0000357538 00000 n +0000357667 00000 n +0000357796 00000 n +0000362433 00000 n +0000361490 00000 n +0000357972 00000 n +0000361853 00000 n +0000488139 00000 n +0000478926 00000 n +0000487953 00000 n +0000361637 00000 n +0000361982 00000 n +0000362110 00000 n +0000362239 00000 n +0000363475 00000 n +0000363284 00000 n +0000362670 00000 n +0000363410 00000 n +0000679192 00000 n +0000363902 00000 n +0000363711 00000 n +0000363561 00000 n +0000363837 00000 n +0000367215 00000 n +0000365989 00000 n +0000363944 00000 n +0000366506 00000 n +0000366635 00000 n +0000366764 00000 n +0000366893 00000 n +0000367022 00000 n +0000367151 00000 n +0000366145 00000 n +0000366317 00000 n +0000367669 00000 n +0000367478 00000 n +0000367328 00000 n +0000367604 00000 n +0000370913 00000 n +0000370335 00000 n +0000367711 00000 n +0000370461 00000 n +0000370590 00000 n +0000370719 00000 n +0000370848 00000 n +0000375192 00000 n +0000373973 00000 n +0000370999 00000 n +0000374484 00000 n +0000374613 00000 n +0000374871 00000 n +0000374129 00000 n +0000374308 00000 n +0000375064 00000 n +0000375128 00000 n +0000382078 00000 n +0000378250 00000 n +0000375345 00000 n +0000378376 00000 n +0000378441 00000 n +0000378506 00000 n +0000378571 00000 n +0000378636 00000 n +0000378701 00000 n +0000378766 00000 n +0000378831 00000 n +0000378896 00000 n +0000378961 00000 n +0000379091 00000 n +0000379156 00000 n +0000379221 00000 n +0000379286 00000 n +0000379351 00000 n +0000379416 00000 n +0000379481 00000 n +0000379546 00000 n +0000379611 00000 n +0000379676 00000 n +0000379741 00000 n +0000379806 00000 n +0000379871 00000 n +0000379936 00000 n +0000380001 00000 n +0000380066 00000 n +0000380131 00000 n +0000380196 00000 n +0000380261 00000 n +0000380326 00000 n +0000380391 00000 n +0000380456 00000 n +0000380521 00000 n +0000380586 00000 n +0000380650 00000 n +0000380715 00000 n +0000380780 00000 n +0000380845 00000 n +0000380910 00000 n +0000380975 00000 n +0000381040 00000 n +0000381105 00000 n +0000381170 00000 n +0000381235 00000 n +0000381300 00000 n +0000381365 00000 n +0000381430 00000 n +0000381495 00000 n +0000381560 00000 n +0000381625 00000 n +0000381690 00000 n 0000381755 00000 n 0000381820 00000 n 0000381885 00000 n 0000381950 00000 n -0000382015 00000 n -0000382080 00000 n -0000382145 00000 n -0000382210 00000 n -0000382275 00000 n -0000382340 00000 n -0000382405 00000 n -0000382470 00000 n -0000382535 00000 n -0000382600 00000 n -0000382662 00000 n -0000382726 00000 n -0000382791 00000 n -0000382855 00000 n -0000382920 00000 n -0000382985 00000 n -0000383050 00000 n -0000383115 00000 n -0000383180 00000 n -0000383245 00000 n -0000383310 00000 n -0000383439 00000 n -0000383568 00000 n -0000383633 00000 n -0000383698 00000 n -0000383763 00000 n -0000383828 00000 n -0000386660 00000 n -0000386016 00000 n -0000384018 00000 n -0000386142 00000 n -0000386271 00000 n -0000386400 00000 n -0000386465 00000 n -0000386530 00000 n -0000386595 00000 n -0000656004 00000 n -0000391145 00000 n -0000390824 00000 n -0000386772 00000 n -0000390950 00000 n -0000391015 00000 n -0000391080 00000 n -0000394395 00000 n -0000394139 00000 n -0000391297 00000 n -0000394265 00000 n -0000394330 00000 n -0000397643 00000 n -0000397452 00000 n -0000394533 00000 n -0000397578 00000 n -0000401422 00000 n -0000401166 00000 n -0000397768 00000 n -0000401292 00000 n -0000401357 00000 n -0000404596 00000 n -0000403821 00000 n -0000401560 00000 n -0000403947 00000 n -0000404012 00000 n -0000404077 00000 n -0000404142 00000 n -0000404207 00000 n -0000404336 00000 n -0000404401 00000 n -0000404466 00000 n -0000404531 00000 n -0000409068 00000 n -0000408877 00000 n -0000404734 00000 n -0000409003 00000 n -0000656129 00000 n -0000412197 00000 n -0000411424 00000 n -0000409206 00000 n -0000411550 00000 n -0000411615 00000 n -0000411680 00000 n -0000411744 00000 n -0000411873 00000 n -0000411938 00000 n -0000412002 00000 n -0000412067 00000 n -0000412132 00000 n -0000415613 00000 n -0000415357 00000 n -0000412335 00000 n -0000415483 00000 n -0000415548 00000 n -0000418473 00000 n -0000417763 00000 n -0000415751 00000 n -0000417889 00000 n -0000417954 00000 n -0000418019 00000 n -0000418084 00000 n -0000418213 00000 n -0000418278 00000 n -0000418343 00000 n -0000418408 00000 n -0000422152 00000 n -0000421896 00000 n -0000418624 00000 n -0000422022 00000 n -0000422087 00000 n -0000425589 00000 n -0000425333 00000 n -0000422277 00000 n -0000425459 00000 n -0000425524 00000 n -0000428038 00000 n +0000382014 00000 n +0000679317 00000 n +0000388724 00000 n +0000385160 00000 n +0000382190 00000 n +0000385286 00000 n +0000385351 00000 n +0000385416 00000 n +0000385481 00000 n +0000385546 00000 n +0000385611 00000 n +0000385676 00000 n +0000385741 00000 n +0000385806 00000 n +0000385871 00000 n +0000385936 00000 n +0000386001 00000 n +0000386065 00000 n +0000386130 00000 n +0000386195 00000 n +0000386260 00000 n +0000386325 00000 n +0000386390 00000 n +0000386455 00000 n +0000386520 00000 n +0000386585 00000 n +0000386650 00000 n +0000386715 00000 n +0000386780 00000 n +0000386844 00000 n +0000386909 00000 n +0000386974 00000 n +0000387039 00000 n +0000387104 00000 n +0000387169 00000 n +0000387234 00000 n +0000387299 00000 n +0000387364 00000 n +0000387429 00000 n +0000387494 00000 n +0000387559 00000 n +0000387624 00000 n +0000387689 00000 n +0000387754 00000 n +0000387819 00000 n +0000387883 00000 n +0000387947 00000 n +0000388011 00000 n +0000388076 00000 n +0000388141 00000 n +0000388206 00000 n +0000388271 00000 n +0000388336 00000 n +0000388401 00000 n +0000388466 00000 n +0000388531 00000 n +0000388596 00000 n +0000388660 00000 n +0000394900 00000 n +0000391462 00000 n +0000388836 00000 n +0000391588 00000 n +0000391653 00000 n +0000391718 00000 n +0000391783 00000 n +0000391848 00000 n +0000391913 00000 n +0000391978 00000 n +0000392043 00000 n +0000392108 00000 n +0000392173 00000 n +0000392238 00000 n +0000392303 00000 n +0000392368 00000 n +0000392433 00000 n +0000392498 00000 n +0000392563 00000 n +0000392628 00000 n +0000392693 00000 n +0000392758 00000 n +0000392823 00000 n +0000392888 00000 n +0000392953 00000 n +0000393018 00000 n +0000393083 00000 n +0000393148 00000 n +0000393213 00000 n +0000393278 00000 n +0000393343 00000 n +0000393408 00000 n +0000393473 00000 n +0000393538 00000 n +0000393603 00000 n +0000393668 00000 n +0000393733 00000 n +0000393797 00000 n +0000393862 00000 n +0000393927 00000 n +0000393992 00000 n +0000394057 00000 n +0000394122 00000 n +0000394187 00000 n +0000394252 00000 n +0000394317 00000 n +0000394382 00000 n +0000394447 00000 n +0000394512 00000 n +0000394577 00000 n +0000394642 00000 n +0000394707 00000 n +0000394772 00000 n +0000394836 00000 n +0000399478 00000 n +0000397214 00000 n +0000395012 00000 n +0000397340 00000 n +0000397405 00000 n +0000397470 00000 n +0000397535 00000 n +0000397600 00000 n +0000397665 00000 n +0000397730 00000 n +0000397795 00000 n +0000397860 00000 n +0000397925 00000 n +0000397990 00000 n +0000398055 00000 n +0000398120 00000 n +0000398185 00000 n +0000398247 00000 n +0000398311 00000 n +0000398376 00000 n +0000398440 00000 n +0000398505 00000 n +0000398570 00000 n +0000398635 00000 n +0000398700 00000 n +0000398765 00000 n +0000398830 00000 n +0000398895 00000 n +0000399024 00000 n +0000399153 00000 n +0000399218 00000 n +0000399283 00000 n +0000399348 00000 n +0000399413 00000 n +0000402244 00000 n +0000401600 00000 n +0000399603 00000 n +0000401726 00000 n +0000401855 00000 n +0000401984 00000 n +0000402049 00000 n +0000402114 00000 n +0000402179 00000 n +0000406729 00000 n +0000406408 00000 n +0000402357 00000 n +0000406534 00000 n +0000406599 00000 n +0000406664 00000 n +0000409980 00000 n +0000409724 00000 n +0000406882 00000 n +0000409850 00000 n +0000409915 00000 n +0000679442 00000 n +0000413229 00000 n +0000413038 00000 n +0000410119 00000 n +0000413164 00000 n +0000417009 00000 n +0000416753 00000 n +0000413355 00000 n +0000416879 00000 n +0000416944 00000 n +0000420184 00000 n +0000419409 00000 n +0000417148 00000 n +0000419535 00000 n +0000419600 00000 n +0000419665 00000 n +0000419730 00000 n +0000419795 00000 n +0000419924 00000 n +0000419989 00000 n +0000420054 00000 n +0000420119 00000 n +0000424656 00000 n +0000424465 00000 n +0000420323 00000 n +0000424591 00000 n +0000427783 00000 n +0000427010 00000 n +0000424795 00000 n +0000427136 00000 n +0000427201 00000 n +0000427266 00000 n 0000427330 00000 n -0000425727 00000 n -0000427456 00000 n -0000427521 00000 n -0000427586 00000 n -0000427713 00000 n -0000427778 00000 n -0000427843 00000 n -0000427908 00000 n -0000427973 00000 n -0000656254 00000 n -0000430831 00000 n -0000430122 00000 n -0000428189 00000 n -0000430248 00000 n -0000430313 00000 n -0000430378 00000 n -0000430442 00000 n -0000430571 00000 n -0000430636 00000 n -0000430701 00000 n -0000430766 00000 n -0000434008 00000 n -0000433752 00000 n -0000430969 00000 n -0000433878 00000 n -0000433943 00000 n -0000437165 00000 n -0000436525 00000 n -0000434133 00000 n -0000436651 00000 n -0000436716 00000 n -0000436781 00000 n -0000436845 00000 n -0000436974 00000 n -0000437037 00000 n -0000437101 00000 n -0000440466 00000 n -0000440145 00000 n -0000437316 00000 n -0000440271 00000 n -0000440336 00000 n -0000440401 00000 n -0000443487 00000 n -0000443103 00000 n -0000440645 00000 n -0000443229 00000 n -0000443294 00000 n -0000443359 00000 n -0000443424 00000 n -0000446814 00000 n -0000446105 00000 n -0000443706 00000 n -0000446231 00000 n -0000446296 00000 n -0000446361 00000 n -0000446490 00000 n -0000446555 00000 n -0000446619 00000 n -0000446684 00000 n -0000446749 00000 n -0000656379 00000 n -0000449833 00000 n -0000449190 00000 n -0000446978 00000 n -0000449316 00000 n -0000449381 00000 n -0000449446 00000 n -0000449511 00000 n -0000449639 00000 n -0000449704 00000 n -0000449769 00000 n -0000453300 00000 n -0000452979 00000 n -0000449997 00000 n -0000453105 00000 n -0000453170 00000 n -0000453235 00000 n -0000455872 00000 n -0000455294 00000 n -0000453425 00000 n -0000455420 00000 n -0000455485 00000 n -0000455550 00000 n -0000455615 00000 n -0000455744 00000 n -0000455808 00000 n -0000459672 00000 n -0000459287 00000 n -0000456010 00000 n -0000459413 00000 n -0000459478 00000 n -0000459543 00000 n -0000459608 00000 n -0000461236 00000 n -0000460852 00000 n -0000459810 00000 n -0000460978 00000 n -0000461043 00000 n -0000461106 00000 n -0000461171 00000 n -0000461420 00000 n -0000472764 00000 n -0000475089 00000 n -0000475058 00000 n -0000484577 00000 n -0000494633 00000 n -0000504871 00000 n -0000517073 00000 n -0000535422 00000 n -0000557511 00000 n -0000578521 00000 n -0000596339 00000 n -0000599169 00000 n -0000598939 00000 n -0000626427 00000 n -0000653536 00000 n -0000656504 00000 n -0000656627 00000 n -0000656753 00000 n -0000656879 00000 n -0000656969 00000 n -0000657061 00000 n -0000672352 00000 n -0000689662 00000 n -0000689703 00000 n -0000689743 00000 n -0000689877 00000 n +0000427459 00000 n +0000427524 00000 n +0000427588 00000 n +0000427653 00000 n +0000427718 00000 n +0000431200 00000 n +0000430944 00000 n +0000427923 00000 n +0000431070 00000 n +0000431135 00000 n +0000679567 00000 n +0000434062 00000 n +0000433352 00000 n +0000431339 00000 n +0000433478 00000 n +0000433543 00000 n +0000433608 00000 n +0000433673 00000 n +0000433802 00000 n +0000433867 00000 n +0000433932 00000 n +0000433997 00000 n +0000437742 00000 n +0000437486 00000 n +0000434214 00000 n +0000437612 00000 n +0000437677 00000 n +0000441181 00000 n +0000440925 00000 n +0000437868 00000 n +0000441051 00000 n +0000441116 00000 n +0000443631 00000 n +0000442923 00000 n +0000441320 00000 n +0000443049 00000 n +0000443114 00000 n +0000443179 00000 n +0000443306 00000 n +0000443371 00000 n +0000443436 00000 n +0000443501 00000 n +0000443566 00000 n +0000446424 00000 n +0000445715 00000 n +0000443784 00000 n +0000445841 00000 n +0000445906 00000 n +0000445971 00000 n +0000446035 00000 n +0000446164 00000 n +0000446229 00000 n +0000446294 00000 n +0000446359 00000 n +0000449602 00000 n +0000449346 00000 n +0000446563 00000 n +0000449472 00000 n +0000449537 00000 n +0000679692 00000 n +0000452759 00000 n +0000452119 00000 n +0000449728 00000 n +0000452245 00000 n +0000452310 00000 n +0000452375 00000 n +0000452439 00000 n +0000452568 00000 n +0000452631 00000 n +0000452695 00000 n +0000456062 00000 n +0000455741 00000 n +0000452912 00000 n +0000455867 00000 n +0000455932 00000 n +0000455997 00000 n +0000459089 00000 n +0000458705 00000 n +0000456245 00000 n +0000458831 00000 n +0000458896 00000 n +0000458961 00000 n +0000459026 00000 n +0000462421 00000 n +0000461712 00000 n +0000459313 00000 n +0000461838 00000 n +0000461903 00000 n +0000461968 00000 n +0000462097 00000 n +0000462162 00000 n +0000462226 00000 n +0000462291 00000 n +0000462356 00000 n +0000465446 00000 n +0000464803 00000 n +0000462587 00000 n +0000464929 00000 n +0000464994 00000 n +0000465059 00000 n +0000465124 00000 n +0000465252 00000 n +0000465317 00000 n +0000465382 00000 n +0000468914 00000 n +0000468593 00000 n +0000465612 00000 n +0000468719 00000 n +0000468784 00000 n +0000468849 00000 n +0000679817 00000 n +0000471486 00000 n +0000470908 00000 n +0000469040 00000 n +0000471034 00000 n +0000471099 00000 n +0000471164 00000 n +0000471229 00000 n +0000471358 00000 n +0000471422 00000 n +0000475286 00000 n +0000474901 00000 n +0000471624 00000 n +0000475027 00000 n +0000475092 00000 n +0000475157 00000 n +0000475222 00000 n +0000476852 00000 n +0000476468 00000 n +0000475426 00000 n +0000476594 00000 n +0000476659 00000 n +0000476722 00000 n +0000476787 00000 n +0000477037 00000 n +0000488381 00000 n +0000495970 00000 n +0000498270 00000 n +0000498239 00000 n +0000507763 00000 n +0000517876 00000 n +0000528121 00000 n +0000540330 00000 n +0000558679 00000 n +0000579558 00000 n +0000601701 00000 n +0000619596 00000 n +0000622427 00000 n +0000622197 00000 n +0000649734 00000 n +0000676845 00000 n +0000679924 00000 n +0000680047 00000 n +0000680173 00000 n +0000680299 00000 n +0000680398 00000 n +0000680490 00000 n +0000696547 00000 n +0000714481 00000 n +0000714522 00000 n +0000714562 00000 n +0000714696 00000 n trailer << -/Size 1959 -/Root 1957 0 R -/Info 1958 0 R -/ID [<37F82A89388E4C9FB25FD9CE610A28FF> <37F82A89388E4C9FB25FD9CE610A28FF>] +/Size 2035 +/Root 2033 0 R +/Info 2034 0 R +/ID [<12041F55A50724DE57B7F83DE999224F> <12041F55A50724DE57B7F83DE999224F>] >> startxref -690141 +714954 %%EOF diff --git a/doc/arm/man.dig.html b/doc/arm/man.dig.html index 9041168d..2a482f70 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. --> -<!-- $Id: man.dig.html,v 1.60.18.5 2008/01/27 06:10:15 marka Exp $ --> +<!-- $Id: man.dig.html,v 1.60.18.10 2008/05/06 01:41:47 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -52,7 +52,7 @@ <div class="cmdsynopsis"><p><code class="command">dig</code> [global-queryopt...] [query...]</p></div> </div> <div class="refsect1" lang="en"> -<a name="id2563901"></a><h2>DESCRIPTION</h2> +<a name="id2569806"></a><h2>DESCRIPTION</h2> <p><span><strong class="command">dig</strong></span> (domain information groper) is a flexible tool for interrogating DNS name servers. It performs DNS lookups and @@ -98,7 +98,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2563990"></a><h2>SIMPLE USAGE</h2> +<a name="id2569895"></a><h2>SIMPLE USAGE</h2> <p> A typical invocation of <span><strong class="command">dig</strong></span> looks like: </p> @@ -144,7 +144,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2569767"></a><h2>OPTIONS</h2> +<a name="id2600589"></a><h2>OPTIONS</h2> <p> The <code class="option">-b</code> option sets the source IP address of the query to <em class="parameter"><code>address</code></em>. This must be a valid @@ -244,7 +244,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2624645"></a><h2>QUERY OPTIONS</h2> +<a name="id2627683"></a><h2>QUERY OPTIONS</h2> <p><span><strong class="command">dig</strong></span> provides a number of query options which affect the way in which lookups are made and the results displayed. Some of @@ -563,7 +563,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2625563"></a><h2>MULTIPLE QUERIES</h2> +<a name="id2628669"></a><h2>MULTIPLE QUERIES</h2> <p> The BIND 9 implementation of <span><strong class="command">dig </strong></span> supports @@ -609,7 +609,7 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr </p> </div> <div class="refsect1" lang="en"> -<a name="id2625785"></a><h2>IDN SUPPORT</h2> +<a name="id2628755"></a><h2>IDN SUPPORT</h2> <p> If <span><strong class="command">dig</strong></span> has been built with IDN (internationalized domain name) support, it can accept and display non-ASCII domain names. @@ -623,14 +623,14 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr </p> </div> <div class="refsect1" lang="en"> -<a name="id2625882"></a><h2>FILES</h2> +<a name="id2628784"></a><h2>FILES</h2> <p><code class="filename">/etc/resolv.conf</code> </p> <p><code class="filename">${HOME}/.digrc</code> </p> </div> <div class="refsect1" lang="en"> -<a name="id2625904"></a><h2>SEE ALSO</h2> +<a name="id2628805"></a><h2>SEE ALSO</h2> <p><span class="citerefentry"><span class="refentrytitle">host</span>(1)</span>, <span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>, <span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>, @@ -638,7 +638,7 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr </p> </div> <div class="refsect1" lang="en"> -<a name="id2625941"></a><h2>BUGS</h2> +<a name="id2628842"></a><h2>BUGS</h2> <p> There are probably too many query options. </p> diff --git a/doc/arm/man.dnssec-keygen.html b/doc/arm/man.dnssec-keygen.html index e56ec780..5d93e206 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. --> -<!-- $Id: man.dnssec-keygen.html,v 1.60.18.5 2008/01/27 06:10:15 marka Exp $ --> +<!-- $Id: man.dnssec-keygen.html,v 1.60.18.11 2008/05/06 01:41:47 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -50,7 +50,7 @@ <div class="cmdsynopsis"><p><code class="command">dnssec-keygen</code> {-a <em class="replaceable"><code>algorithm</code></em>} {-b <em class="replaceable"><code>keysize</code></em>} {-n <em class="replaceable"><code>nametype</code></em>} [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-e</code>] [<code class="option">-f <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-g <em class="replaceable"><code>generator</code></em></code>] [<code class="option">-h</code>] [<code class="option">-k</code>] [<code class="option">-p <em class="replaceable"><code>protocol</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-s <em class="replaceable"><code>strength</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] {name}</p></div> </div> <div class="refsect1" lang="en"> -<a name="id2598525"></a><h2>DESCRIPTION</h2> +<a name="id2601703"></a><h2>DESCRIPTION</h2> <p><span><strong class="command">dnssec-keygen</strong></span> generates keys for DNSSEC (Secure DNS), as defined in RFC 2535 and RFC 4034. It can also generate keys for use with @@ -58,7 +58,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2598539"></a><h2>OPTIONS</h2> +<a name="id2601717"></a><h2>OPTIONS</h2> <div class="variablelist"><dl> <dt><span class="term">-a <em class="replaceable"><code>algorithm</code></em></span></dt> <dd> @@ -166,7 +166,7 @@ </dl></div> </div> <div class="refsect1" lang="en"> -<a name="id2599088"></a><h2>GENERATED KEYS</h2> +<a name="id2602538"></a><h2>GENERATED KEYS</h2> <p> When <span><strong class="command">dnssec-keygen</strong></span> completes successfully, @@ -212,7 +212,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2600697"></a><h2>EXAMPLE</h2> +<a name="id2602646"></a><h2>EXAMPLE</h2> <p> To generate a 768-bit DSA key for the domain <strong class="userinput"><code>example.com</code></strong>, the following command would be @@ -233,7 +233,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2600754"></a><h2>SEE ALSO</h2> +<a name="id2602702"></a><h2>SEE ALSO</h2> <p><span class="citerefentry"><span class="refentrytitle">dnssec-signzone</span>(8)</span>, <em class="citetitle">BIND 9 Administrator Reference Manual</em>, <em class="citetitle">RFC 2535</em>, @@ -242,7 +242,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2601058"></a><h2>AUTHOR</h2> +<a name="id2602733"></a><h2>AUTHOR</h2> <p><span class="corpauthor">Internet Systems Consortium</span> </p> </div> diff --git a/doc/arm/man.dnssec-signzone.html b/doc/arm/man.dnssec-signzone.html index cbeda9e1..13d14c7e 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. --> -<!-- $Id: man.dnssec-signzone.html,v 1.58.18.5 2008/01/27 06:10:15 marka Exp $ --> +<!-- $Id: man.dnssec-signzone.html,v 1.58.18.12 2008/05/06 01:41:47 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -50,7 +50,7 @@ <div class="cmdsynopsis"><p><code class="command">dnssec-signzone</code> [<code class="option">-a</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-d <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-e <em class="replaceable"><code>end-time</code></em></code>] [<code class="option">-f <em class="replaceable"><code>output-file</code></em></code>] [<code class="option">-g</code>] [<code class="option">-h</code>] [<code class="option">-k <em class="replaceable"><code>key</code></em></code>] [<code class="option">-l <em class="replaceable"><code>domain</code></em></code>] [<code class="option">-i <em class="replaceable"><code>interval</code></em></code>] [<code class="option">-I <em class="replaceable"><code>input-format</code></em></code>] [<code class="option">-j <em class="replaceable"><code>jitter</code></em></code>] [<code class="option">-N <em class="replaceable"><code>soa-serial-format</code></em></code>] [<code class="option">-o <em class="replaceable"><code>origin</code></em></code>] [<code class="option">-O <em class="replaceable"><code>output-format</code></em></code>] [<code class="option">-p</code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-s <em class="replaceable"><code>start-time</code></em></code>] [<code class="option">-t</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-z</code>] {zonefile} [key...]</p></div> </div> <div class="refsect1" lang="en"> -<a name="id2599518"></a><h2>DESCRIPTION</h2> +<a name="id2603174"></a><h2>DESCRIPTION</h2> <p><span><strong class="command">dnssec-signzone</strong></span> signs a zone. It generates NSEC and RRSIG records and produces a signed version of the @@ -61,7 +61,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2599538"></a><h2>OPTIONS</h2> +<a name="id2603193"></a><h2>OPTIONS</h2> <div class="variablelist"><dl> <dt><span class="term">-a</span></dt> <dd><p> @@ -259,7 +259,7 @@ </dl></div> </div> <div class="refsect1" lang="en"> -<a name="id2654427"></a><h2>EXAMPLE</h2> +<a name="id2657332"></a><h2>EXAMPLE</h2> <p> The following command signs the <strong class="userinput"><code>example.com</code></strong> zone with the DSA key generated by <span><strong class="command">dnssec-keygen</strong></span> @@ -288,14 +288,14 @@ db.example.com.signed %</pre> </div> <div class="refsect1" lang="en"> -<a name="id2654568"></a><h2>SEE ALSO</h2> +<a name="id2657404"></a><h2>SEE ALSO</h2> <p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>, <em class="citetitle">BIND 9 Administrator Reference Manual</em>, <em class="citetitle">RFC 2535</em>. </p> </div> <div class="refsect1" lang="en"> -<a name="id2654593"></a><h2>AUTHOR</h2> +<a name="id2657497"></a><h2>AUTHOR</h2> <p><span class="corpauthor">Internet Systems Consortium</span> </p> </div> diff --git a/doc/arm/man.host.html b/doc/arm/man.host.html index 3dfaeb72..cfb95fb3 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. --> -<!-- $Id: man.host.html,v 1.58.18.4 2008/01/27 06:10:15 marka Exp $ --> +<!-- $Id: man.host.html,v 1.58.18.11 2008/05/06 01:41:47 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -50,7 +50,7 @@ <div class="cmdsynopsis"><p><code class="command">host</code> [<code class="option">-aCdlnrsTwv</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-N <em class="replaceable"><code>ndots</code></em></code>] [<code class="option">-R <em class="replaceable"><code>number</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-W <em class="replaceable"><code>wait</code></em></code>] [<code class="option">-m <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-4</code>] [<code class="option">-6</code>] {name} [server]</p></div> </div> <div class="refsect1" lang="en"> -<a name="id2597764"></a><h2>DESCRIPTION</h2> +<a name="id2600876"></a><h2>DESCRIPTION</h2> <p><span><strong class="command">host</strong></span> is a simple utility for performing DNS lookups. It is normally used to convert names to IP addresses and vice versa. @@ -166,7 +166,7 @@ NS, SOA, SIG, KEY, AXFR, etc. When no query type is specified, <span><strong class="command">host</strong></span> automatically selects an appropriate query - type. By default it looks for A records, but if the + type. By default it looks for A, AAAA, and MX records, but if the <code class="option">-C</code> option was given, queries will be made for SOA records, and if <em class="parameter"><code>name</code></em> is a dotted-decimal IPv4 @@ -202,7 +202,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2598141"></a><h2>IDN SUPPORT</h2> +<a name="id2601868"></a><h2>IDN SUPPORT</h2> <p> If <span><strong class="command">host</strong></span> has been built with IDN (internationalized domain name) support, it can accept and display non-ASCII domain names. @@ -216,12 +216,12 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2598238"></a><h2>FILES</h2> +<a name="id2601897"></a><h2>FILES</h2> <p><code class="filename">/etc/resolv.conf</code> </p> </div> <div class="refsect1" lang="en"> -<a name="id2598252"></a><h2>SEE ALSO</h2> +<a name="id2601911"></a><h2>SEE ALSO</h2> <p><span class="citerefentry"><span class="refentrytitle">dig</span>(1)</span>, <span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>. </p> diff --git a/doc/arm/man.named-checkconf.html b/doc/arm/man.named-checkconf.html index 9beb3b41..f003c9fc 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. --> -<!-- $Id: man.named-checkconf.html,v 1.57.18.5 2008/01/27 06:10:15 marka Exp $ --> +<!-- $Id: man.named-checkconf.html,v 1.57.18.11 2008/05/06 01:41:47 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -50,14 +50,14 @@ <div class="cmdsynopsis"><p><code class="command">named-checkconf</code> [<code class="option">-h</code>] [<code class="option">-v</code>] [<code class="option">-j</code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] {filename} [<code class="option">-z</code>]</p></div> </div> <div class="refsect1" lang="en"> -<a name="id2600057"></a><h2>DESCRIPTION</h2> +<a name="id2604941"></a><h2>DESCRIPTION</h2> <p><span><strong class="command">named-checkconf</strong></span> checks the syntax, but not the semantics, of a named configuration file. </p> </div> <div class="refsect1" lang="en"> -<a name="id2600071"></a><h2>OPTIONS</h2> +<a name="id2604955"></a><h2>OPTIONS</h2> <div class="variablelist"><dl> <dt><span class="term">-h</span></dt> <dd><p> @@ -92,21 +92,21 @@ </dl></div> </div> <div class="refsect1" lang="en"> -<a name="id2600187"></a><h2>RETURN VALUES</h2> +<a name="id2605072"></a><h2>RETURN VALUES</h2> <p><span><strong class="command">named-checkconf</strong></span> returns an exit status of 1 if errors were detected and 0 otherwise. </p> </div> <div class="refsect1" lang="en"> -<a name="id2600201"></a><h2>SEE ALSO</h2> +<a name="id2605085"></a><h2>SEE ALSO</h2> <p><span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>, <span class="citerefentry"><span class="refentrytitle">named-checkzone</span>(8)</span>, <em class="citetitle">BIND 9 Administrator Reference Manual</em>. </p> </div> <div class="refsect1" lang="en"> -<a name="id2600299"></a><h2>AUTHOR</h2> +<a name="id2605115"></a><h2>AUTHOR</h2> <p><span class="corpauthor">Internet Systems Consortium</span> </p> </div> diff --git a/doc/arm/man.named-checkzone.html b/doc/arm/man.named-checkzone.html index bdbc2d91..0fcdafce 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. --> -<!-- $Id: man.named-checkzone.html,v 1.63.18.5 2008/01/27 06:10:15 marka Exp $ --> +<!-- $Id: man.named-checkzone.html,v 1.63.18.12 2008/05/06 01:41:47 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -51,7 +51,7 @@ <div class="cmdsynopsis"><p><code class="command">named-compilezone</code> [<code class="option">-d</code>] [<code class="option">-j</code>] [<code class="option">-q</code>] [<code class="option">-v</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-C <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-f <em class="replaceable"><code>format</code></em></code>] [<code class="option">-F <em class="replaceable"><code>format</code></em></code>] [<code class="option">-i <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-k <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-m <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-n <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-o <em class="replaceable"><code>filename</code></em></code>] [<code class="option">-s <em class="replaceable"><code>style</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-w <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-D</code>] [<code class="option">-W <em class="replaceable"><code>mode</code></em></code>] {zonename} {filename}</p></div> </div> <div class="refsect1" lang="en"> -<a name="id2602268"></a><h2>DESCRIPTION</h2> +<a name="id2606675"></a><h2>DESCRIPTION</h2> <p><span><strong class="command">named-checkzone</strong></span> checks the syntax and integrity of a zone file. It performs the same checks as <span><strong class="command">named</strong></span> does when loading a @@ -71,7 +71,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2602318"></a><h2>OPTIONS</h2> +<a name="id2606725"></a><h2>OPTIONS</h2> <div class="variablelist"><dl> <dt><span class="term">-d</span></dt> <dd><p> @@ -257,14 +257,14 @@ </dl></div> </div> <div class="refsect1" lang="en"> -<a name="id2655349"></a><h2>RETURN VALUES</h2> +<a name="id2658253"></a><h2>RETURN VALUES</h2> <p><span><strong class="command">named-checkzone</strong></span> returns an exit status of 1 if errors were detected and 0 otherwise. </p> </div> <div class="refsect1" lang="en"> -<a name="id2655363"></a><h2>SEE ALSO</h2> +<a name="id2658267"></a><h2>SEE ALSO</h2> <p><span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>, <span class="citerefentry"><span class="refentrytitle">named-checkconf</span>(8)</span>, <em class="citetitle">RFC 1035</em>, @@ -272,7 +272,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2655396"></a><h2>AUTHOR</h2> +<a name="id2658300"></a><h2>AUTHOR</h2> <p><span class="corpauthor">Internet Systems Consortium</span> </p> </div> diff --git a/doc/arm/man.named.html b/doc/arm/man.named.html index b33b06ac..fa157fab 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. --> -<!-- $Id: man.named.html,v 1.62.18.5 2008/01/27 06:10:15 marka Exp $ --> +<!-- $Id: man.named.html,v 1.62.18.12 2008/05/06 01:41:47 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -50,7 +50,7 @@ <div class="cmdsynopsis"><p><code class="command">named</code> [<code class="option">-4</code>] [<code class="option">-6</code>] [<code class="option">-c <em class="replaceable"><code>config-file</code></em></code>] [<code class="option">-d <em class="replaceable"><code>debug-level</code></em></code>] [<code class="option">-f</code>] [<code class="option">-g</code>] [<code class="option">-m <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-n <em class="replaceable"><code>#cpus</code></em></code>] [<code class="option">-p <em class="replaceable"><code>port</code></em></code>] [<code class="option">-s</code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-u <em class="replaceable"><code>user</code></em></code>] [<code class="option">-v</code>] [<code class="option">-x <em class="replaceable"><code>cache-file</code></em></code>]</p></div> </div> <div class="refsect1" lang="en"> -<a name="id2601594"></a><h2>DESCRIPTION</h2> +<a name="id2606888"></a><h2>DESCRIPTION</h2> <p><span><strong class="command">named</strong></span> is a Domain Name System (DNS) server, part of the BIND 9 distribution from ISC. For more @@ -65,7 +65,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2601625"></a><h2>OPTIONS</h2> +<a name="id2606919"></a><h2>OPTIONS</h2> <div class="variablelist"><dl> <dt><span class="term">-4</span></dt> <dd><p> @@ -209,7 +209,7 @@ </dl></div> </div> <div class="refsect1" lang="en"> -<a name="id2603469"></a><h2>SIGNALS</h2> +<a name="id2607398"></a><h2>SIGNALS</h2> <p> In routine operation, signals should not be used to control the nameserver; <span><strong class="command">rndc</strong></span> should be used @@ -230,7 +230,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2605294"></a><h2>CONFIGURATION</h2> +<a name="id2608745"></a><h2>CONFIGURATION</h2> <p> The <span><strong class="command">named</strong></span> configuration file is too complex to describe in detail here. A complete description is provided @@ -239,7 +239,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2605314"></a><h2>FILES</h2> +<a name="id2608764"></a><h2>FILES</h2> <div class="variablelist"><dl> <dt><span class="term"><code class="filename">/etc/named.conf</code></span></dt> <dd><p> @@ -252,7 +252,7 @@ </dl></div> </div> <div class="refsect1" lang="en"> -<a name="id2605357"></a><h2>SEE ALSO</h2> +<a name="id2608808"></a><h2>SEE ALSO</h2> <p><em class="citetitle">RFC 1033</em>, <em class="citetitle">RFC 1034</em>, <em class="citetitle">RFC 1035</em>, @@ -265,7 +265,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2605428"></a><h2>AUTHOR</h2> +<a name="id2608878"></a><h2>AUTHOR</h2> <p><span class="corpauthor">Internet Systems Consortium</span> </p> </div> diff --git a/doc/arm/man.rndc-confgen.html b/doc/arm/man.rndc-confgen.html index df5aea85..de4413a4 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. --> -<!-- $Id: man.rndc-confgen.html,v 1.65.10.5 2008/01/27 06:10:15 marka Exp $ --> +<!-- $Id: man.rndc-confgen.html,v 1.65.10.12 2008/05/06 01:41:47 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -48,7 +48,7 @@ <div class="cmdsynopsis"><p><code class="command">rndc-confgen</code> [<code class="option">-a</code>] [<code class="option">-b <em class="replaceable"><code>keysize</code></em></code>] [<code class="option">-c <em class="replaceable"><code>keyfile</code></em></code>] [<code class="option">-h</code>] [<code class="option">-k <em class="replaceable"><code>keyname</code></em></code>] [<code class="option">-p <em class="replaceable"><code>port</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomfile</code></em></code>] [<code class="option">-s <em class="replaceable"><code>address</code></em></code>] [<code class="option">-t <em class="replaceable"><code>chrootdir</code></em></code>] [<code class="option">-u <em class="replaceable"><code>user</code></em></code>]</p></div> </div> <div class="refsect1" lang="en"> -<a name="id2605670"></a><h2>DESCRIPTION</h2> +<a name="id2609462"></a><h2>DESCRIPTION</h2> <p><span><strong class="command">rndc-confgen</strong></span> generates configuration files for <span><strong class="command">rndc</strong></span>. It can be used as a @@ -64,7 +64,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2605736"></a><h2>OPTIONS</h2> +<a name="id2610074"></a><h2>OPTIONS</h2> <div class="variablelist"><dl> <dt><span class="term">-a</span></dt> <dd> @@ -171,7 +171,7 @@ </dl></div> </div> <div class="refsect1" lang="en"> -<a name="id2606190"></a><h2>EXAMPLES</h2> +<a name="id2631145"></a><h2>EXAMPLES</h2> <p> To allow <span><strong class="command">rndc</strong></span> to be used with no manual configuration, run @@ -188,7 +188,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2606247"></a><h2>SEE ALSO</h2> +<a name="id2631202"></a><h2>SEE ALSO</h2> <p><span class="citerefentry"><span class="refentrytitle">rndc</span>(8)</span>, <span class="citerefentry"><span class="refentrytitle">rndc.conf</span>(5)</span>, <span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>, @@ -196,7 +196,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2607856"></a><h2>AUTHOR</h2> +<a name="id2631240"></a><h2>AUTHOR</h2> <p><span class="corpauthor">Internet Systems Consortium</span> </p> </div> diff --git a/doc/arm/man.rndc.conf.html b/doc/arm/man.rndc.conf.html index cc8fedba..2c0b3307 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. --> -<!-- $Id: man.rndc.conf.html,v 1.66.10.5 2008/01/27 06:10:15 marka Exp $ --> +<!-- $Id: man.rndc.conf.html,v 1.66.10.12 2008/05/06 01:41:47 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -50,7 +50,7 @@ <div class="cmdsynopsis"><p><code class="command">rndc.conf</code> </p></div> </div> <div class="refsect1" lang="en"> -<a name="id2601979"></a><h2>DESCRIPTION</h2> +<a name="id2602358"></a><h2>DESCRIPTION</h2> <p><code class="filename">rndc.conf</code> is the configuration file for <span><strong class="command">rndc</strong></span>, the BIND 9 name server control utility. This file has a similar structure and syntax to @@ -135,7 +135,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2604404"></a><h2>EXAMPLE</h2> +<a name="id2608332"></a><h2>EXAMPLE</h2> <pre class="programlisting"> options { default-server localhost; @@ -209,7 +209,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2605072"></a><h2>NAME SERVER CONFIGURATION</h2> +<a name="id2609137"></a><h2>NAME SERVER CONFIGURATION</h2> <p> The name server must be configured to accept rndc connections and to recognize the key specified in the <code class="filename">rndc.conf</code> @@ -219,7 +219,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2605097"></a><h2>SEE ALSO</h2> +<a name="id2609162"></a><h2>SEE ALSO</h2> <p><span class="citerefentry"><span class="refentrytitle">rndc</span>(8)</span>, <span class="citerefentry"><span class="refentrytitle">rndc-confgen</span>(8)</span>, <span class="citerefentry"><span class="refentrytitle">mmencode</span>(1)</span>, @@ -227,7 +227,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2605136"></a><h2>AUTHOR</h2> +<a name="id2609201"></a><h2>AUTHOR</h2> <p><span class="corpauthor">Internet Systems Consortium</span> </p> </div> diff --git a/doc/arm/man.rndc.html b/doc/arm/man.rndc.html index 5b422372..3153828f 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. --> -<!-- $Id: man.rndc.html,v 1.64.10.5 2008/01/27 06:10:15 marka Exp $ --> +<!-- $Id: man.rndc.html,v 1.64.10.12 2008/05/06 01:41:47 tbox Exp $ --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> @@ -50,7 +50,7 @@ <div class="cmdsynopsis"><p><code class="command">rndc</code> [<code class="option">-b <em class="replaceable"><code>source-address</code></em></code>] [<code class="option">-c <em class="replaceable"><code>config-file</code></em></code>] [<code class="option">-k <em class="replaceable"><code>key-file</code></em></code>] [<code class="option">-s <em class="replaceable"><code>server</code></em></code>] [<code class="option">-p <em class="replaceable"><code>port</code></em></code>] [<code class="option">-V</code>] [<code class="option">-y <em class="replaceable"><code>key_id</code></em></code>] {command}</p></div> </div> <div class="refsect1" lang="en"> -<a name="id2603656"></a><h2>DESCRIPTION</h2> +<a name="id2607516"></a><h2>DESCRIPTION</h2> <p><span><strong class="command">rndc</strong></span> controls the operation of a name server. It supersedes the <span><strong class="command">ndc</strong></span> utility @@ -79,7 +79,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2603706"></a><h2>OPTIONS</h2> +<a name="id2607566"></a><h2>OPTIONS</h2> <div class="variablelist"><dl> <dt><span class="term">-b <em class="replaceable"><code>source-address</code></em></span></dt> <dd><p> @@ -151,7 +151,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2604068"></a><h2>LIMITATIONS</h2> +<a name="id2607928"></a><h2>LIMITATIONS</h2> <p><span><strong class="command">rndc</strong></span> does not yet support all the commands of the BIND 8 <span><strong class="command">ndc</strong></span> utility. @@ -165,7 +165,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2604099"></a><h2>SEE ALSO</h2> +<a name="id2607959"></a><h2>SEE ALSO</h2> <p><span class="citerefentry"><span class="refentrytitle">rndc.conf</span>(5)</span>, <span class="citerefentry"><span class="refentrytitle">rndc-confgen</span>(8)</span>, <span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>, @@ -175,7 +175,7 @@ </p> </div> <div class="refsect1" lang="en"> -<a name="id2604154"></a><h2>AUTHOR</h2> +<a name="id2608014"></a><h2>AUTHOR</h2> <p><span class="corpauthor">Internet Systems Consortium</span> </p> </div> diff --git a/doc/misc/migration b/doc/misc/migration index d9dca134..d8bdc1f7 100644 --- a/doc/misc/migration +++ b/doc/misc/migration @@ -1,4 +1,4 @@ -Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") +Copyright (C) 2004, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") Copyright (C) 2000, 2001, 2003 Internet Software Consortium. See COPYRIGHT in the source root or http://isc.org/copyright.html for terms. @@ -26,6 +26,16 @@ understand the many-answers zone transfer format (e.g., BIND 4.9.5 or older) you need to explicitly specify "transfer-format one-answer;" in either the options block or a server statement. +BIND 9.4 onwards implements "allow-query-cache". The "allow-query" +option is no longer used to specify access to the cache. The +"allow-query" option continues to specify which hosts are allowed +to ask ordinary DNS questions. The new "allow-query-cache" option +is used to specify which hosts are allowed to get answers from the +cache. Since BIND 9.4.1, if "allow-query-cache" is not set then +"allow-recursion" is used if it is set, otherwise "allow-query" is +used if it is set, otherwise the default localnets and localhost +is used. + 1.2. Handling of Configuration File Errors In BIND 9, named refuses to start if it detects an error in @@ -254,4 +264,4 @@ necessary, the umask should be set explicitly in the script used to start the named process. -$Id: migration,v 1.48 2007/08/23 23:46:43 tbox Exp $ +$Id: migration,v 1.48.94.1 2008/03/18 16:02:36 jreed Exp $ diff --git a/doc/misc/options b/doc/misc/options index 818d852c..b18b4326 100644 --- a/doc/misc/options +++ b/doc/misc/options @@ -24,7 +24,8 @@ key <string> { logging { category <string> { <string>; ... }; channel <string> { - file <log_file>; + file <quoted_string> [ versions ( "unlimited" | <integer> ) + ] [ size <size> ]; null; print-category <boolean>; print-severity <boolean>; @@ -43,8 +44,8 @@ lwres { view <string> <optional_class>; }; -masters <string> [ port <integer> ] { ( <masters> | <ipv4_address> [port - <integer>] | <ipv6_address> [port <integer>] ) [ key <string> ]; ... }; +masters <string> [ port <integer> ] { ( <masters> | <ipv4_address> [ port + <integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ]; ... }; options { acache-cleaning-interval <integer>; @@ -93,9 +94,9 @@ options { dnssec-lookaside <string> trust-anchor <string>; dnssec-must-be-secure <string> <boolean>; dnssec-validation <boolean>; - dual-stack-servers [ port <integer> ] { ( <quoted_string> [port - <integer>] | <ipv4_address> [port <integer>] | <ipv6_address> - [port <integer>] ); ... }; + dual-stack-servers [ port <integer> ] { ( <quoted_string> [ port + <integer> ] | <ipv4_address> [ port <integer> ] | + <ipv6_address> [ port <integer> ] ); ... }; dump-file <quoted_string>; edns-udp-size <integer>; empty-contact <string>; @@ -164,6 +165,7 @@ options { recursion <boolean>; recursive-clients <integer>; request-ixfr <boolean>; + request-nsid <boolean>; rfc2308-type1 <boolean>; // not yet implemented root-delegation-only [ exclude { <quoted_string>; ... } ]; rrset-order { [ class <string> ] [ type <string> ] [ name @@ -272,9 +274,9 @@ view <string> <optional_class> { dnssec-lookaside <string> trust-anchor <string>; dnssec-must-be-secure <string> <boolean>; dnssec-validation <boolean>; - dual-stack-servers [ port <integer> ] { ( <quoted_string> [port - <integer>] | <ipv4_address> [port <integer>] | <ipv6_address> - [port <integer>] ); ... }; + dual-stack-servers [ port <integer> ] { ( <quoted_string> [ port + <integer> ] | <ipv4_address> [ port <integer> ] | + <ipv6_address> [ port <integer> ] ); ... }; edns-udp-size <integer>; empty-contact <string>; empty-server <string>; @@ -327,6 +329,7 @@ view <string> <optional_class> { queryport-pool-updateinterval <integer>; recursion <boolean>; request-ixfr <boolean>; + request-nsid <boolean>; rfc2308-type1 <boolean>; // not yet implemented root-delegation-only [ exclude { <quoted_string>; ... } ]; rrset-order { [ class <string> ] [ type <string> ] [ name @@ -402,9 +405,9 @@ view <string> <optional_class> { key-directory <quoted_string>; maintain-ixfr-base <boolean>; // obsolete masterfile-format ( text | raw ); - masters [ port <integer> ] { ( <masters> | <ipv4_address> - [port <integer>] | <ipv6_address> [port <integer>] ) [ - key <string> ]; ... }; + masters [ port <integer> ] { ( <masters> | <ipv4_address> [ + port <integer> ] | <ipv6_address> [ port <integer> ] ) + [ key <string> ]; ... }; max-ixfr-log-size <size>; // obsolete max-journal-size <size_no_default>; max-refresh-time <integer>; @@ -478,9 +481,9 @@ zone <string> <optional_class> { key-directory <quoted_string>; maintain-ixfr-base <boolean>; // obsolete masterfile-format ( text | raw ); - masters [ port <integer> ] { ( <masters> | <ipv4_address> [port - <integer>] | <ipv6_address> [port <integer>] ) [ key <string> - ]; ... }; + masters [ port <integer> ] { ( <masters> | <ipv4_address> [ port + <integer> ] | <ipv6_address> [ port <integer> ] ) [ key + <string> ]; ... }; max-ixfr-log-size <size>; // obsolete max-journal-size <size_no_default>; max-refresh-time <integer>; diff --git a/lib/bind/api b/lib/bind/api index a87852a8..a2d21190 100644 --- a/lib/bind/api +++ b/lib/bind/api @@ -1,3 +1,3 @@ -LIBINTERFACE = 4 -LIBREVISION = 10 -LIBAGE = 0 +LIBINTERFACE = 5 +LIBREVISION = 0 +LIBAGE = 1 diff --git a/lib/bind/bsd/Makefile.in b/lib/bind/bsd/Makefile.in index 3cbd7763..de228d29 100644 --- a/lib/bind/bsd/Makefile.in +++ b/lib/bind/bsd/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004, 2007, 2008 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.9 2007/06/19 23:47:13 tbox Exp $ +# $Id: Makefile.in,v 1.9.128.2 2008/03/20 23:46:31 tbox Exp $ srcdir= @srcdir@ VPATH = @srcdir@ @@ -34,6 +34,6 @@ SRCS= daemon.c ftruncate.c gettimeofday.c mktemp.c putenv.c \ TARGETS= ${OBJS} -CINCLUDES= -I.. -I${srcdir}/../include +CINCLUDES= -I.. -I../include -I${srcdir}/../include @BIND9_MAKE_RULES@ diff --git a/lib/bind/bsd/strerror.c b/lib/bind/bsd/strerror.c index 416cad48..7b125929 100644 --- a/lib/bind/bsd/strerror.c +++ b/lib/bind/bsd/strerror.c @@ -1,6 +1,6 @@ #if defined(LIBC_SCCS) && !defined(lint) static const char sccsid[] = "@(#)strerror.c 8.1 (Berkeley) 6/4/93"; -static const char rcsid[] = "$Id: strerror.c,v 1.5 2005/04/27 04:56:12 sra Exp $"; +static const char rcsid[] = "$Id: strerror.c,v 1.5.672.1 2008/02/18 04:10:16 marka Exp $"; #endif /* LIBC_SCCS and not lint */ /* @@ -60,12 +60,14 @@ isc_strerror(int num) { static char ebuf[40] = UPREFIX; /*%< 64-bit number + slop */ u_int errnum; char *p, *t; +#ifndef USE_SYSERROR_LIST const char *ret; +#endif char tmp[40]; errnum = num; /*%< convert to unsigned */ #ifdef USE_SYSERROR_LIST - if (errnum < sys_nerr) + if (errnum < (u_int)sys_nerr) return (sys_errlist[errnum]); #else #undef strerror diff --git a/lib/bind/bsd/strtoul.c b/lib/bind/bsd/strtoul.c index 5d066a93..d942df07 100644 --- a/lib/bind/bsd/strtoul.c +++ b/lib/bind/bsd/strtoul.c @@ -1,6 +1,6 @@ #if defined(LIBC_SCCS) && !defined(lint) static const char sccsid[] = "@(#)strtoul.c 8.1 (Berkeley) 6/4/93"; -static const char rcsid[] = "$Id: strtoul.c,v 1.3 2005/04/27 04:56:12 sra Exp $"; +static const char rcsid[] = "$Id: strtoul.c,v 1.3.672.1 2008/02/18 04:10:16 marka Exp $"; #endif /* LIBC_SCCS and not lint */ /* @@ -70,7 +70,7 @@ strtoul(const char *nptr, char **endptr, int base) { * See strtol for comments as to the logic used. */ do { - c = *(unsigned char *)s++; + c = *(const unsigned char *)s++; } while (isspace(c)); if (c == '-') { neg = 1; @@ -87,7 +87,7 @@ strtoul(const char *nptr, char **endptr, int base) { base = c == '0' ? 8 : 10; cutoff = (u_long)ULONG_MAX / (u_long)base; cutlim = (u_long)ULONG_MAX % (u_long)base; - for (acc = 0, any = 0;; c = *(unsigned char*)s++) { + for (acc = 0, any = 0;; c = *(const unsigned char*)s++) { if (isdigit(c)) c -= '0'; else if (isalpha(c)) @@ -96,7 +96,7 @@ strtoul(const char *nptr, char **endptr, int base) { break; if (c >= base) break; - if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim) + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) any = -1; else { any = 1; @@ -110,7 +110,7 @@ strtoul(const char *nptr, char **endptr, int base) { } else if (neg) acc = -acc; if (endptr != 0) - *endptr = (char *)(any ? s - 1 : nptr); + DE_CONST((any ? s - 1 : nptr), *endptr); return (acc); } diff --git a/lib/bind/config.h.in b/lib/bind/config.h.in index 69ea2854..5e2a83de 100644 --- a/lib/bind/config.h.in +++ b/lib/bind/config.h.in @@ -5,6 +5,7 @@ #undef HAVE_STROPTS_H #undef HAVE_SYS_TIMERS_H #undef HAVE_SYS_SELECT_H +#undef HAVE_MEMORY_H #undef SYS_CDEFS_H #undef _POSIX_PTHREAD_SEMANTICS #undef POSIX_GETPWUID_R @@ -13,6 +14,12 @@ #undef POSIX_GETGRNAM_R #undef HAVE_MEMMOVE #undef HAVE_MEMCHR +#undef SPRINTF_CHAR +#undef VSPRINTF_CHAR +#undef USE_SYSERROR_LIST +#undef NEED_STRTOUL +#undef NEED_SUN4PROTOS +#undef REENABLE_SEND #undef NEED_SETGROUPENT #undef NEED_GETGROUPLIST diff --git a/lib/bind/configure b/lib/bind/configure index 518e43a1..0938c1a4 100755 --- a/lib/bind/configure +++ b/lib/bind/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Revision: 1.128.128.2 . +# From configure.in Revision: 1.128.128.7 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61. # @@ -929,7 +929,6 @@ ISC_PLATFORM_NEEDSTRSEP ISC_PLATFORM_NEEDVSNPRINTF ISC_EXTRA_OBJS ISC_EXTRA_SRCS -USE_SYSERROR_LIST ISC_PLATFORM_QUADFORMAT ISC_SOCKLEN_T GETGROUPLIST_ARGS @@ -972,6 +971,7 @@ HOST_R_SET_RESULT HOST_R_SET_RETURN SETPWENT_VOID SETGRENT_VOID +NGR_R_CONST NGR_R_ARGS NGR_R_BAD NGR_R_COPY @@ -981,9 +981,11 @@ NGR_R_RETURN NGR_R_PRIVATE NGR_R_END_RESULT NGR_R_END_RETURN -NGR_R_ENT_ARGS +NGR_R_END_ARGS NGR_R_SET_RESULT NGR_R_SET_RETURN +NGR_R_SET_ARGS +NGR_R_SET_CONST PROTO_R_ARGS PROTO_R_BAD PROTO_R_COPY @@ -4248,7 +4250,8 @@ done -for ac_header in fcntl.h db.h paths.h sys/time.h unistd.h sys/sockio.h sys/select.h sys/timers.h stropts.h + +for ac_header in fcntl.h db.h paths.h sys/time.h unistd.h sys/sockio.h sys/select.h sys/timers.h stropts.h memory.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then @@ -7258,6 +7261,96 @@ _ACEOF fi +{ echo "$as_me:$LINENO: checking for strtoul" >&5 +echo $ECHO_N "checking for strtoul... $ECHO_C" >&6; } +if test "${ac_cv_func_strtoul+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define strtoul to an innocuous variant, in case <limits.h> declares strtoul. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define strtoul innocuous_strtoul + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char strtoul (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef strtoul + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char strtoul (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_strtoul || defined __stub___strtoul +choke me +#endif + +int +main () +{ +return strtoul (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_func_strtoul=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_strtoul=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_strtoul" >&5 +echo "${ECHO_T}$ac_cv_func_strtoul" >&6; } +if test $ac_cv_func_strtoul = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define NEED_STRTOUL 1 +_ACEOF + +fi + { echo "$as_me:$LINENO: checking for if_nametoindex" >&5 echo $ECHO_N "checking for if_nametoindex... $ECHO_C" >&6; } @@ -7624,6 +7717,61 @@ fi +if test -n "$NEED_STRERROR" +then + { echo "$as_me:$LINENO: checking for extern char * sys_errlist" >&5 +echo $ECHO_N "checking for extern char * sys_errlist... $ECHO_C" >&6; } + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + extern int sys_nerr; extern char *sys_errlist[]; +int +main () +{ + const char *p = sys_errlist[0]; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + cat >>confdefs.h <<\_ACEOF +#define USE_SYSERROR_LIST 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi + # # flockfile is usually provided by pthreads, but we may want to use it # even if compiled with --disable-threads. @@ -8425,6 +8573,14 @@ esac # # GNU libtool support # +case $host 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 + # Check whether --with-libtool was given. if test "${with_libtool+set}" = set; then @@ -8972,7 +9128,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 8975 "configure"' > conftest.$ac_ext + echo '#line 9131 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -11094,11 +11250,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11097: $lt_compile\"" >&5) + (eval echo "\"\$as_me:11253: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:11101: \$? = $ac_status" >&5 + echo "$as_me:11257: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -11337,11 +11493,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11340: $lt_compile\"" >&5) + (eval echo "\"\$as_me:11496: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:11344: \$? = $ac_status" >&5 + echo "$as_me:11500: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -11397,11 +11553,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11400: $lt_compile\"" >&5) + (eval echo "\"\$as_me:11556: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:11404: \$? = $ac_status" >&5 + echo "$as_me:11560: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -13545,7 +13701,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<EOF -#line 13548 "configure" +#line 13704 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -13643,7 +13799,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<EOF -#line 13646 "configure" +#line 13802 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -15836,11 +15992,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15839: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15995: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:15843: \$? = $ac_status" >&5 + echo "$as_me:15999: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -15896,11 +16052,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15899: $lt_compile\"" >&5) + (eval echo "\"\$as_me:16055: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:15903: \$? = $ac_status" >&5 + echo "$as_me:16059: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -17224,7 +17380,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<EOF -#line 17227 "configure" +#line 17383 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -17322,7 +17478,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<EOF -#line 17325 "configure" +#line 17481 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -18159,11 +18315,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:18162: $lt_compile\"" >&5) + (eval echo "\"\$as_me:18318: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:18166: \$? = $ac_status" >&5 + echo "$as_me:18322: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -18219,11 +18375,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:18222: $lt_compile\"" >&5) + (eval echo "\"\$as_me:18378: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:18226: \$? = $ac_status" >&5 + echo "$as_me:18382: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -20253,11 +20409,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:20256: $lt_compile\"" >&5) + (eval echo "\"\$as_me:20412: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:20260: \$? = $ac_status" >&5 + echo "$as_me:20416: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -20496,11 +20652,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:20499: $lt_compile\"" >&5) + (eval echo "\"\$as_me:20655: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:20503: \$? = $ac_status" >&5 + echo "$as_me:20659: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -20556,11 +20712,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:20559: $lt_compile\"" >&5) + (eval echo "\"\$as_me:20715: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:20563: \$? = $ac_status" >&5 + echo "$as_me:20719: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -22704,7 +22860,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<EOF -#line 22707 "configure" +#line 22863 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -22802,7 +22958,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<EOF -#line 22805 "configure" +#line 22961 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -24504,6 +24660,11 @@ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ # case "$host" in *-dec-osf*) + # Tru64 broke send() by defining it to send_OBSOLETE + cat >>confdefs.h <<\_ACEOF +#define REENABLE_SEND 1 +_ACEOF + # Turn on 4.4BSD style sa_len support. cat >>confdefs.h <<\_ACEOF #define _SOCKADDR_LEN 1 @@ -24621,6 +24782,10 @@ case "$host" in *-qnx*) PORT_DIR="port/qnx";; *-rhapsody*) PORT_DIR="port/rhapsody";; *-sunos4*) + cat >>confdefs.h <<\_ACEOF +#define NEED_SUN4PROTOS 1 +_ACEOF + PORT_NONBLOCK="#define PORT_NONBLOCK O_NDELAY" PORT_DIR="port/sunos";; *-solaris2.[01234]) @@ -25917,64 +26082,35 @@ else ISC_PLATFORM_NEEDSTRSEP="#define ISC_PLATFORM_NEEDSTRSEP 1" fi -{ echo "$as_me:$LINENO: checking for vsnprintf" >&5 -echo $ECHO_N "checking for vsnprintf... $ECHO_C" >&6; } -if test "${ac_cv_func_vsnprintf+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF + + +{ echo "$as_me:$LINENO: checking for char *sprintf" >&5 +echo $ECHO_N "checking for char *sprintf... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Define vsnprintf to an innocuous variant, in case <limits.h> declares vsnprintf. - For example, HP-UX 11i <limits.h> declares gettimeofday. */ -#define vsnprintf innocuous_vsnprintf - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char vsnprintf (); below. - Prefer <limits.h> to <assert.h> if __STDC__ is defined, since - <limits.h> exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include <limits.h> -#else -# include <assert.h> -#endif -#undef vsnprintf - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char vsnprintf (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_vsnprintf || defined __stub___vsnprintf -choke me -#endif +#include <stdio.h> int main () { -return vsnprintf (); + char buf[2]; return(*sprintf(buf,"x")); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 @@ -25983,37 +26119,94 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_func_vsnprintf=yes + } && test -s conftest.$ac_objext; then + cat >>confdefs.h <<\_ACEOF +#define SPRINTF_CHAR 1 +_ACEOF + +{ echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_func_vsnprintf=no -fi + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_vsnprintf" >&5 -echo "${ECHO_T}$ac_cv_func_vsnprintf" >&6; } -if test $ac_cv_func_vsnprintf = yes; then - ISC_PLATFORM_NEEDVSNPRINTF="#undef ISC_PLATFORM_NEEDVSNPRINTF" -else - ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS print.$O" - ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS print.c" - ISC_PLATFORM_NEEDVSNPRINTF="#define ISC_PLATFORM_NEEDVSNPRINTF 1" fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: checking for char *vsprintf" >&5 +echo $ECHO_N "checking for char *vsprintf... $ECHO_C" >&6; } +case $host in +*sunos4*) # not decared in any header file. +cat >>confdefs.h <<\_ACEOF +#define VSPRINTF_CHAR 1 +_ACEOF +{ echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +;; +*) +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <stdio.h> +int +main () +{ + char buf[2]; return(*vsprintf(buf,"x")); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >>confdefs.h <<\_ACEOF +#define VSPRINTF_CHAR 1 +_ACEOF -{ echo "$as_me:$LINENO: checking for strerror" >&5 -echo $ECHO_N "checking for strerror... $ECHO_C" >&6; } -if test "${ac_cv_func_strerror+set}" = set; then +{ echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +;; +esac + +{ echo "$as_me:$LINENO: checking for vsnprintf" >&5 +echo $ECHO_N "checking for vsnprintf... $ECHO_C" >&6; } +if test "${ac_cv_func_vsnprintf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF @@ -26022,12 +26215,12 @@ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Define strerror to an innocuous variant, in case <limits.h> declares strerror. +/* Define vsnprintf to an innocuous variant, in case <limits.h> declares vsnprintf. For example, HP-UX 11i <limits.h> declares gettimeofday. */ -#define strerror innocuous_strerror +#define vsnprintf innocuous_vsnprintf /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char strerror (); below. + which can conflict with char vsnprintf (); below. Prefer <limits.h> to <assert.h> if __STDC__ is defined, since <limits.h> exists even on freestanding compilers. */ @@ -26037,7 +26230,7 @@ cat >>conftest.$ac_ext <<_ACEOF # include <assert.h> #endif -#undef strerror +#undef vsnprintf /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC @@ -26045,18 +26238,18 @@ cat >>conftest.$ac_ext <<_ACEOF #ifdef __cplusplus extern "C" #endif -char strerror (); +char vsnprintf (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined __stub_strerror || defined __stub___strerror +#if defined __stub_vsnprintf || defined __stub___vsnprintf choke me #endif int main () { -return strerror (); +return vsnprintf (); ; return 0; } @@ -26079,28 +26272,33 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then - ac_cv_func_strerror=yes + ac_cv_func_vsnprintf=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_func_strerror=no + ac_cv_func_vsnprintf=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_strerror" >&5 -echo "${ECHO_T}$ac_cv_func_strerror" >&6; } -if test $ac_cv_func_strerror = yes; then - USE_SYSERROR_LIST="#undef USE_SYSERROR_LIST" +{ echo "$as_me:$LINENO: result: $ac_cv_func_vsnprintf" >&5 +echo "${ECHO_T}$ac_cv_func_vsnprintf" >&6; } +if test $ac_cv_func_vsnprintf = yes; then + ISC_PLATFORM_NEEDVSNPRINTF="#undef ISC_PLATFORM_NEEDVSNPRINTF" else - USE_SYSERROR_LIST="#define USE_SYSERROR_LIST 1" + ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS print.$O" + ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS print.c" + ISC_PLATFORM_NEEDVSNPRINTF="#define ISC_PLATFORM_NEEDVSNPRINTF 1" fi -# + + + + # Determine the printf format characters to use when printing # values of type isc_int64_t. We make the assumption that platforms # where a "long long" is the same size as a "long" (e.g., Alpha/OSF1) @@ -29054,7 +29252,21 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext case $host in ia64-hp-hpux11.*) +NGR_R_CONST="#define NGR_R_CONST" ;; +*-hp-hpux11.*) +# +# HPUX doesn't have a prototype for getnetgrent_r(). +# +NGR_R_CONST="#define NGR_R_CONST" +NGR_R_ARGS="#define NGR_R_ARGS char *buf, int buflen" +NGR_R_BAD="#define NGR_R_BAD (0)" +NGR_R_COPY="#define NGR_R_COPY buf, buflen" +NGR_R_COPY_ARGS="#define NGR_R_COPY_ARGS NGR_R_ARGS" +NGR_R_OK="#define NGR_R_OK 1" +NGR_R_RETURN="#define NGR_R_RETURN int" +;; + *) { echo "$as_me:$LINENO: checking for getnetgrent_r" >&5 echo $ECHO_N "checking for getnetgrent_r... $ECHO_C" >&6; } @@ -29147,7 +29359,10 @@ cat >>conftest.$ac_ext <<_ACEOF #undef __USE_MISC #define __USE_MISC +#undef _REEENTRANT +#define _REEENTRANT #include <netdb.h> +#include <unistd.h> int getnetgrent_r(char **m, char **u, char **d, char *b, int l) {} @@ -29177,6 +29392,7 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 test ! -s conftest.err } && test -s conftest.$ac_objext; then +NGR_R_CONST="#define NGR_R_CONST" NGR_R_ARGS="#define NGR_R_ARGS char *buf, int buflen" NGR_R_BAD="#define NGR_R_BAD (0)" NGR_R_COPY="#define NGR_R_COPY buf, buflen" @@ -29198,7 +29414,10 @@ cat >>conftest.$ac_ext <<_ACEOF #undef __USE_MISC #define __USE_MISC +#undef _REEENTRANT +#define _REEENTRANT #include <netdb.h> +#include <unistd.h> int getnetgrent_r(char **m, char **u, char **d, char *b, size_t l) {} @@ -29228,6 +29447,7 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 test ! -s conftest.err } && test -s conftest.$ac_objext; then +NGR_R_CONST="#define NGR_R_CONST" NGR_R_ARGS="#define NGR_R_ARGS char *buf, size_t buflen" NGR_R_BAD="#define NGR_R_BAD (0)" NGR_R_COPY="#define NGR_R_COPY buf, buflen" @@ -29249,8 +29469,11 @@ cat >>conftest.$ac_ext <<_ACEOF #undef __USE_MISC #define __USE_MISC +#undef _REEENTRANT +#define _REEENTRANT #include <netdb.h> -extern int getnetgrent_r( char **, char **, char **, void **); +#include <unistd.h> +extern int getnetgrent_r(char **, char **, char **, void **); int @@ -29279,6 +29502,7 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 test ! -s conftest.err } && test -s conftest.$ac_objext; then +NGR_R_CONST="#define NGR_R_CONST" NGR_R_ARGS="#define NGR_R_ARGS void **buf" NGR_R_BAD="#define NGR_R_BAD (0)" NGR_R_COPY="#define NGR_R_COPY buf" @@ -29292,6 +29516,66 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#undef __USE_MISC +#define __USE_MISC +#undef _REEENTRANT +#define _REEENTRANT +#include <netdb.h> +#include <unistd.h> +extern int getnetgrent_r(const char **, const char **, const char **, void *); + + +int +main () +{ +return (0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + +NGR_R_CONST="#define NGR_R_CONST const" +NGR_R_ARGS="#define NGR_R_ARGS void *buf" +NGR_R_BAD="#define NGR_R_BAD (0)" +NGR_R_COPY="#define NGR_R_COPY buf" +NGR_R_COPY_ARGS="#define NGR_R_COPY_ARGS NGR_R_ARGS" +NGR_R_OK="#define NGR_R_OK 1" +NGR_R_RETURN="#define NGR_R_RETURN int" +NGR_R_PRIVATE="#define NGR_R_PRIVATE 2" + + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi @@ -29306,7 +29590,8 @@ fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else - NGR_R_ARGS="#define NGR_R_ARGS char *buf, int buflen" + NGR_R_CONST="#define NGR_R_CONST" +NGR_R_ARGS="#define NGR_R_ARGS char *buf, int buflen" NGR_R_BAD="#define NGR_R_BAD (0)" NGR_R_COPY="#define NGR_R_COPY buf, buflen" NGR_R_COPY_ARGS="#define NGR_R_COPY_ARGS NGR_R_ARGS" @@ -29324,6 +29609,7 @@ esac + { echo "$as_me:$LINENO: checking for endnetgrent_r" >&5 echo $ECHO_N "checking for endnetgrent_r... $ECHO_C" >&6; } if test "${ac_cv_func_endnetgrent_r+set}" = set; then @@ -29415,7 +29701,10 @@ cat >>conftest.$ac_ext <<_ACEOF #undef __USE_MISC #define __USE_MISC +#undef _REEENTRANT +#define _REEENTRANT #include <netdb.h> +#include <unistd.h> void endnetgrent_r(void **ptr); @@ -29448,7 +29737,59 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 NGR_R_END_RESULT="#define NGR_R_END_RESULT(x) /* empty */" NGR_R_END_RETURN="#define NGR_R_END_RETURN void" -NGR_R_ENT_ARGS="#define NGR_R_ENT_ARGS NGR_R_ARGS" +NGR_R_END_ARGS="#define NGR_R_END_ARGS NGR_R_ARGS" + + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#undef __USE_MISC +#define __USE_MISC +#undef _REEENTRANT +#define _REEENTRANT +#include <netdb.h> +#include <unistd.h> +void endnetgrent_r(void *ptr); + + +int +main () +{ +return (0); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + +NGR_R_END_RESULT="#define NGR_R_END_RESULT(x) /* empty */" +NGR_R_END_RETURN="#define NGR_R_END_RETURN void" +NGR_R_END_ARGS="#define NGR_R_END_ARGS void *buf" else @@ -29458,8 +29799,12 @@ sed 's/^/| /' conftest.$ac_ext >&5 NGR_R_END_RESULT="#define NGR_R_END_RESULT(x) return (x)" NGR_R_END_RETURN="#define NGR_R_END_RETURN int" -NGR_R_ENT_ARGS="#define NGR_R_ENT_ARGS NGR_R_ARGS" +NGR_R_END_ARGS="#define NGR_R_END_ARGS NGR_R_ARGS" + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi @@ -29468,7 +29813,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else NGR_R_END_RESULT="#define NGR_R_END_RESULT(x) /*empty*/" NGR_R_END_RETURN="#define NGR_R_END_RETURN void" -NGR_R_ENT_ARGS="#undef NGR_R_ENT_ARGS /*empty*/" +NGR_R_END_ARGS="#undef NGR_R_END_ARGS /*empty*/" cat >>confdefs.h <<\_ACEOF #define NEED_ENDNETGRENT_R 1 _ACEOF @@ -29565,25 +29910,161 @@ if test $ac_cv_func_setnetgrent_r = yes; then case "$host" in *bsdi*) + # + # No prototype + # NGR_R_SET_RESULT="#undef NGR_R_SET_RESULT /*empty*/" NGR_R_SET_RETURN="#define NGR_R_SET_RETURN void" + NGR_R_SET_ARGS="#define NGR_R_SET_ARGS NGR_R_ARGS" + NGR_R_SET_CONST="#define NGR_R_SET_CONST" ;; -*) +*hpux*) + # + # No prototype + # NGR_R_SET_RESULT="#define NGR_R_SET_RESULT NGR_R_OK" NGR_R_SET_RETURN="#define NGR_R_SET_RETURN int" + NGR_R_SET_ARGS="#undef NGR_R_SET_ARGS /* empty */" + NGR_R_SET_CONST="#define NGR_R_SET_CONST" ;; +*) +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#undef __USE_MISC +#define __USE_MISC +#undef _REEENTRANT +#define _REEENTRANT +#include <netdb.h> +#include <unistd.h> +void setnetgrent_r(void **ptr); + + +int +main () +{ +return (0); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + +NGR_R_SET_RESULT="#undef NGR_R_SET_RESULT /* empty */" +NGR_R_SET_RETURN="#define NGR_R_SET_RETURN void" +NGR_R_SET_ARGS="#define NGR_R_SET_ARGS void **buf" +NGR_R_SET_CONST="#define NGR_R_SET_CONST" + + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#undef __USE_MISC +#define __USE_MISC +#undef _REEENTRANT +#define _REEENTRANT +#include <netdb.h> +#include <unistd.h> +extern int setnetgrent_r(char *, void **); + + +int +main () +{ +return (0); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + +NGR_R_SET_RESULT="#define NGR_R_SET_RESULT NGR_R_OK" +NGR_R_SET_RETURN="#define NGR_R_SET_RETURN int" +NGR_R_SET_ARGS="#define NGR_R_SET_ARGS void **buf" +NGR_R_SET_CONST="#define NGR_R_SET_CONST" + + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +NGR_R_SET_RESULT="#define NGR_R_SET_RESULT NGR_R_OK" +NGR_R_SET_RETURN="#define NGR_R_SET_RETURN int" +NGR_R_SET_ARGS="#undef NGR_R_SET_ARGS" +NGR_R_SET_CONST="#define NGR_R_SET_CONST const" + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +;; esac else NGR_R_SET_RESULT="#undef NGR_R_SET_RESULT /*empty*/" NGR_R_SET_RETURN="#define NGR_R_SET_RETURN void" +NGR_R_SET_ARGS="#undef NGR_R_SET_ARGS" +NGR_R_SET_CONST="#define NGR_R_SET_CONST const" fi + + + { echo "$as_me:$LINENO: checking for innetgr_r" >&5 echo $ECHO_N "checking for innetgr_r... $ECHO_C" >&6; } if test "${ac_cv_func_innetgr_r+set}" = set; then @@ -33211,7 +33692,6 @@ ISC_PLATFORM_NEEDSTRSEP!$ISC_PLATFORM_NEEDSTRSEP$ac_delim ISC_PLATFORM_NEEDVSNPRINTF!$ISC_PLATFORM_NEEDVSNPRINTF$ac_delim ISC_EXTRA_OBJS!$ISC_EXTRA_OBJS$ac_delim ISC_EXTRA_SRCS!$ISC_EXTRA_SRCS$ac_delim -USE_SYSERROR_LIST!$USE_SYSERROR_LIST$ac_delim ISC_PLATFORM_QUADFORMAT!$ISC_PLATFORM_QUADFORMAT$ac_delim ISC_SOCKLEN_T!$ISC_SOCKLEN_T$ac_delim GETGROUPLIST_ARGS!$GETGROUPLIST_ARGS$ac_delim @@ -33235,6 +33715,7 @@ GROUP_R_OK!$GROUP_R_OK$ac_delim GROUP_R_RETURN!$GROUP_R_RETURN$ac_delim GROUP_R_END_RESULT!$GROUP_R_END_RESULT$ac_delim GROUP_R_END_RETURN!$GROUP_R_END_RETURN$ac_delim +GROUP_R_ENT_ARGS!$GROUP_R_ENT_ARGS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then @@ -33276,7 +33757,6 @@ _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF -GROUP_R_ENT_ARGS!$GROUP_R_ENT_ARGS$ac_delim GROUP_R_SET_RESULT!$GROUP_R_SET_RESULT$ac_delim GROUP_R_SET_RETURN!$GROUP_R_SET_RETURN$ac_delim HOST_R_ARGS!$HOST_R_ARGS$ac_delim @@ -33295,6 +33775,7 @@ HOST_R_SET_RESULT!$HOST_R_SET_RESULT$ac_delim HOST_R_SET_RETURN!$HOST_R_SET_RETURN$ac_delim SETPWENT_VOID!$SETPWENT_VOID$ac_delim SETGRENT_VOID!$SETGRENT_VOID$ac_delim +NGR_R_CONST!$NGR_R_CONST$ac_delim NGR_R_ARGS!$NGR_R_ARGS$ac_delim NGR_R_BAD!$NGR_R_BAD$ac_delim NGR_R_COPY!$NGR_R_COPY$ac_delim @@ -33304,9 +33785,11 @@ NGR_R_RETURN!$NGR_R_RETURN$ac_delim NGR_R_PRIVATE!$NGR_R_PRIVATE$ac_delim NGR_R_END_RESULT!$NGR_R_END_RESULT$ac_delim NGR_R_END_RETURN!$NGR_R_END_RETURN$ac_delim -NGR_R_ENT_ARGS!$NGR_R_ENT_ARGS$ac_delim +NGR_R_END_ARGS!$NGR_R_END_ARGS$ac_delim NGR_R_SET_RESULT!$NGR_R_SET_RESULT$ac_delim NGR_R_SET_RETURN!$NGR_R_SET_RETURN$ac_delim +NGR_R_SET_ARGS!$NGR_R_SET_ARGS$ac_delim +NGR_R_SET_CONST!$NGR_R_SET_CONST$ac_delim PROTO_R_ARGS!$PROTO_R_ARGS$ac_delim PROTO_R_BAD!$PROTO_R_BAD$ac_delim PROTO_R_COPY!$PROTO_R_COPY$ac_delim @@ -33354,7 +33837,7 @@ LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 76; then + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 78; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 diff --git a/lib/bind/configure.in b/lib/bind/configure.in index 50a6212f..f809a48e 100644 --- a/lib/bind/configure.in +++ b/lib/bind/configure.in @@ -13,7 +13,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -AC_REVISION($Revision: 1.128.128.2 $) +AC_REVISION($Revision: 1.128.128.7 $) AC_INIT(resolv/herror.c) AC_PREREQ(2.13) @@ -169,7 +169,7 @@ AC_PROG_CC AC_HEADER_STDC -AC_CHECK_HEADERS(fcntl.h db.h paths.h sys/time.h unistd.h sys/sockio.h sys/select.h sys/timers.h stropts.h) +AC_CHECK_HEADERS(fcntl.h db.h paths.h sys/time.h unistd.h sys/sockio.h sys/select.h sys/timers.h stropts.h memory.h) AC_C_CONST AC_C_INLINE @@ -461,6 +461,7 @@ AC_SUBST(WANT_THREADS_OBJS) AC_CHECK_FUNC(strlcat, AC_DEFINE(HAVE_STRLCAT)) AC_CHECK_FUNC(memmove, AC_DEFINE(HAVE_MEMMOVE)) AC_CHECK_FUNC(memchr, AC_DEFINE(HAVE_MEMCHR)) +AC_CHECK_FUNC(strtoul, , AC_DEFINE(NEED_STRTOUL)) AC_CHECK_FUNC(if_nametoindex, [USE_IFNAMELINKID="#define USE_IFNAMELINKID 1"], @@ -490,6 +491,16 @@ AC_CHECK_FUNC(strerror, [NEED_STRERROR="#undef NEED_STRERROR"], [NEED_STRERROR="#define NEED_STRERROR 1"]) AC_SUBST(NEED_STRERROR) +if test -n "$NEED_STRERROR" +then + AC_MSG_CHECKING([for extern char * sys_errlist[]]) + AC_TRY_LINK([ extern int sys_nerr; extern char *sys_errlist[]; ], + [ const char *p = sys_errlist[0]; ], + AC_MSG_RESULT(yes) + AC_DEFINE(USE_SYSERROR_LIST), + AC_MSG_RESULT(no)) +fi + # # flockfile is usually provided by pthreads, but we may want to use it # even if compiled with --disable-threads. @@ -666,6 +677,14 @@ AC_SUBST(PURIFY) # # GNU libtool support # +case $host 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)], use_libtool="$withval", use_libtool="no") @@ -976,6 +995,8 @@ AC_SUBST(ISC_PLATFORM_NEEDATON) # case "$host" in *-dec-osf*) + # Tru64 broke send() by defining it to send_OBSOLETE + AC_DEFINE(REENABLE_SEND) # Turn on 4.4BSD style sa_len support. AC_DEFINE(_SOCKADDR_LEN) ;; @@ -1050,6 +1071,7 @@ case "$host" in *-qnx*) PORT_DIR="port/qnx";; *-rhapsody*) PORT_DIR="port/rhapsody";; *-sunos4*) + AC_DEFINE(NEED_SUN4PROTOS) PORT_NONBLOCK="#define PORT_NONBLOCK O_NDELAY" PORT_DIR="port/sunos";; *-solaris2.[[01234]]) @@ -1246,6 +1268,38 @@ found_rt_iflist AC_CHECK_FUNC(strsep, [ISC_PLATFORM_NEEDSTRSEP="#undef ISC_PLATFORM_NEEDSTRSEP"], [ISC_PLATFORM_NEEDSTRSEP="#define ISC_PLATFORM_NEEDSTRSEP 1"]) + + +AC_MSG_CHECKING(for char *sprintf) +AC_TRY_COMPILE([ +#include <stdio.h> +], +[ char buf[2]; return(*sprintf(buf,"x"));], +AC_DEFINE(SPRINTF_CHAR) +AC_MSG_RESULT(yes) +, +AC_MSG_RESULT(no) +) + +AC_MSG_CHECKING(for char *vsprintf) +case $host in +*sunos4*) # not decared in any header file. +AC_DEFINE(VSPRINTF_CHAR) +AC_MSG_RESULT(yes) +;; +*) +AC_TRY_COMPILE([ +#include <stdio.h> +], +[ char buf[2]; return(*vsprintf(buf,"x"));], +AC_DEFINE(VSPRINTF_CHAR) +AC_MSG_RESULT(yes) +, +AC_MSG_RESULT(no) +) +;; +esac + AC_CHECK_FUNC(vsnprintf, [ISC_PLATFORM_NEEDVSNPRINTF="#undef ISC_PLATFORM_NEEDVSNPRINTF"], [ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS print.$O" @@ -1256,12 +1310,7 @@ AC_SUBST(ISC_PLATFORM_NEEDVSNPRINTF) AC_SUBST(ISC_EXTRA_OBJS) AC_SUBST(ISC_EXTRA_SRCS) -AC_CHECK_FUNC(strerror, - [USE_SYSERROR_LIST="#undef USE_SYSERROR_LIST"], - [USE_SYSERROR_LIST="#define USE_SYSERROR_LIST 1"]) -AC_SUBST(USE_SYSERROR_LIST) -# # Determine the printf format characters to use when printing # values of type isc_int64_t. We make the assumption that platforms # where a "long long" is the same size as a "long" (e.g., Alpha/OSF1) @@ -1865,19 +1914,37 @@ AC_SUBST(SETGRENT_VOID) case $host in ia64-hp-hpux11.*) +NGR_R_CONST="#define NGR_R_CONST" ;; +*-hp-hpux11.*) +# +# HPUX doesn't have a prototype for getnetgrent_r(). +# +NGR_R_CONST="#define NGR_R_CONST" +NGR_R_ARGS="#define NGR_R_ARGS char *buf, int buflen" +NGR_R_BAD="#define NGR_R_BAD (0)" +NGR_R_COPY="#define NGR_R_COPY buf, buflen" +NGR_R_COPY_ARGS="#define NGR_R_COPY_ARGS NGR_R_ARGS" +NGR_R_OK="#define NGR_R_OK 1" +NGR_R_RETURN="#define NGR_R_RETURN int" +;; + *) AC_CHECK_FUNC(getnetgrent_r, AC_TRY_COMPILE( [ #undef __USE_MISC #define __USE_MISC +#undef _REEENTRANT +#define _REEENTRANT #include <netdb.h> +#include <unistd.h> int getnetgrent_r(char **m, char **u, char **d, char *b, int l) {} ] , [return (0);], [ +NGR_R_CONST="#define NGR_R_CONST" NGR_R_ARGS="#define NGR_R_ARGS char *buf, int buflen" NGR_R_BAD="#define NGR_R_BAD (0)" NGR_R_COPY="#define NGR_R_COPY buf, buflen" @@ -1890,12 +1957,16 @@ AC_TRY_COMPILE( [ #undef __USE_MISC #define __USE_MISC +#undef _REEENTRANT +#define _REEENTRANT #include <netdb.h> +#include <unistd.h> int getnetgrent_r(char **m, char **u, char **d, char *b, size_t l) {} ] , [return (0);], [ +NGR_R_CONST="#define NGR_R_CONST" NGR_R_ARGS="#define NGR_R_ARGS char *buf, size_t buflen" NGR_R_BAD="#define NGR_R_BAD (0)" NGR_R_COPY="#define NGR_R_COPY buf, buflen" @@ -1908,12 +1979,16 @@ AC_TRY_COMPILE( [ #undef __USE_MISC #define __USE_MISC +#undef _REEENTRANT +#define _REEENTRANT #include <netdb.h> -extern int getnetgrent_r( char **, char **, char **, void **); +#include <unistd.h> +extern int getnetgrent_r(char **, char **, char **, void **); ] , [return (0);], [ +NGR_R_CONST="#define NGR_R_CONST" NGR_R_ARGS="#define NGR_R_ARGS void **buf" NGR_R_BAD="#define NGR_R_BAD (0)" NGR_R_COPY="#define NGR_R_COPY buf" @@ -1923,10 +1998,35 @@ NGR_R_RETURN="#define NGR_R_RETURN int" NGR_R_PRIVATE="#define NGR_R_PRIVATE 1" ] , +AC_TRY_COMPILE( +[ +#undef __USE_MISC +#define __USE_MISC +#undef _REEENTRANT +#define _REEENTRANT +#include <netdb.h> +#include <unistd.h> +extern int getnetgrent_r(const char **, const char **, const char **, void *); +] +, +[return (0);], +[ +NGR_R_CONST="#define NGR_R_CONST const" +NGR_R_ARGS="#define NGR_R_ARGS void *buf" +NGR_R_BAD="#define NGR_R_BAD (0)" +NGR_R_COPY="#define NGR_R_COPY buf" +NGR_R_COPY_ARGS="#define NGR_R_COPY_ARGS NGR_R_ARGS" +NGR_R_OK="#define NGR_R_OK 1" +NGR_R_RETURN="#define NGR_R_RETURN int" +NGR_R_PRIVATE="#define NGR_R_PRIVATE 2" +] +, +) ) ) ) , +NGR_R_CONST="#define NGR_R_CONST" NGR_R_ARGS="#define NGR_R_ARGS char *buf, int buflen" NGR_R_BAD="#define NGR_R_BAD (0)" NGR_R_COPY="#define NGR_R_COPY buf, buflen" @@ -1935,6 +2035,7 @@ NGR_R_OK="#define NGR_R_OK 1" NGR_R_RETURN="#define NGR_R_RETURN int" ) esac +AC_SUBST(NGR_R_CONST) AC_SUBST(NGR_R_ARGS) AC_SUBST(NGR_R_BAD) AC_SUBST(NGR_R_COPY) @@ -1948,7 +2049,10 @@ AC_TRY_COMPILE( [ #undef __USE_MISC #define __USE_MISC +#undef _REEENTRANT +#define _REEENTRANT #include <netdb.h> +#include <unistd.h> void endnetgrent_r(void **ptr); ] , @@ -1957,44 +2061,128 @@ void endnetgrent_r(void **ptr); [ NGR_R_END_RESULT="#define NGR_R_END_RESULT(x) /* empty */" NGR_R_END_RETURN="#define NGR_R_END_RETURN void" -NGR_R_ENT_ARGS="#define NGR_R_ENT_ARGS NGR_R_ARGS" +NGR_R_END_ARGS="#define NGR_R_END_ARGS NGR_R_ARGS" +] +, +AC_TRY_COMPILE( +[ +#undef __USE_MISC +#define __USE_MISC +#undef _REEENTRANT +#define _REEENTRANT +#include <netdb.h> +#include <unistd.h> +void endnetgrent_r(void *ptr); +] +, +[return (0);] +, +[ +NGR_R_END_RESULT="#define NGR_R_END_RESULT(x) /* empty */" +NGR_R_END_RETURN="#define NGR_R_END_RETURN void" +NGR_R_END_ARGS="#define NGR_R_END_ARGS void *buf" ] , [ NGR_R_END_RESULT="#define NGR_R_END_RESULT(x) return (x)" NGR_R_END_RETURN="#define NGR_R_END_RETURN int" -NGR_R_ENT_ARGS="#define NGR_R_ENT_ARGS NGR_R_ARGS" +NGR_R_END_ARGS="#define NGR_R_END_ARGS NGR_R_ARGS" ] ) +) , NGR_R_END_RESULT="#define NGR_R_END_RESULT(x) /*empty*/" NGR_R_END_RETURN="#define NGR_R_END_RETURN void" -NGR_R_ENT_ARGS="#undef NGR_R_ENT_ARGS /*empty*/" +NGR_R_END_ARGS="#undef NGR_R_END_ARGS /*empty*/" AC_DEFINE(NEED_ENDNETGRENT_R) ) AC_SUBST(NGR_R_END_RESULT) AC_SUBST(NGR_R_END_RETURN) -AC_SUBST(NGR_R_ENT_ARGS) +AC_SUBST(NGR_R_END_ARGS) AC_CHECK_FUNC(setnetgrent_r, [ case "$host" in *bsdi*) + # + # No prototype + # NGR_R_SET_RESULT="#undef NGR_R_SET_RESULT /*empty*/" NGR_R_SET_RETURN="#define NGR_R_SET_RETURN void" + NGR_R_SET_ARGS="#define NGR_R_SET_ARGS NGR_R_ARGS" + NGR_R_SET_CONST="#define NGR_R_SET_CONST" ;; -*) +*hpux*) + # + # No prototype + # NGR_R_SET_RESULT="#define NGR_R_SET_RESULT NGR_R_OK" NGR_R_SET_RETURN="#define NGR_R_SET_RETURN int" + NGR_R_SET_ARGS="#undef NGR_R_SET_ARGS /* empty */" + NGR_R_SET_CONST="#define NGR_R_SET_CONST" ;; +*) +AC_TRY_COMPILE( +[ +#undef __USE_MISC +#define __USE_MISC +#undef _REEENTRANT +#define _REEENTRANT +#include <netdb.h> +#include <unistd.h> +void setnetgrent_r(void **ptr); +] +, +[return (0);] +, +[ +NGR_R_SET_RESULT="#undef NGR_R_SET_RESULT /* empty */" +NGR_R_SET_RETURN="#define NGR_R_SET_RETURN void" +NGR_R_SET_ARGS="#define NGR_R_SET_ARGS void **buf" +NGR_R_SET_CONST="#define NGR_R_SET_CONST" +] +, +AC_TRY_COMPILE( +[ +#undef __USE_MISC +#define __USE_MISC +#undef _REEENTRANT +#define _REEENTRANT +#include <netdb.h> +#include <unistd.h> +extern int setnetgrent_r(char *, void **); +] +, +[return (0);] +, +[ +NGR_R_SET_RESULT="#define NGR_R_SET_RESULT NGR_R_OK" +NGR_R_SET_RETURN="#define NGR_R_SET_RETURN int" +NGR_R_SET_ARGS="#define NGR_R_SET_ARGS void **buf" +NGR_R_SET_CONST="#define NGR_R_SET_CONST" +] +, +[ +NGR_R_SET_RESULT="#define NGR_R_SET_RESULT NGR_R_OK" +NGR_R_SET_RETURN="#define NGR_R_SET_RETURN int" +NGR_R_SET_ARGS="#undef NGR_R_SET_ARGS" +NGR_R_SET_CONST="#define NGR_R_SET_CONST const" +] +)) +;; esac ] , NGR_R_SET_RESULT="#undef NGR_R_SET_RESULT /*empty*/" NGR_R_SET_RETURN="#define NGR_R_SET_RETURN void" +NGR_R_SET_ARGS="#undef NGR_R_SET_ARGS" +NGR_R_SET_CONST="#define NGR_R_SET_CONST const" ) + AC_SUBST(NGR_R_SET_RESULT) AC_SUBST(NGR_R_SET_RETURN) +AC_SUBST(NGR_R_SET_ARGS) +AC_SUBST(NGR_R_SET_CONST) AC_CHECK_FUNC(innetgr_r,,AC_DEFINE(NEED_INNETGR_R)) diff --git a/lib/bind/dst/Makefile.in b/lib/bind/dst/Makefile.in index 2cb10cf6..f4e84a49 100644 --- a/lib/bind/dst/Makefile.in +++ b/lib/bind/dst/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004, 2007, 2008 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.8 2007/06/19 23:47:13 tbox Exp $ +# $Id: Makefile.in,v 1.8.128.2 2008/03/20 23:46:31 tbox Exp $ srcdir= @srcdir@ VPATH = @srcdir@ @@ -26,7 +26,7 @@ TARGETS= ${OBJS} CRYPTFLAGS= -DCYLINK_DSS -DHMAC_MD5 -DUSE_MD5 -DDNSSAFE -CINCLUDES= -I.. -I${srcdir}/../include ${CRYPTINCL} +CINCLUDES= -I.. -I../include -I${srcdir}/../include ${CRYPTINCL} CDEFINES= ${CRYPTFLAGS} @BIND9_MAKE_RULES@ diff --git a/lib/bind/include/arpa/nameser.h b/lib/bind/include/arpa/nameser.h index b6d34aab..d1cbf428 100644 --- a/lib/bind/include/arpa/nameser.h +++ b/lib/bind/include/arpa/nameser.h @@ -49,7 +49,7 @@ */ /* - * $Id: nameser.h,v 1.8 2005/04/27 04:56:16 sra Exp $ + * $Id: nameser.h,v 1.8.672.1 2008/04/03 02:12:21 marka Exp $ */ #ifndef _ARPA_NAMESER_H_ @@ -427,9 +427,10 @@ typedef enum __ns_cert_types { #define NS_NXT_MAX 127 /*% - * EDNS0 extended flags, host order. + * EDNS0 extended flags and option codes, host order. */ #define NS_OPT_DNSSEC_OK 0x8000U +#define NS_OPT_NSID 3 /*% * Inline versions of get/put short/long. Pointer is advanced. diff --git a/lib/bind/include/isc/misc.h b/lib/bind/include/isc/misc.h index e9ad2c55..8736bf91 100644 --- a/lib/bind/include/isc/misc.h +++ b/lib/bind/include/isc/misc.h @@ -16,7 +16,7 @@ */ /* - * $Id: misc.h,v 1.5 2005/04/27 04:56:18 sra Exp $ + * $Id: misc.h,v 1.5.672.1 2008/02/18 04:10:16 marka Exp $ */ #ifndef _ISC_MISC_H @@ -25,6 +25,7 @@ /*! \file */ #include <stdio.h> +#include <sys/types.h> #define bitncmp __bitncmp /*#define isc_movefile __isc_movefile */ diff --git a/lib/bind/include/netdb.h b/lib/bind/include/netdb.h index e7026150..651cdd87 100644 --- a/lib/bind/include/netdb.h +++ b/lib/bind/include/netdb.h @@ -86,7 +86,7 @@ /* * @(#)netdb.h 8.1 (Berkeley) 6/2/93 - * $Id: netdb.h,v 1.21 2006/10/02 01:14:36 marka Exp $ + * $Id: netdb.h,v 1.21.288.1 2008/02/28 05:46:12 marka Exp $ */ #ifndef _NETDB_H_ @@ -481,7 +481,7 @@ int endservent_r __P((struct servent_data *)); void endservent_r __P((struct servent_data *)); #endif #ifdef _AIX -int setnetgrent_r __P((const char *, void **)); +int setnetgrent_r __P((char *, void **)); void endnetgrent_r __P((void **)); /* * Note: AIX's netdb.h declares innetgr_r() as: diff --git a/lib/bind/include/resolv.h b/lib/bind/include/resolv.h index bb5863e9..409a4881 100644 --- a/lib/bind/include/resolv.h +++ b/lib/bind/include/resolv.h @@ -50,7 +50,7 @@ /*% * @(#)resolv.h 8.1 (Berkeley) 6/2/93 - * $Id: resolv.h,v 1.23 2005/08/25 04:41:46 marka Exp $ + * $Id: resolv.h,v 1.23.564.1 2008/04/03 02:12:21 marka Exp $ */ #ifndef _RESOLV_H_ @@ -250,6 +250,7 @@ union res_sockaddr_union { #define RES_NOCHECKNAME 0x00008000 /*%< do not check names for sanity. */ #define RES_KEEPTSIG 0x00010000 /*%< do not strip TSIG records */ #define RES_BLAST 0x00020000 /*%< blast all recursive servers */ +#define RES_NSID 0x00040000 /*%< request name server ID */ #define RES_NOTLDQUERY 0x00100000 /*%< don't unqualified name as a tld */ #define RES_USE_DNSSEC 0x00200000 /*%< use DNSSEC using OK bit in OPT */ /* #define RES_DEBUG2 0x00400000 */ /* nslookup internal */ @@ -396,6 +397,7 @@ extern const struct res_sym __p_rcode_syms[]; #define sym_ntos __sym_ntos #define sym_ston __sym_ston #define res_nopt __res_nopt +#define res_nopt_rdata __res_nopt_rdata #define res_ndestroy __res_ndestroy #define res_nametoclass __res_nametoclass #define res_nametotype __res_nametotype @@ -482,6 +484,8 @@ int res_findzonecut2 __P((res_state, const char *, ns_class, int, union res_sockaddr_union *, int)); void res_nclose __P((res_state)); int res_nopt __P((res_state, int, u_char *, int, int)); +int res_nopt_rdata __P((res_state, int, u_char *, int, u_char *, + u_short, u_short, u_char *)); void res_send_setqhook __P((res_send_qhook)); void res_send_setrhook __P((res_send_rhook)); int __res_vinit __P((res_state, int)); diff --git a/lib/bind/inet/Makefile.in b/lib/bind/inet/Makefile.in index bd5d352d..31d8baa8 100644 --- a/lib/bind/inet/Makefile.in +++ b/lib/bind/inet/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004, 2007, 2008 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/06/19 23:47:13 tbox Exp $ +# $Id: Makefile.in,v 1.7.128.2 2008/03/20 23:46:31 tbox Exp $ srcdir= @srcdir@ VPATH = @srcdir@ @@ -30,6 +30,6 @@ SRCS= inet_addr.c inet_cidr_ntop.c inet_cidr_pton.c inet_data.c \ TARGETS= ${OBJS} -CINCLUDES= -I.. -I${srcdir}/../include +CINCLUDES= -I.. -I../include -I${srcdir}/../include @BIND9_MAKE_RULES@ diff --git a/lib/bind/irs/Makefile.in b/lib/bind/irs/Makefile.in index d5b73405..457038aa 100644 --- a/lib/bind/irs/Makefile.in +++ b/lib/bind/irs/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004, 2007, 2008 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.12 2007/06/19 23:47:13 tbox Exp $ +# $Id: Makefile.in,v 1.12.128.2 2008/03/20 23:46:31 tbox Exp $ srcdir= @srcdir@ VPATH = @srcdir@ @@ -65,6 +65,6 @@ WANT_IRS_THREADSGR_OBJS=getgrent_r.@O@ TARGETS= ${OBJS} -CINCLUDES= -I.. -I${srcdir}/../include +CINCLUDES= -I.. -I../include -I${srcdir}/../include @BIND9_MAKE_RULES@ diff --git a/lib/bind/irs/getnetgrent.c b/lib/bind/irs/getnetgrent.c index 0adeb616..697de4bd 100644 --- a/lib/bind/irs/getnetgrent.c +++ b/lib/bind/irs/getnetgrent.c @@ -16,7 +16,7 @@ */ #if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: getnetgrent.c,v 1.4 2005/04/27 04:56:25 sra Exp $"; +static const char rcsid[] = "$Id: getnetgrent.c,v 1.4.672.1 2008/02/27 00:05:45 marka Exp $"; #endif /* LIBC_SCCS and not lint */ /* Imports */ @@ -76,7 +76,9 @@ innetgr(INNETGR_ARGS) { } int -getnetgrent(char **host, char **user, char **domain) { +getnetgrent(NGR_R_CONST char **host, NGR_R_CONST char **user, + NGR_R_CONST char **domain) +{ struct net_data *net_data = init(); const char *ch, *cu, *cd; int ret; diff --git a/lib/bind/irs/getnetgrent_r.c b/lib/bind/irs/getnetgrent_r.c index fe461f72..331f7b36 100644 --- a/lib/bind/irs/getnetgrent_r.c +++ b/lib/bind/irs/getnetgrent_r.c @@ -16,7 +16,7 @@ */ #if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: getnetgrent_r.c,v 1.11 2005/09/03 12:41:38 marka Exp $"; +static const char rcsid[] = "$Id: getnetgrent_r.c,v 1.11.558.2 2008/02/28 05:46:12 marka Exp $"; #endif /* LIBC_SCCS and not lint */ #include <port_before.h> @@ -33,10 +33,13 @@ static const char rcsid[] = "$Id: getnetgrent_r.c,v 1.11 2005/09/03 12:41:38 mar #include <port_after.h> #ifdef NGR_R_RETURN +#ifndef NGR_R_PRIVATE +#define NGR_R_PRIVATE 0 +#endif static NGR_R_RETURN -copy_protoent(char **, char **, char **, const char *, const char *, - const char *, NGR_R_COPY_ARGS); +copy_protoent(NGR_R_CONST char **, NGR_R_CONST char **, NGR_R_CONST char **, + const char *, const char *, const char *, NGR_R_COPY_ARGS); NGR_R_RETURN innetgr_r(const char *netgroup, const char *host, const char *user, @@ -58,8 +61,10 @@ innetgr_r(const char *netgroup, const char *host, const char *user, */ NGR_R_RETURN -getnetgrent_r(char **machinep, char **userp, char **domainp, NGR_R_ARGS) { - char *mp, *up, *dp; +getnetgrent_r(NGR_R_CONST char **machinep, NGR_R_CONST char **userp, + NGR_R_CONST char **domainp, NGR_R_ARGS) +{ + NGR_R_CONST char *mp, *up, *dp; int res = getnetgrent(&mp, &up, &dp); if (res != 1) @@ -69,15 +74,24 @@ getnetgrent_r(char **machinep, char **userp, char **domainp, NGR_R_ARGS) { mp, up, dp, NGR_R_COPY)); } +#if NGR_R_PRIVATE == 2 +struct private { + char *buf; +}; + +#endif NGR_R_SET_RETURN -#ifdef NGR_R_ENT_ARGS -setnetgrent_r(const char *netgroup, NGR_R_ENT_ARGS) +#ifdef NGR_R_SET_ARGS +setnetgrent_r(NGR_R_SET_CONST char *netgroup, NGR_R_SET_ARGS) #else -setnetgrent_r(const char *netgroup) +setnetgrent_r(NGR_R_SET_CONST char *netgroup) #endif { +#if NGR_R_PRIVATE == 2 + struct private *p; +#endif char *tmp; -#if defined(NGR_R_ENT_ARGS) && !defined(NGR_R_PRIVATE) +#if defined(NGR_R_SET_ARGS) && NGR_R_PRIVATE == 0 UNUSED(buf); UNUSED(buflen); #endif @@ -85,8 +99,17 @@ setnetgrent_r(const char *netgroup) DE_CONST(netgroup, tmp); setnetgrent(tmp); -#ifdef NGR_R_PRIVATE +#if NGR_R_PRIVATE == 1 *buf = NULL; +#elif NGR_R_PRIVATE == 2 + *buf = p = malloc(sizeof(struct private)); + if (p == NULL) +#ifdef NGR_R_SET_RESULT + return (NGR_R_BAD); +#else + return; +#endif + p->buf = NULL; #endif #ifdef NGR_R_SET_RESULT return (NGR_R_SET_RESULT); @@ -94,22 +117,29 @@ setnetgrent_r(const char *netgroup) } NGR_R_END_RETURN -#ifdef NGR_R_ENT_ARGS -endnetgrent_r(NGR_R_ENT_ARGS) +#ifdef NGR_R_END_ARGS +endnetgrent_r(NGR_R_END_ARGS) #else endnetgrent_r(void) #endif { -#if defined(NGR_R_ENT_ARGS) && !defined(NGR_R_PRIVATE) +#if NGR_R_PRIVATE == 2 + struct private *p = buf; +#endif +#if defined(NGR_R_SET_ARGS) && NGR_R_PRIVATE == 0 UNUSED(buf); UNUSED(buflen); #endif endnetgrent(); -#ifdef NGR_R_PRIVATE +#if NGR_R_PRIVATE == 1 if (*buf != NULL) free(*buf); *buf = NULL; +#elif NGR_R_PRIVATE == 2 + if (p->buf != NULL) + free(p->buf); + free(p); #endif NGR_R_END_RESULT(NGR_R_OK); } @@ -117,9 +147,13 @@ endnetgrent_r(void) /* Private */ static int -copy_protoent(char **machinep, char **userp, char **domainp, - const char *mp, const char *up, const char *dp, - NGR_R_COPY_ARGS) { +copy_protoent(NGR_R_CONST char **machinep, NGR_R_CONST char **userp, + NGR_R_CONST char **domainp, const char *mp, const char *up, + const char *dp, NGR_R_COPY_ARGS) +{ +#if NGR_R_PRIVATE == 2 + struct private *p = buf; +#endif char *cp; int n; int len; @@ -130,12 +164,20 @@ copy_protoent(char **machinep, char **userp, char **domainp, if (up != NULL) len += strlen(up) + 1; if (dp != NULL) len += strlen(dp) + 1; -#ifdef NGR_R_PRIVATE - free(*buf); +#if NGR_R_PRIVATE == 1 + if (*buf != NULL) + free(*buf); *buf = malloc(len); if (*buf == NULL) return(NGR_R_BAD); cp = *buf; +#elif NGR_R_PRIVATE == 2 + if (p->buf) + free(p->buf); + p->buf = malloc(len); + if (p->buf == NULL) + return(NGR_R_BAD); + cp = p->buf; #else if (len > (int)buflen) { errno = ERANGE; @@ -144,7 +186,6 @@ copy_protoent(char **machinep, char **userp, char **domainp, cp = buf; #endif - if (mp != NULL) { n = strlen(mp) + 1; strcpy(cp, mp); diff --git a/lib/bind/irs/irp.c b/lib/bind/irs/irp.c index 3bd43783..15e7dbdf 100644 --- a/lib/bind/irs/irp.c +++ b/lib/bind/irs/irp.c @@ -16,7 +16,7 @@ */ #if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: irp.c,v 1.9 2006/03/09 23:57:56 marka Exp $"; +static const char rcsid[] = "$Id: irp.c,v 1.9.394.2 2008/02/28 05:46:12 marka Exp $"; #endif /* Imports */ @@ -528,7 +528,8 @@ irs_irp_send_command(struct irp_p *pvt, const char *fmt, ...) { } va_start(ap, fmt); - todo = vsprintf(buffer, fmt, ap); + (void) vsprintf(buffer, fmt, ap); + todo = strlen(buffer); va_end(ap); if (todo > (int)sizeof(buffer) - 3) { syslog(LOG_CRIT, "memory overrun in irs_irp_send_command()"); diff --git a/lib/bind/isc/Makefile.in b/lib/bind/isc/Makefile.in index dcd02487..a7df580a 100644 --- a/lib/bind/isc/Makefile.in +++ b/lib/bind/isc/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004, 2007, 2008 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.9 2007/06/19 23:47:13 tbox Exp $ +# $Id: Makefile.in,v 1.9.128.2 2008/03/20 23:46:31 tbox Exp $ srcdir= @srcdir@ VPATH = @srcdir@ @@ -30,6 +30,6 @@ SRCS= assertions.c base64.c bitncmp.c ctl_clnt.c ctl_p.c \ TARGETS= ${OBJS} -CINCLUDES= -I.. -I${srcdir}/../include +CINCLUDES= -I.. -I../include -I${srcdir}/../include @BIND9_MAKE_RULES@ diff --git a/lib/bind/isc/ctl_clnt.c b/lib/bind/isc/ctl_clnt.c index 5438868f..cc8ee2f9 100644 --- a/lib/bind/isc/ctl_clnt.c +++ b/lib/bind/isc/ctl_clnt.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: ctl_clnt.c,v 1.9 2007/05/18 06:22:03 marka Exp $"; +static const char rcsid[] = "$Id: ctl_clnt.c,v 1.9.140.1 2008/02/18 04:10:16 marka Exp $"; #endif /* not lint */ /* @@ -38,6 +38,9 @@ static const char rcsid[] = "$Id: ctl_clnt.c,v 1.9 2007/05/18 06:22:03 marka Exp #include <string.h> #include <time.h> #include <unistd.h> +#ifdef HAVE_MEMORY_H +#include <memory.h> +#endif #include <isc/assertions.h> #include <isc/ctl.h> diff --git a/lib/bind/isc/ctl_srvr.c b/lib/bind/isc/ctl_srvr.c index 836b85a8..919dec7c 100644 --- a/lib/bind/isc/ctl_srvr.c +++ b/lib/bind/isc/ctl_srvr.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: ctl_srvr.c,v 1.8 2006/12/07 04:46:27 marka Exp $"; +static const char rcsid[] = "$Id: ctl_srvr.c,v 1.8.246.1 2008/02/18 04:10:16 marka Exp $"; #endif /* not lint */ /* @@ -40,6 +40,9 @@ static const char rcsid[] = "$Id: ctl_srvr.c,v 1.8 2006/12/07 04:46:27 marka Exp #include <time.h> #include <unistd.h> #include <fcntl.h> +#ifdef HAVE_MEMORY_H +#include <memory.h> +#endif #include <isc/assertions.h> #include <isc/ctl.h> diff --git a/lib/bind/isc/logging.c b/lib/bind/isc/logging.c index b2daff40..313a6c80 100644 --- a/lib/bind/isc/logging.c +++ b/lib/bind/isc/logging.c @@ -16,7 +16,7 @@ */ #if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: logging.c,v 1.7 2005/04/27 04:56:38 sra Exp $"; +static const char rcsid[] = "$Id: logging.c,v 1.7.672.1 2008/02/28 05:46:12 marka Exp $"; #endif /* not lint */ #include "port_before.h" @@ -43,12 +43,6 @@ static const char rcsid[] = "$Id: logging.c,v 1.7 2005/04/27 04:56:38 sra Exp $" #include "port_after.h" -#ifdef VSPRINTF_CHAR -# define VSPRINTF(x) strlen(vsprintf/**/x) -#else -# define VSPRINTF(x) ((size_t)vsprintf x) -#endif - #include "logging_p.h" static const int syslog_priority[] = { LOG_DEBUG, LOG_INFO, LOG_NOTICE, @@ -363,8 +357,8 @@ log_vwrite(log_context lc, int category, int level, const char *format, continue; if (!did_vsprintf) { - if (VSPRINTF((lc->buffer, format, args)) > - (size_t)LOG_BUFFER_SIZE) { + (void)vsprintf(lc->buffer, format, args); + if (strlen(lc->buffer) > (size_t)LOG_BUFFER_SIZE) { syslog(LOG_CRIT, "memory overrun in log_vwrite()"); exit(1); diff --git a/lib/bind/nameser/Makefile.in b/lib/bind/nameser/Makefile.in index 86365265..695d17c6 100644 --- a/lib/bind/nameser/Makefile.in +++ b/lib/bind/nameser/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004, 2007, 2008 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/06/19 23:47:13 tbox Exp $ +# $Id: Makefile.in,v 1.7.128.2 2008/03/20 23:46:31 tbox Exp $ srcdir= @srcdir@ VPATH = @srcdir@ @@ -26,6 +26,6 @@ SRCS= ns_date.c ns_name.c ns_netint.c ns_parse.c ns_print.c \ TARGETS= ${OBJS} -CINCLUDES= -I.. -I${srcdir}/../include +CINCLUDES= -I.. -I../include -I${srcdir}/../include @BIND9_MAKE_RULES@ diff --git a/lib/bind/port_after.h.in b/lib/bind/port_after.h.in index 6449301b..b7496a2d 100644 --- a/lib/bind/port_after.h.in +++ b/lib/bind/port_after.h.in @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: port_after.h.in,v 1.53.128.2 2008/01/23 02:15:32 tbox Exp $ */ +/* $Id: port_after.h.in,v 1.53.128.7 2008/02/28 05:46:12 marka Exp $ */ #ifndef port_after_h #define port_after_h @@ -35,12 +35,20 @@ #include <sys/select.h> #endif /* HAVE_SYS_SELECT_H */ +#ifdef REENABLE_SEND +#undef send +#endif + @NEED_PSELECT@ @HAVE_SA_LEN@ @HAVE_MINIMUM_IFREQ@ @NEED_DAEMON@ @NEED_STRSEP@ @NEED_STRERROR@ +#ifdef NEED_STRERROR +const char *isc_strerror(int); +#define strerror isc_strerror +#endif @HAS_INET6_STRUCTS@ @HAVE_SIN6_SCOPE_ID@ @NEED_IN6ADDR_ANY@ @@ -49,7 +57,6 @@ @NEED_GETTIMEOFDAY@ @HAVE_STRNDUP@ @USE_FIONBIO_IOCTL@ -@USE_SYSERROR_LIST@ @INNETGR_ARGS@ @SETNETGRENT_ARGS@ @USE_IFNAMELINKID@ @@ -335,16 +342,16 @@ innetgr_r(const char *, const char *, const char *, const char *); #endif #ifdef NEED_SETNETGRENT_R -#ifdef NGR_R_ENT_ARGS -NGR_R_SET_RETURN setnetgrent_r(const char *netgroup, NGR_R_ENT_ARGS); +#ifdef NGR_R_SET_ARGS +NGR_R_SET_RETURN setnetgrent_r(NGR_R_SET_CONST char *netgroup, NGR_R_SET_ARGS); #else -NGR_R_SET_RETURN setnetgrent_r(const char *netgroup); +NGR_R_SET_RETURN setnetgrent_r(NGR_R_SET_CONST char *netgroup); #endif #endif #ifdef NEED_ENDNETGRENT_R -#ifdef NGR_R_ENT_ARGS -NGR_R_END_RETURN endnetgrent_r(NGR_R_ENT_ARGS); +#ifdef NGR_R_END_ARGS +NGR_R_END_RETURN endnetgrent_r(NGR_R_END_ARGS); #else NGR_R_END_RETURN endnetgrent_r(void); #endif @@ -410,10 +417,12 @@ int isc__gettimeofday(struct timeval *tvp, struct _TIMEZONE *tzp); int isc__gettimeofday(struct timeval *tp, struct timezone *tzp); #endif -int getnetgrent(char **machinep, char **userp, char **domainp); +int getnetgrent(NGR_R_CONST char **machinep, NGR_R_CONST char **userp, + NGR_R_CONST char **domainp); #ifdef NGR_R_ARGS -int getnetgrent_r(char **machinep, char **userp, char **domainp, NGR_R_ARGS); +int getnetgrent_r(NGR_R_CONST char **machinep, NGR_R_CONST char **userp, + NGR_R_CONST char **domainp, NGR_R_ARGS); #endif #ifdef SETNETGRENT_ARGS @@ -431,11 +440,87 @@ int innetgr(const char *netgroup, const char *machine, const char *user, const char *domain); #endif -#ifdef NGR_R_ENT_ARGS +#ifdef NGR_R_SET_ARGS NGR_R_SET_RETURN -setnetgrent_r(const char *netgroup, NGR_R_ENT_ARGS); +setnetgrent_r(NGR_R_SET_CONST char *netgroup, NGR_R_SET_ARGS); #else NGR_R_SET_RETURN -setnetgrent_r(const char *netgroup); +setnetgrent_r(NGR_R_SET_CONST char *netgroup); +#endif + +#ifdef NEED_STRTOUL +unsigned long strtoul(const char *, char **, int); +#endif + +#ifdef NEED_SUN4PROTOS +#include <stdarg.h> +#ifndef __SIZE_TYPE__ +#define __SIZE_TYPE__ int +#endif +struct sockaddr; +struct iovec; +struct timeval; +struct timezone; +int fprintf(FILE *, const char *, ...); +int getsockname(int, struct sockaddr *, int *); +int getpeername(int, struct sockaddr *, int *); +int socket(int, int, int); +int connect(int, const struct sockaddr *, int); +int writev(int, struct iovec *, int); +int readv(int, struct iovec *, int); +int send(int, const char *, int, int); +void bzero(char *, int); +int recvfrom(int, char *, int, int, struct sockaddr *, int *); +int syslog(int, const char *, ... ); +int printf(const char *, ...); +__SIZE_TYPE__ fread(void *, __SIZE_TYPE__, __SIZE_TYPE__, FILE *); +__SIZE_TYPE__ fwrite(const void *, __SIZE_TYPE__, __SIZE_TYPE__, FILE *); +int fclose(FILE *); +int ungetc(int, FILE *); +int scanf(const char *, ...); +int sscanf(const char *, const char *, ... ); +int tolower(int); +int toupper(int); +int strcasecmp(const char *, const char *); +int strncasecmp(const char *, const char *, int); +int select(int, fd_set *, fd_set *, fd_set *, struct timeval *); +#ifdef gettimeofday +#undef gettimeofday +int gettimeofday(struct timeval *, struct timezone *); +#define gettimeofday isc__gettimeofday +#else +int gettimeofday(struct timeval *, struct timezone *); +#endif +long strtol(const char*, char **, int); +int fseek(FILE *, long, int); +int setsockopt(int, int, int, const char *, int); +int bind(int, const struct sockaddr *, int); +void bcopy(char *, char *, int); +int fputc(char, FILE *); +int listen(int, int); +int accept(int, struct sockaddr *, int *); +int getsockopt(int, int, int, char *, int *); +int vfprintf(FILE *, const char *, va_list); +int fflush(FILE *); +int fgetc(FILE *); +int fputs(const char *, FILE *); +int fchown(int, int, int); +void setbuf(FILE *, char *); +int gethostname(char *, int); +int rename(const char *, const char *); +time_t time(time_t *); +int fscanf(FILE *, const char *, ...); +int sscanf(const char *, const char *, ...); +int ioctl(int, int, caddr_t); +void perror(const char *); + +#if !defined(__USE_FIXED_PROTOTYPES__) && !defined(__cplusplus) && !defined(__STRICT_ANSI__) +/* + * 'gcc -ansi' changes the prototype for vsprintf(). + * Use this prototype when 'gcc -ansi' is not in effect. + */ +char *vsprintf(char *, const char *, va_list); #endif #endif + +#endif diff --git a/lib/bind/port_before.h.in b/lib/bind/port_before.h.in index 19552f92..49100912 100644 --- a/lib/bind/port_before.h.in +++ b/lib/bind/port_before.h.in @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2005-2008 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,12 +15,16 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: port_before.h.in,v 1.27 2007/06/18 23:47:34 tbox Exp $ */ +/* $Id: port_before.h.in,v 1.27.128.3 2008/02/28 05:46:12 marka Exp $ */ #ifndef port_before_h #define port_before_h #include <config.h> +#ifdef NEED_SUN4PROTOS +#define _PARAMS(x) x +#endif + struct group; /* silence warning */ struct passwd; /* silence warning */ struct timeval; /* silence warning */ @@ -34,8 +38,8 @@ struct timezone; /* silence warning */ #ifdef ISC_PLATFORM_NEEDTIMESPEC #include <time.h> /* For time_t */ struct timespec { - time_t tv_sec; /* seconds */ - long tv_nsec; /* nanoseconds */ + time_t tv_sec; /* seconds */ + long tv_nsec; /* nanoseconds */ }; #endif #ifndef HAVE_MEMMOVE @@ -100,15 +104,22 @@ struct timespec { @NGR_R_BAD@ @NGR_R_COPY@ @NGR_R_COPY_ARGS@ +@NGR_R_CONST@ @NGR_R_END_RESULT@ @NGR_R_END_RETURN@ -@NGR_R_ENT_ARGS@ +@NGR_R_END_ARGS@ @NGR_R_OK@ @NGR_R_RETURN@ +@NGR_R_SET_CONST@ @NGR_R_SET_RESULT@ @NGR_R_SET_RETURN@ +@NGR_R_SET_ARGS@ @NGR_R_PRIVATE@ +#if !defined(NGR_R_SET_ARGS) && defined(NGR_R_END_ARGS) +#define NGR_R_SET_ARGS NGR_R_END_ARGS +#endif + @PROTO_R_ARGS@ @PROTO_R_BAD@ @PROTO_R_COPY@ @@ -153,11 +164,11 @@ struct timespec { #define DE_CONST(konst, var) \ - do { \ - union { const void *k; void *v; } _u; \ - _u.k = konst; \ - var = _u.v; \ - } while (0) + do { \ + union { const void *k; void *v; } _u; \ + _u.k = konst; \ + var = _u.v; \ + } while (0) #define UNUSED(x) (x) = (x) diff --git a/lib/bind/resolv/Makefile.in b/lib/bind/resolv/Makefile.in index d5bbb674..d6ebd60c 100644 --- a/lib/bind/resolv/Makefile.in +++ b/lib/bind/resolv/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004, 2005, 2007, 2008 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.8 2007/06/19 23:47:16 tbox Exp $ +# $Id: Makefile.in,v 1.8.128.2 2008/03/20 23:46:31 tbox Exp $ srcdir= @srcdir@ VPATH = @srcdir@ @@ -28,7 +28,7 @@ SRCS= herror.c mtctxres.c res_comp.c res_data.c res_debug.c \ TARGETS= ${OBJS} -CINCLUDES= -I.. -I${srcdir}/../include +CINCLUDES= -I.. -I../include -I${srcdir}/../include CWARNINGS= @BIND9_MAKE_RULES@ diff --git a/lib/bind/resolv/res_debug.c b/lib/bind/resolv/res_debug.c index b12a112f..100133e2 100644 --- a/lib/bind/resolv/res_debug.c +++ b/lib/bind/resolv/res_debug.c @@ -95,7 +95,7 @@ #if defined(LIBC_SCCS) && !defined(lint) static const char sccsid[] = "@(#)res_debug.c 8.1 (Berkeley) 6/4/93"; -static const char rcsid[] = "$Id: res_debug.c,v 1.15 2005/07/28 06:51:50 marka Exp $"; +static const char rcsid[] = "$Id: res_debug.c,v 1.15.574.1 2008/04/03 02:12:21 marka Exp $"; #endif /* LIBC_SCCS and not lint */ #include "port_before.h" @@ -189,10 +189,56 @@ do_section(const res_state statp, p_type(ns_rr_type(rr)), p_class(ns_rr_class(rr))); else if (section == ns_s_ar && ns_rr_type(rr) == ns_t_opt) { + u_int16_t optcode, optlen, rdatalen = ns_rr_rdlen(rr); u_int32_t ttl = ns_rr_ttl(rr); + fprintf(file, "; EDNS: version: %u, udp=%u, flags=%04x\n", (ttl>>16)&0xff, ns_rr_class(rr), ttl&0xffff); + + while (rdatalen >= 4) { + const u_char *cp = ns_rr_rdata(rr); + int i; + + GETSHORT(optcode, cp); + GETSHORT(optlen, cp); + + if (optcode == NS_OPT_NSID) { + fputs("; NSID: ", file); + if (optlen == 0) { + fputs("; NSID\n", file); + } else { + fputs("; NSID: ", file); + for (i = 0; i < optlen; i++) + fprintf(file, "%02x ", + cp[i]); + fputs(" (",file); + for (i = 0; i < optlen; i++) + fprintf(file, "%c", + isprint(cp[i])? + cp[i] : '.'); + fputs(")\n", file); + } + } else { + if (optlen == 0) { + fprintf(file, "; OPT=%u\n", + optcode); + } else { + fprintf(file, "; OPT=%u: ", + optcode); + for (i = 0; i < optlen; i++) + fprintf(file, "%02x ", + cp[i]); + fputs(" (",file); + for (i = 0; i < optlen; i++) + fprintf(file, "%c", + isprint(cp[i]) ? + cp[i] : '.'); + fputs(")\n", file); + } + } + rdatalen -= 4 + optlen; + } } else { n = ns_sprintrr(handle, &rr, NULL, NULL, buf, buflen); @@ -204,7 +250,7 @@ do_section(const res_state statp, buf = malloc(buflen += 1024); if (buf == NULL) { fprintf(file, - ";; memory allocation failure\n"); + ";; memory allocation failure\n"); return; } continue; @@ -381,7 +427,7 @@ const struct res_sym __p_default_section_syms[] = { {ns_s_an, "ANSWER", (char *)0}, {ns_s_ns, "AUTHORITY", (char *)0}, {ns_s_ar, "ADDITIONAL", (char *)0}, - {0, (char *)0, (char *)0} + {0, (char *)0, (char *)0} }; const struct res_sym __p_update_section_syms[] = { @@ -389,7 +435,7 @@ const struct res_sym __p_update_section_syms[] = { {S_PREREQ, "PREREQUISITE", (char *)0}, {S_UPDATE, "UPDATE", (char *)0}, {S_ADDT, "ADDITIONAL", (char *)0}, - {0, (char *)0, (char *)0} + {0, (char *)0, (char *)0} }; const struct res_sym __p_key_syms[] = { @@ -617,6 +663,7 @@ p_option(u_long option) { case RES_USE_INET6: return "inet6"; #ifdef RES_USE_EDNS0 /*%< KAME extension */ case RES_USE_EDNS0: return "edns0"; + case RES_NSID: return "nsid"; #endif #ifdef RES_USE_DNAME case RES_USE_DNAME: return "dname"; diff --git a/lib/bind/resolv/res_mkquery.c b/lib/bind/resolv/res_mkquery.c index 09133baf..1392b6bb 100644 --- a/lib/bind/resolv/res_mkquery.c +++ b/lib/bind/resolv/res_mkquery.c @@ -70,7 +70,7 @@ #if defined(LIBC_SCCS) && !defined(lint) static const char sccsid[] = "@(#)res_mkquery.c 8.1 (Berkeley) 6/4/93"; -static const char rcsid[] = "$Id: res_mkquery.c,v 1.6 2005/04/27 04:56:42 sra Exp $"; +static const char rcsid[] = "$Id: res_mkquery.c,v 1.6.672.1 2008/04/03 02:12:21 marka Exp $"; #endif /* LIBC_SCCS and not lint */ #include "port_before.h" @@ -203,9 +203,6 @@ res_nmkquery(res_state statp, #ifdef RES_USE_EDNS0 /* attach OPT pseudo-RR, as documented in RFC2671 (EDNS0). */ -#ifndef T_OPT -#define T_OPT 41 -#endif int res_nopt(res_state statp, @@ -230,13 +227,14 @@ res_nopt(res_state statp, if ((ep - cp) < 1 + RRFIXEDSZ) return (-1); - *cp++ = 0; /*%< "." */ - ns_put16(T_OPT, cp); /*%< TYPE */ + *cp++ = 0; /*%< "." */ + ns_put16(ns_t_opt, cp); /*%< TYPE */ cp += INT16SZ; - ns_put16(anslen & 0xffff, cp); /*%< CLASS = UDP payload size */ + ns_put16(anslen & 0xffff, cp); /*%< CLASS = UDP payload size */ cp += INT16SZ; - *cp++ = NOERROR; /*%< extended RCODE */ - *cp++ = 0; /*%< EDNS version */ + *cp++ = NOERROR; /*%< extended RCODE */ + *cp++ = 0; /*%< EDNS version */ + if (statp->options & RES_USE_DNSSEC) { #ifdef DEBUG if (statp->options & RES_DEBUG) @@ -246,12 +244,60 @@ res_nopt(res_state statp, } ns_put16(flags, cp); cp += INT16SZ; - ns_put16(0, cp); /*%< RDLEN */ + + ns_put16(0U, cp); /*%< RDLEN */ cp += INT16SZ; + hp->arcount = htons(ntohs(hp->arcount) + 1); return (cp - buf); } + +/* + * Construct variable data (RDATA) block for OPT psuedo-RR, append it + * to the buffer, then update the RDLEN field (previously set to zero by + * res_nopt()) with the new RDATA length. + */ +int +res_nopt_rdata(res_state statp, + int n0, /*%< current offset in buffer */ + u_char *buf, /*%< buffer to put query */ + int buflen, /*%< size of buffer */ + u_char *rdata, /*%< ptr to start of opt rdata */ + u_short code, /*%< OPTION-CODE */ + u_short len, /*%< OPTION-LENGTH */ + u_char *data) /*%< OPTION_DATA */ +{ + register u_char *cp, *ep; + +#ifdef DEBUG + if ((statp->options & RES_DEBUG) != 0U) + printf(";; res_nopt_rdata()\n"); +#endif + + cp = buf + n0; + ep = buf + buflen; + + if ((ep - cp) < (4 + len)) + return (-1); + + if (rdata < (buf + 2) || rdata >= ep) + return (-1); + + ns_put16(code, cp); + cp += INT16SZ; + + ns_put16(len, cp); + cp += INT16SZ; + + memcpy(cp, data, len); + cp += len; + + len = cp - rdata; + ns_put16(len, rdata - 2); /* Update RDLEN field */ + + return (cp - buf); +} #endif /*! \file */ diff --git a/lib/bind/resolv/res_query.c b/lib/bind/resolv/res_query.c index 8dd68e8d..4a39c8bb 100644 --- a/lib/bind/resolv/res_query.c +++ b/lib/bind/resolv/res_query.c @@ -70,7 +70,7 @@ #if defined(LIBC_SCCS) && !defined(lint) static const char sccsid[] = "@(#)res_query.c 8.1 (Berkeley) 6/4/93"; -static const char rcsid[] = "$Id: res_query.c,v 1.8 2005/04/27 04:56:42 sra Exp $"; +static const char rcsid[] = "$Id: res_query.c,v 1.8.672.2 2008/04/03 10:49:22 marka Exp $"; #endif /* LIBC_SCCS and not lint */ #include "port_before.h" @@ -116,8 +116,9 @@ res_nquery(res_state statp, { u_char buf[MAXPACKET]; HEADER *hp = (HEADER *) answer; - int n; u_int oflags; + u_char *rdata; + int n; oflags = statp->_flags; @@ -132,8 +133,14 @@ again: buf, sizeof(buf)); #ifdef RES_USE_EDNS0 if (n > 0 && (statp->_flags & RES_F_EDNS0ERR) == 0 && - (statp->options & (RES_USE_EDNS0|RES_USE_DNSSEC)) != 0U) + (statp->options & (RES_USE_EDNS0|RES_USE_DNSSEC|RES_NSID))) { n = res_nopt(statp, n, buf, sizeof(buf), anslen); + rdata = &buf[n]; + if (n > 0 && (statp->options & RES_NSID) != 0U) { + n = res_nopt_rdata(statp, n, buf, sizeof(buf), rdata, + NS_OPT_NSID, 0, NULL); + } + } #endif if (n <= 0) { #ifdef DEBUG @@ -143,6 +150,7 @@ again: RES_SET_H_ERRNO(statp, NO_RECOVERY); return (n); } + n = res_nsend(statp, buf, n, answer, anslen); if (n < 0) { #ifdef RES_USE_EDNS0 diff --git a/lib/bind9/api b/lib/bind9/api index e1227550..f606e999 100644 --- a/lib/bind9/api +++ b/lib/bind9/api @@ -1,3 +1,3 @@ LIBINTERFACE = 40 -LIBREVISION = 1 +LIBREVISION = 3 LIBAGE = 0 diff --git a/lib/bind9/check.c b/lib/bind9/check.c index 92a3ba73..d06afbda 100644 --- a/lib/bind9/check.c +++ b/lib/bind9/check.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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: check.c,v 1.86 2007/12/14 01:27:12 marka Exp $ */ +/* $Id: check.c,v 1.86.10.4 2008/04/23 21:43:57 each Exp $ */ /*! \file */ @@ -46,10 +46,6 @@ #include <bind9/check.h> -#ifndef DNS_RDATASET_FIXED -#define DNS_RDATASET_FIXED 1 -#endif - static void freekey(char *key, unsigned int type, isc_symvalue_t value, void *userarg) { UNUSED(type); @@ -128,7 +124,8 @@ check_orderent(const cfg_obj_t *ent, isc_log_t *logctx) { } else if (strcasecmp(cfg_obj_asstring(obj), "fixed") == 0) { #if !DNS_RDATASET_FIXED cfg_obj_log(obj, logctx, ISC_LOG_WARNING, - "rrset-order: order 'fixed' not fully implemented"); + "rrset-order: order 'fixed' was disabled at " + "compilation time"); #endif } else if (strcasecmp(cfg_obj_asstring(obj), "random") != 0 && strcasecmp(cfg_obj_asstring(obj), "cyclic") != 0) { @@ -222,13 +219,24 @@ check_dual_stack(const cfg_obj_t *options, isc_log_t *logctx) { } static isc_result_t -check_forward(const cfg_obj_t *options, isc_log_t *logctx) { +check_forward(const cfg_obj_t *options, const cfg_obj_t *global, + isc_log_t *logctx) +{ const cfg_obj_t *forward = NULL; const cfg_obj_t *forwarders = NULL; (void)cfg_map_get(options, "forward", &forward); (void)cfg_map_get(options, "forwarders", &forwarders); + if (forwarders != NULL && global != NULL) { + const char *file = cfg_obj_file(global); + unsigned int line = cfg_obj_line(global); + cfg_obj_log(forwarders, logctx, ISC_LOG_ERROR, + "forwarders declared in root zone and " + "in general configuration: %s:%u", + file, line); + return (ISC_R_FAILURE); + } if (forward != NULL && forwarders == NULL) { cfg_obj_log(forward, logctx, ISC_LOG_ERROR, "no matching 'forwarders' statement"); @@ -380,7 +388,7 @@ checkacl(const char *aclname, cfg_aclconfctx_t *actx, const cfg_obj_t *zconfig, if (aclobj == NULL) return (ISC_R_SUCCESS); result = cfg_acl_fromconfig(aclobj, config, logctx, - actx, mctx, 0, &acl); + actx, mctx, 0, &acl); if (acl != NULL) dns_acl_detach(&acl); return (result); @@ -392,9 +400,9 @@ check_viewacls(cfg_aclconfctx_t *actx, const cfg_obj_t *voptions, { isc_result_t result = ISC_R_SUCCESS, tresult; int i = 0; - + static const char *acls[] = { "allow-query", "allow-query-on", - "allow-query-cache", "allow-query-cache-on", + "allow-query-cache", "allow-query-cache-on", "blackhole", "match-clients", "match-destinations", "sortlist", NULL }; @@ -402,7 +410,7 @@ check_viewacls(cfg_aclconfctx_t *actx, const cfg_obj_t *voptions, tresult = checkacl(acls[i++], actx, NULL, voptions, config, logctx, mctx); if (tresult != ISC_R_SUCCESS) - result = tresult; + result = tresult; } return (result); } @@ -424,8 +432,8 @@ check_recursionacls(cfg_aclconfctx_t *actx, const cfg_obj_t *voptions, int i = 0; static const char *acls[] = { "allow-recursion", "allow-recursion-on", - NULL }; - + NULL }; + if (voptions != NULL) cfg_map_get(voptions, "recursion", &obj); if (obj == NULL && config != NULL) { @@ -456,14 +464,14 @@ check_recursionacls(cfg_aclconfctx_t *actx, const cfg_obj_t *voptions, if (options != NULL) cfg_map_get(options, acls[i], &aclobj); } - if (aclobj == NULL) + if (aclobj == NULL) continue; tresult = cfg_acl_fromconfig(aclobj, config, logctx, actx, mctx, 0, &acl); if (tresult != ISC_R_SUCCESS) - result = tresult; + result = tresult; if (acl == NULL) continue; @@ -480,7 +488,7 @@ check_recursionacls(cfg_aclconfctx_t *actx, const cfg_obj_t *voptions, if (acl != NULL) dns_acl_detach(&acl); - } + } return (result); } @@ -544,8 +552,8 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx) { (void)cfg_map_get(options, "preferred-glue", &obj); if (obj != NULL) { const char *str; - str = cfg_obj_asstring(obj); - if (strcasecmp(str, "a") != 0 && + str = cfg_obj_asstring(obj); + if (strcasecmp(str, "a") != 0 && strcasecmp(str, "aaaa") != 0 && strcasecmp(str, "none") != 0) cfg_obj_log(obj, logctx, ISC_LOG_ERROR, @@ -574,7 +582,7 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx) { isc_buffer_add(&b, strlen(str)); tresult = dns_name_fromtext(name, &b, dns_rootname, - ISC_FALSE, NULL); + ISC_FALSE, NULL); if (tresult != ISC_R_SUCCESS) { cfg_obj_log(obj, logctx, ISC_LOG_ERROR, "bad domain name '%s'", @@ -584,7 +592,7 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx) { } } } - + /* * Set supported DNSSEC algorithms. */ @@ -780,7 +788,7 @@ get_masters_def(const cfg_obj_t *cctx, const char *name, const cfg_obj_t **ret) static isc_result_t validate_masters(const cfg_obj_t *obj, const cfg_obj_t *config, - isc_uint32_t *countp, isc_log_t *logctx, isc_mem_t *mctx) + isc_uint32_t *countp, isc_log_t *logctx, isc_mem_t *mctx) { isc_result_t result = ISC_R_SUCCESS; isc_result_t tresult; @@ -802,7 +810,7 @@ validate_masters(const cfg_obj_t *obj, const cfg_obj_t *config, newlist: list = cfg_tuple_get(obj, "addresses"); element = cfg_list_first(list); - resume: + resume: for ( ; element != NULL; element = cfg_list_next(element)) @@ -899,7 +907,7 @@ check_update_policy(const cfg_obj_t *policy, isc_log_t *logctx) { isc_buffer_init(&b, str, strlen(str)); isc_buffer_add(&b, strlen(str)); tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b, - dns_rootname, ISC_FALSE, NULL); + dns_rootname, ISC_FALSE, NULL); if (tresult != ISC_R_SUCCESS) { cfg_obj_log(identity, logctx, ISC_LOG_ERROR, "'%s' is not a valid name", str); @@ -932,7 +940,7 @@ check_update_policy(const cfg_obj_t *policy, isc_log_t *logctx) { const cfg_obj_t *typeobj; isc_textregion_t r; dns_rdatatype_t type; - + typeobj = cfg_listelt_value(element2); DE_CONST(cfg_obj_asstring(typeobj), r.base); r.length = strlen(r.base); @@ -940,7 +948,7 @@ check_update_policy(const cfg_obj_t *policy, isc_log_t *logctx) { tresult = dns_rdatatype_fromtext(&type, &r); if (tresult != ISC_R_SUCCESS) { cfg_obj_log(typeobj, logctx, ISC_LOG_ERROR, - "'%s' is not a valid type", r.base); + "'%s' is not a valid type", r.base); result = tresult; } } @@ -978,6 +986,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions, dns_rdataclass_t zclass; dns_fixedname_t fixedname; isc_buffer_t b; + isc_boolean_t root = ISC_FALSE; static optionstable options[] = { { "allow-query", MASTERZONE | SLAVEZONE | STUBZONE | CHECKACL }, @@ -1096,7 +1105,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions, isc_buffer_init(&b, zname, strlen(zname)); isc_buffer_add(&b, strlen(zname)); tresult = dns_name_fromtext(dns_fixedname_name(&fixedname), &b, - dns_rootname, ISC_TRUE, NULL); + dns_rootname, ISC_TRUE, NULL); if (tresult != ISC_R_SUCCESS) { cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR, "zone '%s': is not a valid name", zname); @@ -1111,6 +1120,9 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions, "previous definition: %s:%u", logctx, mctx); if (tresult != ISC_R_SUCCESS) result = tresult; + if (dns_name_equal(dns_fixedname_name(&fixedname), + dns_rootname)) + root = ISC_TRUE; } /* @@ -1141,7 +1153,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions, (options[i].allowed & CHECKACL) != 0) { tresult = checkacl(options[i].name, actx, zconfig, - voptions, config, logctx, mctx); + voptions, config, logctx, mctx); if (tresult != ISC_R_SUCCESS) result = tresult; } @@ -1230,7 +1242,18 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions, /* * Check that forwarding is reasonable. */ - if (check_forward(zoptions, logctx) != ISC_R_SUCCESS) + obj = NULL; + if (root) { + if (voptions != NULL) + (void)cfg_map_get(voptions, "forwarders", &obj); + if (obj == NULL) { + const cfg_obj_t *options = NULL; + (void)cfg_map_get(config, "options", &options); + if (options != NULL) + (void)cfg_map_get(options, "forwarders", &obj); + } + } + if (check_forward(zoptions, obj, logctx) != ISC_R_SUCCESS) result = ISC_R_FAILURE; /* @@ -1260,7 +1283,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions, result = tresult; } } - + return (result); } @@ -1289,7 +1312,7 @@ bind9_check_key(const cfg_obj_t *key, isc_log_t *logctx) { { "hmac-sha512", 512 }, { NULL, 0 } }; - + (void)cfg_map_get(key, "algorithm", &algobj); (void)cfg_map_get(key, "secret", &secretobj); if (secretobj == NULL || algobj == NULL) { @@ -1340,7 +1363,7 @@ bind9_check_key(const cfg_obj_t *key, isc_log_t *logctx) { (digestbits < 80U))) cfg_obj_log(algobj, logctx, ISC_LOG_WARNING, "key '%s' digest-bits too small " - "[<%u]", keyname, + "[<%u]", keyname, algorithms[i].size/2); } else { cfg_obj_log(algobj, logctx, ISC_LOG_ERROR, @@ -1447,13 +1470,13 @@ rndckey_exists(const cfg_obj_t *keylist, const char *keyname) { const cfg_listelt_t *element; const cfg_obj_t *obj; const char *str; - + if (keylist == NULL) return (ISC_FALSE); for (element = cfg_list_first(keylist); - element != NULL; - element = cfg_list_next(element)) + element != NULL; + element = cfg_list_next(element)) { obj = cfg_listelt_value(element); str = cfg_obj_asstring(cfg_map_getname(obj)); @@ -1572,7 +1595,7 @@ check_servers(const cfg_obj_t *config, const cfg_obj_t *voptions, } return (result); } - + static isc_result_t check_viewconf(const cfg_obj_t *config, const cfg_obj_t *voptions, const char *viewname, dns_rdataclass_t vclass, @@ -1626,10 +1649,11 @@ check_viewconf(const cfg_obj_t *config, const cfg_obj_t *voptions, const cfg_obj_t *options = NULL; (void)cfg_map_get(config, "options", &options); if (options != NULL) - if (check_forward(options, logctx) != ISC_R_SUCCESS) + if (check_forward(options, NULL, + logctx) != ISC_R_SUCCESS) result = ISC_R_FAILURE; } else { - if (check_forward(voptions, logctx) != ISC_R_SUCCESS) + if (check_forward(voptions, NULL, logctx) != ISC_R_SUCCESS) result = ISC_R_FAILURE; } @@ -1672,7 +1696,7 @@ check_viewconf(const cfg_obj_t *config, const cfg_obj_t *voptions, isc_symtab_destroy(&symtab); return (tresult); } - + if (voptions != NULL) { keys = NULL; (void)cfg_map_get(voptions, "key", &keys); @@ -1763,10 +1787,10 @@ bind9_check_logging(const cfg_obj_t *config, isc_log_t *logctx, const char *channelname; const char *catname; const cfg_obj_t *fileobj = NULL; - const cfg_obj_t *syslogobj = NULL; - const cfg_obj_t *nullobj = NULL; - const cfg_obj_t *stderrobj = NULL; - const cfg_obj_t *logobj = NULL; + const cfg_obj_t *syslogobj = NULL; + const cfg_obj_t *nullobj = NULL; + const cfg_obj_t *stderrobj = NULL; + const cfg_obj_t *logobj = NULL; isc_result_t result = ISC_R_SUCCESS; isc_result_t tresult; isc_symtab_t *symtab = NULL; @@ -1827,9 +1851,9 @@ bind9_check_logging(const cfg_obj_t *config, isc_log_t *logctx, cfg_map_get(logobj, "category", &categories); for (element = cfg_list_first(categories); - element != NULL; - element = cfg_list_next(element)) - { + element != NULL; + element = cfg_list_next(element)) + { category = cfg_listelt_value(element); catname = cfg_obj_asstring(cfg_tuple_get(category, "name")); if (isc_log_categorybyname(logctx, catname) == NULL) { @@ -1845,7 +1869,7 @@ bind9_check_logging(const cfg_obj_t *config, isc_log_t *logctx, channel = cfg_listelt_value(delement); channelname = cfg_obj_asstring(channel); tresult = isc_symtab_lookup(symtab, channelname, 1, - &symvalue); + &symvalue); if (tresult != ISC_R_SUCCESS) { cfg_obj_log(channel, logctx, ISC_LOG_ERROR, "undefined channel: '%s'", @@ -1867,7 +1891,7 @@ bind9_check_controlskeys(const cfg_obj_t *control, const cfg_obj_t *keylist, const cfg_listelt_t *element; const cfg_obj_t *key; const char *keyval; - + control_keylist = cfg_tuple_get(control, "keys"); if (cfg_obj_isvoid(control_keylist)) return (ISC_R_SUCCESS); @@ -2014,7 +2038,7 @@ bind9_check_namedconf(const cfg_obj_t *config, isc_log_t *logctx, if (bind9_check_controls(config, logctx, mctx) != ISC_R_SUCCESS) result = ISC_R_FAILURE; - if (options != NULL && + if (options != NULL && check_order(options, logctx) != ISC_R_SUCCESS) result = ISC_R_FAILURE; @@ -2076,7 +2100,7 @@ bind9_check_namedconf(const cfg_obj_t *config, isc_log_t *logctx, const char *file; unsigned int line; RUNTIME_CHECK(isc_symtab_lookup(symtab, key, - vclass, &symvalue) == ISC_R_SUCCESS); + vclass, &symvalue) == ISC_R_SUCCESS); file = cfg_obj_file(symvalue.as_cpointer); line = cfg_obj_line(symvalue.as_cpointer); cfg_obj_log(view, logctx, ISC_LOG_ERROR, @@ -2116,9 +2140,9 @@ bind9_check_namedconf(const cfg_obj_t *config, isc_log_t *logctx, } } - cfg_map_get(config, "acl", &acls); + cfg_map_get(config, "acl", &acls); - if (acls != NULL) { + if (acls != NULL) { const cfg_listelt_t *elt; const cfg_listelt_t *elt2; const char *aclname; @@ -2138,7 +2162,7 @@ bind9_check_namedconf(const cfg_obj_t *config, isc_log_t *logctx, cfg_obj_log(acl, logctx, ISC_LOG_ERROR, "attempt to redefine " "builtin acl '%s'", - aclname); + aclname); result = ISC_R_FAILURE; break; } @@ -2167,8 +2191,8 @@ bind9_check_namedconf(const cfg_obj_t *config, isc_log_t *logctx, } } - tresult = cfg_map_get(config, "kal", &kals); - if (tresult == ISC_R_SUCCESS) { + tresult = cfg_map_get(config, "kal", &kals); + if (tresult == ISC_R_SUCCESS) { const cfg_listelt_t *elt; const cfg_listelt_t *elt2; const char *aclname; diff --git a/lib/dns/acache.c b/lib/dns/acache.c index c95e2036..0836aca6 100644 --- a/lib/dns/acache.c +++ b/lib/dns/acache.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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: acache.c,v 1.20 2007/06/19 23:47:16 tbox Exp $ */ +/* $Id: acache.c,v 1.20.128.2 2008/02/07 23:46:25 tbox Exp $ */ #include <config.h> @@ -137,7 +137,7 @@ struct acache_cleaner { in seconds. */ isc_stdtime_t last_cleanup_time; /* The time when the last - cleanup task completed */ + cleanup task completed */ isc_timer_t *cleaning_timer; isc_event_t *resched_event; /* Sent by cleaner task to @@ -347,11 +347,11 @@ shutdown_buckets(dns_acache_t *acache) { INSIST(ISC_LIST_EMPTY(dbent->originlist) && ISC_LIST_EMPTY(dbent->referlist)); ISC_LIST_UNLINK(acache->dbbucket[i], dbent, link); - + dns_db_detach(&dbent->db); isc_mem_put(acache->mctx, dbent, sizeof(*dbent)); - + acache->dbentries--; } } @@ -513,7 +513,7 @@ clear_entry(dns_acache_t *acache, dns_acacheentry_t *entry) { if (dns_name_dynamic(entry->foundname)) dns_name_free(entry->foundname, acache->mctx); isc_mem_put(acache->mctx, entry->foundname, - sizeof(*entry->foundname)); + sizeof(*entry->foundname)); entry->foundname = NULL; } @@ -558,7 +558,7 @@ acache_cleaner_init(dns_acache_t *acache, isc_timermgr_t *timermgr, if (timermgr != NULL) { cleaner->acache->live_cleaners++; - + result = isc_task_onshutdown(acache->task, acache_cleaner_shutdown_action, acache); @@ -677,7 +677,7 @@ end_cleaning(acache_cleaner_t *cleaner, isc_event_t *event) { */ if (isc_refcount_current(&cleaner->current_entry->references) == 1) { INSIST(cleaner->current_entry->callback == NULL); - + if (ISC_LINK_LINKED(cleaner->current_entry, link)) { ISC_LIST_UNLINK(acache->entries, cleaner->current_entry, link); @@ -701,7 +701,7 @@ end_cleaning(acache_cleaner_t *cleaner, isc_event_t *event) { acache->stats.queries, acache->stats.adds, acache->stats.deleted, acache->stats.cleaned, acache->stats.cleaner_runs, - acache->stats.overmem, acache->stats.overmem_nocreates, + acache->stats.overmem, acache->stats.overmem_nocreates, acache->stats.nomem); reset_stats(acache); @@ -913,7 +913,7 @@ static void acache_overmem_cleaning_action(isc_task_t *task, isc_event_t *event) { acache_cleaner_t *cleaner = event->ev_arg; isc_boolean_t want_cleaning = ISC_FALSE; - + UNUSED(task); INSIST(event->ev_type == DNS_EVENT_ACACHEOVERMEM); @@ -965,10 +965,14 @@ water(void *arg, int mark) { LOCK(&acache->cleaner.lock); - acache->cleaner.overmem = overmem; + if (acache->cleaner.overmem != overmem) { + acache->cleaner.overmem = overmem; - if (acache->cleaner.overmem_event != NULL) - isc_task_send(acache->task, &acache->cleaner.overmem_event); + if (acache->cleaner.overmem_event != NULL) + isc_task_send(acache->task, + &acache->cleaner.overmem_event); + isc_mem_waterack(acache->mctx, mark); + } UNLOCK(&acache->cleaner.lock); } @@ -1102,7 +1106,7 @@ dns_acache_create(dns_acache_t **acachep, isc_mem_t *mctx, } acache->live_cleaners = 0; - result = acache_cleaner_init(acache, timermgr, &acache->cleaner); + result = acache_cleaner_init(acache, timermgr, &acache->cleaner); if (result != ISC_R_SUCCESS) goto cleanup; @@ -1177,7 +1181,7 @@ dns_acache_detach(dns_acache_t **acachep) { isc_task_shutdown(acache->task); should_free = ISC_FALSE; } - + if (should_free) destroy(acache); } @@ -1366,14 +1370,14 @@ dns_acache_createentry(dns_acache_t *acache, dns_db_t *origdb, REQUIRE(entryp != NULL && *entryp == NULL); REQUIRE(origdb != NULL); - /* - * Should we exceed our memory limit for some reason (for - * example, if the cleaner does not run aggressively enough), + /* + * Should we exceed our memory limit for some reason (for + * example, if the cleaner does not run aggressively enough), * then we will not create additional entries. * * XXXSK: It might be better to lock the acache->cleaner->lock, - * but locking may be an expensive bottleneck. If we misread - * the value, we will occasionally refuse to create a few + * but locking may be an expensive bottleneck. If we misread + * the value, we will occasionally refuse to create a few * cache entries, or create a few that we should not. I do not * expect this to happen often, and it will not have very bad * effects when it does. So no lock for now. @@ -1391,7 +1395,7 @@ dns_acache_createentry(dns_acache_t *acache, dns_db_t *origdb, isc_random_get(&r); newentry->locknum = r % DEFAULT_ACACHE_ENTRY_LOCK_COUNT; - + result = isc_refcount_init(&newentry->references, 1); if (result != ISC_R_SUCCESS) { isc_mem_put(acache->mctx, newentry, sizeof(*newentry)); @@ -1738,7 +1742,7 @@ dns_acache_setcleaninginterval(dns_acache_t *acache, unsigned int t) { isc_timertype_ticker, NULL, &interval, ISC_FALSE); } - if (result != ISC_R_SUCCESS) + if (result != ISC_R_SUCCESS) isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_ACACHE, ISC_LOG_WARNING, "could not set acache cleaning interval: %s", diff --git a/lib/dns/acl.c b/lib/dns/acl.c index d8d0b9bc..bb54a8a3 100644 --- a/lib/dns/acl.c +++ b/lib/dns/acl.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: acl.c,v 1.37.2.6 2008/01/27 02:12:51 marka Exp $ */ +/* $Id: acl.c,v 1.37.2.7 2008/04/29 01:04:14 each Exp $ */ /*! \file */ @@ -148,7 +148,7 @@ dns_acl_isanyornone(dns_acl_t *acl, isc_boolean_t pos) return (ISC_FALSE); if (acl->iptable->radix->head->prefix->bitlen == 0 && - *(isc_boolean_t *) (acl->iptable->radix->head->data) == pos) + *(isc_boolean_t *) (acl->iptable->radix->head->data[0]) == pos) return (ISC_TRUE); return (ISC_FALSE); /* All others */ diff --git a/lib/dns/adb.c b/lib/dns/adb.c index 182f1c53..e862a726 100644 --- a/lib/dns/adb.c +++ b/lib/dns/adb.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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.233 2007/10/19 17:15:53 explorer Exp $ */ +/* $Id: adb.c,v 1.233.36.8 2008/05/03 05:06:03 marka Exp $ */ /*! \file * @@ -26,13 +26,6 @@ * */ -/*% - * After we have cleaned all buckets, dump the database contents. - */ -#if 0 -#define DUMP_ADB_AFTER_CLEANING -#endif - #include <config.h> #include <limits.h> @@ -42,7 +35,6 @@ #include <isc/random.h> #include <isc/string.h> /* Required for HP/UX (and others?) */ #include <isc/task.h> -#include <isc/timer.h> #include <isc/util.h> #include <dns/adb.h> @@ -55,6 +47,7 @@ #include <dns/rdatatype.h> #include <dns/resolver.h> #include <dns/result.h> +#include <dns/stats.h> #define DNS_ADB_MAGIC ISC_MAGIC('D', 'a', 'd', 'b') #define DNS_ADB_VALID(x) ISC_MAGIC_VALID(x, DNS_ADB_MAGIC) @@ -89,16 +82,6 @@ #define ADB_ENTRY_WINDOW 1800 /*%< seconds */ /*% - * Wake up every CLEAN_SECONDS and clean CLEAN_BUCKETS buckets, so that all - * buckets are cleaned in CLEAN_PERIOD seconds. - */ -#define CLEAN_PERIOD 3600 -/*% See #CLEAN_PERIOD */ -#define CLEAN_SECONDS 30 -/*% See #CLEAN_PERIOD */ -#define CLEAN_BUCKETS ((NBUCKETS * CLEAN_SECONDS) / CLEAN_PERIOD) - -/*% * The period in seconds after which an ADB name entry is regarded as stale * and forced to be cleaned up. * TODO: This should probably be configurable at run-time. @@ -124,78 +107,60 @@ typedef struct dns_adbfetch6 dns_adbfetch6_t; /*% dns adb structure */ struct dns_adb { - unsigned int magic; - - isc_mutex_t lock; - isc_mutex_t reflock; /*%< Covers irefcnt, erefcnt */ - isc_mem_t *mctx; - dns_view_t *view; - isc_timermgr_t *timermgr; - isc_timer_t *timer; - -#ifdef LRU_DEBUG - isc_timer_t *dump_timer; /* for test */ - isc_time_t dump_time; /* for test */ -#define DUMP_INTERVAL 30 /* seconds */ -#endif - - isc_taskmgr_t *taskmgr; - isc_task_t *task; - isc_boolean_t overmem; - - isc_interval_t tick_interval; - int next_cleanbucket; - - unsigned int irefcnt; - unsigned int erefcnt; - - isc_mutex_t mplock; - isc_mempool_t *nmp; /*%< dns_adbname_t */ - isc_mempool_t *nhmp; /*%< dns_adbnamehook_t */ - isc_mempool_t *limp; /*%< dns_adblameinfo_t */ - isc_mempool_t *emp; /*%< dns_adbentry_t */ - isc_mempool_t *ahmp; /*%< dns_adbfind_t */ - isc_mempool_t *aimp; /*%< dns_adbaddrinfo_t */ - isc_mempool_t *afmp; /*%< dns_adbfetch_t */ - - /*! - * Bucketized locks and lists for names. - * - * XXXRTH Have a per-bucket structure that contains all of these? - */ - dns_adbnamelist_t names[NBUCKETS]; - /*% See dns_adbnamelist_t */ - isc_mutex_t namelocks[NBUCKETS]; - /*% See dns_adbnamelist_t */ - isc_boolean_t name_sd[NBUCKETS]; - /*% See dns_adbnamelist_t */ - unsigned int name_refcnt[NBUCKETS]; - - /*! - * Bucketized locks for entries. - * - * XXXRTH Have a per-bucket structure that contains all of these? - */ - dns_adbentrylist_t entries[NBUCKETS]; - isc_mutex_t entrylocks[NBUCKETS]; - isc_boolean_t entry_sd[NBUCKETS]; /*%< shutting down */ - unsigned int entry_refcnt[NBUCKETS]; - - isc_event_t cevent; - isc_boolean_t cevent_sent; - isc_boolean_t shutting_down; - isc_eventlist_t whenshutdown; - -#ifdef LRU_DEBUG - unsigned int stale_purge; - unsigned int stale_scan; - unsigned int stale_expire; - unsigned int stale_lru; - - unsigned int nname, nname_total; - unsigned int nentry, nentry_total; - unsigned int nameuses, entryuses; -#endif + unsigned int magic; + + isc_mutex_t lock; + isc_mutex_t reflock; /*%< Covers irefcnt, erefcnt */ + isc_mutex_t overmemlock; /*%< Covers overmem */ + isc_mem_t *mctx; + dns_view_t *view; + + isc_taskmgr_t *taskmgr; + isc_task_t *task; + isc_boolean_t overmem; + + isc_interval_t tick_interval; + int next_cleanbucket; + + unsigned int irefcnt; + unsigned int erefcnt; + + isc_mutex_t mplock; + isc_mempool_t *nmp; /*%< dns_adbname_t */ + isc_mempool_t *nhmp; /*%< dns_adbnamehook_t */ + isc_mempool_t *limp; /*%< dns_adblameinfo_t */ + isc_mempool_t *emp; /*%< dns_adbentry_t */ + isc_mempool_t *ahmp; /*%< dns_adbfind_t */ + isc_mempool_t *aimp; /*%< dns_adbaddrinfo_t */ + isc_mempool_t *afmp; /*%< dns_adbfetch_t */ + + /*! + * Bucketized locks and lists for names. + * + * XXXRTH Have a per-bucket structure that contains all of these? + */ + dns_adbnamelist_t names[NBUCKETS]; + /*% See dns_adbnamelist_t */ + isc_mutex_t namelocks[NBUCKETS]; + /*% See dns_adbnamelist_t */ + isc_boolean_t name_sd[NBUCKETS]; + /*% See dns_adbnamelist_t */ + unsigned int name_refcnt[NBUCKETS]; + + /*! + * Bucketized locks for entries. + * + * XXXRTH Have a per-bucket structure that contains all of these? + */ + dns_adbentrylist_t entries[NBUCKETS]; + isc_mutex_t entrylocks[NBUCKETS]; + isc_boolean_t entry_sd[NBUCKETS]; /*%< shutting down */ + unsigned int entry_refcnt[NBUCKETS]; + + isc_event_t cevent; + isc_boolean_t cevent_sent; + isc_boolean_t shutting_down; + isc_eventlist_t whenshutdown; }; /* @@ -204,37 +169,37 @@ struct dns_adb { /*% dns_adbname structure */ struct dns_adbname { - unsigned int magic; - dns_name_t name; - dns_adb_t *adb; - unsigned int partial_result; - unsigned int flags; - int lock_bucket; - dns_name_t target; - isc_stdtime_t expire_target; - isc_stdtime_t expire_v4; - isc_stdtime_t expire_v6; - unsigned int chains; - dns_adbnamehooklist_t v4; - dns_adbnamehooklist_t v6; - dns_adbfetch_t *fetch_a; - dns_adbfetch_t *fetch_aaaa; - unsigned int fetch_err; - unsigned int fetch6_err; - dns_adbfindlist_t finds; - /* for LRU-based management */ - isc_stdtime_t last_used; - - ISC_LINK(dns_adbname_t) plink; + unsigned int magic; + dns_name_t name; + dns_adb_t *adb; + unsigned int partial_result; + unsigned int flags; + int lock_bucket; + dns_name_t target; + isc_stdtime_t expire_target; + isc_stdtime_t expire_v4; + isc_stdtime_t expire_v6; + unsigned int chains; + dns_adbnamehooklist_t v4; + dns_adbnamehooklist_t v6; + dns_adbfetch_t *fetch_a; + dns_adbfetch_t *fetch_aaaa; + unsigned int fetch_err; + unsigned int fetch6_err; + dns_adbfindlist_t finds; + /* for LRU-based management */ + isc_stdtime_t last_used; + + ISC_LINK(dns_adbname_t) plink; }; /*% The adbfetch structure */ struct dns_adbfetch { - unsigned int magic; - dns_adbnamehook_t *namehook; - dns_adbentry_t *entry; - dns_fetch_t *fetch; - dns_rdataset_t rdataset; + unsigned int magic; + dns_adbnamehook_t *namehook; + dns_adbentry_t *entry; + dns_fetch_t *fetch; + dns_rdataset_t rdataset; }; /*% @@ -243,9 +208,9 @@ struct dns_adbfetch { * namehook that will contain the next address this host has. */ struct dns_adbnamehook { - unsigned int magic; - dns_adbentry_t *entry; - ISC_LINK(dns_adbnamehook_t) plink; + unsigned int magic; + dns_adbentry_t *entry; + ISC_LINK(dns_adbnamehook_t) plink; }; /*% @@ -254,13 +219,13 @@ struct dns_adbnamehook { * extended to other types of information about zones. */ struct dns_adblameinfo { - unsigned int magic; + unsigned int magic; - dns_name_t qname; - dns_rdatatype_t qtype; - isc_stdtime_t lame_timer; + dns_name_t qname; + dns_rdatatype_t qtype; + isc_stdtime_t lame_timer; - ISC_LINK(dns_adblameinfo_t) plink; + ISC_LINK(dns_adblameinfo_t) plink; }; /*% @@ -269,26 +234,26 @@ struct dns_adblameinfo { * the host. */ struct dns_adbentry { - unsigned int magic; - - int lock_bucket; - unsigned int refcnt; - - unsigned int flags; - unsigned int srtt; - isc_sockaddr_t sockaddr; - - isc_stdtime_t expires; - /*%< - * A nonzero 'expires' field indicates that the entry should - * persist until that time. This allows entries found - * using dns_adb_findaddrinfo() to persist for a limited time - * even though they are not necessarily associated with a - * name. - */ - - ISC_LIST(dns_adblameinfo_t) lameinfo; - ISC_LINK(dns_adbentry_t) plink; + unsigned int magic; + + int lock_bucket; + unsigned int refcnt; + + unsigned int flags; + unsigned int srtt; + isc_sockaddr_t sockaddr; + + isc_stdtime_t expires; + /*%< + * A nonzero 'expires' field indicates that the entry should + * persist until that time. This allows entries found + * using dns_adb_findaddrinfo() to persist for a limited time + * even though they are not necessarily associated with a + * name. + */ + + ISC_LIST(dns_adblameinfo_t) lameinfo; + ISC_LINK(dns_adbentry_t) plink; }; /* @@ -297,52 +262,51 @@ struct dns_adbentry { static inline dns_adbname_t *new_adbname(dns_adb_t *, dns_name_t *); static inline void free_adbname(dns_adb_t *, dns_adbname_t **); static inline dns_adbnamehook_t *new_adbnamehook(dns_adb_t *, - dns_adbentry_t *); + dns_adbentry_t *); static inline void free_adbnamehook(dns_adb_t *, dns_adbnamehook_t **); static inline dns_adblameinfo_t *new_adblameinfo(dns_adb_t *, dns_name_t *, - dns_rdatatype_t); + dns_rdatatype_t); static inline void free_adblameinfo(dns_adb_t *, dns_adblameinfo_t **); static inline dns_adbentry_t *new_adbentry(dns_adb_t *); static inline void free_adbentry(dns_adb_t *, dns_adbentry_t **); static inline dns_adbfind_t *new_adbfind(dns_adb_t *); static inline isc_boolean_t free_adbfind(dns_adb_t *, dns_adbfind_t **); static inline dns_adbaddrinfo_t *new_adbaddrinfo(dns_adb_t *, dns_adbentry_t *, - in_port_t); + in_port_t); static inline dns_adbfetch_t *new_adbfetch(dns_adb_t *); static inline void free_adbfetch(dns_adb_t *, dns_adbfetch_t **); static inline dns_adbname_t *find_name_and_lock(dns_adb_t *, dns_name_t *, - unsigned int, int *); + unsigned int, int *); static inline dns_adbentry_t *find_entry_and_lock(dns_adb_t *, - isc_sockaddr_t *, int *); + isc_sockaddr_t *, int *); static void dump_adb(dns_adb_t *, FILE *, isc_boolean_t debug, isc_stdtime_t); static void print_dns_name(FILE *, dns_name_t *); static void print_namehook_list(FILE *, const char *legend, - dns_adbnamehooklist_t *list, - isc_boolean_t debug, - isc_stdtime_t now); + dns_adbnamehooklist_t *list, + isc_boolean_t debug, + isc_stdtime_t now); static void print_find_list(FILE *, dns_adbname_t *); static void print_fetch_list(FILE *, dns_adbname_t *); static inline isc_boolean_t dec_adb_irefcnt(dns_adb_t *); 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); + isc_boolean_t); static inline isc_boolean_t dec_entry_refcnt(dns_adb_t *, dns_adbentry_t *, - isc_boolean_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 *, - isc_boolean_t); + isc_boolean_t); static void clean_target(dns_adb_t *, dns_name_t *); static void clean_finds_at_name(dns_adbname_t *, isc_eventtype_t, - unsigned int); + unsigned int); static isc_boolean_t check_expire_namehooks(dns_adbname_t *, isc_stdtime_t); static void cancel_fetches_at_name(dns_adbname_t *); static isc_result_t dbfind_name(dns_adbname_t *, isc_stdtime_t, - dns_rdatatype_t); + dns_rdatatype_t); static isc_result_t fetch_name(dns_adbname_t *, isc_boolean_t, - dns_rdatatype_t); + dns_rdatatype_t); static inline void check_exit(dns_adb_t *); -static void timer_cleanup(isc_task_t *, isc_event_t *); static void destroy(dns_adb_t *); static isc_boolean_t shutdown_names(dns_adb_t *); static isc_boolean_t shutdown_entries(dns_adb_t *); @@ -351,14 +315,10 @@ static inline isc_boolean_t unlink_name(dns_adb_t *, dns_adbname_t *); static inline void link_entry(dns_adb_t *, int, dns_adbentry_t *); static inline isc_boolean_t unlink_entry(dns_adb_t *, dns_adbentry_t *); static isc_boolean_t kill_name(dns_adbname_t **, isc_eventtype_t, - isc_boolean_t); + isc_boolean_t); static void water(void *, int); static void dump_entry(FILE *, dns_adbentry_t *, isc_boolean_t, isc_stdtime_t); -#ifdef LRU_DEBUG -static void timer_dump(isc_task_t *, isc_event_t *); -#endif - /* * MUST NOT overlap DNS_ADBFIND_* flags! */ @@ -404,9 +364,9 @@ static void timer_dump(isc_task_t *, isc_event_t *); #define FIND_WANTEVENT(fn) (((fn)->options & DNS_ADBFIND_WANTEVENT) != 0) #define FIND_WANTEMPTYEVENT(fn) (((fn)->options & DNS_ADBFIND_EMPTYEVENT) != 0) #define FIND_AVOIDFETCHES(fn) (((fn)->options & DNS_ADBFIND_AVOIDFETCHES) \ - != 0) + != 0) #define FIND_STARTATZONE(fn) (((fn)->options & DNS_ADBFIND_STARTATZONE) \ - != 0) + != 0) #define FIND_HINTOK(fn) (((fn)->options & DNS_ADBFIND_HINTOK) != 0) #define FIND_GLUEOK(fn) (((fn)->options & DNS_ADBFIND_GLUEOK) != 0) #define FIND_HAS_ADDRS(fn) (!ISC_LIST_EMPTY((fn)->list)) @@ -430,7 +390,7 @@ static void timer_dump(isc_task_t *, isc_event_t *); #define HINT_OK(nf, o) (!NAME_HINTOK(nf) || (((o) & DNS_ADBFIND_HINTOK) != 0)) #define GLUEHINT_OK(nf, o) (GLUE_OK(nf, o) || HINT_OK(nf, o)) #define STARTATZONE_MATCHES(nf, o) (((nf)->flags & NAME_STARTATZONE) == \ - ((o) & DNS_ADBFIND_STARTATZONE)) + ((o) & DNS_ADBFIND_STARTATZONE)) #define ENTER_LEVEL ISC_LOG_DEBUG(50) #define EXIT_LEVEL ENTER_LEVEL @@ -439,14 +399,14 @@ static void timer_dump(isc_task_t *, isc_event_t *); #define NCACHE_LEVEL ISC_LOG_DEBUG(20) #define NCACHE_RESULT(r) ((r) == DNS_R_NCACHENXDOMAIN || \ - (r) == DNS_R_NCACHENXRRSET) + (r) == DNS_R_NCACHENXRRSET) #define AUTH_NX(r) ((r) == DNS_R_NXDOMAIN || \ - (r) == DNS_R_NXRRSET) + (r) == DNS_R_NXRRSET) #define NXDOMAIN_RESULT(r) ((r) == DNS_R_NXDOMAIN || \ - (r) == DNS_R_NCACHENXDOMAIN) + (r) == DNS_R_NCACHENXDOMAIN) #define NXRRSET_RESULT(r) ((r) == DNS_R_NCACHENXRRSET || \ - (r) == DNS_R_NXRRSET || \ - (r) == DNS_R_HINTNXRRSET) + (r) == DNS_R_NXRRSET || \ + (r) == DNS_R_HINTNXRRSET) /* * Error state rankings. @@ -462,25 +422,25 @@ static void timer_dump(isc_task_t *, isc_event_t *); #define FIND_ERR_MAX 7 static const char *errnames[] = { - "success", - "canceled", - "failure", - "nxdomain", - "nxrrset", - "unexpected", - "not_found" + "success", + "canceled", + "failure", + "nxdomain", + "nxrrset", + "unexpected", + "not_found" }; #define NEWERR(old, new) (ISC_MIN((old), (new))) static isc_result_t find_err_map[FIND_ERR_MAX] = { - ISC_R_SUCCESS, - ISC_R_CANCELED, - ISC_R_FAILURE, - DNS_R_NXDOMAIN, - DNS_R_NXRRSET, - ISC_R_UNEXPECTED, - ISC_R_NOTFOUND /* not YET found */ + ISC_R_SUCCESS, + ISC_R_CANCELED, + ISC_R_FAILURE, + DNS_R_NXDOMAIN, + DNS_R_NXRRSET, + ISC_R_UNEXPECTED, + ISC_R_NOTFOUND /* not YET found */ }; static void @@ -488,23 +448,32 @@ DP(int level, const char *format, ...) ISC_FORMAT_PRINTF(2, 3); static void DP(int level, const char *format, ...) { - va_list args; + va_list args; - va_start(args, format); - isc_log_vwrite(dns_lctx, - DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_ADB, - level, format, args); - va_end(args); + va_start(args, format); + isc_log_vwrite(dns_lctx, + DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_ADB, + level, format, args); + va_end(args); +} + +/*% + * Increment resolver-related statistics counters. + */ +static inline void +inc_stats(dns_adb_t *adb, dns_statscounter_t counter) { + if (adb->view->resstats != NULL) + dns_generalstats_increment(adb->view->resstats, counter); } static inline dns_ttl_t ttlclamp(dns_ttl_t ttl) { - if (ttl < ADB_CACHE_MINIMUM) - ttl = ADB_CACHE_MINIMUM; - if (ttl > ADB_CACHE_MAXIMUM) - ttl = ADB_CACHE_MAXIMUM; + if (ttl < ADB_CACHE_MINIMUM) + ttl = ADB_CACHE_MINIMUM; + if (ttl > ADB_CACHE_MAXIMUM) + ttl = ADB_CACHE_MAXIMUM; - return (ttl); + return (ttl); } /* @@ -514,134 +483,133 @@ ttlclamp(dns_ttl_t ttl) { */ static isc_result_t import_rdataset(dns_adbname_t *adbname, dns_rdataset_t *rdataset, - isc_stdtime_t now) + isc_stdtime_t now) { - isc_result_t result; - dns_adb_t *adb; - dns_adbnamehook_t *nh; - dns_adbnamehook_t *anh; - dns_rdata_t rdata = DNS_RDATA_INIT; - struct in_addr ina; - struct in6_addr in6a; - isc_sockaddr_t sockaddr; - dns_adbentry_t *foundentry; /* NO CLEAN UP! */ - int addr_bucket; - isc_boolean_t new_addresses_added; - dns_rdatatype_t rdtype; - unsigned int findoptions; - - INSIST(DNS_ADBNAME_VALID(adbname)); - adb = adbname->adb; - INSIST(DNS_ADB_VALID(adb)); - - rdtype = rdataset->type; - INSIST((rdtype == dns_rdatatype_a) || (rdtype == dns_rdatatype_aaaa)); - if (rdtype == dns_rdatatype_a) - findoptions = DNS_ADBFIND_INET; - else - findoptions = DNS_ADBFIND_INET6; - - addr_bucket = DNS_ADB_INVALIDBUCKET; - new_addresses_added = ISC_FALSE; - - nh = NULL; - result = dns_rdataset_first(rdataset); - while (result == ISC_R_SUCCESS) { - dns_rdata_reset(&rdata); - dns_rdataset_current(rdataset, &rdata); - if (rdtype == dns_rdatatype_a) { - INSIST(rdata.length == 4); - memcpy(&ina.s_addr, rdata.data, 4); - isc_sockaddr_fromin(&sockaddr, &ina, 0); - } else { - INSIST(rdata.length == 16); - memcpy(in6a.s6_addr, rdata.data, 16); - isc_sockaddr_fromin6(&sockaddr, &in6a, 0); - } - - INSIST(nh == NULL); - nh = new_adbnamehook(adb, NULL); - if (nh == NULL) { - adbname->partial_result |= findoptions; - result = ISC_R_NOMEMORY; - goto fail; - } - - foundentry = find_entry_and_lock(adb, &sockaddr, &addr_bucket); - if (foundentry == NULL) { - dns_adbentry_t *entry; - - entry = new_adbentry(adb); - if (entry == NULL) { - adbname->partial_result |= findoptions; - result = ISC_R_NOMEMORY; - goto fail; - } - - entry->sockaddr = sockaddr; - entry->refcnt = 1; - - nh->entry = entry; - - link_entry(adb, addr_bucket, entry); - } else { - for (anh = ISC_LIST_HEAD(adbname->v4); - anh != NULL; - anh = ISC_LIST_NEXT(anh, plink)) - if (anh->entry == foundentry) - break; - if (anh == NULL) { - foundentry->refcnt++; - nh->entry = foundentry; - } else - free_adbnamehook(adb, &nh); - } - - new_addresses_added = ISC_TRUE; - if (nh != NULL) { - if (rdtype == dns_rdatatype_a) - ISC_LIST_APPEND(adbname->v4, nh, plink); - else - ISC_LIST_APPEND(adbname->v6, nh, plink); - } - nh = NULL; - result = dns_rdataset_next(rdataset); - } + isc_result_t result; + dns_adb_t *adb; + dns_adbnamehook_t *nh; + dns_adbnamehook_t *anh; + dns_rdata_t rdata = DNS_RDATA_INIT; + struct in_addr ina; + struct in6_addr in6a; + isc_sockaddr_t sockaddr; + dns_adbentry_t *foundentry; /* NO CLEAN UP! */ + int addr_bucket; + isc_boolean_t new_addresses_added; + dns_rdatatype_t rdtype; + unsigned int findoptions; + dns_adbnamehooklist_t *hookhead; + + INSIST(DNS_ADBNAME_VALID(adbname)); + adb = adbname->adb; + INSIST(DNS_ADB_VALID(adb)); + + rdtype = rdataset->type; + INSIST((rdtype == dns_rdatatype_a) || (rdtype == dns_rdatatype_aaaa)); + if (rdtype == dns_rdatatype_a) + findoptions = DNS_ADBFIND_INET; + else + findoptions = DNS_ADBFIND_INET6; + + addr_bucket = DNS_ADB_INVALIDBUCKET; + new_addresses_added = ISC_FALSE; + + nh = NULL; + result = dns_rdataset_first(rdataset); + while (result == ISC_R_SUCCESS) { + dns_rdata_reset(&rdata); + dns_rdataset_current(rdataset, &rdata); + if (rdtype == dns_rdatatype_a) { + INSIST(rdata.length == 4); + memcpy(&ina.s_addr, rdata.data, 4); + isc_sockaddr_fromin(&sockaddr, &ina, 0); + hookhead = &adbname->v4; + } else { + INSIST(rdata.length == 16); + memcpy(in6a.s6_addr, rdata.data, 16); + isc_sockaddr_fromin6(&sockaddr, &in6a, 0); + hookhead = &adbname->v6; + } + + INSIST(nh == NULL); + nh = new_adbnamehook(adb, NULL); + if (nh == NULL) { + adbname->partial_result |= findoptions; + result = ISC_R_NOMEMORY; + goto fail; + } + + foundentry = find_entry_and_lock(adb, &sockaddr, &addr_bucket); + if (foundentry == NULL) { + dns_adbentry_t *entry; + + entry = new_adbentry(adb); + if (entry == NULL) { + adbname->partial_result |= findoptions; + result = ISC_R_NOMEMORY; + goto fail; + } + + entry->sockaddr = sockaddr; + entry->refcnt = 1; + + nh->entry = entry; + + link_entry(adb, addr_bucket, entry); + } else { + for (anh = ISC_LIST_HEAD(*hookhead); + anh != NULL; + anh = ISC_LIST_NEXT(anh, plink)) + if (anh->entry == foundentry) + break; + if (anh == NULL) { + foundentry->refcnt++; + nh->entry = foundentry; + } else + free_adbnamehook(adb, &nh); + } + + new_addresses_added = ISC_TRUE; + if (nh != NULL) + ISC_LIST_APPEND(*hookhead, nh, plink); + nh = NULL; + result = dns_rdataset_next(rdataset); + } fail: - if (nh != NULL) - free_adbnamehook(adb, &nh); - - if (addr_bucket != DNS_ADB_INVALIDBUCKET) - UNLOCK(&adb->entrylocks[addr_bucket]); - - if (rdataset->trust == dns_trust_glue || - rdataset->trust == dns_trust_additional) - rdataset->ttl = ADB_CACHE_MINIMUM; - else - rdataset->ttl = ttlclamp(rdataset->ttl); - - if (rdtype == dns_rdatatype_a) { - DP(NCACHE_LEVEL, "expire_v4 set to MIN(%u,%u) import_rdataset", - adbname->expire_v4, now + rdataset->ttl); - adbname->expire_v4 = ISC_MIN(adbname->expire_v4, - now + rdataset->ttl); - } else { - DP(NCACHE_LEVEL, "expire_v6 set to MIN(%u,%u) import_rdataset", - adbname->expire_v6, now + rdataset->ttl); - adbname->expire_v6 = ISC_MIN(adbname->expire_v6, - now + rdataset->ttl); - } - - if (new_addresses_added) { - /* - * Lie a little here. This is more or less so code that cares - * can find out if any new information was added or not. - */ - return (ISC_R_SUCCESS); - } - - return (result); + if (nh != NULL) + free_adbnamehook(adb, &nh); + + if (addr_bucket != DNS_ADB_INVALIDBUCKET) + UNLOCK(&adb->entrylocks[addr_bucket]); + + if (rdataset->trust == dns_trust_glue || + rdataset->trust == dns_trust_additional) + rdataset->ttl = ADB_CACHE_MINIMUM; + else + rdataset->ttl = ttlclamp(rdataset->ttl); + + if (rdtype == dns_rdatatype_a) { + DP(NCACHE_LEVEL, "expire_v4 set to MIN(%u,%u) import_rdataset", + adbname->expire_v4, now + rdataset->ttl); + adbname->expire_v4 = ISC_MIN(adbname->expire_v4, + now + rdataset->ttl); + } else { + DP(NCACHE_LEVEL, "expire_v6 set to MIN(%u,%u) import_rdataset", + adbname->expire_v6, now + rdataset->ttl); + adbname->expire_v6 = ISC_MIN(adbname->expire_v6, + now + rdataset->ttl); + } + + if (new_addresses_added) { + /* + * Lie a little here. This is more or less so code that cares + * can find out if any new information was added or not. + */ + return (ISC_R_SUCCESS); + } + + return (result); } /* @@ -649,57 +617,57 @@ import_rdataset(dns_adbname_t *adbname, dns_rdataset_t *rdataset, */ static isc_boolean_t kill_name(dns_adbname_t **n, isc_eventtype_t ev, isc_boolean_t is_purge) { - dns_adbname_t *name; - isc_boolean_t result = ISC_FALSE; - isc_boolean_t result4, result6; - dns_adb_t *adb; - - INSIST(n != NULL); - name = *n; - *n = NULL; - INSIST(DNS_ADBNAME_VALID(name)); - adb = name->adb; - INSIST(DNS_ADB_VALID(adb)); - - DP(DEF_LEVEL, "killing name %p", name); - - /* - * If we're dead already, just check to see if we should go - * away now or not. - */ - if (NAME_DEAD(name) && !NAME_FETCH(name)) { - result = unlink_name(adb, name); - free_adbname(adb, &name); - if (result) - result = dec_adb_irefcnt(adb); - return (result); - } - - /* - * Clean up the name's various lists. These two are destructive - * in that they will always empty the list. - */ - clean_finds_at_name(name, ev, DNS_ADBFIND_ADDRESSMASK); - result4 = clean_namehooks(adb, &name->v4, is_purge); - result6 = clean_namehooks(adb, &name->v6, is_purge); - clean_target(adb, &name->target); - result = ISC_TF(result4 || result6); - - /* - * If fetches are running, cancel them. If none are running, we can - * just kill the name here. - */ - if (!NAME_FETCH(name)) { - INSIST(result == ISC_FALSE); - result = unlink_name(adb, name); - free_adbname(adb, &name); - if (result) - result = dec_adb_irefcnt(adb); - } else { - name->flags |= NAME_IS_DEAD; - cancel_fetches_at_name(name); - } - return (result); + dns_adbname_t *name; + isc_boolean_t result = ISC_FALSE; + isc_boolean_t result4, result6; + dns_adb_t *adb; + + INSIST(n != NULL); + name = *n; + *n = NULL; + INSIST(DNS_ADBNAME_VALID(name)); + adb = name->adb; + INSIST(DNS_ADB_VALID(adb)); + + DP(DEF_LEVEL, "killing name %p", name); + + /* + * If we're dead already, just check to see if we should go + * away now or not. + */ + if (NAME_DEAD(name) && !NAME_FETCH(name)) { + result = unlink_name(adb, name); + free_adbname(adb, &name); + if (result) + result = dec_adb_irefcnt(adb); + return (result); + } + + /* + * Clean up the name's various lists. These two are destructive + * in that they will always empty the list. + */ + clean_finds_at_name(name, ev, DNS_ADBFIND_ADDRESSMASK); + result4 = clean_namehooks(adb, &name->v4, is_purge); + result6 = clean_namehooks(adb, &name->v6, is_purge); + clean_target(adb, &name->target); + result = ISC_TF(result4 || result6); + + /* + * If fetches are running, cancel them. If none are running, we can + * just kill the name here. + */ + if (!NAME_FETCH(name)) { + INSIST(result == ISC_FALSE); + result = unlink_name(adb, name); + free_adbname(adb, &name); + if (result) + result = dec_adb_irefcnt(adb); + } else { + name->flags |= NAME_IS_DEAD; + cancel_fetches_at_name(name); + } + return (result); } /* @@ -707,48 +675,48 @@ kill_name(dns_adbname_t **n, isc_eventtype_t ev, isc_boolean_t is_purge) { */ static isc_boolean_t check_expire_namehooks(dns_adbname_t *name, isc_stdtime_t now) { - dns_adb_t *adb; - isc_boolean_t result4 = ISC_FALSE; - isc_boolean_t result6 = ISC_FALSE; - - INSIST(DNS_ADBNAME_VALID(name)); - adb = name->adb; - INSIST(DNS_ADB_VALID(adb)); - - /* - * Check to see if we need to remove the v4 addresses - */ - if (!NAME_FETCH_V4(name) && EXPIRE_OK(name->expire_v4, now)) { - if (NAME_HAS_V4(name)) { - DP(DEF_LEVEL, "expiring v4 for name %p", name); - result4 = clean_namehooks(adb, &name->v4, ISC_FALSE); - name->partial_result &= ~DNS_ADBFIND_INET; - } - name->expire_v4 = INT_MAX; - name->fetch_err = FIND_ERR_UNEXPECTED; - } - - /* - * Check to see if we need to remove the v6 addresses - */ - if (!NAME_FETCH_V6(name) && EXPIRE_OK(name->expire_v6, now)) { - if (NAME_HAS_V6(name)) { - DP(DEF_LEVEL, "expiring v6 for name %p", name); - result6 = clean_namehooks(adb, &name->v6, ISC_FALSE); - name->partial_result &= ~DNS_ADBFIND_INET6; - } - name->expire_v6 = INT_MAX; - name->fetch6_err = FIND_ERR_UNEXPECTED; - } - - /* - * Check to see if we need to remove the alias target. - */ - if (EXPIRE_OK(name->expire_target, now)) { - clean_target(adb, &name->target); - name->expire_target = INT_MAX; - } - return (ISC_TF(result4 || result6)); + dns_adb_t *adb; + isc_boolean_t result4 = ISC_FALSE; + isc_boolean_t result6 = ISC_FALSE; + + INSIST(DNS_ADBNAME_VALID(name)); + adb = name->adb; + INSIST(DNS_ADB_VALID(adb)); + + /* + * Check to see if we need to remove the v4 addresses + */ + if (!NAME_FETCH_V4(name) && EXPIRE_OK(name->expire_v4, now)) { + if (NAME_HAS_V4(name)) { + DP(DEF_LEVEL, "expiring v4 for name %p", name); + result4 = clean_namehooks(adb, &name->v4, ISC_FALSE); + name->partial_result &= ~DNS_ADBFIND_INET; + } + name->expire_v4 = INT_MAX; + name->fetch_err = FIND_ERR_UNEXPECTED; + } + + /* + * Check to see if we need to remove the v6 addresses + */ + if (!NAME_FETCH_V6(name) && EXPIRE_OK(name->expire_v6, now)) { + if (NAME_HAS_V6(name)) { + DP(DEF_LEVEL, "expiring v6 for name %p", name); + result6 = clean_namehooks(adb, &name->v6, ISC_FALSE); + name->partial_result &= ~DNS_ADBFIND_INET6; + } + name->expire_v6 = INT_MAX; + name->fetch6_err = FIND_ERR_UNEXPECTED; + } + + /* + * Check to see if we need to remove the alias target. + */ + if (EXPIRE_OK(name->expire_target, now)) { + clean_target(adb, &name->target); + name->expire_target = INT_MAX; + } + return (ISC_TF(result4 || result6)); } /* @@ -756,11 +724,11 @@ check_expire_namehooks(dns_adbname_t *name, isc_stdtime_t now) { */ static inline void link_name(dns_adb_t *adb, int bucket, dns_adbname_t *name) { - INSIST(name->lock_bucket == DNS_ADB_INVALIDBUCKET); + INSIST(name->lock_bucket == DNS_ADB_INVALIDBUCKET); - ISC_LIST_PREPEND(adb->names[bucket], name, plink); - name->lock_bucket = bucket; - adb->name_refcnt[bucket]++; + ISC_LIST_PREPEND(adb->names[bucket], name, plink); + name->lock_bucket = bucket; + adb->name_refcnt[bucket]++; } /* @@ -768,19 +736,19 @@ link_name(dns_adb_t *adb, int bucket, dns_adbname_t *name) { */ static inline isc_boolean_t unlink_name(dns_adb_t *adb, dns_adbname_t *name) { - int bucket; - isc_boolean_t result = ISC_FALSE; + int bucket; + isc_boolean_t result = ISC_FALSE; - bucket = name->lock_bucket; - INSIST(bucket != DNS_ADB_INVALIDBUCKET); + bucket = name->lock_bucket; + INSIST(bucket != DNS_ADB_INVALIDBUCKET); - ISC_LIST_UNLINK(adb->names[bucket], name, plink); - name->lock_bucket = DNS_ADB_INVALIDBUCKET; - INSIST(adb->name_refcnt[bucket] > 0); - adb->name_refcnt[bucket]--; - if (adb->name_sd[bucket] && adb->name_refcnt[bucket] == 0) - result = ISC_TRUE; - return (result); + ISC_LIST_UNLINK(adb->names[bucket], name, plink); + name->lock_bucket = DNS_ADB_INVALIDBUCKET; + INSIST(adb->name_refcnt[bucket] > 0); + adb->name_refcnt[bucket]--; + if (adb->name_sd[bucket] && adb->name_refcnt[bucket] == 0) + result = ISC_TRUE; + return (result); } /* @@ -788,9 +756,9 @@ unlink_name(dns_adb_t *adb, dns_adbname_t *name) { */ static inline void link_entry(dns_adb_t *adb, int bucket, dns_adbentry_t *entry) { - ISC_LIST_PREPEND(adb->entries[bucket], entry, plink); - entry->lock_bucket = bucket; - adb->entry_refcnt[bucket]++; + ISC_LIST_PREPEND(adb->entries[bucket], entry, plink); + entry->lock_bucket = bucket; + adb->entry_refcnt[bucket]++; } /* @@ -798,28 +766,28 @@ link_entry(dns_adb_t *adb, int bucket, dns_adbentry_t *entry) { */ static inline isc_boolean_t unlink_entry(dns_adb_t *adb, dns_adbentry_t *entry) { - int bucket; - isc_boolean_t result = ISC_FALSE; + int bucket; + isc_boolean_t result = ISC_FALSE; - bucket = entry->lock_bucket; - INSIST(bucket != DNS_ADB_INVALIDBUCKET); + bucket = entry->lock_bucket; + INSIST(bucket != DNS_ADB_INVALIDBUCKET); - ISC_LIST_UNLINK(adb->entries[bucket], entry, plink); - entry->lock_bucket = DNS_ADB_INVALIDBUCKET; - INSIST(adb->entry_refcnt[bucket] > 0); - adb->entry_refcnt[bucket]--; - if (adb->entry_sd[bucket] && adb->entry_refcnt[bucket] == 0) - result = ISC_TRUE; - return (result); + ISC_LIST_UNLINK(adb->entries[bucket], entry, plink); + entry->lock_bucket = DNS_ADB_INVALIDBUCKET; + INSIST(adb->entry_refcnt[bucket] > 0); + adb->entry_refcnt[bucket]--; + if (adb->entry_sd[bucket] && adb->entry_refcnt[bucket] == 0) + result = ISC_TRUE; + return (result); } static inline void violate_locking_hierarchy(isc_mutex_t *have, isc_mutex_t *want) { - if (isc_mutex_trylock(want) != ISC_R_SUCCESS) { - UNLOCK(have); - LOCK(want); - LOCK(have); - } + if (isc_mutex_trylock(want) != ISC_R_SUCCESS) { + UNLOCK(have); + LOCK(want); + LOCK(have); + } } /* @@ -828,44 +796,44 @@ violate_locking_hierarchy(isc_mutex_t *have, isc_mutex_t *want) { */ static isc_boolean_t shutdown_names(dns_adb_t *adb) { - int bucket; - isc_boolean_t result = ISC_FALSE; - dns_adbname_t *name; - dns_adbname_t *next_name; - - for (bucket = 0; bucket < NBUCKETS; bucket++) { - LOCK(&adb->namelocks[bucket]); - adb->name_sd[bucket] = ISC_TRUE; - - name = ISC_LIST_HEAD(adb->names[bucket]); - if (name == NULL) { - /* - * This bucket has no names. We must decrement the - * irefcnt ourselves, since it will not be - * automatically triggered by a name being unlinked. - */ - INSIST(result == ISC_FALSE); - result = dec_adb_irefcnt(adb); - } else { - /* - * Run through the list. For each name, clean up finds - * found there, and cancel any fetches running. When - * all the fetches are canceled, the name will destroy - * itself. - */ - while (name != NULL) { - next_name = ISC_LIST_NEXT(name, plink); - INSIST(result == ISC_FALSE); - result = kill_name(&name, - DNS_EVENT_ADBSHUTDOWN, - ISC_FALSE); - name = next_name; - } - } - - UNLOCK(&adb->namelocks[bucket]); - } - return (result); + int bucket; + isc_boolean_t result = ISC_FALSE; + dns_adbname_t *name; + dns_adbname_t *next_name; + + for (bucket = 0; bucket < NBUCKETS; bucket++) { + LOCK(&adb->namelocks[bucket]); + adb->name_sd[bucket] = ISC_TRUE; + + name = ISC_LIST_HEAD(adb->names[bucket]); + if (name == NULL) { + /* + * This bucket has no names. We must decrement the + * irefcnt ourselves, since it will not be + * automatically triggered by a name being unlinked. + */ + INSIST(result == ISC_FALSE); + result = dec_adb_irefcnt(adb); + } else { + /* + * Run through the list. For each name, clean up finds + * found there, and cancel any fetches running. When + * all the fetches are canceled, the name will destroy + * itself. + */ + while (name != NULL) { + next_name = ISC_LIST_NEXT(name, plink); + INSIST(result == ISC_FALSE); + result = kill_name(&name, + DNS_EVENT_ADBSHUTDOWN, + ISC_FALSE); + name = next_name; + } + } + + UNLOCK(&adb->namelocks[bucket]); + } + return (result); } /* @@ -874,44 +842,44 @@ shutdown_names(dns_adb_t *adb) { */ static isc_boolean_t shutdown_entries(dns_adb_t *adb) { - int bucket; - isc_boolean_t result = ISC_FALSE; - dns_adbentry_t *entry; - dns_adbentry_t *next_entry; - - for (bucket = 0; bucket < NBUCKETS; bucket++) { - LOCK(&adb->entrylocks[bucket]); - adb->entry_sd[bucket] = ISC_TRUE; - - entry = ISC_LIST_HEAD(adb->entries[bucket]); - if (entry == NULL) { - /* - * This bucket has no entries. We must decrement the - * irefcnt ourselves, since it will not be - * automatically triggered by an entry being unlinked. - */ - result = dec_adb_irefcnt(adb); - } else { - /* - * Run through the list. Cleanup any entries not - * associated with names, and which are not in use. - */ - while (entry != NULL) { - next_entry = ISC_LIST_NEXT(entry, plink); - if (entry->refcnt == 0 && - entry->expires != 0) { - result = unlink_entry(adb, entry); - free_adbentry(adb, &entry); - if (result) - result = dec_adb_irefcnt(adb); - } - entry = next_entry; - } - } - - UNLOCK(&adb->entrylocks[bucket]); - } - return (result); + int bucket; + isc_boolean_t result = ISC_FALSE; + dns_adbentry_t *entry; + dns_adbentry_t *next_entry; + + for (bucket = 0; bucket < NBUCKETS; bucket++) { + LOCK(&adb->entrylocks[bucket]); + adb->entry_sd[bucket] = ISC_TRUE; + + entry = ISC_LIST_HEAD(adb->entries[bucket]); + if (entry == NULL) { + /* + * This bucket has no entries. We must decrement the + * irefcnt ourselves, since it will not be + * automatically triggered by an entry being unlinked. + */ + result = dec_adb_irefcnt(adb); + } else { + /* + * Run through the list. Cleanup any entries not + * associated with names, and which are not in use. + */ + while (entry != NULL) { + next_entry = ISC_LIST_NEXT(entry, plink); + if (entry->refcnt == 0 && + entry->expires != 0) { + result = unlink_entry(adb, entry); + free_adbentry(adb, &entry); + if (result) + result = dec_adb_irefcnt(adb); + } + entry = next_entry; + } + } + + UNLOCK(&adb->entrylocks[bucket]); + } + return (result); } /* @@ -919,11 +887,11 @@ shutdown_entries(dns_adb_t *adb) { */ static void cancel_fetches_at_name(dns_adbname_t *name) { - if (NAME_FETCH_A(name)) - dns_resolver_cancelfetch(name->fetch_a->fetch); + if (NAME_FETCH_A(name)) + dns_resolver_cancelfetch(name->fetch_a->fetch); - if (NAME_FETCH_AAAA(name)) - dns_resolver_cancelfetch(name->fetch_aaaa->fetch); + if (NAME_FETCH_AAAA(name)) + dns_resolver_cancelfetch(name->fetch_aaaa->fetch); } /* @@ -931,131 +899,131 @@ cancel_fetches_at_name(dns_adbname_t *name) { */ static isc_boolean_t clean_namehooks(dns_adb_t *adb, dns_adbnamehooklist_t *namehooks, - isc_boolean_t is_purge) + isc_boolean_t is_purge) { - dns_adbentry_t *entry; - dns_adbnamehook_t *namehook; - int addr_bucket; - isc_boolean_t result = ISC_FALSE; - - addr_bucket = DNS_ADB_INVALIDBUCKET; - namehook = ISC_LIST_HEAD(*namehooks); - while (namehook != NULL) { - INSIST(DNS_ADBNAMEHOOK_VALID(namehook)); - - /* - * Clean up the entry if needed. - */ - entry = namehook->entry; - if (entry != NULL) { - INSIST(DNS_ADBENTRY_VALID(entry)); - - if (addr_bucket != entry->lock_bucket) { - if (addr_bucket != DNS_ADB_INVALIDBUCKET) - UNLOCK(&adb->entrylocks[addr_bucket]); - addr_bucket = entry->lock_bucket; - LOCK(&adb->entrylocks[addr_bucket]); - } - - /* - * If we are in an overmem situation, force expiration - * so that # of names and # of entries are well - * balanced. - */ - if (is_purge) - entry->expires = 0; - result = dec_entry_refcnt(adb, entry, ISC_FALSE); - } - - /* - * Free the namehook - */ - namehook->entry = NULL; - ISC_LIST_UNLINK(*namehooks, namehook, plink); - free_adbnamehook(adb, &namehook); - - namehook = ISC_LIST_HEAD(*namehooks); - } - - if (addr_bucket != DNS_ADB_INVALIDBUCKET) - UNLOCK(&adb->entrylocks[addr_bucket]); - return (result); + dns_adbentry_t *entry; + dns_adbnamehook_t *namehook; + int addr_bucket; + isc_boolean_t result = ISC_FALSE; + + addr_bucket = DNS_ADB_INVALIDBUCKET; + namehook = ISC_LIST_HEAD(*namehooks); + while (namehook != NULL) { + INSIST(DNS_ADBNAMEHOOK_VALID(namehook)); + + /* + * Clean up the entry if needed. + */ + entry = namehook->entry; + if (entry != NULL) { + INSIST(DNS_ADBENTRY_VALID(entry)); + + if (addr_bucket != entry->lock_bucket) { + if (addr_bucket != DNS_ADB_INVALIDBUCKET) + UNLOCK(&adb->entrylocks[addr_bucket]); + addr_bucket = entry->lock_bucket; + LOCK(&adb->entrylocks[addr_bucket]); + } + + /* + * If we are in an overmem situation, force expiration + * so that # of names and # of entries are well + * balanced. + */ + if (is_purge) + entry->expires = 0; + result = dec_entry_refcnt(adb, entry, ISC_FALSE); + } + + /* + * Free the namehook + */ + namehook->entry = NULL; + ISC_LIST_UNLINK(*namehooks, namehook, plink); + free_adbnamehook(adb, &namehook); + + namehook = ISC_LIST_HEAD(*namehooks); + } + + if (addr_bucket != DNS_ADB_INVALIDBUCKET) + UNLOCK(&adb->entrylocks[addr_bucket]); + return (result); } static void clean_target(dns_adb_t *adb, dns_name_t *target) { - if (dns_name_countlabels(target) > 0) { - dns_name_free(target, adb->mctx); - dns_name_init(target, NULL); - } + if (dns_name_countlabels(target) > 0) { + dns_name_free(target, adb->mctx); + dns_name_init(target, NULL); + } } static isc_result_t set_target(dns_adb_t *adb, dns_name_t *name, dns_name_t *fname, - dns_rdataset_t *rdataset, dns_name_t *target) + dns_rdataset_t *rdataset, dns_name_t *target) { - isc_result_t result; - dns_namereln_t namereln; - unsigned int nlabels; - int order; - dns_rdata_t rdata = DNS_RDATA_INIT; - dns_fixedname_t fixed1, fixed2; - dns_name_t *prefix, *new_target; - - REQUIRE(dns_name_countlabels(target) == 0); - - if (rdataset->type == dns_rdatatype_cname) { - dns_rdata_cname_t cname; - - /* - * Copy the CNAME's target into the target name. - */ - result = dns_rdataset_first(rdataset); - if (result != ISC_R_SUCCESS) - return (result); - dns_rdataset_current(rdataset, &rdata); - result = dns_rdata_tostruct(&rdata, &cname, NULL); - if (result != ISC_R_SUCCESS) - return (result); - result = dns_name_dup(&cname.cname, adb->mctx, target); - dns_rdata_freestruct(&cname); - if (result != ISC_R_SUCCESS) - return (result); - } else { - dns_rdata_dname_t dname; - - INSIST(rdataset->type == dns_rdatatype_dname); - namereln = dns_name_fullcompare(name, fname, &order, &nlabels); - INSIST(namereln == dns_namereln_subdomain); - /* - * Get the target name of the DNAME. - */ - result = dns_rdataset_first(rdataset); - if (result != ISC_R_SUCCESS) - return (result); - dns_rdataset_current(rdataset, &rdata); - result = dns_rdata_tostruct(&rdata, &dname, NULL); - if (result != ISC_R_SUCCESS) - return (result); - /* - * Construct the new target name. - */ - dns_fixedname_init(&fixed1); - prefix = dns_fixedname_name(&fixed1); - dns_fixedname_init(&fixed2); - new_target = dns_fixedname_name(&fixed2); - dns_name_split(name, nlabels, prefix, NULL); - result = dns_name_concatenate(prefix, &dname.dname, new_target, - NULL); - dns_rdata_freestruct(&dname); - if (result != ISC_R_SUCCESS) - return (result); - result = dns_name_dup(new_target, adb->mctx, target); - if (result != ISC_R_SUCCESS) - return (result); - } - - return (ISC_R_SUCCESS); + isc_result_t result; + dns_namereln_t namereln; + unsigned int nlabels; + int order; + dns_rdata_t rdata = DNS_RDATA_INIT; + dns_fixedname_t fixed1, fixed2; + dns_name_t *prefix, *new_target; + + REQUIRE(dns_name_countlabels(target) == 0); + + if (rdataset->type == dns_rdatatype_cname) { + dns_rdata_cname_t cname; + + /* + * Copy the CNAME's target into the target name. + */ + result = dns_rdataset_first(rdataset); + if (result != ISC_R_SUCCESS) + return (result); + dns_rdataset_current(rdataset, &rdata); + result = dns_rdata_tostruct(&rdata, &cname, NULL); + if (result != ISC_R_SUCCESS) + return (result); + result = dns_name_dup(&cname.cname, adb->mctx, target); + dns_rdata_freestruct(&cname); + if (result != ISC_R_SUCCESS) + return (result); + } else { + dns_rdata_dname_t dname; + + INSIST(rdataset->type == dns_rdatatype_dname); + namereln = dns_name_fullcompare(name, fname, &order, &nlabels); + INSIST(namereln == dns_namereln_subdomain); + /* + * Get the target name of the DNAME. + */ + result = dns_rdataset_first(rdataset); + if (result != ISC_R_SUCCESS) + return (result); + dns_rdataset_current(rdataset, &rdata); + result = dns_rdata_tostruct(&rdata, &dname, NULL); + if (result != ISC_R_SUCCESS) + return (result); + /* + * Construct the new target name. + */ + dns_fixedname_init(&fixed1); + prefix = dns_fixedname_name(&fixed1); + dns_fixedname_init(&fixed2); + new_target = dns_fixedname_name(&fixed2); + dns_name_split(name, nlabels, prefix, NULL); + result = dns_name_concatenate(prefix, &dname.dname, new_target, + NULL); + dns_rdata_freestruct(&dname); + if (result != ISC_R_SUCCESS) + return (result); + result = dns_name_dup(new_target, adb->mctx, target); + if (result != ISC_R_SUCCESS) + return (result); + } + + return (ISC_R_SUCCESS); } /* @@ -1063,16 +1031,16 @@ set_target(dns_adb_t *adb, dns_name_t *name, dns_name_t *fname, */ static void event_free(isc_event_t *event) { - dns_adbfind_t *find; + dns_adbfind_t *find; - INSIST(event != NULL); - find = event->ev_destroy_arg; - INSIST(DNS_ADBFIND_VALID(find)); + INSIST(event != NULL); + find = event->ev_destroy_arg; + INSIST(DNS_ADBFIND_VALID(find)); - LOCK(&find->lock); - find->flags |= FIND_EVENT_FREED; - event->ev_destroy_arg = NULL; - UNLOCK(&find->lock); + LOCK(&find->lock); + find->flags |= FIND_EVENT_FREED; + event->ev_destroy_arg = NULL; + UNLOCK(&find->lock); } /* @@ -1080,502 +1048,487 @@ event_free(isc_event_t *event) { */ static void clean_finds_at_name(dns_adbname_t *name, isc_eventtype_t evtype, - unsigned int addrs) + unsigned int addrs) { - isc_event_t *ev; - isc_task_t *task; - dns_adbfind_t *find; - dns_adbfind_t *next_find; - isc_boolean_t process; - unsigned int wanted, notify; - - DP(ENTER_LEVEL, - "ENTER clean_finds_at_name, name %p, evtype %08x, addrs %08x", - name, evtype, addrs); - - find = ISC_LIST_HEAD(name->finds); - while (find != NULL) { - LOCK(&find->lock); - next_find = ISC_LIST_NEXT(find, plink); - - process = ISC_FALSE; - wanted = find->flags & DNS_ADBFIND_ADDRESSMASK; - notify = wanted & addrs; - - switch (evtype) { - case DNS_EVENT_ADBMOREADDRESSES: - DP(ISC_LOG_DEBUG(3), "DNS_EVENT_ADBMOREADDRESSES"); - if ((notify) != 0) { - find->flags &= ~addrs; - process = ISC_TRUE; - } - break; - case DNS_EVENT_ADBNOMOREADDRESSES: - DP(ISC_LOG_DEBUG(3), "DNS_EVENT_ADBNOMOREADDRESSES"); - find->flags &= ~addrs; - wanted = find->flags & DNS_ADBFIND_ADDRESSMASK; - if (wanted == 0) - process = ISC_TRUE; - break; - default: - find->flags &= ~addrs; - process = ISC_TRUE; - } - - if (process) { - DP(DEF_LEVEL, "cfan: processing find %p", find); - /* - * Unlink the find from the name, letting the caller - * call dns_adb_destroyfind() on it to clean it up - * later. - */ - ISC_LIST_UNLINK(name->finds, find, plink); - find->adbname = NULL; - find->name_bucket = DNS_ADB_INVALIDBUCKET; - - INSIST(!FIND_EVENTSENT(find)); - - ev = &find->event; - task = ev->ev_sender; - ev->ev_sender = find; - find->result_v4 = find_err_map[name->fetch_err]; - find->result_v6 = find_err_map[name->fetch6_err]; - ev->ev_type = evtype; - ev->ev_destroy = event_free; - ev->ev_destroy_arg = find; - - DP(DEF_LEVEL, - "sending event %p to task %p for find %p", - ev, task, find); - - isc_task_sendanddetach(&task, (isc_event_t **)&ev); - } else { - DP(DEF_LEVEL, "cfan: skipping find %p", find); - } - - UNLOCK(&find->lock); - find = next_find; - } - - DP(ENTER_LEVEL, "EXIT clean_finds_at_name, name %p", name); + isc_event_t *ev; + isc_task_t *task; + dns_adbfind_t *find; + dns_adbfind_t *next_find; + isc_boolean_t process; + unsigned int wanted, notify; + + DP(ENTER_LEVEL, + "ENTER clean_finds_at_name, name %p, evtype %08x, addrs %08x", + name, evtype, addrs); + + find = ISC_LIST_HEAD(name->finds); + while (find != NULL) { + LOCK(&find->lock); + next_find = ISC_LIST_NEXT(find, plink); + + process = ISC_FALSE; + wanted = find->flags & DNS_ADBFIND_ADDRESSMASK; + notify = wanted & addrs; + + switch (evtype) { + case DNS_EVENT_ADBMOREADDRESSES: + DP(ISC_LOG_DEBUG(3), "DNS_EVENT_ADBMOREADDRESSES"); + if ((notify) != 0) { + find->flags &= ~addrs; + process = ISC_TRUE; + } + break; + case DNS_EVENT_ADBNOMOREADDRESSES: + DP(ISC_LOG_DEBUG(3), "DNS_EVENT_ADBNOMOREADDRESSES"); + find->flags &= ~addrs; + wanted = find->flags & DNS_ADBFIND_ADDRESSMASK; + if (wanted == 0) + process = ISC_TRUE; + break; + default: + find->flags &= ~addrs; + process = ISC_TRUE; + } + + if (process) { + DP(DEF_LEVEL, "cfan: processing find %p", find); + /* + * Unlink the find from the name, letting the caller + * call dns_adb_destroyfind() on it to clean it up + * later. + */ + ISC_LIST_UNLINK(name->finds, find, plink); + find->adbname = NULL; + find->name_bucket = DNS_ADB_INVALIDBUCKET; + + INSIST(!FIND_EVENTSENT(find)); + + ev = &find->event; + task = ev->ev_sender; + ev->ev_sender = find; + find->result_v4 = find_err_map[name->fetch_err]; + find->result_v6 = find_err_map[name->fetch6_err]; + ev->ev_type = evtype; + ev->ev_destroy = event_free; + ev->ev_destroy_arg = find; + + DP(DEF_LEVEL, + "sending event %p to task %p for find %p", + ev, task, find); + + isc_task_sendanddetach(&task, (isc_event_t **)&ev); + } else { + DP(DEF_LEVEL, "cfan: skipping find %p", find); + } + + UNLOCK(&find->lock); + find = next_find; + } + + DP(ENTER_LEVEL, "EXIT clean_finds_at_name, name %p", name); } static inline void check_exit(dns_adb_t *adb) { - isc_event_t *event; - /* - * The caller must be holding the adb lock. - */ - if (adb->shutting_down) { - /* - * If there aren't any external references either, we're - * done. Send the control event to initiate shutdown. - */ - INSIST(!adb->cevent_sent); /* Sanity check. */ - event = &adb->cevent; - isc_task_send(adb->task, &event); - adb->cevent_sent = ISC_TRUE; - } + isc_event_t *event; + /* + * The caller must be holding the adb lock. + */ + if (adb->shutting_down) { + /* + * If there aren't any external references either, we're + * done. Send the control event to initiate shutdown. + */ + INSIST(!adb->cevent_sent); /* Sanity check. */ + event = &adb->cevent; + isc_task_send(adb->task, &event); + adb->cevent_sent = ISC_TRUE; + } } static inline isc_boolean_t dec_adb_irefcnt(dns_adb_t *adb) { - isc_event_t *event; - isc_task_t *etask; - isc_boolean_t result = ISC_FALSE; + isc_event_t *event; + isc_task_t *etask; + isc_boolean_t result = ISC_FALSE; - LOCK(&adb->reflock); + LOCK(&adb->reflock); - INSIST(adb->irefcnt > 0); - adb->irefcnt--; + INSIST(adb->irefcnt > 0); + adb->irefcnt--; - if (adb->irefcnt == 0) { - event = ISC_LIST_HEAD(adb->whenshutdown); - while (event != NULL) { - ISC_LIST_UNLINK(adb->whenshutdown, event, ev_link); - etask = event->ev_sender; - event->ev_sender = adb; - isc_task_sendanddetach(&etask, &event); - event = ISC_LIST_HEAD(adb->whenshutdown); - } - } + if (adb->irefcnt == 0) { + event = ISC_LIST_HEAD(adb->whenshutdown); + while (event != NULL) { + ISC_LIST_UNLINK(adb->whenshutdown, event, ev_link); + etask = event->ev_sender; + event->ev_sender = adb; + isc_task_sendanddetach(&etask, &event); + event = ISC_LIST_HEAD(adb->whenshutdown); + } + } - if (adb->irefcnt == 0 && adb->erefcnt == 0) - result = ISC_TRUE; - UNLOCK(&adb->reflock); - return (result); + if (adb->irefcnt == 0 && adb->erefcnt == 0) + result = ISC_TRUE; + UNLOCK(&adb->reflock); + return (result); } static inline void inc_adb_irefcnt(dns_adb_t *adb) { - LOCK(&adb->reflock); - adb->irefcnt++; - UNLOCK(&adb->reflock); + LOCK(&adb->reflock); + adb->irefcnt++; + UNLOCK(&adb->reflock); } static inline void inc_adb_erefcnt(dns_adb_t *adb) { - LOCK(&adb->reflock); - adb->erefcnt++; - UNLOCK(&adb->reflock); + LOCK(&adb->reflock); + adb->erefcnt++; + UNLOCK(&adb->reflock); } static inline void inc_entry_refcnt(dns_adb_t *adb, dns_adbentry_t *entry, isc_boolean_t lock) { - int bucket; + int bucket; - bucket = entry->lock_bucket; + bucket = entry->lock_bucket; - if (lock) - LOCK(&adb->entrylocks[bucket]); + if (lock) + LOCK(&adb->entrylocks[bucket]); - entry->refcnt++; + entry->refcnt++; - if (lock) - UNLOCK(&adb->entrylocks[bucket]); + if (lock) + UNLOCK(&adb->entrylocks[bucket]); } static inline isc_boolean_t dec_entry_refcnt(dns_adb_t *adb, dns_adbentry_t *entry, isc_boolean_t lock) { - int bucket; - isc_boolean_t destroy_entry; - isc_boolean_t result = ISC_FALSE; + int bucket; + isc_boolean_t destroy_entry; + isc_boolean_t result = ISC_FALSE; - bucket = entry->lock_bucket; + bucket = entry->lock_bucket; - if (lock) - LOCK(&adb->entrylocks[bucket]); + if (lock) + LOCK(&adb->entrylocks[bucket]); - INSIST(entry->refcnt > 0); - entry->refcnt--; + INSIST(entry->refcnt > 0); + entry->refcnt--; - destroy_entry = ISC_FALSE; - if (entry->refcnt == 0 && - (adb->entry_sd[bucket] || entry->expires == 0)) { - destroy_entry = ISC_TRUE; - result = unlink_entry(adb, entry); - } + destroy_entry = ISC_FALSE; + if (entry->refcnt == 0 && + (adb->entry_sd[bucket] || entry->expires == 0)) { + destroy_entry = ISC_TRUE; + result = unlink_entry(adb, entry); + } - if (lock) - UNLOCK(&adb->entrylocks[bucket]); + if (lock) + UNLOCK(&adb->entrylocks[bucket]); - if (!destroy_entry) - return (result); + if (!destroy_entry) + return (result); - entry->lock_bucket = DNS_ADB_INVALIDBUCKET; + entry->lock_bucket = DNS_ADB_INVALIDBUCKET; - free_adbentry(adb, &entry); - if (result) - result =dec_adb_irefcnt(adb); + free_adbentry(adb, &entry); + if (result) + result = dec_adb_irefcnt(adb); - return (result); + return (result); } static inline dns_adbname_t * new_adbname(dns_adb_t *adb, dns_name_t *dnsname) { - dns_adbname_t *name; - - name = isc_mempool_get(adb->nmp); - if (name == NULL) - return (NULL); - - dns_name_init(&name->name, NULL); - if (dns_name_dup(dnsname, adb->mctx, &name->name) != ISC_R_SUCCESS) { - isc_mempool_put(adb->nmp, name); - return (NULL); - } - dns_name_init(&name->target, NULL); - name->magic = DNS_ADBNAME_MAGIC; - name->adb = adb; - name->partial_result = 0; - name->flags = 0; - name->expire_v4 = INT_MAX; - name->expire_v6 = INT_MAX; - name->expire_target = INT_MAX; - name->chains = 0; - name->lock_bucket = DNS_ADB_INVALIDBUCKET; - ISC_LIST_INIT(name->v4); - ISC_LIST_INIT(name->v6); - name->fetch_a = NULL; - name->fetch_aaaa = NULL; - name->fetch_err = FIND_ERR_UNEXPECTED; - name->fetch6_err = FIND_ERR_UNEXPECTED; - ISC_LIST_INIT(name->finds); - ISC_LINK_INIT(name, plink); - - return (name); + dns_adbname_t *name; + + name = isc_mempool_get(adb->nmp); + if (name == NULL) + return (NULL); + + dns_name_init(&name->name, NULL); + if (dns_name_dup(dnsname, adb->mctx, &name->name) != ISC_R_SUCCESS) { + isc_mempool_put(adb->nmp, name); + return (NULL); + } + dns_name_init(&name->target, NULL); + name->magic = DNS_ADBNAME_MAGIC; + name->adb = adb; + name->partial_result = 0; + name->flags = 0; + name->expire_v4 = INT_MAX; + name->expire_v6 = INT_MAX; + name->expire_target = INT_MAX; + name->chains = 0; + name->lock_bucket = DNS_ADB_INVALIDBUCKET; + ISC_LIST_INIT(name->v4); + ISC_LIST_INIT(name->v6); + name->fetch_a = NULL; + name->fetch_aaaa = NULL; + name->fetch_err = FIND_ERR_UNEXPECTED; + name->fetch6_err = FIND_ERR_UNEXPECTED; + ISC_LIST_INIT(name->finds); + ISC_LINK_INIT(name, plink); + + return (name); } static inline void free_adbname(dns_adb_t *adb, dns_adbname_t **name) { - dns_adbname_t *n; - - INSIST(name != NULL && DNS_ADBNAME_VALID(*name)); - n = *name; - *name = NULL; - - INSIST(!NAME_HAS_V4(n)); - INSIST(!NAME_HAS_V6(n)); - INSIST(!NAME_FETCH(n)); - INSIST(ISC_LIST_EMPTY(n->finds)); - INSIST(!ISC_LINK_LINKED(n, plink)); - INSIST(n->lock_bucket == DNS_ADB_INVALIDBUCKET); - INSIST(n->adb == adb); - -#ifdef LRU_DEBUG - adb->nname--; /* XXX: omit ADB lock for brevity */ - INSIST((int)adb->nname >= 0); -#endif + dns_adbname_t *n; + + INSIST(name != NULL && DNS_ADBNAME_VALID(*name)); + n = *name; + *name = NULL; + + INSIST(!NAME_HAS_V4(n)); + INSIST(!NAME_HAS_V6(n)); + INSIST(!NAME_FETCH(n)); + INSIST(ISC_LIST_EMPTY(n->finds)); + INSIST(!ISC_LINK_LINKED(n, plink)); + INSIST(n->lock_bucket == DNS_ADB_INVALIDBUCKET); + INSIST(n->adb == adb); - n->magic = 0; - dns_name_free(&n->name, adb->mctx); + n->magic = 0; + dns_name_free(&n->name, adb->mctx); - isc_mempool_put(adb->nmp, n); + isc_mempool_put(adb->nmp, n); } static inline dns_adbnamehook_t * new_adbnamehook(dns_adb_t *adb, dns_adbentry_t *entry) { - dns_adbnamehook_t *nh; + dns_adbnamehook_t *nh; - nh = isc_mempool_get(adb->nhmp); - if (nh == NULL) - return (NULL); + nh = isc_mempool_get(adb->nhmp); + if (nh == NULL) + return (NULL); - nh->magic = DNS_ADBNAMEHOOK_MAGIC; - nh->entry = entry; - ISC_LINK_INIT(nh, plink); + nh->magic = DNS_ADBNAMEHOOK_MAGIC; + nh->entry = entry; + ISC_LINK_INIT(nh, plink); - return (nh); + return (nh); } static inline void free_adbnamehook(dns_adb_t *adb, dns_adbnamehook_t **namehook) { - dns_adbnamehook_t *nh; + dns_adbnamehook_t *nh; - INSIST(namehook != NULL && DNS_ADBNAMEHOOK_VALID(*namehook)); - nh = *namehook; - *namehook = NULL; + INSIST(namehook != NULL && DNS_ADBNAMEHOOK_VALID(*namehook)); + nh = *namehook; + *namehook = NULL; - INSIST(nh->entry == NULL); - INSIST(!ISC_LINK_LINKED(nh, plink)); + INSIST(nh->entry == NULL); + INSIST(!ISC_LINK_LINKED(nh, plink)); - nh->magic = 0; - isc_mempool_put(adb->nhmp, nh); + nh->magic = 0; + isc_mempool_put(adb->nhmp, nh); } static inline dns_adblameinfo_t * new_adblameinfo(dns_adb_t *adb, dns_name_t *qname, dns_rdatatype_t qtype) { - dns_adblameinfo_t *li; + dns_adblameinfo_t *li; - li = isc_mempool_get(adb->limp); - if (li == NULL) - return (NULL); + li = isc_mempool_get(adb->limp); + if (li == NULL) + return (NULL); - dns_name_init(&li->qname, NULL); - if (dns_name_dup(qname, adb->mctx, &li->qname) != ISC_R_SUCCESS) { - isc_mempool_put(adb->limp, li); - return (NULL); - } - li->magic = DNS_ADBLAMEINFO_MAGIC; - li->lame_timer = 0; - li->qtype = qtype; - ISC_LINK_INIT(li, plink); + dns_name_init(&li->qname, NULL); + if (dns_name_dup(qname, adb->mctx, &li->qname) != ISC_R_SUCCESS) { + isc_mempool_put(adb->limp, li); + return (NULL); + } + li->magic = DNS_ADBLAMEINFO_MAGIC; + li->lame_timer = 0; + li->qtype = qtype; + ISC_LINK_INIT(li, plink); - return (li); + return (li); } static inline void free_adblameinfo(dns_adb_t *adb, dns_adblameinfo_t **lameinfo) { - dns_adblameinfo_t *li; + dns_adblameinfo_t *li; - INSIST(lameinfo != NULL && DNS_ADBLAMEINFO_VALID(*lameinfo)); - li = *lameinfo; - *lameinfo = NULL; + INSIST(lameinfo != NULL && DNS_ADBLAMEINFO_VALID(*lameinfo)); + li = *lameinfo; + *lameinfo = NULL; - INSIST(!ISC_LINK_LINKED(li, plink)); + INSIST(!ISC_LINK_LINKED(li, plink)); - dns_name_free(&li->qname, adb->mctx); + dns_name_free(&li->qname, adb->mctx); - li->magic = 0; + li->magic = 0; - isc_mempool_put(adb->limp, li); + isc_mempool_put(adb->limp, li); } static inline dns_adbentry_t * new_adbentry(dns_adb_t *adb) { - dns_adbentry_t *e; - isc_uint32_t r; - - e = isc_mempool_get(adb->emp); - if (e == NULL) - return (NULL); - - e->magic = DNS_ADBENTRY_MAGIC; - e->lock_bucket = DNS_ADB_INVALIDBUCKET; - e->refcnt = 0; - e->flags = 0; - isc_random_get(&r); - e->srtt = (r & 0x1f) + 1; - e->expires = 0; - ISC_LIST_INIT(e->lameinfo); - ISC_LINK_INIT(e, plink); - -#ifdef LRU_DEBUG - adb->nentry++; /* XXX: omit ADB lock for brevity */ - adb->nentry_total++; -#endif + dns_adbentry_t *e; + isc_uint32_t r; + + e = isc_mempool_get(adb->emp); + if (e == NULL) + return (NULL); - return (e); + e->magic = DNS_ADBENTRY_MAGIC; + e->lock_bucket = DNS_ADB_INVALIDBUCKET; + e->refcnt = 0; + e->flags = 0; + isc_random_get(&r); + e->srtt = (r & 0x1f) + 1; + e->expires = 0; + ISC_LIST_INIT(e->lameinfo); + ISC_LINK_INIT(e, plink); + + return (e); } static inline void free_adbentry(dns_adb_t *adb, dns_adbentry_t **entry) { - dns_adbentry_t *e; - dns_adblameinfo_t *li; - - INSIST(entry != NULL && DNS_ADBENTRY_VALID(*entry)); - e = *entry; - *entry = NULL; + dns_adbentry_t *e; + dns_adblameinfo_t *li; - INSIST(e->lock_bucket == DNS_ADB_INVALIDBUCKET); - INSIST(e->refcnt == 0); - INSIST(!ISC_LINK_LINKED(e, plink)); + INSIST(entry != NULL && DNS_ADBENTRY_VALID(*entry)); + e = *entry; + *entry = NULL; - e->magic = 0; + INSIST(e->lock_bucket == DNS_ADB_INVALIDBUCKET); + INSIST(e->refcnt == 0); + INSIST(!ISC_LINK_LINKED(e, plink)); - li = ISC_LIST_HEAD(e->lameinfo); - while (li != NULL) { - ISC_LIST_UNLINK(e->lameinfo, li, plink); - free_adblameinfo(adb, &li); - li = ISC_LIST_HEAD(e->lameinfo); - } + e->magic = 0; -#ifdef LRU_DEBUG - adb->nentry--; /* XXX: omit ADB lock for brevity */ - INSIST((int)adb->nentry >= 0); -#endif + li = ISC_LIST_HEAD(e->lameinfo); + while (li != NULL) { + ISC_LIST_UNLINK(e->lameinfo, li, plink); + free_adblameinfo(adb, &li); + li = ISC_LIST_HEAD(e->lameinfo); + } - isc_mempool_put(adb->emp, e); + isc_mempool_put(adb->emp, e); } static inline dns_adbfind_t * new_adbfind(dns_adb_t *adb) { - dns_adbfind_t *h; - isc_result_t result; - - h = isc_mempool_get(adb->ahmp); - if (h == NULL) - return (NULL); - - /* - * Public members. - */ - h->magic = 0; - h->adb = adb; - h->partial_result = 0; - h->options = 0; - h->flags = 0; - h->result_v4 = ISC_R_UNEXPECTED; - h->result_v6 = ISC_R_UNEXPECTED; - ISC_LINK_INIT(h, publink); - ISC_LINK_INIT(h, plink); - ISC_LIST_INIT(h->list); - h->adbname = NULL; - h->name_bucket = DNS_ADB_INVALIDBUCKET; - - /* - * private members - */ - result = isc_mutex_init(&h->lock); - if (result != ISC_R_SUCCESS) { - isc_mempool_put(adb->ahmp, h); - return (NULL); - } - - ISC_EVENT_INIT(&h->event, sizeof(isc_event_t), 0, 0, 0, NULL, NULL, - NULL, NULL, h); - - inc_adb_irefcnt(adb); - h->magic = DNS_ADBFIND_MAGIC; - return (h); + dns_adbfind_t *h; + isc_result_t result; + + h = isc_mempool_get(adb->ahmp); + if (h == NULL) + return (NULL); + + /* + * Public members. + */ + h->magic = 0; + h->adb = adb; + h->partial_result = 0; + h->options = 0; + h->flags = 0; + h->result_v4 = ISC_R_UNEXPECTED; + h->result_v6 = ISC_R_UNEXPECTED; + ISC_LINK_INIT(h, publink); + ISC_LINK_INIT(h, plink); + ISC_LIST_INIT(h->list); + h->adbname = NULL; + h->name_bucket = DNS_ADB_INVALIDBUCKET; + + /* + * private members + */ + result = isc_mutex_init(&h->lock); + if (result != ISC_R_SUCCESS) { + isc_mempool_put(adb->ahmp, h); + return (NULL); + } + + ISC_EVENT_INIT(&h->event, sizeof(isc_event_t), 0, 0, 0, NULL, NULL, + NULL, NULL, h); + + inc_adb_irefcnt(adb); + h->magic = DNS_ADBFIND_MAGIC; + return (h); } static inline dns_adbfetch_t * new_adbfetch(dns_adb_t *adb) { - dns_adbfetch_t *f; + dns_adbfetch_t *f; - f = isc_mempool_get(adb->afmp); - if (f == NULL) - return (NULL); + f = isc_mempool_get(adb->afmp); + if (f == NULL) + return (NULL); - f->magic = 0; - f->namehook = NULL; - f->entry = NULL; - f->fetch = NULL; + f->magic = 0; + f->namehook = NULL; + f->entry = NULL; + f->fetch = NULL; - f->namehook = new_adbnamehook(adb, NULL); - if (f->namehook == NULL) - goto err; + f->namehook = new_adbnamehook(adb, NULL); + if (f->namehook == NULL) + goto err; - f->entry = new_adbentry(adb); - if (f->entry == NULL) - goto err; + f->entry = new_adbentry(adb); + if (f->entry == NULL) + goto err; - dns_rdataset_init(&f->rdataset); + dns_rdataset_init(&f->rdataset); - f->magic = DNS_ADBFETCH_MAGIC; + f->magic = DNS_ADBFETCH_MAGIC; - return (f); + return (f); err: - if (f->namehook != NULL) - free_adbnamehook(adb, &f->namehook); - if (f->entry != NULL) - free_adbentry(adb, &f->entry); - isc_mempool_put(adb->afmp, f); - return (NULL); + if (f->namehook != NULL) + free_adbnamehook(adb, &f->namehook); + if (f->entry != NULL) + free_adbentry(adb, &f->entry); + isc_mempool_put(adb->afmp, f); + return (NULL); } static inline void free_adbfetch(dns_adb_t *adb, dns_adbfetch_t **fetch) { - dns_adbfetch_t *f; + dns_adbfetch_t *f; - INSIST(fetch != NULL && DNS_ADBFETCH_VALID(*fetch)); - f = *fetch; - *fetch = NULL; + INSIST(fetch != NULL && DNS_ADBFETCH_VALID(*fetch)); + f = *fetch; + *fetch = NULL; - f->magic = 0; + f->magic = 0; - if (f->namehook != NULL) - free_adbnamehook(adb, &f->namehook); - if (f->entry != NULL) - free_adbentry(adb, &f->entry); + if (f->namehook != NULL) + free_adbnamehook(adb, &f->namehook); + if (f->entry != NULL) + free_adbentry(adb, &f->entry); - if (dns_rdataset_isassociated(&f->rdataset)) - dns_rdataset_disassociate(&f->rdataset); + if (dns_rdataset_isassociated(&f->rdataset)) + dns_rdataset_disassociate(&f->rdataset); - isc_mempool_put(adb->afmp, f); + isc_mempool_put(adb->afmp, f); } static inline isc_boolean_t free_adbfind(dns_adb_t *adb, dns_adbfind_t **findp) { - dns_adbfind_t *find; + dns_adbfind_t *find; - INSIST(findp != NULL && DNS_ADBFIND_VALID(*findp)); - find = *findp; - *findp = NULL; + INSIST(findp != NULL && DNS_ADBFIND_VALID(*findp)); + find = *findp; + *findp = NULL; - INSIST(!FIND_HAS_ADDRS(find)); - INSIST(!ISC_LINK_LINKED(find, publink)); - INSIST(!ISC_LINK_LINKED(find, plink)); - INSIST(find->name_bucket == DNS_ADB_INVALIDBUCKET); - INSIST(find->adbname == NULL); + INSIST(!FIND_HAS_ADDRS(find)); + INSIST(!ISC_LINK_LINKED(find, publink)); + INSIST(!ISC_LINK_LINKED(find, plink)); + INSIST(find->name_bucket == DNS_ADB_INVALIDBUCKET); + INSIST(find->adbname == NULL); - find->magic = 0; + find->magic = 0; - DESTROYLOCK(&find->lock); - isc_mempool_put(adb->ahmp, find); - return (dec_adb_irefcnt(adb)); + DESTROYLOCK(&find->lock); + isc_mempool_put(adb->ahmp, find); + return (dec_adb_irefcnt(adb)); } /* @@ -1585,41 +1538,37 @@ free_adbfind(dns_adb_t *adb, dns_adbfind_t **findp) { */ static inline dns_adbaddrinfo_t * new_adbaddrinfo(dns_adb_t *adb, dns_adbentry_t *entry, in_port_t port) { - dns_adbaddrinfo_t *ai; - - ai = isc_mempool_get(adb->aimp); - if (ai == NULL) - return (NULL); - - ai->magic = DNS_ADBADDRINFO_MAGIC; - ai->sockaddr = entry->sockaddr; - isc_sockaddr_setport(&ai->sockaddr, port); - ai->srtt = entry->srtt; - ai->flags = entry->flags; - ai->entry = entry; - ISC_LINK_INIT(ai, publink); - -#ifdef LRU_DEBUG - adb->entryuses++; /* for debug */ -#endif + dns_adbaddrinfo_t *ai; + + ai = isc_mempool_get(adb->aimp); + if (ai == NULL) + return (NULL); + + ai->magic = DNS_ADBADDRINFO_MAGIC; + ai->sockaddr = entry->sockaddr; + isc_sockaddr_setport(&ai->sockaddr, port); + ai->srtt = entry->srtt; + ai->flags = entry->flags; + ai->entry = entry; + ISC_LINK_INIT(ai, publink); - return (ai); + return (ai); } static inline void free_adbaddrinfo(dns_adb_t *adb, dns_adbaddrinfo_t **ainfo) { - dns_adbaddrinfo_t *ai; + dns_adbaddrinfo_t *ai; - INSIST(ainfo != NULL && DNS_ADBADDRINFO_VALID(*ainfo)); - ai = *ainfo; - *ainfo = NULL; + INSIST(ainfo != NULL && DNS_ADBADDRINFO_VALID(*ainfo)); + ai = *ainfo; + *ainfo = NULL; - INSIST(ai->entry == NULL); - INSIST(!ISC_LINK_LINKED(ai, publink)); + INSIST(ai->entry == NULL); + INSIST(!ISC_LINK_LINKED(ai, publink)); - ai->magic = 0; + ai->magic = 0; - isc_mempool_put(adb->aimp, ai); + isc_mempool_put(adb->aimp, ai); } /* @@ -1631,34 +1580,34 @@ free_adbaddrinfo(dns_adb_t *adb, dns_adbaddrinfo_t **ainfo) { */ static inline dns_adbname_t * find_name_and_lock(dns_adb_t *adb, dns_name_t *name, - unsigned int options, int *bucketp) + unsigned int options, int *bucketp) { - dns_adbname_t *adbname; - int bucket; - - bucket = dns_name_fullhash(name, ISC_FALSE) % NBUCKETS; - - if (*bucketp == DNS_ADB_INVALIDBUCKET) { - LOCK(&adb->namelocks[bucket]); - *bucketp = bucket; - } else if (*bucketp != bucket) { - UNLOCK(&adb->namelocks[*bucketp]); - LOCK(&adb->namelocks[bucket]); - *bucketp = bucket; - } - - adbname = ISC_LIST_HEAD(adb->names[bucket]); - while (adbname != NULL) { - if (!NAME_DEAD(adbname)) { - if (dns_name_equal(name, &adbname->name) - && GLUEHINT_OK(adbname, options) - && STARTATZONE_MATCHES(adbname, options)) - return (adbname); - } - adbname = ISC_LIST_NEXT(adbname, plink); - } - - return (NULL); + dns_adbname_t *adbname; + int bucket; + + bucket = dns_name_fullhash(name, ISC_FALSE) % NBUCKETS; + + if (*bucketp == DNS_ADB_INVALIDBUCKET) { + LOCK(&adb->namelocks[bucket]); + *bucketp = bucket; + } else if (*bucketp != bucket) { + UNLOCK(&adb->namelocks[*bucketp]); + LOCK(&adb->namelocks[bucket]); + *bucketp = bucket; + } + + adbname = ISC_LIST_HEAD(adb->names[bucket]); + while (adbname != NULL) { + if (!NAME_DEAD(adbname)) { + if (dns_name_equal(name, &adbname->name) + && GLUEHINT_OK(adbname, options) + && STARTATZONE_MATCHES(adbname, options)) + return (adbname); + } + adbname = ISC_LIST_NEXT(adbname, plink); + } + + return (NULL); } /* @@ -1673,28 +1622,28 @@ find_name_and_lock(dns_adb_t *adb, dns_name_t *name, */ static inline dns_adbentry_t * find_entry_and_lock(dns_adb_t *adb, isc_sockaddr_t *addr, int *bucketp) { - dns_adbentry_t *entry; - int bucket; + dns_adbentry_t *entry; + int bucket; - bucket = isc_sockaddr_hash(addr, ISC_TRUE) % NBUCKETS; + bucket = isc_sockaddr_hash(addr, ISC_TRUE) % NBUCKETS; - if (*bucketp == DNS_ADB_INVALIDBUCKET) { - LOCK(&adb->entrylocks[bucket]); - *bucketp = bucket; - } else if (*bucketp != bucket) { - UNLOCK(&adb->entrylocks[*bucketp]); - LOCK(&adb->entrylocks[bucket]); - *bucketp = bucket; - } + if (*bucketp == DNS_ADB_INVALIDBUCKET) { + LOCK(&adb->entrylocks[bucket]); + *bucketp = bucket; + } else if (*bucketp != bucket) { + UNLOCK(&adb->entrylocks[*bucketp]); + LOCK(&adb->entrylocks[bucket]); + *bucketp = bucket; + } - entry = ISC_LIST_HEAD(adb->entries[bucket]); - while (entry != NULL) { - if (isc_sockaddr_equal(addr, &entry->sockaddr)) - return (entry); - entry = ISC_LIST_NEXT(entry, plink); - } + entry = ISC_LIST_HEAD(adb->entries[bucket]); + while (entry != NULL) { + if (isc_sockaddr_equal(addr, &entry->sockaddr)) + return (entry); + entry = ISC_LIST_NEXT(entry, plink); + } - return (NULL); + return (NULL); } /* @@ -1702,140 +1651,133 @@ find_entry_and_lock(dns_adb_t *adb, isc_sockaddr_t *addr, int *bucketp) { */ static isc_boolean_t entry_is_lame(dns_adb_t *adb, dns_adbentry_t *entry, dns_name_t *qname, - dns_rdatatype_t qtype, isc_stdtime_t now) + dns_rdatatype_t qtype, isc_stdtime_t now) { - dns_adblameinfo_t *li, *next_li; - isc_boolean_t is_bad; + dns_adblameinfo_t *li, *next_li; + isc_boolean_t is_bad; - is_bad = ISC_FALSE; + is_bad = ISC_FALSE; - li = ISC_LIST_HEAD(entry->lameinfo); - if (li == NULL) - return (ISC_FALSE); - while (li != NULL) { - next_li = ISC_LIST_NEXT(li, plink); + li = ISC_LIST_HEAD(entry->lameinfo); + if (li == NULL) + return (ISC_FALSE); + while (li != NULL) { + next_li = ISC_LIST_NEXT(li, plink); - /* - * Has the entry expired? - */ - if (li->lame_timer < now) { - ISC_LIST_UNLINK(entry->lameinfo, li, plink); - free_adblameinfo(adb, &li); - } + /* + * Has the entry expired? + */ + if (li->lame_timer < now) { + ISC_LIST_UNLINK(entry->lameinfo, li, plink); + free_adblameinfo(adb, &li); + } - /* - * Order tests from least to most expensive. - * - * We do not break out of the main loop here as - * we use the loop for house keeping. - */ - if (li != NULL && !is_bad && li->qtype == qtype && - dns_name_equal(qname, &li->qname)) - is_bad = ISC_TRUE; + /* + * Order tests from least to most expensive. + * + * We do not break out of the main loop here as + * we use the loop for house keeping. + */ + if (li != NULL && !is_bad && li->qtype == qtype && + dns_name_equal(qname, &li->qname)) + is_bad = ISC_TRUE; - li = next_li; - } + li = next_li; + } - return (is_bad); + return (is_bad); } static void copy_namehook_lists(dns_adb_t *adb, dns_adbfind_t *find, dns_name_t *qname, - dns_rdatatype_t qtype, dns_adbname_t *name, - isc_stdtime_t now) + dns_rdatatype_t qtype, dns_adbname_t *name, + isc_stdtime_t now) { - dns_adbnamehook_t *namehook; - dns_adbaddrinfo_t *addrinfo; - dns_adbentry_t *entry; - int bucket; - - bucket = DNS_ADB_INVALIDBUCKET; - - if (find->options & DNS_ADBFIND_INET) { - namehook = ISC_LIST_HEAD(name->v4); - while (namehook != NULL) { - entry = namehook->entry; - bucket = entry->lock_bucket; - LOCK(&adb->entrylocks[bucket]); - - if (!FIND_RETURNLAME(find) - && entry_is_lame(adb, entry, qname, qtype, now)) { - find->options |= DNS_ADBFIND_LAMEPRUNED; - goto nextv4; - } - addrinfo = new_adbaddrinfo(adb, entry, find->port); - if (addrinfo == NULL) { - find->partial_result |= DNS_ADBFIND_INET; - goto out; - } - /* - * Found a valid entry. Add it to the find's list. - */ - inc_entry_refcnt(adb, entry, ISC_FALSE); - ISC_LIST_APPEND(find->list, addrinfo, publink); - addrinfo = NULL; - nextv4: - UNLOCK(&adb->entrylocks[bucket]); - bucket = DNS_ADB_INVALIDBUCKET; - namehook = ISC_LIST_NEXT(namehook, plink); - } - } - - if (find->options & DNS_ADBFIND_INET6) { - namehook = ISC_LIST_HEAD(name->v6); - while (namehook != NULL) { - entry = namehook->entry; - bucket = entry->lock_bucket; - LOCK(&adb->entrylocks[bucket]); - - if (entry_is_lame(adb, entry, qname, qtype, now)) - goto nextv6; - addrinfo = new_adbaddrinfo(adb, entry, find->port); - if (addrinfo == NULL) { - find->partial_result |= DNS_ADBFIND_INET6; - goto out; - } - /* - * Found a valid entry. Add it to the find's list. - */ - inc_entry_refcnt(adb, entry, ISC_FALSE); - ISC_LIST_APPEND(find->list, addrinfo, publink); - addrinfo = NULL; - nextv6: - UNLOCK(&adb->entrylocks[bucket]); - bucket = DNS_ADB_INVALIDBUCKET; - namehook = ISC_LIST_NEXT(namehook, plink); - } - } + dns_adbnamehook_t *namehook; + dns_adbaddrinfo_t *addrinfo; + dns_adbentry_t *entry; + int bucket; + + bucket = DNS_ADB_INVALIDBUCKET; + + if (find->options & DNS_ADBFIND_INET) { + namehook = ISC_LIST_HEAD(name->v4); + while (namehook != NULL) { + entry = namehook->entry; + bucket = entry->lock_bucket; + LOCK(&adb->entrylocks[bucket]); + + if (!FIND_RETURNLAME(find) + && entry_is_lame(adb, entry, qname, qtype, now)) { + find->options |= DNS_ADBFIND_LAMEPRUNED; + goto nextv4; + } + addrinfo = new_adbaddrinfo(adb, entry, find->port); + if (addrinfo == NULL) { + find->partial_result |= DNS_ADBFIND_INET; + goto out; + } + /* + * Found a valid entry. Add it to the find's list. + */ + inc_entry_refcnt(adb, entry, ISC_FALSE); + ISC_LIST_APPEND(find->list, addrinfo, publink); + addrinfo = NULL; + nextv4: + UNLOCK(&adb->entrylocks[bucket]); + bucket = DNS_ADB_INVALIDBUCKET; + namehook = ISC_LIST_NEXT(namehook, plink); + } + } + + if (find->options & DNS_ADBFIND_INET6) { + namehook = ISC_LIST_HEAD(name->v6); + while (namehook != NULL) { + entry = namehook->entry; + bucket = entry->lock_bucket; + LOCK(&adb->entrylocks[bucket]); + + if (entry_is_lame(adb, entry, qname, qtype, now)) + goto nextv6; + addrinfo = new_adbaddrinfo(adb, entry, find->port); + if (addrinfo == NULL) { + find->partial_result |= DNS_ADBFIND_INET6; + goto out; + } + /* + * Found a valid entry. Add it to the find's list. + */ + inc_entry_refcnt(adb, entry, ISC_FALSE); + ISC_LIST_APPEND(find->list, addrinfo, publink); + addrinfo = NULL; + nextv6: + UNLOCK(&adb->entrylocks[bucket]); + bucket = DNS_ADB_INVALIDBUCKET; + namehook = ISC_LIST_NEXT(namehook, plink); + } + } out: - if (bucket != DNS_ADB_INVALIDBUCKET) - UNLOCK(&adb->entrylocks[bucket]); + if (bucket != DNS_ADB_INVALIDBUCKET) + UNLOCK(&adb->entrylocks[bucket]); } static void shutdown_task(isc_task_t *task, isc_event_t *ev) { - dns_adb_t *adb; - - UNUSED(task); - - adb = ev->ev_arg; - INSIST(DNS_ADB_VALID(adb)); - - /* - * Kill the timer, and then the ADB itself. Note that this implies - * that this task was the one scheduled to get timer events. If - * this is not true (and it is unfortunate there is no way to INSIST() - * this) badness will occur. - */ - LOCK(&adb->lock); - isc_timer_detach(&adb->timer); -#ifdef LRU_DEBUG - isc_timer_detach(&adb->dump_timer); -#endif - UNLOCK(&adb->lock); - isc_event_free(&ev); - destroy(adb); + dns_adb_t *adb; + + UNUSED(task); + + adb = ev->ev_arg; + INSIST(DNS_ADB_VALID(adb)); + + isc_event_free(&ev); + /* + * Wait for lock around check_exit() call to be released. + */ + LOCK(&adb->lock); + UNLOCK(&adb->lock); + destroy(adb); } /* @@ -1843,34 +1785,34 @@ shutdown_task(isc_task_t *task, isc_event_t *ev) { */ static isc_boolean_t check_expire_name(dns_adbname_t **namep, isc_stdtime_t now) { - dns_adbname_t *name; - isc_boolean_t result = ISC_FALSE; - - INSIST(namep != NULL && DNS_ADBNAME_VALID(*namep)); - name = *namep; - - if (NAME_HAS_V4(name) || NAME_HAS_V6(name)) - return (result); - if (NAME_FETCH(name)) - return (result); - if (!EXPIRE_OK(name->expire_v4, now)) - return (result); - if (!EXPIRE_OK(name->expire_v6, now)) - return (result); - if (!EXPIRE_OK(name->expire_target, now)) - return (result); - - /* - * The name is empty. Delete it. - */ - result = kill_name(&name, DNS_EVENT_ADBEXPIRED, ISC_FALSE); - *namep = NULL; - - /* - * Our caller, or one of its callers, will be calling check_exit() at - * some point, so we don't need to do it here. - */ - return (result); + dns_adbname_t *name; + isc_boolean_t result = ISC_FALSE; + + INSIST(namep != NULL && DNS_ADBNAME_VALID(*namep)); + name = *namep; + + if (NAME_HAS_V4(name) || NAME_HAS_V6(name)) + return (result); + if (NAME_FETCH(name)) + return (result); + if (!EXPIRE_OK(name->expire_v4, now)) + return (result); + if (!EXPIRE_OK(name->expire_v6, now)) + return (result); + if (!EXPIRE_OK(name->expire_target, now)) + return (result); + + /* + * The name is empty. Delete it. + */ + result = kill_name(&name, DNS_EVENT_ADBEXPIRED, ISC_FALSE); + *namep = NULL; + + /* + * Our caller, or one of its callers, will be calling check_exit() at + * some point, so we don't need to do it here. + */ + return (result); } /*% @@ -1886,67 +1828,55 @@ check_expire_name(dns_adbname_t **namep, isc_stdtime_t now) { */ static void 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; - int scans = 0; - - INSIST(bucket != DNS_ADB_INVALIDBUCKET); - - max_victims = overmem ? 2 : 1; - - /* - * We limit the number of scanned entries to 10 (arbitrary choice) - * in order to avoid examining too many entries when there are many - * tail entries that have fetches (this should be rare, but could - * happen). - */ - victim = ISC_LIST_TAIL(adb->names[bucket]); - for (victims = 0; - victim != NULL && victims < max_victims && scans < 10; - victim = next_victim) { - scans++; - next_victim = ISC_LIST_PREV(victim, plink); - - /* - * If the victim is already dead, it simply waits for some - * final events. Ignore it. - */ - if (NAME_DEAD(victim)) - goto next; - - result = check_expire_name(&victim, now); - if (victim == NULL) { -#ifdef LRU_DEBUG - adb->stale_expire++; -#endif - victims++; - goto next; - } - - if (!NAME_FETCH(victim) && - (overmem || victim->last_used + ADB_STALE_MARGIN <= now)) { - RUNTIME_CHECK(kill_name(&victim, - DNS_EVENT_ADBCANCELED, - ISC_TRUE) == - ISC_FALSE); -#ifdef LRU_DEBUG - adb->stale_lru++; -#endif - victims++; - } - - next: - if (!overmem) - break; - } - -#ifdef LRU_DEBUG - /* XXX: omit lock for brevity */ - adb->stale_scan += scans; - adb->stale_purge += victims; -#endif + int victims, max_victims; + isc_boolean_t result; + dns_adbname_t *victim, *next_victim; + isc_boolean_t overmem = adb->overmem; + int scans = 0; + + INSIST(bucket != DNS_ADB_INVALIDBUCKET); + + max_victims = overmem ? 2 : 1; + + /* + * We limit the number of scanned entries to 10 (arbitrary choice) + * in order to avoid examining too many entries when there are many + * tail entries that have fetches (this should be rare, but could + * happen). + */ + victim = ISC_LIST_TAIL(adb->names[bucket]); + for (victims = 0; + victim != NULL && victims < max_victims && scans < 10; + victim = next_victim) { + scans++; + next_victim = ISC_LIST_PREV(victim, plink); + + /* + * If the victim is already dead, it simply waits for some + * final events. Ignore it. + */ + if (NAME_DEAD(victim)) + goto next; + + result = check_expire_name(&victim, now); + if (victim == NULL) { + victims++; + goto next; + } + + if (!NAME_FETCH(victim) && + (overmem || victim->last_used + ADB_STALE_MARGIN <= now)) { + RUNTIME_CHECK(kill_name(&victim, + DNS_EVENT_ADBCANCELED, + ISC_TRUE) == + ISC_FALSE); + victims++; + } + + next: + if (!overmem) + break; + } } /* @@ -1955,29 +1885,29 @@ check_stale_name(dns_adb_t *adb, int bucket, isc_stdtime_t now) { static isc_boolean_t check_expire_entry(dns_adb_t *adb, dns_adbentry_t **entryp, isc_stdtime_t now) { - dns_adbentry_t *entry; - isc_boolean_t result = ISC_FALSE; + dns_adbentry_t *entry; + isc_boolean_t result = ISC_FALSE; - INSIST(entryp != NULL && DNS_ADBENTRY_VALID(*entryp)); - entry = *entryp; + INSIST(entryp != NULL && DNS_ADBENTRY_VALID(*entryp)); + entry = *entryp; - if (entry->refcnt != 0) - return (result); + if (entry->refcnt != 0) + return (result); - if (entry->expires == 0 || entry->expires > now) - return (result); + if (entry->expires == 0 || entry->expires > now) + return (result); - /* - * The entry is not in use. Delete it. - */ - DP(DEF_LEVEL, "killing entry %p", entry); - INSIST(ISC_LINK_LINKED(entry, plink)); - result = unlink_entry(adb, entry); - free_adbentry(adb, &entry); - if (result) - dec_adb_irefcnt(adb); - *entryp = NULL; - return (result); + /* + * The entry is not in use. Delete it. + */ + DP(DEF_LEVEL, "killing entry %p", entry); + INSIST(ISC_LINK_LINKED(entry, plink)); + result = unlink_entry(adb, entry); + free_adbentry(adb, &entry); + if (result) + dec_adb_irefcnt(adb); + *entryp = NULL; + return (result); } /* @@ -1985,29 +1915,29 @@ check_expire_entry(dns_adb_t *adb, dns_adbentry_t **entryp, isc_stdtime_t now) */ static isc_boolean_t cleanup_names(dns_adb_t *adb, int bucket, isc_stdtime_t now) { - dns_adbname_t *name; - dns_adbname_t *next_name; - isc_boolean_t result = ISC_FALSE; - - DP(CLEAN_LEVEL, "cleaning name bucket %d", bucket); - - LOCK(&adb->namelocks[bucket]); - if (adb->name_sd[bucket]) { - UNLOCK(&adb->namelocks[bucket]); - return (result); - } - - name = ISC_LIST_HEAD(adb->names[bucket]); - while (name != NULL) { - next_name = ISC_LIST_NEXT(name, plink); - INSIST(result == ISC_FALSE); - result = check_expire_namehooks(name, now); - if (!result) - result = check_expire_name(&name, now); - name = next_name; - } - UNLOCK(&adb->namelocks[bucket]); - return (result); + dns_adbname_t *name; + dns_adbname_t *next_name; + isc_boolean_t result = ISC_FALSE; + + DP(CLEAN_LEVEL, "cleaning name bucket %d", bucket); + + LOCK(&adb->namelocks[bucket]); + if (adb->name_sd[bucket]) { + UNLOCK(&adb->namelocks[bucket]); + return (result); + } + + name = ISC_LIST_HEAD(adb->names[bucket]); + while (name != NULL) { + next_name = ISC_LIST_NEXT(name, plink); + INSIST(result == ISC_FALSE); + result = check_expire_namehooks(name, now); + if (!result) + result = check_expire_name(&name, now); + name = next_name; + } + UNLOCK(&adb->namelocks[bucket]); + return (result); } /* @@ -2015,131 +1945,46 @@ cleanup_names(dns_adb_t *adb, int bucket, isc_stdtime_t now) { */ static isc_boolean_t cleanup_entries(dns_adb_t *adb, int bucket, isc_stdtime_t now) { - dns_adbentry_t *entry, *next_entry; - isc_boolean_t result = ISC_FALSE; - - DP(CLEAN_LEVEL, "cleaning entry bucket %d", bucket); - - LOCK(&adb->entrylocks[bucket]); - entry = ISC_LIST_HEAD(adb->entries[bucket]); - while (entry != NULL) { - next_entry = ISC_LIST_NEXT(entry, plink); - INSIST(result == ISC_FALSE); - result = check_expire_entry(adb, &entry, now); - entry = next_entry; - } - UNLOCK(&adb->entrylocks[bucket]); - return (result); -} - -#if 1 -static void -timer_cleanup(isc_task_t *task, isc_event_t *ev) { - UNUSED(task); + dns_adbentry_t *entry, *next_entry; + isc_boolean_t result = ISC_FALSE; - isc_event_free(&ev); -} -#else -static void -timer_cleanup(isc_task_t *task, isc_event_t *ev) { - dns_adb_t *adb; - isc_stdtime_t now; - unsigned int i; - isc_interval_t interval; - - UNUSED(task); - - adb = ev->ev_arg; - INSIST(DNS_ADB_VALID(adb)); - - LOCK(&adb->lock); - - isc_stdtime_get(&now); - - for (i = 0; i < CLEAN_BUCKETS; i++) { - /* - * Call our cleanup routines. - */ - RUNTIME_CHECK(cleanup_names(adb, adb->next_cleanbucket, now) == - ISC_FALSE); - RUNTIME_CHECK(cleanup_entries(adb, adb->next_cleanbucket, now) - == ISC_FALSE); - - /* - * Set the next bucket to be cleaned. - */ - adb->next_cleanbucket++; - if (adb->next_cleanbucket >= NBUCKETS) { - adb->next_cleanbucket = 0; -#ifdef DUMP_ADB_AFTER_CLEANING - dump_adb(adb, stdout, ISC_TRUE, now); -#endif - } - } + DP(CLEAN_LEVEL, "cleaning entry bucket %d", bucket); - /* - * Reset the timer. - * XXXDCL isc_timer_reset might return ISC_R_UNEXPECTED or - * ISC_R_NOMEMORY, but it isn't clear what could be done here - * if either one of those things happened. - */ - interval = adb->tick_interval; - if (adb->overmem) - isc_interval_set(&interval, 0, 1); - (void)isc_timer_reset(adb->timer, isc_timertype_once, NULL, - &interval, ISC_FALSE); - - UNLOCK(&adb->lock); - - isc_event_free(&ev); + LOCK(&adb->entrylocks[bucket]); + entry = ISC_LIST_HEAD(adb->entries[bucket]); + while (entry != NULL) { + next_entry = ISC_LIST_NEXT(entry, plink); + INSIST(result == ISC_FALSE); + result = check_expire_entry(adb, &entry, now); + entry = next_entry; + } + UNLOCK(&adb->entrylocks[bucket]); + return (result); } -#endif static void destroy(dns_adb_t *adb) { - adb->magic = 0; - -#ifdef LRU_DEBUG - /* for debug: print statistics */ - if (adb->nname_total > 0) { - INSIST(adb->nname == 0 && adb->nentry == 0); - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_ADB, ISC_LOG_INFO, - "ADB %p name hit %.2f, entry hit %.2f", adb, - (double)adb->nameuses / - (adb->nname_total + adb->nameuses), - adb->entryuses > 0 ? - (double)adb->entryuses / - (adb->nentry_total + adb->entryuses) : 0); - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_ADB, ISC_LOG_INFO, - "ADB %p stale name purges: %u(%u,%u)/%u", - adb, adb->stale_purge, adb->stale_expire, - adb->stale_lru, adb->stale_scan); - } -#endif + adb->magic = 0; - /* - * The timer is already dead, from the task's shutdown callback. - */ - isc_task_detach(&adb->task); + isc_task_detach(&adb->task); - isc_mempool_destroy(&adb->nmp); - isc_mempool_destroy(&adb->nhmp); - isc_mempool_destroy(&adb->limp); - isc_mempool_destroy(&adb->emp); - isc_mempool_destroy(&adb->ahmp); - isc_mempool_destroy(&adb->aimp); - isc_mempool_destroy(&adb->afmp); + isc_mempool_destroy(&adb->nmp); + isc_mempool_destroy(&adb->nhmp); + isc_mempool_destroy(&adb->limp); + isc_mempool_destroy(&adb->emp); + isc_mempool_destroy(&adb->ahmp); + isc_mempool_destroy(&adb->aimp); + isc_mempool_destroy(&adb->afmp); - DESTROYMUTEXBLOCK(adb->entrylocks, NBUCKETS); - DESTROYMUTEXBLOCK(adb->namelocks, NBUCKETS); + DESTROYMUTEXBLOCK(adb->entrylocks, NBUCKETS); + DESTROYMUTEXBLOCK(adb->namelocks, NBUCKETS); - DESTROYLOCK(&adb->reflock); - DESTROYLOCK(&adb->lock); - DESTROYLOCK(&adb->mplock); + DESTROYLOCK(&adb->reflock); + DESTROYLOCK(&adb->lock); + DESTROYLOCK(&adb->mplock); + DESTROYLOCK(&adb->overmemlock); - isc_mem_putanddetach(&adb->mctx, adb, sizeof(dns_adb_t)); + isc_mem_putanddetach(&adb->mctx, adb, sizeof(dns_adb_t)); } @@ -2149,1393 +1994,1350 @@ destroy(dns_adb_t *adb) { isc_result_t dns_adb_create(isc_mem_t *mem, dns_view_t *view, isc_timermgr_t *timermgr, - isc_taskmgr_t *taskmgr, dns_adb_t **newadb) + isc_taskmgr_t *taskmgr, dns_adb_t **newadb) { - dns_adb_t *adb; - isc_result_t result; - int i; - - REQUIRE(mem != NULL); - REQUIRE(view != NULL); - REQUIRE(timermgr != NULL); - REQUIRE(taskmgr != NULL); - REQUIRE(newadb != NULL && *newadb == NULL); - - adb = isc_mem_get(mem, sizeof(dns_adb_t)); - if (adb == NULL) - return (ISC_R_NOMEMORY); - - /* - * Initialize things here that cannot fail, and especially things - * that must be NULL for the error return to work properly. - */ - adb->magic = 0; - adb->erefcnt = 1; - adb->irefcnt = 0; - adb->nmp = NULL; - adb->nhmp = NULL; - adb->limp = NULL; - adb->emp = NULL; - adb->ahmp = NULL; - adb->aimp = NULL; - adb->afmp = NULL; - adb->task = NULL; - adb->timer = NULL; -#ifdef LRU_DEBUG - adb->dump_timer = NULL; -#endif - adb->mctx = NULL; - adb->view = view; - adb->timermgr = timermgr; - adb->taskmgr = taskmgr; - adb->next_cleanbucket = 0; - ISC_EVENT_INIT(&adb->cevent, sizeof(adb->cevent), 0, NULL, - DNS_EVENT_ADBCONTROL, shutdown_task, adb, - adb, NULL, NULL); - adb->cevent_sent = ISC_FALSE; - adb->shutting_down = ISC_FALSE; - adb->overmem = ISC_FALSE; - ISC_LIST_INIT(adb->whenshutdown); - -#ifdef LRU_DEBUG - /* for debug */ - adb->nname = 0; - adb->nname_total = 0; - adb->nentry = 0; - adb->nentry_total = 0; - adb->stale_purge = 0; - adb->stale_scan = 0; - adb->stale_expire = 0; - adb->stale_lru = 0; - adb->nameuses = 0; - adb->entryuses = 0; -#endif - - isc_mem_attach(mem, &adb->mctx); - - result = isc_mutex_init(&adb->lock); - if (result != ISC_R_SUCCESS) - goto fail0b; - - result = isc_mutex_init(&adb->mplock); - if (result != ISC_R_SUCCESS) - goto fail0c; - - result = isc_mutex_init(&adb->reflock); - if (result != ISC_R_SUCCESS) - goto fail0d; - - /* - * Initialize the bucket locks for names and elements. - * May as well initialize the list heads, too. - */ - result = isc_mutexblock_init(adb->namelocks, NBUCKETS); - if (result != ISC_R_SUCCESS) - goto fail1; - for (i = 0; i < NBUCKETS; i++) { - ISC_LIST_INIT(adb->names[i]); - adb->name_sd[i] = ISC_FALSE; - adb->name_refcnt[i] = 0; - adb->irefcnt++; - } - for (i = 0; i < NBUCKETS; i++) { - ISC_LIST_INIT(adb->entries[i]); - adb->entry_sd[i] = ISC_FALSE; - adb->entry_refcnt[i] = 0; - adb->irefcnt++; - } - result = isc_mutexblock_init(adb->entrylocks, NBUCKETS); - if (result != ISC_R_SUCCESS) - goto fail2; - - /* - * Memory pools - */ + dns_adb_t *adb; + isc_result_t result; + int i; + + REQUIRE(mem != NULL); + REQUIRE(view != NULL); + REQUIRE(timermgr != NULL); /* this is actually unused */ + REQUIRE(taskmgr != NULL); + REQUIRE(newadb != NULL && *newadb == NULL); + + UNUSED(timermgr); + + adb = isc_mem_get(mem, sizeof(dns_adb_t)); + if (adb == NULL) + return (ISC_R_NOMEMORY); + + /* + * Initialize things here that cannot fail, and especially things + * that must be NULL for the error return to work properly. + */ + adb->magic = 0; + adb->erefcnt = 1; + adb->irefcnt = 0; + adb->nmp = NULL; + adb->nhmp = NULL; + adb->limp = NULL; + adb->emp = NULL; + adb->ahmp = NULL; + adb->aimp = NULL; + adb->afmp = NULL; + adb->task = NULL; + adb->mctx = NULL; + adb->view = view; + adb->taskmgr = taskmgr; + adb->next_cleanbucket = 0; + ISC_EVENT_INIT(&adb->cevent, sizeof(adb->cevent), 0, NULL, + DNS_EVENT_ADBCONTROL, shutdown_task, adb, + 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); + + result = isc_mutex_init(&adb->lock); + if (result != ISC_R_SUCCESS) + goto fail0b; + + result = isc_mutex_init(&adb->mplock); + if (result != ISC_R_SUCCESS) + goto fail0c; + + result = isc_mutex_init(&adb->reflock); + if (result != ISC_R_SUCCESS) + goto fail0d; + + result = isc_mutex_init(&adb->overmemlock); + if (result != ISC_R_SUCCESS) + goto fail0e; + + /* + * Initialize the bucket locks for names and elements. + * May as well initialize the list heads, too. + */ + result = isc_mutexblock_init(adb->namelocks, NBUCKETS); + if (result != ISC_R_SUCCESS) + goto fail1; + for (i = 0; i < NBUCKETS; i++) { + ISC_LIST_INIT(adb->names[i]); + adb->name_sd[i] = ISC_FALSE; + adb->name_refcnt[i] = 0; + adb->irefcnt++; + } + for (i = 0; i < NBUCKETS; i++) { + ISC_LIST_INIT(adb->entries[i]); + adb->entry_sd[i] = ISC_FALSE; + adb->entry_refcnt[i] = 0; + adb->irefcnt++; + } + result = isc_mutexblock_init(adb->entrylocks, NBUCKETS); + if (result != ISC_R_SUCCESS) + goto fail2; + + /* + * Memory pools + */ #define MPINIT(t, p, n) do { \ - result = isc_mempool_create(mem, sizeof(t), &(p)); \ - if (result != ISC_R_SUCCESS) \ - goto fail3; \ - isc_mempool_setfreemax((p), FREE_ITEMS); \ - isc_mempool_setfillcount((p), FILL_COUNT); \ - isc_mempool_setname((p), n); \ - isc_mempool_associatelock((p), &adb->mplock); \ + result = isc_mempool_create(mem, sizeof(t), &(p)); \ + if (result != ISC_R_SUCCESS) \ + goto fail3; \ + isc_mempool_setfreemax((p), FREE_ITEMS); \ + isc_mempool_setfillcount((p), FILL_COUNT); \ + isc_mempool_setname((p), n); \ + isc_mempool_associatelock((p), &adb->mplock); \ } while (0) - MPINIT(dns_adbname_t, adb->nmp, "adbname"); - MPINIT(dns_adbnamehook_t, adb->nhmp, "adbnamehook"); - MPINIT(dns_adblameinfo_t, adb->limp, "adblameinfo"); - MPINIT(dns_adbentry_t, adb->emp, "adbentry"); - MPINIT(dns_adbfind_t, adb->ahmp, "adbfind"); - MPINIT(dns_adbaddrinfo_t, adb->aimp, "adbaddrinfo"); - MPINIT(dns_adbfetch_t, adb->afmp, "adbfetch"); + MPINIT(dns_adbname_t, adb->nmp, "adbname"); + MPINIT(dns_adbnamehook_t, adb->nhmp, "adbnamehook"); + MPINIT(dns_adblameinfo_t, adb->limp, "adblameinfo"); + MPINIT(dns_adbentry_t, adb->emp, "adbentry"); + MPINIT(dns_adbfind_t, adb->ahmp, "adbfind"); + MPINIT(dns_adbaddrinfo_t, adb->aimp, "adbaddrinfo"); + MPINIT(dns_adbfetch_t, adb->afmp, "adbfetch"); #undef MPINIT - /* - * Allocate a timer and a task for our periodic cleanup. - */ - result = isc_task_create(adb->taskmgr, 0, &adb->task); - if (result != ISC_R_SUCCESS) - goto fail3; - isc_task_setname(adb->task, "ADB", adb); - /* - * XXXMLG When this is changed to be a config file option, - */ - isc_interval_set(&adb->tick_interval, CLEAN_SECONDS, 0); - result = isc_timer_create(adb->timermgr, isc_timertype_once, - NULL, &adb->tick_interval, adb->task, - timer_cleanup, adb, &adb->timer); - if (result != ISC_R_SUCCESS) - goto fail3; - -#ifdef LRU_DEBUG - { - isc_interval_t interval; - - interval.seconds = DUMP_INTERVAL; - interval.nanoseconds = 0; - RUNTIME_CHECK(isc_time_nowplusinterval(&adb->dump_time, - &interval) == - ISC_R_SUCCESS); - - result = isc_timer_create(adb->timermgr, isc_timertype_once, - &adb->dump_time, NULL, adb->task, - timer_dump, adb, &adb->dump_timer); - } -#endif - - DP(ISC_LOG_DEBUG(5), "cleaning interval for adb: " - "%u buckets every %u seconds, %u buckets in system, %u cl.interval", - CLEAN_BUCKETS, CLEAN_SECONDS, NBUCKETS, CLEAN_PERIOD); - - /* - * Normal return. - */ - adb->magic = DNS_ADB_MAGIC; - *newadb = adb; - return (ISC_R_SUCCESS); + /* + * Allocate an internal task. + */ + result = isc_task_create(adb->taskmgr, 0, &adb->task); + if (result != ISC_R_SUCCESS) + goto fail3; + isc_task_setname(adb->task, "ADB", adb); + + /* + * Normal return. + */ + adb->magic = DNS_ADB_MAGIC; + *newadb = adb; + return (ISC_R_SUCCESS); fail3: - if (adb->task != NULL) - isc_task_detach(&adb->task); - if (adb->timer != NULL) - isc_timer_detach(&adb->timer); + if (adb->task != NULL) + isc_task_detach(&adb->task); - /* clean up entrylocks */ - DESTROYMUTEXBLOCK(adb->entrylocks, NBUCKETS); + /* clean up entrylocks */ + DESTROYMUTEXBLOCK(adb->entrylocks, NBUCKETS); fail2: /* clean up namelocks */ - DESTROYMUTEXBLOCK(adb->namelocks, NBUCKETS); + DESTROYMUTEXBLOCK(adb->namelocks, NBUCKETS); fail1: /* clean up only allocated memory */ - if (adb->nmp != NULL) - isc_mempool_destroy(&adb->nmp); - if (adb->nhmp != NULL) - isc_mempool_destroy(&adb->nhmp); - if (adb->limp != NULL) - isc_mempool_destroy(&adb->limp); - if (adb->emp != NULL) - isc_mempool_destroy(&adb->emp); - if (adb->ahmp != NULL) - isc_mempool_destroy(&adb->ahmp); - if (adb->aimp != NULL) - isc_mempool_destroy(&adb->aimp); - if (adb->afmp != NULL) - isc_mempool_destroy(&adb->afmp); - - DESTROYLOCK(&adb->reflock); + if (adb->nmp != NULL) + isc_mempool_destroy(&adb->nmp); + if (adb->nhmp != NULL) + isc_mempool_destroy(&adb->nhmp); + if (adb->limp != NULL) + isc_mempool_destroy(&adb->limp); + if (adb->emp != NULL) + isc_mempool_destroy(&adb->emp); + if (adb->ahmp != NULL) + isc_mempool_destroy(&adb->ahmp); + if (adb->aimp != NULL) + isc_mempool_destroy(&adb->aimp); + if (adb->afmp != NULL) + isc_mempool_destroy(&adb->afmp); + + DESTROYLOCK(&adb->overmemlock); + fail0e: + DESTROYLOCK(&adb->reflock); fail0d: - DESTROYLOCK(&adb->mplock); + DESTROYLOCK(&adb->mplock); fail0c: - DESTROYLOCK(&adb->lock); + DESTROYLOCK(&adb->lock); fail0b: - isc_mem_putanddetach(&adb->mctx, adb, sizeof(dns_adb_t)); + isc_mem_putanddetach(&adb->mctx, adb, sizeof(dns_adb_t)); - return (result); + return (result); } void dns_adb_attach(dns_adb_t *adb, dns_adb_t **adbx) { - REQUIRE(DNS_ADB_VALID(adb)); - REQUIRE(adbx != NULL && *adbx == NULL); + REQUIRE(DNS_ADB_VALID(adb)); + REQUIRE(adbx != NULL && *adbx == NULL); - inc_adb_erefcnt(adb); - *adbx = adb; + inc_adb_erefcnt(adb); + *adbx = adb; } void dns_adb_detach(dns_adb_t **adbx) { - dns_adb_t *adb; - isc_boolean_t need_exit_check; + dns_adb_t *adb; + isc_boolean_t need_exit_check; - REQUIRE(adbx != NULL && DNS_ADB_VALID(*adbx)); + REQUIRE(adbx != NULL && DNS_ADB_VALID(*adbx)); - adb = *adbx; - *adbx = NULL; + adb = *adbx; + *adbx = NULL; - INSIST(adb->erefcnt > 0); + INSIST(adb->erefcnt > 0); - LOCK(&adb->reflock); - adb->erefcnt--; - need_exit_check = ISC_TF(adb->erefcnt == 0 && adb->irefcnt == 0); - UNLOCK(&adb->reflock); + LOCK(&adb->reflock); + adb->erefcnt--; + need_exit_check = ISC_TF(adb->erefcnt == 0 && adb->irefcnt == 0); + UNLOCK(&adb->reflock); - if (need_exit_check) { - LOCK(&adb->lock); - INSIST(adb->shutting_down); - check_exit(adb); - UNLOCK(&adb->lock); - } + if (need_exit_check) { + LOCK(&adb->lock); + INSIST(adb->shutting_down); + check_exit(adb); + UNLOCK(&adb->lock); + } } void dns_adb_whenshutdown(dns_adb_t *adb, isc_task_t *task, isc_event_t **eventp) { - isc_task_t *clone; - isc_event_t *event; - isc_boolean_t zeroirefcnt = ISC_FALSE; + isc_task_t *clone; + isc_event_t *event; + isc_boolean_t zeroirefcnt = ISC_FALSE; - /* - * Send '*eventp' to 'task' when 'adb' has shutdown. - */ + /* + * Send '*eventp' to 'task' when 'adb' has shutdown. + */ - REQUIRE(DNS_ADB_VALID(adb)); - REQUIRE(eventp != NULL); + REQUIRE(DNS_ADB_VALID(adb)); + REQUIRE(eventp != NULL); - event = *eventp; - *eventp = NULL; + event = *eventp; + *eventp = NULL; - LOCK(&adb->lock); + LOCK(&adb->lock); - LOCK(&adb->reflock); - zeroirefcnt = ISC_TF(adb->irefcnt == 0); + LOCK(&adb->reflock); + zeroirefcnt = ISC_TF(adb->irefcnt == 0); - if (adb->shutting_down && zeroirefcnt && - isc_mempool_getallocated(adb->ahmp) == 0) { - /* - * We're already shutdown. Send the event. - */ - event->ev_sender = adb; - isc_task_send(task, &event); - } else { - clone = NULL; - isc_task_attach(task, &clone); - event->ev_sender = clone; - ISC_LIST_APPEND(adb->whenshutdown, event, ev_link); - } + if (adb->shutting_down && zeroirefcnt && + isc_mempool_getallocated(adb->ahmp) == 0) { + /* + * We're already shutdown. Send the event. + */ + event->ev_sender = adb; + isc_task_send(task, &event); + } else { + clone = NULL; + isc_task_attach(task, &clone); + event->ev_sender = clone; + ISC_LIST_APPEND(adb->whenshutdown, event, ev_link); + } - UNLOCK(&adb->reflock); - UNLOCK(&adb->lock); + UNLOCK(&adb->reflock); + UNLOCK(&adb->lock); } void dns_adb_shutdown(dns_adb_t *adb) { - isc_boolean_t need_check_exit; + isc_boolean_t need_check_exit; - /* - * Shutdown 'adb'. - */ + /* + * Shutdown 'adb'. + */ - LOCK(&adb->lock); + LOCK(&adb->lock); - if (!adb->shutting_down) { - adb->shutting_down = ISC_TRUE; - isc_mem_setwater(adb->mctx, water, adb, 0, 0); - need_check_exit = shutdown_names(adb); - if (!need_check_exit) - need_check_exit = shutdown_entries(adb); - if (need_check_exit) - check_exit(adb); - } + if (!adb->shutting_down) { + adb->shutting_down = ISC_TRUE; + isc_mem_setwater(adb->mctx, water, adb, 0, 0); + need_check_exit = shutdown_names(adb); + if (!need_check_exit) + need_check_exit = shutdown_entries(adb); + if (need_check_exit) + check_exit(adb); + } - UNLOCK(&adb->lock); + UNLOCK(&adb->lock); } isc_result_t dns_adb_createfind(dns_adb_t *adb, isc_task_t *task, isc_taskaction_t action, - void *arg, dns_name_t *name, dns_name_t *qname, - dns_rdatatype_t qtype, unsigned int options, - isc_stdtime_t now, dns_name_t *target, - in_port_t port, dns_adbfind_t **findp) + void *arg, dns_name_t *name, dns_name_t *qname, + dns_rdatatype_t qtype, unsigned int options, + isc_stdtime_t now, dns_name_t *target, + in_port_t port, dns_adbfind_t **findp) { - dns_adbfind_t *find; - dns_adbname_t *adbname; - int bucket; - isc_boolean_t want_event, start_at_zone, alias, have_address; - isc_result_t result; - unsigned int wanted_addresses; - unsigned int wanted_fetches; - unsigned int query_pending; - - REQUIRE(DNS_ADB_VALID(adb)); - if (task != NULL) { - REQUIRE(action != NULL); - } - REQUIRE(name != NULL); - REQUIRE(qname != NULL); - REQUIRE(findp != NULL && *findp == NULL); - REQUIRE(target == NULL || dns_name_hasbuffer(target)); - - REQUIRE((options & DNS_ADBFIND_ADDRESSMASK) != 0); - - result = ISC_R_UNEXPECTED; - wanted_addresses = (options & DNS_ADBFIND_ADDRESSMASK); - wanted_fetches = 0; - query_pending = 0; - want_event = ISC_FALSE; - start_at_zone = ISC_FALSE; - alias = ISC_FALSE; - - if (now == 0) - isc_stdtime_get(&now); - - /* - * XXXMLG Move this comment somewhere else! - * - * Look up the name in our internal database. - * - * Possibilities: Note that these are not always exclusive. - * - * No name found. In this case, allocate a new name header and - * an initial namehook or two. If any of these allocations - * fail, clean up and return ISC_R_NOMEMORY. - * - * Name found, valid addresses present. Allocate one addrinfo - * structure for each found and append it to the linked list - * of addresses for this header. - * - * Name found, queries pending. In this case, if a task was - * passed in, allocate a job id, attach it to the name's job - * list and remember to tell the caller that there will be - * more info coming later. - */ - - find = new_adbfind(adb); - if (find == NULL) - return (ISC_R_NOMEMORY); - - find->port = port; - - /* - * Remember what types of addresses we are interested in. - */ - find->options = options; - find->flags |= wanted_addresses; - if (FIND_WANTEVENT(find)) { - REQUIRE(task != NULL); - } - - /* - * Try to see if we know anything about this name at all. - */ - bucket = DNS_ADB_INVALIDBUCKET; - adbname = find_name_and_lock(adb, name, find->options, &bucket); - if (adb->name_sd[bucket]) { - DP(DEF_LEVEL, - "dns_adb_createfind: returning ISC_R_SHUTTINGDOWN"); - RUNTIME_CHECK(free_adbfind(adb, &find) == ISC_FALSE); - result = ISC_R_SHUTTINGDOWN; - goto out; - } - - /* - * Nothing found. Allocate a new adbname structure for this name. - */ - if (adbname == NULL) { - /* - * See if there is any stale name at the end of list, and purge - * it if so. - */ - check_stale_name(adb, bucket, now); - - adbname = new_adbname(adb, name); - if (adbname == NULL) { - RUNTIME_CHECK(free_adbfind(adb, &find) == ISC_FALSE); - result = ISC_R_NOMEMORY; - goto out; - } - link_name(adb, bucket, adbname); - if (FIND_HINTOK(find)) - adbname->flags |= NAME_HINT_OK; - if (FIND_GLUEOK(find)) - adbname->flags |= NAME_GLUE_OK; - if (FIND_STARTATZONE(find)) - adbname->flags |= NAME_STARTATZONE; - -#ifdef LRU_DEBUG - adb->nname++; /* XXX: omit ADB lock for brevity */ - adb->nname_total++; -#endif - } else { - /* Move this name forward in the LRU list */ - ISC_LIST_UNLINK(adb->names[bucket], adbname, plink); - ISC_LIST_PREPEND(adb->names[bucket], adbname, plink); -#ifdef LRU_DEBUG - adb->nameuses++; -#endif - } - adbname->last_used = now; - - /* - * Expire old entries, etc. - */ - RUNTIME_CHECK(check_expire_namehooks(adbname, now) == ISC_FALSE); - - /* - * Do we know that the name is an alias? - */ - if (!EXPIRE_OK(adbname->expire_target, now)) { - /* - * Yes, it is. - */ - DP(DEF_LEVEL, - "dns_adb_createfind: name %p is an alias (cached)", - adbname); - alias = ISC_TRUE; - goto post_copy; - } - - /* - * Try to populate the name from the database and/or - * start fetches. First try looking for an A record - * in the database. - */ - if (!NAME_HAS_V4(adbname) && EXPIRE_OK(adbname->expire_v4, now) - && WANT_INET(wanted_addresses)) { - result = dbfind_name(adbname, now, dns_rdatatype_a); - if (result == ISC_R_SUCCESS) { - DP(DEF_LEVEL, - "dns_adb_createfind: found A for name %p in db", - adbname); - goto v6; - } - - /* - * Did we get a CNAME or DNAME? - */ - if (result == DNS_R_ALIAS) { - DP(DEF_LEVEL, - "dns_adb_createfind: name %p is an alias", - adbname); - alias = ISC_TRUE; - goto post_copy; - } - - /* - * If the name doesn't exist at all, don't bother with - * v6 queries; they won't work. - * - * If the name does exist but we didn't get our data, go - * ahead and try AAAA. - * - * If the result is neither of these, try a fetch for A. - */ - if (NXDOMAIN_RESULT(result)) - goto fetch; - else if (NXRRSET_RESULT(result)) - goto v6; - - if (!NAME_FETCH_V4(adbname)) - wanted_fetches |= DNS_ADBFIND_INET; - } + dns_adbfind_t *find; + dns_adbname_t *adbname; + int bucket; + isc_boolean_t want_event, start_at_zone, alias, have_address; + isc_result_t result; + unsigned int wanted_addresses; + unsigned int wanted_fetches; + unsigned int query_pending; + + REQUIRE(DNS_ADB_VALID(adb)); + if (task != NULL) { + REQUIRE(action != NULL); + } + REQUIRE(name != NULL); + REQUIRE(qname != NULL); + REQUIRE(findp != NULL && *findp == NULL); + REQUIRE(target == NULL || dns_name_hasbuffer(target)); + + REQUIRE((options & DNS_ADBFIND_ADDRESSMASK) != 0); + + result = ISC_R_UNEXPECTED; + wanted_addresses = (options & DNS_ADBFIND_ADDRESSMASK); + wanted_fetches = 0; + query_pending = 0; + want_event = ISC_FALSE; + start_at_zone = ISC_FALSE; + alias = ISC_FALSE; + + if (now == 0) + isc_stdtime_get(&now); + + /* + * XXXMLG Move this comment somewhere else! + * + * Look up the name in our internal database. + * + * Possibilities: Note that these are not always exclusive. + * + * No name found. In this case, allocate a new name header and + * an initial namehook or two. If any of these allocations + * fail, clean up and return ISC_R_NOMEMORY. + * + * Name found, valid addresses present. Allocate one addrinfo + * structure for each found and append it to the linked list + * of addresses for this header. + * + * Name found, queries pending. In this case, if a task was + * passed in, allocate a job id, attach it to the name's job + * list and remember to tell the caller that there will be + * more info coming later. + */ + + find = new_adbfind(adb); + if (find == NULL) + return (ISC_R_NOMEMORY); + + find->port = port; + + /* + * Remember what types of addresses we are interested in. + */ + find->options = options; + find->flags |= wanted_addresses; + if (FIND_WANTEVENT(find)) { + REQUIRE(task != NULL); + } + + /* + * Try to see if we know anything about this name at all. + */ + bucket = DNS_ADB_INVALIDBUCKET; + adbname = find_name_and_lock(adb, name, find->options, &bucket); + if (adb->name_sd[bucket]) { + DP(DEF_LEVEL, + "dns_adb_createfind: returning ISC_R_SHUTTINGDOWN"); + RUNTIME_CHECK(free_adbfind(adb, &find) == ISC_FALSE); + result = ISC_R_SHUTTINGDOWN; + goto out; + } + + /* + * Nothing found. Allocate a new adbname structure for this name. + */ + if (adbname == NULL) { + /* + * See if there is any stale name at the end of list, and purge + * it if so. + */ + check_stale_name(adb, bucket, now); + + adbname = new_adbname(adb, name); + if (adbname == NULL) { + RUNTIME_CHECK(free_adbfind(adb, &find) == ISC_FALSE); + result = ISC_R_NOMEMORY; + goto out; + } + link_name(adb, bucket, adbname); + if (FIND_HINTOK(find)) + adbname->flags |= NAME_HINT_OK; + if (FIND_GLUEOK(find)) + adbname->flags |= NAME_GLUE_OK; + if (FIND_STARTATZONE(find)) + adbname->flags |= NAME_STARTATZONE; + } else { + /* Move this name forward in the LRU list */ + ISC_LIST_UNLINK(adb->names[bucket], adbname, plink); + ISC_LIST_PREPEND(adb->names[bucket], adbname, plink); + } + adbname->last_used = now; + + /* + * Expire old entries, etc. + */ + RUNTIME_CHECK(check_expire_namehooks(adbname, now) == ISC_FALSE); + + /* + * Do we know that the name is an alias? + */ + if (!EXPIRE_OK(adbname->expire_target, now)) { + /* + * Yes, it is. + */ + DP(DEF_LEVEL, + "dns_adb_createfind: name %p is an alias (cached)", + adbname); + alias = ISC_TRUE; + goto post_copy; + } + + /* + * Try to populate the name from the database and/or + * start fetches. First try looking for an A record + * in the database. + */ + if (!NAME_HAS_V4(adbname) && EXPIRE_OK(adbname->expire_v4, now) + && WANT_INET(wanted_addresses)) { + result = dbfind_name(adbname, now, dns_rdatatype_a); + if (result == ISC_R_SUCCESS) { + DP(DEF_LEVEL, + "dns_adb_createfind: found A for name %p in db", + adbname); + goto v6; + } + + /* + * Did we get a CNAME or DNAME? + */ + if (result == DNS_R_ALIAS) { + DP(DEF_LEVEL, + "dns_adb_createfind: name %p is an alias", + adbname); + alias = ISC_TRUE; + goto post_copy; + } + + /* + * If the name doesn't exist at all, don't bother with + * v6 queries; they won't work. + * + * If the name does exist but we didn't get our data, go + * ahead and try AAAA. + * + * If the result is neither of these, try a fetch for A. + */ + if (NXDOMAIN_RESULT(result)) + goto fetch; + else if (NXRRSET_RESULT(result)) + goto v6; + + if (!NAME_FETCH_V4(adbname)) + wanted_fetches |= DNS_ADBFIND_INET; + } v6: - if (!NAME_HAS_V6(adbname) && EXPIRE_OK(adbname->expire_v6, now) - && WANT_INET6(wanted_addresses)) { - result = dbfind_name(adbname, now, dns_rdatatype_aaaa); - if (result == ISC_R_SUCCESS) { - DP(DEF_LEVEL, - "dns_adb_createfind: found AAAA for name %p", - adbname); - goto fetch; - } - - /* - * Did we get a CNAME or DNAME? - */ - if (result == DNS_R_ALIAS) { - DP(DEF_LEVEL, - "dns_adb_createfind: name %p is an alias", - adbname); - alias = ISC_TRUE; - goto post_copy; - } - - /* - * Listen to negative cache hints, and don't start - * another query. - */ - if (NCACHE_RESULT(result) || AUTH_NX(result)) - goto fetch; - - if (!NAME_FETCH_V6(adbname)) - wanted_fetches |= DNS_ADBFIND_INET6; - } + if (!NAME_HAS_V6(adbname) && EXPIRE_OK(adbname->expire_v6, now) + && WANT_INET6(wanted_addresses)) { + result = dbfind_name(adbname, now, dns_rdatatype_aaaa); + if (result == ISC_R_SUCCESS) { + DP(DEF_LEVEL, + "dns_adb_createfind: found AAAA for name %p", + adbname); + goto fetch; + } + + /* + * Did we get a CNAME or DNAME? + */ + if (result == DNS_R_ALIAS) { + DP(DEF_LEVEL, + "dns_adb_createfind: name %p is an alias", + adbname); + alias = ISC_TRUE; + goto post_copy; + } + + /* + * Listen to negative cache hints, and don't start + * another query. + */ + if (NCACHE_RESULT(result) || AUTH_NX(result)) + goto fetch; + + if (!NAME_FETCH_V6(adbname)) + wanted_fetches |= DNS_ADBFIND_INET6; + } fetch: - if ((WANT_INET(wanted_addresses) && NAME_HAS_V4(adbname)) || - (WANT_INET6(wanted_addresses) && NAME_HAS_V6(adbname))) - have_address = ISC_TRUE; - else - have_address = ISC_FALSE; - if (wanted_fetches != 0 && - ! (FIND_AVOIDFETCHES(find) && have_address)) { - /* - * We're missing at least one address family. Either the - * caller hasn't instructed us to avoid fetches, or we don't - * know anything about any of the address families that would - * be acceptable so we have to launch fetches. - */ - - if (FIND_STARTATZONE(find)) - start_at_zone = ISC_TRUE; - - /* - * Start V4. - */ - if (WANT_INET(wanted_fetches) && - fetch_name(adbname, start_at_zone, - dns_rdatatype_a) == ISC_R_SUCCESS) { - DP(DEF_LEVEL, - "dns_adb_createfind: started A fetch for name %p", - adbname); - } - - /* - * Start V6. - */ - if (WANT_INET6(wanted_fetches) && - fetch_name(adbname, start_at_zone, - dns_rdatatype_aaaa) == ISC_R_SUCCESS) { - DP(DEF_LEVEL, - "dns_adb_createfind: " - "started AAAA fetch for name %p", - adbname); - } - } - - /* - * Run through the name and copy out the bits we are - * interested in. - */ - copy_namehook_lists(adb, find, qname, qtype, adbname, now); + if ((WANT_INET(wanted_addresses) && NAME_HAS_V4(adbname)) || + (WANT_INET6(wanted_addresses) && NAME_HAS_V6(adbname))) + have_address = ISC_TRUE; + else + have_address = ISC_FALSE; + if (wanted_fetches != 0 && + ! (FIND_AVOIDFETCHES(find) && have_address)) { + /* + * We're missing at least one address family. Either the + * caller hasn't instructed us to avoid fetches, or we don't + * know anything about any of the address families that would + * be acceptable so we have to launch fetches. + */ + + if (FIND_STARTATZONE(find)) + start_at_zone = ISC_TRUE; + + /* + * Start V4. + */ + if (WANT_INET(wanted_fetches) && + fetch_name(adbname, start_at_zone, + dns_rdatatype_a) == ISC_R_SUCCESS) { + DP(DEF_LEVEL, + "dns_adb_createfind: started A fetch for name %p", + adbname); + } + + /* + * Start V6. + */ + if (WANT_INET6(wanted_fetches) && + fetch_name(adbname, start_at_zone, + dns_rdatatype_aaaa) == ISC_R_SUCCESS) { + DP(DEF_LEVEL, + "dns_adb_createfind: " + "started AAAA fetch for name %p", + adbname); + } + } + + /* + * Run through the name and copy out the bits we are + * interested in. + */ + copy_namehook_lists(adb, find, qname, qtype, adbname, now); post_copy: - if (NAME_FETCH_V4(adbname)) - query_pending |= DNS_ADBFIND_INET; - if (NAME_FETCH_V6(adbname)) - query_pending |= DNS_ADBFIND_INET6; - - /* - * Attach to the name's query list if there are queries - * already running, and we have been asked to. - */ - want_event = ISC_TRUE; - if (!FIND_WANTEVENT(find)) - want_event = ISC_FALSE; - if (FIND_WANTEMPTYEVENT(find) && FIND_HAS_ADDRS(find)) - want_event = ISC_FALSE; - if ((wanted_addresses & query_pending) == 0) - want_event = ISC_FALSE; - if (alias) - want_event = ISC_FALSE; - if (want_event) { - find->adbname = adbname; - find->name_bucket = bucket; - ISC_LIST_APPEND(adbname->finds, find, plink); - find->query_pending = (query_pending & wanted_addresses); - find->flags &= ~DNS_ADBFIND_ADDRESSMASK; - find->flags |= (find->query_pending & DNS_ADBFIND_ADDRESSMASK); - DP(DEF_LEVEL, "createfind: attaching find %p to adbname %p", - find, adbname); - } else { - /* - * Remove the flag so the caller knows there will never - * be an event, and set internal flags to fake that - * the event was sent and freed, so dns_adb_destroyfind() will - * do the right thing. - */ - find->query_pending = (query_pending & wanted_addresses); - find->options &= ~DNS_ADBFIND_WANTEVENT; - find->flags |= (FIND_EVENT_SENT | FIND_EVENT_FREED); - find->flags &= ~DNS_ADBFIND_ADDRESSMASK; - } - - find->partial_result |= (adbname->partial_result & wanted_addresses); - if (alias) { - if (target != NULL) { - result = dns_name_copy(&adbname->target, target, NULL); - if (result != ISC_R_SUCCESS) - goto out; - } - result = DNS_R_ALIAS; - } else - result = ISC_R_SUCCESS; - - /* - * Copy out error flags from the name structure into the find. - */ - find->result_v4 = find_err_map[adbname->fetch_err]; - find->result_v6 = find_err_map[adbname->fetch6_err]; + if (NAME_FETCH_V4(adbname)) + query_pending |= DNS_ADBFIND_INET; + if (NAME_FETCH_V6(adbname)) + query_pending |= DNS_ADBFIND_INET6; + + /* + * Attach to the name's query list if there are queries + * already running, and we have been asked to. + */ + want_event = ISC_TRUE; + if (!FIND_WANTEVENT(find)) + want_event = ISC_FALSE; + if (FIND_WANTEMPTYEVENT(find) && FIND_HAS_ADDRS(find)) + want_event = ISC_FALSE; + if ((wanted_addresses & query_pending) == 0) + want_event = ISC_FALSE; + if (alias) + want_event = ISC_FALSE; + if (want_event) { + find->adbname = adbname; + find->name_bucket = bucket; + ISC_LIST_APPEND(adbname->finds, find, plink); + find->query_pending = (query_pending & wanted_addresses); + find->flags &= ~DNS_ADBFIND_ADDRESSMASK; + find->flags |= (find->query_pending & DNS_ADBFIND_ADDRESSMASK); + DP(DEF_LEVEL, "createfind: attaching find %p to adbname %p", + find, adbname); + } else { + /* + * Remove the flag so the caller knows there will never + * be an event, and set internal flags to fake that + * the event was sent and freed, so dns_adb_destroyfind() will + * do the right thing. + */ + find->query_pending = (query_pending & wanted_addresses); + find->options &= ~DNS_ADBFIND_WANTEVENT; + find->flags |= (FIND_EVENT_SENT | FIND_EVENT_FREED); + find->flags &= ~DNS_ADBFIND_ADDRESSMASK; + } + + find->partial_result |= (adbname->partial_result & wanted_addresses); + if (alias) { + if (target != NULL) { + result = dns_name_copy(&adbname->target, target, NULL); + if (result != ISC_R_SUCCESS) + goto out; + } + result = DNS_R_ALIAS; + } else + result = ISC_R_SUCCESS; + + /* + * Copy out error flags from the name structure into the find. + */ + find->result_v4 = find_err_map[adbname->fetch_err]; + find->result_v6 = find_err_map[adbname->fetch6_err]; out: - if (find != NULL) { - *findp = find; + if (find != NULL) { + *findp = find; - if (want_event) { - isc_task_t *taskp; + if (want_event) { + isc_task_t *taskp; - INSIST((find->flags & DNS_ADBFIND_ADDRESSMASK) != 0); - taskp = NULL; - isc_task_attach(task, &taskp); - find->event.ev_sender = taskp; - find->event.ev_action = action; - find->event.ev_arg = arg; - } - } + INSIST((find->flags & DNS_ADBFIND_ADDRESSMASK) != 0); + taskp = NULL; + isc_task_attach(task, &taskp); + find->event.ev_sender = taskp; + find->event.ev_action = action; + find->event.ev_arg = arg; + } + } - UNLOCK(&adb->namelocks[bucket]); + UNLOCK(&adb->namelocks[bucket]); - return (result); + return (result); } void dns_adb_destroyfind(dns_adbfind_t **findp) { - dns_adbfind_t *find; - dns_adbentry_t *entry; - dns_adbaddrinfo_t *ai; - int bucket; - dns_adb_t *adb; - - REQUIRE(findp != NULL && DNS_ADBFIND_VALID(*findp)); - find = *findp; - *findp = NULL; - - LOCK(&find->lock); - - DP(DEF_LEVEL, "dns_adb_destroyfind on find %p", find); - - adb = find->adb; - REQUIRE(DNS_ADB_VALID(adb)); - - REQUIRE(FIND_EVENTFREED(find)); - - bucket = find->name_bucket; - INSIST(bucket == DNS_ADB_INVALIDBUCKET); - - UNLOCK(&find->lock); - - /* - * The find doesn't exist on any list, and nothing is locked. - * Return the find to the memory pool, and decrement the adb's - * reference count. - */ - 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) == - ISC_FALSE); - free_adbaddrinfo(adb, &ai); - ai = ISC_LIST_HEAD(find->list); - } - - /* - * WARNING: The find is freed with the adb locked. This is done - * to avoid a race condition where we free the find, some other - * thread tests to see if it should be destroyed, detects it should - * be, destroys it, and then we try to lock it for our check, but the - * lock is destroyed. - */ - LOCK(&adb->lock); - if (free_adbfind(adb, &find)) - check_exit(adb); - UNLOCK(&adb->lock); + dns_adbfind_t *find; + dns_adbentry_t *entry; + dns_adbaddrinfo_t *ai; + int bucket; + dns_adb_t *adb; + + REQUIRE(findp != NULL && DNS_ADBFIND_VALID(*findp)); + find = *findp; + *findp = NULL; + + LOCK(&find->lock); + + DP(DEF_LEVEL, "dns_adb_destroyfind on find %p", find); + + adb = find->adb; + REQUIRE(DNS_ADB_VALID(adb)); + + REQUIRE(FIND_EVENTFREED(find)); + + bucket = find->name_bucket; + INSIST(bucket == DNS_ADB_INVALIDBUCKET); + + UNLOCK(&find->lock); + + /* + * The find doesn't exist on any list, and nothing is locked. + * Return the find to the memory pool, and decrement the adb's + * reference count. + */ + 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) == + ISC_FALSE); + free_adbaddrinfo(adb, &ai); + ai = ISC_LIST_HEAD(find->list); + } + + /* + * WARNING: The find is freed with the adb locked. This is done + * to avoid a race condition where we free the find, some other + * thread tests to see if it should be destroyed, detects it should + * be, destroys it, and then we try to lock it for our check, but the + * lock is destroyed. + */ + LOCK(&adb->lock); + if (free_adbfind(adb, &find)) + check_exit(adb); + UNLOCK(&adb->lock); } void dns_adb_cancelfind(dns_adbfind_t *find) { - isc_event_t *ev; - isc_task_t *task; - dns_adb_t *adb; - int bucket; - int unlock_bucket; - - LOCK(&find->lock); - - DP(DEF_LEVEL, "dns_adb_cancelfind on find %p", find); - - adb = find->adb; - REQUIRE(DNS_ADB_VALID(adb)); - - REQUIRE(!FIND_EVENTFREED(find)); - REQUIRE(FIND_WANTEVENT(find)); - - bucket = find->name_bucket; - if (bucket == DNS_ADB_INVALIDBUCKET) - goto cleanup; - - /* - * We need to get the adbname's lock to unlink the find. - */ - unlock_bucket = bucket; - violate_locking_hierarchy(&find->lock, &adb->namelocks[unlock_bucket]); - bucket = find->name_bucket; - if (bucket != DNS_ADB_INVALIDBUCKET) { - ISC_LIST_UNLINK(find->adbname->finds, find, plink); - find->adbname = NULL; - find->name_bucket = DNS_ADB_INVALIDBUCKET; - } - UNLOCK(&adb->namelocks[unlock_bucket]); - bucket = DNS_ADB_INVALIDBUCKET; + isc_event_t *ev; + isc_task_t *task; + dns_adb_t *adb; + int bucket; + int unlock_bucket; + + LOCK(&find->lock); + + DP(DEF_LEVEL, "dns_adb_cancelfind on find %p", find); + + adb = find->adb; + REQUIRE(DNS_ADB_VALID(adb)); + + REQUIRE(!FIND_EVENTFREED(find)); + REQUIRE(FIND_WANTEVENT(find)); + + bucket = find->name_bucket; + if (bucket == DNS_ADB_INVALIDBUCKET) + goto cleanup; + + /* + * We need to get the adbname's lock to unlink the find. + */ + unlock_bucket = bucket; + violate_locking_hierarchy(&find->lock, &adb->namelocks[unlock_bucket]); + bucket = find->name_bucket; + if (bucket != DNS_ADB_INVALIDBUCKET) { + ISC_LIST_UNLINK(find->adbname->finds, find, plink); + find->adbname = NULL; + find->name_bucket = DNS_ADB_INVALIDBUCKET; + } + UNLOCK(&adb->namelocks[unlock_bucket]); + bucket = DNS_ADB_INVALIDBUCKET; cleanup: - if (!FIND_EVENTSENT(find)) { - ev = &find->event; - task = ev->ev_sender; - ev->ev_sender = find; - ev->ev_type = DNS_EVENT_ADBCANCELED; - ev->ev_destroy = event_free; - ev->ev_destroy_arg = find; - find->result_v4 = ISC_R_CANCELED; - find->result_v6 = ISC_R_CANCELED; + if (!FIND_EVENTSENT(find)) { + ev = &find->event; + task = ev->ev_sender; + ev->ev_sender = find; + ev->ev_type = DNS_EVENT_ADBCANCELED; + ev->ev_destroy = event_free; + ev->ev_destroy_arg = find; + find->result_v4 = ISC_R_CANCELED; + find->result_v6 = ISC_R_CANCELED; - DP(DEF_LEVEL, "sending event %p to task %p for find %p", - ev, task, find); + DP(DEF_LEVEL, "sending event %p to task %p for find %p", + ev, task, find); - isc_task_sendanddetach(&task, (isc_event_t **)&ev); - } + isc_task_sendanddetach(&task, (isc_event_t **)&ev); + } - UNLOCK(&find->lock); + UNLOCK(&find->lock); } void dns_adb_dump(dns_adb_t *adb, FILE *f) { - int i; - isc_stdtime_t now; + int i; + isc_stdtime_t now; - REQUIRE(DNS_ADB_VALID(adb)); - REQUIRE(f != NULL); + REQUIRE(DNS_ADB_VALID(adb)); + REQUIRE(f != NULL); - /* - * Lock the adb itself, lock all the name buckets, then lock all - * the entry buckets. This should put the adb into a state where - * nothing can change, so we can iterate through everything and - * print at our leisure. - */ + /* + * Lock the adb itself, lock all the name buckets, then lock all + * the entry buckets. This should put the adb into a state where + * nothing can change, so we can iterate through everything and + * print at our leisure. + */ - LOCK(&adb->lock); - isc_stdtime_get(&now); + LOCK(&adb->lock); + isc_stdtime_get(&now); - for (i = 0; i < NBUCKETS; i++) - RUNTIME_CHECK(cleanup_names(adb, i, now) == ISC_FALSE); - for (i = 0; i < NBUCKETS; i++) - RUNTIME_CHECK(cleanup_entries(adb, i, now) == ISC_FALSE); + for (i = 0; i < NBUCKETS; i++) + RUNTIME_CHECK(cleanup_names(adb, i, now) == ISC_FALSE); + for (i = 0; i < NBUCKETS; i++) + RUNTIME_CHECK(cleanup_entries(adb, i, now) == ISC_FALSE); - dump_adb(adb, f, ISC_FALSE, now); - UNLOCK(&adb->lock); + dump_adb(adb, f, ISC_FALSE, now); + UNLOCK(&adb->lock); } static void dump_ttl(FILE *f, const char *legend, isc_stdtime_t value, isc_stdtime_t now) { - if (value == INT_MAX) - return; - fprintf(f, " [%s TTL %d]", legend, value - now); + if (value == INT_MAX) + return; + fprintf(f, " [%s TTL %d]", legend, value - now); } static void dump_adb(dns_adb_t *adb, FILE *f, isc_boolean_t debug, isc_stdtime_t now) { - int i; - dns_adbname_t *name; - dns_adbentry_t *entry; - - fprintf(f, ";\n; Address database dump\n;\n"); - if (debug) - fprintf(f, "; addr %p, erefcnt %u, irefcnt %u, finds out %u\n", - adb, adb->erefcnt, adb->irefcnt, - isc_mempool_getallocated(adb->nhmp)); - - for (i = 0; i < NBUCKETS; i++) - LOCK(&adb->namelocks[i]); - for (i = 0; i < NBUCKETS; i++) - LOCK(&adb->entrylocks[i]); - - /* - * Dump the names - */ - for (i = 0; i < NBUCKETS; i++) { - name = ISC_LIST_HEAD(adb->names[i]); - if (name == NULL) - continue; - if (debug) - fprintf(f, "; bucket %d\n", i); - for (; - name != NULL; - name = ISC_LIST_NEXT(name, plink)) - { - if (debug) - fprintf(f, "; name %p (flags %08x)\n", - name, name->flags); - - fprintf(f, "; "); - print_dns_name(f, &name->name); - if (dns_name_countlabels(&name->target) > 0) { - fprintf(f, " alias "); - print_dns_name(f, &name->target); - } - - dump_ttl(f, "v4", name->expire_v4, now); - dump_ttl(f, "v6", name->expire_v6, now); - dump_ttl(f, "target", name->expire_target, now); - - fprintf(f, " [v4 %s] [v6 %s]", - errnames[name->fetch_err], - errnames[name->fetch6_err]); - - fprintf(f, "\n"); - - print_namehook_list(f, "v4", &name->v4, debug, now); - print_namehook_list(f, "v6", &name->v6, debug, now); - - if (debug) - print_fetch_list(f, name); - if (debug) - print_find_list(f, name); - - } - } - - fprintf(f, ";\n; Unassociated entries\n;\n"); - - for (i = 0; i < NBUCKETS; i++) { - entry = ISC_LIST_HEAD(adb->entries[i]); - while (entry != NULL) { - if (entry->refcnt == 0) - dump_entry(f, entry, debug, now); - entry = ISC_LIST_NEXT(entry, plink); - } - } - - /* - * Unlock everything - */ - for (i = 0; i < NBUCKETS; i++) - UNLOCK(&adb->entrylocks[i]); - for (i = 0; i < NBUCKETS; i++) - UNLOCK(&adb->namelocks[i]); + int i; + dns_adbname_t *name; + dns_adbentry_t *entry; + + fprintf(f, ";\n; Address database dump\n;\n"); + if (debug) + fprintf(f, "; addr %p, erefcnt %u, irefcnt %u, finds out %u\n", + adb, adb->erefcnt, adb->irefcnt, + isc_mempool_getallocated(adb->nhmp)); + + for (i = 0; i < NBUCKETS; i++) + LOCK(&adb->namelocks[i]); + for (i = 0; i < NBUCKETS; i++) + LOCK(&adb->entrylocks[i]); + + /* + * Dump the names + */ + for (i = 0; i < NBUCKETS; i++) { + name = ISC_LIST_HEAD(adb->names[i]); + if (name == NULL) + continue; + if (debug) + fprintf(f, "; bucket %d\n", i); + for (; + name != NULL; + name = ISC_LIST_NEXT(name, plink)) + { + if (debug) + fprintf(f, "; name %p (flags %08x)\n", + name, name->flags); + + fprintf(f, "; "); + print_dns_name(f, &name->name); + if (dns_name_countlabels(&name->target) > 0) { + fprintf(f, " alias "); + print_dns_name(f, &name->target); + } + + dump_ttl(f, "v4", name->expire_v4, now); + dump_ttl(f, "v6", name->expire_v6, now); + dump_ttl(f, "target", name->expire_target, now); + + fprintf(f, " [v4 %s] [v6 %s]", + errnames[name->fetch_err], + errnames[name->fetch6_err]); + + fprintf(f, "\n"); + + print_namehook_list(f, "v4", &name->v4, debug, now); + print_namehook_list(f, "v6", &name->v6, debug, now); + + if (debug) + print_fetch_list(f, name); + if (debug) + print_find_list(f, name); + + } + } + + fprintf(f, ";\n; Unassociated entries\n;\n"); + + for (i = 0; i < NBUCKETS; i++) { + entry = ISC_LIST_HEAD(adb->entries[i]); + while (entry != NULL) { + if (entry->refcnt == 0) + dump_entry(f, entry, debug, now); + entry = ISC_LIST_NEXT(entry, plink); + } + } + + /* + * Unlock everything + */ + for (i = 0; i < NBUCKETS; i++) + UNLOCK(&adb->entrylocks[i]); + for (i = 0; i < NBUCKETS; i++) + UNLOCK(&adb->namelocks[i]); } static void dump_entry(FILE *f, dns_adbentry_t *entry, isc_boolean_t debug, - isc_stdtime_t now) + isc_stdtime_t now) { - char addrbuf[ISC_NETADDR_FORMATSIZE]; - char typebuf[DNS_RDATATYPE_FORMATSIZE]; - isc_netaddr_t netaddr; - dns_adblameinfo_t *li; - - isc_netaddr_fromsockaddr(&netaddr, &entry->sockaddr); - isc_netaddr_format(&netaddr, addrbuf, sizeof(addrbuf)); - - if (debug) - fprintf(f, ";\t%p: refcnt %u\n", entry, entry->refcnt); - - fprintf(f, ";\t%s [srtt %u] [flags %08x]", - addrbuf, entry->srtt, entry->flags); - if (entry->expires != 0) - fprintf(f, " [ttl %d]", entry->expires - now); - fprintf(f, "\n"); - for (li = ISC_LIST_HEAD(entry->lameinfo); - li != NULL; - li = ISC_LIST_NEXT(li, plink)) { - fprintf(f, ";\t\t"); - print_dns_name(f, &li->qname); - dns_rdatatype_format(li->qtype, typebuf, sizeof(typebuf)); - fprintf(f, " %s [lame TTL %d]\n", typebuf, - li->lame_timer - now); - } + char addrbuf[ISC_NETADDR_FORMATSIZE]; + char typebuf[DNS_RDATATYPE_FORMATSIZE]; + isc_netaddr_t netaddr; + dns_adblameinfo_t *li; + + isc_netaddr_fromsockaddr(&netaddr, &entry->sockaddr); + isc_netaddr_format(&netaddr, addrbuf, sizeof(addrbuf)); + + if (debug) + fprintf(f, ";\t%p: refcnt %u\n", entry, entry->refcnt); + + fprintf(f, ";\t%s [srtt %u] [flags %08x]", + addrbuf, entry->srtt, entry->flags); + if (entry->expires != 0) + fprintf(f, " [ttl %d]", entry->expires - now); + fprintf(f, "\n"); + for (li = ISC_LIST_HEAD(entry->lameinfo); + li != NULL; + li = ISC_LIST_NEXT(li, plink)) { + fprintf(f, ";\t\t"); + print_dns_name(f, &li->qname); + dns_rdatatype_format(li->qtype, typebuf, sizeof(typebuf)); + fprintf(f, " %s [lame TTL %d]\n", typebuf, + li->lame_timer - now); + } } void dns_adb_dumpfind(dns_adbfind_t *find, FILE *f) { - char tmp[512]; - const char *tmpp; - dns_adbaddrinfo_t *ai; - isc_sockaddr_t *sa; - - /* - * Not used currently, in the API Just In Case we - * want to dump out the name and/or entries too. - */ - - LOCK(&find->lock); - - fprintf(f, ";Find %p\n", find); - fprintf(f, ";\tqpending %08x partial %08x options %08x flags %08x\n", - find->query_pending, find->partial_result, - find->options, find->flags); - fprintf(f, ";\tname_bucket %d, name %p, event sender %p\n", - find->name_bucket, find->adbname, find->event.ev_sender); - - ai = ISC_LIST_HEAD(find->list); - if (ai != NULL) - fprintf(f, "\tAddresses:\n"); - while (ai != NULL) { - sa = &ai->sockaddr; - switch (sa->type.sa.sa_family) { - case AF_INET: - tmpp = inet_ntop(AF_INET, &sa->type.sin.sin_addr, - tmp, sizeof(tmp)); - break; - case AF_INET6: - tmpp = inet_ntop(AF_INET6, &sa->type.sin6.sin6_addr, - tmp, sizeof(tmp)); - break; - default: - tmpp = "UnkFamily"; - } - - if (tmpp == NULL) - tmpp = "BadAddress"; - - fprintf(f, "\t\tentry %p, flags %08x" - " srtt %u addr %s\n", - ai->entry, ai->flags, ai->srtt, tmpp); - - ai = ISC_LIST_NEXT(ai, publink); - } - - UNLOCK(&find->lock); + char tmp[512]; + const char *tmpp; + dns_adbaddrinfo_t *ai; + isc_sockaddr_t *sa; + + /* + * Not used currently, in the API Just In Case we + * want to dump out the name and/or entries too. + */ + + LOCK(&find->lock); + + fprintf(f, ";Find %p\n", find); + fprintf(f, ";\tqpending %08x partial %08x options %08x flags %08x\n", + find->query_pending, find->partial_result, + find->options, find->flags); + fprintf(f, ";\tname_bucket %d, name %p, event sender %p\n", + find->name_bucket, find->adbname, find->event.ev_sender); + + ai = ISC_LIST_HEAD(find->list); + if (ai != NULL) + fprintf(f, "\tAddresses:\n"); + while (ai != NULL) { + sa = &ai->sockaddr; + switch (sa->type.sa.sa_family) { + case AF_INET: + tmpp = inet_ntop(AF_INET, &sa->type.sin.sin_addr, + tmp, sizeof(tmp)); + break; + case AF_INET6: + tmpp = inet_ntop(AF_INET6, &sa->type.sin6.sin6_addr, + tmp, sizeof(tmp)); + break; + default: + tmpp = "UnkFamily"; + } + + if (tmpp == NULL) + tmpp = "BadAddress"; + + fprintf(f, "\t\tentry %p, flags %08x" + " srtt %u addr %s\n", + ai->entry, ai->flags, ai->srtt, tmpp); + + ai = ISC_LIST_NEXT(ai, publink); + } + + UNLOCK(&find->lock); } static void print_dns_name(FILE *f, dns_name_t *name) { - char buf[DNS_NAME_FORMATSIZE]; + char buf[DNS_NAME_FORMATSIZE]; - INSIST(f != NULL); + INSIST(f != NULL); - dns_name_format(name, buf, sizeof(buf)); - fprintf(f, "%s", buf); + dns_name_format(name, buf, sizeof(buf)); + fprintf(f, "%s", buf); } static void print_namehook_list(FILE *f, const char *legend, dns_adbnamehooklist_t *list, - isc_boolean_t debug, isc_stdtime_t now) + isc_boolean_t debug, isc_stdtime_t now) { - dns_adbnamehook_t *nh; + dns_adbnamehook_t *nh; - for (nh = ISC_LIST_HEAD(*list); - nh != NULL; - nh = ISC_LIST_NEXT(nh, plink)) - { - if (debug) - fprintf(f, ";\tHook(%s) %p\n", legend, nh); - dump_entry(f, nh->entry, debug, now); - } + for (nh = ISC_LIST_HEAD(*list); + nh != NULL; + nh = ISC_LIST_NEXT(nh, plink)) + { + if (debug) + fprintf(f, ";\tHook(%s) %p\n", legend, nh); + dump_entry(f, nh->entry, debug, now); + } } static inline void print_fetch(FILE *f, dns_adbfetch_t *ft, const char *type) { - fprintf(f, "\t\tFetch(%s): %p -> { nh %p, entry %p, fetch %p }\n", - type, ft, ft->namehook, ft->entry, ft->fetch); + fprintf(f, "\t\tFetch(%s): %p -> { nh %p, entry %p, fetch %p }\n", + type, ft, ft->namehook, ft->entry, ft->fetch); } static void print_fetch_list(FILE *f, dns_adbname_t *n) { - if (NAME_FETCH_A(n)) - print_fetch(f, n->fetch_a, "A"); - if (NAME_FETCH_AAAA(n)) - print_fetch(f, n->fetch_aaaa, "AAAA"); + if (NAME_FETCH_A(n)) + print_fetch(f, n->fetch_a, "A"); + if (NAME_FETCH_AAAA(n)) + print_fetch(f, n->fetch_aaaa, "AAAA"); } static void print_find_list(FILE *f, dns_adbname_t *name) { - dns_adbfind_t *find; + dns_adbfind_t *find; - find = ISC_LIST_HEAD(name->finds); - while (find != NULL) { - dns_adb_dumpfind(find, f); - find = ISC_LIST_NEXT(find, plink); - } + find = ISC_LIST_HEAD(name->finds); + while (find != NULL) { + dns_adb_dumpfind(find, f); + find = ISC_LIST_NEXT(find, plink); + } } static isc_result_t dbfind_name(dns_adbname_t *adbname, isc_stdtime_t now, dns_rdatatype_t rdtype) { - isc_result_t result; - dns_rdataset_t rdataset; - dns_adb_t *adb; - dns_fixedname_t foundname; - dns_name_t *fname; - - INSIST(DNS_ADBNAME_VALID(adbname)); - adb = adbname->adb; - INSIST(DNS_ADB_VALID(adb)); - INSIST(rdtype == dns_rdatatype_a || rdtype == dns_rdatatype_aaaa); - - dns_fixedname_init(&foundname); - fname = dns_fixedname_name(&foundname); - dns_rdataset_init(&rdataset); - - if (rdtype == dns_rdatatype_a) - adbname->fetch_err = FIND_ERR_UNEXPECTED; - else - adbname->fetch6_err = FIND_ERR_UNEXPECTED; - - result = dns_view_find(adb->view, &adbname->name, rdtype, now, - NAME_GLUEOK(adbname) ? DNS_DBFIND_GLUEOK : 0, - ISC_TF(NAME_HINTOK(adbname)), - NULL, NULL, fname, &rdataset, NULL); - - /* XXXVIX this switch statement is too sparse to gen a jump table. */ - switch (result) { - case DNS_R_GLUE: - case DNS_R_HINT: - case ISC_R_SUCCESS: - /* - * Found in the database. Even if we can't copy out - * any information, return success, or else a fetch - * will be made, which will only make things worse. - */ - if (rdtype == dns_rdatatype_a) - adbname->fetch_err = FIND_ERR_SUCCESS; - else - adbname->fetch6_err = FIND_ERR_SUCCESS; - result = import_rdataset(adbname, &rdataset, now); - break; - case DNS_R_NXDOMAIN: - case DNS_R_NXRRSET: - /* - * We're authoritative and the data doesn't exist. - * Make up a negative cache entry so we don't ask again - * for a while. - * - * XXXRTH What time should we use? I'm putting in 30 seconds - * for now. - */ - if (rdtype == dns_rdatatype_a) { - adbname->expire_v4 = now + 30; - DP(NCACHE_LEVEL, - "adb name %p: Caching auth negative entry for A", - adbname); - if (result == DNS_R_NXDOMAIN) - adbname->fetch_err = FIND_ERR_NXDOMAIN; - else - adbname->fetch_err = FIND_ERR_NXRRSET; - } else { - DP(NCACHE_LEVEL, - "adb name %p: Caching auth negative entry for AAAA", - adbname); - adbname->expire_v6 = now + 30; - if (result == DNS_R_NXDOMAIN) - adbname->fetch6_err = FIND_ERR_NXDOMAIN; - else - adbname->fetch6_err = FIND_ERR_NXRRSET; - } - break; - case DNS_R_NCACHENXDOMAIN: - case DNS_R_NCACHENXRRSET: - /* - * We found a negative cache entry. Pull the TTL from it - * so we won't ask again for a while. - */ - rdataset.ttl = ttlclamp(rdataset.ttl); - if (rdtype == dns_rdatatype_a) { - adbname->expire_v4 = rdataset.ttl + now; - if (result == DNS_R_NCACHENXDOMAIN) - adbname->fetch_err = FIND_ERR_NXDOMAIN; - else - adbname->fetch_err = FIND_ERR_NXRRSET; - DP(NCACHE_LEVEL, - "adb name %p: Caching negative entry for A (ttl %u)", - adbname, rdataset.ttl); - } else { - DP(NCACHE_LEVEL, - "adb name %p: Caching negative entry for AAAA (ttl %u)", - adbname, rdataset.ttl); - adbname->expire_v6 = rdataset.ttl + now; - if (result == DNS_R_NCACHENXDOMAIN) - adbname->fetch6_err = FIND_ERR_NXDOMAIN; - else - adbname->fetch6_err = FIND_ERR_NXRRSET; - } - break; - case DNS_R_CNAME: - case DNS_R_DNAME: - /* - * Clear the hint and glue flags, so this will match - * more often. - */ - adbname->flags &= ~(DNS_ADBFIND_GLUEOK | DNS_ADBFIND_HINTOK); - - rdataset.ttl = ttlclamp(rdataset.ttl); - clean_target(adb, &adbname->target); - adbname->expire_target = INT_MAX; - result = set_target(adb, &adbname->name, fname, &rdataset, - &adbname->target); - if (result == ISC_R_SUCCESS) { - result = DNS_R_ALIAS; - DP(NCACHE_LEVEL, - "adb name %p: caching alias target", - adbname); - adbname->expire_target = rdataset.ttl + now; - } - if (rdtype == dns_rdatatype_a) - adbname->fetch_err = FIND_ERR_SUCCESS; - else - adbname->fetch6_err = FIND_ERR_SUCCESS; - break; - } - - if (dns_rdataset_isassociated(&rdataset)) - dns_rdataset_disassociate(&rdataset); - - return (result); + isc_result_t result; + dns_rdataset_t rdataset; + dns_adb_t *adb; + dns_fixedname_t foundname; + dns_name_t *fname; + + INSIST(DNS_ADBNAME_VALID(adbname)); + adb = adbname->adb; + INSIST(DNS_ADB_VALID(adb)); + INSIST(rdtype == dns_rdatatype_a || rdtype == dns_rdatatype_aaaa); + + dns_fixedname_init(&foundname); + fname = dns_fixedname_name(&foundname); + dns_rdataset_init(&rdataset); + + if (rdtype == dns_rdatatype_a) + adbname->fetch_err = FIND_ERR_UNEXPECTED; + else + adbname->fetch6_err = FIND_ERR_UNEXPECTED; + + result = dns_view_find(adb->view, &adbname->name, rdtype, now, + NAME_GLUEOK(adbname) ? DNS_DBFIND_GLUEOK : 0, + ISC_TF(NAME_HINTOK(adbname)), + NULL, NULL, fname, &rdataset, NULL); + + /* XXXVIX this switch statement is too sparse to gen a jump table. */ + switch (result) { + case DNS_R_GLUE: + case DNS_R_HINT: + case ISC_R_SUCCESS: + /* + * Found in the database. Even if we can't copy out + * any information, return success, or else a fetch + * will be made, which will only make things worse. + */ + if (rdtype == dns_rdatatype_a) + adbname->fetch_err = FIND_ERR_SUCCESS; + else + adbname->fetch6_err = FIND_ERR_SUCCESS; + result = import_rdataset(adbname, &rdataset, now); + break; + case DNS_R_NXDOMAIN: + case DNS_R_NXRRSET: + /* + * We're authoritative and the data doesn't exist. + * Make up a negative cache entry so we don't ask again + * for a while. + * + * XXXRTH What time should we use? I'm putting in 30 seconds + * for now. + */ + if (rdtype == dns_rdatatype_a) { + adbname->expire_v4 = now + 30; + DP(NCACHE_LEVEL, + "adb name %p: Caching auth negative entry for A", + adbname); + if (result == DNS_R_NXDOMAIN) + adbname->fetch_err = FIND_ERR_NXDOMAIN; + else + adbname->fetch_err = FIND_ERR_NXRRSET; + } else { + DP(NCACHE_LEVEL, + "adb name %p: Caching auth negative entry for AAAA", + adbname); + adbname->expire_v6 = now + 30; + if (result == DNS_R_NXDOMAIN) + adbname->fetch6_err = FIND_ERR_NXDOMAIN; + else + adbname->fetch6_err = FIND_ERR_NXRRSET; + } + break; + case DNS_R_NCACHENXDOMAIN: + case DNS_R_NCACHENXRRSET: + /* + * We found a negative cache entry. Pull the TTL from it + * so we won't ask again for a while. + */ + rdataset.ttl = ttlclamp(rdataset.ttl); + if (rdtype == dns_rdatatype_a) { + adbname->expire_v4 = rdataset.ttl + now; + if (result == DNS_R_NCACHENXDOMAIN) + adbname->fetch_err = FIND_ERR_NXDOMAIN; + else + adbname->fetch_err = FIND_ERR_NXRRSET; + DP(NCACHE_LEVEL, + "adb name %p: Caching negative entry for A (ttl %u)", + adbname, rdataset.ttl); + } else { + DP(NCACHE_LEVEL, + "adb name %p: Caching negative entry for AAAA (ttl %u)", + adbname, rdataset.ttl); + adbname->expire_v6 = rdataset.ttl + now; + if (result == DNS_R_NCACHENXDOMAIN) + adbname->fetch6_err = FIND_ERR_NXDOMAIN; + else + adbname->fetch6_err = FIND_ERR_NXRRSET; + } + break; + case DNS_R_CNAME: + case DNS_R_DNAME: + /* + * Clear the hint and glue flags, so this will match + * more often. + */ + adbname->flags &= ~(DNS_ADBFIND_GLUEOK | DNS_ADBFIND_HINTOK); + + rdataset.ttl = ttlclamp(rdataset.ttl); + clean_target(adb, &adbname->target); + adbname->expire_target = INT_MAX; + result = set_target(adb, &adbname->name, fname, &rdataset, + &adbname->target); + if (result == ISC_R_SUCCESS) { + result = DNS_R_ALIAS; + DP(NCACHE_LEVEL, + "adb name %p: caching alias target", + adbname); + adbname->expire_target = rdataset.ttl + now; + } + if (rdtype == dns_rdatatype_a) + adbname->fetch_err = FIND_ERR_SUCCESS; + else + adbname->fetch6_err = FIND_ERR_SUCCESS; + break; + } + + if (dns_rdataset_isassociated(&rdataset)) + dns_rdataset_disassociate(&rdataset); + + return (result); } static void fetch_callback(isc_task_t *task, isc_event_t *ev) { - dns_fetchevent_t *dev; - dns_adbname_t *name; - dns_adb_t *adb; - dns_adbfetch_t *fetch; - int bucket; - isc_eventtype_t ev_status; - isc_stdtime_t now; - isc_result_t result; - unsigned int address_type; - isc_boolean_t want_check_exit = ISC_FALSE; - - UNUSED(task); - - INSIST(ev->ev_type == DNS_EVENT_FETCHDONE); - dev = (dns_fetchevent_t *)ev; - name = ev->ev_arg; - INSIST(DNS_ADBNAME_VALID(name)); - adb = name->adb; - INSIST(DNS_ADB_VALID(adb)); - - bucket = name->lock_bucket; - LOCK(&adb->namelocks[bucket]); - - INSIST(NAME_FETCH_A(name) || NAME_FETCH_AAAA(name)); - address_type = 0; - if (NAME_FETCH_A(name) && (name->fetch_a->fetch == dev->fetch)) { - address_type = DNS_ADBFIND_INET; - fetch = name->fetch_a; - name->fetch_a = NULL; - } else if (NAME_FETCH_AAAA(name) - && (name->fetch_aaaa->fetch == dev->fetch)) { - address_type = DNS_ADBFIND_INET6; - fetch = name->fetch_aaaa; - name->fetch_aaaa = NULL; - } - INSIST(address_type != 0); - - dns_resolver_destroyfetch(&fetch->fetch); - dev->fetch = NULL; - - ev_status = DNS_EVENT_ADBNOMOREADDRESSES; - - /* - * Cleanup things we don't care about. - */ - if (dev->node != NULL) - dns_db_detachnode(dev->db, &dev->node); - if (dev->db != NULL) - dns_db_detach(&dev->db); - - /* - * If this name is marked as dead, clean up, throwing away - * potentially good data. - */ - if (NAME_DEAD(name)) { - free_adbfetch(adb, &fetch); - isc_event_free(&ev); - - want_check_exit = kill_name(&name, DNS_EVENT_ADBCANCELED, - ISC_FALSE); - - UNLOCK(&adb->namelocks[bucket]); - - if (want_check_exit) { - LOCK(&adb->lock); - check_exit(adb); - UNLOCK(&adb->lock); - } - - return; - } - - isc_stdtime_get(&now); - - /* - * If we got a negative cache response, remember it. - */ - if (NCACHE_RESULT(dev->result)) { - dev->rdataset->ttl = ttlclamp(dev->rdataset->ttl); - if (address_type == DNS_ADBFIND_INET) { - DP(NCACHE_LEVEL, "adb fetch name %p: " - "caching negative entry for A (ttl %u)", - name, dev->rdataset->ttl); - name->expire_v4 = ISC_MIN(name->expire_v4, - dev->rdataset->ttl + now); - if (dev->result == DNS_R_NCACHENXDOMAIN) - name->fetch_err = FIND_ERR_NXDOMAIN; - else - name->fetch_err = FIND_ERR_NXRRSET; - } else { - DP(NCACHE_LEVEL, "adb fetch name %p: " - "caching negative entry for AAAA (ttl %u)", - name, dev->rdataset->ttl); - name->expire_v6 = ISC_MIN(name->expire_v6, - dev->rdataset->ttl + now); - if (dev->result == DNS_R_NCACHENXDOMAIN) - name->fetch6_err = FIND_ERR_NXDOMAIN; - else - name->fetch6_err = FIND_ERR_NXRRSET; - } - goto out; - } - - /* - * Handle CNAME/DNAME. - */ - if (dev->result == DNS_R_CNAME || dev->result == DNS_R_DNAME) { - dev->rdataset->ttl = ttlclamp(dev->rdataset->ttl); - clean_target(adb, &name->target); - name->expire_target = INT_MAX; - result = set_target(adb, &name->name, - dns_fixedname_name(&dev->foundname), - dev->rdataset, - &name->target); - if (result == ISC_R_SUCCESS) { - DP(NCACHE_LEVEL, - "adb fetch name %p: caching alias target", - name); - name->expire_target = dev->rdataset->ttl + now; - } - goto check_result; - } - - /* - * Did we get back junk? If so, and there are no more fetches - * sitting out there, tell all the finds about it. - */ - if (dev->result != ISC_R_SUCCESS) { - char buf[DNS_NAME_FORMATSIZE]; - - dns_name_format(&name->name, buf, sizeof(buf)); - DP(DEF_LEVEL, "adb: fetch of '%s' %s failed: %s", - buf, address_type == DNS_ADBFIND_INET ? "A" : "AAAA", - dns_result_totext(dev->result)); - /* XXXMLG Don't pound on bad servers. */ - if (address_type == DNS_ADBFIND_INET) { - name->expire_v4 = ISC_MIN(name->expire_v4, now + 300); - name->fetch_err = FIND_ERR_FAILURE; - } else { - name->expire_v6 = ISC_MIN(name->expire_v6, now + 300); - name->fetch6_err = FIND_ERR_FAILURE; - } - goto out; - } - - /* - * We got something potentially useful. - */ - result = import_rdataset(name, &fetch->rdataset, now); + dns_fetchevent_t *dev; + dns_adbname_t *name; + dns_adb_t *adb; + dns_adbfetch_t *fetch; + int bucket; + isc_eventtype_t ev_status; + isc_stdtime_t now; + isc_result_t result; + unsigned int address_type; + isc_boolean_t want_check_exit = ISC_FALSE; + + UNUSED(task); + + INSIST(ev->ev_type == DNS_EVENT_FETCHDONE); + dev = (dns_fetchevent_t *)ev; + name = ev->ev_arg; + INSIST(DNS_ADBNAME_VALID(name)); + adb = name->adb; + INSIST(DNS_ADB_VALID(adb)); + + bucket = name->lock_bucket; + LOCK(&adb->namelocks[bucket]); + + INSIST(NAME_FETCH_A(name) || NAME_FETCH_AAAA(name)); + address_type = 0; + if (NAME_FETCH_A(name) && (name->fetch_a->fetch == dev->fetch)) { + address_type = DNS_ADBFIND_INET; + fetch = name->fetch_a; + name->fetch_a = NULL; + } else if (NAME_FETCH_AAAA(name) + && (name->fetch_aaaa->fetch == dev->fetch)) { + address_type = DNS_ADBFIND_INET6; + fetch = name->fetch_aaaa; + name->fetch_aaaa = NULL; + } + INSIST(address_type != 0); + + dns_resolver_destroyfetch(&fetch->fetch); + dev->fetch = NULL; + + ev_status = DNS_EVENT_ADBNOMOREADDRESSES; + + /* + * Cleanup things we don't care about. + */ + if (dev->node != NULL) + dns_db_detachnode(dev->db, &dev->node); + if (dev->db != NULL) + dns_db_detach(&dev->db); + + /* + * If this name is marked as dead, clean up, throwing away + * potentially good data. + */ + if (NAME_DEAD(name)) { + free_adbfetch(adb, &fetch); + isc_event_free(&ev); + + want_check_exit = kill_name(&name, DNS_EVENT_ADBCANCELED, + ISC_FALSE); + + UNLOCK(&adb->namelocks[bucket]); + + if (want_check_exit) { + LOCK(&adb->lock); + check_exit(adb); + UNLOCK(&adb->lock); + } + + return; + } + + isc_stdtime_get(&now); + + /* + * If we got a negative cache response, remember it. + */ + if (NCACHE_RESULT(dev->result)) { + dev->rdataset->ttl = ttlclamp(dev->rdataset->ttl); + if (address_type == DNS_ADBFIND_INET) { + DP(NCACHE_LEVEL, "adb fetch name %p: " + "caching negative entry for A (ttl %u)", + name, dev->rdataset->ttl); + name->expire_v4 = ISC_MIN(name->expire_v4, + dev->rdataset->ttl + now); + if (dev->result == DNS_R_NCACHENXDOMAIN) + name->fetch_err = FIND_ERR_NXDOMAIN; + else + name->fetch_err = FIND_ERR_NXRRSET; + inc_stats(adb, dns_resstatscounter_gluefetchv4fail); + } else { + DP(NCACHE_LEVEL, "adb fetch name %p: " + "caching negative entry for AAAA (ttl %u)", + name, dev->rdataset->ttl); + name->expire_v6 = ISC_MIN(name->expire_v6, + dev->rdataset->ttl + now); + if (dev->result == DNS_R_NCACHENXDOMAIN) + name->fetch6_err = FIND_ERR_NXDOMAIN; + else + name->fetch6_err = FIND_ERR_NXRRSET; + inc_stats(adb, dns_resstatscounter_gluefetchv6fail); + } + goto out; + } + + /* + * Handle CNAME/DNAME. + */ + if (dev->result == DNS_R_CNAME || dev->result == DNS_R_DNAME) { + dev->rdataset->ttl = ttlclamp(dev->rdataset->ttl); + clean_target(adb, &name->target); + name->expire_target = INT_MAX; + result = set_target(adb, &name->name, + dns_fixedname_name(&dev->foundname), + dev->rdataset, + &name->target); + if (result == ISC_R_SUCCESS) { + DP(NCACHE_LEVEL, + "adb fetch name %p: caching alias target", + name); + name->expire_target = dev->rdataset->ttl + now; + } + goto check_result; + } + + /* + * Did we get back junk? If so, and there are no more fetches + * sitting out there, tell all the finds about it. + */ + if (dev->result != ISC_R_SUCCESS) { + char buf[DNS_NAME_FORMATSIZE]; + + dns_name_format(&name->name, buf, sizeof(buf)); + DP(DEF_LEVEL, "adb: fetch of '%s' %s failed: %s", + buf, address_type == DNS_ADBFIND_INET ? "A" : "AAAA", + dns_result_totext(dev->result)); + /* XXXMLG Don't pound on bad servers. */ + if (address_type == DNS_ADBFIND_INET) { + name->expire_v4 = ISC_MIN(name->expire_v4, now + 300); + name->fetch_err = FIND_ERR_FAILURE; + inc_stats(adb, dns_resstatscounter_gluefetchv4fail); + } else { + name->expire_v6 = ISC_MIN(name->expire_v6, now + 300); + name->fetch6_err = FIND_ERR_FAILURE; + inc_stats(adb, dns_resstatscounter_gluefetchv6fail); + } + goto out; + } + + /* + * We got something potentially useful. + */ + result = import_rdataset(name, &fetch->rdataset, now); check_result: - if (result == ISC_R_SUCCESS) { - ev_status = DNS_EVENT_ADBMOREADDRESSES; - if (address_type == DNS_ADBFIND_INET) - name->fetch_err = FIND_ERR_SUCCESS; - else - name->fetch6_err = FIND_ERR_SUCCESS; - } + if (result == ISC_R_SUCCESS) { + ev_status = DNS_EVENT_ADBMOREADDRESSES; + if (address_type == DNS_ADBFIND_INET) + name->fetch_err = FIND_ERR_SUCCESS; + else + name->fetch6_err = FIND_ERR_SUCCESS; + } out: - free_adbfetch(adb, &fetch); - isc_event_free(&ev); + free_adbfetch(adb, &fetch); + isc_event_free(&ev); - clean_finds_at_name(name, ev_status, address_type); + clean_finds_at_name(name, ev_status, address_type); - UNLOCK(&adb->namelocks[bucket]); + UNLOCK(&adb->namelocks[bucket]); } static isc_result_t fetch_name(dns_adbname_t *adbname, - isc_boolean_t start_at_zone, - dns_rdatatype_t type) + isc_boolean_t start_at_zone, + dns_rdatatype_t type) { - isc_result_t result; - dns_adbfetch_t *fetch = NULL; - dns_adb_t *adb; - dns_fixedname_t fixed; - dns_name_t *name; - dns_rdataset_t rdataset; - dns_rdataset_t *nameservers; - unsigned int options; - - INSIST(DNS_ADBNAME_VALID(adbname)); - adb = adbname->adb; - INSIST(DNS_ADB_VALID(adb)); - - INSIST((type == dns_rdatatype_a && !NAME_FETCH_V4(adbname)) || - (type == dns_rdatatype_aaaa && !NAME_FETCH_V6(adbname))); - - adbname->fetch_err = FIND_ERR_NOTFOUND; - - name = NULL; - nameservers = NULL; - dns_rdataset_init(&rdataset); - - options = DNS_FETCHOPT_NOVALIDATE; - if (start_at_zone) { - DP(ENTER_LEVEL, - "fetch_name: starting at zone for name %p", - adbname); - dns_fixedname_init(&fixed); - name = dns_fixedname_name(&fixed); - result = dns_view_findzonecut2(adb->view, &adbname->name, name, - 0, 0, ISC_TRUE, ISC_FALSE, - &rdataset, NULL); - if (result != ISC_R_SUCCESS && result != DNS_R_HINT) - goto cleanup; - nameservers = &rdataset; - options |= DNS_FETCHOPT_UNSHARED; - } - - fetch = new_adbfetch(adb); - if (fetch == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup; - } - - result = dns_resolver_createfetch(adb->view->resolver, &adbname->name, - type, name, nameservers, NULL, - options, adb->task, fetch_callback, - adbname, &fetch->rdataset, NULL, - &fetch->fetch); - if (result != ISC_R_SUCCESS) - goto cleanup; - - if (type == dns_rdatatype_a) - adbname->fetch_a = fetch; - else - adbname->fetch_aaaa = fetch; - fetch = NULL; /* Keep us from cleaning this up below. */ + isc_result_t result; + dns_adbfetch_t *fetch = NULL; + dns_adb_t *adb; + dns_fixedname_t fixed; + dns_name_t *name; + dns_rdataset_t rdataset; + dns_rdataset_t *nameservers; + unsigned int options; + + INSIST(DNS_ADBNAME_VALID(adbname)); + adb = adbname->adb; + INSIST(DNS_ADB_VALID(adb)); + + INSIST((type == dns_rdatatype_a && !NAME_FETCH_V4(adbname)) || + (type == dns_rdatatype_aaaa && !NAME_FETCH_V6(adbname))); + + adbname->fetch_err = FIND_ERR_NOTFOUND; + + name = NULL; + nameservers = NULL; + dns_rdataset_init(&rdataset); + + options = DNS_FETCHOPT_NOVALIDATE; + if (start_at_zone) { + DP(ENTER_LEVEL, + "fetch_name: starting at zone for name %p", + adbname); + dns_fixedname_init(&fixed); + name = dns_fixedname_name(&fixed); + result = dns_view_findzonecut2(adb->view, &adbname->name, name, + 0, 0, ISC_TRUE, ISC_FALSE, + &rdataset, NULL); + if (result != ISC_R_SUCCESS && result != DNS_R_HINT) + goto cleanup; + nameservers = &rdataset; + options |= DNS_FETCHOPT_UNSHARED; + } + + fetch = new_adbfetch(adb); + if (fetch == NULL) { + result = ISC_R_NOMEMORY; + goto cleanup; + } + + result = dns_resolver_createfetch(adb->view->resolver, &adbname->name, + type, name, nameservers, NULL, + options, adb->task, fetch_callback, + adbname, &fetch->rdataset, NULL, + &fetch->fetch); + if (result != ISC_R_SUCCESS) + goto cleanup; + + if (type == dns_rdatatype_a) { + adbname->fetch_a = fetch; + inc_stats(adb, dns_resstatscounter_gluefetchv4); + } else { + adbname->fetch_aaaa = fetch; + inc_stats(adb, dns_resstatscounter_gluefetchv6); + } + fetch = NULL; /* Keep us from cleaning this up below. */ cleanup: - if (fetch != NULL) - free_adbfetch(adb, &fetch); - if (dns_rdataset_isassociated(&rdataset)) - dns_rdataset_disassociate(&rdataset); + if (fetch != NULL) + free_adbfetch(adb, &fetch); + if (dns_rdataset_isassociated(&rdataset)) + dns_rdataset_disassociate(&rdataset); - return (result); + return (result); } /* @@ -3544,315 +3346,271 @@ fetch_name(dns_adbname_t *adbname, */ isc_result_t dns_adb_marklame(dns_adb_t *adb, dns_adbaddrinfo_t *addr, dns_name_t *qname, - dns_rdatatype_t qtype, isc_stdtime_t expire_time) + dns_rdatatype_t qtype, isc_stdtime_t expire_time) { - dns_adblameinfo_t *li; - int bucket; - isc_result_t result = ISC_R_SUCCESS; - - REQUIRE(DNS_ADB_VALID(adb)); - REQUIRE(DNS_ADBADDRINFO_VALID(addr)); - REQUIRE(qname != NULL); - - bucket = addr->entry->lock_bucket; - LOCK(&adb->entrylocks[bucket]); - li = ISC_LIST_HEAD(addr->entry->lameinfo); - while (li != NULL && - (li->qtype != qtype || !dns_name_equal(qname, &li->qname))) - li = ISC_LIST_NEXT(li, plink); - if (li != NULL) { - if (expire_time > li->lame_timer) - li->lame_timer = expire_time; - goto unlock; - } - li = new_adblameinfo(adb, qname, qtype); - if (li == NULL) { - result = ISC_R_NOMEMORY; - goto unlock; - } - - li->lame_timer = expire_time; - - ISC_LIST_PREPEND(addr->entry->lameinfo, li, plink); + dns_adblameinfo_t *li; + int bucket; + isc_result_t result = ISC_R_SUCCESS; + + REQUIRE(DNS_ADB_VALID(adb)); + REQUIRE(DNS_ADBADDRINFO_VALID(addr)); + REQUIRE(qname != NULL); + + bucket = addr->entry->lock_bucket; + LOCK(&adb->entrylocks[bucket]); + li = ISC_LIST_HEAD(addr->entry->lameinfo); + while (li != NULL && + (li->qtype != qtype || !dns_name_equal(qname, &li->qname))) + li = ISC_LIST_NEXT(li, plink); + if (li != NULL) { + if (expire_time > li->lame_timer) + li->lame_timer = expire_time; + goto unlock; + } + li = new_adblameinfo(adb, qname, qtype); + if (li == NULL) { + result = ISC_R_NOMEMORY; + goto unlock; + } + + li->lame_timer = expire_time; + + ISC_LIST_PREPEND(addr->entry->lameinfo, li, plink); unlock: - UNLOCK(&adb->entrylocks[bucket]); + UNLOCK(&adb->entrylocks[bucket]); - return (result); + return (result); } void dns_adb_adjustsrtt(dns_adb_t *adb, dns_adbaddrinfo_t *addr, - unsigned int rtt, unsigned int factor) + unsigned int rtt, unsigned int factor) { - int bucket; - unsigned int new_srtt; - isc_stdtime_t now; + int bucket; + unsigned int new_srtt; + isc_stdtime_t now; - REQUIRE(DNS_ADB_VALID(adb)); - REQUIRE(DNS_ADBADDRINFO_VALID(addr)); - REQUIRE(factor <= 10); + REQUIRE(DNS_ADB_VALID(adb)); + REQUIRE(DNS_ADBADDRINFO_VALID(addr)); + REQUIRE(factor <= 10); - bucket = addr->entry->lock_bucket; - LOCK(&adb->entrylocks[bucket]); + bucket = addr->entry->lock_bucket; + LOCK(&adb->entrylocks[bucket]); - if (factor == DNS_ADB_RTTADJAGE) - new_srtt = addr->entry->srtt * 98 / 100; - else - new_srtt = (addr->entry->srtt / 10 * factor) - + (rtt / 10 * (10 - factor)); + if (factor == DNS_ADB_RTTADJAGE) + new_srtt = addr->entry->srtt * 98 / 100; + else + new_srtt = (addr->entry->srtt / 10 * factor) + + (rtt / 10 * (10 - factor)); - addr->entry->srtt = new_srtt; - addr->srtt = new_srtt; + addr->entry->srtt = new_srtt; + addr->srtt = new_srtt; - isc_stdtime_get(&now); - addr->entry->expires = now + ADB_ENTRY_WINDOW; + isc_stdtime_get(&now); + addr->entry->expires = now + ADB_ENTRY_WINDOW; - UNLOCK(&adb->entrylocks[bucket]); + UNLOCK(&adb->entrylocks[bucket]); } void dns_adb_changeflags(dns_adb_t *adb, dns_adbaddrinfo_t *addr, - unsigned int bits, unsigned int mask) + unsigned int bits, unsigned int mask) { - int bucket; + int bucket; - REQUIRE(DNS_ADB_VALID(adb)); - REQUIRE(DNS_ADBADDRINFO_VALID(addr)); + REQUIRE(DNS_ADB_VALID(adb)); + REQUIRE(DNS_ADBADDRINFO_VALID(addr)); - bucket = addr->entry->lock_bucket; - LOCK(&adb->entrylocks[bucket]); + bucket = addr->entry->lock_bucket; + LOCK(&adb->entrylocks[bucket]); - addr->entry->flags = (addr->entry->flags & ~mask) | (bits & mask); - /* - * Note that we do not update the other bits in addr->flags with - * the most recent values from addr->entry->flags. - */ - addr->flags = (addr->flags & ~mask) | (bits & mask); + addr->entry->flags = (addr->entry->flags & ~mask) | (bits & mask); + /* + * Note that we do not update the other bits in addr->flags with + * the most recent values from addr->entry->flags. + */ + addr->flags = (addr->flags & ~mask) | (bits & mask); - UNLOCK(&adb->entrylocks[bucket]); + UNLOCK(&adb->entrylocks[bucket]); } isc_result_t dns_adb_findaddrinfo(dns_adb_t *adb, isc_sockaddr_t *sa, - dns_adbaddrinfo_t **addrp, isc_stdtime_t now) + dns_adbaddrinfo_t **addrp, isc_stdtime_t now) { - int bucket; - dns_adbentry_t *entry; - dns_adbaddrinfo_t *addr; - isc_result_t result; - in_port_t port; - - REQUIRE(DNS_ADB_VALID(adb)); - REQUIRE(addrp != NULL && *addrp == NULL); - - UNUSED(now); - - result = ISC_R_SUCCESS; - bucket = DNS_ADB_INVALIDBUCKET; - entry = find_entry_and_lock(adb, sa, &bucket); - if (adb->entry_sd[bucket]) { - result = ISC_R_SHUTTINGDOWN; - goto unlock; - } - if (entry == NULL) { - /* - * We don't know anything about this address. - */ - entry = new_adbentry(adb); - if (entry == NULL) { - result = ISC_R_NOMEMORY; - goto unlock; - } - entry->sockaddr = *sa; - link_entry(adb, bucket, entry); - DP(ENTER_LEVEL, "findaddrinfo: new entry %p", entry); - } else - DP(ENTER_LEVEL, "findaddrinfo: found entry %p", entry); - - port = isc_sockaddr_getport(sa); - addr = new_adbaddrinfo(adb, entry, port); - if (addr == NULL) { - result = ISC_R_NOMEMORY; - } else { - inc_entry_refcnt(adb, entry, ISC_FALSE); - *addrp = addr; - } + int bucket; + dns_adbentry_t *entry; + dns_adbaddrinfo_t *addr; + isc_result_t result; + in_port_t port; + + REQUIRE(DNS_ADB_VALID(adb)); + REQUIRE(addrp != NULL && *addrp == NULL); + + UNUSED(now); + + result = ISC_R_SUCCESS; + bucket = DNS_ADB_INVALIDBUCKET; + entry = find_entry_and_lock(adb, sa, &bucket); + if (adb->entry_sd[bucket]) { + result = ISC_R_SHUTTINGDOWN; + goto unlock; + } + if (entry == NULL) { + /* + * We don't know anything about this address. + */ + entry = new_adbentry(adb); + if (entry == NULL) { + result = ISC_R_NOMEMORY; + goto unlock; + } + entry->sockaddr = *sa; + link_entry(adb, bucket, entry); + DP(ENTER_LEVEL, "findaddrinfo: new entry %p", entry); + } else + DP(ENTER_LEVEL, "findaddrinfo: found entry %p", entry); + + port = isc_sockaddr_getport(sa); + addr = new_adbaddrinfo(adb, entry, port); + if (addr == NULL) { + result = ISC_R_NOMEMORY; + } else { + inc_entry_refcnt(adb, entry, ISC_FALSE); + *addrp = addr; + } unlock: - UNLOCK(&adb->entrylocks[bucket]); + UNLOCK(&adb->entrylocks[bucket]); - return (result); + return (result); } void dns_adb_freeaddrinfo(dns_adb_t *adb, dns_adbaddrinfo_t **addrp) { - dns_adbaddrinfo_t *addr; - dns_adbentry_t *entry; - int bucket; - isc_stdtime_t now; - isc_boolean_t want_check_exit = ISC_FALSE; + dns_adbaddrinfo_t *addr; + dns_adbentry_t *entry; + int bucket; + isc_stdtime_t now; + isc_boolean_t want_check_exit = ISC_FALSE; - REQUIRE(DNS_ADB_VALID(adb)); - REQUIRE(addrp != NULL); - addr = *addrp; - REQUIRE(DNS_ADBADDRINFO_VALID(addr)); - entry = addr->entry; - REQUIRE(DNS_ADBENTRY_VALID(entry)); + REQUIRE(DNS_ADB_VALID(adb)); + REQUIRE(addrp != NULL); + addr = *addrp; + REQUIRE(DNS_ADBADDRINFO_VALID(addr)); + entry = addr->entry; + REQUIRE(DNS_ADBENTRY_VALID(entry)); - isc_stdtime_get(&now); + isc_stdtime_get(&now); - *addrp = NULL; + *addrp = NULL; - bucket = addr->entry->lock_bucket; - LOCK(&adb->entrylocks[bucket]); + bucket = addr->entry->lock_bucket; + LOCK(&adb->entrylocks[bucket]); - entry->expires = now + ADB_ENTRY_WINDOW; + entry->expires = now + ADB_ENTRY_WINDOW; - want_check_exit = dec_entry_refcnt(adb, entry, ISC_FALSE); + want_check_exit = dec_entry_refcnt(adb, entry, ISC_FALSE); - UNLOCK(&adb->entrylocks[bucket]); + UNLOCK(&adb->entrylocks[bucket]); - addr->entry = NULL; - free_adbaddrinfo(adb, &addr); + addr->entry = NULL; + free_adbaddrinfo(adb, &addr); - if (want_check_exit) { - LOCK(&adb->lock); - check_exit(adb); - UNLOCK(&adb->lock); - } + if (want_check_exit) { + LOCK(&adb->lock); + check_exit(adb); + UNLOCK(&adb->lock); + } } void dns_adb_flush(dns_adb_t *adb) { - unsigned int i; + unsigned int i; - INSIST(DNS_ADB_VALID(adb)); + INSIST(DNS_ADB_VALID(adb)); - LOCK(&adb->lock); + LOCK(&adb->lock); - /* - * Call our cleanup routines. - */ - for (i = 0; i < NBUCKETS; i++) - RUNTIME_CHECK(cleanup_names(adb, i, INT_MAX) == ISC_FALSE); - for (i = 0; i < NBUCKETS; i++) - RUNTIME_CHECK(cleanup_entries(adb, i, INT_MAX) == ISC_FALSE); + /* + * Call our cleanup routines. + */ + for (i = 0; i < NBUCKETS; i++) + RUNTIME_CHECK(cleanup_names(adb, i, INT_MAX) == ISC_FALSE); + for (i = 0; i < NBUCKETS; i++) + RUNTIME_CHECK(cleanup_entries(adb, i, INT_MAX) == ISC_FALSE); #ifdef DUMP_ADB_AFTER_CLEANING - dump_adb(adb, stdout, ISC_TRUE, INT_MAX); + dump_adb(adb, stdout, ISC_TRUE, INT_MAX); #endif - UNLOCK(&adb->lock); + UNLOCK(&adb->lock); } void dns_adb_flushname(dns_adb_t *adb, dns_name_t *name) { - dns_adbname_t *adbname; - dns_adbname_t *nextname; - int bucket; - - INSIST(DNS_ADB_VALID(adb)); - - LOCK(&adb->lock); - bucket = dns_name_hash(name, ISC_FALSE) % NBUCKETS; - LOCK(&adb->namelocks[bucket]); - adbname = ISC_LIST_HEAD(adb->names[bucket]); - while (adbname != NULL) { - nextname = ISC_LIST_NEXT(adbname, plink); - if (!NAME_DEAD(adbname) && - dns_name_equal(name, &adbname->name)) { - RUNTIME_CHECK(kill_name(&adbname, - DNS_EVENT_ADBCANCELED, - ISC_TRUE) == - ISC_FALSE); - } - adbname = nextname; - } - UNLOCK(&adb->namelocks[bucket]); - UNLOCK(&adb->lock); + dns_adbname_t *adbname; + dns_adbname_t *nextname; + int bucket; + + INSIST(DNS_ADB_VALID(adb)); + + LOCK(&adb->lock); + bucket = dns_name_hash(name, ISC_FALSE) % NBUCKETS; + LOCK(&adb->namelocks[bucket]); + adbname = ISC_LIST_HEAD(adb->names[bucket]); + while (adbname != NULL) { + nextname = ISC_LIST_NEXT(adbname, plink); + if (!NAME_DEAD(adbname) && + dns_name_equal(name, &adbname->name)) { + RUNTIME_CHECK(kill_name(&adbname, + DNS_EVENT_ADBCANCELED, + ISC_TRUE) == + ISC_FALSE); + } + adbname = nextname; + } + UNLOCK(&adb->namelocks[bucket]); + UNLOCK(&adb->lock); } static void water(void *arg, int mark) { - dns_adb_t *adb = arg; - isc_boolean_t overmem = ISC_TF(mark == ISC_MEM_HIWATER); + dns_adb_t *adb = arg; + isc_boolean_t overmem = ISC_TF(mark == ISC_MEM_HIWATER); - REQUIRE(DNS_ADB_VALID(adb)); + REQUIRE(DNS_ADB_VALID(adb)); - DP(ISC_LOG_DEBUG(1), - "adb reached %s water mark", overmem ? "high" : "low"); + DP(ISC_LOG_DEBUG(1), + "adb reached %s water mark", overmem ? "high" : "low"); - adb->overmem = overmem; -#if 0 /* we don't need this timer for the new cleaning policy. */ - if (overmem) { - isc_interval_t interval; - - isc_interval_set(&interval, 0, 1); - (void)isc_timer_reset(adb->timer, isc_timertype_once, NULL, - &interval, ISC_TRUE); - } -#endif + /* + * 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 dns_adb_setadbsize(dns_adb_t *adb, isc_uint32_t size) { - isc_uint32_t hiwater; - isc_uint32_t lowater; + isc_uint32_t hiwater; + isc_uint32_t lowater; - INSIST(DNS_ADB_VALID(adb)); + INSIST(DNS_ADB_VALID(adb)); - if (size != 0 && size < DNS_ADB_MINADBSIZE) - size = DNS_ADB_MINADBSIZE; + if (size != 0 && size < DNS_ADB_MINADBSIZE) + size = DNS_ADB_MINADBSIZE; - hiwater = size - (size >> 3); /* Approximately 7/8ths. */ - lowater = size - (size >> 2); /* Approximately 3/4ths. */ - - if (size == 0 || hiwater == 0 || lowater == 0) - isc_mem_setwater(adb->mctx, water, adb, 0, 0); - else - isc_mem_setwater(adb->mctx, water, adb, hiwater, lowater); -} + hiwater = size - (size >> 3); /* Approximately 7/8ths. */ + lowater = size - (size >> 2); /* Approximately 3/4ths. */ -#ifdef LRU_DEBUG -/* - * Periodic dumping of the internal state of the statistics. - * This will dump the cache contents, uses, record types, etc. - */ -static void -timer_dump(isc_task_t *task, isc_event_t *ev) { - dns_adb_t *adb; - isc_interval_t interval; - isc_time_t nexttime; - - UNUSED(task); - - adb = ev->ev_arg; - INSIST(DNS_ADB_VALID(adb)); - - LOCK(&adb->lock); - if (adb->nname > 0 || adb->nentry > 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_ADB, ISC_LOG_INFO, - "ADB memory usage %p: mem inuse %lu, " - "%u/%u names, %u/%u entries, " - "purge/scan=%u(%u,%u)/%u, overmem=%d", - adb, (unsigned long)isc_mem_inuse(adb->mctx), - adb->nname, adb->nname_total, - adb->nentry, adb->nentry_total, - adb->stale_purge, adb->stale_expire, - adb->stale_lru, adb->stale_scan, adb->overmem); - } - - interval.seconds = DUMP_INTERVAL; - interval.nanoseconds = 0; - - RUNTIME_CHECK(isc_time_add(&adb->dump_time, &interval, &nexttime) == - ISC_R_SUCCESS); /* XXX: this is not always true */ - adb->dump_time = nexttime; - (void)isc_timer_reset(adb->dump_timer, isc_timertype_once, - &adb->dump_time, NULL, ISC_FALSE); - UNLOCK(&adb->lock); - - isc_event_free(&ev); + if (size == 0 || hiwater == 0 || lowater == 0) + isc_mem_setwater(adb->mctx, water, adb, 0, 0); + else + isc_mem_setwater(adb->mctx, water, adb, hiwater, lowater); } -#endif diff --git a/lib/dns/api b/lib/dns/api index 58fb9f89..5dee1eec 100644 --- a/lib/dns/api +++ b/lib/dns/api @@ -1,3 +1,3 @@ -LIBINTERFACE = 41 -LIBREVISION = 0 +LIBINTERFACE = 42 +LIBREVISION = 1 LIBAGE = 0 diff --git a/lib/dns/cache.c b/lib/dns/cache.c index cd384205..6f1e189b 100644 --- a/lib/dns/cache.c +++ b/lib/dns/cache.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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,13 +15,14 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: cache.c,v 1.76 2007/10/19 17:15:53 explorer Exp $ */ +/* $Id: cache.c,v 1.76.36.3 2008/05/01 18:32:31 jinmei Exp $ */ /*! \file */ #include <config.h> #include <isc/mem.h> +#include <isc/string.h> #include <isc/task.h> #include <isc/time.h> #include <isc/timer.h> @@ -39,24 +40,24 @@ #include <dns/rdatasetiter.h> #include <dns/result.h> -#define CACHE_MAGIC ISC_MAGIC('$', '$', '$', '$') -#define VALID_CACHE(cache) ISC_MAGIC_VALID(cache, CACHE_MAGIC) +#define CACHE_MAGIC ISC_MAGIC('$', '$', '$', '$') +#define VALID_CACHE(cache) ISC_MAGIC_VALID(cache, CACHE_MAGIC) /*! * Control incremental cleaning. * DNS_CACHE_MINSIZE is how many bytes is the floor for dns_cache_setcachesize(). * See also DNS_CACHE_CLEANERINCREMENT */ -#define DNS_CACHE_MINSIZE 2097152 /*%< Bytes. 2097152 = 2 MB */ +#define DNS_CACHE_MINSIZE 2097152 /*%< Bytes. 2097152 = 2 MB */ /*! * Control incremental cleaning. * CLEANERINCREMENT is how many nodes are examined in one pass. * See also DNS_CACHE_MINSIZE */ -#define DNS_CACHE_CLEANERINCREMENT 1000U /*%< Number of nodes. */ +#define DNS_CACHE_CLEANERINCREMENT 1000U /*%< Number of nodes. */ /*** - *** Types + *** Types ***/ /* @@ -67,40 +68,48 @@ typedef struct cache_cleaner cache_cleaner_t; typedef enum { - cleaner_s_idle, /*%< Waiting for cleaning-interval to expire. */ - cleaner_s_busy, /*%< Currently cleaning. */ - cleaner_s_done /*%< Freed enough memory after being overmem. */ + cleaner_s_idle, /*%< Waiting for cleaning-interval to expire. */ + cleaner_s_busy, /*%< Currently cleaning. */ + cleaner_s_done /*%< Freed enough memory after being overmem. */ } cleaner_state_t; /* * Convenience macros for comprehensive assertion checking. */ -#define CLEANER_IDLE(c) ((c)->state == cleaner_s_idle) -#define CLEANER_BUSY(c) ((c)->state == cleaner_s_busy) +#define CLEANER_IDLE(c) ((c)->state == cleaner_s_idle && \ + (c)->resched_event != NULL) +#define CLEANER_BUSY(c) ((c)->state == cleaner_s_busy && \ + (c)->iterator != NULL && \ + (c)->resched_event == NULL) /*% * Accesses to a cache cleaner object are synchronized through * task/event serialization, or locked from the cache object. */ struct cache_cleaner { - isc_mutex_t lock; - /*%< - * Locks overmem. Note: never allocate memory - * while holding this lock - that could lead to deadlock since - * the lock is take by water() which is called from the memory - * allocator. - */ - - dns_cache_t *cache; - isc_task_t *task; - unsigned int cleaning_interval; /*% The cleaning-interval from - named.conf, in seconds. */ - isc_timer_t *cleaning_timer; - - unsigned int increment; /*% Number of names to - clean in one increment */ - cleaner_state_t state; /*% Idle/Busy. */ - isc_boolean_t overmem; /*% The cache is in an overmem state. */ + isc_mutex_t lock; + /*%< + * Locks overmem_event, overmem. Note: never allocate memory + * while holding this lock - that could lead to deadlock since + * the lock is take by water() which is called from the memory + * allocator. + */ + + dns_cache_t *cache; + isc_task_t *task; + unsigned int cleaning_interval; /*% The cleaning-interval from + named.conf, in seconds. */ + isc_timer_t *cleaning_timer; + isc_event_t *resched_event; /*% Sent by cleaner task to + itself to reschedule */ + isc_event_t *overmem_event; + + dns_dbiterator_t *iterator; + unsigned int increment; /*% Number of names to + clean in one increment */ + cleaner_state_t state; /*% Idle/Busy. */ + isc_boolean_t overmem; /*% The cache is in an overmem state. */ + isc_boolean_t replaceiterator; }; /*% @@ -108,434 +117,371 @@ struct cache_cleaner { */ struct dns_cache { - /* Unlocked. */ - unsigned int magic; - isc_mutex_t lock; - isc_mutex_t filelock; - isc_mem_t *mctx; - - /* Locked by 'lock'. */ - int references; - int live_tasks; - dns_rdataclass_t rdclass; - dns_db_t *db; - cache_cleaner_t cleaner; - char *db_type; - int db_argc; - char **db_argv; - - /* Locked by 'filelock'. */ - char * filename; - /* Access to the on-disk cache file is also locked by 'filelock'. */ - -#ifdef LRU_DEBUG -#define DUMP_INTERVAL 30 /* seconds */ - isc_timer_t *dump_timer; /* for test */ - isc_time_t dump_time; /* for test */ -#endif + /* Unlocked. */ + unsigned int magic; + isc_mutex_t lock; + isc_mutex_t filelock; + isc_mem_t *mctx; + + /* Locked by 'lock'. */ + int references; + int live_tasks; + dns_rdataclass_t rdclass; + dns_db_t *db; + cache_cleaner_t cleaner; + char *db_type; + int db_argc; + char **db_argv; + + /* Locked by 'filelock'. */ + char *filename; + /* Access to the on-disk cache file is also locked by 'filelock'. */ }; /*** - *** Functions + *** Functions ***/ static isc_result_t cache_cleaner_init(dns_cache_t *cache, isc_taskmgr_t *taskmgr, - isc_timermgr_t *timermgr, cache_cleaner_t *cleaner); + isc_timermgr_t *timermgr, cache_cleaner_t *cleaner); static void cleaning_timer_action(isc_task_t *task, isc_event_t *event); static void -cleaner_shutdown_action(isc_task_t *task, isc_event_t *event); +incremental_cleaning_action(isc_task_t *task, isc_event_t *event); -#ifdef LRU_DEBUG static void -timer_dump(isc_task_t *task, isc_event_t *event); -#endif +cleaner_shutdown_action(isc_task_t *task, isc_event_t *event); -#if 0 /* This is no longer needed. When LRU_TEST is cleaned up, - * this should be as well. XXXMLG */ -/*% - * Work out how many nodes can be cleaned in the time between two - * requests to the nameserver. Smooth the resulting number and use - * it as a estimate for the number of nodes to be cleaned in the next - * iteration. - */ static void -adjust_increment(cache_cleaner_t *cleaner, unsigned int remaining, - isc_time_t *start) -{ - isc_time_t end; - isc_uint64_t usecs; - isc_uint64_t new; - unsigned int pps = dns_pps; - unsigned int interval; - unsigned int names; - - /* - * Tune for minumum of 100 packets per second (pps). - */ - if (pps < 100) - pps = 100; - - isc_time_now(&end); - - interval = 1000000 / pps; /* Interval between packets in usecs. */ - if (interval == 0) - interval = 1; - - INSIST(cleaner->increment >= remaining); - names = cleaner->increment - remaining; - usecs = isc_time_microdiff(&end, start); - - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_CACHE, - ISC_LOG_DEBUG(1), "adjust_increment interval=%u " - "names=%u usec=%" ISC_PLATFORM_QUADFORMAT "u", - interval, names, usecs); - - if (usecs == 0) { - /* - * If we cleaned all the nodes in unmeasurable time - * double the number of nodes to be cleaned next time. - */ - if (names == cleaner->increment) { - cleaner->increment *= 2; - if (cleaner->increment > DNS_CACHE_CLEANERINCREMENT) - cleaner->increment = DNS_CACHE_CLEANERINCREMENT; - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_CACHE, ISC_LOG_DEBUG(1), - "%p:new cleaner->increment = %u\n", - cleaner, cleaner->increment); - } - return; - } - - new = (names * interval); - new /= (usecs * 2); - if (new == 0) - new = 1; - - /* Smooth */ - new = (new + cleaner->increment * 7) / 8; - - if (new > DNS_CACHE_CLEANERINCREMENT) - new = DNS_CACHE_CLEANERINCREMENT; - - cleaner->increment = (unsigned int)new; - - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_CACHE, - ISC_LOG_DEBUG(1), "%p:new cleaner->increment = %u\n", - cleaner, cleaner->increment); -} -#endif +overmem_cleaning_action(isc_task_t *task, isc_event_t *event); static inline isc_result_t cache_create_db(dns_cache_t *cache, dns_db_t **db) { - return (dns_db_create(cache->mctx, cache->db_type, dns_rootname, - dns_dbtype_cache, cache->rdclass, - cache->db_argc, cache->db_argv, db)); + return (dns_db_create(cache->mctx, cache->db_type, dns_rootname, + dns_dbtype_cache, cache->rdclass, + cache->db_argc, cache->db_argv, db)); } isc_result_t dns_cache_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr, - isc_timermgr_t *timermgr, dns_rdataclass_t rdclass, - const char *db_type, unsigned int db_argc, char **db_argv, - dns_cache_t **cachep) + isc_timermgr_t *timermgr, dns_rdataclass_t rdclass, + const char *db_type, unsigned int db_argc, char **db_argv, + dns_cache_t **cachep) { - isc_result_t result; - dns_cache_t *cache; - int i; - - REQUIRE(cachep != NULL); - REQUIRE(*cachep == NULL); - REQUIRE(mctx != NULL); - - cache = isc_mem_get(mctx, sizeof(*cache)); - if (cache == NULL) - return (ISC_R_NOMEMORY); - - cache->mctx = NULL; - isc_mem_attach(mctx, &cache->mctx); - - result = isc_mutex_init(&cache->lock); - if (result != ISC_R_SUCCESS) - goto cleanup_mem; - - result = isc_mutex_init(&cache->filelock); - if (result != ISC_R_SUCCESS) - goto cleanup_lock; - - cache->references = 1; - cache->live_tasks = 0; - cache->rdclass = rdclass; - - cache->db_type = isc_mem_strdup(mctx, db_type); - if (cache->db_type == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup_filelock; - } - - cache->db_argc = db_argc; - if (cache->db_argc == 0) - cache->db_argv = NULL; - else { - cache->db_argv = isc_mem_get(mctx, - cache->db_argc * sizeof(char *)); - if (cache->db_argv == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup_dbtype; - } - for (i = 0; i < cache->db_argc; i++) - cache->db_argv[i] = NULL; - for (i = 0; i < cache->db_argc; i++) { - cache->db_argv[i] = isc_mem_strdup(mctx, db_argv[i]); - if (cache->db_argv[i] == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup_dbargv; - } - } - } - - cache->db = NULL; - result = cache_create_db(cache, &cache->db); - if (result != ISC_R_SUCCESS) - goto cleanup_dbargv; - - cache->filename = NULL; - - cache->magic = CACHE_MAGIC; - - result = cache_cleaner_init(cache, taskmgr, timermgr, &cache->cleaner); - if (result != ISC_R_SUCCESS) - goto cleanup_db; - - *cachep = cache; - return (ISC_R_SUCCESS); + isc_result_t result; + dns_cache_t *cache; + int i; + + REQUIRE(cachep != NULL); + REQUIRE(*cachep == NULL); + REQUIRE(mctx != NULL); + + cache = isc_mem_get(mctx, sizeof(*cache)); + if (cache == NULL) + return (ISC_R_NOMEMORY); + + cache->mctx = NULL; + isc_mem_attach(mctx, &cache->mctx); + + result = isc_mutex_init(&cache->lock); + if (result != ISC_R_SUCCESS) + goto cleanup_mem; + + result = isc_mutex_init(&cache->filelock); + if (result != ISC_R_SUCCESS) + goto cleanup_lock; + + cache->references = 1; + cache->live_tasks = 0; + cache->rdclass = rdclass; + + cache->db_type = isc_mem_strdup(mctx, db_type); + if (cache->db_type == NULL) { + result = ISC_R_NOMEMORY; + goto cleanup_filelock; + } + + cache->db_argc = db_argc; + if (cache->db_argc == 0) + cache->db_argv = NULL; + else { + cache->db_argv = isc_mem_get(mctx, + cache->db_argc * sizeof(char *)); + if (cache->db_argv == NULL) { + result = ISC_R_NOMEMORY; + goto cleanup_dbtype; + } + for (i = 0; i < cache->db_argc; i++) + cache->db_argv[i] = NULL; + for (i = 0; i < cache->db_argc; i++) { + cache->db_argv[i] = isc_mem_strdup(mctx, db_argv[i]); + if (cache->db_argv[i] == NULL) { + result = ISC_R_NOMEMORY; + goto cleanup_dbargv; + } + } + } + + cache->db = NULL; + result = cache_create_db(cache, &cache->db); + if (result != ISC_R_SUCCESS) + goto cleanup_dbargv; + + cache->filename = NULL; + + cache->magic = CACHE_MAGIC; + + /* + * RBT-type cache DB has its own mechanism of cache cleaning and doesn't + * need the control of the generic cleaner. + */ + if (strcmp(db_type, "rbt") == 0) + result = cache_cleaner_init(cache, NULL, NULL, &cache->cleaner); + else { + result = cache_cleaner_init(cache, taskmgr, timermgr, + &cache->cleaner); + } + if (result != ISC_R_SUCCESS) + goto cleanup_db; + + *cachep = cache; + return (ISC_R_SUCCESS); cleanup_db: - dns_db_detach(&cache->db); + dns_db_detach(&cache->db); cleanup_dbargv: - for (i = 0; i < cache->db_argc; i++) - if (cache->db_argv[i] != NULL) - isc_mem_free(mctx, cache->db_argv[i]); - if (cache->db_argv != NULL) - isc_mem_put(mctx, cache->db_argv, - cache->db_argc * sizeof(char *)); + for (i = 0; i < cache->db_argc; i++) + if (cache->db_argv[i] != NULL) + isc_mem_free(mctx, cache->db_argv[i]); + if (cache->db_argv != NULL) + isc_mem_put(mctx, cache->db_argv, + cache->db_argc * sizeof(char *)); cleanup_dbtype: - isc_mem_free(mctx, cache->db_type); + isc_mem_free(mctx, cache->db_type); cleanup_filelock: - DESTROYLOCK(&cache->filelock); + DESTROYLOCK(&cache->filelock); cleanup_lock: - DESTROYLOCK(&cache->lock); + DESTROYLOCK(&cache->lock); cleanup_mem: - isc_mem_put(mctx, cache, sizeof(*cache)); - isc_mem_detach(&mctx); - return (result); + isc_mem_put(mctx, cache, sizeof(*cache)); + isc_mem_detach(&mctx); + return (result); } static void cache_free(dns_cache_t *cache) { - isc_mem_t *mctx; - int i; + isc_mem_t *mctx; + int i; - REQUIRE(VALID_CACHE(cache)); - REQUIRE(cache->references == 0); + REQUIRE(VALID_CACHE(cache)); + REQUIRE(cache->references == 0); - isc_mem_setwater(cache->mctx, NULL, NULL, 0, 0); + isc_mem_setwater(cache->mctx, NULL, NULL, 0, 0); - if (cache->cleaner.task != NULL) - isc_task_detach(&cache->cleaner.task); + if (cache->cleaner.task != NULL) + isc_task_detach(&cache->cleaner.task); - DESTROYLOCK(&cache->cleaner.lock); + if (cache->cleaner.overmem_event != NULL) + isc_event_free(&cache->cleaner.overmem_event); - if (cache->filename) { - isc_mem_free(cache->mctx, cache->filename); - cache->filename = NULL; - } + if (cache->cleaner.resched_event != NULL) + isc_event_free(&cache->cleaner.resched_event); - if (cache->db != NULL) - dns_db_detach(&cache->db); + if (cache->cleaner.iterator != NULL) + dns_dbiterator_destroy(&cache->cleaner.iterator); - if (cache->db_argv != NULL) { - for (i = 0; i < cache->db_argc; i++) - if (cache->db_argv[i] != NULL) - isc_mem_free(cache->mctx, cache->db_argv[i]); - isc_mem_put(cache->mctx, cache->db_argv, - cache->db_argc * sizeof(char *)); - } + DESTROYLOCK(&cache->cleaner.lock); - if (cache->db_type != NULL) - isc_mem_free(cache->mctx, cache->db_type); + if (cache->filename) { + isc_mem_free(cache->mctx, cache->filename); + cache->filename = NULL; + } - DESTROYLOCK(&cache->lock); - DESTROYLOCK(&cache->filelock); - cache->magic = 0; - mctx = cache->mctx; - isc_mem_put(cache->mctx, cache, sizeof(*cache)); - isc_mem_detach(&mctx); + if (cache->db != NULL) + dns_db_detach(&cache->db); + + if (cache->db_argv != NULL) { + for (i = 0; i < cache->db_argc; i++) + if (cache->db_argv[i] != NULL) + isc_mem_free(cache->mctx, cache->db_argv[i]); + isc_mem_put(cache->mctx, cache->db_argv, + cache->db_argc * sizeof(char *)); + } + + if (cache->db_type != NULL) + isc_mem_free(cache->mctx, cache->db_type); + + DESTROYLOCK(&cache->lock); + DESTROYLOCK(&cache->filelock); + cache->magic = 0; + mctx = cache->mctx; + isc_mem_put(cache->mctx, cache, sizeof(*cache)); + isc_mem_detach(&mctx); } void dns_cache_attach(dns_cache_t *cache, dns_cache_t **targetp) { - REQUIRE(VALID_CACHE(cache)); - REQUIRE(targetp != NULL && *targetp == NULL); + REQUIRE(VALID_CACHE(cache)); + REQUIRE(targetp != NULL && *targetp == NULL); - LOCK(&cache->lock); - cache->references++; - UNLOCK(&cache->lock); + LOCK(&cache->lock); + cache->references++; + UNLOCK(&cache->lock); - *targetp = cache; + *targetp = cache; } void dns_cache_detach(dns_cache_t **cachep) { - dns_cache_t *cache; - isc_boolean_t free_cache = ISC_FALSE; - - REQUIRE(cachep != NULL); - cache = *cachep; - REQUIRE(VALID_CACHE(cache)); - - LOCK(&cache->lock); - REQUIRE(cache->references > 0); - cache->references--; - if (cache->references == 0) { - cache->cleaner.overmem = ISC_FALSE; - free_cache = ISC_TRUE; - } - - *cachep = NULL; - - if (free_cache) { - /* - * When the cache is shut down, dump it to a file if one is - * specified. - */ - isc_result_t result = dns_cache_dump(cache); - if (result != ISC_R_SUCCESS) - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_CACHE, ISC_LOG_WARNING, - "error dumping cache: %s ", - isc_result_totext(result)); - - /* - * If the cleaner task exists, let it free the cache. - */ - if (cache->live_tasks > 0) { - isc_task_shutdown(cache->cleaner.task); - free_cache = ISC_FALSE; - } - } - - UNLOCK(&cache->lock); - - if (free_cache) - cache_free(cache); + dns_cache_t *cache; + isc_boolean_t free_cache = ISC_FALSE; + + REQUIRE(cachep != NULL); + cache = *cachep; + REQUIRE(VALID_CACHE(cache)); + + LOCK(&cache->lock); + REQUIRE(cache->references > 0); + cache->references--; + if (cache->references == 0) { + cache->cleaner.overmem = ISC_FALSE; + free_cache = ISC_TRUE; + } + + *cachep = NULL; + + if (free_cache) { + /* + * When the cache is shut down, dump it to a file if one is + * specified. + */ + isc_result_t result = dns_cache_dump(cache); + if (result != ISC_R_SUCCESS) + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_CACHE, ISC_LOG_WARNING, + "error dumping cache: %s ", + isc_result_totext(result)); + + /* + * If the cleaner task exists, let it free the cache. + */ + if (cache->live_tasks > 0) { + isc_task_shutdown(cache->cleaner.task); + free_cache = ISC_FALSE; + } + } + + UNLOCK(&cache->lock); + + if (free_cache) + cache_free(cache); } void dns_cache_attachdb(dns_cache_t *cache, dns_db_t **dbp) { - REQUIRE(VALID_CACHE(cache)); - REQUIRE(dbp != NULL && *dbp == NULL); - REQUIRE(cache->db != NULL); + REQUIRE(VALID_CACHE(cache)); + REQUIRE(dbp != NULL && *dbp == NULL); + REQUIRE(cache->db != NULL); - LOCK(&cache->lock); - dns_db_attach(cache->db, dbp); - UNLOCK(&cache->lock); + LOCK(&cache->lock); + dns_db_attach(cache->db, dbp); + UNLOCK(&cache->lock); } isc_result_t dns_cache_setfilename(dns_cache_t *cache, const char *filename) { - char *newname; + char *newname; - REQUIRE(VALID_CACHE(cache)); - REQUIRE(filename != NULL); + REQUIRE(VALID_CACHE(cache)); + REQUIRE(filename != NULL); - newname = isc_mem_strdup(cache->mctx, filename); - if (newname == NULL) - return (ISC_R_NOMEMORY); + newname = isc_mem_strdup(cache->mctx, filename); + if (newname == NULL) + return (ISC_R_NOMEMORY); - LOCK(&cache->filelock); - if (cache->filename) - isc_mem_free(cache->mctx, cache->filename); - cache->filename = newname; - UNLOCK(&cache->filelock); + LOCK(&cache->filelock); + if (cache->filename) + isc_mem_free(cache->mctx, cache->filename); + cache->filename = newname; + UNLOCK(&cache->filelock); - return (ISC_R_SUCCESS); + return (ISC_R_SUCCESS); } isc_result_t dns_cache_load(dns_cache_t *cache) { - isc_result_t result; + isc_result_t result; - REQUIRE(VALID_CACHE(cache)); + REQUIRE(VALID_CACHE(cache)); - if (cache->filename == NULL) - return (ISC_R_SUCCESS); + if (cache->filename == NULL) + return (ISC_R_SUCCESS); - LOCK(&cache->filelock); - result = dns_db_load(cache->db, cache->filename); - UNLOCK(&cache->filelock); + LOCK(&cache->filelock); + result = dns_db_load(cache->db, cache->filename); + UNLOCK(&cache->filelock); - return (result); + return (result); } isc_result_t dns_cache_dump(dns_cache_t *cache) { - isc_result_t result; + isc_result_t result; - REQUIRE(VALID_CACHE(cache)); + REQUIRE(VALID_CACHE(cache)); - if (cache->filename == NULL) - return (ISC_R_SUCCESS); + if (cache->filename == NULL) + return (ISC_R_SUCCESS); - LOCK(&cache->filelock); - result = dns_master_dump(cache->mctx, cache->db, NULL, - &dns_master_style_cache, cache->filename); - UNLOCK(&cache->filelock); + LOCK(&cache->filelock); + result = dns_master_dump(cache->mctx, cache->db, NULL, + &dns_master_style_cache, cache->filename); + UNLOCK(&cache->filelock); - return (result); + return (result); } void dns_cache_setcleaninginterval(dns_cache_t *cache, unsigned int t) { - isc_interval_t interval; - isc_result_t result; - - LOCK(&cache->lock); - - /* - * It may be the case that the cache has already shut down. - * If so, it has no timer. - */ - if (cache->cleaner.cleaning_timer == NULL) - goto unlock; - - cache->cleaner.cleaning_interval = t; - - if (t == 0) { - result = isc_timer_reset(cache->cleaner.cleaning_timer, - isc_timertype_inactive, - NULL, NULL, ISC_TRUE); - } else { - isc_interval_set(&interval, cache->cleaner.cleaning_interval, - 0); - result = isc_timer_reset(cache->cleaner.cleaning_timer, - isc_timertype_ticker, - NULL, &interval, ISC_FALSE); - } - if (result != ISC_R_SUCCESS) - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_CACHE, ISC_LOG_WARNING, - "could not set cache cleaning interval: %s", - isc_result_totext(result)); + isc_interval_t interval; + isc_result_t result; + + LOCK(&cache->lock); + + /* + * It may be the case that the cache has already shut down. + * If so, it has no timer. + */ + if (cache->cleaner.cleaning_timer == NULL) + goto unlock; + + cache->cleaner.cleaning_interval = t; + + if (t == 0) { + result = isc_timer_reset(cache->cleaner.cleaning_timer, + isc_timertype_inactive, + NULL, NULL, ISC_TRUE); + } else { + isc_interval_set(&interval, cache->cleaner.cleaning_interval, + 0); + result = isc_timer_reset(cache->cleaner.cleaning_timer, + isc_timertype_ticker, + NULL, &interval, ISC_FALSE); + } + if (result != ISC_R_SUCCESS) + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_CACHE, ISC_LOG_WARNING, + "could not set cache cleaning interval: %s", + isc_result_totext(result)); unlock: - UNLOCK(&cache->lock); + UNLOCK(&cache->lock); } /* @@ -545,86 +491,180 @@ dns_cache_setcleaninginterval(dns_cache_t *cache, unsigned int t) { static isc_result_t cache_cleaner_init(dns_cache_t *cache, isc_taskmgr_t *taskmgr, - isc_timermgr_t *timermgr, cache_cleaner_t *cleaner) + isc_timermgr_t *timermgr, cache_cleaner_t *cleaner) { - isc_result_t result; -#ifdef LRU_DEBUG - isc_interval_t interval; -#endif - - result = isc_mutex_init(&cleaner->lock); - if (result != ISC_R_SUCCESS) - goto fail; - - cleaner->increment = DNS_CACHE_CLEANERINCREMENT; - cleaner->state = cleaner_s_idle; - cleaner->cache = cache; - cleaner->overmem = ISC_FALSE; - - cleaner->task = NULL; - cleaner->cleaning_timer = NULL; - - if (taskmgr != NULL && timermgr != NULL) { - result = isc_task_create(taskmgr, 1, &cleaner->task); - if (result != ISC_R_SUCCESS) { - UNEXPECTED_ERROR(__FILE__, __LINE__, - "isc_task_create() failed: %s", - dns_result_totext(result)); - result = ISC_R_UNEXPECTED; - goto cleanup; - } - cleaner->cache->live_tasks++; - isc_task_setname(cleaner->task, "cachecleaner", cleaner); - - result = isc_task_onshutdown(cleaner->task, - cleaner_shutdown_action, cache); - if (result != ISC_R_SUCCESS) { - UNEXPECTED_ERROR(__FILE__, __LINE__, - "cache cleaner: " - "isc_task_onshutdown() failed: %s", - dns_result_totext(result)); - goto cleanup; - } - - cleaner->cleaning_interval = 0; /* Initially turned off. */ - result = isc_timer_create(timermgr, isc_timertype_inactive, - NULL, NULL, - cleaner->task, - cleaning_timer_action, cleaner, - &cleaner->cleaning_timer); - if (result != ISC_R_SUCCESS) { - UNEXPECTED_ERROR(__FILE__, __LINE__, - "isc_timer_create() failed: %s", - dns_result_totext(result)); - result = ISC_R_UNEXPECTED; - goto cleanup; - } - -#ifdef LRU_DEBUG - interval.seconds = DUMP_INTERVAL; - interval.nanoseconds = 0; - RUNTIME_CHECK(isc_time_nowplusinterval(&cache->dump_time, - &interval) == - ISC_R_SUCCESS); - cache->dump_timer = NULL; - result = isc_timer_create(timermgr, isc_timertype_once, - &cache->dump_time, NULL, - cleaner->task, timer_dump, - cache, &cache->dump_timer); - RUNTIME_CHECK(result == ISC_R_SUCCESS); /* for brevity */ -#endif - } - - return (ISC_R_SUCCESS); + isc_result_t result; + + result = isc_mutex_init(&cleaner->lock); + if (result != ISC_R_SUCCESS) + goto fail; + + cleaner->increment = DNS_CACHE_CLEANERINCREMENT; + cleaner->state = cleaner_s_idle; + cleaner->cache = cache; + cleaner->iterator = NULL; + cleaner->overmem = ISC_FALSE; + cleaner->replaceiterator = ISC_FALSE; + + cleaner->task = NULL; + cleaner->cleaning_timer = NULL; + cleaner->resched_event = NULL; + cleaner->overmem_event = NULL; + + result = dns_db_createiterator(cleaner->cache->db, ISC_FALSE, + &cleaner->iterator); + if (result != ISC_R_SUCCESS) + goto cleanup; + + if (taskmgr != NULL && timermgr != NULL) { + result = isc_task_create(taskmgr, 1, &cleaner->task); + if (result != ISC_R_SUCCESS) { + UNEXPECTED_ERROR(__FILE__, __LINE__, + "isc_task_create() failed: %s", + dns_result_totext(result)); + result = ISC_R_UNEXPECTED; + goto cleanup; + } + cleaner->cache->live_tasks++; + isc_task_setname(cleaner->task, "cachecleaner", cleaner); + + result = isc_task_onshutdown(cleaner->task, + cleaner_shutdown_action, cache); + if (result != ISC_R_SUCCESS) { + UNEXPECTED_ERROR(__FILE__, __LINE__, + "cache cleaner: " + "isc_task_onshutdown() failed: %s", + dns_result_totext(result)); + goto cleanup; + } + + cleaner->cleaning_interval = 0; /* Initially turned off. */ + result = isc_timer_create(timermgr, isc_timertype_inactive, + NULL, NULL, cleaner->task, + cleaning_timer_action, cleaner, + &cleaner->cleaning_timer); + if (result != ISC_R_SUCCESS) { + UNEXPECTED_ERROR(__FILE__, __LINE__, + "isc_timer_create() failed: %s", + dns_result_totext(result)); + result = ISC_R_UNEXPECTED; + goto cleanup; + } + + cleaner->resched_event = + isc_event_allocate(cache->mctx, cleaner, + DNS_EVENT_CACHECLEAN, + incremental_cleaning_action, + cleaner, sizeof(isc_event_t)); + if (cleaner->resched_event == NULL) { + result = ISC_R_NOMEMORY; + goto cleanup; + } + + cleaner->overmem_event = + isc_event_allocate(cache->mctx, cleaner, + DNS_EVENT_CACHEOVERMEM, + overmem_cleaning_action, + cleaner, sizeof(isc_event_t)); + if (cleaner->overmem_event == NULL) { + result = ISC_R_NOMEMORY; + goto cleanup; + } + } + + return (ISC_R_SUCCESS); cleanup: - if (cleaner->cleaning_timer != NULL) - isc_timer_detach(&cleaner->cleaning_timer); - if (cleaner->task != NULL) - isc_task_detach(&cleaner->task); - DESTROYLOCK(&cleaner->lock); + if (cleaner->overmem_event != NULL) + isc_event_free(&cleaner->overmem_event); + if (cleaner->resched_event != NULL) + isc_event_free(&cleaner->resched_event); + if (cleaner->cleaning_timer != NULL) + isc_timer_detach(&cleaner->cleaning_timer); + if (cleaner->task != NULL) + isc_task_detach(&cleaner->task); + if (cleaner->iterator != NULL) + dns_dbiterator_destroy(&cleaner->iterator); + DESTROYLOCK(&cleaner->lock); fail: - return (result); + return (result); +} + +static void +begin_cleaning(cache_cleaner_t *cleaner) { + isc_result_t result = ISC_R_SUCCESS; + + REQUIRE(CLEANER_IDLE(cleaner)); + + /* + * Create an iterator, if it does not already exist, and + * position it at the beginning of the cache. + */ + if (cleaner->iterator == NULL) + result = dns_db_createiterator(cleaner->cache->db, ISC_FALSE, + &cleaner->iterator); + if (result != ISC_R_SUCCESS) + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_CACHE, ISC_LOG_WARNING, + "cache cleaner could not create " + "iterator: %s", isc_result_totext(result)); + else { + dns_dbiterator_setcleanmode(cleaner->iterator, ISC_TRUE); + result = dns_dbiterator_first(cleaner->iterator); + } + if (result != ISC_R_SUCCESS) { + /* + * If the result is ISC_R_NOMORE, the database is empty, + * so there is nothing to be cleaned. + */ + if (result != ISC_R_NOMORE && cleaner->iterator != NULL) { + UNEXPECTED_ERROR(__FILE__, __LINE__, + "cache cleaner: " + "dns_dbiterator_first() failed: %s", + dns_result_totext(result)); + dns_dbiterator_destroy(&cleaner->iterator); + } else if (cleaner->iterator != NULL) { + result = dns_dbiterator_pause(cleaner->iterator); + RUNTIME_CHECK(result == ISC_R_SUCCESS); + } + } else { + /* + * Pause the iterator to free its lock. + */ + result = dns_dbiterator_pause(cleaner->iterator); + RUNTIME_CHECK(result == ISC_R_SUCCESS); + + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_CACHE, ISC_LOG_DEBUG(1), + "begin cache cleaning, mem inuse %lu", + (unsigned long)isc_mem_inuse(cleaner->cache->mctx)); + cleaner->state = cleaner_s_busy; + isc_task_send(cleaner->task, &cleaner->resched_event); + } + + return; +} + +static void +end_cleaning(cache_cleaner_t *cleaner, isc_event_t *event) { + isc_result_t result; + + REQUIRE(CLEANER_BUSY(cleaner)); + REQUIRE(event != NULL); + + result = dns_dbiterator_pause(cleaner->iterator); + if (result != ISC_R_SUCCESS) + dns_dbiterator_destroy(&cleaner->iterator); + + dns_cache_setcleaninginterval(cleaner->cache, + cleaner->cleaning_interval); + + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_CACHE, + ISC_LOG_DEBUG(1), "end cache cleaning, mem inuse %lu", + (unsigned long)isc_mem_inuse(cleaner->cache->mctx)); + + cleaner->state = cleaner_s_idle; + cleaner->resched_event = event; } /* @@ -632,18 +672,183 @@ cache_cleaner_init(dns_cache_t *cache, isc_taskmgr_t *taskmgr, */ static void cleaning_timer_action(isc_task_t *task, isc_event_t *event) { - cache_cleaner_t *cleaner = event->ev_arg; + cache_cleaner_t *cleaner = event->ev_arg; + + UNUSED(task); - UNUSED(task); + INSIST(task == cleaner->task); + INSIST(event->ev_type == ISC_TIMEREVENT_TICK); - INSIST(task == cleaner->task); - INSIST(event->ev_type == ISC_TIMEREVENT_TICK); + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_CACHE, + ISC_LOG_DEBUG(1), "cache cleaning timer fired, " + "cleaner state = %d", cleaner->state); - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_CACHE, - ISC_LOG_DEBUG(1), "cache cleaning timer fired, " - "cleaner state = %d", cleaner->state); + if (cleaner->state == cleaner_s_idle) + begin_cleaning(cleaner); - isc_event_free(&event); + isc_event_free(&event); +} + +/* + * This is called when the cache either surpasses its upper limit + * or shrinks beyond its lower limit. + */ +static void +overmem_cleaning_action(isc_task_t *task, isc_event_t *event) { + cache_cleaner_t *cleaner = event->ev_arg; + isc_boolean_t want_cleaning = ISC_FALSE; + + UNUSED(task); + + INSIST(task == cleaner->task); + INSIST(event->ev_type == DNS_EVENT_CACHEOVERMEM); + INSIST(cleaner->overmem_event == NULL); + + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_CACHE, + ISC_LOG_DEBUG(1), "overmem_cleaning_action called, " + "overmem = %d, state = %d", cleaner->overmem, + cleaner->state); + + LOCK(&cleaner->lock); + + if (cleaner->overmem) { + if (cleaner->state == cleaner_s_idle) + want_cleaning = ISC_TRUE; + } else { + if (cleaner->state == cleaner_s_busy) + /* + * end_cleaning() can't be called here because + * then both cleaner->overmem_event and + * cleaner->resched_event will point to this + * event. Set the state to done, and then + * when the incremental_cleaning_action() event + * is posted, it will handle the end_cleaning. + */ + cleaner->state = cleaner_s_done; + } + + cleaner->overmem_event = event; + + UNLOCK(&cleaner->lock); + + if (want_cleaning) + begin_cleaning(cleaner); +} + +/* + * Do incremental cleaning. + */ +static void +incremental_cleaning_action(isc_task_t *task, isc_event_t *event) { + cache_cleaner_t *cleaner = event->ev_arg; + isc_result_t result; + unsigned int n_names; + isc_time_t start; + + UNUSED(task); + + INSIST(task == cleaner->task); + INSIST(event->ev_type == DNS_EVENT_CACHECLEAN); + + if (cleaner->state == cleaner_s_done) { + cleaner->state = cleaner_s_busy; + end_cleaning(cleaner, event); + LOCK(&cleaner->cache->lock); + LOCK(&cleaner->lock); + if (cleaner->replaceiterator) { + dns_dbiterator_destroy(&cleaner->iterator); + (void) dns_db_createiterator(cleaner->cache->db, + ISC_FALSE, + &cleaner->iterator); + cleaner->replaceiterator = ISC_FALSE; + } + UNLOCK(&cleaner->lock); + UNLOCK(&cleaner->cache->lock); + return; + } + + INSIST(CLEANER_BUSY(cleaner)); + + n_names = cleaner->increment; + + REQUIRE(DNS_DBITERATOR_VALID(cleaner->iterator)); + + isc_time_now(&start); + while (n_names-- > 0) { + dns_dbnode_t *node = NULL; + + result = dns_dbiterator_current(cleaner->iterator, &node, + NULL); + if (result != ISC_R_SUCCESS) { + UNEXPECTED_ERROR(__FILE__, __LINE__, + "cache cleaner: dns_dbiterator_current() " + "failed: %s", dns_result_totext(result)); + + end_cleaning(cleaner, event); + return; + } + + /* + * The node was not needed, but was required by + * dns_dbiterator_current(). Give up its reference. + */ + dns_db_detachnode(cleaner->cache->db, &node); + + /* + * Step to the next node. + */ + result = dns_dbiterator_next(cleaner->iterator); + + if (result != ISC_R_SUCCESS) { + /* + * Either the end was reached (ISC_R_NOMORE) or + * some error was signaled. If the cache is still + * overmem and no error was encountered, + * keep trying to clean it, otherwise stop cleaning. + */ + if (result != ISC_R_NOMORE) + UNEXPECTED_ERROR(__FILE__, __LINE__, + "cache cleaner: " + "dns_dbiterator_next() " + "failed: %s", + dns_result_totext(result)); + else if (cleaner->overmem) { + result = dns_dbiterator_first(cleaner-> + iterator); + if (result == ISC_R_SUCCESS) { + isc_log_write(dns_lctx, + DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_CACHE, + ISC_LOG_DEBUG(1), + "cache cleaner: " + "still overmem, " + "reset and try again"); + continue; + } + } + + end_cleaning(cleaner, event); + return; + } + } + + /* + * We have successfully performed a cleaning increment but have + * not gone through the entire cache. Free the iterator locks + * and reschedule another batch. If it fails, just try to continue + * anyway. + */ + result = dns_dbiterator_pause(cleaner->iterator); + RUNTIME_CHECK(result == ISC_R_SUCCESS); + + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_CACHE, + ISC_LOG_DEBUG(1), "cache cleaner: checked %u nodes, " + "mem inuse %lu, sleeping", cleaner->increment, + (unsigned long)isc_mem_inuse(cleaner->cache->mctx)); + + isc_task_send(task, &event); + INSIST(CLEANER_BUSY(cleaner)); + return; } /* @@ -651,104 +856,111 @@ cleaning_timer_action(isc_task_t *task, isc_event_t *event) { */ isc_result_t dns_cache_clean(dns_cache_t *cache, isc_stdtime_t now) { - isc_result_t result; - dns_dbiterator_t *iterator = NULL; - - REQUIRE(VALID_CACHE(cache)); - - result = dns_db_createiterator(cache->db, ISC_FALSE, &iterator); - if (result != ISC_R_SUCCESS) - return result; - - result = dns_dbiterator_first(iterator); - - while (result == ISC_R_SUCCESS) { - dns_dbnode_t *node = NULL; - result = dns_dbiterator_current(iterator, &node, - (dns_name_t *)NULL); - if (result != ISC_R_SUCCESS) - break; - - /* - * Check TTLs, mark expired rdatasets stale. - */ - result = dns_db_expirenode(cache->db, node, now); - if (result != ISC_R_SUCCESS) { - UNEXPECTED_ERROR(__FILE__, __LINE__, - "cache cleaner: dns_db_expirenode() " - "failed: %s", - dns_result_totext(result)); - /* - * Continue anyway. - */ - } - - /* - * This is where the actual freeing takes place. - */ - dns_db_detachnode(cache->db, &node); - - result = dns_dbiterator_next(iterator); - } - - dns_dbiterator_destroy(&iterator); - - if (result == ISC_R_NOMORE) - result = ISC_R_SUCCESS; - - return (result); + isc_result_t result; + dns_dbiterator_t *iterator = NULL; + + REQUIRE(VALID_CACHE(cache)); + + result = dns_db_createiterator(cache->db, ISC_FALSE, &iterator); + if (result != ISC_R_SUCCESS) + return result; + + result = dns_dbiterator_first(iterator); + + while (result == ISC_R_SUCCESS) { + dns_dbnode_t *node = NULL; + result = dns_dbiterator_current(iterator, &node, + (dns_name_t *)NULL); + if (result != ISC_R_SUCCESS) + break; + + /* + * Check TTLs, mark expired rdatasets stale. + */ + result = dns_db_expirenode(cache->db, node, now); + if (result != ISC_R_SUCCESS) { + UNEXPECTED_ERROR(__FILE__, __LINE__, + "cache cleaner: dns_db_expirenode() " + "failed: %s", + dns_result_totext(result)); + /* + * Continue anyway. + */ + } + + /* + * This is where the actual freeing takes place. + */ + dns_db_detachnode(cache->db, &node); + + result = dns_dbiterator_next(iterator); + } + + dns_dbiterator_destroy(&iterator); + + if (result == ISC_R_NOMORE) + result = ISC_R_SUCCESS; + + return (result); } static void water(void *arg, int mark) { - dns_cache_t *cache = arg; - isc_boolean_t overmem = ISC_TF(mark == ISC_MEM_HIWATER); + dns_cache_t *cache = arg; + isc_boolean_t overmem = ISC_TF(mark == ISC_MEM_HIWATER); + + REQUIRE(VALID_CACHE(cache)); - REQUIRE(VALID_CACHE(cache)); + LOCK(&cache->cleaner.lock); - LOCK(&cache->cleaner.lock); + if (overmem != cache->cleaner.overmem) { + dns_db_overmem(cache->db, overmem); + cache->cleaner.overmem = overmem; + isc_mem_waterack(cache->mctx, mark); + } - dns_db_overmem(cache->db, overmem); - cache->cleaner.overmem = overmem; + if (cache->cleaner.overmem_event != NULL) + isc_task_send(cache->cleaner.task, + &cache->cleaner.overmem_event); - UNLOCK(&cache->cleaner.lock); + UNLOCK(&cache->cleaner.lock); } void dns_cache_setcachesize(dns_cache_t *cache, isc_uint32_t size) { - isc_uint32_t lowater; - isc_uint32_t hiwater; - - REQUIRE(VALID_CACHE(cache)); - - /* - * Impose a minumum cache size; pathological things happen if there - * is too little room. - */ - if (size != 0 && size < DNS_CACHE_MINSIZE) - size = DNS_CACHE_MINSIZE; - - hiwater = size - (size >> 3); /* Approximately 7/8ths. */ - lowater = size - (size >> 2); /* Approximately 3/4ths. */ - - /* - * If the cache was overmem and cleaning, but now with the new limits - * it is no longer in an overmem condition, then the next - * isc_mem_put for cache memory will do the right thing and trigger - * water(). - */ - - if (size == 0 || hiwater == 0 || lowater == 0) - /* - * Disable cache memory limiting. - */ - isc_mem_setwater(cache->mctx, water, cache, 0, 0); - else - /* - * Establish new cache memory limits (either for the first - * time, or replacing other limits). - */ - isc_mem_setwater(cache->mctx, water, cache, hiwater, lowater); + isc_uint32_t lowater; + isc_uint32_t hiwater; + + REQUIRE(VALID_CACHE(cache)); + + /* + * Impose a minumum cache size; pathological things happen if there + * is too little room. + */ + if (size != 0 && size < DNS_CACHE_MINSIZE) + size = DNS_CACHE_MINSIZE; + + hiwater = size - (size >> 3); /* Approximately 7/8ths. */ + lowater = size - (size >> 2); /* Approximately 3/4ths. */ + + /* + * If the cache was overmem and cleaning, but now with the new limits + * it is no longer in an overmem condition, then the next + * isc_mem_put for cache memory will do the right thing and trigger + * water(). + */ + + if (size == 0 || hiwater == 0 || lowater == 0) + /* + * Disable cache memory limiting. + */ + isc_mem_setwater(cache->mctx, water, cache, 0, 0); + else + /* + * Establish new cache memory limits (either for the first + * time, or replacing other limits). + */ + isc_mem_setwater(cache->mctx, water, cache, hiwater, lowater); } /* @@ -756,148 +968,122 @@ dns_cache_setcachesize(dns_cache_t *cache, isc_uint32_t size) { */ static void cleaner_shutdown_action(isc_task_t *task, isc_event_t *event) { - dns_cache_t *cache = event->ev_arg; - isc_boolean_t should_free = ISC_FALSE; + dns_cache_t *cache = event->ev_arg; + isc_boolean_t should_free = ISC_FALSE; - UNUSED(task); + UNUSED(task); - INSIST(task == cache->cleaner.task); - INSIST(event->ev_type == ISC_TASKEVENT_SHUTDOWN); + INSIST(task == cache->cleaner.task); + INSIST(event->ev_type == ISC_TASKEVENT_SHUTDOWN); - LOCK(&cache->lock); + if (CLEANER_BUSY(&cache->cleaner)) + end_cleaning(&cache->cleaner, event); + else + isc_event_free(&event); - cache->live_tasks--; - INSIST(cache->live_tasks == 0); + LOCK(&cache->lock); - if (cache->references == 0) - should_free = ISC_TRUE; + cache->live_tasks--; + INSIST(cache->live_tasks == 0); - /* - * By detaching the timer in the context of its task, - * we are guaranteed that there will be no further timer - * events. - */ - if (cache->cleaner.cleaning_timer != NULL) - isc_timer_detach(&cache->cleaner.cleaning_timer); + if (cache->references == 0) + should_free = ISC_TRUE; -#ifdef LRU_DEBUG - isc_timer_detach(&cache->dump_timer); -#endif + /* + * By detaching the timer in the context of its task, + * we are guaranteed that there will be no further timer + * events. + */ + if (cache->cleaner.cleaning_timer != NULL) + isc_timer_detach(&cache->cleaner.cleaning_timer); - /* Make sure we don't reschedule anymore. */ - (void)isc_task_purge(task, NULL, DNS_EVENT_CACHECLEAN, NULL); + /* Make sure we don't reschedule anymore. */ + (void)isc_task_purge(task, NULL, DNS_EVENT_CACHECLEAN, NULL); - UNLOCK(&cache->lock); + UNLOCK(&cache->lock); - if (should_free) - cache_free(cache); - - isc_event_free(&event); + if (should_free) + cache_free(cache); } isc_result_t dns_cache_flush(dns_cache_t *cache) { - dns_db_t *db = NULL; - isc_result_t result; - - result = cache_create_db(cache, &db); - if (result != ISC_R_SUCCESS) - return (result); - - LOCK(&cache->lock); - LOCK(&cache->cleaner.lock); - if (cache->cleaner.state == cleaner_s_idle) { - /* XXXMLG do something */ - } else if (cache->cleaner.state == cleaner_s_busy) { - /* XXXMLG do something else */ - } - dns_db_detach(&cache->db); - cache->db = db; - UNLOCK(&cache->cleaner.lock); - UNLOCK(&cache->lock); - - return (ISC_R_SUCCESS); + dns_db_t *db = NULL; + isc_result_t result; + + result = cache_create_db(cache, &db); + if (result != ISC_R_SUCCESS) + return (result); + + LOCK(&cache->lock); + LOCK(&cache->cleaner.lock); + if (cache->cleaner.state == cleaner_s_idle) { + if (cache->cleaner.iterator != NULL) + dns_dbiterator_destroy(&cache->cleaner.iterator); + (void) dns_db_createiterator(db, ISC_FALSE, + &cache->cleaner.iterator); + } else { + if (cache->cleaner.state == cleaner_s_busy) + cache->cleaner.state = cleaner_s_done; + cache->cleaner.replaceiterator = ISC_TRUE; + } + dns_db_detach(&cache->db); + cache->db = db; + UNLOCK(&cache->cleaner.lock); + UNLOCK(&cache->lock); + + return (ISC_R_SUCCESS); } isc_result_t dns_cache_flushname(dns_cache_t *cache, dns_name_t *name) { - isc_result_t result; - dns_rdatasetiter_t *iter = NULL; - dns_dbnode_t *node = NULL; - dns_db_t *db = NULL; - - LOCK(&cache->lock); - if (cache->db != NULL) - dns_db_attach(cache->db, &db); - UNLOCK(&cache->lock); - if (db == NULL) - return (ISC_R_SUCCESS); - result = dns_db_findnode(cache->db, name, ISC_FALSE, &node); - if (result == ISC_R_NOTFOUND) { - result = ISC_R_SUCCESS; - goto cleanup_db; - } - if (result != ISC_R_SUCCESS) - goto cleanup_db; - - result = dns_db_allrdatasets(cache->db, node, NULL, - (isc_stdtime_t)0, &iter); - if (result != ISC_R_SUCCESS) - goto cleanup_node; - - for (result = dns_rdatasetiter_first(iter); - result == ISC_R_SUCCESS; - result = dns_rdatasetiter_next(iter)) - { - dns_rdataset_t rdataset; - dns_rdataset_init(&rdataset); - - dns_rdatasetiter_current(iter, &rdataset); - result = dns_db_deleterdataset(cache->db, node, NULL, - rdataset.type, rdataset.covers); - dns_rdataset_disassociate(&rdataset); - if (result != ISC_R_SUCCESS && result != DNS_R_UNCHANGED) - break; - } - if (result == ISC_R_NOMORE) - result = ISC_R_SUCCESS; - - dns_rdatasetiter_destroy(&iter); + isc_result_t result; + dns_rdatasetiter_t *iter = NULL; + dns_dbnode_t *node = NULL; + dns_db_t *db = NULL; + + LOCK(&cache->lock); + if (cache->db != NULL) + dns_db_attach(cache->db, &db); + UNLOCK(&cache->lock); + if (db == NULL) + return (ISC_R_SUCCESS); + result = dns_db_findnode(cache->db, name, ISC_FALSE, &node); + if (result == ISC_R_NOTFOUND) { + result = ISC_R_SUCCESS; + goto cleanup_db; + } + if (result != ISC_R_SUCCESS) + goto cleanup_db; + + result = dns_db_allrdatasets(cache->db, node, NULL, + (isc_stdtime_t)0, &iter); + if (result != ISC_R_SUCCESS) + goto cleanup_node; + + for (result = dns_rdatasetiter_first(iter); + result == ISC_R_SUCCESS; + result = dns_rdatasetiter_next(iter)) + { + dns_rdataset_t rdataset; + dns_rdataset_init(&rdataset); + + dns_rdatasetiter_current(iter, &rdataset); + result = dns_db_deleterdataset(cache->db, node, NULL, + rdataset.type, rdataset.covers); + dns_rdataset_disassociate(&rdataset); + if (result != ISC_R_SUCCESS && result != DNS_R_UNCHANGED) + break; + } + if (result == ISC_R_NOMORE) + result = ISC_R_SUCCESS; + + dns_rdatasetiter_destroy(&iter); cleanup_node: - dns_db_detachnode(cache->db, &node); + dns_db_detachnode(cache->db, &node); cleanup_db: - dns_db_detach(&db); - return (result); -} - -#ifdef LRU_DEBUG -static void -timer_dump(isc_task_t *task, isc_event_t *event) { - dns_cache_t *cache; - isc_interval_t interval; - isc_time_t nexttime; - - UNUSED(task); - - cache = event->ev_arg; - INSIST(VALID_CACHE(cache)); - -#ifdef LRU_DEBUG - /* XXX: abuse existing overmem method */ - dns_db_overmem(cache->db, (isc_boolean_t)-1); -#endif - - interval.seconds = DUMP_INTERVAL; - interval.nanoseconds = 0; - - RUNTIME_CHECK(isc_time_add(&cache->dump_time, &interval, &nexttime) == - ISC_R_SUCCESS); /* XXX: this is not always true */ - cache->dump_time = nexttime; - (void)isc_timer_reset(cache->dump_timer, isc_timertype_once, - &cache->dump_time, NULL, ISC_FALSE); - - isc_event_free(&event); + dns_db_detach(&db); + return (result); } -#endif diff --git a/lib/dns/db.c b/lib/dns/db.c index 64327651..67be11c1 100644 --- a/lib/dns/db.c +++ b/lib/dns/db.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2008 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.83 2007/06/18 23:47:40 tbox Exp $ */ +/* $Id: db.c,v 1.83.128.2 2008/04/03 06:20:34 tbox Exp $ */ /*! \file */ @@ -95,7 +95,7 @@ static inline dns_dbimplementation_t * impfind(const char *name) { dns_dbimplementation_t *imp; - for (imp = ISC_LIST_HEAD(implementations); + for (imp = ISC_LIST_HEAD(implementations); imp != NULL; imp = ISC_LIST_NEXT(imp, link)) if (strcasecmp(name, imp->name) == 0) @@ -543,10 +543,10 @@ dns_db_transfernode(dns_db_t *db, dns_dbnode_t **sourcep, UNUSED(db); if (db->methods->transfernode == NULL) { - *targetp = *sourcep; - *sourcep = NULL; + *targetp = *sourcep; + *sourcep = NULL; } else - (db->methods->transfernode)(db, sourcep, targetp); + (db->methods->transfernode)(db, sourcep, targetp); ENSURE(*sourcep == NULL); } @@ -711,7 +711,7 @@ dns_db_deleterdataset(dns_db_t *db, dns_dbnode_t *node, type, covers)); } -void +void dns_db_overmem(dns_db_t *db, isc_boolean_t overmem) { REQUIRE(DNS_DB_VALID(db)); @@ -737,11 +737,11 @@ dns_db_getsoaserial(dns_db_t *db, dns_dbversion_t *ver, isc_uint32_t *serialp) dns_rdataset_init(&rdataset); result = dns_db_findrdataset(db, node, ver, dns_rdatatype_soa, 0, (isc_stdtime_t)0, &rdataset, NULL); - if (result != ISC_R_SUCCESS) + if (result != ISC_R_SUCCESS) goto freenode; result = dns_rdataset_first(&rdataset); - if (result != ISC_R_SUCCESS) + if (result != ISC_R_SUCCESS) goto freerdataset; dns_rdataset_current(&rdataset, &rdata); result = dns_rdataset_next(&rdataset); @@ -794,7 +794,7 @@ dns_db_register(const char *name, dns_dbcreatefunc_t create, void *driverarg, RWUNLOCK(&implock, isc_rwlocktype_write); return (ISC_R_EXISTS); } - + imp = isc_mem_get(mctx, sizeof(dns_dbimplementation_t)); if (imp == NULL) { RWUNLOCK(&implock, isc_rwlocktype_write); @@ -832,6 +832,16 @@ dns_db_unregister(dns_dbimplementation_t **dbimp) { RWUNLOCK(&implock, isc_rwlocktype_write); } +dns_stats_t * +dns_db_getrrsetstats(dns_db_t *db) { + REQUIRE(DNS_DB_VALID(db)); + + if (db->methods->getrrsetstats != NULL) + return ((db->methods->getrrsetstats)(db)); + + return (NULL); +} + isc_result_t dns_db_getoriginnode(dns_db_t *db, dns_dbnode_t **nodep) { REQUIRE(DNS_DB_VALID(db)); diff --git a/lib/dns/dispatch.c b/lib/dns/dispatch.c index 07235da8..d8a8b779 100644 --- a/lib/dns/dispatch.c +++ b/lib/dns/dispatch.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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: dispatch.c,v 1.137 2007/06/27 04:10:44 marka Exp $ */ +/* $Id: dispatch.c,v 1.137.128.3 2008/04/03 06:10:19 marka Exp $ */ /*! \file */ @@ -40,27 +40,29 @@ #include <dns/log.h> #include <dns/message.h> #include <dns/portlist.h> +#include <dns/stats.h> #include <dns/tcpmsg.h> #include <dns/types.h> typedef ISC_LIST(dns_dispentry_t) dns_displist_t; -typedef struct dns_nsid { - isc_uint16_t nsid_state; - isc_uint16_t *nsid_vtable; - isc_uint16_t *nsid_pool; - isc_uint16_t nsid_a1, nsid_a2, nsid_a3; - isc_uint16_t nsid_c1, nsid_c2, nsid_c3; - isc_uint16_t nsid_state2; - isc_boolean_t nsid_usepool; -} dns_nsid_t; +/* transaction ID */ +typedef struct dns_tid { + isc_uint16_t tid_state; + isc_uint16_t *tid_vtable; + isc_uint16_t *tid_pool; + isc_uint16_t tid_a1, tid_a2, tid_a3; + isc_uint16_t tid_c1, tid_c2, tid_c3; + isc_uint16_t tid_state2; + isc_boolean_t tid_usepool; +} dns_tid_t; typedef struct dns_qid { unsigned int magic; unsigned int qid_nbuckets; /*%< hash table size */ unsigned int qid_increment; /*%< id increment on collision */ isc_mutex_t lock; - dns_nsid_t nsid; + dns_tid_t tid; dns_displist_t *qid_table; /*%< the table itself */ } dns_qid_t; @@ -70,6 +72,7 @@ struct dns_dispatchmgr { isc_mem_t *mctx; dns_acl_t *blackhole; dns_portlist_t *portlist; + dns_stats_t *stats; /* Locked by "lock". */ isc_mutex_t lock; @@ -169,7 +172,7 @@ static void destroy_disp(isc_task_t *task, isc_event_t *event); static void udp_recv(isc_task_t *, isc_event_t *); static void tcp_recv(isc_task_t *, isc_event_t *); static void startrecv(dns_dispatch_t *); -static dns_messageid_t dns_randomid(dns_nsid_t *); +static dns_messageid_t dns_randomid(dns_tid_t *); static isc_uint32_t dns_hash(dns_qid_t *, isc_sockaddr_t *, dns_messageid_t); static void free_buffer(dns_dispatch_t *disp, void *buf, unsigned int len); static void *allocate_udp_buffer(dns_dispatch_t *disp); @@ -193,9 +196,10 @@ static isc_result_t qid_allocate(dns_dispatchmgr_t *mgr, unsigned int buckets, unsigned int increment, isc_boolean_t usepool, dns_qid_t **qidp); static void qid_destroy(isc_mem_t *mctx, dns_qid_t **qidp); -static isc_uint16_t nsid_next(dns_nsid_t *nsid); -static isc_result_t nsid_init(isc_mem_t *mctx, dns_nsid_t *nsid, isc_boolean_t usepool); -static void nsid_destroy(isc_mem_t *mctx, dns_nsid_t *nsid); +static isc_uint16_t tid_next(dns_tid_t *tid); +static isc_result_t tid_init(isc_mem_t *mctx, dns_tid_t *tid, + isc_boolean_t usepool); +static void tid_destroy(isc_mem_t *mctx, dns_tid_t *tid); #define LVL(x) ISC_LOG_DEBUG(x) @@ -280,10 +284,10 @@ request_log(dns_dispatch_t *disp, dns_dispentry_t *resp, * framework for this purpose. */ static in_port_t -get_randomport(dns_nsid_t *nsid) { +get_randomport(dns_tid_t *tid) { isc_uint16_t p; - p = nsid_next(nsid); + p = tid_next(tid); /* XXX: should the range be configurable? */ return ((in_port_t)(1024 + (p % (65535 - 1024)))); @@ -293,10 +297,10 @@ get_randomport(dns_nsid_t *nsid) { * Return an unpredictable message ID. */ static dns_messageid_t -dns_randomid(dns_nsid_t *nsid) { +dns_randomid(dns_tid_t *tid) { isc_uint32_t id; - id = nsid_next(nsid); + id = tid_next(tid); return ((dns_messageid_t)id); } @@ -596,7 +600,7 @@ udp_recv(isc_task_t *task, isc_event_t *ev_in) { isc_netaddr_fromsockaddr(&netaddr, &ev->address); if (disp->mgr->blackhole != NULL && dns_acl_match(&netaddr, NULL, disp->mgr->blackhole, - NULL, &match, NULL) == ISC_R_SUCCESS && + NULL, &match, NULL) == ISC_R_SUCCESS && match > 0) { if (isc_log_wouldlog(dns_lctx, LVL(10))) { @@ -650,9 +654,11 @@ udp_recv(isc_task_t *task, isc_event_t *ev_in) { bucket, (resp == NULL ? "not found" : "found")); if (resp == NULL) { + dns_generalstats_increment(mgr->stats, + dns_resstatscounter_mismatch); free_buffer(disp, ev->region.base, ev->region.length); goto unlock; - } + } /* * Now that we have the original dispatch the query was sent @@ -662,7 +668,7 @@ udp_recv(isc_task_t *task, isc_event_t *ev_in) { if (disp != resp->disp) { isc_sockaddr_t a1; isc_sockaddr_t a2; - + /* * Check that the socket types and ports match. */ @@ -675,11 +681,11 @@ udp_recv(isc_task_t *task, isc_event_t *ev_in) { /* * If both dispatches are bound to an address then fail as - * the addresses can't be equal (enforced by the IP stack). + * the addresses can't be equal (enforced by the IP stack). * * Note under Linux a packet can be sent out via IPv4 socket * and the response be received via a IPv6 socket. - * + * * Requests sent out via IPv6 should always come back in * via IPv6. */ @@ -800,7 +806,7 @@ tcp_recv(isc_task_t *task, isc_event_t *ev_in) { switch (tcpmsg->result) { case ISC_R_CANCELED: break; - + case ISC_R_EOF: dispatch_log(disp, LVL(90), "shutting down on EOF"); do_cancel(disp); @@ -1054,6 +1060,9 @@ destroy_mgr(dns_dispatchmgr_t **mgrp) { if (mgr->portlist != NULL) dns_portlist_detach(&mgr->portlist); + if (mgr->stats != NULL) + dns_stats_detach(&mgr->stats); + isc_mem_put(mctx, mgr, sizeof(dns_dispatchmgr_t)); isc_mem_detach(&mctx); } @@ -1108,6 +1117,7 @@ dns_dispatchmgr_create(isc_mem_t *mctx, isc_entropy_t *entropy, mgr->blackhole = NULL; mgr->portlist = NULL; + mgr->stats = NULL; result = isc_mutex_init(&mgr->lock); if (result != ISC_R_SUCCESS) @@ -1303,6 +1313,15 @@ dns_dispatchmgr_destroy(dns_dispatchmgr_t **mgrp) { destroy_mgr(&mgr); } +void +dns_dispatchmgr_setstats(dns_dispatchmgr_t *mgr, dns_stats_t *stats) { + REQUIRE(VALID_DISPATCHMGR(mgr)); + REQUIRE(ISC_LIST_EMPTY(mgr->list)); + REQUIRE(mgr->stats == NULL); + + dns_stats_attach(stats, &mgr->stats); +} + static isc_boolean_t blacklisted(dns_dispatchmgr_t *mgr, isc_socket_t *sock, isc_sockaddr_t *sockaddrp) @@ -1439,7 +1458,7 @@ qid_allocate(dns_dispatchmgr_t *mgr, unsigned int buckets, return (ISC_R_NOMEMORY); } - result = nsid_init(mgr->mctx, &qid->nsid, usepool); + result = tid_init(mgr->mctx, &qid->tid, usepool); if (result != ISC_R_SUCCESS) { isc_mem_put(mgr->mctx, qid->qid_table, buckets * sizeof(dns_displist_t)); @@ -1449,7 +1468,7 @@ qid_allocate(dns_dispatchmgr_t *mgr, unsigned int buckets, result = isc_mutex_init(&qid->lock); if (result != ISC_R_SUCCESS) { - nsid_destroy(mgr->mctx, &qid->nsid); + tid_destroy(mgr->mctx, &qid->tid); isc_mem_put(mgr->mctx, qid->qid_table, buckets * sizeof(dns_displist_t)); isc_mem_put(mgr->mctx, qid, sizeof(*qid)); @@ -1477,7 +1496,7 @@ qid_destroy(isc_mem_t *mctx, dns_qid_t **qidp) { *qidp = NULL; qid->magic = 0; - nsid_destroy(mctx, &qid->nsid); + tid_destroy(mctx, &qid->tid); isc_mem_put(mctx, qid->qid_table, qid->qid_nbuckets * sizeof(dns_displist_t)); DESTROYLOCK(&qid->lock); @@ -1795,7 +1814,7 @@ dispatch_createudp(dns_dispatchmgr_t *mgr, isc_socketmgr_t *sockmgr, getsocket: if ((attributes & DNS_DISPATCHATTR_RANDOMPORT) != 0) { isc_sockaddr_setport(&localaddr_bound, - get_randomport(&mgr->qid->nsid)); + get_randomport(&mgr->qid->tid)); if (blacklisted(mgr, NULL, &localaddr_bound)) { if (++k == 1024) attributes &= ~DNS_DISPATCHATTR_RANDOMPORT; @@ -1807,7 +1826,7 @@ dispatch_createudp(dns_dispatchmgr_t *mgr, isc_socketmgr_t *sockmgr, attributes &= ~DNS_DISPATCHATTR_RANDOMPORT; goto getsocket; } - } else + } else result = create_socket(sockmgr, localaddr, &sock); if (result != ISC_R_SUCCESS) goto deallocate_dispatch; @@ -1969,7 +1988,7 @@ dns_dispatch_addresponse(dns_dispatch_t *disp, isc_sockaddr_t *dest, */ qid = DNS_QID(disp); LOCK(&qid->lock); - id = dns_randomid(&qid->nsid); + id = dns_randomid(&qid->tid); bucket = dns_hash(qid, dest, id); ok = ISC_FALSE; for (i = 0; i < 64; i++) { @@ -2294,7 +2313,7 @@ dns_dispatch_importrecv(dns_dispatch_t *disp, isc_event_t *event) { newsevent->timestamp = sevent->timestamp; newsevent->pktinfo = sevent->pktinfo; newsevent->attributes = sevent->attributes; - + isc_task_send(disp->task, ISC_EVENT_PTR(&newsevent)); } @@ -2381,26 +2400,26 @@ dns_dispatchmgr_dump(dns_dispatchmgr_t *mgr) { * the pool. */ -#define NSID_SHUFFLE_TABLE_SIZE 100 /* Suggested by Knuth */ +#define TID_SHUFFLE_TABLE_SIZE 100 /* Suggested by Knuth */ /* * Pick one of the next 4096 IDs in the pool. * There is a tradeoff here between randomness and how often and ID is reused. */ -#define NSID_LOOKAHEAD 4096 /* Must be a power of 2 */ -#define NSID_SHUFFLE_ONLY 1 /* algorithm 1 */ -#define NSID_USE_POOL 2 /* algorithm 2 */ -#define NSID_HASHSHIFT 3 -#define NSID_HASHROTATE(v) \ - (((v) << NSID_HASHSHIFT) | ((v) >> ((sizeof(v) * 8) - NSID_HASHSHIFT))) +#define TID_LOOKAHEAD 4096 /* Must be a power of 2 */ +#define TID_SHUFFLE_ONLY 1 /* algorithm 1 */ +#define TID_USE_POOL 2 /* algorithm 2 */ +#define TID_HASHSHIFT 3 +#define TID_HASHROTATE(v) \ + (((v) << TID_HASHSHIFT) | ((v) >> ((sizeof(v) * 8) - TID_HASHSHIFT))) -static isc_uint32_t nsid_hash_state; +static isc_uint32_t tid_hash_state; /* * Keep a running hash of various bits of data that we'll use to * stir the ID pool or perturb the ID generator */ static void -nsid_hash(void *data, size_t len) { +tid_hash(void *data, size_t len) { unsigned char *p = data; /* * Hash function similar to the one we use for hashing names. @@ -2412,12 +2431,12 @@ nsid_hash(void *data, size_t len) { * fast. */ /* - * We don't care about locking access to nsid_hash_state. + * We don't care about locking access to tid_hash_state. * In fact races make the result even more non deteministic. */ while (len-- > 0U) { - nsid_hash_state = NSID_HASHROTATE(nsid_hash_state); - nsid_hash_state += *p++; + tid_hash_state = TID_HASHROTATE(tid_hash_state); + tid_hash_state += *p++; } } @@ -2426,7 +2445,7 @@ nsid_hash(void *data, size_t len) { * in order of increasing serial correlation bounds (so trim from * the end). */ -static const isc_uint16_t nsid_multiplier_table[] = { +static const isc_uint16_t tid_multiplier_table[] = { 17565, 25013, 11733, 19877, 23989, 23997, 24997, 25421, 26781, 27413, 35901, 35917, 35973, 36229, 38317, 38437, 39941, 40493, 41853, 46317, 50581, 51429, 53453, 53805, @@ -2562,159 +2581,168 @@ static const isc_uint16_t nsid_multiplier_table[] = { 10853, 1453, 18069, 21693, 30573, 36261, 37421, 42533 }; -#define NSID_MULT_TABLE_SIZE \ - ((sizeof nsid_multiplier_table)/(sizeof nsid_multiplier_table[0])) -#define NSID_RANGE_MASK (NSID_LOOKAHEAD - 1) -#define NSID_POOL_MASK 0xFFFF /* used to wrap the pool index */ -#define NSID_SHUFFLE_ONLY 1 -#define NSID_USE_POOL 2 +#define TID_MULT_TABLE_SIZE \ + ((sizeof tid_multiplier_table) / \ + (sizeof tid_multiplier_table[0])) +#define TID_RANGE_MASK (TID_LOOKAHEAD - 1) +#define TID_POOL_MASK 0xFFFF /* used to wrap the pool index */ +#define TID_SHUFFLE_ONLY 1 +#define TID_USE_POOL 2 static isc_uint16_t -nsid_next(dns_nsid_t *nsid) { - isc_uint16_t id, compressed_hash; +tid_next(dns_tid_t *tid) { + isc_uint16_t id, compressed_hash; isc_uint16_t j; - compressed_hash = ((nsid_hash_state >> 16) ^ - (nsid_hash_state)) & 0xFFFF; - - if (nsid->nsid_usepool) { - isc_uint16_t pick; - - pick = compressed_hash & NSID_RANGE_MASK; - pick = (nsid->nsid_state + pick) & NSID_POOL_MASK; - id = nsid->nsid_pool[pick]; - if (pick != 0) { - /* Swap two IDs to stir the pool */ - nsid->nsid_pool[pick] = - nsid->nsid_pool[nsid->nsid_state]; - nsid->nsid_pool[nsid->nsid_state] = id; - } - - /* increment the base pointer into the pool */ - if (nsid->nsid_state == 65535) - nsid->nsid_state = 0; - else - nsid->nsid_state++; + compressed_hash = ((tid_hash_state >> 16) ^ + (tid_hash_state)) & 0xFFFF; + + if (tid->tid_usepool) { + isc_uint16_t pick; + + pick = compressed_hash & TID_RANGE_MASK; + pick = (tid->tid_state + pick) & TID_POOL_MASK; + id = tid->tid_pool[pick]; + if (pick != 0) { + /* Swap two IDs to stir the pool */ + tid->tid_pool[pick] = + tid->tid_pool[tid->tid_state]; + tid->tid_pool[tid->tid_state] = id; + } + + /* increment the base pointer into the pool */ + if (tid->tid_state == 65535) + tid->tid_state = 0; + else + tid->tid_state++; } else { /* * This is the original Algorithm B - * j = ((u_long) NSID_SHUFFLE_TABLE_SIZE * nsid_state2) >> 16; + * j = ((u_long) + * QUERID_SHUFFLE_TABLE_SIZE * tid_state2) >> 16; * * We'll perturb it with some random stuff ... */ - j = ((isc_uint32_t) NSID_SHUFFLE_TABLE_SIZE * - (nsid->nsid_state2 ^ compressed_hash)) >> 16; - nsid->nsid_state2 = id = nsid->nsid_vtable[j]; - nsid->nsid_state = (((isc_uint32_t) nsid->nsid_a1 * nsid->nsid_state) + - nsid->nsid_c1) & 0xFFFF; - nsid->nsid_vtable[j] = nsid->nsid_state; + j = ((isc_uint32_t) TID_SHUFFLE_TABLE_SIZE * + (tid->tid_state2 ^ compressed_hash)) >> 16; + tid->tid_state2 = id = tid->tid_vtable[j]; + tid->tid_state = (((isc_uint32_t) tid->tid_a1 * + tid->tid_state) + + tid->tid_c1) & 0xFFFF; + tid->tid_vtable[j] = tid->tid_state; } - /* Now lets obfuscate ... */ - id = (((isc_uint32_t) nsid->nsid_a2 * id) + nsid->nsid_c2) & 0xFFFF; - id = (((isc_uint32_t) nsid->nsid_a3 * id) + nsid->nsid_c3) & 0xFFFF; + /* Now lets obfuscate ... */ + id = (((isc_uint32_t) tid->tid_a2 * id) + + tid->tid_c2) & 0xFFFF; + id = (((isc_uint32_t) tid->tid_a3 * id) + + tid->tid_c3) & 0xFFFF; - return (id); + return (id); } static isc_result_t -nsid_init(isc_mem_t *mctx, dns_nsid_t *nsid, isc_boolean_t usepool) { - isc_time_t now; - pid_t mypid; - isc_uint16_t a1ndx, a2ndx, a3ndx, c1ndx, c2ndx, c3ndx; - int i; +tid_init(isc_mem_t *mctx, dns_tid_t *tid, isc_boolean_t usepool) { + isc_time_t now; + pid_t mypid; + isc_uint16_t a1ndx, a2ndx, a3ndx, c1ndx, c2ndx, c3ndx; + int i; isc_time_now(&now); - mypid = getpid(); - - /* Initialize the state */ - memset(nsid, 0, sizeof(*nsid)); - nsid_hash(&now, sizeof now); - nsid_hash(&mypid, sizeof mypid); - - /* - * Select our random number generators and initial seed. - * We could really use more random bits at this point, - * but we'll try to make a silk purse out of a sows ear ... - */ - /* generator 1 */ - a1ndx = ((isc_uint32_t) NSID_MULT_TABLE_SIZE * - (nsid_hash_state & 0xFFFF)) >> 16; - nsid->nsid_a1 = nsid_multiplier_table[a1ndx]; - c1ndx = (nsid_hash_state >> 9) & 0x7FFF; - nsid->nsid_c1 = 2 * c1ndx + 1; - - /* generator 2, distinct from 1 */ - a2ndx = ((isc_uint32_t) (NSID_MULT_TABLE_SIZE - 1) * - ((nsid_hash_state >> 10) & 0xFFFF)) >> 16; - if (a2ndx >= a1ndx) - a2ndx++; - nsid->nsid_a2 = nsid_multiplier_table[a2ndx]; - c2ndx = nsid_hash_state % 32767; - if (c2ndx >= c1ndx) - c2ndx++; - nsid->nsid_c2 = 2*c2ndx + 1; - - /* generator 3, distinct from 1 and 2 */ - a3ndx = ((isc_uint32_t) (NSID_MULT_TABLE_SIZE - 2) * - ((nsid_hash_state >> 20) & 0xFFFF)) >> 16; - if (a3ndx >= a1ndx || a3ndx >= a2ndx) - a3ndx++; - if (a3ndx >= a1ndx && a3ndx >= a2ndx) - a3ndx++; - nsid->nsid_a3 = nsid_multiplier_table[a3ndx]; - c3ndx = nsid_hash_state % 32766; - if (c3ndx >= c1ndx || c3ndx >= c2ndx) - c3ndx++; - if (c3ndx >= c1ndx && c3ndx >= c2ndx) - c3ndx++; - nsid->nsid_c3 = 2*c3ndx + 1; - - nsid->nsid_state = - ((nsid_hash_state >> 16) ^ (nsid_hash_state)) & 0xFFFF; - - nsid->nsid_usepool = usepool; - if (nsid->nsid_usepool) { - nsid->nsid_pool = isc_mem_get(mctx, 0x10000 * sizeof(isc_uint16_t)); - if (nsid->nsid_pool == NULL) + mypid = getpid(); + + /* Initialize the state */ + memset(tid, 0, sizeof(*tid)); + tid_hash(&now, sizeof now); + tid_hash(&mypid, sizeof mypid); + + /* + * Select our random number generators and initial seed. + * We could really use more random bits at this point, + * but we'll try to make a silk purse out of a sows ear ... + */ + /* generator 1 */ + a1ndx = ((isc_uint32_t) TID_MULT_TABLE_SIZE * + (tid_hash_state & 0xFFFF)) >> 16; + tid->tid_a1 = tid_multiplier_table[a1ndx]; + c1ndx = (tid_hash_state >> 9) & 0x7FFF; + tid->tid_c1 = 2 * c1ndx + 1; + + /* generator 2, distinct from 1 */ + a2ndx = ((isc_uint32_t) (TID_MULT_TABLE_SIZE - 1) * + ((tid_hash_state >> 10) & 0xFFFF)) >> 16; + if (a2ndx >= a1ndx) + a2ndx++; + tid->tid_a2 = tid_multiplier_table[a2ndx]; + c2ndx = tid_hash_state % 32767; + if (c2ndx >= c1ndx) + c2ndx++; + tid->tid_c2 = 2*c2ndx + 1; + + /* generator 3, distinct from 1 and 2 */ + a3ndx = ((isc_uint32_t) (TID_MULT_TABLE_SIZE - 2) * + ((tid_hash_state >> 20) & 0xFFFF)) >> 16; + if (a3ndx >= a1ndx || a3ndx >= a2ndx) + a3ndx++; + if (a3ndx >= a1ndx && a3ndx >= a2ndx) + a3ndx++; + tid->tid_a3 = tid_multiplier_table[a3ndx]; + c3ndx = tid_hash_state % 32766; + if (c3ndx >= c1ndx || c3ndx >= c2ndx) + c3ndx++; + if (c3ndx >= c1ndx && c3ndx >= c2ndx) + c3ndx++; + tid->tid_c3 = 2*c3ndx + 1; + + tid->tid_state = + ((tid_hash_state >> 16) ^ (tid_hash_state)) & 0xFFFF; + + tid->tid_usepool = usepool; + if (tid->tid_usepool) { + tid->tid_pool = isc_mem_get(mctx, + 0x10000 * sizeof(isc_uint16_t)); + if (tid->tid_pool == NULL) return (ISC_R_NOMEMORY); - for (i = 0; ; i++) { - nsid->nsid_pool[i] = nsid->nsid_state; - nsid->nsid_state = - (((u_long) nsid->nsid_a1 * nsid->nsid_state) + - nsid->nsid_c1) & 0xFFFF; - if (i == 0xFFFF) - break; - } + for (i = 0; ; i++) { + tid->tid_pool[i] = tid->tid_state; + tid->tid_state = + (((u_long) tid->tid_a1 * + tid->tid_state) + + tid->tid_c1) & 0xFFFF; + if (i == 0xFFFF) + break; + } } else { - nsid->nsid_vtable = isc_mem_get(mctx, NSID_SHUFFLE_TABLE_SIZE * + tid->tid_vtable = isc_mem_get(mctx, TID_SHUFFLE_TABLE_SIZE * (sizeof(isc_uint16_t)) ); - if (nsid->nsid_vtable == NULL) + if (tid->tid_vtable == NULL) return (ISC_R_NOMEMORY); - for (i = 0; i < NSID_SHUFFLE_TABLE_SIZE; i++) { - nsid->nsid_vtable[i] = nsid->nsid_state; - nsid->nsid_state = - (((isc_uint32_t) nsid->nsid_a1 * nsid->nsid_state) + - nsid->nsid_c1) & 0xFFFF; + for (i = 0; i < TID_SHUFFLE_TABLE_SIZE; i++) { + tid->tid_vtable[i] = tid->tid_state; + tid->tid_state = + (((isc_uint32_t) tid->tid_a1 * + tid->tid_state) + + tid->tid_c1) & 0xFFFF; } - nsid->nsid_state2 = nsid->nsid_state; - } + tid->tid_state2 = tid->tid_state; + } return (ISC_R_SUCCESS); } static void -nsid_destroy(isc_mem_t *mctx, dns_nsid_t *nsid) { - if (nsid->nsid_usepool) - isc_mem_put(mctx, nsid->nsid_pool, +tid_destroy(isc_mem_t *mctx, dns_tid_t *tid) { + if (tid->tid_usepool) + isc_mem_put(mctx, tid->tid_pool, 0x10000 * sizeof(isc_uint16_t)); else - isc_mem_put(mctx, nsid->nsid_vtable, - NSID_SHUFFLE_TABLE_SIZE * (sizeof(isc_uint16_t)) ); - memset(nsid, 0, sizeof(*nsid)); + isc_mem_put(mctx, tid->tid_vtable, + TID_SHUFFLE_TABLE_SIZE * + (sizeof(isc_uint16_t)) ); + memset(tid, 0, sizeof(*tid)); } void dns_dispatch_hash(void *data, size_t len) { - nsid_hash(data, len); + tid_hash(data, len); } diff --git a/lib/dns/dst_api.c b/lib/dns/dst_api.c index 0dfadb48..f36ad205 100644 --- a/lib/dns/dst_api.c +++ b/lib/dns/dst_api.c @@ -1,5 +1,5 @@ /* - * Portions Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Portions Copyright (C) 2004-2008 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.11 2007/08/28 07:20:42 tbox Exp $ + * $Id: dst_api.c,v 1.11.92.2 2008/03/31 23:46:42 tbox Exp $ */ /*! \file */ @@ -162,6 +162,7 @@ dst_lib_init(isc_mem_t *mctx, isc_entropy_t *ectx, unsigned int eflags) { NULL, &dst__memory_pool, 0); if (result != ISC_R_SUCCESS) return (result); + isc_mem_setname(dst__memory_pool, "dst", NULL); isc_mem_setdestroycheck(dst__memory_pool, ISC_FALSE); #else isc_mem_attach(mctx, &dst__memory_pool); diff --git a/lib/dns/gssapi_link.c b/lib/dns/gssapi_link.c index b37b39e9..349826ff 100644 --- a/lib/dns/gssapi_link.c +++ b/lib/dns/gssapi_link.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -16,7 +16,7 @@ */ /* - * $Id: gssapi_link.c,v 1.7 2007/06/19 23:47:16 tbox Exp $ + * $Id: gssapi_link.c,v 1.7.128.3 2008/04/03 06:08:26 tbox Exp $ */ #include <config.h> @@ -174,7 +174,8 @@ gssapi_sign(dst_context_t *dctx, isc_buffer_t *sig) { * allocated space. */ isc_buffer_putmem(sig, gsig.value, gsig.length); - gss_release_buffer(&minor, &gsig); + if (gsig.length != 0) + gss_release_buffer(&minor, &gsig); return (ISC_R_SUCCESS); } @@ -291,6 +292,7 @@ static dst_func_t gssapi_functions = { NULL, /*%< tofile */ NULL, /*%< parse */ NULL, /*%< cleanup */ + NULL }; isc_result_t diff --git a/lib/dns/gssapictx.c b/lib/dns/gssapictx.c index 195a2b63..614d88f7 100644 --- a/lib/dns/gssapictx.c +++ b/lib/dns/gssapictx.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: gssapictx.c,v 1.8.128.2 2008/01/22 23:27:35 tbox Exp $ */ +/* $Id: gssapictx.c,v 1.8.128.4 2008/04/03 06:08:26 tbox Exp $ */ #include <config.h> @@ -175,11 +175,13 @@ log_cred(const gss_cred_id_t cred) { } if (gret == GSS_S_COMPLETE) { - gret = gss_release_buffer(&minor, &gbuffer); - if (gret != GSS_S_COMPLETE) - gss_log(3, "failed gss_release_buffer: %s", - gss_error_tostring(gret, minor, buf, - sizeof(buf))); + if (gbuffer.length != 0) { + gret = gss_release_buffer(&minor, &gbuffer); + if (gret != GSS_S_COMPLETE) + gss_log(3, "failed gss_release_buffer: %s", + gss_error_tostring(gret, minor, buf, + sizeof(buf))); + } } gret = gss_release_name(&minor, &gname); @@ -459,7 +461,7 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken, isc_buffer_t namebuf; gss_name_t gname; OM_uint32 gret, minor, ret_flags, flags; - gss_buffer_desc gintoken, *gintokenp, gouttoken; + gss_buffer_desc gintoken, *gintokenp, gouttoken = GSS_C_EMPTY_BUFFER; isc_result_t result; gss_buffer_desc gnamebuf; unsigned char array[DNS_NAME_MAXTEXT + 1]; @@ -507,11 +509,15 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken, * MUTUAL and INTEG flags, fail if either not set. */ - GBUFFER_TO_REGION(gouttoken, r); - RETERR(isc_buffer_copyregion(outtoken, &r)); - + /* + * RFC 2744 states the a valid output token has a non-zero length. + */ + if (gouttoken.length != 0) { + GBUFFER_TO_REGION(gouttoken, r); + RETERR(isc_buffer_copyregion(outtoken, &r)); + (void)gss_release_buffer(&minor, &gouttoken); + } (void)gss_release_name(&minor, &gname); - (void)gss_release_buffer(&minor, &gouttoken); if (gret == GSS_S_COMPLETE) result = ISC_R_SUCCESS; @@ -539,7 +545,8 @@ dst_gssapi_acceptctx(gss_cred_id_t cred, #ifdef GSSAPI isc_region_t r; isc_buffer_t namebuf; - gss_buffer_desc gnamebuf, gintoken, gouttoken; + gss_buffer_desc gnamebuf = GSS_C_EMPTY_BUFFER, gintoken, + gouttoken = GSS_C_EMPTY_BUFFER; OM_uint32 gret, minor; gss_ctx_id_t context = GSS_C_NO_CONTEXT; gss_name_t gname = NULL; @@ -593,6 +600,7 @@ dst_gssapi_acceptctx(gss_cred_id_t cred, RETERR(isc_buffer_allocate(mctx, outtoken, gouttoken.length)); GBUFFER_TO_REGION(gouttoken, r); RETERR(isc_buffer_copyregion(*outtoken, &r)); + (void)gss_release_buffer(&minor, &gouttoken); } if (gret == GSS_S_COMPLETE) { @@ -624,11 +632,13 @@ dst_gssapi_acceptctx(gss_cred_id_t cred, RETERR(dns_name_fromtext(principal, &namebuf, dns_rootname, ISC_FALSE, NULL)); - gret = gss_release_buffer(&minor, &gnamebuf); - if (gret != GSS_S_COMPLETE) - gss_log(3, "failed gss_release_buffer: %s", - gss_error_tostring(gret, minor, buf, - sizeof(buf))); + if (gnamebuf.length != 0) { + gret = gss_release_buffer(&minor, &gnamebuf); + if (gret != GSS_S_COMPLETE) + gss_log(3, "failed gss_release_buffer: %s", + gss_error_tostring(gret, minor, buf, + sizeof(buf))); + } } *ctxout = context; @@ -685,7 +695,8 @@ char * gss_error_tostring(isc_uint32_t major, isc_uint32_t minor, char *buf, size_t buflen) { #ifdef GSSAPI - gss_buffer_desc msg_minor, msg_major; + gss_buffer_desc msg_minor = GSS_C_EMPTY_BUFFER, + msg_major = GSS_C_EMPTY_BUFFER; OM_uint32 msg_ctx, minor_stat; /* Handle major status */ @@ -701,8 +712,10 @@ gss_error_tostring(isc_uint32_t major, isc_uint32_t minor, snprintf(buf, buflen, "GSSAPI error: Major = %s, Minor = %s.", (char *)msg_major.value, (char *)msg_minor.value); - (void)gss_release_buffer(&minor_stat, &msg_major); - (void)gss_release_buffer(&minor_stat, &msg_minor); + if (msg_major.length != 0) + (void)gss_release_buffer(&minor_stat, &msg_major); + if (msg_minor.length != 0) + (void)gss_release_buffer(&minor_stat, &msg_minor); return(buf); #else snprintf(buf, buflen, "GSSAPI error: Major = %u, Minor = %u.", diff --git a/lib/dns/include/dns/adb.h b/lib/dns/include/dns/adb.h index 0e8fc997..eaf2e378 100644 --- a/lib/dns/include/dns/adb.h +++ b/lib/dns/include/dns/adb.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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.h,v 1.83 2007/06/19 23:47:16 tbox Exp $ */ +/* $Id: adb.h,v 1.83.128.2 2008/04/03 06:20:34 tbox Exp $ */ #ifndef DNS_ADB_H #define DNS_ADB_H 1 @@ -99,7 +99,7 @@ ISC_LANG_BEGINDECLS typedef struct dns_adbname dns_adbname_t; -/*! +/*! *\brief * Represents a lookup for a single name. * @@ -220,7 +220,7 @@ struct dns_adbaddrinfo { ISC_LINK(dns_adbaddrinfo_t) publink; }; -/*!< +/*!< * The event sent to the caller task is just a plain old isc_event_t. It * contains no data other than a simple status, passed in the "type" field * to indicate that another address resolved, or all partially resolved @@ -520,7 +520,7 @@ void dns_adb_adjustsrtt(dns_adb_t *adb, dns_adbaddrinfo_t *addr, unsigned int rtt, unsigned int factor); /*%< - * Mix the round trip time into the existing smoothed rtt. + * Mix the round trip time into the existing smoothed rtt. * The formula used * (where srtt is the existing rtt value, and rtt and factor are arguments to @@ -623,13 +623,12 @@ void dns_adb_flushname(dns_adb_t *adb, dns_name_t *name); /*%< * Flush 'name' from the adb cache. - * + * * Requires: *\li 'adb' is valid. *\li 'name' is valid. */ - ISC_LANG_ENDDECLS #endif /* DNS_ADB_H */ diff --git a/lib/dns/include/dns/db.h b/lib/dns/include/dns/db.h index fb87cf66..8ea81fd5 100644 --- a/lib/dns/include/dns/db.h +++ b/lib/dns/include/dns/db.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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: db.h,v 1.89 2007/06/18 23:47:42 tbox Exp $ */ +/* $Id: db.h,v 1.89.128.2 2008/04/03 06:20:34 tbox Exp $ */ #ifndef DNS_DB_H #define DNS_DB_H 1 @@ -147,7 +147,8 @@ typedef struct dns_dbmethods { void (*settask)(dns_db_t *db, isc_task_t *); isc_result_t (*getoriginnode)(dns_db_t *db, dns_dbnode_t **nodep); void (*transfernode)(dns_db_t *db, dns_dbnode_t **sourcep, - dns_dbnode_t **targetp); + dns_dbnode_t **targetp); + dns_stats_t *(*getrrsetstats)(dns_db_t *db); } dns_dbmethods_t; typedef isc_result_t @@ -155,7 +156,7 @@ typedef isc_result_t dns_dbtype_t type, dns_rdataclass_t rdclass, unsigned int argc, char *argv[], void *driverarg, dns_db_t **dbp); - + #define DNS_DB_MAGIC ISC_MAGIC('D','N','S','D') #define DNS_DB_VALID(db) ISC_MAGIC_VALID(db, DNS_DB_MAGIC) @@ -788,7 +789,7 @@ dns_db_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, * the negative caching proof. * * \li #DNS_R_EMPTYNAME The name exists but there is - * no data at the name. + * no data at the name. * * \li #DNS_R_COVERINGNSEC The returned data is a NSEC * that potentially covers 'name'. @@ -886,8 +887,8 @@ dns_db_detachnode(dns_db_t *db, dns_dbnode_t **nodep); */ void -dns_db_transfernode(dns_db_t *db, dns_dbnode_t **sourcep, - dns_dbnode_t **targetp); +dns_db_transfernode(dns_db_t *db, dns_dbnode_t **sourcep, + dns_dbnode_t **targetp); /*%< * Transfer a node between pointer. * @@ -1317,6 +1318,21 @@ dns_db_getoriginnode(dns_db_t *db, dns_dbnode_t **nodep); * \li #ISC_R_NOTFOUND - the DB implementation does not support this feature. */ +dns_stats_t * +dns_db_getrrsetstats(dns_db_t *db); +/*%< + * Get statistics information counting RRsets stored in the DB, when available. + * The statistics may not be available depending on the DB implementation. + * + * Requires: + * + * \li 'db' is a valid database (zone or cache). + * + * Returns: + * \li when available, a pointer to a statistics object created by + * dns_rdatasetstats_create(); otherwise NULL. + */ + ISC_LANG_ENDDECLS #endif /* DNS_DB_H */ diff --git a/lib/dns/include/dns/dispatch.h b/lib/dns/include/dns/dispatch.h index 71922d77..9ed8a464 100644 --- a/lib/dns/include/dns/dispatch.h +++ b/lib/dns/include/dns/dispatch.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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: dispatch.h,v 1.56 2007/06/26 02:52:15 marka Exp $ */ +/* $Id: dispatch.h,v 1.56.128.2 2008/04/03 06:20:34 tbox Exp $ */ #ifndef DNS_DISPATCH_H #define DNS_DISPATCH_H 1 @@ -187,7 +187,7 @@ dns_dispatchmgr_getblackhole(dns_dispatchmgr_t *mgr); void dns_dispatchmgr_setblackportlist(dns_dispatchmgr_t *mgr, - dns_portlist_t *portlist); + dns_portlist_t *portlist); /*%< * Sets a list of UDP ports that won't be used when creating a udp * dispatch with a wildcard port. @@ -206,7 +206,20 @@ dns_dispatchmgr_getblackportlist(dns_dispatchmgr_t *mgr); *\li mgr is a valid dispatchmgr */ - +void +dns_dispatchmgr_setstats(dns_dispatchmgr_t *mgr, dns_stats_t *stats); +/*%< + * Sets statistics counter for the dispatchmgr. This function is expected to + * be called only on zone creation (when necessary). + * Once installed, it cannot be removed or replaced. Also, there is no + * interface to get the installed stats from the zone; the caller must keep the + * stats to reference (e.g. dump) it later. + * + * Requires: + *\li mgr is a valid dispatchmgr with no managed dispatch. + *\li stats is a valid statistics supporting resolver statistics counters + * (see dns/stats.h). + */ isc_result_t dns_dispatch_getudp(dns_dispatchmgr_t *mgr, isc_socketmgr_t *sockmgr, @@ -367,7 +380,7 @@ dns_dispatch_removeresponse(dns_dispentry_t **resp, *\li "resp" != NULL and "*resp" contain a value previously allocated * by dns_dispatch_addresponse(); * - *\li May only be called from within the task given as the 'task' + *\li May only be called from within the task given as the 'task' * argument to dns_dispatch_addresponse() when allocating '*resp'. */ @@ -384,7 +397,7 @@ dns_dispatch_getsocket(dns_dispatch_t *disp); *\li The socket the dispatcher is using. */ -isc_result_t +isc_result_t dns_dispatch_getlocaladdress(dns_dispatch_t *disp, isc_sockaddr_t *addrp); /*%< * Return the local address for this dispatch. @@ -395,7 +408,7 @@ dns_dispatch_getlocaladdress(dns_dispatch_t *disp, isc_sockaddr_t *addrp); *\li addrp to be non null. * * Returns: - *\li ISC_R_SUCCESS + *\li ISC_R_SUCCESS *\li ISC_R_NOTIMPLEMENTED */ @@ -421,7 +434,7 @@ dns_dispatch_changeattributes(dns_dispatch_t *disp, * new = (old & ~mask) | (attributes & mask) * \endcode * - * This function has a side effect when #DNS_DISPATCHATTR_NOLISTEN changes. + * This function has a side effect when #DNS_DISPATCHATTR_NOLISTEN changes. * When the flag becomes off, the dispatch will start receiving on the * corresponding socket. When the flag becomes on, receive events on the * corresponding socket will be canceled. diff --git a/lib/dns/include/dns/message.h b/lib/dns/include/dns/message.h index 2d487fa1..99716a35 100644 --- a/lib/dns/include/dns/message.h +++ b/lib/dns/include/dns/message.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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: message.h,v 1.123 2007/06/19 23:47:17 tbox Exp $ */ +/* $Id: message.h,v 1.123.128.2 2008/04/03 06:08:27 tbox Exp $ */ #ifndef DNS_MESSAGE_H #define DNS_MESSAGE_H 1 @@ -101,8 +101,12 @@ #define DNS_MESSAGEFLAG_AD 0x0020U #define DNS_MESSAGEFLAG_CD 0x0010U +/*%< EDNS0 extended message flags */ #define DNS_MESSAGEEXTFLAG_DO 0x8000U +/*%< EDNS0 extended OPT codes */ +#define DNS_OPT_NSID 0x0003 /*%< NSID opt code */ + #define DNS_MESSAGE_REPLYPRESERVE (DNS_MESSAGEFLAG_RD|DNS_MESSAGEFLAG_CD) #define DNS_MESSAGEEXTFLAG_REPLYPRESERVE (DNS_MESSAGEEXTFLAG_DO) @@ -771,7 +775,7 @@ dns_message_addname(dns_message_t *msg, dns_name_t *name, void dns_message_removename(dns_message_t *msg, dns_name_t *name, - dns_section_t section); + dns_section_t section); /*%< * Remove a existing name from a given section. * @@ -1031,7 +1035,7 @@ dns_message_setopt(dns_message_t *msg, dns_rdataset_t *opt); *\li The OPT record has either been freed or ownership of it has * been transferred to the message. * - *\li If ISC_R_SUCCESS was returned, the OPT record will be rendered + *\li If ISC_R_SUCCESS was returned, the OPT record will be rendered * when dns_message_renderend() is called. * * Returns: @@ -1315,7 +1319,7 @@ dns_message_setsortorder(dns_message_t *msg, dns_rdatasetorderfunc_t order, *\li order_arg is NULL if and only if order is NULL. */ -void +void dns_message_settimeadjust(dns_message_t *msg, int timeadjust); /*%< * Adjust the time used to sign/verify a message by timeadjust. @@ -1325,7 +1329,7 @@ dns_message_settimeadjust(dns_message_t *msg, int timeadjust); *\li msg be a valid message. */ -int +int dns_message_gettimeadjust(dns_message_t *msg); /*%< * Return the current time adjustment. diff --git a/lib/dns/include/dns/peer.h b/lib/dns/include/dns/peer.h index a28c55e5..0975a1af 100644 --- a/lib/dns/include/dns/peer.h +++ b/lib/dns/include/dns/peer.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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: peer.h,v 1.31 2007/06/19 23:47:17 tbox Exp $ */ +/* $Id: peer.h,v 1.31.128.2 2008/04/03 06:08:27 tbox Exp $ */ #ifndef DNS_PEER_H #define DNS_PEER_H 1 @@ -73,10 +73,11 @@ struct dns_peer { isc_boolean_t provide_ixfr; isc_boolean_t request_ixfr; isc_boolean_t support_edns; + isc_boolean_t request_nsid; dns_name_t *key; isc_sockaddr_t *transfer_source; - isc_sockaddr_t *notify_source; - isc_sockaddr_t *query_source; + isc_sockaddr_t *notify_source; + isc_sockaddr_t *query_source; isc_uint16_t udpsize; /* recieve size */ isc_uint16_t maxudp; /* transmit size */ @@ -150,6 +151,12 @@ isc_result_t dns_peer_getprovideixfr(dns_peer_t *peer, isc_boolean_t *retval); isc_result_t +dns_peer_setrequestnsid(dns_peer_t *peer, isc_boolean_t newval); + +isc_result_t +dns_peer_getrequestnsid(dns_peer_t *peer, isc_boolean_t *retval); + +isc_result_t dns_peer_setsupportedns(dns_peer_t *peer, isc_boolean_t newval); isc_result_t diff --git a/lib/dns/include/dns/rdatalist.h b/lib/dns/include/dns/rdatalist.h index e2415488..b4ff817d 100644 --- a/lib/dns/include/dns/rdatalist.h +++ b/lib/dns/include/dns/rdatalist.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-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: rdatalist.h,v 1.20 2007/06/19 23:47:17 tbox Exp $ */ +/* $Id: rdatalist.h,v 1.20.128.2 2008/04/03 06:08:27 tbox Exp $ */ #ifndef DNS_RDATALIST_H #define DNS_RDATALIST_H 1 @@ -98,6 +98,27 @@ dns_rdatalist_tordataset(dns_rdatalist_t *rdatalist, *\li #ISC_R_SUCCESS */ +isc_result_t +dns_rdatalist_fromrdataset(dns_rdataset_t *rdataset, + dns_rdatalist_t **rdatalist); +/*%< + * Point 'rdatalist' to the rdatalist in 'rdataset'. + * + * Requires: + * + *\li 'rdatalist' is a pointer to a NULL dns_rdatalist_t pointer. + * + *\li 'rdataset' is a valid rdataset associated with an rdatalist. + * + * Ensures, + * on success, + * + *\li 'rdatalist' is pointed to the rdatalist in rdataset. + * + * Returns: + *\li #ISC_R_SUCCESS + */ + ISC_LANG_ENDDECLS #endif /* DNS_RDATALIST_H */ diff --git a/lib/dns/include/dns/resolver.h b/lib/dns/include/dns/resolver.h index 5c190aa9..8c5c7afd 100644 --- a/lib/dns/include/dns/resolver.h +++ b/lib/dns/include/dns/resolver.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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.56 2007/06/18 23:47:42 tbox Exp $ */ +/* $Id: resolver.h,v 1.56.128.2 2008/04/03 06:08:27 tbox Exp $ */ #ifndef DNS_RESOLVER_H #define DNS_RESOLVER_H 1 @@ -93,7 +93,8 @@ typedef struct dns_fetchevent { #define DNS_FETCHOPT_FORWARDONLY 0x10 /*%< Only use forwarders. */ #define DNS_FETCHOPT_NOVALIDATE 0x20 /*%< Disable validation. */ #define DNS_FETCHOPT_EDNS512 0x40 /*%< Advertise a 512 byte - UDP buffer. */ + UDP buffer. */ +#define DNS_FETCHOPT_WANTNSID 0x80 /*%< Request NSID */ #define DNS_FETCHOPT_EDNSVERSIONSET 0x00800000 #define DNS_FETCHOPT_EDNSVERSIONMASK 0xff000000 @@ -470,7 +471,7 @@ dns_resolver_getclientsperquery(dns_resolver_t *resolver, isc_uint32_t *cur, isc_boolean_t dns_resolver_getzeronosoattl(dns_resolver_t *resolver); - + void dns_resolver_setzeronosoattl(dns_resolver_t *resolver, isc_boolean_t state); @@ -491,7 +492,7 @@ dns_resolver_createdispatchpool(dns_resolver_t *res, unsigned int ndisps, * Requires: * *\li 'res' is a valid resolver that has not been frozen. Also it must have - * either the _USEDISPATCHPOOL4 or _USEDISPATCHPOOL6 option. + * either the _USEDISPATCHPOOL4 or _USEDISPATCHPOOL6 option. * *\li 'taskmgr' is a valid task manager. * diff --git a/lib/dns/include/dns/stats.h b/lib/dns/include/dns/stats.h index 57fac98b..afc64242 100644 --- a/lib/dns/include/dns/stats.h +++ b/lib/dns/include/dns/stats.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: stats.h,v 1.13.128.2 2008/01/24 23:46:26 tbox Exp $ */ +/* $Id: stats.h,v 1.13.128.5 2008/04/08 03:46:36 each Exp $ */ #ifndef DNS_STATS_H #define DNS_STATS_H 1 @@ -25,9 +25,58 @@ #include <dns/types.h> /*% - * Query statistics counter types. + * Statistics counters. Used as dns_statscounter_t values. */ -typedef enum { +enum { + /*% + * Resolver statistics counters. + */ + dns_resstatscounter_queryv4 = 0, + dns_resstatscounter_queryv6 = 1, + dns_resstatscounter_responsev4 = 2, + dns_resstatscounter_responsev6 = 3, + dns_resstatscounter_nxdomain = 4, + dns_resstatscounter_servfail = 5, + dns_resstatscounter_formerr = 6, + dns_resstatscounter_othererror = 7, + dns_resstatscounter_edns0fail = 8, + dns_resstatscounter_mismatch = 9, + dns_resstatscounter_truncated = 10, + dns_resstatscounter_lame = 11, + dns_resstatscounter_retry = 12, + dns_resstatscounter_gluefetchv4 = 13, + dns_resstatscounter_gluefetchv6 = 14, + dns_resstatscounter_gluefetchv4fail = 15, + dns_resstatscounter_gluefetchv6fail = 16, + dns_resstatscounter_val = 17, + dns_resstatscounter_valsuccess = 18, + dns_resstatscounter_valnegsuccess = 19, + dns_resstatscounter_valfail = 20, + + dns_resstatscounter_max = 21, + + /*% + * Zone statistics counters. + */ + dns_zonestatscounter_notifyoutv4 = 0, + dns_zonestatscounter_notifyoutv6 = 1, + dns_zonestatscounter_notifyinv4 = 2, + dns_zonestatscounter_notifyinv6 = 3, + dns_zonestatscounter_notifyrej = 4, + dns_zonestatscounter_soaoutv4 = 5, + dns_zonestatscounter_soaoutv6 = 6, + dns_zonestatscounter_axfrreqv4 = 7, + dns_zonestatscounter_axfrreqv6 = 8, + dns_zonestatscounter_ixfrreqv4 = 9, + dns_zonestatscounter_ixfrreqv6 = 10, + dns_zonestatscounter_xfrsuccess = 11, + dns_zonestatscounter_xfrfail = 12, + + dns_zonestatscounter_max = 13, + + /*% + * Query statistics counters (obsolete). + */ dns_statscounter_success = 0, /*%< Successful lookup */ dns_statscounter_referral = 1, /*%< Referral result */ dns_statscounter_nxrrset = 2, /*%< NXRRSET result */ @@ -35,64 +84,242 @@ typedef enum { dns_statscounter_recursion = 4, /*%< Recursion was used */ dns_statscounter_failure = 5, /*%< Some other failure */ dns_statscounter_duplicate = 6, /*%< Duplicate query */ - dns_statscounter_dropped = 7 /*%< Duplicate query */ -} dns_statscounter_t; + dns_statscounter_dropped = 7 /*%< Duplicate query (dropped) */ +}; #define DNS_STATS_NCOUNTERS 8 +/*%< + * Flag(s) for dns_xxxstats_dump(). + */ +#define DNS_STATSDUMP_VERBOSE 0x00000001 /*%< dump 0-value counters */ + +/*%< + * (Obsoleted) + */ LIBDNS_EXTERNAL_DATA extern const char *dns_statscounter_names[]; +/*% + * Attributes for statistics counters of RRset and Rdatatype types. + * + * _OTHERTYPE + * The rdata type is not explicitly supported and the corresponding counter + * is counted for other such types, too. When this attribute is set, + * the base type is of no use. + * + * _NXRRSET + * RRset type counters only. Indicates the RRset is non existent. + * + * _NXDOMAIN + * RRset type counters only. Indicates a non existent name. When this + * attribute is set, the base type is of no use. + */ +#define DNS_RDATASTATSTYPE_ATTR_OTHERTYPE 0x0001 +#define DNS_RDATASTATSTYPE_ATTR_NXRRSET 0x0002 +#define DNS_RDATASTATSTYPE_ATTR_NXDOMAIN 0x0004 + +/*%< + * Conversion macros among dns_rdatatype_t, attributes and dns_statscounter_t. + */ +#define DNS_RDATASTATSTYPE_BASE(type) ((dns_rdatatype_t)((type) & 0xFFFF)) +#define DNS_RDATASTATSTYPE_ATTR(type) ((type) >> 16) +#define DNS_RDATASTATSTYPE_VALUE(b, a) (((a) << 16) | (b)) + +/*%< + * Types of dump callbacks. + */ +typedef void (*dns_generalstats_dumper_t)(dns_statscounter_t, isc_uint64_t, + void *); +typedef void (*dns_rdatatypestats_dumper_t)(dns_rdatastatstype_t, isc_uint64_t, + void *); +typedef void (*dns_opcodestats_dumper_t)(dns_opcode_t, isc_uint64_t, void *); + isc_result_t -dns_stats_create(isc_mem_t *mctx, dns_stats_t **statsp); +dns_generalstats_create(isc_mem_t *mctx, dns_stats_t **statsp, int ncounters); /*%< - * Create a statistics counter structure. + * Create a statistics counter structure of general type. It counts a general + * set of counters indexed by an ID between 0 and ncounters -1. * * Requires: + *\li 'mctx' must be a valid memory context. + * + *\li 'statsp' != NULL && '*statsp' == NULL. + * + * Returns: + *\li ISC_R_SUCCESS -- all ok * + *\li anything else -- failure + */ + +isc_result_t +dns_rdatatypestats_create(isc_mem_t *mctx, dns_stats_t **statsp); +/*%< + * Create a statistics counter structure per rdatatype. + * + * Requires: *\li 'mctx' must be a valid memory context. * *\li 'statsp' != NULL && '*statsp' == NULL. + * + * Returns: + *\li ISC_R_SUCCESS -- all ok + * + *\li anything else -- failure */ -void -dns_stats_destroy(isc_mem_t *mctx, dns_stats_t **statsp); +isc_result_t +dns_rdatasetstats_create(isc_mem_t *mctx, dns_stats_t **statsp); /*%< - * Destroy a statistics counter structure. + * Create a statistics counter structure per RRset. * * Requires: + *\li 'mctx' must be a valid memory context. + * + *\li 'statsp' != NULL && '*statsp' == NULL. + * + * Returns: + *\li ISC_R_SUCCESS -- all ok + * + *\li anything else -- failure + */ + +isc_result_t +dns_opcodestats_create(isc_mem_t *mctx, dns_stats_t **statsp); +/*%< + * Create a statistics counter structure per opcode. * + * Requires: *\li 'mctx' must be a valid memory context. * - *\li 'statsp' != NULL and '*statsp' be valid dns_stats_t. + *\li 'statsp' != NULL && '*statsp' == NULL. + * + * Returns: + *\li ISC_R_SUCCESS -- all ok + * + *\li anything else -- failure + */ + +void +dns_stats_attach(dns_stats_t *stats, dns_stats_t **statsp); +/*%< + * Attach to a statistics set. + * + * Requires: + *\li 'stats' is a valid dns_stats_t. * - * Ensures: + *\li 'statsp' != NULL && '*statsp' == NULL + */ + +void +dns_stats_detach(dns_stats_t **statsp); +/*%< + * Detaches from the statistics set. * - *\li '*statsp' == NULL + * Requires: + *\li 'statsp' != NULL and '*statsp' is a valid dns_stats_t. */ void -dns_stats_incrementcounter(dns_stats_t *stat, dns_statscounter_t counter); +dns_generalstats_increment(dns_stats_t *stats, dns_statscounter_t counter); /*%< - * Increment a counter field of 'stat' specified by 'counter'. + * Increment the counter-th counter of stats. * * Requires: + *\li 'stats' is a valid dns_stats_t created by dns_generalstats_create(). * - *\li 'stat' be a valid dns_stats_t. + *\li counter is less than the maximum available ID for the stats specified + * on creation. + */ + +void +dns_rdatatypestats_increment(dns_stats_t *stats, dns_rdatatype_t type); +/*%< + * Increment the statistics counter for 'type'. * - *\li counter < DNS_STATS_NCOUNTERS + * Requires: + *\li 'stats' is a valid dns_stats_t created by dns_rdatatypestats_create(). */ void -dns_stats_copy(dns_stats_t *src, isc_uint64_t *dst); +dns_rdatasetstats_increment(dns_stats_t *stats, dns_rdatastatstype_t rrsettype); /*%< - * Copy statistics counter fields of 'src' to the 'dst' array. + * Increment the statistics counter for 'rrsettype'. * * Requires: + *\li 'stats' is a valid dns_stats_t created by dns_rdatasetstats_create(). + */ + +void +dns_rdatasetstats_decrement(dns_stats_t *stats, dns_rdatastatstype_t rrsettype); +/*%< + * Decrement the statistics counter for 'rrsettype'. * - *\li 'src' be a valid dns_stats_t. + * Requires: + *\li 'stats' is a valid dns_stats_t created by dns_rdatasetstats_create(). + */ + +void +dns_opcodestats_increment(dns_stats_t *stats, dns_opcode_t code); +/*%< + * Increment the statistics counter for 'code'. * - *\li 'dst' be sufficiently large to store DNS_STATS_NCOUNTERS 64-bit - * integers. + * Requires: + *\li 'stats' is a valid dns_stats_t created by dns_opcodestats_create(). + */ + +void +dns_generalstats_dump(dns_stats_t *stats, dns_generalstats_dumper_t dump_fn, + void *arg, unsigned int options); +/*%< + * Dump the current statistics counters in a specified way. For each counter + * in stats, dump_fn is called with its current value and the given argument + * arg. By default counters that have a value of 0 is skipped; if options has + * the DNS_STATSDUMP_VERBOSE flag, even such counters are dumped. + * + * Requires: + *\li 'stats' is a valid dns_stats_t created by dns_generalstats_create(). + */ + +void +dns_rdatatypestats_dump(dns_stats_t *stats, dns_rdatatypestats_dumper_t dump_fn, + void *arg, unsigned int options); +/*%< + * Dump the current statistics counters in a specified way. For each counter + * in stats, dump_fn is called with the corresponding type in the form of + * dns_rdatastatstype_t, the current counter value and the given argument + * arg. By default counters that have a value of 0 is skipped; if options has + * the DNS_STATSDUMP_VERBOSE flag, even such counters are dumped. + * + * Requires: + *\li 'stats' is a valid dns_stats_t created by dns_generalstats_create(). + */ + +void +dns_rdatasetstats_dump(dns_stats_t *stats, dns_rdatatypestats_dumper_t dump_fn, + void *arg, unsigned int options); +/*%< + * Dump the current statistics counters in a specified way. For each counter + * in stats, dump_fn is called with the corresponding type in the form of + * dns_rdatastatstype_t, the current counter value and the given argument + * arg. By default counters that have a value of 0 is skipped; if options has + * the DNS_STATSDUMP_VERBOSE flag, even such counters are dumped. + * + * Requires: + *\li 'stats' is a valid dns_stats_t created by dns_generalstats_create(). + */ + +void +dns_opcodestats_dump(dns_stats_t *stats, dns_opcodestats_dumper_t dump_fn, + void *arg, unsigned int options); +/*%< + * Dump the current statistics counters in a specified way. For each counter + * in stats, dump_fn is called with the corresponding opcode, the current + * counter value and the given argument arg. By default counters that have a + * value of 0 is skipped; if options has the DNS_STATSDUMP_VERBOSE flag, even + * such counters are dumped. + * + * Requires: + *\li 'stats' is a valid dns_stats_t created by dns_generalstats_create(). */ isc_result_t @@ -101,7 +328,7 @@ dns_stats_alloccounters(isc_mem_t *mctx, isc_uint64_t **ctrp); * Allocate an array of query statistics counters from the memory * context 'mctx'. * - * This function is obsoleted. Use dns_stats_create() instead. + * This function is obsoleted. Use dns_xxxstats_create() instead. */ void diff --git a/lib/dns/include/dns/types.h b/lib/dns/include/dns/types.h index d13b2c82..ea20787e 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.126.62.2 2008/01/24 23:46:26 tbox Exp $ */ +/* $Id: types.h,v 1.126.62.3 2008/04/03 06:10:21 marka Exp $ */ #ifndef DNS_TYPES_H #define DNS_TYPES_H 1 @@ -107,6 +107,8 @@ typedef struct dns_signature dns_signature_t; typedef struct dns_ssurule dns_ssurule_t; typedef struct dns_ssutable dns_ssutable_t; typedef struct dns_stats dns_stats_t; +typedef int dns_statscounter_t; +typedef isc_uint32_t dns_rdatastatstype_t; typedef struct dns_tkeyctx dns_tkeyctx_t; typedef isc_uint16_t dns_trust_t; typedef struct dns_tsig_keyring dns_tsig_keyring_t; diff --git a/lib/dns/include/dns/view.h b/lib/dns/include/dns/view.h index 4964bd1f..a488a62c 100644 --- a/lib/dns/include/dns/view.h +++ b/lib/dns/include/dns/view.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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.107 2007/06/18 23:47:42 tbox Exp $ */ +/* $Id: view.h,v 1.107.128.4 2008/04/03 06:20:34 tbox Exp $ */ #ifndef DNS_VIEW_H #define DNS_VIEW_H 1 @@ -70,7 +70,6 @@ #include <isc/refcount.h> #include <isc/rwlock.h> #include <isc/stdtime.h> -#include <isc/xml.h> #include <dns/acl.h> #include <dns/fixedname.h> @@ -101,6 +100,8 @@ struct dns_view { isc_event_t resevent; isc_event_t adbevent; isc_event_t reqevent; + dns_stats_t * resstats; + dns_stats_t * resquerystats; /* Configurable data. */ dns_tsig_keyring_t * statickeys; @@ -124,6 +125,7 @@ struct dns_view { dns_acl_t * sortlist; isc_boolean_t requestixfr; isc_boolean_t provideixfr; + isc_boolean_t requestnsid; dns_ttl_t maxcachettl; dns_ttl_t maxncachettl; in_port_t dstport; @@ -596,7 +598,7 @@ dns_viewlist_find(dns_viewlist_t *list, const char *name, isc_result_t dns_viewlist_findzone(dns_viewlist_t *list, dns_name_t *name, isc_boolean_t allclasses, - dns_rdataclass_t rdclass, dns_zone_t **zonep); + dns_rdataclass_t rdclass, dns_zone_t **zonep); /*%< * Search zone with 'name' in view with 'rdclass' in viewlist 'list' @@ -632,7 +634,7 @@ dns_view_loadnew(dns_view_t *view, isc_boolean_t stop); /*%< * Load zones attached to this view. dns_view_load() loads * all zones whose master file has changed since the last - * load; dns_view_loadnew() loads only zones that have never + * load; dns_view_loadnew() loads only zones that have never * been loaded. * * If 'stop' is ISC_TRUE, stop on the first error and return it. @@ -708,7 +710,7 @@ dns_view_dumpdbtostream(dns_view_t *view, FILE *fp); * easily obtainable by other means. * * Requires: - * + * *\li 'view' is valid. * *\li 'fp' refers to a file open for writing. @@ -751,7 +753,7 @@ isc_result_t dns_view_adddelegationonly(dns_view_t *view, dns_name_t *name); /*%< * Add the given name to the delegation only table. - * + * * * Requires: *\li 'view' is valid. @@ -766,7 +768,7 @@ isc_result_t dns_view_excludedelegationonly(dns_view_t *view, dns_name_t *name); /*%< * Add the given name to be excluded from the root-delegation-only. - * + * * * Requires: *\li 'view' is valid. @@ -819,11 +821,55 @@ dns_view_freezezones(dns_view_t *view, isc_boolean_t freeze); * \li 'view' is valid. */ -#ifdef HAVE_LIBXML2 +void +dns_view_setresstats(dns_view_t *view, dns_stats_t *stats); +/*%< + * Set a general resolver statistics counter set 'stats' for 'view'. + * + * Requires: + * \li 'view' is valid and is not frozen. + * + *\li stats is a valid statistics supporting resolver statistics counters + * (see dns/stats.h). + */ -isc_result_t -dns_view_xmlrender(dns_view_t *view, xmlTextWriterPtr xml, int flags); +void +dns_view_getresstats(dns_view_t *view, dns_stats_t **statsp); +/*%< + * Get the general statistics counter set for 'view'. If a statistics set is + * set '*statsp' will be attached to the set; otherwise, '*statsp' will be + * untouched. + * + * Requires: + * \li 'view' is valid and is not frozen. + * + *\li 'statsp' != NULL && '*statsp' != NULL + */ + +void +dns_view_setresquerystats(dns_view_t *view, dns_stats_t *stats); +/*%< + * Set a statistics counter set of rdata type, 'stats', for 'view'. Once the + * statistic set is installed, view's resolver will count outgoing queries + * per rdata type. + * + * Requires: + * \li 'view' is valid and is not frozen. + * + *\li stats is a valid statistics created by dns_rdatatypestats_create(). + */ -#endif +void +dns_view_getresquerystats(dns_view_t *view, dns_stats_t **statsp); +/*%< + * Get the rdatatype statistics counter set for 'view'. If a statistics set is + * set '*statsp' will be attached to the set; otherwise, '*statsp' will be + * untouched. + * + * Requires: + * \li 'view' is valid and is not frozen. + * + *\li 'statsp' != NULL && '*statsp' != NULL + */ #endif /* DNS_VIEW_H */ diff --git a/lib/dns/include/dns/zone.h b/lib/dns/include/dns/zone.h index dc4d1983..27ef22ce 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.153.56.2 2008/01/24 23:46:26 tbox Exp $ */ +/* $Id: zone.h,v 1.153.56.3 2008/04/03 06:10:21 marka Exp $ */ #ifndef DNS_ZONE_H #define DNS_ZONE_H 1 @@ -31,7 +31,6 @@ #include <isc/formatcheck.h> #include <isc/lang.h> #include <isc/rwlock.h> -#include <isc/xml.h> #include <dns/masterdump.h> #include <dns/types.h> @@ -148,6 +147,15 @@ dns_zone_getclass(dns_zone_t *zone); *\li 'zone' to be a valid zone. */ +isc_uint32_t +dns_zone_getserial(dns_zone_t *zone); +/*%< + * Returns the current serial number of the zone. + * + * Requires: + *\li 'zone' to be a valid zone. + */ + void dns_zone_settype(dns_zone_t *zone, dns_zonetype_t type); /*%< @@ -1479,28 +1487,55 @@ dns_zone_isforced(dns_zone_t *zone); isc_result_t dns_zone_setstatistics(dns_zone_t *zone, isc_boolean_t on); /*%< - * Make the zone keep or not keep an array of statistics - * counter. - * - * Requires: - * \li zone be a valid zone. + * This function is obsoleted by dns_zone_setrequeststats(). */ isc_uint64_t * dns_zone_getstatscounters(dns_zone_t *zone); /*%< - * This function is obsoleted by dns_zone_getstats(). + * This function is obsoleted by dns_zone_getrequeststats(). + */ + +void +dns_zone_setstats(dns_zone_t *zone, dns_stats_t *stats); +/*%< + * Set a general zone-maintenance statistics set 'stats' for 'zone'. This + * function is expected to be called only on zone creation (when necessary). + * Once installed, it cannot be removed or replaced. Also, there is no + * interface to get the installed stats from the zone; the caller must keep the + * stats to reference (e.g. dump) it later. + * + * Requires: + * \li 'zone' to be a valid zone and does not have a statistics set already + * installed. + * + *\li stats is a valid statistics supporting zone statistics counters + * (see dns/stats.h). + */ + +void +dns_zone_setrequeststats(dns_zone_t *zone, dns_stats_t *stats); +/*%< + * Set an additional statistics set to zone. It is attached in the zone + * but is not counted in the zone module; only the caller updates the counters. + * + * Requires: + * \li 'zone' to be a valid zone. + * + *\li stats is a valid statistics. */ dns_stats_t * -dns_zone_getstats(dns_zone_t *zone); +dns_zone_getrequeststats(dns_zone_t *zone); /*%< + * Get the additional statistics for zone, if one is installed. + * * Requires: - * zone be a valid zone. + * \li 'zone' to be a valid zone. * * Returns: - * \li A pointer to the zone's array of statistics counters, - * or NULL if it has none. + * \li when available, a pointer to the statistics set installed in zone; + * otherwise NULL. */ void @@ -1636,13 +1671,6 @@ dns_zone_setisself(dns_zone_t *zone, dns_isselffunc_t isself, void *arg); * delivered to 'myview'. */ -#ifdef HAVE_LIBXML2 - -isc_result_t -dns_zone_xmlrender(dns_zone_t *zone, xmlTextWriterPtr xml, int flags); - -#endif - ISC_LANG_ENDDECLS #endif /* DNS_ZONE_H */ diff --git a/lib/dns/masterdump.c b/lib/dns/masterdump.c index 8b3ebd66..0c48eee7 100644 --- a/lib/dns/masterdump.c +++ b/lib/dns/masterdump.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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: masterdump.c,v 1.89 2007/06/19 23:47:16 tbox Exp $ */ +/* $Id: masterdump.c,v 1.89.128.2 2008/04/09 22:53:06 tbox Exp $ */ /*! \file */ @@ -183,7 +183,7 @@ struct dns_dumpctx { isc_buffer_t *buffer, FILE *f); }; -#define NXDOMAIN(x) (((x)->attributes & DNS_RDATASETATTR_NXDOMAIN) != 0) +#define NXDOMAIN(x) (((x)->attributes & DNS_RDATASETATTR_NXDOMAIN) != 0) /*% * Output tabs and spaces to go from column '*current' to @@ -1020,9 +1020,9 @@ dumpctx_destroy(dns_dumpctx_t *dctx) { dctx->magic = 0; DESTROYLOCK(&dctx->lock); + dns_dbiterator_destroy(&dctx->dbiter); if (dctx->version != NULL) dns_db_closeversion(dctx->db, &dctx->version, ISC_FALSE); - dns_dbiterator_destroy(&dctx->dbiter); dns_db_detach(&dctx->db); if (dctx->task != NULL) isc_task_detach(&dctx->task); @@ -1071,13 +1071,13 @@ dns_dumpctx_detach(dns_dumpctx_t **dctxp) { dns_dbversion_t * dns_dumpctx_version(dns_dumpctx_t *dctx) { - REQUIRE(DNS_DCTX_VALID(dctx)); + REQUIRE(DNS_DCTX_VALID(dctx)); return (dctx->version); } dns_db_t * dns_dumpctx_db(dns_dumpctx_t *dctx) { - REQUIRE(DNS_DCTX_VALID(dctx)); + REQUIRE(DNS_DCTX_VALID(dctx)); return (dctx->db); } @@ -1703,10 +1703,10 @@ dns_master_dumpnode(isc_mem_t *mctx, dns_db_t *db, dns_dbversion_t *version, isc_result_t dns_master_stylecreate(dns_master_style_t **stylep, unsigned int flags, - unsigned int ttl_column, unsigned int class_column, - unsigned int type_column, unsigned int rdata_column, - unsigned int line_length, unsigned int tab_width, - isc_mem_t *mctx) + unsigned int ttl_column, unsigned int class_column, + unsigned int type_column, unsigned int rdata_column, + unsigned int line_length, unsigned int tab_width, + isc_mem_t *mctx) { dns_master_style_t *style; diff --git a/lib/dns/message.c b/lib/dns/message.c index b798f25a..29958cce 100644 --- a/lib/dns/message.c +++ b/lib/dns/message.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: message.c,v 1.237.110.3 2008/01/17 23:46:37 tbox Exp $ */ +/* $Id: message.c,v 1.237.110.5 2008/04/03 10:50:01 marka Exp $ */ /*! \file */ @@ -24,6 +24,7 @@ ***/ #include <config.h> +#include <ctype.h> #include <isc/buffer.h> #include <isc/mem.h> @@ -1488,14 +1489,8 @@ getsection(isc_buffer_t *source, dns_message_t *msg, dns_decompress_t *dctx, rdataset->ttl = ttl; } - /* - * XXXMLG Perform a totally ugly hack here to pull - * the rdatalist out of the private field in the rdataset, - * and append this rdata to the rdatalist's linked list - * of rdata. - */ - rdatalist = (dns_rdatalist_t *)(rdataset->private1); - + /* Append this rdata to the rdataset. */ + dns_rdatalist_fromrdataset(rdataset, &rdatalist); ISC_LIST_APPEND(rdatalist->rdata, rdata, link); /* @@ -3127,6 +3122,10 @@ dns_message_pseudosectiontotext(dns_message_t *msg, isc_result_t result; char buf[sizeof("1234567890")]; isc_uint32_t mbz; + dns_rdata_t rdata; + isc_buffer_t optbuf; + isc_uint16_t optcode, optlen; + unsigned char *optdata; REQUIRE(DNS_MESSAGE_VALID(msg)); REQUIRE(target != NULL); @@ -3156,6 +3155,50 @@ dns_message_pseudosectiontotext(dns_message_t *msg, ADD_STRING(target, "; udp: "); snprintf(buf, sizeof(buf), "%u\n", (unsigned int)ps->rdclass); ADD_STRING(target, buf); + + result = dns_rdataset_first(ps); + if (result != ISC_R_SUCCESS) + return (ISC_R_SUCCESS); + + /* Print EDNS info, if any */ + dns_rdata_init(&rdata); + dns_rdataset_current(ps, &rdata); + if (rdata.length < 4) + return (ISC_R_SUCCESS); + + isc_buffer_init(&optbuf, rdata.data, rdata.length); + isc_buffer_add(&optbuf, rdata.length); + optcode = isc_buffer_getuint16(&optbuf); + optlen = isc_buffer_getuint16(&optbuf); + + if (optcode == DNS_OPT_NSID) { + ADD_STRING(target, "; NSID"); + } else { + ADD_STRING(target, "; OPT="); + sprintf(buf, "%u", optcode); + ADD_STRING(target, buf); + } + + if (optlen != 0) { + int i; + ADD_STRING(target, ": "); + + optdata = rdata.data + 4; + for (i = 0; i < optlen; i++) { + sprintf(buf, "%02x ", optdata[i]); + ADD_STRING(target, buf); + } + for (i = 0; i < optlen; i++) { + ADD_STRING(target, " ("); + if (isprint(optdata[i])) + isc_buffer_putmem(target, &optdata[i], + 1); + else + isc_buffer_putstr(target, "."); + ADD_STRING(target, ")"); + } + } + ADD_STRING(target, "\n"); return (ISC_R_SUCCESS); case DNS_PSEUDOSECTION_TSIG: ps = dns_message_gettsig(msg, &name); diff --git a/lib/dns/name.c b/lib/dns/name.c index a15c7d23..638cdc86 100644 --- a/lib/dns/name.c +++ b/lib/dns/name.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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: name.c,v 1.163 2007/06/19 23:47:16 tbox Exp $ */ +/* $Id: name.c,v 1.163.128.2 2008/03/31 23:46:42 tbox Exp $ */ /*! \file */ @@ -155,7 +155,7 @@ do { \ static unsigned char root_ndata[] = { '\0' }; static unsigned char root_offsets[] = { 0 }; -static dns_name_t root = +static dns_name_t root = { DNS_NAME_MAGIC, root_ndata, 1, 1, @@ -298,7 +298,7 @@ dns_name_ismailbox(const dns_name_t *name) { REQUIRE(name->labels > 0); REQUIRE(name->attributes & DNS_NAMEATTR_ABSOLUTE); - /* + /* * Root label. */ if (name->length == 1) @@ -312,7 +312,7 @@ dns_name_ismailbox(const dns_name_t *name) { if (!domainchar(ch)) return (ISC_FALSE); } - + if (ndata == name->ndata + name->length) return (ISC_FALSE); @@ -347,8 +347,8 @@ dns_name_ishostname(const dns_name_t *name, isc_boolean_t wildcard) { REQUIRE(VALID_NAME(name)); REQUIRE(name->labels > 0); REQUIRE(name->attributes & DNS_NAMEATTR_ABSOLUTE); - - /* + + /* * Root label. */ if (name->length == 1) @@ -918,7 +918,7 @@ dns_name_getlabelsequence(const dns_name_t *source, target->ndata = &source->ndata[firstoffset]; target->length = endoffset - firstoffset; - + if (first + n == source->labels && n > 0 && (source->attributes & DNS_NAMEATTR_ABSOLUTE) != 0) target->attributes |= DNS_NAMEATTR_ABSOLUTE; @@ -991,7 +991,7 @@ dns_name_fromregion(dns_name_t *name, const isc_region_t *r) { name->length = len; } else { name->ndata = r->base; - name->length = (r->length <= DNS_NAME_MAXWIRE) ? + name->length = (r->length <= DNS_NAME_MAXWIRE) ? r->length : DNS_NAME_MAXWIRE; } @@ -1049,7 +1049,7 @@ dns_name_fromtext(dns_name_t *name, isc_buffer_t *source, REQUIRE(ISC_BUFFER_VALID(source)); REQUIRE((target != NULL && ISC_BUFFER_VALID(target)) || (target == NULL && ISC_BUFFER_VALID(name->buffer))); - + downcase = ISC_TF((options & DNS_NAME_DOWNCASE) != 0); if (target == NULL && name->buffer != NULL) { @@ -1303,8 +1303,9 @@ totext_filter_proc_key_init(void) { result = isc_mem_create2(0, 0, &thread_key_mctx, 0); if (result != ISC_R_SUCCESS) goto unlock; + isc_mem_setname(thread_key_mctx, "threadkey", NULL); isc_mem_setdestroycheck(thread_key_mctx, ISC_FALSE); - + if (!thread_key_initialized && isc_thread_key_create(&totext_filter_proc_key, free_specific) != 0) { @@ -2299,7 +2300,7 @@ dns_name_settotextfilter(dns_name_totextfilter_t proc) { result = ISC_R_UNEXPECTED; return (result); } - + mem = isc_mem_get(thread_key_mctx, sizeof(*mem)); if (mem == NULL) return (ISC_R_NOMEMORY); diff --git a/lib/dns/peer.c b/lib/dns/peer.c index 8ed33859..c5aad7dc 100644 --- a/lib/dns/peer.c +++ b/lib/dns/peer.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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: peer.c,v 1.29 2007/06/19 23:47:16 tbox Exp $ */ +/* $Id: peer.c,v 1.29.128.2 2008/04/03 06:08:27 tbox Exp $ */ /*! \file */ @@ -42,6 +42,7 @@ #define SUPPORT_EDNS_BIT 5 #define SERVER_UDPSIZE_BIT 6 #define SERVER_MAXUDP_BIT 7 +#define REQUEST_NSID_BIT 8 static void peerlist_delete(dns_peerlist_t **list); @@ -146,7 +147,7 @@ dns_peerlist_addpeer(dns_peerlist_t *peers, dns_peer_t *peer) { ISC_LIST_INSERTBEFORE(peers->elements, p, peer, next); else ISC_LIST_APPEND(peers->elements, peer, next); - + } isc_result_t @@ -213,7 +214,7 @@ dns_peer_new(isc_mem_t *mem, isc_netaddr_t *addr, dns_peer_t **peerptr) { isc_result_t dns_peer_newprefix(isc_mem_t *mem, isc_netaddr_t *addr, unsigned int prefixlen, dns_peer_t **peerptr) -{ +{ dns_peer_t *peer; REQUIRE(peerptr != NULL); @@ -416,6 +417,32 @@ dns_peer_getsupportedns(dns_peer_t *peer, isc_boolean_t *retval) { } isc_result_t +dns_peer_setrequestnsid(dns_peer_t *peer, isc_boolean_t newval) { + isc_boolean_t existed; + + REQUIRE(DNS_PEER_VALID(peer)); + + existed = DNS_BIT_CHECK(REQUEST_NSID_BIT, &peer->bitflags); + + peer->request_nsid = newval; + DNS_BIT_SET(REQUEST_NSID_BIT, &peer->bitflags); + + return (existed ? ISC_R_EXISTS : ISC_R_SUCCESS); +} + +isc_result_t +dns_peer_getrequestnsid(dns_peer_t *peer, isc_boolean_t *retval) { + REQUIRE(DNS_PEER_VALID(peer)); + REQUIRE(retval != NULL); + + if (DNS_BIT_CHECK(REQUEST_NSID_BIT, &peer->bitflags)) { + *retval = peer->request_nsid; + return (ISC_R_SUCCESS); + } else + return (ISC_R_NOTFOUND); +} + +isc_result_t dns_peer_settransfers(dns_peer_t *peer, isc_uint32_t newval) { isc_boolean_t existed; @@ -544,7 +571,7 @@ dns_peer_settransfersource(dns_peer_t *peer, } if (transfer_source != NULL) { peer->transfer_source = isc_mem_get(peer->mem, - sizeof(*peer->transfer_source)); + sizeof(*peer->transfer_source)); if (peer->transfer_source == NULL) return (ISC_R_NOMEMORY); @@ -577,7 +604,7 @@ dns_peer_setnotifysource(dns_peer_t *peer, } if (notify_source != NULL) { peer->notify_source = isc_mem_get(peer->mem, - sizeof(*peer->notify_source)); + sizeof(*peer->notify_source)); if (peer->notify_source == NULL) return (ISC_R_NOMEMORY); @@ -608,7 +635,7 @@ dns_peer_setquerysource(dns_peer_t *peer, const isc_sockaddr_t *query_source) { } if (query_source != NULL) { peer->query_source = isc_mem_get(peer->mem, - sizeof(*peer->query_source)); + sizeof(*peer->query_source)); if (peer->query_source == NULL) return (ISC_R_NOMEMORY); @@ -649,11 +676,11 @@ dns_peer_getudpsize(dns_peer_t *peer, isc_uint16_t *udpsize) { REQUIRE(udpsize != NULL); if (DNS_BIT_CHECK(SERVER_UDPSIZE_BIT, &peer->bitflags)) { - *udpsize = peer->udpsize; - return (ISC_R_SUCCESS); - } else { - return (ISC_R_NOTFOUND); - } + *udpsize = peer->udpsize; + return (ISC_R_SUCCESS); + } else { + return (ISC_R_NOTFOUND); + } } isc_result_t @@ -677,9 +704,9 @@ dns_peer_getmaxudp(dns_peer_t *peer, isc_uint16_t *maxudp) { REQUIRE(maxudp != NULL); if (DNS_BIT_CHECK(SERVER_MAXUDP_BIT, &peer->bitflags)) { - *maxudp = peer->maxudp; - return (ISC_R_SUCCESS); - } else { - return (ISC_R_NOTFOUND); - } + *maxudp = peer->maxudp; + return (ISC_R_SUCCESS); + } else { + return (ISC_R_NOTFOUND); + } } diff --git a/lib/dns/rbt.c b/lib/dns/rbt.c index e6fc6328..b045cea1 100644 --- a/lib/dns/rbt.c +++ b/lib/dns/rbt.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rbt.c,v 1.138.36.2 2008/01/22 23:27:35 tbox Exp $ */ +/* $Id: rbt.c,v 1.138.36.3 2008/03/31 13:18:00 fdupont Exp $ */ /*! \file */ @@ -2056,10 +2056,6 @@ dns_rbt_deletetreeflat(dns_rbt_t *rbt, unsigned int quantum, node = LEFT(node); goto traverse; } - if (RIGHT(node) != NULL) { - node = RIGHT(node); - goto traverse; - } if (DOWN(node) != NULL) { node = DOWN(node); goto traverse; @@ -2076,14 +2072,15 @@ dns_rbt_deletetreeflat(dns_rbt_t *rbt, unsigned int quantum, node->magic = 0; #endif parent = PARENT(node); + if (RIGHT(node) != NULL) + PARENT(RIGHT(node)) = parent; if (parent != NULL) { if (LEFT(parent) == node) - LEFT(parent) = NULL; + LEFT(parent) = RIGHT(node); else if (DOWN(parent) == node) - DOWN(parent) = NULL; - else if (RIGHT(parent) == node) - RIGHT(parent) = NULL; - } + DOWN(parent) = RIGHT(node); + } else + parent = RIGHT(node); isc_mem_put(rbt->mctx, node, NODE_SIZE(node)); rbt->nodecount--; diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index 6ecc2eec..d2d3630f 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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.248 2007/12/02 20:27:35 marka Exp $ */ +/* $Id: rbtdb.c,v 1.248.12.8 2008/05/01 18:32:31 jinmei Exp $ */ /*! \file */ @@ -53,6 +53,7 @@ #include <dns/rdatasetiter.h> #include <dns/rdataslab.h> #include <dns/result.h> +#include <dns/stats.h> #include <dns/view.h> #include <dns/zone.h> #include <dns/zonekey.h> @@ -74,7 +75,7 @@ * ISC_MAGIC_VALID cannot be used. */ #define VALID_RBTDB(rbtdb) ((rbtdb) != NULL && \ - (rbtdb)->common.impmagic == RBTDB_MAGIC) + (rbtdb)->common.impmagic == RBTDB_MAGIC) #ifdef DNS_RBTDB_VERSION64 typedef isc_uint64_t rbtdb_serial_t; @@ -96,15 +97,15 @@ typedef isc_uint32_t rbtdb_rdatatype_t; #define RBTDB_RDATATYPE_VALUE(b, e) (((e) << 16) | (b)) #define RBTDB_RDATATYPE_SIGNSEC \ - RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, dns_rdatatype_nsec) + RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, dns_rdatatype_nsec) #define RBTDB_RDATATYPE_SIGNS \ - RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, dns_rdatatype_ns) + RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, dns_rdatatype_ns) #define RBTDB_RDATATYPE_SIGCNAME \ - RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, dns_rdatatype_cname) + RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, dns_rdatatype_cname) #define RBTDB_RDATATYPE_SIGDNAME \ - RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, dns_rdatatype_dname) + RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, dns_rdatatype_dname) #define RBTDB_RDATATYPE_NCACHEANY \ - RBTDB_RDATATYPE_VALUE(0, dns_rdatatype_any) + RBTDB_RDATATYPE_VALUE(0, dns_rdatatype_any) /* * We use rwlock for DB lock only when ISC_RWLOCK_USEATOMIC is non 0. @@ -181,10 +182,6 @@ typedef isc_mutex_t nodelock_t; #define NODE_WEAKDOWNGRADE(l) ((void)0) #endif -#ifndef DNS_RDATASET_FIXED -#define DNS_RDATASET_FIXED 1 -#endif - /* * Allow clients with a virtual time of up to 5 minutes in the past to see * records that would have otherwise have expired. @@ -192,75 +189,75 @@ typedef isc_mutex_t nodelock_t; #define RBTDB_VIRTUAL 300 struct noqname { - dns_name_t name; - void * nsec; - void * nsecsig; + dns_name_t name; + void * nsec; + void * nsecsig; }; typedef struct acachectl acachectl_t; typedef struct rdatasetheader { - /*% - * Locked by the owning node's lock. - */ - rbtdb_serial_t serial; - dns_ttl_t rdh_ttl; - rbtdb_rdatatype_t type; - isc_uint16_t attributes; - dns_trust_t trust; - struct noqname *noqname; - /*%< - * We don't use the LIST macros, because the LIST structure has - * both head and tail pointers, and is doubly linked. - */ - - struct rdatasetheader *next; - /*%< - * If this is the top header for an rdataset, 'next' points - * to the top header for the next rdataset (i.e., the next type). - * Otherwise, it points up to the header whose down pointer points - * at this header. - */ - - struct rdatasetheader *down; - /*%< - * Points to the header for the next older version of - * this rdataset. - */ - - isc_uint32_t count; - /*%< - * Monotonously increased every time this rdataset is bound so that - * it is used as the base of the starting point in DNS responses - * when the "cyclic" rrset-order is required. Since the ordering - * should not be so crucial, no lock is set for the counter for - * performance reasons. - */ - - acachectl_t *additional_auth; - acachectl_t *additional_glue; - - 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. - */ - - /* - * It's possible this should not be here anymore, but instead - * referenced from the bucket's heap directly. - */ + /*% + * Locked by the owning node's lock. + */ + rbtdb_serial_t serial; + dns_ttl_t rdh_ttl; + rbtdb_rdatatype_t type; + isc_uint16_t attributes; + dns_trust_t trust; + struct noqname *noqname; + /*%< + * We don't use the LIST macros, because the LIST structure has + * both head and tail pointers, and is doubly linked. + */ + + struct rdatasetheader *next; + /*%< + * If this is the top header for an rdataset, 'next' points + * to the top header for the next rdataset (i.e., the next type). + * Otherwise, it points up to the header whose down pointer points + * at this header. + */ + + struct rdatasetheader *down; + /*%< + * Points to the header for the next older version of + * this rdataset. + */ + + isc_uint32_t count; + /*%< + * Monotonously increased every time this rdataset is bound so that + * it is used as the base of the starting point in DNS responses + * when the "cyclic" rrset-order is required. Since the ordering + * should not be so crucial, no lock is set for the counter for + * performance reasons. + */ + + acachectl_t *additional_auth; + acachectl_t *additional_glue; + + 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. + */ + + /* + * It's possible this should not be here anymore, but instead + * referenced from the bucket's heap directly. + */ #if 0 - isc_heap_t *heap; + isc_heap_t *heap; #endif - unsigned int heap_index; - /*%< - * Used for TTL-based cache cleaning. - */ + unsigned int heap_index; + /*%< + * Used for TTL-based cache cleaning. + */ } rdatasetheader_t; typedef ISC_LIST(rdatasetheader_t) rdatasetheaderlist_t; @@ -271,20 +268,20 @@ typedef ISC_LIST(dns_rbtnode_t) rbtnodelist_t; #define RDATASET_ATTR_IGNORE 0x0004 #define RDATASET_ATTR_RETAIN 0x0008 #define RDATASET_ATTR_NXDOMAIN 0x0010 -#define RDATASET_ATTR_CACHE 0x1000 /* for debug */ -#define RDATASET_ATTR_CANCELED 0x2000 /* for debug */ +#define RDATASET_ATTR_RESIGN 0x0020 +#define RDATASET_ATTR_STATCOUNT 0x0040 typedef struct acache_cbarg { - dns_rdatasetadditional_t type; - unsigned int count; - dns_db_t *db; - dns_dbnode_t *node; - rdatasetheader_t *header; + dns_rdatasetadditional_t type; + unsigned int count; + dns_db_t *db; + dns_dbnode_t *node; + rdatasetheader_t *header; } acache_cbarg_t; struct acachectl { - dns_acacheentry_t *entry; - acache_cbarg_t *cbarg; + dns_acacheentry_t *entry; + acache_cbarg_t *cbarg; }; /* @@ -298,129 +295,105 @@ struct acachectl { #undef IGNORE /* WIN32 winbase.h defines this. */ #define EXISTS(header) \ - (((header)->attributes & RDATASET_ATTR_NONEXISTENT) == 0) + (((header)->attributes & RDATASET_ATTR_NONEXISTENT) == 0) #define NONEXISTENT(header) \ - (((header)->attributes & RDATASET_ATTR_NONEXISTENT) != 0) + (((header)->attributes & RDATASET_ATTR_NONEXISTENT) != 0) #define IGNORE(header) \ - (((header)->attributes & RDATASET_ATTR_IGNORE) != 0) + (((header)->attributes & RDATASET_ATTR_IGNORE) != 0) #define RETAIN(header) \ - (((header)->attributes & RDATASET_ATTR_RETAIN) != 0) + (((header)->attributes & RDATASET_ATTR_RETAIN) != 0) #define NXDOMAIN(header) \ - (((header)->attributes & RDATASET_ATTR_NXDOMAIN) != 0) + (((header)->attributes & RDATASET_ATTR_NXDOMAIN) != 0) #define DEFAULT_NODE_LOCK_COUNT 7 /*%< Should be prime. */ #define DEFAULT_CACHE_NODE_LOCK_COUNT 1009 /*%< Should be prime. */ typedef struct { - nodelock_t lock; - /* Protected in the refcount routines. */ - isc_refcount_t references; - /* Locked by lock. */ - isc_boolean_t exiting; + nodelock_t lock; + /* Protected in the refcount routines. */ + isc_refcount_t references; + /* Locked by lock. */ + isc_boolean_t exiting; } rbtdb_nodelock_t; typedef struct rbtdb_changed { - dns_rbtnode_t * node; - isc_boolean_t dirty; - ISC_LINK(struct rbtdb_changed) link; + dns_rbtnode_t * node; + isc_boolean_t dirty; + ISC_LINK(struct rbtdb_changed) link; } rbtdb_changed_t; typedef ISC_LIST(rbtdb_changed_t) rbtdb_changedlist_t; typedef struct rbtdb_version { - /* Not locked */ - rbtdb_serial_t serial; - /* - * Protected in the refcount routines. - * XXXJT: should we change the lock policy based on the refcount - * performance? - */ - isc_refcount_t references; - /* Locked by database lock. */ - isc_boolean_t writer; - isc_boolean_t commit_ok; - rbtdb_changedlist_t changed_list; - ISC_LINK(struct rbtdb_version) link; + /* Not locked */ + rbtdb_serial_t serial; + /* + * Protected in the refcount routines. + * XXXJT: should we change the lock policy based on the refcount + * performance? + */ + isc_refcount_t references; + /* Locked by database lock. */ + isc_boolean_t writer; + isc_boolean_t commit_ok; + rbtdb_changedlist_t changed_list; + ISC_LINK(struct rbtdb_version) link; } rbtdb_version_t; typedef ISC_LIST(rbtdb_version_t) rbtdb_versionlist_t; -#ifdef LRU_DEBUG -/* statistics info for testing */ -struct cachestat { - unsigned int cache_total; - int cache_current; - unsigned int ncache_total; - int ncache_current; - unsigned int a_total; - int a_current; - unsigned int aaaa_total; - int aaaa_current; - unsigned int ns_total; - int ns_current; - unsigned int ptr_total; - int ptr_current; - unsigned int glue_total; - int glue_current; - unsigned int additional_total; - int additional_current; - - unsigned int stale_purge; - unsigned int stale_scan; - unsigned int stale_expire; - unsigned int stale_lru; -}; -#endif - typedef struct { - /* Unlocked. */ - dns_db_t common; + /* Unlocked. */ + dns_db_t common; #if DNS_RBTDB_USERWLOCK - isc_rwlock_t lock; + isc_rwlock_t lock; #else - isc_mutex_t lock; -#endif - isc_rwlock_t tree_lock; - unsigned int node_lock_count; - rbtdb_nodelock_t * node_locks; - dns_rbtnode_t * origin_node; - /* Locked by lock. */ - unsigned int active; - isc_refcount_t references; - unsigned int attributes; - rbtdb_serial_t current_serial; - rbtdb_serial_t least_serial; - rbtdb_serial_t next_serial; - 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; - - /* - * This is a linked list used to implement the LRU cache. There will - * be node_lock_count linked lists here. Nodes in bucket 1 will be - * placed on the linked list rdatasets[1]. - */ - rdatasetheaderlist_t *rdatasets; - rbtnodelist_t *deadnodes; - - /* - * Heaps. Each of these is used for TTL based expiry. - */ - isc_heap_t **heaps; - - /* Locked by tree_lock. */ - dns_rbt_t * tree; - isc_boolean_t secure; - - /* Unlocked */ - unsigned int quantum; -#ifdef LRU_DEBUG - struct cachestat cachestat; + isc_mutex_t lock; #endif + isc_rwlock_t tree_lock; + unsigned int node_lock_count; + rbtdb_nodelock_t * node_locks; + dns_rbtnode_t * origin_node; + dns_stats_t * rrsetstats; /* cache DB only */ + /* Locked by lock. */ + unsigned int active; + isc_refcount_t references; + unsigned int attributes; + rbtdb_serial_t current_serial; + rbtdb_serial_t least_serial; + rbtdb_serial_t next_serial; + 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; + + /* + * This is a linked list used to implement the LRU cache. There will + * be node_lock_count linked lists here. Nodes in bucket 1 will be + * placed on the linked list rdatasets[1]. + */ + rdatasetheaderlist_t *rdatasets; + + /*% + * Temporary storage for stale cache nodes and dynamically deleted + * nodes that await being cleaned up. + */ + rbtnodelist_t *deadnodes; + + /* + * Heaps. Each of these is used for TTL based expiry. + */ + isc_heap_t **heaps; + + /* Locked by tree_lock. */ + dns_rbt_t * tree; + isc_boolean_t secure; + + /* Unlocked */ + unsigned int quantum; } dns_rbtdb_t; #define RBTDB_ATTR_LOADED 0x01 @@ -430,27 +403,27 @@ typedef struct { * Search Context */ typedef struct { - dns_rbtdb_t * rbtdb; - rbtdb_version_t * rbtversion; - rbtdb_serial_t serial; - unsigned int options; - dns_rbtnodechain_t chain; - isc_boolean_t copy_name; - isc_boolean_t need_cleanup; - isc_boolean_t wild; - dns_rbtnode_t * zonecut; - rdatasetheader_t * zonecut_rdataset; - rdatasetheader_t * zonecut_sigrdataset; - dns_fixedname_t zonecut_name; - isc_stdtime_t now; + dns_rbtdb_t * rbtdb; + rbtdb_version_t * rbtversion; + rbtdb_serial_t serial; + unsigned int options; + dns_rbtnodechain_t chain; + isc_boolean_t copy_name; + isc_boolean_t need_cleanup; + isc_boolean_t wild; + dns_rbtnode_t * zonecut; + rdatasetheader_t * zonecut_rdataset; + rdatasetheader_t * zonecut_sigrdataset; + dns_fixedname_t zonecut_name; + isc_stdtime_t now; } rbtdb_search_t; /*% * Load Context */ typedef struct { - dns_rbtdb_t * rbtdb; - isc_stdtime_t now; + dns_rbtdb_t * rbtdb; + isc_stdtime_t now; } rbtdb_load_t; static void rdataset_disassociate(dns_rdataset_t *rdataset); @@ -460,96 +433,96 @@ static void rdataset_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata); static void rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target); static unsigned int rdataset_count(dns_rdataset_t *rdataset); static isc_result_t rdataset_getnoqname(dns_rdataset_t *rdataset, - dns_name_t *name, - dns_rdataset_t *nsec, - dns_rdataset_t *nsecsig); + dns_name_t *name, + dns_rdataset_t *nsec, + dns_rdataset_t *nsecsig); static isc_result_t rdataset_getadditional(dns_rdataset_t *rdataset, - dns_rdatasetadditional_t type, - dns_rdatatype_t qtype, - dns_acache_t *acache, - dns_zone_t **zonep, - dns_db_t **dbp, - dns_dbversion_t **versionp, - dns_dbnode_t **nodep, - dns_name_t *fname, - dns_message_t *msg, - isc_stdtime_t now); + dns_rdatasetadditional_t type, + dns_rdatatype_t qtype, + dns_acache_t *acache, + dns_zone_t **zonep, + dns_db_t **dbp, + dns_dbversion_t **versionp, + dns_dbnode_t **nodep, + dns_name_t *fname, + dns_message_t *msg, + isc_stdtime_t now); static isc_result_t rdataset_setadditional(dns_rdataset_t *rdataset, - dns_rdatasetadditional_t type, - dns_rdatatype_t qtype, - dns_acache_t *acache, - dns_zone_t *zone, - dns_db_t *db, - dns_dbversion_t *version, - dns_dbnode_t *node, - dns_name_t *fname); + dns_rdatasetadditional_t type, + dns_rdatatype_t qtype, + dns_acache_t *acache, + dns_zone_t *zone, + dns_db_t *db, + dns_dbversion_t *version, + dns_dbnode_t *node, + dns_name_t *fname); static isc_result_t rdataset_putadditional(dns_acache_t *acache, - dns_rdataset_t *rdataset, - dns_rdatasetadditional_t type, - dns_rdatatype_t qtype); + dns_rdataset_t *rdataset, + dns_rdatasetadditional_t type, + dns_rdatatype_t qtype); static inline isc_boolean_t need_headerupdate(rdatasetheader_t *header, - isc_stdtime_t now); + isc_stdtime_t now); static void update_header(dns_rbtdb_t *rbtdb, rdatasetheader_t *header, - isc_stdtime_t now); + isc_stdtime_t now); static void check_stale_cache(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, - isc_stdtime_t now, isc_boolean_t tree_locked); + isc_stdtime_t now, isc_boolean_t tree_locked); static dns_rdatasetmethods_t rdataset_methods = { - rdataset_disassociate, - rdataset_first, - rdataset_next, - rdataset_current, - rdataset_clone, - rdataset_count, - NULL, - rdataset_getnoqname, - rdataset_getadditional, - rdataset_setadditional, - rdataset_putadditional + rdataset_disassociate, + rdataset_first, + rdataset_next, + rdataset_current, + rdataset_clone, + rdataset_count, + NULL, + rdataset_getnoqname, + rdataset_getadditional, + rdataset_setadditional, + rdataset_putadditional }; static void rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp); static isc_result_t rdatasetiter_first(dns_rdatasetiter_t *iterator); static isc_result_t rdatasetiter_next(dns_rdatasetiter_t *iterator); static void rdatasetiter_current(dns_rdatasetiter_t *iterator, - dns_rdataset_t *rdataset); + dns_rdataset_t *rdataset); static dns_rdatasetitermethods_t rdatasetiter_methods = { - rdatasetiter_destroy, - rdatasetiter_first, - rdatasetiter_next, - rdatasetiter_current + rdatasetiter_destroy, + rdatasetiter_first, + rdatasetiter_next, + rdatasetiter_current }; typedef struct rbtdb_rdatasetiter { - dns_rdatasetiter_t common; - rdatasetheader_t * current; + dns_rdatasetiter_t common; + rdatasetheader_t * current; } rbtdb_rdatasetiter_t; static void dbiterator_destroy(dns_dbiterator_t **iteratorp); static isc_result_t dbiterator_first(dns_dbiterator_t *iterator); static isc_result_t dbiterator_last(dns_dbiterator_t *iterator); static isc_result_t dbiterator_seek(dns_dbiterator_t *iterator, - dns_name_t *name); + dns_name_t *name); static isc_result_t dbiterator_prev(dns_dbiterator_t *iterator); static isc_result_t dbiterator_next(dns_dbiterator_t *iterator); static isc_result_t dbiterator_current(dns_dbiterator_t *iterator, - dns_dbnode_t **nodep, - dns_name_t *name); + dns_dbnode_t **nodep, + dns_name_t *name); static isc_result_t dbiterator_pause(dns_dbiterator_t *iterator); static isc_result_t dbiterator_origin(dns_dbiterator_t *iterator, - dns_name_t *name); + dns_name_t *name); static dns_dbiteratormethods_t dbiterator_methods = { - dbiterator_destroy, - dbiterator_first, - dbiterator_last, - dbiterator_seek, - dbiterator_prev, - dbiterator_next, - dbiterator_current, - dbiterator_pause, - dbiterator_origin + dbiterator_destroy, + dbiterator_first, + dbiterator_last, + dbiterator_seek, + dbiterator_prev, + dbiterator_next, + dbiterator_current, + dbiterator_pause, + dbiterator_origin }; #define DELETION_BATCH_MAX 64 @@ -558,17 +531,17 @@ static dns_dbiteratormethods_t dbiterator_methods = { * If 'paused' is ISC_TRUE, then the tree lock is not being held. */ typedef struct rbtdb_dbiterator { - dns_dbiterator_t common; - isc_boolean_t paused; - isc_boolean_t new_origin; - isc_rwlocktype_t tree_locked; - isc_result_t result; - dns_fixedname_t name; - dns_fixedname_t origin; - dns_rbtnodechain_t chain; - dns_rbtnode_t *node; - dns_rbtnode_t *deletions[DELETION_BATCH_MAX]; - int delete; + dns_dbiterator_t common; + isc_boolean_t paused; + isc_boolean_t new_origin; + isc_rwlocktype_t tree_locked; + isc_result_t result; + dns_fixedname_t name; + dns_fixedname_t origin; + dns_rbtnodechain_t chain; + dns_rbtnode_t *node; + dns_rbtnode_t *deletions[DELETION_BATCH_MAX]; + int delete; } rbtdb_dbiterator_t; @@ -576,7 +549,7 @@ typedef struct rbtdb_dbiterator { #define IS_CACHE(rbtdb) (((rbtdb)->common.attributes & DNS_DBATTR_CACHE) != 0) static void free_rbtdb(dns_rbtdb_t *rbtdb, isc_boolean_t log, - isc_event_t *event); + isc_event_t *event); static void overmem(dns_db_t *db, isc_boolean_t overmem); /*% @@ -621,49 +594,75 @@ static unsigned int init_count; static void attach(dns_db_t *source, dns_db_t **targetp) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)source; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)source; - REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(VALID_RBTDB(rbtdb)); - isc_refcount_increment(&rbtdb->references, NULL); + isc_refcount_increment(&rbtdb->references, NULL); - *targetp = source; + *targetp = source; } static void free_rbtdb_callback(isc_task_t *task, isc_event_t *event) { - dns_rbtdb_t *rbtdb = event->ev_arg; + dns_rbtdb_t *rbtdb = event->ev_arg; + + UNUSED(task); - UNUSED(task); + free_rbtdb(rbtdb, ISC_TRUE, event); +} - free_rbtdb(rbtdb, ISC_TRUE, event); +static void +update_rrsetstats(dns_rbtdb_t *rbtdb, rdatasetheader_t *header, + isc_boolean_t increment) +{ + dns_rdatastatstype_t statattributes = 0; + dns_rdatastatstype_t base = 0; + dns_rdatastatstype_t type; + + /* At the moment we count statistics only for cache DB */ + INSIST(IS_CACHE(rbtdb)); + + if (NXDOMAIN(header)) + statattributes = DNS_RDATASTATSTYPE_ATTR_NXDOMAIN; + else if (RBTDB_RDATATYPE_BASE(header->type) == 0) { + statattributes = DNS_RDATASTATSTYPE_ATTR_NXRRSET; + base = RBTDB_RDATATYPE_EXT(header->type); + } else + base = RBTDB_RDATATYPE_BASE(header->type); + + type = DNS_RDATASTATSTYPE_VALUE(base, statattributes); + if (increment) + dns_rdatasetstats_increment(rbtdb->rrsetstats, type); + else + dns_rdatasetstats_decrement(rbtdb->rrsetstats, type); } static void set_ttl(dns_rbtdb_t *rbtdb, rdatasetheader_t *header, dns_ttl_t newttl) { - int idx; - isc_heap_t *heap; - dns_ttl_t oldttl; - - oldttl = header->rdh_ttl; - header->rdh_ttl = newttl; - - /* - * It's possible the rbtdb is not a cache. If this is the case, - * we will not have a heap, and we move on. If we do, though, - * we might need to adjust things. - */ - if (header->heap_index == 0 || newttl == oldttl) - return; - idx = header->node->locknum; - if (rbtdb->heaps == NULL || rbtdb->heaps[idx] == NULL) - return; - heap = rbtdb->heaps[idx]; - - if (newttl < oldttl) - isc_heap_increased(heap, header->heap_index); - else - isc_heap_decreased(heap, header->heap_index); + int idx; + isc_heap_t *heap; + dns_ttl_t oldttl; + + oldttl = header->rdh_ttl; + header->rdh_ttl = newttl; + + /* + * It's possible the rbtdb is not a cache. If this is the case, + * we will not have a heap, and we move on. If we do, though, + * we might need to adjust things. + */ + if (header->heap_index == 0 || newttl == oldttl) + return; + idx = header->node->locknum; + if (rbtdb->heaps == NULL || rbtdb->heaps[idx] == NULL) + return; + heap = rbtdb->heaps[idx]; + + if (newttl < oldttl) + isc_heap_increased(heap, header->heap_index); + else + isc_heap_decreased(heap, header->heap_index); } /*% @@ -672,12 +671,12 @@ set_ttl(dns_rbtdb_t *rbtdb, rdatasetheader_t *header, dns_ttl_t newttl) { */ static isc_boolean_t ttl_sooner(void *v1, void *v2) { - rdatasetheader_t *h1 = v1; - rdatasetheader_t *h2 = v2; + rdatasetheader_t *h1 = v1; + rdatasetheader_t *h2 = v2; - if (h1->rdh_ttl < h2->rdh_ttl) - return (ISC_TRUE); - return (ISC_FALSE); + if (h1->rdh_ttl < h2->rdh_ttl) + return (ISC_TRUE); + return (ISC_FALSE); } /*% @@ -685,9 +684,9 @@ ttl_sooner(void *v1, void *v2) { */ static void ttl_set_index(void *what, unsigned int index) { - rdatasetheader_t *h = what; + rdatasetheader_t *h = what; - h->heap_index = index; + h->heap_index = index; } /*% @@ -698,755 +697,663 @@ ttl_set_index(void *what, unsigned int index) { */ static unsigned int adjust_quantum(unsigned int old, isc_time_t *start) { - unsigned int pps = dns_pps; /* packets per second */ - unsigned int interval; - isc_uint64_t usecs; - isc_time_t end; - unsigned int new; - - if (pps < 100) - pps = 100; - isc_time_now(&end); - - interval = 1000000 / pps; /* interval in usec */ - if (interval == 0) - interval = 1; - usecs = isc_time_microdiff(&end, start); - if (usecs == 0) { - /* - * We were unable to measure the amount of time taken. - * Double the nodes deleted next time. - */ - old *= 2; - if (old > 1000) - old = 1000; - return (old); - } - new = old * interval; - new /= (unsigned int)usecs; - if (new == 0) - new = 1; - else if (new > 1000) - new = 1000; - - /* Smooth */ - new = (new + old * 3) / 4; - - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_CACHE, - ISC_LOG_DEBUG(1), "adjust_quantum -> %d", new); - - return (new); + unsigned int pps = dns_pps; /* packets per second */ + unsigned int interval; + isc_uint64_t usecs; + isc_time_t end; + unsigned int new; + + if (pps < 100) + pps = 100; + isc_time_now(&end); + + interval = 1000000 / pps; /* interval in usec */ + if (interval == 0) + interval = 1; + usecs = isc_time_microdiff(&end, start); + if (usecs == 0) { + /* + * We were unable to measure the amount of time taken. + * Double the nodes deleted next time. + */ + old *= 2; + if (old > 1000) + old = 1000; + return (old); + } + new = old * interval; + new /= (unsigned int)usecs; + if (new == 0) + new = 1; + else if (new > 1000) + new = 1000; + + /* Smooth */ + new = (new + old * 3) / 4; + + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_CACHE, + ISC_LOG_DEBUG(1), "adjust_quantum -> %d", new); + + return (new); } static void free_rbtdb(dns_rbtdb_t *rbtdb, isc_boolean_t log, isc_event_t *event) { - unsigned int i; - isc_ondestroy_t ondest; - isc_result_t result; - char buf[DNS_NAME_FORMATSIZE]; - isc_time_t start; - - if (IS_CACHE(rbtdb) && rbtdb->common.rdclass == dns_rdataclass_in) - overmem((dns_db_t *)rbtdb, (isc_boolean_t)-1); - - REQUIRE(rbtdb->current_version != NULL || EMPTY(rbtdb->open_versions)); - REQUIRE(rbtdb->future_version == NULL); - - if (rbtdb->current_version != NULL) { - unsigned int refs; - - isc_refcount_decrement(&rbtdb->current_version->references, - &refs); - INSIST(refs == 0); - UNLINK(rbtdb->open_versions, rbtdb->current_version, link); - isc_refcount_destroy(&rbtdb->current_version->references); - isc_mem_put(rbtdb->common.mctx, rbtdb->current_version, - sizeof(rbtdb_version_t)); - } - if (IS_CACHE(rbtdb)) { - /* - * We assume the number of remaining dead nodes is reasonably - * small; the overhead of unlinking all nodes here should be - * negligible. - */ - for (i = 0; i < rbtdb->node_lock_count; i++) { - dns_rbtnode_t *node; - - node = ISC_LIST_HEAD(rbtdb->deadnodes[i]); - while (node != NULL) { - ISC_LIST_UNLINK(rbtdb->deadnodes[i], node, - deadlink); - node = ISC_LIST_HEAD(rbtdb->deadnodes[i]); - } - } - } - if (event == NULL) - rbtdb->quantum = (rbtdb->task != NULL) ? 100 : 0; + unsigned int i; + isc_ondestroy_t ondest; + isc_result_t result; + char buf[DNS_NAME_FORMATSIZE]; + isc_time_t start; + + if (IS_CACHE(rbtdb) && rbtdb->common.rdclass == dns_rdataclass_in) + overmem((dns_db_t *)rbtdb, (isc_boolean_t)-1); + + REQUIRE(rbtdb->current_version != NULL || EMPTY(rbtdb->open_versions)); + REQUIRE(rbtdb->future_version == NULL); + + if (rbtdb->current_version != NULL) { + unsigned int refs; + + isc_refcount_decrement(&rbtdb->current_version->references, + &refs); + INSIST(refs == 0); + UNLINK(rbtdb->open_versions, rbtdb->current_version, link); + isc_refcount_destroy(&rbtdb->current_version->references); + isc_mem_put(rbtdb->common.mctx, rbtdb->current_version, + sizeof(rbtdb_version_t)); + } + + /* + * We assume the number of remaining dead nodes is reasonably small; + * the overhead of unlinking all nodes here should be negligible. + */ + for (i = 0; i < rbtdb->node_lock_count; i++) { + dns_rbtnode_t *node; + + node = ISC_LIST_HEAD(rbtdb->deadnodes[i]); + while (node != NULL) { + ISC_LIST_UNLINK(rbtdb->deadnodes[i], node, deadlink); + node = ISC_LIST_HEAD(rbtdb->deadnodes[i]); + } + } + + if (event == NULL) + rbtdb->quantum = (rbtdb->task != NULL) ? 100 : 0; again: - if (rbtdb->tree != NULL) { - isc_time_now(&start); - result = dns_rbt_destroy2(&rbtdb->tree, rbtdb->quantum); - if (result == ISC_R_QUOTA) { - INSIST(rbtdb->task != NULL); - if (rbtdb->quantum != 0) - rbtdb->quantum = adjust_quantum(rbtdb->quantum, - &start); - if (event == NULL) - event = isc_event_allocate(rbtdb->common.mctx, - NULL, - DNS_EVENT_FREESTORAGE, - free_rbtdb_callback, - rbtdb, - sizeof(isc_event_t)); - if (event == NULL) - goto again; - isc_task_send(rbtdb->task, &event); - return; - } - INSIST(result == ISC_R_SUCCESS && rbtdb->tree == NULL); - } - if (event != NULL) - isc_event_free(&event); - if (log) { - if (dns_name_dynamic(&rbtdb->common.origin)) - dns_name_format(&rbtdb->common.origin, buf, - sizeof(buf)); - else - strcpy(buf, "<UNKNOWN>"); - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_CACHE, ISC_LOG_DEBUG(1), - "done free_rbtdb(%s)", buf); - } - if (dns_name_dynamic(&rbtdb->common.origin)) - dns_name_free(&rbtdb->common.origin, rbtdb->common.mctx); - for (i = 0; i < rbtdb->node_lock_count; i++) { - isc_refcount_destroy(&rbtdb->node_locks[i].references); - NODE_DESTROYLOCK(&rbtdb->node_locks[i].lock); - } - - /* - * Clean up LRU cache objects. - */ - if (rbtdb->rdatasets != NULL) { - for (i = 0; i < rbtdb->node_lock_count; i++) - INSIST(ISC_LIST_EMPTY(rbtdb->rdatasets[i])); - isc_mem_put(rbtdb->common.mctx, rbtdb->rdatasets, - rbtdb->node_lock_count * - sizeof(rdatasetheaderlist_t)); - } - /* - * Clean up dead node buckets. - */ - if (rbtdb->deadnodes != NULL) { - for (i = 0; i < rbtdb->node_lock_count; i++) - INSIST(ISC_LIST_EMPTY(rbtdb->deadnodes[i])); - isc_mem_put(rbtdb->common.mctx, rbtdb->deadnodes, - rbtdb->node_lock_count * sizeof(rbtnodelist_t)); - } - /* - * Clean up TTL heap cache objects. - */ - if (rbtdb->heaps != NULL) { - for (i = 0; i < rbtdb->node_lock_count; i++) - isc_heap_destroy(&rbtdb->heaps[i]); - isc_mem_put(rbtdb->common.mctx, rbtdb->heaps, - rbtdb->node_lock_count * - sizeof(isc_heap_t *)); - } - - isc_mem_put(rbtdb->common.mctx, rbtdb->node_locks, - rbtdb->node_lock_count * sizeof(rbtdb_nodelock_t)); - isc_rwlock_destroy(&rbtdb->tree_lock); - isc_refcount_destroy(&rbtdb->references); - if (rbtdb->task != NULL) - isc_task_detach(&rbtdb->task); - -#ifdef LRU_DEBUG - /* Experimental logging about memory usage */ - if (IS_CACHE(rbtdb) && rbtdb->common.rdclass == dns_rdataclass_in) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_CACHE, ISC_LOG_INFO, - "cache DB %p: mem inuse %lu, XXX node, " - "%d/%u current/total cache, %d/%u neg, %d/%u A, %d/%u AAAA, " - "%d/%u NS, %d/%u PTR, %d/%u glue, " - "%d/%u additional, purge/scan=%u(%u expiry, %u lru)/%u, " - "overmem=%d", - rbtdb, - (unsigned long)isc_mem_inuse(rbtdb->common.mctx), - rbtdb->cachestat.cache_current, rbtdb->cachestat.cache_total, - rbtdb->cachestat.ncache_current, rbtdb->cachestat.ncache_total, - rbtdb->cachestat.a_current, rbtdb->cachestat.a_total, - rbtdb->cachestat.aaaa_current, rbtdb->cachestat.aaaa_total, - rbtdb->cachestat.ns_current, rbtdb->cachestat.ns_total, - rbtdb->cachestat.ptr_current, rbtdb->cachestat.ptr_total, - rbtdb->cachestat.glue_current, rbtdb->cachestat.glue_total, - rbtdb->cachestat.additional_current, - rbtdb->cachestat.additional_total, - rbtdb->cachestat.stale_purge, rbtdb->cachestat.stale_expire, - rbtdb->cachestat.stale_lru, rbtdb->cachestat.stale_scan, - rbtdb->overmem); - INSIST(rbtdb->cachestat.cache_current == 0); - INSIST(rbtdb->cachestat.ncache_current == 0); - INSIST(rbtdb->cachestat.a_current == 0); - INSIST(rbtdb->cachestat.aaaa_current == 0); - INSIST(rbtdb->cachestat.ns_current == 0); - INSIST(rbtdb->cachestat.ptr_current == 0); - INSIST(rbtdb->cachestat.glue_current == 0); - INSIST(rbtdb->cachestat.additional_current == 0); - } -#endif - - RBTDB_DESTROYLOCK(&rbtdb->lock); - rbtdb->common.magic = 0; - rbtdb->common.impmagic = 0; - ondest = rbtdb->common.ondest; - isc_mem_putanddetach(&rbtdb->common.mctx, rbtdb, sizeof(*rbtdb)); - isc_ondestroy_notify(&ondest, rbtdb); + if (rbtdb->tree != NULL) { + isc_time_now(&start); + result = dns_rbt_destroy2(&rbtdb->tree, rbtdb->quantum); + if (result == ISC_R_QUOTA) { + INSIST(rbtdb->task != NULL); + if (rbtdb->quantum != 0) + rbtdb->quantum = adjust_quantum(rbtdb->quantum, + &start); + if (event == NULL) + event = isc_event_allocate(rbtdb->common.mctx, + NULL, + DNS_EVENT_FREESTORAGE, + free_rbtdb_callback, + rbtdb, + sizeof(isc_event_t)); + if (event == NULL) + goto again; + isc_task_send(rbtdb->task, &event); + return; + } + INSIST(result == ISC_R_SUCCESS && rbtdb->tree == NULL); + } + if (event != NULL) + isc_event_free(&event); + if (log) { + if (dns_name_dynamic(&rbtdb->common.origin)) + dns_name_format(&rbtdb->common.origin, buf, + sizeof(buf)); + else + strcpy(buf, "<UNKNOWN>"); + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_CACHE, ISC_LOG_DEBUG(1), + "done free_rbtdb(%s)", buf); + } + if (dns_name_dynamic(&rbtdb->common.origin)) + dns_name_free(&rbtdb->common.origin, rbtdb->common.mctx); + for (i = 0; i < rbtdb->node_lock_count; i++) { + isc_refcount_destroy(&rbtdb->node_locks[i].references); + NODE_DESTROYLOCK(&rbtdb->node_locks[i].lock); + } + + /* + * Clean up LRU cache objects. + */ + if (rbtdb->rdatasets != NULL) { + for (i = 0; i < rbtdb->node_lock_count; i++) + INSIST(ISC_LIST_EMPTY(rbtdb->rdatasets[i])); + isc_mem_put(rbtdb->common.mctx, rbtdb->rdatasets, + rbtdb->node_lock_count * + sizeof(rdatasetheaderlist_t)); + } + /* + * Clean up dead node buckets. + */ + if (rbtdb->deadnodes != NULL) { + for (i = 0; i < rbtdb->node_lock_count; i++) + INSIST(ISC_LIST_EMPTY(rbtdb->deadnodes[i])); + isc_mem_put(rbtdb->common.mctx, rbtdb->deadnodes, + rbtdb->node_lock_count * sizeof(rbtnodelist_t)); + } + /* + * Clean up TTL heap cache objects. + */ + if (rbtdb->heaps != NULL) { + for (i = 0; i < rbtdb->node_lock_count; i++) + isc_heap_destroy(&rbtdb->heaps[i]); + isc_mem_put(rbtdb->common.mctx, rbtdb->heaps, + rbtdb->node_lock_count * + sizeof(isc_heap_t *)); + } + + if (rbtdb->rrsetstats != NULL) + dns_stats_detach(&rbtdb->rrsetstats); + + isc_mem_put(rbtdb->common.mctx, rbtdb->node_locks, + rbtdb->node_lock_count * sizeof(rbtdb_nodelock_t)); + isc_rwlock_destroy(&rbtdb->tree_lock); + isc_refcount_destroy(&rbtdb->references); + if (rbtdb->task != NULL) + isc_task_detach(&rbtdb->task); + + RBTDB_DESTROYLOCK(&rbtdb->lock); + rbtdb->common.magic = 0; + rbtdb->common.impmagic = 0; + ondest = rbtdb->common.ondest; + isc_mem_putanddetach(&rbtdb->common.mctx, rbtdb, sizeof(*rbtdb)); + isc_ondestroy_notify(&ondest, rbtdb); } static inline void maybe_free_rbtdb(dns_rbtdb_t *rbtdb) { - isc_boolean_t want_free = ISC_FALSE; - unsigned int i; - unsigned int inactive = 0; - - /* XXX check for open versions here */ - - if (rbtdb->soanode != NULL) - dns_db_detachnode((dns_db_t *)rbtdb, &rbtdb->soanode); - if (rbtdb->nsnode != NULL) - dns_db_detachnode((dns_db_t *)rbtdb, &rbtdb->nsnode); - - /* - * Even though there are no external direct references, there still - * may be nodes in use. - */ - for (i = 0; i < rbtdb->node_lock_count; i++) { - NODE_LOCK(&rbtdb->node_locks[i].lock, isc_rwlocktype_write); - rbtdb->node_locks[i].exiting = ISC_TRUE; - NODE_UNLOCK(&rbtdb->node_locks[i].lock, isc_rwlocktype_write); - if (isc_refcount_current(&rbtdb->node_locks[i].references) - == 0) { - inactive++; - } - } - - if (inactive != 0) { - RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); - rbtdb->active -= inactive; - if (rbtdb->active == 0) - want_free = ISC_TRUE; - RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); - if (want_free) { - char buf[DNS_NAME_FORMATSIZE]; - if (dns_name_dynamic(&rbtdb->common.origin)) - dns_name_format(&rbtdb->common.origin, buf, - sizeof(buf)); - else - strcpy(buf, "<UNKNOWN>"); - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_CACHE, ISC_LOG_DEBUG(1), - "calling free_rbtdb(%s)", buf); - free_rbtdb(rbtdb, ISC_TRUE, NULL); - } - } + isc_boolean_t want_free = ISC_FALSE; + unsigned int i; + unsigned int inactive = 0; + + /* XXX check for open versions here */ + + if (rbtdb->soanode != NULL) + dns_db_detachnode((dns_db_t *)rbtdb, &rbtdb->soanode); + if (rbtdb->nsnode != NULL) + dns_db_detachnode((dns_db_t *)rbtdb, &rbtdb->nsnode); + + /* + * Even though there are no external direct references, there still + * may be nodes in use. + */ + for (i = 0; i < rbtdb->node_lock_count; i++) { + NODE_LOCK(&rbtdb->node_locks[i].lock, isc_rwlocktype_write); + rbtdb->node_locks[i].exiting = ISC_TRUE; + NODE_UNLOCK(&rbtdb->node_locks[i].lock, isc_rwlocktype_write); + if (isc_refcount_current(&rbtdb->node_locks[i].references) + == 0) { + inactive++; + } + } + + if (inactive != 0) { + RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); + rbtdb->active -= inactive; + if (rbtdb->active == 0) + want_free = ISC_TRUE; + RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); + if (want_free) { + char buf[DNS_NAME_FORMATSIZE]; + if (dns_name_dynamic(&rbtdb->common.origin)) + dns_name_format(&rbtdb->common.origin, buf, + sizeof(buf)); + else + strcpy(buf, "<UNKNOWN>"); + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_CACHE, ISC_LOG_DEBUG(1), + "calling free_rbtdb(%s)", buf); + free_rbtdb(rbtdb, ISC_TRUE, NULL); + } + } } static void detach(dns_db_t **dbp) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)(*dbp); - unsigned int refs; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)(*dbp); + unsigned int refs; - REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(VALID_RBTDB(rbtdb)); - isc_refcount_decrement(&rbtdb->references, &refs); + isc_refcount_decrement(&rbtdb->references, &refs); - if (refs == 0) - maybe_free_rbtdb(rbtdb); + if (refs == 0) + maybe_free_rbtdb(rbtdb); - *dbp = NULL; + *dbp = NULL; } static void currentversion(dns_db_t *db, dns_dbversion_t **versionp) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - rbtdb_version_t *version; - unsigned int refs; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + rbtdb_version_t *version; + unsigned int refs; - REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(VALID_RBTDB(rbtdb)); - RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_read); - version = rbtdb->current_version; - isc_refcount_increment(&version->references, &refs); - RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_read); + RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_read); + version = rbtdb->current_version; + isc_refcount_increment(&version->references, &refs); + RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_read); - *versionp = (dns_dbversion_t *)version; + *versionp = (dns_dbversion_t *)version; } static inline rbtdb_version_t * allocate_version(isc_mem_t *mctx, rbtdb_serial_t serial, - unsigned int references, isc_boolean_t writer) + unsigned int references, isc_boolean_t writer) { - isc_result_t result; - rbtdb_version_t *version; - - version = isc_mem_get(mctx, sizeof(*version)); - if (version == NULL) - return (NULL); - version->serial = serial; - result = isc_refcount_init(&version->references, references); - if (result != ISC_R_SUCCESS) { - isc_mem_put(mctx, version, sizeof(*version)); - return (NULL); - } - version->writer = writer; - version->commit_ok = ISC_FALSE; - ISC_LIST_INIT(version->changed_list); - ISC_LINK_INIT(version, link); - - return (version); + isc_result_t result; + rbtdb_version_t *version; + + version = isc_mem_get(mctx, sizeof(*version)); + if (version == NULL) + return (NULL); + version->serial = serial; + result = isc_refcount_init(&version->references, references); + if (result != ISC_R_SUCCESS) { + isc_mem_put(mctx, version, sizeof(*version)); + return (NULL); + } + version->writer = writer; + version->commit_ok = ISC_FALSE; + ISC_LIST_INIT(version->changed_list); + ISC_LINK_INIT(version, link); + + return (version); } static isc_result_t newversion(dns_db_t *db, dns_dbversion_t **versionp) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - rbtdb_version_t *version; - - REQUIRE(VALID_RBTDB(rbtdb)); - REQUIRE(versionp != NULL && *versionp == NULL); - REQUIRE(rbtdb->future_version == NULL); - - RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); - RUNTIME_CHECK(rbtdb->next_serial != 0); /* XXX Error? */ - version = allocate_version(rbtdb->common.mctx, rbtdb->next_serial, 1, - ISC_TRUE); - if (version != NULL) { - version->commit_ok = ISC_TRUE; - rbtdb->next_serial++; - rbtdb->future_version = version; - } - RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); - - if (version == NULL) - return (ISC_R_NOMEMORY); - - *versionp = version; - - return (ISC_R_SUCCESS); + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + rbtdb_version_t *version; + + REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(versionp != NULL && *versionp == NULL); + REQUIRE(rbtdb->future_version == NULL); + + RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); + RUNTIME_CHECK(rbtdb->next_serial != 0); /* XXX Error? */ + version = allocate_version(rbtdb->common.mctx, rbtdb->next_serial, 1, + ISC_TRUE); + if (version != NULL) { + version->commit_ok = ISC_TRUE; + rbtdb->next_serial++; + rbtdb->future_version = version; + } + RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); + + if (version == NULL) + return (ISC_R_NOMEMORY); + + *versionp = version; + + return (ISC_R_SUCCESS); } static void attachversion(dns_db_t *db, dns_dbversion_t *source, - dns_dbversion_t **targetp) + dns_dbversion_t **targetp) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - rbtdb_version_t *rbtversion = source; - unsigned int refs; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + rbtdb_version_t *rbtversion = source; + unsigned int refs; - REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(VALID_RBTDB(rbtdb)); - isc_refcount_increment(&rbtversion->references, &refs); - INSIST(refs > 1); + isc_refcount_increment(&rbtversion->references, &refs); + INSIST(refs > 1); - *targetp = rbtversion; + *targetp = rbtversion; } static rbtdb_changed_t * add_changed(dns_rbtdb_t *rbtdb, rbtdb_version_t *version, - dns_rbtnode_t *node) + dns_rbtnode_t *node) { - rbtdb_changed_t *changed; - unsigned int refs; + rbtdb_changed_t *changed; + unsigned int refs; - /* - * Caller must be holding the node lock if its reference must be - * protected by the lock. - */ + /* + * Caller must be holding the node lock if its reference must be + * protected by the lock. + */ - changed = isc_mem_get(rbtdb->common.mctx, sizeof(*changed)); + changed = isc_mem_get(rbtdb->common.mctx, sizeof(*changed)); - RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); + RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); - REQUIRE(version->writer); + REQUIRE(version->writer); - if (changed != NULL) { - dns_rbtnode_refincrement(node, &refs); - INSIST(refs != 0); - changed->node = node; - changed->dirty = ISC_FALSE; - ISC_LIST_INITANDAPPEND(version->changed_list, changed, link); - } else - version->commit_ok = ISC_FALSE; + if (changed != NULL) { + dns_rbtnode_refincrement(node, &refs); + INSIST(refs != 0); + changed->node = node; + changed->dirty = ISC_FALSE; + ISC_LIST_INITANDAPPEND(version->changed_list, changed, link); + } else + version->commit_ok = ISC_FALSE; - RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); + RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); - return (changed); + return (changed); } static void free_acachearray(isc_mem_t *mctx, rdatasetheader_t *header, - acachectl_t *array) + acachectl_t *array) { - unsigned int count; - unsigned int i; - unsigned char *raw; /* RDATASLAB */ + unsigned int count; + unsigned int i; + unsigned char *raw; /* RDATASLAB */ - /* - * The caller must be holding the corresponding node lock. - */ + /* + * The caller must be holding the corresponding node lock. + */ - if (array == NULL) - return; + if (array == NULL) + return; - raw = (unsigned char *)header + sizeof(*header); - count = raw[0] * 256 + raw[1]; + raw = (unsigned char *)header + sizeof(*header); + count = raw[0] * 256 + raw[1]; - /* - * Sanity check: since an additional cache entry has a reference to - * the original DB node (in the callback arg), there should be no - * acache entries when the node can be freed. - */ - for (i = 0; i < count; i++) - INSIST(array[i].entry == NULL && array[i].cbarg == NULL); + /* + * Sanity check: since an additional cache entry has a reference to + * the original DB node (in the callback arg), there should be no + * acache entries when the node can be freed. + */ + for (i = 0; i < count; i++) + INSIST(array[i].entry == NULL && array[i].cbarg == NULL); - isc_mem_put(mctx, array, count * sizeof(acachectl_t)); + isc_mem_put(mctx, array, count * sizeof(acachectl_t)); } static inline void free_noqname(isc_mem_t *mctx, struct noqname **noqname) { - if (dns_name_dynamic(&(*noqname)->name)) - dns_name_free(&(*noqname)->name, mctx); - if ((*noqname)->nsec != NULL) - isc_mem_put(mctx, (*noqname)->nsec, - dns_rdataslab_size((*noqname)->nsec, 0)); - if ((*noqname)->nsecsig != NULL) - isc_mem_put(mctx, (*noqname)->nsecsig, - dns_rdataslab_size((*noqname)->nsecsig, 0)); - isc_mem_put(mctx, *noqname, sizeof(**noqname)); - *noqname = NULL; + if (dns_name_dynamic(&(*noqname)->name)) + dns_name_free(&(*noqname)->name, mctx); + if ((*noqname)->nsec != NULL) + isc_mem_put(mctx, (*noqname)->nsec, + dns_rdataslab_size((*noqname)->nsec, 0)); + if ((*noqname)->nsecsig != NULL) + isc_mem_put(mctx, (*noqname)->nsecsig, + dns_rdataslab_size((*noqname)->nsecsig, 0)); + isc_mem_put(mctx, *noqname, sizeof(**noqname)); + *noqname = NULL; } static inline void init_rdataset(dns_rbtdb_t *rbtdb, rdatasetheader_t *h) { - ISC_LINK_INIT(h, lru_link); - h->heap_index = 0; + ISC_LINK_INIT(h, lru_link); + h->heap_index = 0; #if TRACE_HEADER - if (IS_CACHE(rbtdb) && rbtdb->common.rdclass == dns_rdataclass_in) - fprintf(stderr, "initialized header: %p\n", h); + if (IS_CACHE(rbtdb) && rbtdb->common.rdclass == dns_rdataclass_in) + fprintf(stderr, "initialized header: %p\n", h); #else - UNUSED(rbtdb); + UNUSED(rbtdb); #endif } static inline rdatasetheader_t * new_rdataset(dns_rbtdb_t *rbtdb, isc_mem_t *mctx) { - rdatasetheader_t *h; + rdatasetheader_t *h; - h = isc_mem_get(mctx, sizeof(*h)); - if (h == NULL) - return (NULL); + h = isc_mem_get(mctx, sizeof(*h)); + if (h == NULL) + return (NULL); #if TRACE_HEADER - if (IS_CACHE(rbtdb) && rbtdb->common.rdclass == dns_rdataclass_in) - fprintf(stderr, "allocated header: %p\n", h); + if (IS_CACHE(rbtdb) && rbtdb->common.rdclass == dns_rdataclass_in) + fprintf(stderr, "allocated header: %p\n", h); #endif - init_rdataset(rbtdb, h); - return (h); + init_rdataset(rbtdb, h); + return (h); } static inline void free_rdataset(dns_rbtdb_t *rbtdb, isc_mem_t *mctx, rdatasetheader_t *rdataset) { - unsigned int size; - -#ifdef LRU_DEBUG - /* - * for debug: statistics update. - * Nothing in this block should have any side-effects. - */ - if (EXISTS(rdataset) && - (rdataset->attributes & RDATASET_ATTR_CACHE) != 0) { - rbtdb->cachestat.cache_current--; - if ((rdataset->attributes & RDATASET_ATTR_CANCELED) != 0) - rbtdb->cachestat.cache_total--; - if (RBTDB_RDATATYPE_BASE(rdataset->type) == 0) { - rbtdb->cachestat.ncache_current--; - INSIST(rbtdb->cachestat.ncache_current >= 0); - if ((rdataset->attributes & RDATASET_ATTR_CANCELED) - != 0) - rbtdb->cachestat.ncache_total--; - } - if (rdataset->type == dns_rdatatype_a) { - rbtdb->cachestat.a_current--; - INSIST(rbtdb->cachestat.a_current >= 0); - if ((rdataset->attributes & RDATASET_ATTR_CANCELED) - != 0) - rbtdb->cachestat.a_total--; - } else if (rdataset->type == dns_rdatatype_aaaa) { - rbtdb->cachestat.aaaa_current--; - INSIST(rbtdb->cachestat.aaaa_current >= 0); - if ((rdataset->attributes & RDATASET_ATTR_CANCELED) - != 0) - rbtdb->cachestat.aaaa_total--; - } else if (rdataset->type == dns_rdatatype_ptr) { - rbtdb->cachestat.ptr_current--; - INSIST(rbtdb->cachestat.ptr_current >= 0); - if ((rdataset->attributes & RDATASET_ATTR_CANCELED) - != 0) - rbtdb->cachestat.ptr_total--; - } else if (rdataset->type == dns_rdatatype_ns) { - rbtdb->cachestat.ns_current--; - INSIST(rbtdb->cachestat.ns_current >= 0); - if ((rdataset->attributes & RDATASET_ATTR_CANCELED) - != 0) - rbtdb->cachestat.ns_total--; - } - if (rdataset->trust == dns_trust_glue && - (rdataset->type == dns_rdatatype_a || - rdataset->type == dns_rdatatype_aaaa)) { - rbtdb->cachestat.glue_current--; - INSIST(rbtdb->cachestat.glue_current >= 0); - if ((rdataset->attributes & RDATASET_ATTR_CANCELED) - != 0) - rbtdb->cachestat.glue_total--; - } - if (rdataset->trust == dns_trust_additional && - (rdataset->type == dns_rdatatype_a || - rdataset->type == dns_rdatatype_aaaa)) { - rbtdb->cachestat.additional_current--; - INSIST(rbtdb->cachestat.additional_current >= 0); - if ((rdataset->attributes & RDATASET_ATTR_CANCELED) - != 0) - rbtdb->cachestat.additional_total--; - } - } -#endif - - if (IS_CACHE(rbtdb) && ISC_LINK_LINKED(rdataset, lru_link)) { - int idx = rdataset->node->locknum; - ISC_LIST_UNLINK(rbtdb->rdatasets[idx], rdataset, lru_link); - if (rdataset->heap_index != 0) { - isc_heap_delete(rbtdb->heaps[idx], - rdataset->heap_index); - } - rdataset->heap_index = 0; - } - - if (rdataset->noqname != NULL) - free_noqname(mctx, &rdataset->noqname); - - free_acachearray(mctx, rdataset, rdataset->additional_auth); - free_acachearray(mctx, rdataset, rdataset->additional_glue); - - if ((rdataset->attributes & RDATASET_ATTR_NONEXISTENT) != 0) - size = sizeof(*rdataset); - else - size = dns_rdataslab_size((unsigned char *)rdataset, - sizeof(*rdataset)); - isc_mem_put(mctx, rdataset, size); + unsigned int size; + + if (EXISTS(rdataset) && + (rdataset->attributes & RDATASET_ATTR_STATCOUNT) != 0) { + update_rrsetstats(rbtdb, rdataset, ISC_FALSE); + } + + if (IS_CACHE(rbtdb) && ISC_LINK_LINKED(rdataset, lru_link)) { + int idx = rdataset->node->locknum; + ISC_LIST_UNLINK(rbtdb->rdatasets[idx], rdataset, lru_link); + if (rdataset->heap_index != 0) { + isc_heap_delete(rbtdb->heaps[idx], + rdataset->heap_index); + } + rdataset->heap_index = 0; + } + + if (rdataset->noqname != NULL) + free_noqname(mctx, &rdataset->noqname); + + free_acachearray(mctx, rdataset, rdataset->additional_auth); + free_acachearray(mctx, rdataset, rdataset->additional_glue); + + if ((rdataset->attributes & RDATASET_ATTR_NONEXISTENT) != 0) + size = sizeof(*rdataset); + else + size = dns_rdataslab_size((unsigned char *)rdataset, + sizeof(*rdataset)); + isc_mem_put(mctx, rdataset, size); } static inline void rollback_node(dns_rbtnode_t *node, rbtdb_serial_t serial) { - rdatasetheader_t *header, *dcurrent; - isc_boolean_t make_dirty = ISC_FALSE; - - /* - * Caller must hold the node lock. - */ - - /* - * We set the IGNORE attribute on rdatasets with serial number - * 'serial'. When the reference count goes to zero, these rdatasets - * will be cleaned up; until that time, they will be ignored. - */ - for (header = node->data; header != NULL; header = header->next) { - if (header->serial == serial) { - header->attributes |= RDATASET_ATTR_IGNORE; - make_dirty = ISC_TRUE; - } - for (dcurrent = header->down; - dcurrent != NULL; - dcurrent = dcurrent->down) { - if (dcurrent->serial == serial) { - dcurrent->attributes |= RDATASET_ATTR_IGNORE; - make_dirty = ISC_TRUE; - } - } - } - if (make_dirty) - node->dirty = 1; + rdatasetheader_t *header, *dcurrent; + isc_boolean_t make_dirty = ISC_FALSE; + + /* + * Caller must hold the node lock. + */ + + /* + * We set the IGNORE attribute on rdatasets with serial number + * 'serial'. When the reference count goes to zero, these rdatasets + * will be cleaned up; until that time, they will be ignored. + */ + for (header = node->data; header != NULL; header = header->next) { + if (header->serial == serial) { + header->attributes |= RDATASET_ATTR_IGNORE; + make_dirty = ISC_TRUE; + } + for (dcurrent = header->down; + dcurrent != NULL; + dcurrent = dcurrent->down) { + if (dcurrent->serial == serial) { + dcurrent->attributes |= RDATASET_ATTR_IGNORE; + make_dirty = ISC_TRUE; + } + } + } + if (make_dirty) + node->dirty = 1; } static inline void clean_stale_headers(dns_rbtdb_t *rbtdb, isc_mem_t *mctx, rdatasetheader_t *top) { - rdatasetheader_t *d, *down_next; + rdatasetheader_t *d, *down_next; - for (d = top->down; d != NULL; d = down_next) { - down_next = d->down; - free_rdataset(rbtdb, mctx, d); - } - top->down = NULL; + for (d = top->down; d != NULL; d = down_next) { + down_next = d->down; + free_rdataset(rbtdb, mctx, d); + } + top->down = NULL; } static inline void clean_cache_node(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node) { - rdatasetheader_t *current, *top_prev, *top_next; - isc_mem_t *mctx = rbtdb->common.mctx; - - /* - * Caller must be holding the node lock. - */ - - top_prev = NULL; - for (current = node->data; current != NULL; current = top_next) { - top_next = current->next; - clean_stale_headers(rbtdb, mctx, current); - /* - * If current is nonexistent or stale, we can clean it up. - */ - if ((current->attributes & - (RDATASET_ATTR_NONEXISTENT|RDATASET_ATTR_STALE)) != 0) { - if (top_prev != NULL) - top_prev->next = current->next; - else - node->data = current->next; - free_rdataset(rbtdb, mctx, current); - } else - top_prev = current; - } - node->dirty = 0; + rdatasetheader_t *current, *top_prev, *top_next; + isc_mem_t *mctx = rbtdb->common.mctx; + + /* + * Caller must be holding the node lock. + */ + + top_prev = NULL; + for (current = node->data; current != NULL; current = top_next) { + top_next = current->next; + clean_stale_headers(rbtdb, mctx, current); + /* + * If current is nonexistent or stale, we can clean it up. + */ + if ((current->attributes & + (RDATASET_ATTR_NONEXISTENT|RDATASET_ATTR_STALE)) != 0) { + if (top_prev != NULL) + top_prev->next = current->next; + else + node->data = current->next; + free_rdataset(rbtdb, mctx, current); + } else + top_prev = current; + } + node->dirty = 0; } static inline void clean_zone_node(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node, - rbtdb_serial_t least_serial) + rbtdb_serial_t least_serial) { - rdatasetheader_t *current, *dcurrent, *down_next, *dparent; - rdatasetheader_t *top_prev, *top_next; - isc_mem_t *mctx = rbtdb->common.mctx; - isc_boolean_t still_dirty = ISC_FALSE; - - /* - * Caller must be holding the node lock. - */ - REQUIRE(least_serial != 0); - - top_prev = NULL; - for (current = node->data; current != NULL; current = top_next) { - top_next = current->next; - - /* - * First, we clean up any instances of multiple rdatasets - * with the same serial number, or that have the IGNORE - * attribute. - */ - dparent = current; - for (dcurrent = current->down; - dcurrent != NULL; - dcurrent = down_next) { - down_next = dcurrent->down; - INSIST(dcurrent->serial <= dparent->serial); - if (dcurrent->serial == dparent->serial || - IGNORE(dcurrent)) { - if (down_next != NULL) - down_next->next = dparent; - dparent->down = down_next; - free_rdataset(rbtdb, mctx, dcurrent); - } else - dparent = dcurrent; - } - - /* - * We've now eliminated all IGNORE datasets with the possible - * exception of current, which we now check. - */ - if (IGNORE(current)) { - down_next = current->down; - if (down_next == NULL) { - if (top_prev != NULL) - top_prev->next = current->next; - else - node->data = current->next; - free_rdataset(rbtdb, mctx, current); - /* - * current no longer exists, so we can - * just continue with the loop. - */ - continue; - } else { - /* - * Pull up current->down, making it the new - * current. - */ - if (top_prev != NULL) - top_prev->next = down_next; - else - node->data = down_next; - down_next->next = top_next; - free_rdataset(rbtdb, mctx, current); - current = down_next; - } - } - - /* - * We now try to find the first down node less than the - * least serial. - */ - dparent = current; - for (dcurrent = current->down; - dcurrent != NULL; - dcurrent = down_next) { - down_next = dcurrent->down; - if (dcurrent->serial < least_serial) - break; - dparent = dcurrent; - } - - /* - * If there is a such an rdataset, delete it and any older - * versions. - */ - if (dcurrent != NULL) { - do { - down_next = dcurrent->down; - INSIST(dcurrent->serial <= least_serial); - free_rdataset(rbtdb, mctx, dcurrent); - dcurrent = down_next; - } while (dcurrent != NULL); - dparent->down = NULL; - } - - /* - * Note. The serial number of 'current' might be less than - * least_serial too, but we cannot delete it because it is - * the most recent version, unless it is a NONEXISTENT - * rdataset. - */ - if (current->down != NULL) { - still_dirty = ISC_TRUE; - top_prev = current; - } else { - /* - * If this is a NONEXISTENT rdataset, we can delete it. - */ - if (NONEXISTENT(current)) { - if (top_prev != NULL) - top_prev->next = current->next; - else - node->data = current->next; - free_rdataset(rbtdb, mctx, current); - } else - top_prev = current; - } - } - if (!still_dirty) - node->dirty = 0; + rdatasetheader_t *current, *dcurrent, *down_next, *dparent; + rdatasetheader_t *top_prev, *top_next; + isc_mem_t *mctx = rbtdb->common.mctx; + isc_boolean_t still_dirty = ISC_FALSE; + + /* + * Caller must be holding the node lock. + */ + REQUIRE(least_serial != 0); + + top_prev = NULL; + for (current = node->data; current != NULL; current = top_next) { + top_next = current->next; + + /* + * First, we clean up any instances of multiple rdatasets + * with the same serial number, or that have the IGNORE + * attribute. + */ + dparent = current; + for (dcurrent = current->down; + dcurrent != NULL; + dcurrent = down_next) { + down_next = dcurrent->down; + INSIST(dcurrent->serial <= dparent->serial); + if (dcurrent->serial == dparent->serial || + IGNORE(dcurrent)) { + if (down_next != NULL) + down_next->next = dparent; + dparent->down = down_next; + free_rdataset(rbtdb, mctx, dcurrent); + } else + dparent = dcurrent; + } + + /* + * We've now eliminated all IGNORE datasets with the possible + * exception of current, which we now check. + */ + if (IGNORE(current)) { + down_next = current->down; + if (down_next == NULL) { + if (top_prev != NULL) + top_prev->next = current->next; + else + node->data = current->next; + free_rdataset(rbtdb, mctx, current); + /* + * current no longer exists, so we can + * just continue with the loop. + */ + continue; + } else { + /* + * Pull up current->down, making it the new + * current. + */ + if (top_prev != NULL) + top_prev->next = down_next; + else + node->data = down_next; + down_next->next = top_next; + free_rdataset(rbtdb, mctx, current); + current = down_next; + } + } + + /* + * We now try to find the first down node less than the + * least serial. + */ + dparent = current; + for (dcurrent = current->down; + dcurrent != NULL; + dcurrent = down_next) { + down_next = dcurrent->down; + if (dcurrent->serial < least_serial) + break; + dparent = dcurrent; + } + + /* + * If there is a such an rdataset, delete it and any older + * versions. + */ + if (dcurrent != NULL) { + do { + down_next = dcurrent->down; + INSIST(dcurrent->serial <= least_serial); + free_rdataset(rbtdb, mctx, dcurrent); + dcurrent = down_next; + } while (dcurrent != NULL); + dparent->down = NULL; + } + + /* + * Note. The serial number of 'current' might be less than + * least_serial too, but we cannot delete it because it is + * the most recent version, unless it is a NONEXISTENT + * rdataset. + */ + if (current->down != NULL) { + still_dirty = ISC_TRUE; + top_prev = current; + } else { + /* + * If this is a NONEXISTENT rdataset, we can delete it. + */ + if (NONEXISTENT(current)) { + if (top_prev != NULL) + top_prev->next = current->next; + else + node->data = current->next; + free_rdataset(rbtdb, mctx, current); + } else + top_prev = current; + } + } + if (!still_dirty) + node->dirty = 0; } /*% @@ -1459,31 +1366,31 @@ clean_zone_node(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node, */ static void cleanup_dead_nodes(dns_rbtdb_t *rbtdb, int bucketnum) { - dns_rbtnode_t *node; - isc_result_t result; - int count = 10; /* XXXJT: should be adjustable */ - - node = ISC_LIST_HEAD(rbtdb->deadnodes[bucketnum]); - while (node != NULL && count > 0) { - ISC_LIST_UNLINK(rbtdb->deadnodes[bucketnum], node, deadlink); - - /* - * Since we're holding a tree write lock, it should be - * impossible for this node to be referenced by others. - */ - INSIST(dns_rbtnode_refcurrent(node) == 0 && - node->data == NULL); - - result = dns_rbt_deletenode(rbtdb->tree, node, ISC_FALSE); - if (result != ISC_R_SUCCESS) - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_CACHE, ISC_LOG_WARNING, - "cleanup_dead_nodes: " - "dns_rbt_deletenode: %s", - isc_result_totext(result)); - node = ISC_LIST_HEAD(rbtdb->deadnodes[bucketnum]); - count--; - } + dns_rbtnode_t *node; + isc_result_t result; + int count = 10; /* XXXJT: should be adjustable */ + + node = ISC_LIST_HEAD(rbtdb->deadnodes[bucketnum]); + while (node != NULL && count > 0) { + ISC_LIST_UNLINK(rbtdb->deadnodes[bucketnum], node, deadlink); + + /* + * Since we're holding a tree write lock, it should be + * impossible for this node to be referenced by others. + */ + INSIST(dns_rbtnode_refcurrent(node) == 0 && + node->data == NULL); + + result = dns_rbt_deletenode(rbtdb->tree, node, ISC_FALSE); + if (result != ISC_R_SUCCESS) + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_CACHE, ISC_LOG_WARNING, + "cleanup_dead_nodes: " + "dns_rbt_deletenode: %s", + isc_result_totext(result)); + node = ISC_LIST_HEAD(rbtdb->deadnodes[bucketnum]); + count--; + } } /* @@ -1492,16 +1399,16 @@ cleanup_dead_nodes(dns_rbtdb_t *rbtdb, int bucketnum) { */ static inline void new_reference(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node) { - unsigned int lockrefs, noderefs; - isc_refcount_t *lockref; - - dns_rbtnode_refincrement0(node, &noderefs); - if (noderefs == 1) { /* this is the first reference to the node */ - lockref = &rbtdb->node_locks[node->locknum].references; - isc_refcount_increment0(lockref, &lockrefs); - INSIST(lockrefs != 0); - } - INSIST(noderefs != 0); + unsigned int lockrefs, noderefs; + isc_refcount_t *lockref; + + dns_rbtnode_refincrement0(node, &noderefs); + if (noderefs == 1) { /* this is the first reference to the node */ + lockref = &rbtdb->node_locks[node->locknum].references; + isc_refcount_increment0(lockref, &lockrefs); + INSIST(lockrefs != 0); + } + INSIST(noderefs != 0); } /* @@ -1516,428 +1423,445 @@ new_reference(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node) { */ static isc_boolean_t decrement_reference(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node, - rbtdb_serial_t least_serial, - isc_rwlocktype_t nlock, isc_rwlocktype_t tlock) + rbtdb_serial_t least_serial, + isc_rwlocktype_t nlock, isc_rwlocktype_t tlock) { - isc_result_t result; - isc_boolean_t write_locked; - rbtdb_nodelock_t *nodelock; - unsigned int refs, nrefs; - int bucket = node->locknum; - - nodelock = &rbtdb->node_locks[bucket]; - - /* Handle easy and typical case first. */ - if (!node->dirty && (node->data != NULL || node->down != NULL)) { - dns_rbtnode_refdecrement(node, &nrefs); - INSIST((int)nrefs >= 0); - if (nrefs == 0) { - isc_refcount_decrement(&nodelock->references, &refs); - INSIST((int)refs >= 0); - } - return ((nrefs == 0) ? ISC_TRUE : ISC_FALSE); - } - - /* Upgrade the lock? */ - if (nlock == isc_rwlocktype_read) { - NODE_WEAKUNLOCK(&nodelock->lock, isc_rwlocktype_read); - NODE_WEAKLOCK(&nodelock->lock, isc_rwlocktype_write); - } - dns_rbtnode_refdecrement(node, &nrefs); - INSIST((int)nrefs >= 0); - if (nrefs > 0) { - /* Restore the lock? */ - if (nlock == isc_rwlocktype_read) - NODE_WEAKDOWNGRADE(&nodelock->lock); - return (ISC_FALSE); - } - - if (node->dirty && dns_rbtnode_refcurrent(node) == 0) { - if (IS_CACHE(rbtdb)) - clean_cache_node(rbtdb, node); - else { - if (least_serial == 0) { - /* - * Caller doesn't know the least serial. - * Get it. - */ - RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_read); - least_serial = rbtdb->least_serial; - RBTDB_UNLOCK(&rbtdb->lock, - isc_rwlocktype_read); - } - clean_zone_node(rbtdb, node, least_serial); - } - } - - isc_refcount_decrement(&nodelock->references, &refs); - INSIST((int)refs >= 0); - - /* - * XXXDCL should this only be done for cache zones? - */ - if (node->data != NULL || node->down != NULL) { - /* Restore the lock? */ - if (nlock == isc_rwlocktype_read) - NODE_WEAKDOWNGRADE(&nodelock->lock); - return (ISC_TRUE); - } - - /* - * Attempt to switch to a write lock on the tree. If this fails, - * we will add this node to a linked list of nodes in this locking - * bucket which we will free later. - */ - if (tlock != isc_rwlocktype_write) { - /* - * Locking hierarchy notwithstanding, we don't need to free - * the node lock before acquiring the tree write lock because - * we only do a trylock. - */ - if (tlock == isc_rwlocktype_read) - result = isc_rwlock_tryupgrade(&rbtdb->tree_lock); - else - result = isc_rwlock_trylock(&rbtdb->tree_lock, - isc_rwlocktype_write); - RUNTIME_CHECK(result == ISC_R_SUCCESS || - result == ISC_R_LOCKBUSY); - - write_locked = ISC_TF(result == ISC_R_SUCCESS); - } else - write_locked = ISC_TRUE; - - if (write_locked && dns_rbtnode_refcurrent(node) == 0) { - /* - * We can now delete the node if the reference counter is - * zero. This should be typically the case, but a different - * thread may still gain a (new) reference just before the - * current thread locks the tree (e.g., in findnode()). - */ - - if (isc_log_wouldlog(dns_lctx, ISC_LOG_DEBUG(1))) { - char printname[DNS_NAME_FORMATSIZE]; - - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_CACHE, ISC_LOG_DEBUG(1), - "decrement_reference: " - "delete from rbt: %p %s", - node, - dns_rbt_formatnodename(node, printname, - sizeof(printname))); - } - - result = dns_rbt_deletenode(rbtdb->tree, node, ISC_FALSE); - if (result != ISC_R_SUCCESS) - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_CACHE, ISC_LOG_WARNING, - "decrement_reference: " - "dns_rbt_deletenode: %s", - isc_result_totext(result)); - } else if (dns_rbtnode_refcurrent(node) == 0) { - INSIST(!ISC_LINK_LINKED(node, deadlink)); - ISC_LIST_APPEND(rbtdb->deadnodes[bucket], node, deadlink); - } - - /* Restore the lock? */ - if (nlock == isc_rwlocktype_read) - NODE_WEAKDOWNGRADE(&nodelock->lock); - - /* - * Relock a read lock, or unlock the write lock if no lock was held. - */ - if (tlock == isc_rwlocktype_none) - if (write_locked) - RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_write); - - if (tlock == isc_rwlocktype_read) - if (write_locked) - isc_rwlock_downgrade(&rbtdb->tree_lock); - - return (ISC_TRUE); + isc_result_t result; + isc_boolean_t write_locked; + rbtdb_nodelock_t *nodelock; + unsigned int refs, nrefs; + int bucket = node->locknum; + + nodelock = &rbtdb->node_locks[bucket]; + + /* Handle easy and typical case first. */ + if (!node->dirty && (node->data != NULL || node->down != NULL)) { + dns_rbtnode_refdecrement(node, &nrefs); + INSIST((int)nrefs >= 0); + if (nrefs == 0) { + isc_refcount_decrement(&nodelock->references, &refs); + INSIST((int)refs >= 0); + } + return ((nrefs == 0) ? ISC_TRUE : ISC_FALSE); + } + + /* Upgrade the lock? */ + if (nlock == isc_rwlocktype_read) { + NODE_WEAKUNLOCK(&nodelock->lock, isc_rwlocktype_read); + NODE_WEAKLOCK(&nodelock->lock, isc_rwlocktype_write); + } + dns_rbtnode_refdecrement(node, &nrefs); + INSIST((int)nrefs >= 0); + if (nrefs > 0) { + /* Restore the lock? */ + if (nlock == isc_rwlocktype_read) + NODE_WEAKDOWNGRADE(&nodelock->lock); + return (ISC_FALSE); + } + + if (node->dirty && dns_rbtnode_refcurrent(node) == 0) { + if (IS_CACHE(rbtdb)) + clean_cache_node(rbtdb, node); + else { + if (least_serial == 0) { + /* + * Caller doesn't know the least serial. + * Get it. + */ + RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_read); + least_serial = rbtdb->least_serial; + RBTDB_UNLOCK(&rbtdb->lock, + isc_rwlocktype_read); + } + clean_zone_node(rbtdb, node, least_serial); + } + } + + isc_refcount_decrement(&nodelock->references, &refs); + INSIST((int)refs >= 0); + + /* + * XXXDCL should this only be done for cache zones? + */ + if (node->data != NULL || node->down != NULL) { + /* Restore the lock? */ + if (nlock == isc_rwlocktype_read) + NODE_WEAKDOWNGRADE(&nodelock->lock); + return (ISC_TRUE); + } + + /* + * Attempt to switch to a write lock on the tree. If this fails, + * we will add this node to a linked list of nodes in this locking + * bucket which we will free later. + */ + if (tlock != isc_rwlocktype_write) { + /* + * Locking hierarchy notwithstanding, we don't need to free + * the node lock before acquiring the tree write lock because + * we only do a trylock. + */ + if (tlock == isc_rwlocktype_read) + result = isc_rwlock_tryupgrade(&rbtdb->tree_lock); + else + result = isc_rwlock_trylock(&rbtdb->tree_lock, + isc_rwlocktype_write); + RUNTIME_CHECK(result == ISC_R_SUCCESS || + result == ISC_R_LOCKBUSY); + + write_locked = ISC_TF(result == ISC_R_SUCCESS); + } else + write_locked = ISC_TRUE; + + if (write_locked && dns_rbtnode_refcurrent(node) == 0) { + /* + * We can now delete the node if the reference counter is + * zero. This should be typically the case, but a different + * thread may still gain a (new) reference just before the + * current thread locks the tree (e.g., in findnode()). + */ + + if (isc_log_wouldlog(dns_lctx, ISC_LOG_DEBUG(1))) { + char printname[DNS_NAME_FORMATSIZE]; + + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_CACHE, ISC_LOG_DEBUG(1), + "decrement_reference: " + "delete from rbt: %p %s", + node, + dns_rbt_formatnodename(node, printname, + sizeof(printname))); + } + + result = dns_rbt_deletenode(rbtdb->tree, node, ISC_FALSE); + if (result != ISC_R_SUCCESS) + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_CACHE, ISC_LOG_WARNING, + "decrement_reference: " + "dns_rbt_deletenode: %s", + isc_result_totext(result)); + } else if (dns_rbtnode_refcurrent(node) == 0) { + INSIST(!ISC_LINK_LINKED(node, deadlink)); + ISC_LIST_APPEND(rbtdb->deadnodes[bucket], node, deadlink); + } + + /* Restore the lock? */ + if (nlock == isc_rwlocktype_read) + NODE_WEAKDOWNGRADE(&nodelock->lock); + + /* + * Relock a read lock, or unlock the write lock if no lock was held. + */ + if (tlock == isc_rwlocktype_none) + if (write_locked) + RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_write); + + if (tlock == isc_rwlocktype_read) + if (write_locked) + isc_rwlock_downgrade(&rbtdb->tree_lock); + + return (ISC_TRUE); } static inline void make_least_version(dns_rbtdb_t *rbtdb, rbtdb_version_t *version, - rbtdb_changedlist_t *cleanup_list) + rbtdb_changedlist_t *cleanup_list) { - /* - * Caller must be holding the database lock. - */ + /* + * Caller must be holding the database lock. + */ - rbtdb->least_serial = version->serial; - *cleanup_list = version->changed_list; - ISC_LIST_INIT(version->changed_list); + rbtdb->least_serial = version->serial; + *cleanup_list = version->changed_list; + ISC_LIST_INIT(version->changed_list); } static inline void cleanup_nondirty(rbtdb_version_t *version, rbtdb_changedlist_t *cleanup_list) { - rbtdb_changed_t *changed, *next_changed; - - /* - * If the changed record is dirty, then - * an update created multiple versions of - * a given rdataset. We keep this list - * until we're the least open version, at - * which point it's safe to get rid of any - * older versions. - * - * If the changed record isn't dirty, then - * we don't need it anymore since we're - * committing and not rolling back. - * - * The caller must be holding the database lock. - */ - for (changed = HEAD(version->changed_list); - changed != NULL; - changed = next_changed) { - next_changed = NEXT(changed, link); - if (!changed->dirty) { - UNLINK(version->changed_list, - changed, link); - APPEND(*cleanup_list, - changed, link); - } - } + rbtdb_changed_t *changed, *next_changed; + + /* + * If the changed record is dirty, then + * an update created multiple versions of + * a given rdataset. We keep this list + * until we're the least open version, at + * which point it's safe to get rid of any + * older versions. + * + * If the changed record isn't dirty, then + * we don't need it anymore since we're + * committing and not rolling back. + * + * The caller must be holding the database lock. + */ + for (changed = HEAD(version->changed_list); + changed != NULL; + changed = next_changed) { + next_changed = NEXT(changed, link); + if (!changed->dirty) { + UNLINK(version->changed_list, + changed, link); + APPEND(*cleanup_list, + changed, link); + } + } } static isc_boolean_t iszonesecure(dns_db_t *db, dns_dbnode_t *origin) { - dns_rdataset_t keyset; - dns_rdataset_t nsecset, signsecset; - isc_boolean_t haszonekey = ISC_FALSE; - isc_boolean_t hasnsec = ISC_FALSE; - isc_result_t result; - - dns_rdataset_init(&keyset); - result = dns_db_findrdataset(db, origin, NULL, dns_rdatatype_dnskey, 0, - 0, &keyset, NULL); - if (result == ISC_R_SUCCESS) { - dns_rdata_t keyrdata = DNS_RDATA_INIT; - result = dns_rdataset_first(&keyset); - while (result == ISC_R_SUCCESS) { - dns_rdataset_current(&keyset, &keyrdata); - if (dns_zonekey_iszonekey(&keyrdata)) { - haszonekey = ISC_TRUE; - break; - } - result = dns_rdataset_next(&keyset); - } - dns_rdataset_disassociate(&keyset); - } - if (!haszonekey) - return (ISC_FALSE); - - dns_rdataset_init(&nsecset); - dns_rdataset_init(&signsecset); - result = dns_db_findrdataset(db, origin, NULL, dns_rdatatype_nsec, 0, - 0, &nsecset, &signsecset); - if (result == ISC_R_SUCCESS) { - if (dns_rdataset_isassociated(&signsecset)) { - hasnsec = ISC_TRUE; - dns_rdataset_disassociate(&signsecset); - } - dns_rdataset_disassociate(&nsecset); - } - return (hasnsec); + dns_rdataset_t keyset; + dns_rdataset_t nsecset, signsecset; + isc_boolean_t haszonekey = ISC_FALSE; + isc_boolean_t hasnsec = ISC_FALSE; + isc_result_t result; + + dns_rdataset_init(&keyset); + result = dns_db_findrdataset(db, origin, NULL, dns_rdatatype_dnskey, 0, + 0, &keyset, NULL); + if (result == ISC_R_SUCCESS) { + dns_rdata_t keyrdata = DNS_RDATA_INIT; + result = dns_rdataset_first(&keyset); + while (result == ISC_R_SUCCESS) { + dns_rdataset_current(&keyset, &keyrdata); + if (dns_zonekey_iszonekey(&keyrdata)) { + haszonekey = ISC_TRUE; + break; + } + result = dns_rdataset_next(&keyset); + } + dns_rdataset_disassociate(&keyset); + } + if (!haszonekey) + return (ISC_FALSE); + + dns_rdataset_init(&nsecset); + dns_rdataset_init(&signsecset); + result = dns_db_findrdataset(db, origin, NULL, dns_rdatatype_nsec, 0, + 0, &nsecset, &signsecset); + if (result == ISC_R_SUCCESS) { + if (dns_rdataset_isassociated(&signsecset)) { + hasnsec = ISC_TRUE; + dns_rdataset_disassociate(&signsecset); + } + dns_rdataset_disassociate(&nsecset); + } + return (hasnsec); } static void closeversion(dns_db_t *db, dns_dbversion_t **versionp, isc_boolean_t commit) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - rbtdb_version_t *version, *cleanup_version, *least_greater; - isc_boolean_t rollback = ISC_FALSE; - rbtdb_changedlist_t cleanup_list; - rbtdb_changed_t *changed, *next_changed; - rbtdb_serial_t serial, least_serial; - dns_rbtnode_t *rbtnode; - unsigned int refs; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + rbtdb_version_t *version, *cleanup_version, *least_greater; + isc_boolean_t rollback = ISC_FALSE; + rbtdb_changedlist_t cleanup_list; + rbtdb_changed_t *changed, *next_changed; + rbtdb_serial_t serial, least_serial; + dns_rbtnode_t *rbtnode; + unsigned int refs; isc_boolean_t writer; - REQUIRE(VALID_RBTDB(rbtdb)); - version = (rbtdb_version_t *)*versionp; - - cleanup_version = NULL; - ISC_LIST_INIT(cleanup_list); - - isc_refcount_decrement(&version->references, &refs); - if (refs > 0) { /* typical and easy case first */ - if (commit) { - RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_read); - INSIST(!version->writer); - RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_read); - } - goto end; - } - - RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); - serial = version->serial; - writer = version->writer; - if (version->writer) { - if (commit) { - unsigned cur_ref; - rbtdb_version_t *cur_version; - - INSIST(version->commit_ok); - INSIST(version == rbtdb->future_version); - /* - * The current version is going to be replaced. - * Release the (likely last) reference to it from the - * DB itself and unlink it from the open list. - */ - cur_version = rbtdb->current_version; - isc_refcount_decrement(&cur_version->references, - &cur_ref); - if (cur_ref == 0) { - if (cur_version->serial == rbtdb->least_serial) - INSIST(EMPTY(cur_version->changed_list)); - UNLINK(rbtdb->open_versions, - cur_version, link); - } - if (EMPTY(rbtdb->open_versions)) { - /* - * We're going to become the least open - * version. - */ - make_least_version(rbtdb, version, - &cleanup_list); - } else { - /* - * Some other open version is the - * least version. We can't cleanup - * records that were changed in this - * version because the older versions - * may still be in use by an open - * version. - * - * We can, however, discard the - * changed records for things that - * we've added that didn't exist in - * prior versions. - */ - cleanup_nondirty(version, &cleanup_list); - } - /* - * If the (soon to be former) current version - * isn't being used by anyone, we can clean - * it up. - */ - if (cur_ref == 0) { - cleanup_version = cur_version; - APPENDLIST(version->changed_list, - cleanup_version->changed_list, - link); - } - /* - * Become the current version. - */ - version->writer = ISC_FALSE; - rbtdb->current_version = version; - rbtdb->current_serial = version->serial; - rbtdb->future_version = NULL; - - /* - * Keep the current version in the open list, and - * gain a reference for the DB itself (see the DB - * creation function below). This must be the only - * case where we need to increment the counter from - * zero and need to use isc_refcount_increment0(). - */ - isc_refcount_increment0(&version->references, - &cur_ref); - INSIST(cur_ref == 1); - PREPEND(rbtdb->open_versions, - rbtdb->current_version, link); - } else { - /* - * We're rolling back this transaction. - */ - cleanup_list = version->changed_list; - ISC_LIST_INIT(version->changed_list); - rollback = ISC_TRUE; - cleanup_version = version; - rbtdb->future_version = NULL; - } - } else { - if (version != rbtdb->current_version) { - /* - * There are no external or internal references - * to this version and it can be cleaned up. - */ - cleanup_version = version; - - /* - * Find the version with the least serial - * number greater than ours. - */ - least_greater = PREV(version, link); - if (least_greater == NULL) - least_greater = rbtdb->current_version; - - INSIST(version->serial < least_greater->serial); - /* - * Is this the least open version? - */ - if (version->serial == rbtdb->least_serial) { - /* - * Yes. Install the new least open - * version. - */ - make_least_version(rbtdb, - least_greater, - &cleanup_list); - } else { - /* - * Add any unexecuted cleanups to - * those of the least greater version. - */ - APPENDLIST(least_greater->changed_list, - version->changed_list, - link); - } - } else if (version->serial == rbtdb->least_serial) - INSIST(EMPTY(version->changed_list)); - UNLINK(rbtdb->open_versions, version, link); - } - least_serial = rbtdb->least_serial; - RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); - - /* - * Update the zone's secure status. - */ - if (writer && commit && !IS_CACHE(rbtdb)) - rbtdb->secure = iszonesecure(db, rbtdb->origin_node); - - if (cleanup_version != NULL) { - INSIST(EMPTY(cleanup_version->changed_list)); - isc_mem_put(rbtdb->common.mctx, cleanup_version, - sizeof(*cleanup_version)); - } - - if (!EMPTY(cleanup_list)) { - for (changed = HEAD(cleanup_list); - changed != NULL; - changed = next_changed) { - nodelock_t *lock; - - next_changed = NEXT(changed, link); - rbtnode = changed->node; - lock = &rbtdb->node_locks[rbtnode->locknum].lock; - - NODE_LOCK(lock, isc_rwlocktype_write); - if (rollback) - rollback_node(rbtnode, serial); - decrement_reference(rbtdb, rbtnode, least_serial, - isc_rwlocktype_write, - isc_rwlocktype_none); - NODE_UNLOCK(lock, isc_rwlocktype_write); - - isc_mem_put(rbtdb->common.mctx, changed, - sizeof(*changed)); - } - } + REQUIRE(VALID_RBTDB(rbtdb)); + version = (rbtdb_version_t *)*versionp; + + cleanup_version = NULL; + ISC_LIST_INIT(cleanup_list); + + isc_refcount_decrement(&version->references, &refs); + if (refs > 0) { /* typical and easy case first */ + if (commit) { + RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_read); + INSIST(!version->writer); + RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_read); + } + goto end; + } + + RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); + serial = version->serial; + writer = version->writer; + if (version->writer) { + if (commit) { + unsigned cur_ref; + rbtdb_version_t *cur_version; + + INSIST(version->commit_ok); + INSIST(version == rbtdb->future_version); + /* + * The current version is going to be replaced. + * Release the (likely last) reference to it from the + * DB itself and unlink it from the open list. + */ + cur_version = rbtdb->current_version; + isc_refcount_decrement(&cur_version->references, + &cur_ref); + if (cur_ref == 0) { + if (cur_version->serial == rbtdb->least_serial) + INSIST(EMPTY(cur_version->changed_list)); + UNLINK(rbtdb->open_versions, + cur_version, link); + } + if (EMPTY(rbtdb->open_versions)) { + /* + * We're going to become the least open + * version. + */ + make_least_version(rbtdb, version, + &cleanup_list); + } else { + /* + * Some other open version is the + * least version. We can't cleanup + * records that were changed in this + * version because the older versions + * may still be in use by an open + * version. + * + * We can, however, discard the + * changed records for things that + * we've added that didn't exist in + * prior versions. + */ + cleanup_nondirty(version, &cleanup_list); + } + /* + * If the (soon to be former) current version + * isn't being used by anyone, we can clean + * it up. + */ + if (cur_ref == 0) { + cleanup_version = cur_version; + APPENDLIST(version->changed_list, + cleanup_version->changed_list, + link); + } + /* + * Become the current version. + */ + version->writer = ISC_FALSE; + rbtdb->current_version = version; + rbtdb->current_serial = version->serial; + rbtdb->future_version = NULL; + + /* + * Keep the current version in the open list, and + * gain a reference for the DB itself (see the DB + * creation function below). This must be the only + * case where we need to increment the counter from + * zero and need to use isc_refcount_increment0(). + */ + isc_refcount_increment0(&version->references, + &cur_ref); + INSIST(cur_ref == 1); + PREPEND(rbtdb->open_versions, + rbtdb->current_version, link); + } else { + /* + * We're rolling back this transaction. + */ + cleanup_list = version->changed_list; + ISC_LIST_INIT(version->changed_list); + rollback = ISC_TRUE; + cleanup_version = version; + rbtdb->future_version = NULL; + } + } else { + if (version != rbtdb->current_version) { + /* + * There are no external or internal references + * to this version and it can be cleaned up. + */ + cleanup_version = version; + + /* + * Find the version with the least serial + * number greater than ours. + */ + least_greater = PREV(version, link); + if (least_greater == NULL) + least_greater = rbtdb->current_version; + + INSIST(version->serial < least_greater->serial); + /* + * Is this the least open version? + */ + if (version->serial == rbtdb->least_serial) { + /* + * Yes. Install the new least open + * version. + */ + make_least_version(rbtdb, + least_greater, + &cleanup_list); + } else { + /* + * Add any unexecuted cleanups to + * those of the least greater version. + */ + APPENDLIST(least_greater->changed_list, + version->changed_list, + link); + } + } else if (version->serial == rbtdb->least_serial) + INSIST(EMPTY(version->changed_list)); + UNLINK(rbtdb->open_versions, version, link); + } + least_serial = rbtdb->least_serial; + RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); + + /* + * Update the zone's secure status. + */ + if (writer && commit && !IS_CACHE(rbtdb)) + rbtdb->secure = iszonesecure(db, rbtdb->origin_node); + + if (cleanup_version != NULL) { + INSIST(EMPTY(cleanup_version->changed_list)); + isc_mem_put(rbtdb->common.mctx, cleanup_version, + sizeof(*cleanup_version)); + } + + if (!EMPTY(cleanup_list)) { + /* + * We acquire a tree write lock here in order to make sure + * that stale nodes will be removed in decrement_reference(). + * If we didn't have the lock, those nodes could miss the + * chance to be removed until the server stops. The write lock + * is expensive, but this event should be rare enough to justify + * the cost. + */ + RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_write); + for (changed = HEAD(cleanup_list); + changed != NULL; + changed = next_changed) { + nodelock_t *lock; + + next_changed = NEXT(changed, link); + rbtnode = changed->node; + lock = &rbtdb->node_locks[rbtnode->locknum].lock; + + NODE_LOCK(lock, isc_rwlocktype_write); + /* + * This is a good opportunity to purge any dead nodes, + * so use it. + */ + cleanup_dead_nodes(rbtdb, rbtnode->locknum); + + if (rollback) + rollback_node(rbtnode, serial); + decrement_reference(rbtdb, rbtnode, least_serial, + isc_rwlocktype_write, + isc_rwlocktype_write); + + NODE_UNLOCK(lock, isc_rwlocktype_write); + + isc_mem_put(rbtdb->common.mctx, changed, + sizeof(*changed)); + } + RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_write); + } end: - *versionp = NULL; + *versionp = NULL; } /* @@ -1955,4130 +1879,4032 @@ closeversion(dns_db_t *db, dns_dbversion_t **versionp, isc_boolean_t commit) { */ static isc_result_t add_wildcard_magic(dns_rbtdb_t *rbtdb, dns_name_t *name) { - isc_result_t result; - dns_name_t foundname; - dns_offsets_t offsets; - unsigned int n; - dns_rbtnode_t *node = NULL; - - dns_name_init(&foundname, offsets); - n = dns_name_countlabels(name); - INSIST(n >= 2); - n--; - dns_name_getlabelsequence(name, 1, n, &foundname); - result = dns_rbt_addnode(rbtdb->tree, &foundname, &node); - if (result != ISC_R_SUCCESS && result != ISC_R_EXISTS) - return (result); - node->find_callback = 1; - node->wild = 1; - return (ISC_R_SUCCESS); + isc_result_t result; + dns_name_t foundname; + dns_offsets_t offsets; + unsigned int n; + dns_rbtnode_t *node = NULL; + + dns_name_init(&foundname, offsets); + n = dns_name_countlabels(name); + INSIST(n >= 2); + n--; + dns_name_getlabelsequence(name, 1, n, &foundname); + result = dns_rbt_addnode(rbtdb->tree, &foundname, &node); + if (result != ISC_R_SUCCESS && result != ISC_R_EXISTS) + return (result); + node->find_callback = 1; + node->wild = 1; + return (ISC_R_SUCCESS); } static isc_result_t add_empty_wildcards(dns_rbtdb_t *rbtdb, dns_name_t *name) { - isc_result_t result; - dns_name_t foundname; - dns_offsets_t offsets; - unsigned int n, l, i; - - dns_name_init(&foundname, offsets); - n = dns_name_countlabels(name); - l = dns_name_countlabels(&rbtdb->common.origin); - i = l + 1; - while (i < n) { - dns_rbtnode_t *node = NULL; /* dummy */ - dns_name_getlabelsequence(name, n - i, i, &foundname); - if (dns_name_iswildcard(&foundname)) { - result = add_wildcard_magic(rbtdb, &foundname); - if (result != ISC_R_SUCCESS) - return (result); - result = dns_rbt_addnode(rbtdb->tree, &foundname, - &node); - if (result != ISC_R_SUCCESS && result != ISC_R_EXISTS) - return (result); - } - i++; - } - return (ISC_R_SUCCESS); + isc_result_t result; + dns_name_t foundname; + dns_offsets_t offsets; + unsigned int n, l, i; + + dns_name_init(&foundname, offsets); + n = dns_name_countlabels(name); + l = dns_name_countlabels(&rbtdb->common.origin); + i = l + 1; + while (i < n) { + dns_rbtnode_t *node = NULL; /* dummy */ + dns_name_getlabelsequence(name, n - i, i, &foundname); + if (dns_name_iswildcard(&foundname)) { + result = add_wildcard_magic(rbtdb, &foundname); + if (result != ISC_R_SUCCESS) + return (result); + result = dns_rbt_addnode(rbtdb->tree, &foundname, + &node); + if (result != ISC_R_SUCCESS && result != ISC_R_EXISTS) + return (result); + } + i++; + } + return (ISC_R_SUCCESS); } static isc_result_t findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create, - dns_dbnode_t **nodep) + dns_dbnode_t **nodep) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - dns_rbtnode_t *node = NULL; - dns_name_t nodename; - isc_result_t result; - isc_rwlocktype_t locktype = isc_rwlocktype_read; - - REQUIRE(VALID_RBTDB(rbtdb)); - - dns_name_init(&nodename, NULL); - RWLOCK(&rbtdb->tree_lock, locktype); - result = dns_rbt_findnode(rbtdb->tree, name, NULL, &node, NULL, - DNS_RBTFIND_EMPTYDATA, NULL, NULL); - if (result != ISC_R_SUCCESS) { - RWUNLOCK(&rbtdb->tree_lock, locktype); - if (!create) { - if (result == DNS_R_PARTIALMATCH) - result = ISC_R_NOTFOUND; - return (result); - } - /* - * It would be nice to try to upgrade the lock instead of - * unlocking then relocking. - */ - locktype = isc_rwlocktype_write; - RWLOCK(&rbtdb->tree_lock, locktype); - node = NULL; - result = dns_rbt_addnode(rbtdb->tree, name, &node); - if (result == ISC_R_SUCCESS) { - dns_rbt_namefromnode(node, &nodename); + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + dns_rbtnode_t *node = NULL; + dns_name_t nodename; + isc_result_t result; + isc_rwlocktype_t locktype = isc_rwlocktype_read; + isc_boolean_t need_relock; + + REQUIRE(VALID_RBTDB(rbtdb)); + + dns_name_init(&nodename, NULL); + RWLOCK(&rbtdb->tree_lock, locktype); + result = dns_rbt_findnode(rbtdb->tree, name, NULL, &node, NULL, + DNS_RBTFIND_EMPTYDATA, NULL, NULL); + if (result != ISC_R_SUCCESS) { + RWUNLOCK(&rbtdb->tree_lock, locktype); + if (!create) { + if (result == DNS_R_PARTIALMATCH) + result = ISC_R_NOTFOUND; + return (result); + } + /* + * It would be nice to try to upgrade the lock instead of + * unlocking then relocking. + */ + locktype = isc_rwlocktype_write; + RWLOCK(&rbtdb->tree_lock, locktype); + node = NULL; + result = dns_rbt_addnode(rbtdb->tree, name, &node); + if (result == ISC_R_SUCCESS) { + dns_rbt_namefromnode(node, &nodename); #ifdef DNS_RBT_USEHASH - node->locknum = node->hashval % rbtdb->node_lock_count; + node->locknum = node->hashval % rbtdb->node_lock_count; #else - node->locknum = dns_name_hash(&nodename, ISC_TRUE) % - rbtdb->node_lock_count; + node->locknum = dns_name_hash(&nodename, ISC_TRUE) % + rbtdb->node_lock_count; #endif - add_empty_wildcards(rbtdb, name); - - if (dns_name_iswildcard(name)) { - result = add_wildcard_magic(rbtdb, name); - if (result != ISC_R_SUCCESS) { - RWUNLOCK(&rbtdb->tree_lock, locktype); - return (result); - } - } - } else if (result != ISC_R_EXISTS) { - RWUNLOCK(&rbtdb->tree_lock, locktype); - return (result); - } - } - NODE_STRONGLOCK(&rbtdb->node_locks[node->locknum].lock); - new_reference(rbtdb, node); - - /* - * If the node just found is in the deadnode list, we need to retrieve - * it from the list because we are going to use the node. There are - * other cases where a node is newly referenced, but this should be - * the only case where it can be in the deadnode list. Also, if we - * happen to hold a write lock on the tree, it's a good chance to purge - * dead nodes. - */ - if (IS_CACHE(rbtdb)) { - isc_boolean_t need_relock = ISC_FALSE; - - NODE_WEAKLOCK(&rbtdb->node_locks[node->locknum].lock, - isc_rwlocktype_read); - if (ISC_LINK_LINKED(node, deadlink) && isc_rwlocktype_write) - need_relock = ISC_TRUE; - else if (!ISC_LIST_EMPTY(rbtdb->deadnodes[node->locknum]) && - locktype == isc_rwlocktype_write) - need_relock = ISC_TRUE; - NODE_WEAKUNLOCK(&rbtdb->node_locks[node->locknum].lock, - isc_rwlocktype_read); - if (need_relock) { - NODE_WEAKLOCK(&rbtdb->node_locks[node->locknum].lock, - isc_rwlocktype_write); - if (ISC_LINK_LINKED(node, deadlink)) - ISC_LIST_UNLINK(rbtdb->deadnodes[node->locknum], - node, deadlink); - if (locktype == isc_rwlocktype_write) - cleanup_dead_nodes(rbtdb, node->locknum); - NODE_WEAKUNLOCK(&rbtdb->node_locks[node->locknum].lock, - isc_rwlocktype_write); - } - } - - NODE_STRONGUNLOCK(&rbtdb->node_locks[node->locknum].lock); - RWUNLOCK(&rbtdb->tree_lock, locktype); - - *nodep = (dns_dbnode_t *)node; - - return (ISC_R_SUCCESS); + add_empty_wildcards(rbtdb, name); + + if (dns_name_iswildcard(name)) { + result = add_wildcard_magic(rbtdb, name); + if (result != ISC_R_SUCCESS) { + RWUNLOCK(&rbtdb->tree_lock, locktype); + return (result); + } + } + } else if (result != ISC_R_EXISTS) { + RWUNLOCK(&rbtdb->tree_lock, locktype); + return (result); + } + } + NODE_STRONGLOCK(&rbtdb->node_locks[node->locknum].lock); + new_reference(rbtdb, node); + + /* + * If the node just found is in the deadnode list, we need to retrieve + * it from the list because we are going to use the node. There are + * other cases where a node is newly referenced, but this should be + * the only case where it can be in the deadnode list. Also, if we + * happen to hold a write lock on the tree, it's a good chance to purge + * dead nodes. + */ + need_relock = ISC_FALSE; + NODE_WEAKLOCK(&rbtdb->node_locks[node->locknum].lock, + isc_rwlocktype_read); + if (ISC_LINK_LINKED(node, deadlink) && isc_rwlocktype_write) + need_relock = ISC_TRUE; + else if (!ISC_LIST_EMPTY(rbtdb->deadnodes[node->locknum]) && + locktype == isc_rwlocktype_write) + need_relock = ISC_TRUE; + NODE_WEAKUNLOCK(&rbtdb->node_locks[node->locknum].lock, + isc_rwlocktype_read); + if (need_relock) { + NODE_WEAKLOCK(&rbtdb->node_locks[node->locknum].lock, + isc_rwlocktype_write); + if (ISC_LINK_LINKED(node, deadlink)) + ISC_LIST_UNLINK(rbtdb->deadnodes[node->locknum], + node, deadlink); + if (locktype == isc_rwlocktype_write) + cleanup_dead_nodes(rbtdb, node->locknum); + NODE_WEAKUNLOCK(&rbtdb->node_locks[node->locknum].lock, + isc_rwlocktype_write); + } + + NODE_STRONGUNLOCK(&rbtdb->node_locks[node->locknum].lock); + RWUNLOCK(&rbtdb->tree_lock, locktype); + + *nodep = (dns_dbnode_t *)node; + + return (ISC_R_SUCCESS); } static isc_result_t zone_zonecut_callback(dns_rbtnode_t *node, dns_name_t *name, void *arg) { - rbtdb_search_t *search = arg; - rdatasetheader_t *header, *header_next; - rdatasetheader_t *dname_header, *sigdname_header, *ns_header; - rdatasetheader_t *found; - isc_result_t result; - dns_rbtnode_t *onode; - - /* - * We only want to remember the topmost zone cut, since it's the one - * that counts, so we'll just continue if we've already found a - * zonecut. - */ - if (search->zonecut != NULL) - return (DNS_R_CONTINUE); - - found = NULL; - result = DNS_R_CONTINUE; - onode = search->rbtdb->origin_node; - - NODE_LOCK(&(search->rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); - - /* - * Look for an NS or DNAME rdataset active in our version. - */ - ns_header = NULL; - dname_header = NULL; - sigdname_header = NULL; - for (header = node->data; header != NULL; header = header_next) { - header_next = header->next; - if (header->type == dns_rdatatype_ns || - header->type == dns_rdatatype_dname || - header->type == RBTDB_RDATATYPE_SIGDNAME) { - do { - if (header->serial <= search->serial && - !IGNORE(header)) { - /* - * Is this a "this rdataset doesn't - * exist" record? - */ - if (NONEXISTENT(header)) - header = NULL; - break; - } else - header = header->down; - } while (header != NULL); - if (header != NULL) { - if (header->type == dns_rdatatype_dname) - dname_header = header; - else if (header->type == - RBTDB_RDATATYPE_SIGDNAME) - sigdname_header = header; - else if (node != onode || - IS_STUB(search->rbtdb)) { - /* - * We've found an NS rdataset that - * isn't at the origin node. We check - * that they're not at the origin node, - * because otherwise we'd erroneously - * treat the zone top as if it were - * a delegation. - */ - ns_header = header; - } - } - } - } - - /* - * Did we find anything? - */ - if (dname_header != NULL) { - /* - * Note that DNAME has precedence over NS if both exist. - */ - found = dname_header; - search->zonecut_sigrdataset = sigdname_header; - } else if (ns_header != NULL) { - found = ns_header; - search->zonecut_sigrdataset = NULL; - } - - if (found != NULL) { - /* - * We increment the reference count on node to ensure that - * search->zonecut_rdataset will still be valid later. - */ - new_reference(search->rbtdb, node); - search->zonecut = node; - search->zonecut_rdataset = found; - search->need_cleanup = ISC_TRUE; - /* - * Since we've found a zonecut, anything beneath it is - * glue and is not subject to wildcard matching, so we - * may clear search->wild. - */ - search->wild = ISC_FALSE; - if ((search->options & DNS_DBFIND_GLUEOK) == 0) { - /* - * If the caller does not want to find glue, then - * this is the best answer and the search should - * stop now. - */ - result = DNS_R_PARTIALMATCH; - } else { - dns_name_t *zcname; - - /* - * The search will continue beneath the zone cut. - * This may or may not be the best match. In case it - * is, we need to remember the node name. - */ - zcname = dns_fixedname_name(&search->zonecut_name); - RUNTIME_CHECK(dns_name_copy(name, zcname, NULL) == - ISC_R_SUCCESS); - search->copy_name = ISC_TRUE; - } - } else { - /* - * There is no zonecut at this node which is active in this - * version. - * - * If this is a "wild" node and the caller hasn't disabled - * wildcard matching, remember that we've seen a wild node - * in case we need to go searching for wildcard matches - * later on. - */ - if (node->wild && (search->options & DNS_DBFIND_NOWILD) == 0) - search->wild = ISC_TRUE; - } - - NODE_UNLOCK(&(search->rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); - - return (result); + rbtdb_search_t *search = arg; + rdatasetheader_t *header, *header_next; + rdatasetheader_t *dname_header, *sigdname_header, *ns_header; + rdatasetheader_t *found; + isc_result_t result; + dns_rbtnode_t *onode; + + /* + * We only want to remember the topmost zone cut, since it's the one + * that counts, so we'll just continue if we've already found a + * zonecut. + */ + if (search->zonecut != NULL) + return (DNS_R_CONTINUE); + + found = NULL; + result = DNS_R_CONTINUE; + onode = search->rbtdb->origin_node; + + NODE_LOCK(&(search->rbtdb->node_locks[node->locknum].lock), + isc_rwlocktype_read); + + /* + * Look for an NS or DNAME rdataset active in our version. + */ + ns_header = NULL; + dname_header = NULL; + sigdname_header = NULL; + for (header = node->data; header != NULL; header = header_next) { + header_next = header->next; + if (header->type == dns_rdatatype_ns || + header->type == dns_rdatatype_dname || + header->type == RBTDB_RDATATYPE_SIGDNAME) { + do { + if (header->serial <= search->serial && + !IGNORE(header)) { + /* + * Is this a "this rdataset doesn't + * exist" record? + */ + if (NONEXISTENT(header)) + header = NULL; + break; + } else + header = header->down; + } while (header != NULL); + if (header != NULL) { + if (header->type == dns_rdatatype_dname) + dname_header = header; + else if (header->type == + RBTDB_RDATATYPE_SIGDNAME) + sigdname_header = header; + else if (node != onode || + IS_STUB(search->rbtdb)) { + /* + * We've found an NS rdataset that + * isn't at the origin node. We check + * that they're not at the origin node, + * because otherwise we'd erroneously + * treat the zone top as if it were + * a delegation. + */ + ns_header = header; + } + } + } + } + + /* + * Did we find anything? + */ + if (dname_header != NULL) { + /* + * Note that DNAME has precedence over NS if both exist. + */ + found = dname_header; + search->zonecut_sigrdataset = sigdname_header; + } else if (ns_header != NULL) { + found = ns_header; + search->zonecut_sigrdataset = NULL; + } + + if (found != NULL) { + /* + * We increment the reference count on node to ensure that + * search->zonecut_rdataset will still be valid later. + */ + new_reference(search->rbtdb, node); + search->zonecut = node; + search->zonecut_rdataset = found; + search->need_cleanup = ISC_TRUE; + /* + * Since we've found a zonecut, anything beneath it is + * glue and is not subject to wildcard matching, so we + * may clear search->wild. + */ + search->wild = ISC_FALSE; + if ((search->options & DNS_DBFIND_GLUEOK) == 0) { + /* + * If the caller does not want to find glue, then + * this is the best answer and the search should + * stop now. + */ + result = DNS_R_PARTIALMATCH; + } else { + dns_name_t *zcname; + + /* + * The search will continue beneath the zone cut. + * This may or may not be the best match. In case it + * is, we need to remember the node name. + */ + zcname = dns_fixedname_name(&search->zonecut_name); + RUNTIME_CHECK(dns_name_copy(name, zcname, NULL) == + ISC_R_SUCCESS); + search->copy_name = ISC_TRUE; + } + } else { + /* + * There is no zonecut at this node which is active in this + * version. + * + * If this is a "wild" node and the caller hasn't disabled + * wildcard matching, remember that we've seen a wild node + * in case we need to go searching for wildcard matches + * later on. + */ + if (node->wild && (search->options & DNS_DBFIND_NOWILD) == 0) + search->wild = ISC_TRUE; + } + + NODE_UNLOCK(&(search->rbtdb->node_locks[node->locknum].lock), + isc_rwlocktype_read); + + return (result); } static inline void bind_rdataset(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node, - rdatasetheader_t *header, isc_stdtime_t now, - dns_rdataset_t *rdataset) + rdatasetheader_t *header, isc_stdtime_t now, + dns_rdataset_t *rdataset) { - unsigned char *raw; /* RDATASLAB */ - - /* - * Caller must be holding the node reader lock. - * XXXJT: technically, we need a writer lock, since we'll increment - * the header count below. However, since the actual counter value - * doesn't matter, we prioritize performance here. (We may want to - * use atomic increment when available). - */ - - if (rdataset == NULL) - return; - - new_reference(rbtdb, node); - - INSIST(rdataset->methods == NULL); /* We must be disassociated. */ - - rdataset->methods = &rdataset_methods; - rdataset->rdclass = rbtdb->common.rdclass; - rdataset->type = RBTDB_RDATATYPE_BASE(header->type); - rdataset->covers = RBTDB_RDATATYPE_EXT(header->type); - rdataset->ttl = header->rdh_ttl - now; - rdataset->trust = header->trust; - if (NXDOMAIN(header)) - rdataset->attributes |= DNS_RDATASETATTR_NXDOMAIN; - rdataset->private1 = rbtdb; - rdataset->private2 = node; - raw = (unsigned char *)header + sizeof(*header); - rdataset->private3 = raw; - rdataset->count = header->count++; - if (rdataset->count == ISC_UINT32_MAX) - rdataset->count = 0; - - /* - * Reset iterator state. - */ - rdataset->privateuint4 = 0; - rdataset->private5 = NULL; - - /* - * Add noqname proof. - */ - rdataset->private6 = header->noqname; - if (rdataset->private6 != NULL) - rdataset->attributes |= DNS_RDATASETATTR_NOQNAME; + unsigned char *raw; /* RDATASLAB */ + + /* + * Caller must be holding the node reader lock. + * XXXJT: technically, we need a writer lock, since we'll increment + * the header count below. However, since the actual counter value + * doesn't matter, we prioritize performance here. (We may want to + * use atomic increment when available). + */ + + if (rdataset == NULL) + return; + + new_reference(rbtdb, node); + + INSIST(rdataset->methods == NULL); /* We must be disassociated. */ + + rdataset->methods = &rdataset_methods; + rdataset->rdclass = rbtdb->common.rdclass; + rdataset->type = RBTDB_RDATATYPE_BASE(header->type); + rdataset->covers = RBTDB_RDATATYPE_EXT(header->type); + rdataset->ttl = header->rdh_ttl - now; + rdataset->trust = header->trust; + if (NXDOMAIN(header)) + rdataset->attributes |= DNS_RDATASETATTR_NXDOMAIN; + rdataset->private1 = rbtdb; + rdataset->private2 = node; + raw = (unsigned char *)header + sizeof(*header); + rdataset->private3 = raw; + rdataset->count = header->count++; + if (rdataset->count == ISC_UINT32_MAX) + rdataset->count = 0; + + /* + * Reset iterator state. + */ + rdataset->privateuint4 = 0; + rdataset->private5 = NULL; + + /* + * Add noqname proof. + */ + rdataset->private6 = header->noqname; + if (rdataset->private6 != NULL) + rdataset->attributes |= DNS_RDATASETATTR_NOQNAME; } static inline isc_result_t setup_delegation(rbtdb_search_t *search, dns_dbnode_t **nodep, - dns_name_t *foundname, dns_rdataset_t *rdataset, - dns_rdataset_t *sigrdataset) + dns_name_t *foundname, dns_rdataset_t *rdataset, + dns_rdataset_t *sigrdataset) { - isc_result_t result; - dns_name_t *zcname; - rbtdb_rdatatype_t type; - dns_rbtnode_t *node; - - /* - * The caller MUST NOT be holding any node locks. - */ - - node = search->zonecut; - type = search->zonecut_rdataset->type; - - /* - * If we have to set foundname, we do it before anything else. - * If we were to set foundname after we had set nodep or bound the - * rdataset, then we'd have to undo that work if dns_name_copy() - * failed. By setting foundname first, there's nothing to undo if - * we have trouble. - */ - if (foundname != NULL && search->copy_name) { - zcname = dns_fixedname_name(&search->zonecut_name); - result = dns_name_copy(zcname, foundname, NULL); - if (result != ISC_R_SUCCESS) - return (result); - } - if (nodep != NULL) { - /* - * Note that we don't have to increment the node's reference - * count here because we're going to use the reference we - * already have in the search block. - */ - *nodep = node; - search->need_cleanup = ISC_FALSE; - } - if (rdataset != NULL) { - NODE_LOCK(&(search->rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); - bind_rdataset(search->rbtdb, node, search->zonecut_rdataset, - search->now, rdataset); - if (sigrdataset != NULL && search->zonecut_sigrdataset != NULL) - bind_rdataset(search->rbtdb, node, - search->zonecut_sigrdataset, - search->now, sigrdataset); - NODE_UNLOCK(&(search->rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); - } - - if (type == dns_rdatatype_dname) - return (DNS_R_DNAME); - return (DNS_R_DELEGATION); + isc_result_t result; + dns_name_t *zcname; + rbtdb_rdatatype_t type; + dns_rbtnode_t *node; + + /* + * The caller MUST NOT be holding any node locks. + */ + + node = search->zonecut; + type = search->zonecut_rdataset->type; + + /* + * If we have to set foundname, we do it before anything else. + * If we were to set foundname after we had set nodep or bound the + * rdataset, then we'd have to undo that work if dns_name_copy() + * failed. By setting foundname first, there's nothing to undo if + * we have trouble. + */ + if (foundname != NULL && search->copy_name) { + zcname = dns_fixedname_name(&search->zonecut_name); + result = dns_name_copy(zcname, foundname, NULL); + if (result != ISC_R_SUCCESS) + return (result); + } + if (nodep != NULL) { + /* + * Note that we don't have to increment the node's reference + * count here because we're going to use the reference we + * already have in the search block. + */ + *nodep = node; + search->need_cleanup = ISC_FALSE; + } + if (rdataset != NULL) { + NODE_LOCK(&(search->rbtdb->node_locks[node->locknum].lock), + isc_rwlocktype_read); + bind_rdataset(search->rbtdb, node, search->zonecut_rdataset, + search->now, rdataset); + if (sigrdataset != NULL && search->zonecut_sigrdataset != NULL) + bind_rdataset(search->rbtdb, node, + search->zonecut_sigrdataset, + search->now, sigrdataset); + NODE_UNLOCK(&(search->rbtdb->node_locks[node->locknum].lock), + isc_rwlocktype_read); + } + + if (type == dns_rdatatype_dname) + return (DNS_R_DNAME); + return (DNS_R_DELEGATION); } static inline isc_boolean_t valid_glue(rbtdb_search_t *search, dns_name_t *name, rbtdb_rdatatype_t type, - dns_rbtnode_t *node) + dns_rbtnode_t *node) { - unsigned char *raw; /* RDATASLAB */ - unsigned int count, size; - dns_name_t ns_name; - isc_boolean_t valid = ISC_FALSE; - dns_offsets_t offsets; - isc_region_t region; - rdatasetheader_t *header; - - /* - * No additional locking is required. - */ - - /* - * Valid glue types are A, AAAA, A6. NS is also a valid glue type - * if it occurs at a zone cut, but is not valid below it. - */ - if (type == dns_rdatatype_ns) { - if (node != search->zonecut) { - return (ISC_FALSE); - } - } else if (type != dns_rdatatype_a && - type != dns_rdatatype_aaaa && - type != dns_rdatatype_a6) { - return (ISC_FALSE); - } - - header = search->zonecut_rdataset; - raw = (unsigned char *)header + sizeof(*header); - count = raw[0] * 256 + raw[1]; + unsigned char *raw; /* RDATASLAB */ + unsigned int count, size; + dns_name_t ns_name; + isc_boolean_t valid = ISC_FALSE; + dns_offsets_t offsets; + isc_region_t region; + rdatasetheader_t *header; + + /* + * No additional locking is required. + */ + + /* + * Valid glue types are A, AAAA, A6. NS is also a valid glue type + * if it occurs at a zone cut, but is not valid below it. + */ + if (type == dns_rdatatype_ns) { + if (node != search->zonecut) { + return (ISC_FALSE); + } + } else if (type != dns_rdatatype_a && + type != dns_rdatatype_aaaa && + type != dns_rdatatype_a6) { + return (ISC_FALSE); + } + + header = search->zonecut_rdataset; + raw = (unsigned char *)header + sizeof(*header); + count = raw[0] * 256 + raw[1]; #if DNS_RDATASET_FIXED - raw += 2 + (4 * count); + raw += 2 + (4 * count); #else - raw += 2; + raw += 2; #endif - while (count > 0) { - count--; - size = raw[0] * 256 + raw[1]; + while (count > 0) { + count--; + size = raw[0] * 256 + raw[1]; #if DNS_RDATASET_FIXED - raw += 4; + raw += 4; #else - raw += 2; + raw += 2; #endif - region.base = raw; - region.length = size; - raw += size; - /* - * XXX Until we have rdata structures, we have no choice but - * to directly access the rdata format. - */ - dns_name_init(&ns_name, offsets); - dns_name_fromregion(&ns_name, ®ion); - if (dns_name_compare(&ns_name, name) == 0) { - valid = ISC_TRUE; - break; - } - } - - return (valid); + region.base = raw; + region.length = size; + raw += size; + /* + * XXX Until we have rdata structures, we have no choice but + * to directly access the rdata format. + */ + dns_name_init(&ns_name, offsets); + dns_name_fromregion(&ns_name, ®ion); + if (dns_name_compare(&ns_name, name) == 0) { + valid = ISC_TRUE; + break; + } + } + + return (valid); } static inline isc_boolean_t activeempty(rbtdb_search_t *search, dns_rbtnodechain_t *chain, - dns_name_t *name) + dns_name_t *name) { - dns_fixedname_t fnext; - dns_fixedname_t forigin; - dns_name_t *next; - dns_name_t *origin; - dns_name_t prefix; - dns_rbtdb_t *rbtdb; - dns_rbtnode_t *node; - isc_result_t result; - isc_boolean_t answer = ISC_FALSE; - rdatasetheader_t *header; - - rbtdb = search->rbtdb; - - dns_name_init(&prefix, NULL); - dns_fixedname_init(&fnext); - next = dns_fixedname_name(&fnext); - dns_fixedname_init(&forigin); - origin = dns_fixedname_name(&forigin); - - result = dns_rbtnodechain_next(chain, NULL, NULL); - while (result == ISC_R_SUCCESS || result == DNS_R_NEWORIGIN) { - node = NULL; - result = dns_rbtnodechain_current(chain, &prefix, - origin, &node); - if (result != ISC_R_SUCCESS) - break; - NODE_LOCK(&(rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); - for (header = node->data; - header != NULL; - header = header->next) { - if (header->serial <= search->serial && - !IGNORE(header) && EXISTS(header)) - break; - } - NODE_UNLOCK(&(rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); - if (header != NULL) - break; - result = dns_rbtnodechain_next(chain, NULL, NULL); - } - if (result == ISC_R_SUCCESS) - result = dns_name_concatenate(&prefix, origin, next, NULL); - if (result == ISC_R_SUCCESS && dns_name_issubdomain(next, name)) - answer = ISC_TRUE; - return (answer); + dns_fixedname_t fnext; + dns_fixedname_t forigin; + dns_name_t *next; + dns_name_t *origin; + dns_name_t prefix; + dns_rbtdb_t *rbtdb; + dns_rbtnode_t *node; + isc_result_t result; + isc_boolean_t answer = ISC_FALSE; + rdatasetheader_t *header; + + rbtdb = search->rbtdb; + + dns_name_init(&prefix, NULL); + dns_fixedname_init(&fnext); + next = dns_fixedname_name(&fnext); + dns_fixedname_init(&forigin); + origin = dns_fixedname_name(&forigin); + + result = dns_rbtnodechain_next(chain, NULL, NULL); + while (result == ISC_R_SUCCESS || result == DNS_R_NEWORIGIN) { + node = NULL; + result = dns_rbtnodechain_current(chain, &prefix, + origin, &node); + if (result != ISC_R_SUCCESS) + break; + NODE_LOCK(&(rbtdb->node_locks[node->locknum].lock), + isc_rwlocktype_read); + for (header = node->data; + header != NULL; + header = header->next) { + if (header->serial <= search->serial && + !IGNORE(header) && EXISTS(header)) + break; + } + NODE_UNLOCK(&(rbtdb->node_locks[node->locknum].lock), + isc_rwlocktype_read); + if (header != NULL) + break; + result = dns_rbtnodechain_next(chain, NULL, NULL); + } + if (result == ISC_R_SUCCESS) + result = dns_name_concatenate(&prefix, origin, next, NULL); + if (result == ISC_R_SUCCESS && dns_name_issubdomain(next, name)) + answer = ISC_TRUE; + return (answer); } static inline isc_boolean_t activeemtpynode(rbtdb_search_t *search, dns_name_t *qname, dns_name_t *wname) { - dns_fixedname_t fnext; - dns_fixedname_t forigin; - dns_fixedname_t fprev; - dns_name_t *next; - dns_name_t *origin; - dns_name_t *prev; - dns_name_t name; - dns_name_t rname; - dns_name_t tname; - dns_rbtdb_t *rbtdb; - dns_rbtnode_t *node; - dns_rbtnodechain_t chain; - isc_boolean_t check_next = ISC_TRUE; - isc_boolean_t check_prev = ISC_TRUE; - isc_boolean_t answer = ISC_FALSE; - isc_result_t result; - rdatasetheader_t *header; - unsigned int n; - - rbtdb = search->rbtdb; - - dns_name_init(&name, NULL); - dns_name_init(&tname, NULL); - dns_name_init(&rname, NULL); - dns_fixedname_init(&fnext); - next = dns_fixedname_name(&fnext); - dns_fixedname_init(&fprev); - prev = dns_fixedname_name(&fprev); - dns_fixedname_init(&forigin); - origin = dns_fixedname_name(&forigin); - - /* - * Find if qname is at or below a empty node. - * Use our own copy of the chain. - */ - - chain = search->chain; - do { - node = NULL; - result = dns_rbtnodechain_current(&chain, &name, - origin, &node); - if (result != ISC_R_SUCCESS) - break; - NODE_LOCK(&(rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); - for (header = node->data; - header != NULL; - header = header->next) { - if (header->serial <= search->serial && - !IGNORE(header) && EXISTS(header)) - break; - } - NODE_UNLOCK(&(rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); - if (header != NULL) - break; - result = dns_rbtnodechain_prev(&chain, NULL, NULL); - } while (result == ISC_R_SUCCESS || result == DNS_R_NEWORIGIN); - if (result == ISC_R_SUCCESS) - result = dns_name_concatenate(&name, origin, prev, NULL); - if (result != ISC_R_SUCCESS) - check_prev = ISC_FALSE; - - result = dns_rbtnodechain_next(&chain, NULL, NULL); - while (result == ISC_R_SUCCESS || result == DNS_R_NEWORIGIN) { - node = NULL; - result = dns_rbtnodechain_current(&chain, &name, - origin, &node); - if (result != ISC_R_SUCCESS) - break; - NODE_LOCK(&(rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); - for (header = node->data; - header != NULL; - header = header->next) { - if (header->serial <= search->serial && - !IGNORE(header) && EXISTS(header)) - break; - } - NODE_UNLOCK(&(rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); - if (header != NULL) - break; - result = dns_rbtnodechain_next(&chain, NULL, NULL); - } - if (result == ISC_R_SUCCESS) - result = dns_name_concatenate(&name, origin, next, NULL); - if (result != ISC_R_SUCCESS) - check_next = ISC_FALSE; - - dns_name_clone(qname, &rname); - - /* - * Remove the wildcard label to find the terminal name. - */ - n = dns_name_countlabels(wname); - dns_name_getlabelsequence(wname, 1, n - 1, &tname); - - do { - if ((check_prev && dns_name_issubdomain(prev, &rname)) || - (check_next && dns_name_issubdomain(next, &rname))) { - answer = ISC_TRUE; - break; - } - /* - * Remove the left hand label. - */ - n = dns_name_countlabels(&rname); - dns_name_getlabelsequence(&rname, 1, n - 1, &rname); - } while (!dns_name_equal(&rname, &tname)); - return (answer); + dns_fixedname_t fnext; + dns_fixedname_t forigin; + dns_fixedname_t fprev; + dns_name_t *next; + dns_name_t *origin; + dns_name_t *prev; + dns_name_t name; + dns_name_t rname; + dns_name_t tname; + dns_rbtdb_t *rbtdb; + dns_rbtnode_t *node; + dns_rbtnodechain_t chain; + isc_boolean_t check_next = ISC_TRUE; + isc_boolean_t check_prev = ISC_TRUE; + isc_boolean_t answer = ISC_FALSE; + isc_result_t result; + rdatasetheader_t *header; + unsigned int n; + + rbtdb = search->rbtdb; + + dns_name_init(&name, NULL); + dns_name_init(&tname, NULL); + dns_name_init(&rname, NULL); + dns_fixedname_init(&fnext); + next = dns_fixedname_name(&fnext); + dns_fixedname_init(&fprev); + prev = dns_fixedname_name(&fprev); + dns_fixedname_init(&forigin); + origin = dns_fixedname_name(&forigin); + + /* + * Find if qname is at or below a empty node. + * Use our own copy of the chain. + */ + + chain = search->chain; + do { + node = NULL; + result = dns_rbtnodechain_current(&chain, &name, + origin, &node); + if (result != ISC_R_SUCCESS) + break; + NODE_LOCK(&(rbtdb->node_locks[node->locknum].lock), + isc_rwlocktype_read); + for (header = node->data; + header != NULL; + header = header->next) { + if (header->serial <= search->serial && + !IGNORE(header) && EXISTS(header)) + break; + } + NODE_UNLOCK(&(rbtdb->node_locks[node->locknum].lock), + isc_rwlocktype_read); + if (header != NULL) + break; + result = dns_rbtnodechain_prev(&chain, NULL, NULL); + } while (result == ISC_R_SUCCESS || result == DNS_R_NEWORIGIN); + if (result == ISC_R_SUCCESS) + result = dns_name_concatenate(&name, origin, prev, NULL); + if (result != ISC_R_SUCCESS) + check_prev = ISC_FALSE; + + result = dns_rbtnodechain_next(&chain, NULL, NULL); + while (result == ISC_R_SUCCESS || result == DNS_R_NEWORIGIN) { + node = NULL; + result = dns_rbtnodechain_current(&chain, &name, + origin, &node); + if (result != ISC_R_SUCCESS) + break; + NODE_LOCK(&(rbtdb->node_locks[node->locknum].lock), + isc_rwlocktype_read); + for (header = node->data; + header != NULL; + header = header->next) { + if (header->serial <= search->serial && + !IGNORE(header) && EXISTS(header)) + break; + } + NODE_UNLOCK(&(rbtdb->node_locks[node->locknum].lock), + isc_rwlocktype_read); + if (header != NULL) + break; + result = dns_rbtnodechain_next(&chain, NULL, NULL); + } + if (result == ISC_R_SUCCESS) + result = dns_name_concatenate(&name, origin, next, NULL); + if (result != ISC_R_SUCCESS) + check_next = ISC_FALSE; + + dns_name_clone(qname, &rname); + + /* + * Remove the wildcard label to find the terminal name. + */ + n = dns_name_countlabels(wname); + dns_name_getlabelsequence(wname, 1, n - 1, &tname); + + do { + if ((check_prev && dns_name_issubdomain(prev, &rname)) || + (check_next && dns_name_issubdomain(next, &rname))) { + answer = ISC_TRUE; + break; + } + /* + * Remove the left hand label. + */ + n = dns_name_countlabels(&rname); + dns_name_getlabelsequence(&rname, 1, n - 1, &rname); + } while (!dns_name_equal(&rname, &tname)); + return (answer); } static inline isc_result_t find_wildcard(rbtdb_search_t *search, dns_rbtnode_t **nodep, - dns_name_t *qname) + dns_name_t *qname) { - unsigned int i, j; - dns_rbtnode_t *node, *level_node, *wnode; - rdatasetheader_t *header; - isc_result_t result = ISC_R_NOTFOUND; - dns_name_t name; - dns_name_t *wname; - dns_fixedname_t fwname; - dns_rbtdb_t *rbtdb; - isc_boolean_t done, wild, active; - dns_rbtnodechain_t wchain; - - /* - * Caller must be holding the tree lock and MUST NOT be holding - * any node locks. - */ - - /* - * Examine each ancestor level. If the level's wild bit - * is set, then construct the corresponding wildcard name and - * search for it. If the wildcard node exists, and is active in - * this version, we're done. If not, then we next check to see - * if the ancestor is active in this version. If so, then there - * can be no possible wildcard match and again we're done. If not, - * continue the search. - */ - - rbtdb = search->rbtdb; - i = search->chain.level_matches; - done = ISC_FALSE; - node = *nodep; - do { - NODE_LOCK(&(rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); - - /* - * First we try to figure out if this node is active in - * the search's version. We do this now, even though we - * may not need the information, because it simplifies the - * locking and code flow. - */ - for (header = node->data; - header != NULL; - header = header->next) { - if (header->serial <= search->serial && - !IGNORE(header) && EXISTS(header)) - break; - } - if (header != NULL) - active = ISC_TRUE; - else - active = ISC_FALSE; - - if (node->wild) - wild = ISC_TRUE; - else - wild = ISC_FALSE; - - NODE_UNLOCK(&(rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); - - if (wild) { - /* - * Construct the wildcard name for this level. - */ - dns_name_init(&name, NULL); - dns_rbt_namefromnode(node, &name); - dns_fixedname_init(&fwname); - wname = dns_fixedname_name(&fwname); - result = dns_name_concatenate(dns_wildcardname, &name, - wname, NULL); - j = i; - while (result == ISC_R_SUCCESS && j != 0) { - j--; - level_node = search->chain.levels[j]; - dns_name_init(&name, NULL); - dns_rbt_namefromnode(level_node, &name); - result = dns_name_concatenate(wname, - &name, - wname, - NULL); - } - if (result != ISC_R_SUCCESS) - break; - - wnode = NULL; - dns_rbtnodechain_init(&wchain, NULL); - result = dns_rbt_findnode(rbtdb->tree, wname, - NULL, &wnode, &wchain, - DNS_RBTFIND_EMPTYDATA, - NULL, NULL); - if (result == ISC_R_SUCCESS) { - nodelock_t *lock; - - /* - * We have found the wildcard node. If it - * is active in the search's version, we're - * done. - */ - lock = &rbtdb->node_locks[wnode->locknum].lock; - NODE_LOCK(lock, isc_rwlocktype_read); - for (header = wnode->data; - header != NULL; - header = header->next) { - if (header->serial <= search->serial && - !IGNORE(header) && EXISTS(header)) - break; - } - NODE_UNLOCK(lock, isc_rwlocktype_read); - if (header != NULL || - activeempty(search, &wchain, wname)) { - if (activeemtpynode(search, qname, - wname)) { - return (ISC_R_NOTFOUND); - } - /* - * The wildcard node is active! - * - * Note: result is still ISC_R_SUCCESS - * so we don't have to set it. - */ - *nodep = wnode; - break; - } - } else if (result != ISC_R_NOTFOUND && - result != DNS_R_PARTIALMATCH) { - /* - * An error has occurred. Bail out. - */ - break; - } - } - - if (active) { - /* - * The level node is active. Any wildcarding - * present at higher levels has no - * effect and we're done. - */ - result = ISC_R_NOTFOUND; - break; - } - - if (i > 0) { - i--; - node = search->chain.levels[i]; - } else - done = ISC_TRUE; - } while (!done); - - return (result); + unsigned int i, j; + dns_rbtnode_t *node, *level_node, *wnode; + rdatasetheader_t *header; + isc_result_t result = ISC_R_NOTFOUND; + dns_name_t name; + dns_name_t *wname; + dns_fixedname_t fwname; + dns_rbtdb_t *rbtdb; + isc_boolean_t done, wild, active; + dns_rbtnodechain_t wchain; + + /* + * Caller must be holding the tree lock and MUST NOT be holding + * any node locks. + */ + + /* + * Examine each ancestor level. If the level's wild bit + * is set, then construct the corresponding wildcard name and + * search for it. If the wildcard node exists, and is active in + * this version, we're done. If not, then we next check to see + * if the ancestor is active in this version. If so, then there + * can be no possible wildcard match and again we're done. If not, + * continue the search. + */ + + rbtdb = search->rbtdb; + i = search->chain.level_matches; + done = ISC_FALSE; + node = *nodep; + do { + NODE_LOCK(&(rbtdb->node_locks[node->locknum].lock), + isc_rwlocktype_read); + + /* + * First we try to figure out if this node is active in + * the search's version. We do this now, even though we + * may not need the information, because it simplifies the + * locking and code flow. + */ + for (header = node->data; + header != NULL; + header = header->next) { + if (header->serial <= search->serial && + !IGNORE(header) && EXISTS(header)) + break; + } + if (header != NULL) + active = ISC_TRUE; + else + active = ISC_FALSE; + + if (node->wild) + wild = ISC_TRUE; + else + wild = ISC_FALSE; + + NODE_UNLOCK(&(rbtdb->node_locks[node->locknum].lock), + isc_rwlocktype_read); + + if (wild) { + /* + * Construct the wildcard name for this level. + */ + dns_name_init(&name, NULL); + dns_rbt_namefromnode(node, &name); + dns_fixedname_init(&fwname); + wname = dns_fixedname_name(&fwname); + result = dns_name_concatenate(dns_wildcardname, &name, + wname, NULL); + j = i; + while (result == ISC_R_SUCCESS && j != 0) { + j--; + level_node = search->chain.levels[j]; + dns_name_init(&name, NULL); + dns_rbt_namefromnode(level_node, &name); + result = dns_name_concatenate(wname, + &name, + wname, + NULL); + } + if (result != ISC_R_SUCCESS) + break; + + wnode = NULL; + dns_rbtnodechain_init(&wchain, NULL); + result = dns_rbt_findnode(rbtdb->tree, wname, + NULL, &wnode, &wchain, + DNS_RBTFIND_EMPTYDATA, + NULL, NULL); + if (result == ISC_R_SUCCESS) { + nodelock_t *lock; + + /* + * We have found the wildcard node. If it + * is active in the search's version, we're + * done. + */ + lock = &rbtdb->node_locks[wnode->locknum].lock; + NODE_LOCK(lock, isc_rwlocktype_read); + for (header = wnode->data; + header != NULL; + header = header->next) { + if (header->serial <= search->serial && + !IGNORE(header) && EXISTS(header)) + break; + } + NODE_UNLOCK(lock, isc_rwlocktype_read); + if (header != NULL || + activeempty(search, &wchain, wname)) { + if (activeemtpynode(search, qname, + wname)) { + return (ISC_R_NOTFOUND); + } + /* + * The wildcard node is active! + * + * Note: result is still ISC_R_SUCCESS + * so we don't have to set it. + */ + *nodep = wnode; + break; + } + } else if (result != ISC_R_NOTFOUND && + result != DNS_R_PARTIALMATCH) { + /* + * An error has occurred. Bail out. + */ + break; + } + } + + if (active) { + /* + * The level node is active. Any wildcarding + * present at higher levels has no + * effect and we're done. + */ + result = ISC_R_NOTFOUND; + break; + } + + if (i > 0) { + i--; + node = search->chain.levels[i]; + } else + done = ISC_TRUE; + } while (!done); + + return (result); } static inline isc_result_t find_closest_nsec(rbtdb_search_t *search, dns_dbnode_t **nodep, - dns_name_t *foundname, dns_rdataset_t *rdataset, - dns_rdataset_t *sigrdataset, isc_boolean_t need_sig) + dns_name_t *foundname, dns_rdataset_t *rdataset, + dns_rdataset_t *sigrdataset, isc_boolean_t need_sig) { - dns_rbtnode_t *node; - rdatasetheader_t *header, *header_next, *found, *foundsig; - isc_boolean_t empty_node; - isc_result_t result; - dns_fixedname_t fname, forigin; - dns_name_t *name, *origin; - - do { - node = NULL; - dns_fixedname_init(&fname); - name = dns_fixedname_name(&fname); - dns_fixedname_init(&forigin); - origin = dns_fixedname_name(&forigin); - result = dns_rbtnodechain_current(&search->chain, name, - origin, &node); - if (result != ISC_R_SUCCESS) - return (result); - NODE_LOCK(&(search->rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); - found = NULL; - foundsig = NULL; - empty_node = ISC_TRUE; - for (header = node->data; - header != NULL; - header = header_next) { - header_next = header->next; - /* - * Look for an active, extant NSEC or RRSIG NSEC. - */ - do { - if (header->serial <= search->serial && - !IGNORE(header)) { - /* - * Is this a "this rdataset doesn't - * exist" record? - */ - if (NONEXISTENT(header)) - header = NULL; - break; - } else - header = header->down; - } while (header != NULL); - if (header != NULL) { - /* - * We now know that there is at least one - * active rdataset at this node. - */ - empty_node = ISC_FALSE; - if (header->type == dns_rdatatype_nsec) { - found = header; - if (foundsig != NULL) - break; - } else if (header->type == - RBTDB_RDATATYPE_SIGNSEC) { - foundsig = header; - if (found != NULL) - break; - } - } - } - if (!empty_node) { - if (found != NULL && - (foundsig != NULL || !need_sig)) - { - /* - * We've found the right NSEC record. - * - * Note: for this to really be the right - * NSEC record, it's essential that the NSEC - * records of any nodes obscured by a zone - * cut have been removed; we assume this is - * the case. - */ - result = dns_name_concatenate(name, origin, - foundname, NULL); - if (result == ISC_R_SUCCESS) { - if (nodep != NULL) { - new_reference(search->rbtdb, - node); - *nodep = node; - } - bind_rdataset(search->rbtdb, node, - found, search->now, - rdataset); - if (foundsig != NULL) - bind_rdataset(search->rbtdb, - node, - foundsig, - search->now, - sigrdataset); - } - } else if (found == NULL && foundsig == NULL) { - /* - * This node is active, but has no NSEC or - * RRSIG NSEC. That means it's glue or - * other obscured zone data that isn't - * relevant for our search. Treat the - * node as if it were empty and keep looking. - */ - empty_node = ISC_TRUE; - result = dns_rbtnodechain_prev(&search->chain, - NULL, NULL); - } else { - /* - * We found an active node, but either the - * NSEC or the RRSIG NSEC is missing. This - * shouldn't happen. - */ - result = DNS_R_BADDB; - } - } else { - /* - * This node isn't active. We've got to keep - * looking. - */ - result = dns_rbtnodechain_prev(&search->chain, NULL, - NULL); - } - NODE_UNLOCK(&(search->rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); - } while (empty_node && result == ISC_R_SUCCESS); - - /* - * If the result is ISC_R_NOMORE, then we got to the beginning of - * the database and didn't find a NSEC record. This shouldn't - * happen. - */ - if (result == ISC_R_NOMORE) - result = DNS_R_BADDB; - - return (result); + dns_rbtnode_t *node; + rdatasetheader_t *header, *header_next, *found, *foundsig; + isc_boolean_t empty_node; + isc_result_t result; + dns_fixedname_t fname, forigin; + dns_name_t *name, *origin; + + do { + node = NULL; + dns_fixedname_init(&fname); + name = dns_fixedname_name(&fname); + dns_fixedname_init(&forigin); + origin = dns_fixedname_name(&forigin); + result = dns_rbtnodechain_current(&search->chain, name, + origin, &node); + if (result != ISC_R_SUCCESS) + return (result); + NODE_LOCK(&(search->rbtdb->node_locks[node->locknum].lock), + isc_rwlocktype_read); + found = NULL; + foundsig = NULL; + empty_node = ISC_TRUE; + for (header = node->data; + header != NULL; + header = header_next) { + header_next = header->next; + /* + * Look for an active, extant NSEC or RRSIG NSEC. + */ + do { + if (header->serial <= search->serial && + !IGNORE(header)) { + /* + * Is this a "this rdataset doesn't + * exist" record? + */ + if (NONEXISTENT(header)) + header = NULL; + break; + } else + header = header->down; + } while (header != NULL); + if (header != NULL) { + /* + * We now know that there is at least one + * active rdataset at this node. + */ + empty_node = ISC_FALSE; + if (header->type == dns_rdatatype_nsec) { + found = header; + if (foundsig != NULL) + break; + } else if (header->type == + RBTDB_RDATATYPE_SIGNSEC) { + foundsig = header; + if (found != NULL) + break; + } + } + } + if (!empty_node) { + if (found != NULL && + (foundsig != NULL || !need_sig)) + { + /* + * We've found the right NSEC record. + * + * Note: for this to really be the right + * NSEC record, it's essential that the NSEC + * records of any nodes obscured by a zone + * cut have been removed; we assume this is + * the case. + */ + result = dns_name_concatenate(name, origin, + foundname, NULL); + if (result == ISC_R_SUCCESS) { + if (nodep != NULL) { + new_reference(search->rbtdb, + node); + *nodep = node; + } + bind_rdataset(search->rbtdb, node, + found, search->now, + rdataset); + if (foundsig != NULL) + bind_rdataset(search->rbtdb, + node, + foundsig, + search->now, + sigrdataset); + } + } else if (found == NULL && foundsig == NULL) { + /* + * This node is active, but has no NSEC or + * RRSIG NSEC. That means it's glue or + * other obscured zone data that isn't + * relevant for our search. Treat the + * node as if it were empty and keep looking. + */ + empty_node = ISC_TRUE; + result = dns_rbtnodechain_prev(&search->chain, + NULL, NULL); + } else { + /* + * We found an active node, but either the + * NSEC or the RRSIG NSEC is missing. This + * shouldn't happen. + */ + result = DNS_R_BADDB; + } + } else { + /* + * This node isn't active. We've got to keep + * looking. + */ + result = dns_rbtnodechain_prev(&search->chain, NULL, + NULL); + } + NODE_UNLOCK(&(search->rbtdb->node_locks[node->locknum].lock), + isc_rwlocktype_read); + } while (empty_node && result == ISC_R_SUCCESS); + + /* + * If the result is ISC_R_NOMORE, then we got to the beginning of + * the database and didn't find a NSEC record. This shouldn't + * happen. + */ + if (result == ISC_R_NOMORE) + result = DNS_R_BADDB; + + return (result); } static isc_result_t zone_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, - dns_rdatatype_t type, unsigned int options, isc_stdtime_t now, - dns_dbnode_t **nodep, dns_name_t *foundname, - dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset) + dns_rdatatype_t type, unsigned int options, isc_stdtime_t now, + dns_dbnode_t **nodep, dns_name_t *foundname, + dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset) { - dns_rbtnode_t *node = NULL; - isc_result_t result; - rbtdb_search_t search; - isc_boolean_t cname_ok = ISC_TRUE; - isc_boolean_t close_version = ISC_FALSE; - isc_boolean_t maybe_zonecut = ISC_FALSE; - isc_boolean_t at_zonecut = ISC_FALSE; - isc_boolean_t wild; - isc_boolean_t empty_node; - rdatasetheader_t *header, *header_next, *found, *nsecheader; - rdatasetheader_t *foundsig, *cnamesig, *nsecsig; - rbtdb_rdatatype_t sigtype; - isc_boolean_t active; - dns_rbtnodechain_t chain; - nodelock_t *lock; - - - search.rbtdb = (dns_rbtdb_t *)db; - - REQUIRE(VALID_RBTDB(search.rbtdb)); - - /* - * We don't care about 'now'. - */ - UNUSED(now); - - /* - * If the caller didn't supply a version, attach to the current - * version. - */ - if (version == NULL) { - currentversion(db, &version); - close_version = ISC_TRUE; - } - - search.rbtversion = version; - search.serial = search.rbtversion->serial; - search.options = options; - search.copy_name = ISC_FALSE; - search.need_cleanup = ISC_FALSE; - search.wild = ISC_FALSE; - search.zonecut = NULL; - dns_fixedname_init(&search.zonecut_name); - dns_rbtnodechain_init(&search.chain, search.rbtdb->common.mctx); - search.now = 0; - - /* - * 'wild' will be true iff. we've matched a wildcard. - */ - wild = ISC_FALSE; - - RWLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read); - - /* - * Search down from the root of the tree. If, while going down, we - * encounter a callback node, zone_zonecut_callback() will search the - * rdatasets at the zone cut for active DNAME or NS rdatasets. - */ - result = dns_rbt_findnode(search.rbtdb->tree, name, foundname, &node, - &search.chain, DNS_RBTFIND_EMPTYDATA, - zone_zonecut_callback, &search); - - if (result == DNS_R_PARTIALMATCH) { - partial_match: - if (search.zonecut != NULL) { - result = setup_delegation(&search, nodep, foundname, - rdataset, sigrdataset); - goto tree_exit; - } - - if (search.wild) { - /* - * At least one of the levels in the search chain - * potentially has a wildcard. For each such level, - * we must see if there's a matching wildcard active - * in the current version. - */ - result = find_wildcard(&search, &node, name); - if (result == ISC_R_SUCCESS) { - result = dns_name_copy(name, foundname, NULL); - if (result != ISC_R_SUCCESS) - goto tree_exit; - wild = ISC_TRUE; - goto found; - } - else if (result != ISC_R_NOTFOUND) - goto tree_exit; - } - - chain = search.chain; - active = activeempty(&search, &chain, name); - - /* - * If we're here, then the name does not exist, is not - * beneath a zonecut, and there's no matching wildcard. - */ - if (search.rbtdb->secure || - (search.options & DNS_DBFIND_FORCENSEC) != 0) - { - result = find_closest_nsec(&search, nodep, foundname, - rdataset, sigrdataset, - search.rbtdb->secure); - if (result == ISC_R_SUCCESS) - result = active ? DNS_R_EMPTYNAME : - DNS_R_NXDOMAIN; - } else - result = active ? DNS_R_EMPTYNAME : DNS_R_NXDOMAIN; - goto tree_exit; - } else if (result != ISC_R_SUCCESS) - goto tree_exit; + dns_rbtnode_t *node = NULL; + isc_result_t result; + rbtdb_search_t search; + isc_boolean_t cname_ok = ISC_TRUE; + isc_boolean_t close_version = ISC_FALSE; + isc_boolean_t maybe_zonecut = ISC_FALSE; + isc_boolean_t at_zonecut = ISC_FALSE; + isc_boolean_t wild; + isc_boolean_t empty_node; + rdatasetheader_t *header, *header_next, *found, *nsecheader; + rdatasetheader_t *foundsig, *cnamesig, *nsecsig; + rbtdb_rdatatype_t sigtype; + isc_boolean_t active; + dns_rbtnodechain_t chain; + nodelock_t *lock; + + + search.rbtdb = (dns_rbtdb_t *)db; + + REQUIRE(VALID_RBTDB(search.rbtdb)); + + /* + * We don't care about 'now'. + */ + UNUSED(now); + + /* + * If the caller didn't supply a version, attach to the current + * version. + */ + if (version == NULL) { + currentversion(db, &version); + close_version = ISC_TRUE; + } + + search.rbtversion = version; + search.serial = search.rbtversion->serial; + search.options = options; + search.copy_name = ISC_FALSE; + search.need_cleanup = ISC_FALSE; + search.wild = ISC_FALSE; + search.zonecut = NULL; + dns_fixedname_init(&search.zonecut_name); + dns_rbtnodechain_init(&search.chain, search.rbtdb->common.mctx); + search.now = 0; + + /* + * 'wild' will be true iff. we've matched a wildcard. + */ + wild = ISC_FALSE; + + RWLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read); + + /* + * Search down from the root of the tree. If, while going down, we + * encounter a callback node, zone_zonecut_callback() will search the + * rdatasets at the zone cut for active DNAME or NS rdatasets. + */ + result = dns_rbt_findnode(search.rbtdb->tree, name, foundname, &node, + &search.chain, DNS_RBTFIND_EMPTYDATA, + zone_zonecut_callback, &search); + + if (result == DNS_R_PARTIALMATCH) { + partial_match: + if (search.zonecut != NULL) { + result = setup_delegation(&search, nodep, foundname, + rdataset, sigrdataset); + goto tree_exit; + } + + if (search.wild) { + /* + * At least one of the levels in the search chain + * potentially has a wildcard. For each such level, + * we must see if there's a matching wildcard active + * in the current version. + */ + result = find_wildcard(&search, &node, name); + if (result == ISC_R_SUCCESS) { + result = dns_name_copy(name, foundname, NULL); + if (result != ISC_R_SUCCESS) + goto tree_exit; + wild = ISC_TRUE; + goto found; + } + else if (result != ISC_R_NOTFOUND) + goto tree_exit; + } + + chain = search.chain; + active = activeempty(&search, &chain, name); + + /* + * If we're here, then the name does not exist, is not + * beneath a zonecut, and there's no matching wildcard. + */ + if (search.rbtdb->secure || + (search.options & DNS_DBFIND_FORCENSEC) != 0) + { + result = find_closest_nsec(&search, nodep, foundname, + rdataset, sigrdataset, + search.rbtdb->secure); + if (result == ISC_R_SUCCESS) + result = active ? DNS_R_EMPTYNAME : + DNS_R_NXDOMAIN; + } else + result = active ? DNS_R_EMPTYNAME : DNS_R_NXDOMAIN; + goto tree_exit; + } else if (result != ISC_R_SUCCESS) + goto tree_exit; found: - /* - * We have found a node whose name is the desired name, or we - * have matched a wildcard. - */ - - if (search.zonecut != NULL) { - /* - * If we're beneath a zone cut, we don't want to look for - * CNAMEs because they're not legitimate zone glue. - */ - cname_ok = ISC_FALSE; - } else { - /* - * The node may be a zone cut itself. If it might be one, - * make sure we check for it later. - */ - if (node->find_callback && - (node != search.rbtdb->origin_node || - IS_STUB(search.rbtdb)) && - !dns_rdatatype_atparent(type)) - maybe_zonecut = ISC_TRUE; - } - - /* - * Certain DNSSEC types are not subject to CNAME matching - * (RFC4035, section 2.5 and RFC3007). - * - * We don't check for RRSIG, because we don't store RRSIG records - * directly. - */ - if (type == dns_rdatatype_key || type == dns_rdatatype_nsec) - cname_ok = ISC_FALSE; - - /* - * We now go looking for rdata... - */ - - NODE_LOCK(&(search.rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); - - found = NULL; - foundsig = NULL; - sigtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, type); - nsecheader = NULL; - nsecsig = NULL; - cnamesig = NULL; - empty_node = ISC_TRUE; - for (header = node->data; header != NULL; header = header_next) { - header_next = header->next; - /* - * Look for an active, extant rdataset. - */ - do { - if (header->serial <= search.serial && - !IGNORE(header)) { - /* - * Is this a "this rdataset doesn't - * exist" record? - */ - if (NONEXISTENT(header)) - header = NULL; - break; - } else - header = header->down; - } while (header != NULL); - if (header != NULL) { - /* - * We now know that there is at least one active - * rdataset at this node. - */ - empty_node = ISC_FALSE; - - /* - * Do special zone cut handling, if requested. - */ - if (maybe_zonecut && - header->type == dns_rdatatype_ns) { - /* - * We increment the reference count on node to - * ensure that search->zonecut_rdataset will - * still be valid later. - */ - new_reference(search.rbtdb, node); - search.zonecut = node; - search.zonecut_rdataset = header; - search.zonecut_sigrdataset = NULL; - search.need_cleanup = ISC_TRUE; - maybe_zonecut = ISC_FALSE; - at_zonecut = ISC_TRUE; - /* - * It is not clear if KEY should still be - * allowed at the parent side of the zone - * cut or not. It is needed for RFC3007 - * validated updates. - */ - if ((search.options & DNS_DBFIND_GLUEOK) == 0 - && type != dns_rdatatype_nsec - && type != dns_rdatatype_key) { - /* - * Glue is not OK, but any answer we - * could return would be glue. Return - * the delegation. - */ - found = NULL; - break; - } - if (found != NULL && foundsig != NULL) - break; - } - - /* - * If we found a type we were looking for, - * remember it. - */ - if (header->type == type || - type == dns_rdatatype_any || - (header->type == dns_rdatatype_cname && - cname_ok)) { - /* - * We've found the answer! - */ - found = header; - if (header->type == dns_rdatatype_cname && - cname_ok) { - /* - * We may be finding a CNAME instead - * of the desired type. - * - * If we've already got the CNAME RRSIG, - * use it, otherwise change sigtype - * so that we find it. - */ - if (cnamesig != NULL) - foundsig = cnamesig; - else - sigtype = - RBTDB_RDATATYPE_SIGCNAME; - } - /* - * If we've got all we need, end the search. - */ - if (!maybe_zonecut && foundsig != NULL) - break; - } else if (header->type == sigtype) { - /* - * We've found the RRSIG rdataset for our - * target type. Remember it. - */ - foundsig = header; - /* - * If we've got all we need, end the search. - */ - if (!maybe_zonecut && found != NULL) - break; - } else if (header->type == dns_rdatatype_nsec) { - /* - * Remember a NSEC rdataset even if we're - * not specifically looking for it, because - * we might need it later. - */ - nsecheader = header; - } else if (header->type == RBTDB_RDATATYPE_SIGNSEC) { - /* - * If we need the NSEC rdataset, we'll also - * need its signature. - */ - nsecsig = header; - } else if (cname_ok && - header->type == RBTDB_RDATATYPE_SIGCNAME) { - /* - * If we get a CNAME match, we'll also need - * its signature. - */ - cnamesig = header; - } - } - } - - if (empty_node) { - /* - * We have an exact match for the name, but there are no - * active rdatasets in the desired version. That means that - * this node doesn't exist in the desired version, and that - * 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; - } - } - - /* - * If we didn't find what we were looking for... - */ - if (found == NULL) { - if (search.zonecut != NULL) { - /* - * We were trying to find glue at a node beneath a - * zone cut, but didn't. - * - * 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); - goto tree_exit; - } - /* - * The desired type doesn't exist. - */ - result = DNS_R_NXRRSET; - if (search.rbtdb->secure && - (nsecheader == NULL || nsecsig == NULL)) { - /* - * The zone is secure but there's no NSEC, - * or the NSEC has no signature! - */ - if (!wild) { - result = DNS_R_BADDB; - 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, - search.rbtdb->secure); - if (result == ISC_R_SUCCESS) - result = DNS_R_EMPTYWILD; - goto tree_exit; - } - if ((search.options & DNS_DBFIND_FORCENSEC) != 0 && - nsecheader == NULL) - { - /* - * There's no NSEC record, and we were told - * to find one. - */ - result = DNS_R_BADDB; - goto node_exit; - } - if (nodep != NULL) { - new_reference(search.rbtdb, node); - *nodep = node; - } - if (search.rbtdb->secure || - (search.options & DNS_DBFIND_FORCENSEC) != 0) - { - bind_rdataset(search.rbtdb, node, nsecheader, - 0, rdataset); - if (nsecsig != NULL) - bind_rdataset(search.rbtdb, node, - nsecsig, 0, sigrdataset); - } - if (wild) - foundname->attributes |= DNS_NAMEATTR_WILDCARD; - goto node_exit; - } - - /* - * We found what we were looking for, or we found a CNAME. - */ - - if (type != found->type && - type != dns_rdatatype_any && - found->type == dns_rdatatype_cname) { - /* - * We weren't doing an ANY query and we found a CNAME instead - * of the type we were looking for, so we need to indicate - * that result to the caller. - */ - result = DNS_R_CNAME; - } else if (search.zonecut != NULL) { - /* - * If we're beneath a zone cut, we must indicate that the - * result is glue, unless we're actually at the zone cut - * and the type is NSEC or KEY. - */ - if (search.zonecut == node) { - /* - * It is not clear if KEY should still be - * allowed at the parent side of the zone - * cut or not. It is needed for RFC3007 - * validated updates. - */ - if (type == dns_rdatatype_nsec || - type == dns_rdatatype_key) - result = ISC_R_SUCCESS; - else if (type == dns_rdatatype_any) - result = DNS_R_ZONECUT; - else - result = DNS_R_GLUE; - } else - result = DNS_R_GLUE; - /* - * We might have found data that isn't glue, but was occluded - * by a dynamic update. If the caller cares about this, they - * will have told us to validate glue. - * - * XXX We should cache the glue validity state! - */ - 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); - goto tree_exit; - } - } else { - /* - * An ordinary successful query! - */ - result = ISC_R_SUCCESS; - } - - if (nodep != NULL) { - if (!at_zonecut) - new_reference(search.rbtdb, node); - else - search.need_cleanup = ISC_FALSE; - *nodep = node; - } - - if (type != dns_rdatatype_any) { - bind_rdataset(search.rbtdb, node, found, 0, rdataset); - if (foundsig != NULL) - bind_rdataset(search.rbtdb, node, foundsig, 0, - sigrdataset); - } - - if (wild) - foundname->attributes |= DNS_NAMEATTR_WILDCARD; + /* + * We have found a node whose name is the desired name, or we + * have matched a wildcard. + */ + + if (search.zonecut != NULL) { + /* + * If we're beneath a zone cut, we don't want to look for + * CNAMEs because they're not legitimate zone glue. + */ + cname_ok = ISC_FALSE; + } else { + /* + * The node may be a zone cut itself. If it might be one, + * make sure we check for it later. + */ + if (node->find_callback && + (node != search.rbtdb->origin_node || + IS_STUB(search.rbtdb)) && + !dns_rdatatype_atparent(type)) + maybe_zonecut = ISC_TRUE; + } + + /* + * Certain DNSSEC types are not subject to CNAME matching + * (RFC4035, section 2.5 and RFC3007). + * + * We don't check for RRSIG, because we don't store RRSIG records + * directly. + */ + if (type == dns_rdatatype_key || type == dns_rdatatype_nsec) + cname_ok = ISC_FALSE; + + /* + * We now go looking for rdata... + */ + + NODE_LOCK(&(search.rbtdb->node_locks[node->locknum].lock), + isc_rwlocktype_read); + + found = NULL; + foundsig = NULL; + sigtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, type); + nsecheader = NULL; + nsecsig = NULL; + cnamesig = NULL; + empty_node = ISC_TRUE; + for (header = node->data; header != NULL; header = header_next) { + header_next = header->next; + /* + * Look for an active, extant rdataset. + */ + do { + if (header->serial <= search.serial && + !IGNORE(header)) { + /* + * Is this a "this rdataset doesn't + * exist" record? + */ + if (NONEXISTENT(header)) + header = NULL; + break; + } else + header = header->down; + } while (header != NULL); + if (header != NULL) { + /* + * We now know that there is at least one active + * rdataset at this node. + */ + empty_node = ISC_FALSE; + + /* + * Do special zone cut handling, if requested. + */ + if (maybe_zonecut && + header->type == dns_rdatatype_ns) { + /* + * We increment the reference count on node to + * ensure that search->zonecut_rdataset will + * still be valid later. + */ + new_reference(search.rbtdb, node); + search.zonecut = node; + search.zonecut_rdataset = header; + search.zonecut_sigrdataset = NULL; + search.need_cleanup = ISC_TRUE; + maybe_zonecut = ISC_FALSE; + at_zonecut = ISC_TRUE; + /* + * It is not clear if KEY should still be + * allowed at the parent side of the zone + * cut or not. It is needed for RFC3007 + * validated updates. + */ + if ((search.options & DNS_DBFIND_GLUEOK) == 0 + && type != dns_rdatatype_nsec + && type != dns_rdatatype_key) { + /* + * Glue is not OK, but any answer we + * could return would be glue. Return + * the delegation. + */ + found = NULL; + break; + } + if (found != NULL && foundsig != NULL) + break; + } + + /* + * If we found a type we were looking for, + * remember it. + */ + if (header->type == type || + type == dns_rdatatype_any || + (header->type == dns_rdatatype_cname && + cname_ok)) { + /* + * We've found the answer! + */ + found = header; + if (header->type == dns_rdatatype_cname && + cname_ok) { + /* + * We may be finding a CNAME instead + * of the desired type. + * + * If we've already got the CNAME RRSIG, + * use it, otherwise change sigtype + * so that we find it. + */ + if (cnamesig != NULL) + foundsig = cnamesig; + else + sigtype = + RBTDB_RDATATYPE_SIGCNAME; + } + /* + * If we've got all we need, end the search. + */ + if (!maybe_zonecut && foundsig != NULL) + break; + } else if (header->type == sigtype) { + /* + * We've found the RRSIG rdataset for our + * target type. Remember it. + */ + foundsig = header; + /* + * If we've got all we need, end the search. + */ + if (!maybe_zonecut && found != NULL) + break; + } else if (header->type == dns_rdatatype_nsec) { + /* + * Remember a NSEC rdataset even if we're + * not specifically looking for it, because + * we might need it later. + */ + nsecheader = header; + } else if (header->type == RBTDB_RDATATYPE_SIGNSEC) { + /* + * If we need the NSEC rdataset, we'll also + * need its signature. + */ + nsecsig = header; + } else if (cname_ok && + header->type == RBTDB_RDATATYPE_SIGCNAME) { + /* + * If we get a CNAME match, we'll also need + * its signature. + */ + cnamesig = header; + } + } + } + + if (empty_node) { + /* + * We have an exact match for the name, but there are no + * active rdatasets in the desired version. That means that + * this node doesn't exist in the desired version, and that + * 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; + } + } + + /* + * If we didn't find what we were looking for... + */ + if (found == NULL) { + if (search.zonecut != NULL) { + /* + * We were trying to find glue at a node beneath a + * zone cut, but didn't. + * + * 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); + goto tree_exit; + } + /* + * The desired type doesn't exist. + */ + result = DNS_R_NXRRSET; + if (search.rbtdb->secure && + (nsecheader == NULL || nsecsig == NULL)) { + /* + * The zone is secure but there's no NSEC, + * or the NSEC has no signature! + */ + if (!wild) { + result = DNS_R_BADDB; + 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, + search.rbtdb->secure); + if (result == ISC_R_SUCCESS) + result = DNS_R_EMPTYWILD; + goto tree_exit; + } + if ((search.options & DNS_DBFIND_FORCENSEC) != 0 && + nsecheader == NULL) + { + /* + * There's no NSEC record, and we were told + * to find one. + */ + result = DNS_R_BADDB; + goto node_exit; + } + if (nodep != NULL) { + new_reference(search.rbtdb, node); + *nodep = node; + } + if (search.rbtdb->secure || + (search.options & DNS_DBFIND_FORCENSEC) != 0) + { + bind_rdataset(search.rbtdb, node, nsecheader, + 0, rdataset); + if (nsecsig != NULL) + bind_rdataset(search.rbtdb, node, + nsecsig, 0, sigrdataset); + } + if (wild) + foundname->attributes |= DNS_NAMEATTR_WILDCARD; + goto node_exit; + } + + /* + * We found what we were looking for, or we found a CNAME. + */ + + if (type != found->type && + type != dns_rdatatype_any && + found->type == dns_rdatatype_cname) { + /* + * We weren't doing an ANY query and we found a CNAME instead + * of the type we were looking for, so we need to indicate + * that result to the caller. + */ + result = DNS_R_CNAME; + } else if (search.zonecut != NULL) { + /* + * If we're beneath a zone cut, we must indicate that the + * result is glue, unless we're actually at the zone cut + * and the type is NSEC or KEY. + */ + if (search.zonecut == node) { + /* + * It is not clear if KEY should still be + * allowed at the parent side of the zone + * cut or not. It is needed for RFC3007 + * validated updates. + */ + if (type == dns_rdatatype_nsec || + type == dns_rdatatype_key) + result = ISC_R_SUCCESS; + else if (type == dns_rdatatype_any) + result = DNS_R_ZONECUT; + else + result = DNS_R_GLUE; + } else + result = DNS_R_GLUE; + /* + * We might have found data that isn't glue, but was occluded + * by a dynamic update. If the caller cares about this, they + * will have told us to validate glue. + * + * XXX We should cache the glue validity state! + */ + 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); + goto tree_exit; + } + } else { + /* + * An ordinary successful query! + */ + result = ISC_R_SUCCESS; + } + + if (nodep != NULL) { + if (!at_zonecut) + new_reference(search.rbtdb, node); + else + search.need_cleanup = ISC_FALSE; + *nodep = node; + } + + if (type != dns_rdatatype_any) { + bind_rdataset(search.rbtdb, node, found, 0, rdataset); + if (foundsig != NULL) + bind_rdataset(search.rbtdb, node, foundsig, 0, + sigrdataset); + } + + if (wild) + foundname->attributes |= DNS_NAMEATTR_WILDCARD; node_exit: - NODE_UNLOCK(&(search.rbtdb->node_locks[node->locknum].lock), - isc_rwlocktype_read); + NODE_UNLOCK(&(search.rbtdb->node_locks[node->locknum].lock), + isc_rwlocktype_read); tree_exit: - RWUNLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read); + RWUNLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read); - /* - * If we found a zonecut but aren't going to use it, we have to - * let go of it. - */ - if (search.need_cleanup) { - node = search.zonecut; - lock = &(search.rbtdb->node_locks[node->locknum].lock); + /* + * If we found a zonecut but aren't going to use it, we have to + * let go of it. + */ + if (search.need_cleanup) { + node = search.zonecut; + lock = &(search.rbtdb->node_locks[node->locknum].lock); - NODE_LOCK(lock, isc_rwlocktype_read); - decrement_reference(search.rbtdb, node, 0, - isc_rwlocktype_read, isc_rwlocktype_none); - NODE_UNLOCK(lock, isc_rwlocktype_read); - } + NODE_LOCK(lock, isc_rwlocktype_read); + decrement_reference(search.rbtdb, node, 0, + isc_rwlocktype_read, isc_rwlocktype_none); + NODE_UNLOCK(lock, isc_rwlocktype_read); + } - if (close_version) - closeversion(db, &version, ISC_FALSE); + if (close_version) + closeversion(db, &version, ISC_FALSE); - dns_rbtnodechain_reset(&search.chain); + dns_rbtnodechain_reset(&search.chain); - return (result); + return (result); } static isc_result_t zone_findzonecut(dns_db_t *db, dns_name_t *name, unsigned int options, - isc_stdtime_t now, dns_dbnode_t **nodep, - dns_name_t *foundname, - dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset) + isc_stdtime_t now, dns_dbnode_t **nodep, + dns_name_t *foundname, + dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset) { - UNUSED(db); - UNUSED(name); - UNUSED(options); - UNUSED(now); - UNUSED(nodep); - UNUSED(foundname); - UNUSED(rdataset); - UNUSED(sigrdataset); - - FATAL_ERROR(__FILE__, __LINE__, "zone_findzonecut() called!"); - - return (ISC_R_NOTIMPLEMENTED); + UNUSED(db); + UNUSED(name); + UNUSED(options); + UNUSED(now); + UNUSED(nodep); + UNUSED(foundname); + UNUSED(rdataset); + UNUSED(sigrdataset); + + FATAL_ERROR(__FILE__, __LINE__, "zone_findzonecut() called!"); + + return (ISC_R_NOTIMPLEMENTED); } static isc_result_t cache_zonecut_callback(dns_rbtnode_t *node, dns_name_t *name, void *arg) { - rbtdb_search_t *search = arg; - rdatasetheader_t *header, *header_prev, *header_next; - rdatasetheader_t *dname_header, *sigdname_header; - isc_result_t result; - nodelock_t *lock; - isc_rwlocktype_t locktype; - - /* XXX comment */ - - REQUIRE(search->zonecut == NULL); - - /* - * Keep compiler silent. - */ - UNUSED(name); - - lock = &(search->rbtdb->node_locks[node->locknum].lock); - locktype = isc_rwlocktype_read; - NODE_LOCK(lock, locktype); - - /* - * Look for a DNAME or RRSIG DNAME rdataset. - */ - dname_header = NULL; - sigdname_header = NULL; - header_prev = NULL; - for (header = node->data; header != NULL; header = header_next) { - header_next = header->next; - if (header->rdh_ttl <= search->now) { - /* - * This rdataset is stale. If no one else is - * using the node, we can clean it up right - * now, otherwise we mark it as stale, and - * the node as dirty, so it will get cleaned - * up later. - */ - if ((header->rdh_ttl <= search->now - RBTDB_VIRTUAL) && - (locktype == isc_rwlocktype_write || - NODE_TRYUPGRADE(lock) == ISC_R_SUCCESS)) { - /* - * We update the node's status only when we - * can get write access; otherwise, we leave - * others to this work. Periodical cleaning - * will eventually take the job as the last - * resort. - * We won't downgrade the lock, since other - * rdatasets are probably stale, too. - */ - locktype = isc_rwlocktype_write; - - if (dns_rbtnode_refcurrent(node) == 0) { - isc_mem_t *mctx; - - /* - * header->down can be non-NULL if the - * refcount has just decremented to 0 - * but decrement_reference() has not - * performed clean_cache_node(), in - * which case we need to purge the - * stale headers first. - */ - mctx = search->rbtdb->common.mctx; - clean_stale_headers(search->rbtdb, - mctx, - header); - if (header_prev != NULL) - header_prev->next = - header->next; - else - node->data = header->next; - free_rdataset(search->rbtdb, mctx, - header); - } else { - header->attributes |= - RDATASET_ATTR_STALE; - node->dirty = 1; - header_prev = header; - } - } else - header_prev = header; - } else if (header->type == dns_rdatatype_dname && - EXISTS(header)) { - dname_header = header; - header_prev = header; - } else if (header->type == RBTDB_RDATATYPE_SIGDNAME && - EXISTS(header)) { - sigdname_header = header; - header_prev = header; - } else - header_prev = header; - } - - if (dname_header != NULL && - (dname_header->trust != dns_trust_pending || - (search->options & DNS_DBFIND_PENDINGOK) != 0)) { - /* - * We increment the reference count on node to ensure that - * search->zonecut_rdataset will still be valid later. - */ - new_reference(search->rbtdb, node); - search->zonecut = node; - search->zonecut_rdataset = dname_header; - search->zonecut_sigrdataset = sigdname_header; - search->need_cleanup = ISC_TRUE; - result = DNS_R_PARTIALMATCH; - } else - result = DNS_R_CONTINUE; - - NODE_UNLOCK(lock, locktype); - - return (result); + rbtdb_search_t *search = arg; + rdatasetheader_t *header, *header_prev, *header_next; + rdatasetheader_t *dname_header, *sigdname_header; + isc_result_t result; + nodelock_t *lock; + isc_rwlocktype_t locktype; + + /* XXX comment */ + + REQUIRE(search->zonecut == NULL); + + /* + * Keep compiler silent. + */ + UNUSED(name); + + lock = &(search->rbtdb->node_locks[node->locknum].lock); + locktype = isc_rwlocktype_read; + NODE_LOCK(lock, locktype); + + /* + * Look for a DNAME or RRSIG DNAME rdataset. + */ + dname_header = NULL; + sigdname_header = NULL; + header_prev = NULL; + for (header = node->data; header != NULL; header = header_next) { + header_next = header->next; + if (header->rdh_ttl <= search->now) { + /* + * This rdataset is stale. If no one else is + * using the node, we can clean it up right + * now, otherwise we mark it as stale, and + * the node as dirty, so it will get cleaned + * up later. + */ + if ((header->rdh_ttl <= search->now - RBTDB_VIRTUAL) && + (locktype == isc_rwlocktype_write || + NODE_TRYUPGRADE(lock) == ISC_R_SUCCESS)) { + /* + * We update the node's status only when we + * can get write access; otherwise, we leave + * others to this work. Periodical cleaning + * will eventually take the job as the last + * resort. + * We won't downgrade the lock, since other + * rdatasets are probably stale, too. + */ + locktype = isc_rwlocktype_write; + + if (dns_rbtnode_refcurrent(node) == 0) { + isc_mem_t *mctx; + + /* + * header->down can be non-NULL if the + * refcount has just decremented to 0 + * but decrement_reference() has not + * performed clean_cache_node(), in + * which case we need to purge the + * stale headers first. + */ + mctx = search->rbtdb->common.mctx; + clean_stale_headers(search->rbtdb, + mctx, + header); + if (header_prev != NULL) + header_prev->next = + header->next; + else + node->data = header->next; + free_rdataset(search->rbtdb, mctx, + header); + } else { + header->attributes |= + RDATASET_ATTR_STALE; + node->dirty = 1; + header_prev = header; + } + } else + header_prev = header; + } else if (header->type == dns_rdatatype_dname && + EXISTS(header)) { + dname_header = header; + header_prev = header; + } else if (header->type == RBTDB_RDATATYPE_SIGDNAME && + EXISTS(header)) { + sigdname_header = header; + header_prev = header; + } else + header_prev = header; + } + + if (dname_header != NULL && + (dname_header->trust != dns_trust_pending || + (search->options & DNS_DBFIND_PENDINGOK) != 0)) { + /* + * We increment the reference count on node to ensure that + * search->zonecut_rdataset will still be valid later. + */ + new_reference(search->rbtdb, node); + search->zonecut = node; + search->zonecut_rdataset = dname_header; + search->zonecut_sigrdataset = sigdname_header; + search->need_cleanup = ISC_TRUE; + result = DNS_R_PARTIALMATCH; + } else + result = DNS_R_CONTINUE; + + NODE_UNLOCK(lock, locktype); + + return (result); } static inline isc_result_t find_deepest_zonecut(rbtdb_search_t *search, dns_rbtnode_t *node, - dns_dbnode_t **nodep, dns_name_t *foundname, - dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset) + dns_dbnode_t **nodep, dns_name_t *foundname, + dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset) { - unsigned int i; - dns_rbtnode_t *level_node; - rdatasetheader_t *header, *header_prev, *header_next; - rdatasetheader_t *found, *foundsig; - isc_result_t result = ISC_R_NOTFOUND; - dns_name_t name; - dns_rbtdb_t *rbtdb; - isc_boolean_t done; - nodelock_t *lock; - isc_rwlocktype_t locktype; - - /* - * Caller must be holding the tree lock. - */ - - rbtdb = search->rbtdb; - i = search->chain.level_matches; - done = ISC_FALSE; - do { - locktype = isc_rwlocktype_read; - lock = &rbtdb->node_locks[node->locknum].lock; - NODE_LOCK(lock, locktype); - - /* - * Look for NS and RRSIG NS rdatasets. - */ - found = NULL; - foundsig = NULL; - header_prev = NULL; - for (header = node->data; - header != NULL; - header = header_next) { - header_next = header->next; - if (header->rdh_ttl <= search->now) { - /* - * This rdataset is stale. If no one else is - * using the node, we can clean it up right - * now, otherwise we mark it as stale, and - * the node as dirty, so it will get cleaned - * up later. - */ - if ((header->rdh_ttl <= search->now - - RBTDB_VIRTUAL) && - (locktype == isc_rwlocktype_write || - NODE_TRYUPGRADE(lock) == ISC_R_SUCCESS)) { - /* - * We update the node's status only - * when we can get write access. - */ - locktype = isc_rwlocktype_write; - - if (dns_rbtnode_refcurrent(node) - == 0) { - isc_mem_t *m; - - m = search->rbtdb->common.mctx; - clean_stale_headers( - search->rbtdb, - m, header); - if (header_prev != NULL) - header_prev->next = - header->next; - else - node->data = - header->next; - free_rdataset(rbtdb, m, - header); - } else { - header->attributes |= - RDATASET_ATTR_STALE; - node->dirty = 1; - header_prev = header; - } - } else - header_prev = header; - } else if (EXISTS(header)) { - /* - * We've found an extant rdataset. See if - * we're interested in it. - */ - if (header->type == dns_rdatatype_ns) { - found = header; - if (foundsig != NULL) - break; - } else if (header->type == - RBTDB_RDATATYPE_SIGNS) { - foundsig = header; - if (found != NULL) - break; - } - header_prev = header; - } else - header_prev = header; - } - - if (found != NULL) { - /* - * If we have to set foundname, we do it before - * anything else. If we were to set foundname after - * we had set nodep or bound the rdataset, then we'd - * have to undo that work if dns_name_concatenate() - * failed. By setting foundname first, there's - * nothing to undo if we have trouble. - */ - if (foundname != NULL) { - dns_name_init(&name, NULL); - dns_rbt_namefromnode(node, &name); - result = dns_name_copy(&name, foundname, NULL); - while (result == ISC_R_SUCCESS && i > 0) { - i--; - level_node = search->chain.levels[i]; - dns_name_init(&name, NULL); - dns_rbt_namefromnode(level_node, - &name); - result = - dns_name_concatenate(foundname, - &name, - foundname, - NULL); - } - if (result != ISC_R_SUCCESS) { - *nodep = NULL; - goto node_exit; - } - } - result = DNS_R_DELEGATION; - if (nodep != NULL) { - new_reference(search->rbtdb, node); - *nodep = node; - } - bind_rdataset(search->rbtdb, node, found, search->now, - rdataset); - if (foundsig != NULL) - bind_rdataset(search->rbtdb, node, foundsig, - search->now, sigrdataset); - if (need_headerupdate(found, search->now) || - (foundsig != NULL && - need_headerupdate(foundsig, search->now))) { - if (locktype != isc_rwlocktype_write) { - NODE_UNLOCK(lock, locktype); - NODE_LOCK(lock, isc_rwlocktype_write); - locktype = isc_rwlocktype_write; - } - if (need_headerupdate(found, search->now)) - update_header(search->rbtdb, found, - search->now); - if (foundsig != NULL && - need_headerupdate(foundsig, search->now)) { - update_header(search->rbtdb, foundsig, - search->now); - } - } - } - - node_exit: - NODE_UNLOCK(lock, locktype); - - if (found == NULL && i > 0) { - i--; - node = search->chain.levels[i]; - } else - done = ISC_TRUE; - - } while (!done); - - return (result); + unsigned int i; + dns_rbtnode_t *level_node; + rdatasetheader_t *header, *header_prev, *header_next; + rdatasetheader_t *found, *foundsig; + isc_result_t result = ISC_R_NOTFOUND; + dns_name_t name; + dns_rbtdb_t *rbtdb; + isc_boolean_t done; + nodelock_t *lock; + isc_rwlocktype_t locktype; + + /* + * Caller must be holding the tree lock. + */ + + rbtdb = search->rbtdb; + i = search->chain.level_matches; + done = ISC_FALSE; + do { + locktype = isc_rwlocktype_read; + lock = &rbtdb->node_locks[node->locknum].lock; + NODE_LOCK(lock, locktype); + + /* + * Look for NS and RRSIG NS rdatasets. + */ + found = NULL; + foundsig = NULL; + header_prev = NULL; + for (header = node->data; + header != NULL; + header = header_next) { + header_next = header->next; + if (header->rdh_ttl <= search->now) { + /* + * This rdataset is stale. If no one else is + * using the node, we can clean it up right + * now, otherwise we mark it as stale, and + * the node as dirty, so it will get cleaned + * up later. + */ + if ((header->rdh_ttl <= search->now - + RBTDB_VIRTUAL) && + (locktype == isc_rwlocktype_write || + NODE_TRYUPGRADE(lock) == ISC_R_SUCCESS)) { + /* + * We update the node's status only + * when we can get write access. + */ + locktype = isc_rwlocktype_write; + + if (dns_rbtnode_refcurrent(node) + == 0) { + isc_mem_t *m; + + m = search->rbtdb->common.mctx; + clean_stale_headers( + search->rbtdb, + m, header); + if (header_prev != NULL) + header_prev->next = + header->next; + else + node->data = + header->next; + free_rdataset(rbtdb, m, + header); + } else { + header->attributes |= + RDATASET_ATTR_STALE; + node->dirty = 1; + header_prev = header; + } + } else + header_prev = header; + } else if (EXISTS(header)) { + /* + * We've found an extant rdataset. See if + * we're interested in it. + */ + if (header->type == dns_rdatatype_ns) { + found = header; + if (foundsig != NULL) + break; + } else if (header->type == + RBTDB_RDATATYPE_SIGNS) { + foundsig = header; + if (found != NULL) + break; + } + header_prev = header; + } else + header_prev = header; + } + + if (found != NULL) { + /* + * If we have to set foundname, we do it before + * anything else. If we were to set foundname after + * we had set nodep or bound the rdataset, then we'd + * have to undo that work if dns_name_concatenate() + * failed. By setting foundname first, there's + * nothing to undo if we have trouble. + */ + if (foundname != NULL) { + dns_name_init(&name, NULL); + dns_rbt_namefromnode(node, &name); + result = dns_name_copy(&name, foundname, NULL); + while (result == ISC_R_SUCCESS && i > 0) { + i--; + level_node = search->chain.levels[i]; + dns_name_init(&name, NULL); + dns_rbt_namefromnode(level_node, + &name); + result = + dns_name_concatenate(foundname, + &name, + foundname, + NULL); + } + if (result != ISC_R_SUCCESS) { + *nodep = NULL; + goto node_exit; + } + } + result = DNS_R_DELEGATION; + if (nodep != NULL) { + new_reference(search->rbtdb, node); + *nodep = node; + } + bind_rdataset(search->rbtdb, node, found, search->now, + rdataset); + if (foundsig != NULL) + bind_rdataset(search->rbtdb, node, foundsig, + search->now, sigrdataset); + if (need_headerupdate(found, search->now) || + (foundsig != NULL && + need_headerupdate(foundsig, search->now))) { + if (locktype != isc_rwlocktype_write) { + NODE_UNLOCK(lock, locktype); + NODE_LOCK(lock, isc_rwlocktype_write); + locktype = isc_rwlocktype_write; + } + if (need_headerupdate(found, search->now)) + update_header(search->rbtdb, found, + search->now); + if (foundsig != NULL && + need_headerupdate(foundsig, search->now)) { + update_header(search->rbtdb, foundsig, + search->now); + } + } + } + + node_exit: + NODE_UNLOCK(lock, locktype); + + if (found == NULL && i > 0) { + i--; + node = search->chain.levels[i]; + } else + done = ISC_TRUE; + + } while (!done); + + return (result); } static isc_result_t find_coveringnsec(rbtdb_search_t *search, dns_dbnode_t **nodep, - isc_stdtime_t now, dns_name_t *foundname, - dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset) + isc_stdtime_t now, dns_name_t *foundname, + dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset) { - dns_rbtnode_t *node; - rdatasetheader_t *header, *header_next, *header_prev; - rdatasetheader_t *found, *foundsig; - isc_boolean_t empty_node; - isc_result_t result; - dns_fixedname_t fname, forigin; - dns_name_t *name, *origin; - rbtdb_rdatatype_t matchtype, sigmatchtype; - nodelock_t *lock; - isc_rwlocktype_t locktype; - - matchtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_nsec, 0); - sigmatchtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, - dns_rdatatype_nsec); - - do { - node = NULL; - dns_fixedname_init(&fname); - name = dns_fixedname_name(&fname); - dns_fixedname_init(&forigin); - origin = dns_fixedname_name(&forigin); - result = dns_rbtnodechain_current(&search->chain, name, - origin, &node); - if (result != ISC_R_SUCCESS) - return (result); - locktype = isc_rwlocktype_read; - lock = &(search->rbtdb->node_locks[node->locknum].lock); - NODE_LOCK(lock, locktype); - found = NULL; - foundsig = NULL; - empty_node = ISC_TRUE; - header_prev = NULL; - for (header = node->data; - header != NULL; - header = header_next) { - header_next = header->next; - if (header->rdh_ttl <= now) { - /* - * This rdataset is stale. If no one else is - * using the node, we can clean it up right - * now, otherwise we mark it as stale, and the - * node as dirty, so it will get cleaned up - * later. - */ - if ((header->rdh_ttl <= now - RBTDB_VIRTUAL) && - (locktype == isc_rwlocktype_write || - NODE_TRYUPGRADE(lock) == ISC_R_SUCCESS)) { - /* - * We update the node's status only - * when we can get write access. - */ - locktype = isc_rwlocktype_write; - - if (dns_rbtnode_refcurrent(node) - == 0) { - isc_mem_t *m; - - m = search->rbtdb->common.mctx; - clean_stale_headers( - search->rbtdb, - m, header); - if (header_prev != NULL) - header_prev->next = - header->next; - else - node->data = header->next; - free_rdataset(search->rbtdb, m, - header); - } else { - header->attributes |= - RDATASET_ATTR_STALE; - node->dirty = 1; - header_prev = header; - } - } else - header_prev = header; - continue; - } - if (NONEXISTENT(header) || - RBTDB_RDATATYPE_BASE(header->type) == 0) { - header_prev = header; - continue; - } - empty_node = ISC_FALSE; - if (header->type == matchtype) - found = header; - else if (header->type == sigmatchtype) - foundsig = header; - header_prev = header; - } - if (found != NULL) { - result = dns_name_concatenate(name, origin, - foundname, NULL); - if (result != ISC_R_SUCCESS) - goto unlock_node; - bind_rdataset(search->rbtdb, node, found, - now, rdataset); - if (foundsig != NULL) - bind_rdataset(search->rbtdb, node, foundsig, - now, sigrdataset); - new_reference(search->rbtdb, node); - *nodep = node; - result = DNS_R_COVERINGNSEC; - } else if (!empty_node) { - result = ISC_R_NOTFOUND; - } else - result = dns_rbtnodechain_prev(&search->chain, NULL, - NULL); + dns_rbtnode_t *node; + rdatasetheader_t *header, *header_next, *header_prev; + rdatasetheader_t *found, *foundsig; + isc_boolean_t empty_node; + isc_result_t result; + dns_fixedname_t fname, forigin; + dns_name_t *name, *origin; + rbtdb_rdatatype_t matchtype, sigmatchtype; + nodelock_t *lock; + isc_rwlocktype_t locktype; + + matchtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_nsec, 0); + sigmatchtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, + dns_rdatatype_nsec); + + do { + node = NULL; + dns_fixedname_init(&fname); + name = dns_fixedname_name(&fname); + dns_fixedname_init(&forigin); + origin = dns_fixedname_name(&forigin); + result = dns_rbtnodechain_current(&search->chain, name, + origin, &node); + if (result != ISC_R_SUCCESS) + return (result); + locktype = isc_rwlocktype_read; + lock = &(search->rbtdb->node_locks[node->locknum].lock); + NODE_LOCK(lock, locktype); + found = NULL; + foundsig = NULL; + empty_node = ISC_TRUE; + header_prev = NULL; + for (header = node->data; + header != NULL; + header = header_next) { + header_next = header->next; + if (header->rdh_ttl <= now) { + /* + * This rdataset is stale. If no one else is + * using the node, we can clean it up right + * now, otherwise we mark it as stale, and the + * node as dirty, so it will get cleaned up + * later. + */ + if ((header->rdh_ttl <= now - RBTDB_VIRTUAL) && + (locktype == isc_rwlocktype_write || + NODE_TRYUPGRADE(lock) == ISC_R_SUCCESS)) { + /* + * We update the node's status only + * when we can get write access. + */ + locktype = isc_rwlocktype_write; + + if (dns_rbtnode_refcurrent(node) + == 0) { + isc_mem_t *m; + + m = search->rbtdb->common.mctx; + clean_stale_headers( + search->rbtdb, + m, header); + if (header_prev != NULL) + header_prev->next = + header->next; + else + node->data = header->next; + free_rdataset(search->rbtdb, m, + header); + } else { + header->attributes |= + RDATASET_ATTR_STALE; + node->dirty = 1; + header_prev = header; + } + } else + header_prev = header; + continue; + } + if (NONEXISTENT(header) || + RBTDB_RDATATYPE_BASE(header->type) == 0) { + header_prev = header; + continue; + } + empty_node = ISC_FALSE; + if (header->type == matchtype) + found = header; + else if (header->type == sigmatchtype) + foundsig = header; + header_prev = header; + } + if (found != NULL) { + result = dns_name_concatenate(name, origin, + foundname, NULL); + if (result != ISC_R_SUCCESS) + goto unlock_node; + bind_rdataset(search->rbtdb, node, found, + now, rdataset); + if (foundsig != NULL) + bind_rdataset(search->rbtdb, node, foundsig, + now, sigrdataset); + new_reference(search->rbtdb, node); + *nodep = node; + result = DNS_R_COVERINGNSEC; + } else if (!empty_node) { + result = ISC_R_NOTFOUND; + } else + result = dns_rbtnodechain_prev(&search->chain, NULL, + NULL); unlock_node: - NODE_UNLOCK(lock, locktype); - } while (empty_node && result == ISC_R_SUCCESS); - return (result); + NODE_UNLOCK(lock, locktype); + } while (empty_node && result == ISC_R_SUCCESS); + return (result); } static isc_result_t cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, - dns_rdatatype_t type, unsigned int options, isc_stdtime_t now, - dns_dbnode_t **nodep, dns_name_t *foundname, - dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset) + dns_rdatatype_t type, unsigned int options, isc_stdtime_t now, + dns_dbnode_t **nodep, dns_name_t *foundname, + dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset) { - dns_rbtnode_t *node = NULL; - isc_result_t result; - rbtdb_search_t search; - isc_boolean_t cname_ok = ISC_TRUE; - isc_boolean_t empty_node; - nodelock_t *lock; - isc_rwlocktype_t locktype; - rdatasetheader_t *header, *header_prev, *header_next; - rdatasetheader_t *found, *nsheader; - rdatasetheader_t *foundsig, *nssig, *cnamesig; - rdatasetheader_t *update, *updatesig; - rbtdb_rdatatype_t sigtype, negtype; - - UNUSED(version); - - search.rbtdb = (dns_rbtdb_t *)db; - - REQUIRE(VALID_RBTDB(search.rbtdb)); - REQUIRE(version == NULL); - - if (now == 0) - isc_stdtime_get(&now); - - search.rbtversion = NULL; - search.serial = 1; - search.options = options; - search.copy_name = ISC_FALSE; - search.need_cleanup = ISC_FALSE; - search.wild = ISC_FALSE; - search.zonecut = NULL; - dns_fixedname_init(&search.zonecut_name); - dns_rbtnodechain_init(&search.chain, search.rbtdb->common.mctx); - search.now = now; - update = NULL; - updatesig = NULL; - - RWLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read); - - /* - * Search down from the root of the tree. If, while going down, we - * encounter a callback node, cache_zonecut_callback() will search the - * rdatasets at the zone cut for a DNAME rdataset. - */ - result = dns_rbt_findnode(search.rbtdb->tree, name, foundname, &node, - &search.chain, DNS_RBTFIND_EMPTYDATA, - cache_zonecut_callback, &search); - - if (result == DNS_R_PARTIALMATCH) { - if ((search.options & DNS_DBFIND_COVERINGNSEC) != 0) { - result = find_coveringnsec(&search, nodep, now, - foundname, rdataset, - sigrdataset); - if (result == DNS_R_COVERINGNSEC) - goto tree_exit; - } - if (search.zonecut != NULL) { - result = setup_delegation(&search, nodep, foundname, - rdataset, sigrdataset); - goto tree_exit; - } else { - find_ns: - result = find_deepest_zonecut(&search, node, nodep, - foundname, rdataset, - sigrdataset); - goto tree_exit; - } - } else if (result != ISC_R_SUCCESS) - goto tree_exit; - - /* - * Certain DNSSEC types are not subject to CNAME matching - * (RFC4035, section 2.5 and RFC3007). - * - * We don't check for RRSIG, because we don't store RRSIG records - * directly. - */ - if (type == dns_rdatatype_key || type == dns_rdatatype_nsec) - cname_ok = ISC_FALSE; - - /* - * We now go looking for rdata... - */ - - lock = &(search.rbtdb->node_locks[node->locknum].lock); - locktype = isc_rwlocktype_read; - NODE_LOCK(lock, locktype); - - found = NULL; - foundsig = NULL; - sigtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, type); - negtype = RBTDB_RDATATYPE_VALUE(0, type); - nsheader = NULL; - nssig = NULL; - cnamesig = NULL; - empty_node = ISC_TRUE; - header_prev = NULL; - for (header = node->data; header != NULL; header = header_next) { - header_next = header->next; - if (header->rdh_ttl <= now) { - /* - * This rdataset is stale. If no one else is using the - * node, we can clean it up right now, otherwise we - * mark it as stale, and the node as dirty, so it will - * get cleaned up later. - */ - if ((header->rdh_ttl <= now - RBTDB_VIRTUAL) && - (locktype == isc_rwlocktype_write || - NODE_TRYUPGRADE(lock) == ISC_R_SUCCESS)) { - /* - * We update the node's status only when we - * can get write access. - */ - locktype = isc_rwlocktype_write; - - if (dns_rbtnode_refcurrent(node) == 0) { - isc_mem_t *mctx; - - mctx = search.rbtdb->common.mctx; - clean_stale_headers(search.rbtdb, mctx, - header); - if (header_prev != NULL) - header_prev->next = - header->next; - else - node->data = header->next; - free_rdataset(search.rbtdb, mctx, - header); - } else { - header->attributes |= - RDATASET_ATTR_STALE; - node->dirty = 1; - header_prev = header; - } - } else - header_prev = header; - } else if (EXISTS(header)) { - /* - * We now know that there is at least one active - * non-stale rdataset at this node. - */ - empty_node = ISC_FALSE; - - /* - * If we found a type we were looking for, remember - * it. - */ - if (header->type == type || - (type == dns_rdatatype_any && - RBTDB_RDATATYPE_BASE(header->type) != 0) || - (cname_ok && header->type == - dns_rdatatype_cname)) { - /* - * We've found the answer. - */ - found = header; - if (header->type == dns_rdatatype_cname && - cname_ok && - cnamesig != NULL) { - /* - * If we've already got the CNAME RRSIG, - * use it, otherwise change sigtype - * so that we find it. - */ - if (cnamesig != NULL) - foundsig = cnamesig; - else - sigtype = - RBTDB_RDATATYPE_SIGCNAME; - foundsig = cnamesig; - } - } else if (header->type == sigtype) { - /* - * We've found the RRSIG rdataset for our - * target type. Remember it. - */ - foundsig = header; - } else if (header->type == RBTDB_RDATATYPE_NCACHEANY || - header->type == negtype) { - /* - * We've found a negative cache entry. - */ - found = header; - } else if (header->type == dns_rdatatype_ns) { - /* - * Remember a NS rdataset even if we're - * not specifically looking for it, because - * we might need it later. - */ - nsheader = header; - } else if (header->type == RBTDB_RDATATYPE_SIGNS) { - /* - * If we need the NS rdataset, we'll also - * need its signature. - */ - nssig = header; - } else if (cname_ok && - header->type == RBTDB_RDATATYPE_SIGCNAME) { - /* - * If we get a CNAME match, we'll also need - * its signature. - */ - cnamesig = header; - } - header_prev = header; - } else - header_prev = header; - } - - if (empty_node) { - /* - * We have an exact match for the name, but there are no - * extant rdatasets. That means that this node doesn't - * meaningfully exist, and that we really have a partial match. - */ - NODE_UNLOCK(lock, locktype); - goto find_ns; - } - - /* - * If we didn't find what we were looking for... - */ - if (found == NULL || - (found->trust == dns_trust_glue && - ((options & DNS_DBFIND_GLUEOK) == 0)) || - (found->trust == dns_trust_pending && - ((options & DNS_DBFIND_PENDINGOK) == 0))) { - /* - * If there is an NS rdataset at this node, then this is the - * deepest zone cut. - */ - if (nsheader != NULL) { - if (nodep != NULL) { - new_reference(search.rbtdb, node); - *nodep = node; - } - bind_rdataset(search.rbtdb, node, nsheader, search.now, - rdataset); - if (need_headerupdate(nsheader, search.now)) - update = nsheader; - if (nssig != NULL) { - bind_rdataset(search.rbtdb, node, nssig, - search.now, sigrdataset); - if (need_headerupdate(nssig, search.now)) - updatesig = nssig; - } - result = DNS_R_DELEGATION; - goto node_exit; - } - - /* - * Go find the deepest zone cut. - */ - NODE_UNLOCK(lock, locktype); - goto find_ns; - } - - /* - * We found what we were looking for, or we found a CNAME. - */ - - if (nodep != NULL) { - new_reference(search.rbtdb, node); - *nodep = node; - } - - if (RBTDB_RDATATYPE_BASE(found->type) == 0) { - /* - * We found a negative cache entry. - */ - if (NXDOMAIN(found)) - result = DNS_R_NCACHENXDOMAIN; - else - result = DNS_R_NCACHENXRRSET; - } else if (type != found->type && - type != dns_rdatatype_any && - found->type == dns_rdatatype_cname) { - /* - * We weren't doing an ANY query and we found a CNAME instead - * of the type we were looking for, so we need to indicate - * that result to the caller. - */ - result = DNS_R_CNAME; - } else { - /* - * An ordinary successful query! - */ - result = ISC_R_SUCCESS; - } - - if (type != dns_rdatatype_any || result == DNS_R_NCACHENXDOMAIN || - result == DNS_R_NCACHENXRRSET) { - bind_rdataset(search.rbtdb, node, found, search.now, - rdataset); - if (need_headerupdate(found, search.now)) - update = found; - if (foundsig != NULL) { - bind_rdataset(search.rbtdb, node, foundsig, search.now, - sigrdataset); - if (need_headerupdate(foundsig, search.now)) - updatesig = foundsig; - } - } + dns_rbtnode_t *node = NULL; + isc_result_t result; + rbtdb_search_t search; + isc_boolean_t cname_ok = ISC_TRUE; + isc_boolean_t empty_node; + nodelock_t *lock; + isc_rwlocktype_t locktype; + rdatasetheader_t *header, *header_prev, *header_next; + rdatasetheader_t *found, *nsheader; + rdatasetheader_t *foundsig, *nssig, *cnamesig; + rdatasetheader_t *update, *updatesig; + rbtdb_rdatatype_t sigtype, negtype; + + UNUSED(version); + + search.rbtdb = (dns_rbtdb_t *)db; + + REQUIRE(VALID_RBTDB(search.rbtdb)); + REQUIRE(version == NULL); + + if (now == 0) + isc_stdtime_get(&now); + + search.rbtversion = NULL; + search.serial = 1; + search.options = options; + search.copy_name = ISC_FALSE; + search.need_cleanup = ISC_FALSE; + search.wild = ISC_FALSE; + search.zonecut = NULL; + dns_fixedname_init(&search.zonecut_name); + dns_rbtnodechain_init(&search.chain, search.rbtdb->common.mctx); + search.now = now; + update = NULL; + updatesig = NULL; + + RWLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read); + + /* + * Search down from the root of the tree. If, while going down, we + * encounter a callback node, cache_zonecut_callback() will search the + * rdatasets at the zone cut for a DNAME rdataset. + */ + result = dns_rbt_findnode(search.rbtdb->tree, name, foundname, &node, + &search.chain, DNS_RBTFIND_EMPTYDATA, + cache_zonecut_callback, &search); + + if (result == DNS_R_PARTIALMATCH) { + if ((search.options & DNS_DBFIND_COVERINGNSEC) != 0) { + result = find_coveringnsec(&search, nodep, now, + foundname, rdataset, + sigrdataset); + if (result == DNS_R_COVERINGNSEC) + goto tree_exit; + } + if (search.zonecut != NULL) { + result = setup_delegation(&search, nodep, foundname, + rdataset, sigrdataset); + goto tree_exit; + } else { + find_ns: + result = find_deepest_zonecut(&search, node, nodep, + foundname, rdataset, + sigrdataset); + goto tree_exit; + } + } else if (result != ISC_R_SUCCESS) + goto tree_exit; + + /* + * Certain DNSSEC types are not subject to CNAME matching + * (RFC4035, section 2.5 and RFC3007). + * + * We don't check for RRSIG, because we don't store RRSIG records + * directly. + */ + if (type == dns_rdatatype_key || type == dns_rdatatype_nsec) + cname_ok = ISC_FALSE; + + /* + * We now go looking for rdata... + */ + + lock = &(search.rbtdb->node_locks[node->locknum].lock); + locktype = isc_rwlocktype_read; + NODE_LOCK(lock, locktype); + + found = NULL; + foundsig = NULL; + sigtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, type); + negtype = RBTDB_RDATATYPE_VALUE(0, type); + nsheader = NULL; + nssig = NULL; + cnamesig = NULL; + empty_node = ISC_TRUE; + header_prev = NULL; + for (header = node->data; header != NULL; header = header_next) { + header_next = header->next; + if (header->rdh_ttl <= now) { + /* + * This rdataset is stale. If no one else is using the + * node, we can clean it up right now, otherwise we + * mark it as stale, and the node as dirty, so it will + * get cleaned up later. + */ + if ((header->rdh_ttl <= now - RBTDB_VIRTUAL) && + (locktype == isc_rwlocktype_write || + NODE_TRYUPGRADE(lock) == ISC_R_SUCCESS)) { + /* + * We update the node's status only when we + * can get write access. + */ + locktype = isc_rwlocktype_write; + + if (dns_rbtnode_refcurrent(node) == 0) { + isc_mem_t *mctx; + + mctx = search.rbtdb->common.mctx; + clean_stale_headers(search.rbtdb, mctx, + header); + if (header_prev != NULL) + header_prev->next = + header->next; + else + node->data = header->next; + free_rdataset(search.rbtdb, mctx, + header); + } else { + header->attributes |= + RDATASET_ATTR_STALE; + node->dirty = 1; + header_prev = header; + } + } else + header_prev = header; + } else if (EXISTS(header)) { + /* + * We now know that there is at least one active + * non-stale rdataset at this node. + */ + empty_node = ISC_FALSE; + + /* + * If we found a type we were looking for, remember + * it. + */ + if (header->type == type || + (type == dns_rdatatype_any && + RBTDB_RDATATYPE_BASE(header->type) != 0) || + (cname_ok && header->type == + dns_rdatatype_cname)) { + /* + * We've found the answer. + */ + found = header; + if (header->type == dns_rdatatype_cname && + cname_ok && + cnamesig != NULL) { + /* + * If we've already got the CNAME RRSIG, + * use it, otherwise change sigtype + * so that we find it. + */ + if (cnamesig != NULL) + foundsig = cnamesig; + else + sigtype = + RBTDB_RDATATYPE_SIGCNAME; + foundsig = cnamesig; + } + } else if (header->type == sigtype) { + /* + * We've found the RRSIG rdataset for our + * target type. Remember it. + */ + foundsig = header; + } else if (header->type == RBTDB_RDATATYPE_NCACHEANY || + header->type == negtype) { + /* + * We've found a negative cache entry. + */ + found = header; + } else if (header->type == dns_rdatatype_ns) { + /* + * Remember a NS rdataset even if we're + * not specifically looking for it, because + * we might need it later. + */ + nsheader = header; + } else if (header->type == RBTDB_RDATATYPE_SIGNS) { + /* + * If we need the NS rdataset, we'll also + * need its signature. + */ + nssig = header; + } else if (cname_ok && + header->type == RBTDB_RDATATYPE_SIGCNAME) { + /* + * If we get a CNAME match, we'll also need + * its signature. + */ + cnamesig = header; + } + header_prev = header; + } else + header_prev = header; + } + + if (empty_node) { + /* + * We have an exact match for the name, but there are no + * extant rdatasets. That means that this node doesn't + * meaningfully exist, and that we really have a partial match. + */ + NODE_UNLOCK(lock, locktype); + goto find_ns; + } + + /* + * If we didn't find what we were looking for... + */ + if (found == NULL || + (found->trust == dns_trust_glue && + ((options & DNS_DBFIND_GLUEOK) == 0)) || + (found->trust == dns_trust_pending && + ((options & DNS_DBFIND_PENDINGOK) == 0))) { + /* + * If there is an NS rdataset at this node, then this is the + * deepest zone cut. + */ + if (nsheader != NULL) { + if (nodep != NULL) { + new_reference(search.rbtdb, node); + *nodep = node; + } + bind_rdataset(search.rbtdb, node, nsheader, search.now, + rdataset); + if (need_headerupdate(nsheader, search.now)) + update = nsheader; + if (nssig != NULL) { + bind_rdataset(search.rbtdb, node, nssig, + search.now, sigrdataset); + if (need_headerupdate(nssig, search.now)) + updatesig = nssig; + } + result = DNS_R_DELEGATION; + goto node_exit; + } + + /* + * Go find the deepest zone cut. + */ + NODE_UNLOCK(lock, locktype); + goto find_ns; + } + + /* + * We found what we were looking for, or we found a CNAME. + */ + + if (nodep != NULL) { + new_reference(search.rbtdb, node); + *nodep = node; + } + + if (RBTDB_RDATATYPE_BASE(found->type) == 0) { + /* + * We found a negative cache entry. + */ + if (NXDOMAIN(found)) + result = DNS_R_NCACHENXDOMAIN; + else + result = DNS_R_NCACHENXRRSET; + } else if (type != found->type && + type != dns_rdatatype_any && + found->type == dns_rdatatype_cname) { + /* + * We weren't doing an ANY query and we found a CNAME instead + * of the type we were looking for, so we need to indicate + * that result to the caller. + */ + result = DNS_R_CNAME; + } else { + /* + * An ordinary successful query! + */ + result = ISC_R_SUCCESS; + } + + if (type != dns_rdatatype_any || result == DNS_R_NCACHENXDOMAIN || + result == DNS_R_NCACHENXRRSET) { + bind_rdataset(search.rbtdb, node, found, search.now, + rdataset); + if (need_headerupdate(found, search.now)) + update = found; + if (foundsig != NULL) { + bind_rdataset(search.rbtdb, node, foundsig, search.now, + sigrdataset); + if (need_headerupdate(foundsig, search.now)) + updatesig = foundsig; + } + } node_exit: - if ((update != NULL || updatesig != NULL) && - locktype != isc_rwlocktype_write) { - NODE_UNLOCK(lock, locktype); - NODE_LOCK(lock, isc_rwlocktype_write); - locktype = isc_rwlocktype_write; - } - if (update != NULL && need_headerupdate(update, search.now)) - update_header(search.rbtdb, update, search.now); - if (updatesig != NULL && need_headerupdate(updatesig, search.now)) - update_header(search.rbtdb, updatesig, search.now); - - NODE_UNLOCK(lock, locktype); + if ((update != NULL || updatesig != NULL) && + locktype != isc_rwlocktype_write) { + NODE_UNLOCK(lock, locktype); + NODE_LOCK(lock, isc_rwlocktype_write); + locktype = isc_rwlocktype_write; + } + if (update != NULL && need_headerupdate(update, search.now)) + update_header(search.rbtdb, update, search.now); + if (updatesig != NULL && need_headerupdate(updatesig, search.now)) + update_header(search.rbtdb, updatesig, search.now); + + NODE_UNLOCK(lock, locktype); tree_exit: - RWUNLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read); + RWUNLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read); - /* - * If we found a zonecut but aren't going to use it, we have to - * let go of it. - */ - if (search.need_cleanup) { - node = search.zonecut; - lock = &(search.rbtdb->node_locks[node->locknum].lock); + /* + * If we found a zonecut but aren't going to use it, we have to + * let go of it. + */ + if (search.need_cleanup) { + node = search.zonecut; + lock = &(search.rbtdb->node_locks[node->locknum].lock); - NODE_LOCK(lock, isc_rwlocktype_read); - decrement_reference(search.rbtdb, node, 0, - isc_rwlocktype_read, isc_rwlocktype_none); - NODE_UNLOCK(lock, isc_rwlocktype_read); - } + NODE_LOCK(lock, isc_rwlocktype_read); + decrement_reference(search.rbtdb, node, 0, + isc_rwlocktype_read, isc_rwlocktype_none); + NODE_UNLOCK(lock, isc_rwlocktype_read); + } - dns_rbtnodechain_reset(&search.chain); + dns_rbtnodechain_reset(&search.chain); - return (result); + return (result); } static isc_result_t cache_findzonecut(dns_db_t *db, dns_name_t *name, unsigned int options, - isc_stdtime_t now, dns_dbnode_t **nodep, - dns_name_t *foundname, - dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset) + isc_stdtime_t now, dns_dbnode_t **nodep, + dns_name_t *foundname, + dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset) { - dns_rbtnode_t *node = NULL; - nodelock_t *lock; - isc_result_t result; - rbtdb_search_t search; - rdatasetheader_t *header, *header_prev, *header_next; - rdatasetheader_t *found, *foundsig; - unsigned int rbtoptions = DNS_RBTFIND_EMPTYDATA; - isc_rwlocktype_t locktype; - - search.rbtdb = (dns_rbtdb_t *)db; - - REQUIRE(VALID_RBTDB(search.rbtdb)); - - if (now == 0) - isc_stdtime_get(&now); - - search.rbtversion = NULL; - search.serial = 1; - search.options = options; - search.copy_name = ISC_FALSE; - search.need_cleanup = ISC_FALSE; - search.wild = ISC_FALSE; - search.zonecut = NULL; - dns_fixedname_init(&search.zonecut_name); - dns_rbtnodechain_init(&search.chain, search.rbtdb->common.mctx); - search.now = now; - - if ((options & DNS_DBFIND_NOEXACT) != 0) - rbtoptions |= DNS_RBTFIND_NOEXACT; - - RWLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read); - - /* - * Search down from the root of the tree. - */ - result = dns_rbt_findnode(search.rbtdb->tree, name, foundname, &node, - &search.chain, rbtoptions, NULL, &search); - - if (result == DNS_R_PARTIALMATCH) { - find_ns: - result = find_deepest_zonecut(&search, node, nodep, foundname, - rdataset, sigrdataset); - goto tree_exit; - } else if (result != ISC_R_SUCCESS) - goto tree_exit; - - /* - * We now go looking for an NS rdataset at the node. - */ - - lock = &(search.rbtdb->node_locks[node->locknum].lock); - locktype = isc_rwlocktype_read; - NODE_LOCK(lock, locktype); - - found = NULL; - foundsig = NULL; - header_prev = NULL; - for (header = node->data; header != NULL; header = header_next) { - header_next = header->next; - if (header->rdh_ttl <= now) { - /* - * This rdataset is stale. If no one else is using the - * node, we can clean it up right now, otherwise we - * mark it as stale, and the node as dirty, so it will - * get cleaned up later. - */ - if ((header->rdh_ttl <= now - RBTDB_VIRTUAL) && - (locktype == isc_rwlocktype_write || - NODE_TRYUPGRADE(lock) == ISC_R_SUCCESS)) { - /* - * We update the node's status only when we - * can get write access. - */ - locktype = isc_rwlocktype_write; - - if (dns_rbtnode_refcurrent(node) == 0) { - isc_mem_t *mctx; - - mctx = search.rbtdb->common.mctx; - clean_stale_headers(search.rbtdb, mctx, - header); - if (header_prev != NULL) - header_prev->next = - header->next; - else - node->data = header->next; - free_rdataset(search.rbtdb, mctx, - header); - } else { - header->attributes |= - RDATASET_ATTR_STALE; - node->dirty = 1; - header_prev = header; - } - } else - header_prev = header; - } else if (EXISTS(header)) { - /* - * If we found a type we were looking for, remember - * it. - */ - if (header->type == dns_rdatatype_ns) { - /* - * Remember a NS rdataset even if we're - * not specifically looking for it, because - * we might need it later. - */ - found = header; - } else if (header->type == RBTDB_RDATATYPE_SIGNS) { - /* - * If we need the NS rdataset, we'll also - * need its signature. - */ - foundsig = header; - } - header_prev = header; - } else - header_prev = header; - } - - if (found == NULL) { - /* - * No NS records here. - */ - NODE_UNLOCK(lock, locktype); - goto find_ns; - } - - if (nodep != NULL) { - new_reference(search.rbtdb, node); - *nodep = node; - } - - bind_rdataset(search.rbtdb, node, found, search.now, rdataset); - if (foundsig != NULL) - bind_rdataset(search.rbtdb, node, foundsig, search.now, - sigrdataset); - - if (need_headerupdate(found, search.now) || - (foundsig != NULL && need_headerupdate(foundsig, search.now))) { - if (locktype != isc_rwlocktype_write) { - NODE_UNLOCK(lock, locktype); - NODE_LOCK(lock, isc_rwlocktype_write); - locktype = isc_rwlocktype_write; - } - if (need_headerupdate(found, search.now)) - update_header(search.rbtdb, found, search.now); - if (foundsig != NULL && - need_headerupdate(foundsig, search.now)) { - update_header(search.rbtdb, foundsig, search.now); - } - } - - NODE_UNLOCK(lock, locktype); + dns_rbtnode_t *node = NULL; + nodelock_t *lock; + isc_result_t result; + rbtdb_search_t search; + rdatasetheader_t *header, *header_prev, *header_next; + rdatasetheader_t *found, *foundsig; + unsigned int rbtoptions = DNS_RBTFIND_EMPTYDATA; + isc_rwlocktype_t locktype; + + search.rbtdb = (dns_rbtdb_t *)db; + + REQUIRE(VALID_RBTDB(search.rbtdb)); + + if (now == 0) + isc_stdtime_get(&now); + + search.rbtversion = NULL; + search.serial = 1; + search.options = options; + search.copy_name = ISC_FALSE; + search.need_cleanup = ISC_FALSE; + search.wild = ISC_FALSE; + search.zonecut = NULL; + dns_fixedname_init(&search.zonecut_name); + dns_rbtnodechain_init(&search.chain, search.rbtdb->common.mctx); + search.now = now; + + if ((options & DNS_DBFIND_NOEXACT) != 0) + rbtoptions |= DNS_RBTFIND_NOEXACT; + + RWLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read); + + /* + * Search down from the root of the tree. + */ + result = dns_rbt_findnode(search.rbtdb->tree, name, foundname, &node, + &search.chain, rbtoptions, NULL, &search); + + if (result == DNS_R_PARTIALMATCH) { + find_ns: + result = find_deepest_zonecut(&search, node, nodep, foundname, + rdataset, sigrdataset); + goto tree_exit; + } else if (result != ISC_R_SUCCESS) + goto tree_exit; + + /* + * We now go looking for an NS rdataset at the node. + */ + + lock = &(search.rbtdb->node_locks[node->locknum].lock); + locktype = isc_rwlocktype_read; + NODE_LOCK(lock, locktype); + + found = NULL; + foundsig = NULL; + header_prev = NULL; + for (header = node->data; header != NULL; header = header_next) { + header_next = header->next; + if (header->rdh_ttl <= now) { + /* + * This rdataset is stale. If no one else is using the + * node, we can clean it up right now, otherwise we + * mark it as stale, and the node as dirty, so it will + * get cleaned up later. + */ + if ((header->rdh_ttl <= now - RBTDB_VIRTUAL) && + (locktype == isc_rwlocktype_write || + NODE_TRYUPGRADE(lock) == ISC_R_SUCCESS)) { + /* + * We update the node's status only when we + * can get write access. + */ + locktype = isc_rwlocktype_write; + + if (dns_rbtnode_refcurrent(node) == 0) { + isc_mem_t *mctx; + + mctx = search.rbtdb->common.mctx; + clean_stale_headers(search.rbtdb, mctx, + header); + if (header_prev != NULL) + header_prev->next = + header->next; + else + node->data = header->next; + free_rdataset(search.rbtdb, mctx, + header); + } else { + header->attributes |= + RDATASET_ATTR_STALE; + node->dirty = 1; + header_prev = header; + } + } else + header_prev = header; + } else if (EXISTS(header)) { + /* + * If we found a type we were looking for, remember + * it. + */ + if (header->type == dns_rdatatype_ns) { + /* + * Remember a NS rdataset even if we're + * not specifically looking for it, because + * we might need it later. + */ + found = header; + } else if (header->type == RBTDB_RDATATYPE_SIGNS) { + /* + * If we need the NS rdataset, we'll also + * need its signature. + */ + foundsig = header; + } + header_prev = header; + } else + header_prev = header; + } + + if (found == NULL) { + /* + * No NS records here. + */ + NODE_UNLOCK(lock, locktype); + goto find_ns; + } + + if (nodep != NULL) { + new_reference(search.rbtdb, node); + *nodep = node; + } + + bind_rdataset(search.rbtdb, node, found, search.now, rdataset); + if (foundsig != NULL) + bind_rdataset(search.rbtdb, node, foundsig, search.now, + sigrdataset); + + if (need_headerupdate(found, search.now) || + (foundsig != NULL && need_headerupdate(foundsig, search.now))) { + if (locktype != isc_rwlocktype_write) { + NODE_UNLOCK(lock, locktype); + NODE_LOCK(lock, isc_rwlocktype_write); + locktype = isc_rwlocktype_write; + } + if (need_headerupdate(found, search.now)) + update_header(search.rbtdb, found, search.now); + if (foundsig != NULL && + need_headerupdate(foundsig, search.now)) { + update_header(search.rbtdb, foundsig, search.now); + } + } + + NODE_UNLOCK(lock, locktype); tree_exit: - RWUNLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read); + RWUNLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read); - INSIST(!search.need_cleanup); + INSIST(!search.need_cleanup); - dns_rbtnodechain_reset(&search.chain); + dns_rbtnodechain_reset(&search.chain); - if (result == DNS_R_DELEGATION) - result = ISC_R_SUCCESS; + if (result == DNS_R_DELEGATION) + result = ISC_R_SUCCESS; - return (result); + return (result); } static void attachnode(dns_db_t *db, dns_dbnode_t *source, dns_dbnode_t **targetp) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - dns_rbtnode_t *node = (dns_rbtnode_t *)source; - unsigned int refs; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + dns_rbtnode_t *node = (dns_rbtnode_t *)source; + unsigned int refs; - REQUIRE(VALID_RBTDB(rbtdb)); - REQUIRE(targetp != NULL && *targetp == NULL); + REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(targetp != NULL && *targetp == NULL); - NODE_STRONGLOCK(&rbtdb->node_locks[node->locknum].lock); - dns_rbtnode_refincrement(node, &refs); - INSIST(refs != 0); - NODE_STRONGUNLOCK(&rbtdb->node_locks[node->locknum].lock); + NODE_STRONGLOCK(&rbtdb->node_locks[node->locknum].lock); + dns_rbtnode_refincrement(node, &refs); + INSIST(refs != 0); + NODE_STRONGUNLOCK(&rbtdb->node_locks[node->locknum].lock); - *targetp = source; + *targetp = source; } static void detachnode(dns_db_t *db, dns_dbnode_t **targetp) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - dns_rbtnode_t *node; - isc_boolean_t want_free = ISC_FALSE; - isc_boolean_t inactive = ISC_FALSE; - rbtdb_nodelock_t *nodelock; - - REQUIRE(VALID_RBTDB(rbtdb)); - REQUIRE(targetp != NULL && *targetp != NULL); - - node = (dns_rbtnode_t *)(*targetp); - nodelock = &rbtdb->node_locks[node->locknum]; - - NODE_LOCK(&nodelock->lock, isc_rwlocktype_read); - - if (decrement_reference(rbtdb, node, 0, isc_rwlocktype_read, - isc_rwlocktype_none)) { - if (isc_refcount_current(&nodelock->references) == 0 && - nodelock->exiting) { - inactive = ISC_TRUE; - } - } - - NODE_UNLOCK(&nodelock->lock, isc_rwlocktype_read); - - *targetp = NULL; - - if (inactive) { - RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); - rbtdb->active--; - if (rbtdb->active == 0) - want_free = ISC_TRUE; - RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); - if (want_free) { - char buf[DNS_NAME_FORMATSIZE]; - if (dns_name_dynamic(&rbtdb->common.origin)) - dns_name_format(&rbtdb->common.origin, buf, - sizeof(buf)); - else - strcpy(buf, "<UNKNOWN>"); - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_CACHE, ISC_LOG_DEBUG(1), - "calling free_rbtdb(%s)", buf); - free_rbtdb(rbtdb, ISC_TRUE, NULL); - } - } + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + dns_rbtnode_t *node; + isc_boolean_t want_free = ISC_FALSE; + isc_boolean_t inactive = ISC_FALSE; + rbtdb_nodelock_t *nodelock; + + REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(targetp != NULL && *targetp != NULL); + + node = (dns_rbtnode_t *)(*targetp); + nodelock = &rbtdb->node_locks[node->locknum]; + + NODE_LOCK(&nodelock->lock, isc_rwlocktype_read); + + if (decrement_reference(rbtdb, node, 0, isc_rwlocktype_read, + isc_rwlocktype_none)) { + if (isc_refcount_current(&nodelock->references) == 0 && + nodelock->exiting) { + inactive = ISC_TRUE; + } + } + + NODE_UNLOCK(&nodelock->lock, isc_rwlocktype_read); + + *targetp = NULL; + + if (inactive) { + RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); + rbtdb->active--; + if (rbtdb->active == 0) + want_free = ISC_TRUE; + RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); + if (want_free) { + char buf[DNS_NAME_FORMATSIZE]; + if (dns_name_dynamic(&rbtdb->common.origin)) + dns_name_format(&rbtdb->common.origin, buf, + sizeof(buf)); + else + strcpy(buf, "<UNKNOWN>"); + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_CACHE, ISC_LOG_DEBUG(1), + "calling free_rbtdb(%s)", buf); + free_rbtdb(rbtdb, ISC_TRUE, NULL); + } + } } static isc_result_t expirenode(dns_db_t *db, dns_dbnode_t *node, isc_stdtime_t now) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - dns_rbtnode_t *rbtnode = node; - rdatasetheader_t *header; - isc_boolean_t force_expire = ISC_FALSE; - /* - * These are the category and module used by the cache cleaner. - */ - isc_boolean_t log = ISC_FALSE; - isc_logcategory_t *category = DNS_LOGCATEGORY_DATABASE; - isc_logmodule_t *module = DNS_LOGMODULE_CACHE; - int level = ISC_LOG_DEBUG(2); - char printname[DNS_NAME_FORMATSIZE]; - - REQUIRE(VALID_RBTDB(rbtdb)); - - /* - * Caller must hold a tree lock. - */ - - if (now == 0) - isc_stdtime_get(&now); - - if (rbtdb->overmem) { - isc_uint32_t val; - - isc_random_get(&val); - /* - * XXXDCL Could stand to have a better policy, like LRU. - */ - force_expire = ISC_TF(rbtnode->down == NULL && val % 4 == 0); - - /* - * Note that 'log' can be true IFF rbtdb->overmem is also true. - * rbtdb->ovemem 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)); - if (log) - isc_log_write(dns_lctx, category, module, level, - "overmem cache: %s %s", - force_expire ? "FORCE" : "check", - dns_rbt_formatnodename(rbtnode, - printname, - sizeof(printname))); - } - - /* - * We may not need write access, but this code path is not performance - * sensitive, so it should be okay to always lock as a writer. - */ - NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_write); - - for (header = rbtnode->data; header != NULL; header = header->next) - if (header->rdh_ttl <= now - RBTDB_VIRTUAL) { - /* - * We don't check if refcurrent(rbtnode) == 0 and try - * to free like we do in cache_find(), because - * refcurrent(rbtnode) must be non-zero. This is so - * because 'node' is an argument to the function. - */ - header->attributes |= RDATASET_ATTR_STALE; - rbtnode->dirty = 1; - if (log) - isc_log_write(dns_lctx, category, module, - level, "overmem cache: stale %s", - printname); - } else if (force_expire) { - if (! RETAIN(header)) { - set_ttl(rbtdb, header, 0); - header->attributes |= RDATASET_ATTR_STALE; - rbtnode->dirty = 1; - } else if (log) { - isc_log_write(dns_lctx, category, module, - level, "overmem cache: " - "reprieve by RETAIN() %s", - printname); - } - } else if (rbtdb->overmem && log) - isc_log_write(dns_lctx, category, module, level, - "overmem cache: saved %s", printname); - - NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_write); - - return (ISC_R_SUCCESS); + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + dns_rbtnode_t *rbtnode = node; + rdatasetheader_t *header; + isc_boolean_t force_expire = ISC_FALSE; + /* + * These are the category and module used by the cache cleaner. + */ + isc_boolean_t log = ISC_FALSE; + isc_logcategory_t *category = DNS_LOGCATEGORY_DATABASE; + isc_logmodule_t *module = DNS_LOGMODULE_CACHE; + int level = ISC_LOG_DEBUG(2); + char printname[DNS_NAME_FORMATSIZE]; + + REQUIRE(VALID_RBTDB(rbtdb)); + + /* + * Caller must hold a tree lock. + */ + + if (now == 0) + isc_stdtime_get(&now); + + if (rbtdb->overmem) { + isc_uint32_t val; + + isc_random_get(&val); + /* + * XXXDCL Could stand to have a better policy, like LRU. + */ + force_expire = ISC_TF(rbtnode->down == NULL && val % 4 == 0); + + /* + * Note that 'log' can be true IFF rbtdb->overmem is also true. + * rbtdb->ovemem 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)); + if (log) + isc_log_write(dns_lctx, category, module, level, + "overmem cache: %s %s", + force_expire ? "FORCE" : "check", + dns_rbt_formatnodename(rbtnode, + printname, + sizeof(printname))); + } + + /* + * We may not need write access, but this code path is not performance + * sensitive, so it should be okay to always lock as a writer. + */ + NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_write); + + for (header = rbtnode->data; header != NULL; header = header->next) + if (header->rdh_ttl <= now - RBTDB_VIRTUAL) { + /* + * We don't check if refcurrent(rbtnode) == 0 and try + * to free like we do in cache_find(), because + * refcurrent(rbtnode) must be non-zero. This is so + * because 'node' is an argument to the function. + */ + header->attributes |= RDATASET_ATTR_STALE; + rbtnode->dirty = 1; + if (log) + isc_log_write(dns_lctx, category, module, + level, "overmem cache: stale %s", + printname); + } else if (force_expire) { + if (! RETAIN(header)) { + set_ttl(rbtdb, header, 0); + header->attributes |= RDATASET_ATTR_STALE; + rbtnode->dirty = 1; + } else if (log) { + isc_log_write(dns_lctx, category, module, + level, "overmem cache: " + "reprieve by RETAIN() %s", + printname); + } + } else if (rbtdb->overmem && log) + isc_log_write(dns_lctx, category, module, level, + "overmem cache: saved %s", printname); + + NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_write); + + return (ISC_R_SUCCESS); } static void overmem(dns_db_t *db, isc_boolean_t overmem) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - -#ifdef LRU_DEBUG - /* XXX: see cache.c:timer_dump() */ - if ((int)overmem == -1) { - if (!IS_CACHE(rbtdb) || db->rdclass != dns_rdataclass_in) - return; /* for brevity */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_CACHE, ISC_LOG_INFO, - "cache DB %p: mem inuse %lu, %u node, " - "%d/%u current/total cache, %d/%u neg, %d/%u A, %d/%u AAAA, " - "%d/%u NS, %d/%u PTR, %d/%u glue, " - "%d/%u additional, purge/scan=%u(%u expiry, %u lru)/%u, " - "overmem=%d", - rbtdb, - (unsigned long)isc_mem_inuse(rbtdb->common.mctx), - dns_rbt_nodecount(rbtdb->tree), - rbtdb->cachestat.cache_current, rbtdb->cachestat.cache_total, - rbtdb->cachestat.ncache_current, rbtdb->cachestat.ncache_total, - rbtdb->cachestat.a_current, rbtdb->cachestat.a_total, - rbtdb->cachestat.aaaa_current, rbtdb->cachestat.aaaa_total, - rbtdb->cachestat.ns_current, rbtdb->cachestat.ns_total, - rbtdb->cachestat.ptr_current, rbtdb->cachestat.ptr_total, - rbtdb->cachestat.glue_current, rbtdb->cachestat.glue_total, - rbtdb->cachestat.additional_current, - rbtdb->cachestat.additional_total, - rbtdb->cachestat.stale_purge, rbtdb->cachestat.stale_expire, - rbtdb->cachestat.stale_lru, rbtdb->cachestat.stale_scan, - rbtdb->overmem); - return; - } -#endif + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - if (IS_CACHE(rbtdb)) { - rbtdb->overmem = overmem; - } + if (IS_CACHE(rbtdb)) + rbtdb->overmem = overmem; } static void printnode(dns_db_t *db, dns_dbnode_t *node, FILE *out) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - dns_rbtnode_t *rbtnode = node; - isc_boolean_t first; - - REQUIRE(VALID_RBTDB(rbtdb)); - - NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_read); - - fprintf(out, "node %p, %u references, locknum = %u\n", - rbtnode, dns_rbtnode_refcurrent(rbtnode), - rbtnode->locknum); - if (rbtnode->data != NULL) { - rdatasetheader_t *current, *top_next; - - for (current = rbtnode->data; current != NULL; - current = top_next) { - top_next = current->next; - first = ISC_TRUE; - fprintf(out, "\ttype %u", current->type); - do { - if (!first) - fprintf(out, "\t"); - first = ISC_FALSE; - fprintf(out, - "\tserial = %lu, ttl = %u, " - "trust = %u, attributes = %u\n", - (unsigned long)current->serial, - current->rdh_ttl, - current->trust, - current->attributes); - current = current->down; - } while (current != NULL); - } - } else - fprintf(out, "(empty)\n"); - - NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_read); + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + dns_rbtnode_t *rbtnode = node; + isc_boolean_t first; + + REQUIRE(VALID_RBTDB(rbtdb)); + + NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_read); + + fprintf(out, "node %p, %u references, locknum = %u\n", + rbtnode, dns_rbtnode_refcurrent(rbtnode), + rbtnode->locknum); + if (rbtnode->data != NULL) { + rdatasetheader_t *current, *top_next; + + for (current = rbtnode->data; current != NULL; + current = top_next) { + top_next = current->next; + first = ISC_TRUE; + fprintf(out, "\ttype %u", current->type); + do { + if (!first) + fprintf(out, "\t"); + first = ISC_FALSE; + fprintf(out, + "\tserial = %lu, ttl = %u, " + "trust = %u, attributes = %u\n", + (unsigned long)current->serial, + current->rdh_ttl, + current->trust, + current->attributes); + current = current->down; + } while (current != NULL); + } + } else + fprintf(out, "(empty)\n"); + + NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_read); } static isc_result_t createiterator(dns_db_t *db, isc_boolean_t relative_names, - dns_dbiterator_t **iteratorp) + dns_dbiterator_t **iteratorp) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - rbtdb_dbiterator_t *rbtdbiter; - - REQUIRE(VALID_RBTDB(rbtdb)); - - rbtdbiter = isc_mem_get(rbtdb->common.mctx, sizeof(*rbtdbiter)); - if (rbtdbiter == NULL) - return (ISC_R_NOMEMORY); - - rbtdbiter->common.methods = &dbiterator_methods; - rbtdbiter->common.db = NULL; - dns_db_attach(db, &rbtdbiter->common.db); - rbtdbiter->common.relative_names = relative_names; - rbtdbiter->common.magic = DNS_DBITERATOR_MAGIC; - rbtdbiter->common.cleaning = ISC_FALSE; - rbtdbiter->paused = ISC_TRUE; - rbtdbiter->tree_locked = isc_rwlocktype_none; - rbtdbiter->result = ISC_R_SUCCESS; - dns_fixedname_init(&rbtdbiter->name); - dns_fixedname_init(&rbtdbiter->origin); - rbtdbiter->node = NULL; - rbtdbiter->delete = 0; - memset(rbtdbiter->deletions, 0, sizeof(rbtdbiter->deletions)); - dns_rbtnodechain_init(&rbtdbiter->chain, db->mctx); - - *iteratorp = (dns_dbiterator_t *)rbtdbiter; - - return (ISC_R_SUCCESS); + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + rbtdb_dbiterator_t *rbtdbiter; + + REQUIRE(VALID_RBTDB(rbtdb)); + + rbtdbiter = isc_mem_get(rbtdb->common.mctx, sizeof(*rbtdbiter)); + if (rbtdbiter == NULL) + return (ISC_R_NOMEMORY); + + rbtdbiter->common.methods = &dbiterator_methods; + rbtdbiter->common.db = NULL; + dns_db_attach(db, &rbtdbiter->common.db); + rbtdbiter->common.relative_names = relative_names; + rbtdbiter->common.magic = DNS_DBITERATOR_MAGIC; + rbtdbiter->common.cleaning = ISC_FALSE; + rbtdbiter->paused = ISC_TRUE; + rbtdbiter->tree_locked = isc_rwlocktype_none; + rbtdbiter->result = ISC_R_SUCCESS; + dns_fixedname_init(&rbtdbiter->name); + dns_fixedname_init(&rbtdbiter->origin); + rbtdbiter->node = NULL; + rbtdbiter->delete = 0; + memset(rbtdbiter->deletions, 0, sizeof(rbtdbiter->deletions)); + dns_rbtnodechain_init(&rbtdbiter->chain, db->mctx); + + *iteratorp = (dns_dbiterator_t *)rbtdbiter; + + return (ISC_R_SUCCESS); } static isc_result_t zone_findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, - dns_rdatatype_t type, dns_rdatatype_t covers, - isc_stdtime_t now, dns_rdataset_t *rdataset, - dns_rdataset_t *sigrdataset) + dns_rdatatype_t type, dns_rdatatype_t covers, + isc_stdtime_t now, dns_rdataset_t *rdataset, + dns_rdataset_t *sigrdataset) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node; - rdatasetheader_t *header, *header_next, *found, *foundsig; - rbtdb_serial_t serial; - rbtdb_version_t *rbtversion = version; - isc_boolean_t close_version = ISC_FALSE; - rbtdb_rdatatype_t matchtype, sigmatchtype; - - REQUIRE(VALID_RBTDB(rbtdb)); - REQUIRE(type != dns_rdatatype_any); - - if (rbtversion == NULL) { - currentversion(db, (dns_dbversion_t **) (void *)(&rbtversion)); - close_version = ISC_TRUE; - } - serial = rbtversion->serial; - now = 0; - - NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_read); - - found = NULL; - foundsig = NULL; - matchtype = RBTDB_RDATATYPE_VALUE(type, covers); - if (covers == 0) - sigmatchtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, type); - else - sigmatchtype = 0; - - for (header = rbtnode->data; header != NULL; header = header_next) { - header_next = header->next; - do { - if (header->serial <= serial && - !IGNORE(header)) { - /* - * Is this a "this rdataset doesn't - * exist" record? - */ - if (NONEXISTENT(header)) - header = NULL; - break; - } else - header = header->down; - } while (header != NULL); - if (header != NULL) { - /* - * We have an active, extant rdataset. If it's a - * type we're looking for, remember it. - */ - if (header->type == matchtype) { - found = header; - if (foundsig != NULL) - break; - } else if (header->type == sigmatchtype) { - foundsig = header; - if (found != NULL) - break; - } - } - } - if (found != NULL) { - bind_rdataset(rbtdb, rbtnode, found, now, rdataset); - if (foundsig != NULL) - bind_rdataset(rbtdb, rbtnode, foundsig, now, - sigrdataset); - } - - NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_read); - - if (close_version) - closeversion(db, (dns_dbversion_t **) (void *)(&rbtversion), - ISC_FALSE); - - if (found == NULL) - return (ISC_R_NOTFOUND); - - return (ISC_R_SUCCESS); + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node; + rdatasetheader_t *header, *header_next, *found, *foundsig; + rbtdb_serial_t serial; + rbtdb_version_t *rbtversion = version; + isc_boolean_t close_version = ISC_FALSE; + rbtdb_rdatatype_t matchtype, sigmatchtype; + + REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(type != dns_rdatatype_any); + + if (rbtversion == NULL) { + currentversion(db, (dns_dbversion_t **) (void *)(&rbtversion)); + close_version = ISC_TRUE; + } + serial = rbtversion->serial; + now = 0; + + NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_read); + + found = NULL; + foundsig = NULL; + matchtype = RBTDB_RDATATYPE_VALUE(type, covers); + if (covers == 0) + sigmatchtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, type); + else + sigmatchtype = 0; + + for (header = rbtnode->data; header != NULL; header = header_next) { + header_next = header->next; + do { + if (header->serial <= serial && + !IGNORE(header)) { + /* + * Is this a "this rdataset doesn't + * exist" record? + */ + if (NONEXISTENT(header)) + header = NULL; + break; + } else + header = header->down; + } while (header != NULL); + if (header != NULL) { + /* + * We have an active, extant rdataset. If it's a + * type we're looking for, remember it. + */ + if (header->type == matchtype) { + found = header; + if (foundsig != NULL) + break; + } else if (header->type == sigmatchtype) { + foundsig = header; + if (found != NULL) + break; + } + } + } + if (found != NULL) { + bind_rdataset(rbtdb, rbtnode, found, now, rdataset); + if (foundsig != NULL) + bind_rdataset(rbtdb, rbtnode, foundsig, now, + sigrdataset); + } + + NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_read); + + if (close_version) + closeversion(db, (dns_dbversion_t **) (void *)(&rbtversion), + ISC_FALSE); + + if (found == NULL) + return (ISC_R_NOTFOUND); + + return (ISC_R_SUCCESS); } static isc_result_t cache_findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, - dns_rdatatype_t type, dns_rdatatype_t covers, - isc_stdtime_t now, dns_rdataset_t *rdataset, - dns_rdataset_t *sigrdataset) + dns_rdatatype_t type, dns_rdatatype_t covers, + isc_stdtime_t now, dns_rdataset_t *rdataset, + dns_rdataset_t *sigrdataset) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node; - rdatasetheader_t *header, *header_next, *found, *foundsig; - rbtdb_rdatatype_t matchtype, sigmatchtype, negtype; - isc_result_t result; - nodelock_t *lock; - isc_rwlocktype_t locktype; - - REQUIRE(VALID_RBTDB(rbtdb)); - REQUIRE(type != dns_rdatatype_any); - - UNUSED(version); - - result = ISC_R_SUCCESS; - - if (now == 0) - isc_stdtime_get(&now); - - lock = &rbtdb->node_locks[rbtnode->locknum].lock; - locktype = isc_rwlocktype_read; - NODE_LOCK(lock, locktype); - - found = NULL; - foundsig = NULL; - matchtype = RBTDB_RDATATYPE_VALUE(type, covers); - negtype = RBTDB_RDATATYPE_VALUE(0, type); - if (covers == 0) - sigmatchtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, type); - else - sigmatchtype = 0; - - for (header = rbtnode->data; header != NULL; header = header_next) { - header_next = header->next; - if (header->rdh_ttl <= now) { - if ((header->rdh_ttl <= now - RBTDB_VIRTUAL) && - (locktype == isc_rwlocktype_write || - NODE_TRYUPGRADE(lock) == ISC_R_SUCCESS)) { - /* - * We update the node's status only when we - * can get write access. - */ - locktype = isc_rwlocktype_write; - - /* - * We don't check if refcurrent(rbtnode) == 0 - * and try to free like we do in cache_find(), - * because refcurrent(rbtnode) must be - * non-zero. This is so because 'node' is an - * argument to the function. - */ - header->attributes |= RDATASET_ATTR_STALE; - rbtnode->dirty = 1; - } - } else if (EXISTS(header)) { - if (header->type == matchtype) - found = header; - else if (header->type == RBTDB_RDATATYPE_NCACHEANY || - header->type == negtype) - found = header; - else if (header->type == sigmatchtype) - foundsig = header; - } - } - if (found != NULL) { - bind_rdataset(rbtdb, rbtnode, found, now, rdataset); - if (foundsig != NULL) - bind_rdataset(rbtdb, rbtnode, foundsig, now, - sigrdataset); - } - - NODE_UNLOCK(lock, locktype); - - if (found == NULL) - return (ISC_R_NOTFOUND); - - if (RBTDB_RDATATYPE_BASE(found->type) == 0) { - /* - * We found a negative cache entry. - */ - if (NXDOMAIN(found)) - result = DNS_R_NCACHENXDOMAIN; - else - result = DNS_R_NCACHENXRRSET; - } - - return (result); + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node; + rdatasetheader_t *header, *header_next, *found, *foundsig; + rbtdb_rdatatype_t matchtype, sigmatchtype, negtype; + isc_result_t result; + nodelock_t *lock; + isc_rwlocktype_t locktype; + + REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(type != dns_rdatatype_any); + + UNUSED(version); + + result = ISC_R_SUCCESS; + + if (now == 0) + isc_stdtime_get(&now); + + lock = &rbtdb->node_locks[rbtnode->locknum].lock; + locktype = isc_rwlocktype_read; + NODE_LOCK(lock, locktype); + + found = NULL; + foundsig = NULL; + matchtype = RBTDB_RDATATYPE_VALUE(type, covers); + negtype = RBTDB_RDATATYPE_VALUE(0, type); + if (covers == 0) + sigmatchtype = RBTDB_RDATATYPE_VALUE(dns_rdatatype_rrsig, type); + else + sigmatchtype = 0; + + for (header = rbtnode->data; header != NULL; header = header_next) { + header_next = header->next; + if (header->rdh_ttl <= now) { + if ((header->rdh_ttl <= now - RBTDB_VIRTUAL) && + (locktype == isc_rwlocktype_write || + NODE_TRYUPGRADE(lock) == ISC_R_SUCCESS)) { + /* + * We update the node's status only when we + * can get write access. + */ + locktype = isc_rwlocktype_write; + + /* + * We don't check if refcurrent(rbtnode) == 0 + * and try to free like we do in cache_find(), + * because refcurrent(rbtnode) must be + * non-zero. This is so because 'node' is an + * argument to the function. + */ + header->attributes |= RDATASET_ATTR_STALE; + rbtnode->dirty = 1; + } + } else if (EXISTS(header)) { + if (header->type == matchtype) + found = header; + else if (header->type == RBTDB_RDATATYPE_NCACHEANY || + header->type == negtype) + found = header; + else if (header->type == sigmatchtype) + foundsig = header; + } + } + if (found != NULL) { + bind_rdataset(rbtdb, rbtnode, found, now, rdataset); + if (foundsig != NULL) + bind_rdataset(rbtdb, rbtnode, foundsig, now, + sigrdataset); + } + + NODE_UNLOCK(lock, locktype); + + if (found == NULL) + return (ISC_R_NOTFOUND); + + if (RBTDB_RDATATYPE_BASE(found->type) == 0) { + /* + * We found a negative cache entry. + */ + if (NXDOMAIN(found)) + result = DNS_R_NCACHENXDOMAIN; + else + result = DNS_R_NCACHENXRRSET; + } + + return (result); } static isc_result_t allrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, - isc_stdtime_t now, dns_rdatasetiter_t **iteratorp) + isc_stdtime_t now, dns_rdatasetiter_t **iteratorp) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node; - rbtdb_version_t *rbtversion = version; - rbtdb_rdatasetiter_t *iterator; - unsigned int refs; - - REQUIRE(VALID_RBTDB(rbtdb)); - - iterator = isc_mem_get(rbtdb->common.mctx, sizeof(*iterator)); - if (iterator == NULL) - return (ISC_R_NOMEMORY); - - if ((db->attributes & DNS_DBATTR_CACHE) == 0) { - now = 0; - if (rbtversion == NULL) - currentversion(db, - (dns_dbversion_t **) (void *)(&rbtversion)); - else { - unsigned int refs; - - isc_refcount_increment(&rbtversion->references, - &refs); - INSIST(refs > 1); - } - } else { - if (now == 0) - isc_stdtime_get(&now); - rbtversion = NULL; - } - - iterator->common.magic = DNS_RDATASETITER_MAGIC; - iterator->common.methods = &rdatasetiter_methods; - iterator->common.db = db; - iterator->common.node = node; - iterator->common.version = (dns_dbversion_t *)rbtversion; - iterator->common.now = now; - - NODE_STRONGLOCK(&rbtdb->node_locks[rbtnode->locknum].lock); - - dns_rbtnode_refincrement(rbtnode, &refs); - INSIST(refs != 0); - - iterator->current = NULL; - - NODE_STRONGUNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock); - - *iteratorp = (dns_rdatasetiter_t *)iterator; - - return (ISC_R_SUCCESS); + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node; + rbtdb_version_t *rbtversion = version; + rbtdb_rdatasetiter_t *iterator; + unsigned int refs; + + REQUIRE(VALID_RBTDB(rbtdb)); + + iterator = isc_mem_get(rbtdb->common.mctx, sizeof(*iterator)); + if (iterator == NULL) + return (ISC_R_NOMEMORY); + + if ((db->attributes & DNS_DBATTR_CACHE) == 0) { + now = 0; + if (rbtversion == NULL) + currentversion(db, + (dns_dbversion_t **) (void *)(&rbtversion)); + else { + unsigned int refs; + + isc_refcount_increment(&rbtversion->references, + &refs); + INSIST(refs > 1); + } + } else { + if (now == 0) + isc_stdtime_get(&now); + rbtversion = NULL; + } + + iterator->common.magic = DNS_RDATASETITER_MAGIC; + iterator->common.methods = &rdatasetiter_methods; + iterator->common.db = db; + iterator->common.node = node; + iterator->common.version = (dns_dbversion_t *)rbtversion; + iterator->common.now = now; + + NODE_STRONGLOCK(&rbtdb->node_locks[rbtnode->locknum].lock); + + dns_rbtnode_refincrement(rbtnode, &refs); + INSIST(refs != 0); + + iterator->current = NULL; + + NODE_STRONGUNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock); + + *iteratorp = (dns_rdatasetiter_t *)iterator; + + return (ISC_R_SUCCESS); } static isc_boolean_t cname_and_other_data(dns_rbtnode_t *node, rbtdb_serial_t serial) { - rdatasetheader_t *header, *header_next; - isc_boolean_t cname, other_data; - dns_rdatatype_t rdtype; - - /* - * The caller must hold the node lock. - */ - - /* - * Look for CNAME and "other data" rdatasets active in our version. - */ - cname = ISC_FALSE; - other_data = ISC_FALSE; - for (header = node->data; header != NULL; header = header_next) { - header_next = header->next; - if (header->type == dns_rdatatype_cname) { - /* - * Look for an active extant CNAME. - */ - do { - if (header->serial <= serial && - !IGNORE(header)) { - /* - * Is this a "this rdataset doesn't - * exist" record? - */ - if (NONEXISTENT(header)) - header = NULL; - break; - } else - header = header->down; - } while (header != NULL); - if (header != NULL) - cname = ISC_TRUE; - } else { - /* - * Look for active extant "other data". - * - * "Other data" is any rdataset whose type is not - * KEY, RRSIG KEY, NSEC, RRSIG NSEC or RRSIG CNAME. - */ - rdtype = RBTDB_RDATATYPE_BASE(header->type); - if (rdtype == dns_rdatatype_rrsig || - rdtype == dns_rdatatype_sig) - rdtype = RBTDB_RDATATYPE_EXT(header->type); - if (rdtype != dns_rdatatype_nsec && - rdtype != dns_rdatatype_key && - rdtype != dns_rdatatype_cname) { - /* - * We've found a type that isn't - * NSEC, KEY, CNAME, or one of their - * signatures. Is it active and extant? - */ - do { - if (header->serial <= serial && - !IGNORE(header)) { - /* - * Is this a "this rdataset - * doesn't exist" record? - */ - if (NONEXISTENT(header)) - header = NULL; - break; - } else - header = header->down; - } while (header != NULL); - if (header != NULL) - other_data = ISC_TRUE; - } - } - } - - if (cname && other_data) - return (ISC_TRUE); - - return (ISC_FALSE); + rdatasetheader_t *header, *header_next; + isc_boolean_t cname, other_data; + dns_rdatatype_t rdtype; + + /* + * The caller must hold the node lock. + */ + + /* + * Look for CNAME and "other data" rdatasets active in our version. + */ + cname = ISC_FALSE; + other_data = ISC_FALSE; + for (header = node->data; header != NULL; header = header_next) { + header_next = header->next; + if (header->type == dns_rdatatype_cname) { + /* + * Look for an active extant CNAME. + */ + do { + if (header->serial <= serial && + !IGNORE(header)) { + /* + * Is this a "this rdataset doesn't + * exist" record? + */ + if (NONEXISTENT(header)) + header = NULL; + break; + } else + header = header->down; + } while (header != NULL); + if (header != NULL) + cname = ISC_TRUE; + } else { + /* + * Look for active extant "other data". + * + * "Other data" is any rdataset whose type is not + * KEY, RRSIG KEY, NSEC, RRSIG NSEC or RRSIG CNAME. + */ + rdtype = RBTDB_RDATATYPE_BASE(header->type); + if (rdtype == dns_rdatatype_rrsig || + rdtype == dns_rdatatype_sig) + rdtype = RBTDB_RDATATYPE_EXT(header->type); + if (rdtype != dns_rdatatype_nsec && + rdtype != dns_rdatatype_key && + rdtype != dns_rdatatype_cname) { + /* + * We've found a type that isn't + * NSEC, KEY, CNAME, or one of their + * signatures. Is it active and extant? + */ + do { + if (header->serial <= serial && + !IGNORE(header)) { + /* + * Is this a "this rdataset + * doesn't exist" record? + */ + if (NONEXISTENT(header)) + header = NULL; + break; + } else + header = header->down; + } while (header != NULL); + if (header != NULL) + other_data = ISC_TRUE; + } + } + } + + if (cname && other_data) + return (ISC_TRUE); + + return (ISC_FALSE); } -#ifdef LRU_DEBUG -static void -cachestat_update(dns_rbtdb_t *rbtdb, rdatasetheader_t *header) { - if ((header->attributes & RDATASET_ATTR_CACHE) == 0) - return; - - /* XXX: don't use lock for brevity */ - rbtdb->cachestat.cache_total++; - if (RBTDB_RDATATYPE_BASE(header->type) == 0) - rbtdb->cachestat.ncache_total++; - if (header->type == dns_rdatatype_a) - rbtdb->cachestat.a_total++; - else if (header->type == dns_rdatatype_aaaa) - rbtdb->cachestat.aaaa_total++; - else if (header->type == dns_rdatatype_ns) - rbtdb->cachestat.ns_total++; - else if (header->type == dns_rdatatype_ptr) - rbtdb->cachestat.ptr_total++; - - if (header->trust == dns_trust_glue && - (header->type == dns_rdatatype_a || - header->type == dns_rdatatype_aaaa)) { - rbtdb->cachestat.glue_total++; - } - if (header->trust == dns_trust_additional && - (header->type == dns_rdatatype_a || - header->type == dns_rdatatype_aaaa)) { - rbtdb->cachestat.additional_total++; - } -} -#endif - static isc_result_t add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion, rdatasetheader_t *newheader, unsigned int options, isc_boolean_t loading, dns_rdataset_t *addedrdataset, isc_stdtime_t now) { - rbtdb_changed_t *changed = NULL; - rdatasetheader_t *topheader, *topheader_prev, *header; - 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; - dns_trust_t trust; - - /* - * Add an rdatasetheader_t to a node. - */ - - /* - * Caller must be holding the node lock. - */ - - if ((options & DNS_DBADD_MERGE) != 0) { - REQUIRE(rbtversion != NULL); - merge = ISC_TRUE; - } else - merge = ISC_FALSE; - - if ((options & DNS_DBADD_FORCE) != 0) - trust = dns_trust_ultimate; - else - trust = newheader->trust; - - if (rbtversion != NULL && !loading) { - /* - * We always add a changed record, even if no changes end up - * being made to this node, because it's harmless and - * simplifies the code. - */ - changed = add_changed(rbtdb, rbtversion, rbtnode); - if (changed == NULL) { - free_rdataset(rbtdb, rbtdb->common.mctx, newheader); - return (ISC_R_NOMEMORY); - } - } - - newheader_nx = NONEXISTENT(newheader) ? ISC_TRUE : ISC_FALSE; - topheader_prev = NULL; - - negtype = 0; - if (rbtversion == NULL && !newheader_nx) { - rdtype = RBTDB_RDATATYPE_BASE(newheader->type); - if (rdtype == 0) { - /* - * We're adding a negative cache entry. - */ - covers = RBTDB_RDATATYPE_EXT(newheader->type); - if (covers == dns_rdatatype_any) { - /* - * 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. - */ - for (topheader = rbtnode->data; - topheader != NULL; - topheader = topheader->next) { - set_ttl(rbtdb, topheader, 0); - topheader->attributes |= - RDATASET_ATTR_STALE; - } - rbtnode->dirty = 1; - goto find_header; - } - negtype = RBTDB_RDATATYPE_VALUE(covers, 0); - } else { - /* - * We're adding something that isn't a - * negative cache entry. Look for an extant - * non-stale NXDOMAIN/NODATA(QTYPE=ANY) negative - * cache entry. - */ - for (topheader = rbtnode->data; - topheader != NULL; - topheader = topheader->next) { - if (topheader->type == - RBTDB_RDATATYPE_NCACHEANY) - break; - } - if (topheader != NULL && EXISTS(topheader) && - topheader->rdh_ttl > now) { - /* - * Found one. - */ - if (trust < topheader->trust) { - /* - * The NXDOMAIN/NODATA(QTYPE=ANY) - * is more trusted. - */ - /* set the flag for debug */ - newheader->attributes |= - RDATASET_ATTR_CANCELED; - free_rdataset(rbtdb, - rbtdb->common.mctx, - newheader); - if (addedrdataset != NULL) - bind_rdataset(rbtdb, rbtnode, - topheader, now, - addedrdataset); - return (DNS_R_UNCHANGED); - } - /* - * The new rdataset is better. Expire the - * NXDOMAIN/NODATA(QTYPE=ANY). - */ - set_ttl(rbtdb, topheader, 0); - topheader->attributes |= RDATASET_ATTR_STALE; - rbtnode->dirty = 1; - topheader = NULL; - goto find_header; - } - negtype = RBTDB_RDATATYPE_VALUE(0, rdtype); - } - } - - for (topheader = rbtnode->data; - topheader != NULL; - topheader = topheader->next) { - if (topheader->type == newheader->type || - topheader->type == negtype) - break; - topheader_prev = topheader; - } + rbtdb_changed_t *changed = NULL; + rdatasetheader_t *topheader, *topheader_prev, *header; + 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; + dns_trust_t trust; + + /* + * Add an rdatasetheader_t to a node. + */ + + /* + * Caller must be holding the node lock. + */ + + if ((options & DNS_DBADD_MERGE) != 0) { + REQUIRE(rbtversion != NULL); + merge = ISC_TRUE; + } else + merge = ISC_FALSE; + + if ((options & DNS_DBADD_FORCE) != 0) + trust = dns_trust_ultimate; + else + trust = newheader->trust; + + if (rbtversion != NULL && !loading) { + /* + * We always add a changed record, even if no changes end up + * being made to this node, because it's harmless and + * simplifies the code. + */ + changed = add_changed(rbtdb, rbtversion, rbtnode); + if (changed == NULL) { + free_rdataset(rbtdb, rbtdb->common.mctx, newheader); + return (ISC_R_NOMEMORY); + } + } + + newheader_nx = NONEXISTENT(newheader) ? ISC_TRUE : ISC_FALSE; + topheader_prev = NULL; + + negtype = 0; + if (rbtversion == NULL && !newheader_nx) { + rdtype = RBTDB_RDATATYPE_BASE(newheader->type); + if (rdtype == 0) { + /* + * We're adding a negative cache entry. + */ + covers = RBTDB_RDATATYPE_EXT(newheader->type); + if (covers == dns_rdatatype_any) { + /* + * 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. + */ + for (topheader = rbtnode->data; + topheader != NULL; + topheader = topheader->next) { + set_ttl(rbtdb, topheader, 0); + topheader->attributes |= + RDATASET_ATTR_STALE; + } + rbtnode->dirty = 1; + goto find_header; + } + negtype = RBTDB_RDATATYPE_VALUE(covers, 0); + } else { + /* + * We're adding something that isn't a + * negative cache entry. Look for an extant + * non-stale NXDOMAIN/NODATA(QTYPE=ANY) negative + * cache entry. + */ + for (topheader = rbtnode->data; + topheader != NULL; + topheader = topheader->next) { + if (topheader->type == + RBTDB_RDATATYPE_NCACHEANY) + break; + } + if (topheader != NULL && EXISTS(topheader) && + topheader->rdh_ttl > now) { + /* + * Found one. + */ + if (trust < topheader->trust) { + /* + * The NXDOMAIN/NODATA(QTYPE=ANY) + * is more trusted. + */ + free_rdataset(rbtdb, + rbtdb->common.mctx, + newheader); + if (addedrdataset != NULL) + bind_rdataset(rbtdb, rbtnode, + topheader, now, + addedrdataset); + return (DNS_R_UNCHANGED); + } + /* + * The new rdataset is better. Expire the + * NXDOMAIN/NODATA(QTYPE=ANY). + */ + set_ttl(rbtdb, topheader, 0); + topheader->attributes |= RDATASET_ATTR_STALE; + rbtnode->dirty = 1; + topheader = NULL; + goto find_header; + } + negtype = RBTDB_RDATATYPE_VALUE(0, rdtype); + } + } + + for (topheader = rbtnode->data; + topheader != NULL; + topheader = topheader->next) { + if (topheader->type == newheader->type || + topheader->type == negtype) + break; + topheader_prev = topheader; + } find_header: - /* - * If header isn't NULL, we've found the right type. There may be - * IGNORE rdatasets between the top of the chain and the first real - * data. We skip over them. - */ - header = topheader; - while (header != NULL && IGNORE(header)) - header = header->down; - if (header != NULL) { - header_nx = NONEXISTENT(header) ? ISC_TRUE : ISC_FALSE; - - /* - * Deleting an already non-existent rdataset has no effect. - */ - if (header_nx && newheader_nx) { - free_rdataset(rbtdb, rbtdb->common.mctx, newheader); - return (DNS_R_UNCHANGED); - } - - /* - * Trying to add an rdataset with lower trust to a cache DB - * has no effect, provided that the cache data isn't stale. - */ - if (rbtversion == NULL && trust < header->trust && - (header->rdh_ttl > now || header_nx)) { - newheader->attributes |= RDATASET_ATTR_CANCELED; - free_rdataset(rbtdb, rbtdb->common.mctx, newheader); - if (addedrdataset != NULL) - bind_rdataset(rbtdb, rbtnode, header, now, - addedrdataset); - return (DNS_R_UNCHANGED); - } - - /* - * Don't merge if a nonexistent rdataset is involved. - */ - if (merge && (header_nx || newheader_nx)) - merge = ISC_FALSE; - - /* - * If 'merge' is ISC_TRUE, we'll try to create a new rdataset - * that is the union of 'newheader' and 'header'. - */ - if (merge) { - unsigned int flags = 0; - INSIST(rbtversion->serial >= header->serial); - merged = NULL; - result = ISC_R_SUCCESS; - - if ((options & DNS_DBADD_EXACT) != 0) - flags |= DNS_RDATASLAB_EXACT; - if ((options & DNS_DBADD_EXACTTTL) != 0 && - newheader->rdh_ttl != header->rdh_ttl) - result = DNS_R_NOTEXACT; - else if (newheader->rdh_ttl != header->rdh_ttl) - flags |= DNS_RDATASLAB_FORCE; - if (result == ISC_R_SUCCESS) - result = dns_rdataslab_merge( - (unsigned char *)header, - (unsigned char *)newheader, - (unsigned int)(sizeof(*newheader)), - rbtdb->common.mctx, - rbtdb->common.rdclass, - (dns_rdatatype_t)header->type, - flags, &merged); - if (result == ISC_R_SUCCESS) { - /* - * If 'header' has the same serial number as - * we do, we could clean it up now if we knew - * that our caller had no references to it. - * We don't know this, however, so we leave it - * alone. It will get cleaned up when - * clean_zone_node() runs. - */ - free_rdataset(rbtdb, rbtdb->common.mctx, - newheader); - newheader = (rdatasetheader_t *)merged; - } else { - free_rdataset(rbtdb, rbtdb->common.mctx, - newheader); - return (result); - } - } - /* - * Don't replace existing NS, A and AAAA RRsets - * in the cache if they are already exist. This - * prevents named being locked to old servers. - * Don't lower trust of existing record if the - * update is forced. - */ - if (IS_CACHE(rbtdb) && header->rdh_ttl > now && - header->type == dns_rdatatype_ns && - !header_nx && !newheader_nx && - header->trust >= newheader->trust && - dns_rdataslab_equalx((unsigned char *)header, - (unsigned char *)newheader, - (unsigned int)(sizeof(*newheader)), - rbtdb->common.rdclass, - (dns_rdatatype_t)header->type)) { - /* - * Honour the new ttl if it is less than the - * older one. - */ - if (header->rdh_ttl > newheader->rdh_ttl) - set_ttl(rbtdb, header, newheader->rdh_ttl); - if (header->noqname == NULL && - newheader->noqname != NULL) { - header->noqname = newheader->noqname; - newheader->noqname = NULL; - } - newheader->attributes |= RDATASET_ATTR_CANCELED; - free_rdataset(rbtdb, rbtdb->common.mctx, newheader); - if (addedrdataset != NULL) - bind_rdataset(rbtdb, rbtnode, header, now, - addedrdataset); - return (ISC_R_SUCCESS); - } - if (IS_CACHE(rbtdb) && header->rdh_ttl > now && - (header->type == dns_rdatatype_a || - header->type == dns_rdatatype_aaaa) && - !header_nx && !newheader_nx && - header->trust >= newheader->trust && - dns_rdataslab_equal((unsigned char *)header, - (unsigned char *)newheader, - (unsigned int)(sizeof(*newheader)))) { - /* - * Honour the new ttl if it is less than the - * older one. - */ - if (header->rdh_ttl > newheader->rdh_ttl) - set_ttl(rbtdb, header, newheader->rdh_ttl); - if (header->noqname == NULL && - newheader->noqname != NULL) { - header->noqname = newheader->noqname; - newheader->noqname = NULL; - } - newheader->attributes |= RDATASET_ATTR_CANCELED; - free_rdataset(rbtdb, rbtdb->common.mctx, newheader); - if (addedrdataset != NULL) - bind_rdataset(rbtdb, rbtnode, header, now, - addedrdataset); - return (ISC_R_SUCCESS); - } - INSIST(rbtversion == NULL || - rbtversion->serial >= topheader->serial); - if (topheader_prev != NULL) - topheader_prev->next = newheader; - else - rbtnode->data = newheader; - newheader->next = topheader->next; - if (loading) { - /* - * There are no other references to 'header' when - * loading, so we MAY clean up 'header' now. - * Since we don't generate changed records when - * loading, we MUST clean up 'header' now. - */ - newheader->down = NULL; - free_rdataset(rbtdb, rbtdb->common.mctx, header); - } else { - newheader->down = topheader; - topheader->next = newheader; - rbtnode->dirty = 1; - if (changed != NULL) - changed->dirty = ISC_TRUE; - if (rbtversion == NULL) { - set_ttl(rbtdb, header, 0); - header->attributes |= RDATASET_ATTR_STALE; - } - if (IS_CACHE(rbtdb)) { - int idx = newheader->node->locknum; - - ISC_LIST_PREPEND(rbtdb->rdatasets[idx], - newheader, lru_link); - - /* - * XXXMLG We don't check the return value - * here. If it fails, we will not do TTL - * based expiry on this node. However, we - * will do it on the LRU side, so memory - * will not leak... for long. - */ - isc_heap_insert(rbtdb->heaps[idx], newheader); - } -#ifdef LRU_DEBUG - cachestat_update(rbtdb, newheader); -#endif - } - } else { - /* - * No non-IGNORED rdatasets of the given type exist at - * this node. - */ - - /* - * If we're trying to delete the type, don't bother. - */ - if (newheader_nx) { - free_rdataset(rbtdb, rbtdb->common.mctx, newheader); - return (DNS_R_UNCHANGED); - } - - if (topheader != NULL) { - /* - * We have an list of rdatasets of the given type, - * but they're all marked IGNORE. We simply insert - * the new rdataset at the head of the list. - * - * Ignored rdatasets cannot occur during loading, so - * we INSIST on it. - */ - INSIST(!loading); - INSIST(rbtversion == NULL || - rbtversion->serial >= topheader->serial); - if (topheader_prev != NULL) - topheader_prev->next = newheader; - else - rbtnode->data = newheader; - newheader->next = topheader->next; - newheader->down = topheader; - topheader->next = newheader; - rbtnode->dirty = 1; - if (changed != NULL) - changed->dirty = ISC_TRUE; - } else { - /* - * No rdatasets of the given type exist at the node. - */ - newheader->next = rbtnode->data; - newheader->down = NULL; - rbtnode->data = newheader; - } - if (IS_CACHE(rbtdb)) { - int idx = newheader->node->locknum; - ISC_LIST_PREPEND(rbtdb->rdatasets[idx], - newheader, lru_link); - isc_heap_insert(rbtdb->heaps[idx], newheader); - } -#ifdef LRU_DEBUG - cachestat_update(rbtdb, newheader); -#endif - } - - /* - * Check if the node now contains CNAME and other data. - */ - if (rbtversion != NULL && - cname_and_other_data(rbtnode, rbtversion->serial)) - return (DNS_R_CNAMEANDOTHER); - - if (addedrdataset != NULL) - bind_rdataset(rbtdb, rbtnode, newheader, now, addedrdataset); - - return (ISC_R_SUCCESS); + /* + * If header isn't NULL, we've found the right type. There may be + * IGNORE rdatasets between the top of the chain and the first real + * data. We skip over them. + */ + header = topheader; + while (header != NULL && IGNORE(header)) + header = header->down; + if (header != NULL) { + header_nx = NONEXISTENT(header) ? ISC_TRUE : ISC_FALSE; + + /* + * Deleting an already non-existent rdataset has no effect. + */ + if (header_nx && newheader_nx) { + free_rdataset(rbtdb, rbtdb->common.mctx, newheader); + return (DNS_R_UNCHANGED); + } + + /* + * Trying to add an rdataset with lower trust to a cache DB + * has no effect, provided that the cache data isn't stale. + */ + if (rbtversion == NULL && trust < header->trust && + (header->rdh_ttl > now || header_nx)) { + free_rdataset(rbtdb, rbtdb->common.mctx, newheader); + if (addedrdataset != NULL) + bind_rdataset(rbtdb, rbtnode, header, now, + addedrdataset); + return (DNS_R_UNCHANGED); + } + + /* + * Don't merge if a nonexistent rdataset is involved. + */ + if (merge && (header_nx || newheader_nx)) + merge = ISC_FALSE; + + /* + * If 'merge' is ISC_TRUE, we'll try to create a new rdataset + * that is the union of 'newheader' and 'header'. + */ + if (merge) { + unsigned int flags = 0; + INSIST(rbtversion->serial >= header->serial); + merged = NULL; + result = ISC_R_SUCCESS; + + if ((options & DNS_DBADD_EXACT) != 0) + flags |= DNS_RDATASLAB_EXACT; + if ((options & DNS_DBADD_EXACTTTL) != 0 && + newheader->rdh_ttl != header->rdh_ttl) + result = DNS_R_NOTEXACT; + else if (newheader->rdh_ttl != header->rdh_ttl) + flags |= DNS_RDATASLAB_FORCE; + if (result == ISC_R_SUCCESS) + result = dns_rdataslab_merge( + (unsigned char *)header, + (unsigned char *)newheader, + (unsigned int)(sizeof(*newheader)), + rbtdb->common.mctx, + rbtdb->common.rdclass, + (dns_rdatatype_t)header->type, + flags, &merged); + if (result == ISC_R_SUCCESS) { + /* + * If 'header' has the same serial number as + * we do, we could clean it up now if we knew + * that our caller had no references to it. + * We don't know this, however, so we leave it + * alone. It will get cleaned up when + * clean_zone_node() runs. + */ + free_rdataset(rbtdb, rbtdb->common.mctx, + newheader); + newheader = (rdatasetheader_t *)merged; + } else { + free_rdataset(rbtdb, rbtdb->common.mctx, + newheader); + return (result); + } + } + /* + * Don't replace existing NS, A and AAAA RRsets + * in the cache if they are already exist. This + * prevents named being locked to old servers. + * Don't lower trust of existing record if the + * update is forced. + */ + if (IS_CACHE(rbtdb) && header->rdh_ttl > now && + header->type == dns_rdatatype_ns && + !header_nx && !newheader_nx && + header->trust >= newheader->trust && + dns_rdataslab_equalx((unsigned char *)header, + (unsigned char *)newheader, + (unsigned int)(sizeof(*newheader)), + rbtdb->common.rdclass, + (dns_rdatatype_t)header->type)) { + /* + * Honour the new ttl if it is less than the + * older one. + */ + if (header->rdh_ttl > newheader->rdh_ttl) + set_ttl(rbtdb, header, newheader->rdh_ttl); + if (header->noqname == NULL && + newheader->noqname != NULL) { + header->noqname = newheader->noqname; + newheader->noqname = NULL; + } + free_rdataset(rbtdb, rbtdb->common.mctx, newheader); + if (addedrdataset != NULL) + bind_rdataset(rbtdb, rbtnode, header, now, + addedrdataset); + return (ISC_R_SUCCESS); + } + if (IS_CACHE(rbtdb) && header->rdh_ttl > now && + (header->type == dns_rdatatype_a || + header->type == dns_rdatatype_aaaa) && + !header_nx && !newheader_nx && + header->trust >= newheader->trust && + dns_rdataslab_equal((unsigned char *)header, + (unsigned char *)newheader, + (unsigned int)(sizeof(*newheader)))) { + /* + * Honour the new ttl if it is less than the + * older one. + */ + if (header->rdh_ttl > newheader->rdh_ttl) + set_ttl(rbtdb, header, newheader->rdh_ttl); + if (header->noqname == NULL && + newheader->noqname != NULL) { + header->noqname = newheader->noqname; + newheader->noqname = NULL; + } + free_rdataset(rbtdb, rbtdb->common.mctx, newheader); + if (addedrdataset != NULL) + bind_rdataset(rbtdb, rbtnode, header, now, + addedrdataset); + return (ISC_R_SUCCESS); + } + INSIST(rbtversion == NULL || + rbtversion->serial >= topheader->serial); + if (topheader_prev != NULL) + topheader_prev->next = newheader; + else + rbtnode->data = newheader; + newheader->next = topheader->next; + if (loading) { + /* + * There are no other references to 'header' when + * loading, so we MAY clean up 'header' now. + * Since we don't generate changed records when + * loading, we MUST clean up 'header' now. + */ + newheader->down = NULL; + free_rdataset(rbtdb, rbtdb->common.mctx, header); + } else { + newheader->down = topheader; + topheader->next = newheader; + rbtnode->dirty = 1; + if (changed != NULL) + changed->dirty = ISC_TRUE; + if (rbtversion == NULL) { + set_ttl(rbtdb, header, 0); + header->attributes |= RDATASET_ATTR_STALE; + } + if (IS_CACHE(rbtdb)) { + int idx = newheader->node->locknum; + + ISC_LIST_PREPEND(rbtdb->rdatasets[idx], + newheader, lru_link); + + /* + * XXXMLG We don't check the return value + * here. If it fails, we will not do TTL + * based expiry on this node. However, we + * will do it on the LRU side, so memory + * will not leak... for long. + */ + isc_heap_insert(rbtdb->heaps[idx], newheader); + } + } + } else { + /* + * No non-IGNORED rdatasets of the given type exist at + * this node. + */ + + /* + * If we're trying to delete the type, don't bother. + */ + if (newheader_nx) { + free_rdataset(rbtdb, rbtdb->common.mctx, newheader); + return (DNS_R_UNCHANGED); + } + + if (topheader != NULL) { + /* + * We have an list of rdatasets of the given type, + * but they're all marked IGNORE. We simply insert + * the new rdataset at the head of the list. + * + * Ignored rdatasets cannot occur during loading, so + * we INSIST on it. + */ + INSIST(!loading); + INSIST(rbtversion == NULL || + rbtversion->serial >= topheader->serial); + if (topheader_prev != NULL) + topheader_prev->next = newheader; + else + rbtnode->data = newheader; + newheader->next = topheader->next; + newheader->down = topheader; + topheader->next = newheader; + rbtnode->dirty = 1; + if (changed != NULL) + changed->dirty = ISC_TRUE; + } else { + /* + * No rdatasets of the given type exist at the node. + */ + newheader->next = rbtnode->data; + newheader->down = NULL; + rbtnode->data = newheader; + } + if (IS_CACHE(rbtdb)) { + int idx = newheader->node->locknum; + ISC_LIST_PREPEND(rbtdb->rdatasets[idx], + newheader, lru_link); + isc_heap_insert(rbtdb->heaps[idx], newheader); + } + } + + /* + * Check if the node now contains CNAME and other data. + */ + if (rbtversion != NULL && + cname_and_other_data(rbtnode, rbtversion->serial)) + return (DNS_R_CNAMEANDOTHER); + + if (addedrdataset != NULL) + bind_rdataset(rbtdb, rbtnode, newheader, now, addedrdataset); + + return (ISC_R_SUCCESS); } static inline isc_boolean_t delegating_type(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node, - rbtdb_rdatatype_t type) + rbtdb_rdatatype_t type) { - if (IS_CACHE(rbtdb)) { - if (type == dns_rdatatype_dname) - return (ISC_TRUE); - else - return (ISC_FALSE); - } else if (type == dns_rdatatype_dname || - (type == dns_rdatatype_ns && - (node != rbtdb->origin_node || IS_STUB(rbtdb)))) - return (ISC_TRUE); - return (ISC_FALSE); + if (IS_CACHE(rbtdb)) { + if (type == dns_rdatatype_dname) + return (ISC_TRUE); + else + return (ISC_FALSE); + } else if (type == dns_rdatatype_dname || + (type == dns_rdatatype_ns && + (node != rbtdb->origin_node || IS_STUB(rbtdb)))) + return (ISC_TRUE); + return (ISC_FALSE); } static inline isc_result_t addnoqname(dns_rbtdb_t *rbtdb, rdatasetheader_t *newheader, - dns_rdataset_t *rdataset) + dns_rdataset_t *rdataset) { - struct noqname *noqname; - isc_mem_t *mctx = rbtdb->common.mctx; - dns_name_t name; - dns_rdataset_t nsec, nsecsig; - isc_result_t result; - isc_region_t r; - - dns_name_init(&name, NULL); - dns_rdataset_init(&nsec); - dns_rdataset_init(&nsecsig); - - result = dns_rdataset_getnoqname(rdataset, &name, &nsec, &nsecsig); - RUNTIME_CHECK(result == ISC_R_SUCCESS); - - noqname = isc_mem_get(mctx, sizeof(*noqname)); - if (noqname == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup; - } - dns_name_init(&noqname->name, NULL); - noqname->nsec = NULL; - noqname->nsecsig = NULL; - result = dns_name_dup(&name, mctx, &noqname->name); - if (result != ISC_R_SUCCESS) - goto cleanup; - result = dns_rdataslab_fromrdataset(&nsec, mctx, &r, 0); - if (result != ISC_R_SUCCESS) - goto cleanup; - noqname->nsec = r.base; - result = dns_rdataslab_fromrdataset(&nsecsig, mctx, &r, 0); - if (result != ISC_R_SUCCESS) - goto cleanup; - noqname->nsecsig = r.base; - dns_rdataset_disassociate(&nsec); - dns_rdataset_disassociate(&nsecsig); - newheader->noqname = noqname; - return (ISC_R_SUCCESS); + struct noqname *noqname; + isc_mem_t *mctx = rbtdb->common.mctx; + dns_name_t name; + dns_rdataset_t nsec, nsecsig; + isc_result_t result; + isc_region_t r; + + dns_name_init(&name, NULL); + dns_rdataset_init(&nsec); + dns_rdataset_init(&nsecsig); + + result = dns_rdataset_getnoqname(rdataset, &name, &nsec, &nsecsig); + RUNTIME_CHECK(result == ISC_R_SUCCESS); + + noqname = isc_mem_get(mctx, sizeof(*noqname)); + if (noqname == NULL) { + result = ISC_R_NOMEMORY; + goto cleanup; + } + dns_name_init(&noqname->name, NULL); + noqname->nsec = NULL; + noqname->nsecsig = NULL; + result = dns_name_dup(&name, mctx, &noqname->name); + if (result != ISC_R_SUCCESS) + goto cleanup; + result = dns_rdataslab_fromrdataset(&nsec, mctx, &r, 0); + if (result != ISC_R_SUCCESS) + goto cleanup; + noqname->nsec = r.base; + result = dns_rdataslab_fromrdataset(&nsecsig, mctx, &r, 0); + if (result != ISC_R_SUCCESS) + goto cleanup; + noqname->nsecsig = r.base; + dns_rdataset_disassociate(&nsec); + dns_rdataset_disassociate(&nsecsig); + newheader->noqname = noqname; + return (ISC_R_SUCCESS); cleanup: - dns_rdataset_disassociate(&nsec); - dns_rdataset_disassociate(&nsecsig); - free_noqname(mctx, &noqname); - return(result); + dns_rdataset_disassociate(&nsec); + dns_rdataset_disassociate(&nsecsig); + free_noqname(mctx, &noqname); + return(result); } static isc_result_t addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, - isc_stdtime_t now, dns_rdataset_t *rdataset, unsigned int options, - dns_rdataset_t *addedrdataset) + isc_stdtime_t now, dns_rdataset_t *rdataset, unsigned int options, + dns_rdataset_t *addedrdataset) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node; - rbtdb_version_t *rbtversion = version; - isc_region_t region; - rdatasetheader_t *newheader; - isc_result_t result; - isc_boolean_t delegating; - isc_boolean_t tree_locked = ISC_FALSE; - - REQUIRE(VALID_RBTDB(rbtdb)); - - if (rbtversion == NULL) { - if (now == 0) - isc_stdtime_get(&now); - } else - now = 0; - - result = dns_rdataslab_fromrdataset(rdataset, rbtdb->common.mctx, - ®ion, - sizeof(rdatasetheader_t)); - if (result != ISC_R_SUCCESS) - return (result); - - newheader = (rdatasetheader_t *)region.base; - init_rdataset(rbtdb, newheader); - set_ttl(rbtdb, newheader, rdataset->ttl + now); - newheader->type = RBTDB_RDATATYPE_VALUE(rdataset->type, - rdataset->covers); - newheader->attributes = 0; - newheader->noqname = NULL; - newheader->count = init_count++; - newheader->trust = rdataset->trust; - newheader->additional_auth = NULL; - newheader->additional_glue = NULL; - newheader->last_used = now; - newheader->node = rbtnode; - if (rbtversion != NULL) { - newheader->serial = rbtversion->serial; - now = 0; - } else { - newheader->serial = 1; - if ((rdataset->attributes & DNS_RDATASETATTR_NXDOMAIN) != 0) - newheader->attributes |= RDATASET_ATTR_NXDOMAIN; - if ((rdataset->attributes & DNS_RDATASETATTR_NOQNAME) != 0) { - result = addnoqname(rbtdb, newheader, rdataset); - if (result != ISC_R_SUCCESS) { - free_rdataset(rbtdb, rbtdb->common.mctx, - newheader); - return (result); - } - } - } - - /* - * If we're adding a delegation type (e.g. NS or DNAME for a zone, - * just DNAME for the cache), then we need to set the callback bit - * on the node. - */ - if (delegating_type(rbtdb, rbtnode, rdataset->type)) - delegating = ISC_TRUE; - else - delegating = ISC_FALSE; - - /* - * If we're adding a delegation type or the DB is a cache in an overmem - * state, hold an exclusive lock on the tree. In the latter case - * 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)) { - tree_locked = ISC_TRUE; - RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_write); - } - - NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_write); - -#ifdef LRU_DEBUG - /* for debug: statistics update */ - if (IS_CACHE(rbtdb) && rdataset->rdclass == dns_rdataclass_in) { - /* XXX: don't use lock for brevity */ - newheader->attributes |= RDATASET_ATTR_CACHE; - rbtdb->cachestat.cache_total++; - rbtdb->cachestat.cache_current++; - if (rdataset->type == 0) { - rbtdb->cachestat.ncache_total++; - rbtdb->cachestat.ncache_current++; - } - if (rdataset->type == dns_rdatatype_a) { - rbtdb->cachestat.a_total++; - rbtdb->cachestat.a_current++; - } else if (rdataset->type == dns_rdatatype_aaaa) { - rbtdb->cachestat.aaaa_total++; - rbtdb->cachestat.aaaa_current++; - } else if (rdataset->type == dns_rdatatype_ns) { - rbtdb->cachestat.ns_total++; - rbtdb->cachestat.ns_current++; - } else if (rdataset->type == dns_rdatatype_ptr) { - rbtdb->cachestat.ptr_total++; - rbtdb->cachestat.ptr_current++; - } - if (rdataset->trust == dns_trust_glue && - (rdataset->type == dns_rdatatype_a || - rdataset->type == dns_rdatatype_aaaa)) { - rbtdb->cachestat.glue_total++; - rbtdb->cachestat.glue_current++; - } - if (rdataset->trust == dns_trust_additional && - (rdataset->type == dns_rdatatype_a || - rdataset->type == dns_rdatatype_aaaa)) { - rbtdb->cachestat.additional_total++; - rbtdb->cachestat.additional_current++; - } - } -#endif - - if (IS_CACHE(rbtdb)) { - if (tree_locked) - cleanup_dead_nodes(rbtdb, rbtnode->locknum); - check_stale_cache(rbtdb, rbtnode, now, tree_locked); - - /* - * If we've been holding a write lock on the tree just for - * cleaning, we can release it now. However, we still need the - * node lock. - */ - if (tree_locked && !delegating) { - RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_write); - tree_locked = ISC_FALSE; - } - } - - result = add(rbtdb, rbtnode, rbtversion, newheader, options, ISC_FALSE, - addedrdataset, now); - if (result == ISC_R_SUCCESS && delegating) - rbtnode->find_callback = 1; - - NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_write); - - if (tree_locked) - RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_write); - - /* - * Update the zone's secure status. If version is non-NULL - * this is defered until closeversion() is called. - */ - if (result == ISC_R_SUCCESS && version == NULL && !IS_CACHE(rbtdb)) - rbtdb->secure = iszonesecure(db, rbtdb->origin_node); - - return (result); + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node; + rbtdb_version_t *rbtversion = version; + isc_region_t region; + rdatasetheader_t *newheader; + isc_result_t result; + isc_boolean_t delegating; + isc_boolean_t tree_locked = ISC_FALSE; + + REQUIRE(VALID_RBTDB(rbtdb)); + + if (rbtversion == NULL) { + if (now == 0) + isc_stdtime_get(&now); + } else + now = 0; + + result = dns_rdataslab_fromrdataset(rdataset, rbtdb->common.mctx, + ®ion, + sizeof(rdatasetheader_t)); + if (result != ISC_R_SUCCESS) + return (result); + + newheader = (rdatasetheader_t *)region.base; + init_rdataset(rbtdb, newheader); + set_ttl(rbtdb, newheader, rdataset->ttl + now); + newheader->type = RBTDB_RDATATYPE_VALUE(rdataset->type, + rdataset->covers); + newheader->attributes = 0; + newheader->noqname = NULL; + newheader->count = init_count++; + newheader->trust = rdataset->trust; + newheader->additional_auth = NULL; + newheader->additional_glue = NULL; + newheader->last_used = now; + newheader->node = rbtnode; + if (rbtversion != NULL) { + newheader->serial = rbtversion->serial; + now = 0; + } else { + newheader->serial = 1; + if ((rdataset->attributes & DNS_RDATASETATTR_NXDOMAIN) != 0) + newheader->attributes |= RDATASET_ATTR_NXDOMAIN; + if ((rdataset->attributes & DNS_RDATASETATTR_NOQNAME) != 0) { + result = addnoqname(rbtdb, newheader, rdataset); + if (result != ISC_R_SUCCESS) { + free_rdataset(rbtdb, rbtdb->common.mctx, + newheader); + return (result); + } + } + } + + /* + * If we're adding a delegation type (e.g. NS or DNAME for a zone, + * just DNAME for the cache), then we need to set the callback bit + * on the node. + */ + if (delegating_type(rbtdb, rbtnode, rdataset->type)) + delegating = ISC_TRUE; + else + delegating = ISC_FALSE; + + /* + * If we're adding a delegation type or the DB is a cache in an overmem + * state, hold an exclusive lock on the tree. In the latter case + * 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)) { + tree_locked = ISC_TRUE; + RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_write); + } + + NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_write); + + if (rbtdb->rrsetstats != NULL) { + newheader->attributes |= RDATASET_ATTR_STATCOUNT; + update_rrsetstats(rbtdb, newheader, ISC_TRUE); + } + + if (IS_CACHE(rbtdb)) { + if (tree_locked) + cleanup_dead_nodes(rbtdb, rbtnode->locknum); + check_stale_cache(rbtdb, rbtnode, now, tree_locked); + + /* + * If we've been holding a write lock on the tree just for + * cleaning, we can release it now. However, we still need the + * node lock. + */ + if (tree_locked && !delegating) { + RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_write); + tree_locked = ISC_FALSE; + } + } + + result = add(rbtdb, rbtnode, rbtversion, newheader, options, ISC_FALSE, + addedrdataset, now); + if (result == ISC_R_SUCCESS && delegating) + rbtnode->find_callback = 1; + + NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_write); + + if (tree_locked) + RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_write); + + /* + * Update the zone's secure status. If version is non-NULL + * this is defered until closeversion() is called. + */ + if (result == ISC_R_SUCCESS && version == NULL && !IS_CACHE(rbtdb)) + rbtdb->secure = iszonesecure(db, rbtdb->origin_node); + + return (result); } static isc_result_t subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, - dns_rdataset_t *rdataset, unsigned int options, - dns_rdataset_t *newrdataset) + dns_rdataset_t *rdataset, unsigned int options, + dns_rdataset_t *newrdataset) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node; - rbtdb_version_t *rbtversion = version; - rdatasetheader_t *topheader, *topheader_prev, *header, *newheader; - unsigned char *subresult; - isc_region_t region; - isc_result_t result; - rbtdb_changed_t *changed; - - REQUIRE(VALID_RBTDB(rbtdb)); - - result = dns_rdataslab_fromrdataset(rdataset, rbtdb->common.mctx, - ®ion, - sizeof(rdatasetheader_t)); - if (result != ISC_R_SUCCESS) - return (result); - newheader = (rdatasetheader_t *)region.base; - init_rdataset(rbtdb, newheader); - set_ttl(rbtdb, newheader, rdataset->ttl); - newheader->type = RBTDB_RDATATYPE_VALUE(rdataset->type, - rdataset->covers); - newheader->attributes = 0; - newheader->serial = rbtversion->serial; - newheader->trust = 0; - newheader->noqname = NULL; - newheader->count = init_count++; - newheader->additional_auth = NULL; - newheader->additional_glue = NULL; - newheader->last_used = 0; - newheader->node = rbtnode; - - NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_write); - - changed = add_changed(rbtdb, rbtversion, rbtnode); - if (changed == NULL) { - free_rdataset(rbtdb, rbtdb->common.mctx, newheader); - NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_write); - return (ISC_R_NOMEMORY); - } - - topheader_prev = NULL; - for (topheader = rbtnode->data; - topheader != NULL; - topheader = topheader->next) { - if (topheader->type == newheader->type) - break; - topheader_prev = topheader; - } - /* - * If header isn't NULL, we've found the right type. There may be - * IGNORE rdatasets between the top of the chain and the first real - * data. We skip over them. - */ - header = topheader; - while (header != NULL && IGNORE(header)) - header = header->down; - if (header != NULL && EXISTS(header)) { - unsigned int flags = 0; - subresult = NULL; - result = ISC_R_SUCCESS; - if ((options & DNS_DBSUB_EXACT) != 0) { - flags |= DNS_RDATASLAB_EXACT; - if (newheader->rdh_ttl != header->rdh_ttl) - result = DNS_R_NOTEXACT; - } - if (result == ISC_R_SUCCESS) - result = dns_rdataslab_subtract( - (unsigned char *)header, - (unsigned char *)newheader, - (unsigned int)(sizeof(*newheader)), - rbtdb->common.mctx, - rbtdb->common.rdclass, - (dns_rdatatype_t)header->type, - flags, &subresult); - if (result == ISC_R_SUCCESS) { - free_rdataset(rbtdb, rbtdb->common.mctx, newheader); - newheader = (rdatasetheader_t *)subresult; - /* - * We have to set the serial since the rdataslab - * subtraction routine copies the reserved portion of - * header, not newheader. - */ - newheader->serial = rbtversion->serial; - /* - * XXXJT: dns_rdataslab_subtract() copied the pointers - * to additional info. We need to clear these fields - * to avoid having duplicated references. - */ - newheader->additional_auth = NULL; - newheader->additional_glue = NULL; - } else if (result == DNS_R_NXRRSET) { - /* - * This subtraction would remove all of the rdata; - * add a nonexistent header instead. - */ - free_rdataset(rbtdb, rbtdb->common.mctx, newheader); - newheader = new_rdataset(rbtdb, rbtdb->common.mctx); - if (newheader == NULL) { - result = ISC_R_NOMEMORY; - goto unlock; - } - set_ttl(rbtdb, newheader, 0); - newheader->type = topheader->type; - newheader->attributes = RDATASET_ATTR_NONEXISTENT; - newheader->trust = 0; - newheader->serial = rbtversion->serial; - newheader->noqname = NULL; - newheader->count = 0; - newheader->additional_auth = NULL; - newheader->additional_glue = NULL; - } else { - free_rdataset(rbtdb, rbtdb->common.mctx, newheader); - goto unlock; - } - - /* - * If we're here, we want to link newheader in front of - * topheader. - */ - INSIST(rbtversion->serial >= topheader->serial); - if (topheader_prev != NULL) - topheader_prev->next = newheader; - else - rbtnode->data = newheader; - newheader->next = topheader->next; - newheader->down = topheader; - topheader->next = newheader; - rbtnode->dirty = 1; - changed->dirty = ISC_TRUE; - } else { - /* - * The rdataset doesn't exist, so we don't need to do anything - * to satisfy the deletion request. - */ - free_rdataset(rbtdb, rbtdb->common.mctx, newheader); - if ((options & DNS_DBSUB_EXACT) != 0) - result = DNS_R_NOTEXACT; - else - result = DNS_R_UNCHANGED; - } - - if (result == ISC_R_SUCCESS && newrdataset != NULL) - bind_rdataset(rbtdb, rbtnode, newheader, 0, newrdataset); + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node; + rbtdb_version_t *rbtversion = version; + rdatasetheader_t *topheader, *topheader_prev, *header, *newheader; + unsigned char *subresult; + isc_region_t region; + isc_result_t result; + rbtdb_changed_t *changed; + + REQUIRE(VALID_RBTDB(rbtdb)); + + result = dns_rdataslab_fromrdataset(rdataset, rbtdb->common.mctx, + ®ion, + sizeof(rdatasetheader_t)); + if (result != ISC_R_SUCCESS) + return (result); + newheader = (rdatasetheader_t *)region.base; + init_rdataset(rbtdb, newheader); + set_ttl(rbtdb, newheader, rdataset->ttl); + newheader->type = RBTDB_RDATATYPE_VALUE(rdataset->type, + rdataset->covers); + newheader->attributes = 0; + newheader->serial = rbtversion->serial; + newheader->trust = 0; + newheader->noqname = NULL; + newheader->count = init_count++; + newheader->additional_auth = NULL; + newheader->additional_glue = NULL; + newheader->last_used = 0; + newheader->node = rbtnode; + + NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_write); + + changed = add_changed(rbtdb, rbtversion, rbtnode); + if (changed == NULL) { + free_rdataset(rbtdb, rbtdb->common.mctx, newheader); + NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_write); + return (ISC_R_NOMEMORY); + } + + topheader_prev = NULL; + for (topheader = rbtnode->data; + topheader != NULL; + topheader = topheader->next) { + if (topheader->type == newheader->type) + break; + topheader_prev = topheader; + } + /* + * If header isn't NULL, we've found the right type. There may be + * IGNORE rdatasets between the top of the chain and the first real + * data. We skip over them. + */ + header = topheader; + while (header != NULL && IGNORE(header)) + header = header->down; + if (header != NULL && EXISTS(header)) { + unsigned int flags = 0; + subresult = NULL; + result = ISC_R_SUCCESS; + if ((options & DNS_DBSUB_EXACT) != 0) { + flags |= DNS_RDATASLAB_EXACT; + if (newheader->rdh_ttl != header->rdh_ttl) + result = DNS_R_NOTEXACT; + } + if (result == ISC_R_SUCCESS) + result = dns_rdataslab_subtract( + (unsigned char *)header, + (unsigned char *)newheader, + (unsigned int)(sizeof(*newheader)), + rbtdb->common.mctx, + rbtdb->common.rdclass, + (dns_rdatatype_t)header->type, + flags, &subresult); + if (result == ISC_R_SUCCESS) { + free_rdataset(rbtdb, rbtdb->common.mctx, newheader); + newheader = (rdatasetheader_t *)subresult; + /* + * We have to set the serial since the rdataslab + * subtraction routine copies the reserved portion of + * header, not newheader. + */ + newheader->serial = rbtversion->serial; + /* + * XXXJT: dns_rdataslab_subtract() copied the pointers + * to additional info. We need to clear these fields + * to avoid having duplicated references. + */ + newheader->additional_auth = NULL; + newheader->additional_glue = NULL; + } else if (result == DNS_R_NXRRSET) { + /* + * This subtraction would remove all of the rdata; + * add a nonexistent header instead. + */ + free_rdataset(rbtdb, rbtdb->common.mctx, newheader); + newheader = new_rdataset(rbtdb, rbtdb->common.mctx); + if (newheader == NULL) { + result = ISC_R_NOMEMORY; + goto unlock; + } + set_ttl(rbtdb, newheader, 0); + newheader->type = topheader->type; + newheader->attributes = RDATASET_ATTR_NONEXISTENT; + newheader->trust = 0; + newheader->serial = rbtversion->serial; + newheader->noqname = NULL; + newheader->count = 0; + newheader->additional_auth = NULL; + newheader->additional_glue = NULL; + newheader->node = rbtnode; + newheader->last_used = 0; + } else { + free_rdataset(rbtdb, rbtdb->common.mctx, newheader); + goto unlock; + } + + /* + * If we're here, we want to link newheader in front of + * topheader. + */ + INSIST(rbtversion->serial >= topheader->serial); + if (topheader_prev != NULL) + topheader_prev->next = newheader; + else + rbtnode->data = newheader; + newheader->next = topheader->next; + newheader->down = topheader; + topheader->next = newheader; + rbtnode->dirty = 1; + changed->dirty = ISC_TRUE; + } else { + /* + * The rdataset doesn't exist, so we don't need to do anything + * to satisfy the deletion request. + */ + free_rdataset(rbtdb, rbtdb->common.mctx, newheader); + if ((options & DNS_DBSUB_EXACT) != 0) + result = DNS_R_NOTEXACT; + else + result = DNS_R_UNCHANGED; + } + + if (result == ISC_R_SUCCESS && newrdataset != NULL) + bind_rdataset(rbtdb, rbtnode, newheader, 0, newrdataset); unlock: - NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_write); + NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_write); - /* - * Update the zone's secure status. If version is non-NULL - * this is defered until closeversion() is called. - */ - if (result == ISC_R_SUCCESS && version == NULL && !IS_CACHE(rbtdb)) - rbtdb->secure = iszonesecure(db, rbtdb->origin_node); + /* + * Update the zone's secure status. If version is non-NULL + * this is defered until closeversion() is called. + */ + if (result == ISC_R_SUCCESS && version == NULL && !IS_CACHE(rbtdb)) + rbtdb->secure = iszonesecure(db, rbtdb->origin_node); - return (result); + return (result); } static isc_result_t deleterdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, - dns_rdatatype_t type, dns_rdatatype_t covers) + dns_rdatatype_t type, dns_rdatatype_t covers) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node; - rbtdb_version_t *rbtversion = version; - isc_result_t result; - rdatasetheader_t *newheader; - - REQUIRE(VALID_RBTDB(rbtdb)); - - if (type == dns_rdatatype_any) - return (ISC_R_NOTIMPLEMENTED); - if (type == dns_rdatatype_rrsig && covers == 0) - return (ISC_R_NOTIMPLEMENTED); - - newheader = new_rdataset(rbtdb, rbtdb->common.mctx); - if (newheader == NULL) - return (ISC_R_NOMEMORY); - set_ttl(rbtdb, newheader, 0); - newheader->type = RBTDB_RDATATYPE_VALUE(type, covers); - newheader->attributes = RDATASET_ATTR_NONEXISTENT; - newheader->trust = 0; - newheader->noqname = NULL; - newheader->additional_auth = NULL; - newheader->additional_glue = NULL; - if (rbtversion != NULL) - newheader->serial = rbtversion->serial; - else - newheader->serial = 0; - newheader->count = 0; - newheader->last_used = 0; - newheader->node = rbtnode; - - NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_write); - - result = add(rbtdb, rbtnode, rbtversion, newheader, DNS_DBADD_FORCE, - ISC_FALSE, NULL, 0); - - NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_write); - - /* - * Update the zone's secure status. If version is non-NULL - * this is defered until closeversion() is called. - */ - if (result == ISC_R_SUCCESS && version == NULL && !IS_CACHE(rbtdb)) - rbtdb->secure = iszonesecure(db, rbtdb->origin_node); - - return (result); + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node; + rbtdb_version_t *rbtversion = version; + isc_result_t result; + rdatasetheader_t *newheader; + + REQUIRE(VALID_RBTDB(rbtdb)); + + if (type == dns_rdatatype_any) + return (ISC_R_NOTIMPLEMENTED); + if (type == dns_rdatatype_rrsig && covers == 0) + return (ISC_R_NOTIMPLEMENTED); + + newheader = new_rdataset(rbtdb, rbtdb->common.mctx); + if (newheader == NULL) + return (ISC_R_NOMEMORY); + set_ttl(rbtdb, newheader, 0); + newheader->type = RBTDB_RDATATYPE_VALUE(type, covers); + newheader->attributes = RDATASET_ATTR_NONEXISTENT; + newheader->trust = 0; + newheader->noqname = NULL; + newheader->additional_auth = NULL; + newheader->additional_glue = NULL; + if (rbtversion != NULL) + newheader->serial = rbtversion->serial; + else + newheader->serial = 0; + newheader->count = 0; + newheader->last_used = 0; + newheader->node = rbtnode; + + NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_write); + + result = add(rbtdb, rbtnode, rbtversion, newheader, DNS_DBADD_FORCE, + ISC_FALSE, NULL, 0); + + NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_write); + + /* + * Update the zone's secure status. If version is non-NULL + * this is defered until closeversion() is called. + */ + if (result == ISC_R_SUCCESS && version == NULL && !IS_CACHE(rbtdb)) + rbtdb->secure = iszonesecure(db, rbtdb->origin_node); + + return (result); } static isc_result_t loading_addrdataset(void *arg, dns_name_t *name, dns_rdataset_t *rdataset) { - rbtdb_load_t *loadctx = arg; - dns_rbtdb_t *rbtdb = loadctx->rbtdb; - dns_rbtnode_t *node; - isc_result_t result; - isc_region_t region; - rdatasetheader_t *newheader; - - /* - * This routine does no node locking. See comments in - * 'load' below for more information on loading and - * locking. - */ - - - /* - * SOA records are only allowed at top of zone. - */ - if (rdataset->type == dns_rdatatype_soa && - !IS_CACHE(rbtdb) && !dns_name_equal(name, &rbtdb->common.origin)) - return (DNS_R_NOTZONETOP); - - add_empty_wildcards(rbtdb, name); - - if (dns_name_iswildcard(name)) { - /* - * NS record owners cannot legally be wild cards. - */ - if (rdataset->type == dns_rdatatype_ns) - return (DNS_R_INVALIDNS); - result = add_wildcard_magic(rbtdb, name); - if (result != ISC_R_SUCCESS) - return (result); - } - - node = NULL; - result = dns_rbt_addnode(rbtdb->tree, name, &node); - if (result != ISC_R_SUCCESS && result != ISC_R_EXISTS) - return (result); - if (result != ISC_R_EXISTS) { - dns_name_t foundname; - dns_name_init(&foundname, NULL); - dns_rbt_namefromnode(node, &foundname); + rbtdb_load_t *loadctx = arg; + dns_rbtdb_t *rbtdb = loadctx->rbtdb; + dns_rbtnode_t *node; + isc_result_t result; + isc_region_t region; + rdatasetheader_t *newheader; + + /* + * This routine does no node locking. See comments in + * 'load' below for more information on loading and + * locking. + */ + + + /* + * SOA records are only allowed at top of zone. + */ + if (rdataset->type == dns_rdatatype_soa && + !IS_CACHE(rbtdb) && !dns_name_equal(name, &rbtdb->common.origin)) + return (DNS_R_NOTZONETOP); + + add_empty_wildcards(rbtdb, name); + + if (dns_name_iswildcard(name)) { + /* + * NS record owners cannot legally be wild cards. + */ + if (rdataset->type == dns_rdatatype_ns) + return (DNS_R_INVALIDNS); + result = add_wildcard_magic(rbtdb, name); + if (result != ISC_R_SUCCESS) + return (result); + } + + node = NULL; + result = dns_rbt_addnode(rbtdb->tree, name, &node); + if (result != ISC_R_SUCCESS && result != ISC_R_EXISTS) + return (result); + if (result != ISC_R_EXISTS) { + dns_name_t foundname; + dns_name_init(&foundname, NULL); + dns_rbt_namefromnode(node, &foundname); #ifdef DNS_RBT_USEHASH - node->locknum = node->hashval % rbtdb->node_lock_count; + node->locknum = node->hashval % rbtdb->node_lock_count; #else - node->locknum = dns_name_hash(&foundname, ISC_TRUE) % - rbtdb->node_lock_count; + node->locknum = dns_name_hash(&foundname, ISC_TRUE) % + rbtdb->node_lock_count; #endif - } - - result = dns_rdataslab_fromrdataset(rdataset, rbtdb->common.mctx, - ®ion, - sizeof(rdatasetheader_t)); - if (result != ISC_R_SUCCESS) - return (result); - newheader = (rdatasetheader_t *)region.base; - init_rdataset(rbtdb, newheader); - set_ttl(rbtdb, newheader, - rdataset->ttl + loadctx->now); /* XXX overflow check */ - newheader->type = RBTDB_RDATATYPE_VALUE(rdataset->type, - rdataset->covers); - newheader->attributes = 0; - newheader->trust = rdataset->trust; - newheader->serial = 1; - newheader->noqname = NULL; - newheader->count = init_count++; - newheader->additional_auth = NULL; - newheader->additional_glue = NULL; - /* won't be used, but initialize anyway */ - newheader->last_used = 0; - newheader->node = node; - - result = add(rbtdb, node, rbtdb->current_version, newheader, - DNS_DBADD_MERGE, ISC_TRUE, NULL, 0); - if (result == ISC_R_SUCCESS && - delegating_type(rbtdb, node, rdataset->type)) - node->find_callback = 1; - else if (result == DNS_R_UNCHANGED) - result = ISC_R_SUCCESS; - - return (result); + } + + result = dns_rdataslab_fromrdataset(rdataset, rbtdb->common.mctx, + ®ion, + sizeof(rdatasetheader_t)); + if (result != ISC_R_SUCCESS) + return (result); + newheader = (rdatasetheader_t *)region.base; + init_rdataset(rbtdb, newheader); + set_ttl(rbtdb, newheader, + rdataset->ttl + loadctx->now); /* XXX overflow check */ + newheader->type = RBTDB_RDATATYPE_VALUE(rdataset->type, + rdataset->covers); + newheader->attributes = 0; + newheader->trust = rdataset->trust; + newheader->serial = 1; + newheader->noqname = NULL; + newheader->count = init_count++; + newheader->additional_auth = NULL; + newheader->additional_glue = NULL; + /* won't be used, but initialize anyway */ + newheader->last_used = 0; + newheader->node = node; + + result = add(rbtdb, node, rbtdb->current_version, newheader, + DNS_DBADD_MERGE, ISC_TRUE, NULL, 0); + if (result == ISC_R_SUCCESS && + delegating_type(rbtdb, node, rdataset->type)) + node->find_callback = 1; + else if (result == DNS_R_UNCHANGED) + result = ISC_R_SUCCESS; + + return (result); } static isc_result_t beginload(dns_db_t *db, dns_addrdatasetfunc_t *addp, dns_dbload_t **dbloadp) { - rbtdb_load_t *loadctx; - dns_rbtdb_t *rbtdb; + rbtdb_load_t *loadctx; + dns_rbtdb_t *rbtdb; - rbtdb = (dns_rbtdb_t *)db; + rbtdb = (dns_rbtdb_t *)db; - REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(VALID_RBTDB(rbtdb)); - loadctx = isc_mem_get(rbtdb->common.mctx, sizeof(*loadctx)); - if (loadctx == NULL) - return (ISC_R_NOMEMORY); + loadctx = isc_mem_get(rbtdb->common.mctx, sizeof(*loadctx)); + if (loadctx == NULL) + return (ISC_R_NOMEMORY); - loadctx->rbtdb = rbtdb; - if (IS_CACHE(rbtdb)) - isc_stdtime_get(&loadctx->now); - else - loadctx->now = 0; + loadctx->rbtdb = rbtdb; + if (IS_CACHE(rbtdb)) + isc_stdtime_get(&loadctx->now); + else + loadctx->now = 0; - RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); + RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); - REQUIRE((rbtdb->attributes & (RBTDB_ATTR_LOADED|RBTDB_ATTR_LOADING)) - == 0); - rbtdb->attributes |= RBTDB_ATTR_LOADING; + REQUIRE((rbtdb->attributes & (RBTDB_ATTR_LOADED|RBTDB_ATTR_LOADING)) + == 0); + rbtdb->attributes |= RBTDB_ATTR_LOADING; - RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); + RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); - *addp = loading_addrdataset; - *dbloadp = loadctx; + *addp = loading_addrdataset; + *dbloadp = loadctx; - return (ISC_R_SUCCESS); + return (ISC_R_SUCCESS); } static isc_result_t endload(dns_db_t *db, dns_dbload_t **dbloadp) { - rbtdb_load_t *loadctx; - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + rbtdb_load_t *loadctx; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - REQUIRE(VALID_RBTDB(rbtdb)); - REQUIRE(dbloadp != NULL); - loadctx = *dbloadp; - REQUIRE(loadctx->rbtdb == rbtdb); + REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(dbloadp != NULL); + loadctx = *dbloadp; + REQUIRE(loadctx->rbtdb == rbtdb); - RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); + RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); - REQUIRE((rbtdb->attributes & RBTDB_ATTR_LOADING) != 0); - REQUIRE((rbtdb->attributes & RBTDB_ATTR_LOADED) == 0); + REQUIRE((rbtdb->attributes & RBTDB_ATTR_LOADING) != 0); + REQUIRE((rbtdb->attributes & RBTDB_ATTR_LOADED) == 0); - rbtdb->attributes &= ~RBTDB_ATTR_LOADING; - rbtdb->attributes |= RBTDB_ATTR_LOADED; + rbtdb->attributes &= ~RBTDB_ATTR_LOADING; + rbtdb->attributes |= RBTDB_ATTR_LOADED; - RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); + RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); - /* - * If there's a KEY rdataset at the zone origin containing a - * zone key, we consider the zone secure. - */ - if (! IS_CACHE(rbtdb)) - rbtdb->secure = iszonesecure(db, rbtdb->origin_node); + /* + * If there's a KEY rdataset at the zone origin containing a + * zone key, we consider the zone secure. + */ + if (! IS_CACHE(rbtdb)) + rbtdb->secure = iszonesecure(db, rbtdb->origin_node); - *dbloadp = NULL; + *dbloadp = NULL; - isc_mem_put(rbtdb->common.mctx, loadctx, sizeof(*loadctx)); + isc_mem_put(rbtdb->common.mctx, loadctx, sizeof(*loadctx)); - return (ISC_R_SUCCESS); + return (ISC_R_SUCCESS); } static isc_result_t dump(dns_db_t *db, dns_dbversion_t *version, const char *filename, dns_masterformat_t masterformat) { - dns_rbtdb_t *rbtdb; + dns_rbtdb_t *rbtdb; - rbtdb = (dns_rbtdb_t *)db; + rbtdb = (dns_rbtdb_t *)db; - REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(VALID_RBTDB(rbtdb)); - return (dns_master_dump2(rbtdb->common.mctx, db, version, - &dns_master_style_default, - filename, masterformat)); + return (dns_master_dump2(rbtdb->common.mctx, db, version, + &dns_master_style_default, + filename, masterformat)); } static void delete_callback(void *data, void *arg) { - dns_rbtdb_t *rbtdb = arg; - rdatasetheader_t *current, *next; + dns_rbtdb_t *rbtdb = arg; + rdatasetheader_t *current, *next; - for (current = data; current != NULL; current = next) { - next = current->next; - free_rdataset(rbtdb, rbtdb->common.mctx, current); - } + for (current = data; current != NULL; current = next) { + next = current->next; + free_rdataset(rbtdb, rbtdb->common.mctx, current); + } } static isc_boolean_t issecure(dns_db_t *db) { - dns_rbtdb_t *rbtdb; - isc_boolean_t secure; + dns_rbtdb_t *rbtdb; + isc_boolean_t secure; - rbtdb = (dns_rbtdb_t *)db; + rbtdb = (dns_rbtdb_t *)db; - REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(VALID_RBTDB(rbtdb)); - RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); - secure = rbtdb->secure; - RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); + RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); + secure = rbtdb->secure; + RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); - return (secure); + return (secure); } static unsigned int nodecount(dns_db_t *db) { - dns_rbtdb_t *rbtdb; - unsigned int count; + dns_rbtdb_t *rbtdb; + unsigned int count; - rbtdb = (dns_rbtdb_t *)db; + rbtdb = (dns_rbtdb_t *)db; - REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(VALID_RBTDB(rbtdb)); - RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); - count = dns_rbt_nodecount(rbtdb->tree); - RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); + RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); + count = dns_rbt_nodecount(rbtdb->tree); + RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); - return (count); + return (count); } static void settask(dns_db_t *db, isc_task_t *task) { - dns_rbtdb_t *rbtdb; + dns_rbtdb_t *rbtdb; - rbtdb = (dns_rbtdb_t *)db; + rbtdb = (dns_rbtdb_t *)db; - REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(VALID_RBTDB(rbtdb)); - RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); - if (rbtdb->task != NULL) - isc_task_detach(&rbtdb->task); - if (task != NULL) - isc_task_attach(task, &rbtdb->task); - RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); + RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); + if (rbtdb->task != NULL) + isc_task_detach(&rbtdb->task); + if (task != NULL) + isc_task_attach(task, &rbtdb->task); + RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); } static isc_boolean_t ispersistent(dns_db_t *db) { - UNUSED(db); - return (ISC_FALSE); + UNUSED(db); + return (ISC_FALSE); } static isc_result_t getoriginnode(dns_db_t *db, dns_dbnode_t **nodep) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; - dns_rbtnode_t *onode; - isc_result_t result = ISC_R_SUCCESS; - - REQUIRE(VALID_RBTDB(rbtdb)); - REQUIRE(nodep != NULL && *nodep == NULL); - - /* Note that the access to origin_node doesn't require a DB lock */ - onode = (dns_rbtnode_t *)rbtdb->origin_node; - if (onode != NULL) { - NODE_STRONGLOCK(&rbtdb->node_locks[onode->locknum].lock); - new_reference(rbtdb, onode); - NODE_STRONGUNLOCK(&rbtdb->node_locks[onode->locknum].lock); - - *nodep = rbtdb->origin_node; - } else { - INSIST(!IS_CACHE(rbtdb)); - result = ISC_R_NOTFOUND; - } - - return (result); + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + dns_rbtnode_t *onode; + isc_result_t result = ISC_R_SUCCESS; + + REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(nodep != NULL && *nodep == NULL); + + /* Note that the access to origin_node doesn't require a DB lock */ + onode = (dns_rbtnode_t *)rbtdb->origin_node; + if (onode != NULL) { + NODE_STRONGLOCK(&rbtdb->node_locks[onode->locknum].lock); + new_reference(rbtdb, onode); + NODE_STRONGUNLOCK(&rbtdb->node_locks[onode->locknum].lock); + + *nodep = rbtdb->origin_node; + } else { + INSIST(!IS_CACHE(rbtdb)); + result = ISC_R_NOTFOUND; + } + + return (result); +} + +static dns_stats_t * +getrrsetstats(dns_db_t *db) { + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + + REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(IS_CACHE(rbtdb)); /* current restriction */ + + return (rbtdb->rrsetstats); } static dns_dbmethods_t zone_methods = { - attach, - detach, - beginload, - endload, - dump, - currentversion, - newversion, - attachversion, - closeversion, - findnode, - zone_find, - zone_findzonecut, - attachnode, - detachnode, - expirenode, - printnode, - createiterator, - zone_findrdataset, - allrdatasets, - addrdataset, - subtractrdataset, - deleterdataset, - issecure, - nodecount, - ispersistent, - overmem, - settask, - getoriginnode, - NULL, + attach, + detach, + beginload, + endload, + dump, + currentversion, + newversion, + attachversion, + closeversion, + findnode, + zone_find, + zone_findzonecut, + attachnode, + detachnode, + expirenode, + printnode, + createiterator, + zone_findrdataset, + allrdatasets, + addrdataset, + subtractrdataset, + deleterdataset, + issecure, + nodecount, + ispersistent, + overmem, + settask, + getoriginnode, + NULL, + NULL }; static dns_dbmethods_t cache_methods = { - attach, - detach, - beginload, - endload, - dump, - currentversion, - newversion, - attachversion, - closeversion, - findnode, - cache_find, - cache_findzonecut, - attachnode, - detachnode, - expirenode, - printnode, - createiterator, - cache_findrdataset, - allrdatasets, - addrdataset, - subtractrdataset, - deleterdataset, - issecure, - nodecount, - ispersistent, - overmem, - settask, - getoriginnode, - NULL + attach, + detach, + beginload, + endload, + dump, + currentversion, + newversion, + attachversion, + closeversion, + findnode, + cache_find, + cache_findzonecut, + attachnode, + detachnode, + expirenode, + printnode, + createiterator, + cache_findrdataset, + allrdatasets, + addrdataset, + subtractrdataset, + deleterdataset, + issecure, + nodecount, + ispersistent, + overmem, + settask, + getoriginnode, + NULL, + getrrsetstats }; isc_result_t @@ -6087,263 +5913,268 @@ dns_rbtdb64_create #else dns_rbtdb_create #endif - (isc_mem_t *mctx, dns_name_t *origin, dns_dbtype_t type, - dns_rdataclass_t rdclass, unsigned int argc, char *argv[], - void *driverarg, dns_db_t **dbp) + (isc_mem_t *mctx, dns_name_t *origin, dns_dbtype_t type, + dns_rdataclass_t rdclass, unsigned int argc, char *argv[], + void *driverarg, dns_db_t **dbp) { - dns_rbtdb_t *rbtdb; - isc_result_t result; - int i; - dns_name_t name; - - /* Keep the compiler happy. */ - UNUSED(argc); - UNUSED(argv); - UNUSED(driverarg); - - rbtdb = isc_mem_get(mctx, sizeof(*rbtdb)); - if (rbtdb == NULL) - return (ISC_R_NOMEMORY); - - memset(rbtdb, '\0', sizeof(*rbtdb)); - dns_name_init(&rbtdb->common.origin, NULL); - rbtdb->common.attributes = 0; - if (type == dns_dbtype_cache) { - rbtdb->common.methods = &cache_methods; - rbtdb->common.attributes |= DNS_DBATTR_CACHE; - } else if (type == dns_dbtype_stub) { - rbtdb->common.methods = &zone_methods; - rbtdb->common.attributes |= DNS_DBATTR_STUB; - } else - rbtdb->common.methods = &zone_methods; - rbtdb->common.rdclass = rdclass; - rbtdb->common.mctx = NULL; - - result = RBTDB_INITLOCK(&rbtdb->lock); - if (result != ISC_R_SUCCESS) - goto cleanup_rbtdb; - - result = isc_rwlock_init(&rbtdb->tree_lock, 0, 0); - if (result != ISC_R_SUCCESS) - goto cleanup_lock; - - if (rbtdb->node_lock_count == 0) { - if (IS_CACHE(rbtdb)) - rbtdb->node_lock_count = DEFAULT_CACHE_NODE_LOCK_COUNT; - else - rbtdb->node_lock_count = DEFAULT_NODE_LOCK_COUNT; - } - INSIST(rbtdb->node_lock_count < (1 << DNS_RBT_LOCKLENGTH)); - rbtdb->node_locks = isc_mem_get(mctx, rbtdb->node_lock_count * - sizeof(rbtdb_nodelock_t)); - if (rbtdb->node_locks == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup_tree_lock; - } - - if (IS_CACHE(rbtdb)) { - rbtdb->rdatasets = isc_mem_get(mctx, rbtdb->node_lock_count * - sizeof(rdatasetheaderlist_t)); - if (rbtdb->rdatasets == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup_node_locks; - } - for (i = 0; i < (int)rbtdb->node_lock_count; i++) - ISC_LIST_INIT(rbtdb->rdatasets[i]); - - rbtdb->deadnodes = isc_mem_get(mctx, rbtdb->node_lock_count * - sizeof(rbtnodelist_t)); - if (rbtdb->deadnodes == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup_rdatasets; - } - for (i = 0; i < (int)rbtdb->node_lock_count; i++) - ISC_LIST_INIT(rbtdb->deadnodes[i]); - - /* - * Create the heaps. - */ - rbtdb->heaps = isc_mem_get(mctx, rbtdb->node_lock_count * - sizeof(isc_heap_t *)); - if (rbtdb->heaps == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup_deadnodes; - } - for (i = 0; i < (int)rbtdb->node_lock_count; i++) - rbtdb->heaps[i] = NULL; - for (i = 0; i < (int)rbtdb->node_lock_count; i++) { - result = isc_heap_create(mctx, ttl_sooner, - ttl_set_index, 0, - &rbtdb->heaps[i]); - if (result != ISC_R_SUCCESS) - goto cleanup_heaps; - } - } else { - rbtdb->rdatasets = NULL; - rbtdb->deadnodes = NULL; - rbtdb->heaps = NULL; - } - - rbtdb->active = rbtdb->node_lock_count; - - for (i = 0; i < (int)(rbtdb->node_lock_count); i++) { - result = NODE_INITLOCK(&rbtdb->node_locks[i].lock); - if (result == ISC_R_SUCCESS) { - result = isc_refcount_init(&rbtdb->node_locks[i].references, 0); - if (result != ISC_R_SUCCESS) - NODE_DESTROYLOCK(&rbtdb->node_locks[i].lock); - } - if (result != ISC_R_SUCCESS) { - while (i-- > 0) { - NODE_DESTROYLOCK(&rbtdb->node_locks[i].lock); - isc_refcount_decrement(&rbtdb->node_locks[i].references, NULL); - isc_refcount_destroy(&rbtdb->node_locks[i].references); - } - goto cleanup_heaps; - } - rbtdb->node_locks[i].exiting = ISC_FALSE; - } - - /* - * Attach to the mctx. The database will persist so long as there - * are references to it, and attaching to the mctx ensures that our - * mctx won't disappear out from under us. - */ - isc_mem_attach(mctx, &rbtdb->common.mctx); - - /* - * Must be initalized before free_rbtdb() is called. - */ - isc_ondestroy_init(&rbtdb->common.ondest); - - /* - * Make a copy of the origin name. - */ - result = dns_name_dupwithoffsets(origin, mctx, &rbtdb->common.origin); - if (result != ISC_R_SUCCESS) { - free_rbtdb(rbtdb, ISC_FALSE, NULL); - return (result); - } - - /* - * Make the Red-Black Tree. - */ - result = dns_rbt_create(mctx, delete_callback, rbtdb, &rbtdb->tree); - if (result != ISC_R_SUCCESS) { - free_rbtdb(rbtdb, ISC_FALSE, NULL); - return (result); - } - /* - * In order to set the node callback bit correctly in zone databases, - * we need to know if the node has the origin name of the zone. - * In loading_addrdataset() we could simply compare the new name - * to the origin name, but this is expensive. Also, we don't know the - * node name in addrdataset(), so we need another way of knowing the - * zone's top. - * - * We now explicitly create a node for the zone's origin, and then - * we simply remember the node's address. This is safe, because - * the top-of-zone node can never be deleted, nor can its address - * change. - */ - if (!IS_CACHE(rbtdb)) { - rbtdb->origin_node = NULL; - result = dns_rbt_addnode(rbtdb->tree, &rbtdb->common.origin, - &rbtdb->origin_node); - if (result != ISC_R_SUCCESS) { - INSIST(result != ISC_R_EXISTS); - free_rbtdb(rbtdb, ISC_FALSE, NULL); - return (result); - } - /* - * We need to give the origin node the right locknum. - */ - dns_name_init(&name, NULL); - dns_rbt_namefromnode(rbtdb->origin_node, &name); + dns_rbtdb_t *rbtdb; + isc_result_t result; + int i; + dns_name_t name; + + /* Keep the compiler happy. */ + UNUSED(argc); + UNUSED(argv); + UNUSED(driverarg); + + rbtdb = isc_mem_get(mctx, sizeof(*rbtdb)); + if (rbtdb == NULL) + return (ISC_R_NOMEMORY); + + memset(rbtdb, '\0', sizeof(*rbtdb)); + dns_name_init(&rbtdb->common.origin, NULL); + rbtdb->common.attributes = 0; + if (type == dns_dbtype_cache) { + rbtdb->common.methods = &cache_methods; + rbtdb->common.attributes |= DNS_DBATTR_CACHE; + } else if (type == dns_dbtype_stub) { + rbtdb->common.methods = &zone_methods; + rbtdb->common.attributes |= DNS_DBATTR_STUB; + } else + rbtdb->common.methods = &zone_methods; + rbtdb->common.rdclass = rdclass; + rbtdb->common.mctx = NULL; + + result = RBTDB_INITLOCK(&rbtdb->lock); + if (result != ISC_R_SUCCESS) + goto cleanup_rbtdb; + + result = isc_rwlock_init(&rbtdb->tree_lock, 0, 0); + if (result != ISC_R_SUCCESS) + goto cleanup_lock; + + if (rbtdb->node_lock_count == 0) { + if (IS_CACHE(rbtdb)) + rbtdb->node_lock_count = DEFAULT_CACHE_NODE_LOCK_COUNT; + else + rbtdb->node_lock_count = DEFAULT_NODE_LOCK_COUNT; + } + INSIST(rbtdb->node_lock_count < (1 << DNS_RBT_LOCKLENGTH)); + rbtdb->node_locks = isc_mem_get(mctx, rbtdb->node_lock_count * + sizeof(rbtdb_nodelock_t)); + if (rbtdb->node_locks == NULL) { + result = ISC_R_NOMEMORY; + goto cleanup_tree_lock; + } + + rbtdb->rrsetstats = NULL; + if (IS_CACHE(rbtdb)) { + result = dns_rdatasetstats_create(mctx, &rbtdb->rrsetstats); + if (result != ISC_R_SUCCESS) + goto cleanup_node_locks; + rbtdb->rdatasets = isc_mem_get(mctx, rbtdb->node_lock_count * + sizeof(rdatasetheaderlist_t)); + if (rbtdb->rdatasets == NULL) { + result = ISC_R_NOMEMORY; + goto cleanup_rrsetstats; + } + for (i = 0; i < (int)rbtdb->node_lock_count; i++) + ISC_LIST_INIT(rbtdb->rdatasets[i]); + + /* + * Create the heaps. + */ + rbtdb->heaps = isc_mem_get(mctx, rbtdb->node_lock_count * + sizeof(isc_heap_t *)); + if (rbtdb->heaps == NULL) { + result = ISC_R_NOMEMORY; + goto cleanup_rdatasets; + } + for (i = 0; i < (int)rbtdb->node_lock_count; i++) + rbtdb->heaps[i] = NULL; + for (i = 0; i < (int)rbtdb->node_lock_count; i++) { + result = isc_heap_create(mctx, ttl_sooner, + ttl_set_index, 0, + &rbtdb->heaps[i]); + if (result != ISC_R_SUCCESS) + goto cleanup_heaps; + } + } else { + rbtdb->rdatasets = NULL; + rbtdb->heaps = NULL; + } + + rbtdb->deadnodes = isc_mem_get(mctx, rbtdb->node_lock_count * + sizeof(rbtnodelist_t)); + if (rbtdb->deadnodes == NULL) { + result = ISC_R_NOMEMORY; + goto cleanup_heaps; + } + for (i = 0; i < (int)rbtdb->node_lock_count; i++) + ISC_LIST_INIT(rbtdb->deadnodes[i]); + + rbtdb->active = rbtdb->node_lock_count; + + for (i = 0; i < (int)(rbtdb->node_lock_count); i++) { + result = NODE_INITLOCK(&rbtdb->node_locks[i].lock); + if (result == ISC_R_SUCCESS) { + result = isc_refcount_init(&rbtdb->node_locks[i].references, 0); + if (result != ISC_R_SUCCESS) + NODE_DESTROYLOCK(&rbtdb->node_locks[i].lock); + } + if (result != ISC_R_SUCCESS) { + while (i-- > 0) { + NODE_DESTROYLOCK(&rbtdb->node_locks[i].lock); + isc_refcount_decrement(&rbtdb->node_locks[i].references, NULL); + isc_refcount_destroy(&rbtdb->node_locks[i].references); + } + goto cleanup_deadnodes; + } + rbtdb->node_locks[i].exiting = ISC_FALSE; + } + + /* + * Attach to the mctx. The database will persist so long as there + * are references to it, and attaching to the mctx ensures that our + * mctx won't disappear out from under us. + */ + isc_mem_attach(mctx, &rbtdb->common.mctx); + + /* + * Must be initalized before free_rbtdb() is called. + */ + isc_ondestroy_init(&rbtdb->common.ondest); + + /* + * Make a copy of the origin name. + */ + result = dns_name_dupwithoffsets(origin, mctx, &rbtdb->common.origin); + if (result != ISC_R_SUCCESS) { + free_rbtdb(rbtdb, ISC_FALSE, NULL); + return (result); + } + + /* + * Make the Red-Black Tree. + */ + result = dns_rbt_create(mctx, delete_callback, rbtdb, &rbtdb->tree); + if (result != ISC_R_SUCCESS) { + free_rbtdb(rbtdb, ISC_FALSE, NULL); + return (result); + } + /* + * In order to set the node callback bit correctly in zone databases, + * we need to know if the node has the origin name of the zone. + * In loading_addrdataset() we could simply compare the new name + * to the origin name, but this is expensive. Also, we don't know the + * node name in addrdataset(), so we need another way of knowing the + * zone's top. + * + * We now explicitly create a node for the zone's origin, and then + * we simply remember the node's address. This is safe, because + * the top-of-zone node can never be deleted, nor can its address + * change. + */ + if (!IS_CACHE(rbtdb)) { + rbtdb->origin_node = NULL; + result = dns_rbt_addnode(rbtdb->tree, &rbtdb->common.origin, + &rbtdb->origin_node); + if (result != ISC_R_SUCCESS) { + INSIST(result != ISC_R_EXISTS); + free_rbtdb(rbtdb, ISC_FALSE, NULL); + return (result); + } + /* + * We need to give the origin node the right locknum. + */ + dns_name_init(&name, NULL); + dns_rbt_namefromnode(rbtdb->origin_node, &name); #ifdef DNS_RBT_USEHASH - rbtdb->origin_node->locknum = - rbtdb->origin_node->hashval % - rbtdb->node_lock_count; + rbtdb->origin_node->locknum = + rbtdb->origin_node->hashval % + rbtdb->node_lock_count; #else - rbtdb->origin_node->locknum = - dns_name_hash(&name, ISC_TRUE) % - rbtdb->node_lock_count; + rbtdb->origin_node->locknum = + dns_name_hash(&name, ISC_TRUE) % + rbtdb->node_lock_count; #endif - } - - /* - * Misc. Initialization. - */ - result = isc_refcount_init(&rbtdb->references, 1); - if (result != ISC_R_SUCCESS) { - free_rbtdb(rbtdb, ISC_FALSE, NULL); - return (result); - } - rbtdb->attributes = 0; - rbtdb->secure = ISC_FALSE; - rbtdb->overmem = ISC_FALSE; - rbtdb->task = NULL; - - /* - * Version Initialization. - */ - rbtdb->current_serial = 1; - rbtdb->least_serial = 1; - rbtdb->next_serial = 2; - rbtdb->current_version = allocate_version(mctx, 1, 1, ISC_FALSE); - if (rbtdb->current_version == NULL) { - isc_refcount_decrement(&rbtdb->references, NULL); - isc_refcount_destroy(&rbtdb->references); - free_rbtdb(rbtdb, ISC_FALSE, NULL); - return (ISC_R_NOMEMORY); - } - rbtdb->future_version = NULL; - ISC_LIST_INIT(rbtdb->open_versions); - /* - * Keep the current version in the open list so that list operation - * won't happen in normal lookup operations. - */ - PREPEND(rbtdb->open_versions, rbtdb->current_version, link); - - rbtdb->common.magic = DNS_DB_MAGIC; - rbtdb->common.impmagic = RBTDB_MAGIC; - - *dbp = (dns_db_t *)rbtdb; - - return (ISC_R_SUCCESS); - - cleanup_heaps: - if (rbtdb->heaps != NULL) { - for (i = 0 ; i < (int)rbtdb->node_lock_count ; i++) - if (rbtdb->heaps[i] != NULL) - isc_heap_destroy(&rbtdb->heaps[i]); - isc_mem_put(mctx, rbtdb->heaps, - rbtdb->node_lock_count * sizeof(isc_heap_t *)); - } + } + + /* + * Misc. Initialization. + */ + result = isc_refcount_init(&rbtdb->references, 1); + if (result != ISC_R_SUCCESS) { + free_rbtdb(rbtdb, ISC_FALSE, NULL); + return (result); + } + rbtdb->attributes = 0; + rbtdb->secure = ISC_FALSE; + rbtdb->overmem = ISC_FALSE; + rbtdb->task = NULL; + + /* + * Version Initialization. + */ + rbtdb->current_serial = 1; + rbtdb->least_serial = 1; + rbtdb->next_serial = 2; + rbtdb->current_version = allocate_version(mctx, 1, 1, ISC_FALSE); + if (rbtdb->current_version == NULL) { + isc_refcount_decrement(&rbtdb->references, NULL); + isc_refcount_destroy(&rbtdb->references); + free_rbtdb(rbtdb, ISC_FALSE, NULL); + return (ISC_R_NOMEMORY); + } + rbtdb->future_version = NULL; + ISC_LIST_INIT(rbtdb->open_versions); + /* + * Keep the current version in the open list so that list operation + * won't happen in normal lookup operations. + */ + PREPEND(rbtdb->open_versions, rbtdb->current_version, link); + + rbtdb->common.magic = DNS_DB_MAGIC; + rbtdb->common.impmagic = RBTDB_MAGIC; + + *dbp = (dns_db_t *)rbtdb; + + return (ISC_R_SUCCESS); cleanup_deadnodes: - if (rbtdb->deadnodes != NULL) - isc_mem_put(mctx, rbtdb->deadnodes, - rbtdb->node_lock_count * sizeof(rbtnodelist_t)); + isc_mem_put(mctx, rbtdb->deadnodes, + rbtdb->node_lock_count * sizeof(rbtnodelist_t)); + + cleanup_heaps: + if (rbtdb->heaps != NULL) { + for (i = 0 ; i < (int)rbtdb->node_lock_count ; i++) + if (rbtdb->heaps[i] != NULL) + isc_heap_destroy(&rbtdb->heaps[i]); + isc_mem_put(mctx, rbtdb->heaps, + rbtdb->node_lock_count * sizeof(isc_heap_t *)); + } cleanup_rdatasets: - if (rbtdb->rdatasets != NULL) - isc_mem_put(mctx, rbtdb->rdatasets, rbtdb->node_lock_count * - sizeof(rdatasetheaderlist_t)); + if (rbtdb->rdatasets != NULL) + isc_mem_put(mctx, rbtdb->rdatasets, rbtdb->node_lock_count * + sizeof(rdatasetheaderlist_t)); + cleanup_rrsetstats: + if (rbtdb->rrsetstats != NULL) + dns_stats_detach(&rbtdb->rrsetstats); cleanup_node_locks: - isc_mem_put(mctx, rbtdb->node_locks, - rbtdb->node_lock_count * sizeof(rbtdb_nodelock_t)); + isc_mem_put(mctx, rbtdb->node_locks, + rbtdb->node_lock_count * sizeof(rbtdb_nodelock_t)); cleanup_tree_lock: - isc_rwlock_destroy(&rbtdb->tree_lock); + isc_rwlock_destroy(&rbtdb->tree_lock); cleanup_lock: - RBTDB_DESTROYLOCK(&rbtdb->lock); + RBTDB_DESTROYLOCK(&rbtdb->lock); cleanup_rbtdb: - isc_mem_put(mctx, rbtdb, sizeof(*rbtdb)); - return (result); + isc_mem_put(mctx, rbtdb, sizeof(*rbtdb)); + return (result); } @@ -6353,178 +6184,178 @@ dns_rbtdb_create static void rdataset_disassociate(dns_rdataset_t *rdataset) { - dns_db_t *db = rdataset->private1; - dns_dbnode_t *node = rdataset->private2; + dns_db_t *db = rdataset->private1; + dns_dbnode_t *node = rdataset->private2; - detachnode(db, &node); + detachnode(db, &node); } static isc_result_t rdataset_first(dns_rdataset_t *rdataset) { - unsigned char *raw = rdataset->private3; /* RDATASLAB */ - unsigned int count; + unsigned char *raw = rdataset->private3; /* RDATASLAB */ + unsigned int count; - count = raw[0] * 256 + raw[1]; - if (count == 0) { - rdataset->private5 = NULL; - return (ISC_R_NOMORE); - } + count = raw[0] * 256 + raw[1]; + if (count == 0) { + rdataset->private5 = NULL; + return (ISC_R_NOMORE); + } #if DNS_RDATASET_FIXED - if ((rdataset->attributes & DNS_RDATASETATTR_LOADORDER) == 0) - raw += 2 + (4 * count); - else + if ((rdataset->attributes & DNS_RDATASETATTR_LOADORDER) == 0) + raw += 2 + (4 * count); + else #endif - raw += 2; - - /* - * The privateuint4 field is the number of rdata beyond the - * cursor position, so we decrement the total count by one - * before storing it. - * - * If DNS_RDATASETATTR_LOADORDER is not set 'raw' points to the - * first record. If DNS_RDATASETATTR_LOADORDER is set 'raw' points - * to the first entry in the offset table. - */ - count--; - rdataset->privateuint4 = count; - rdataset->private5 = raw; - - return (ISC_R_SUCCESS); + raw += 2; + + /* + * The privateuint4 field is the number of rdata beyond the + * cursor position, so we decrement the total count by one + * before storing it. + * + * If DNS_RDATASETATTR_LOADORDER is not set 'raw' points to the + * first record. If DNS_RDATASETATTR_LOADORDER is set 'raw' points + * to the first entry in the offset table. + */ + count--; + rdataset->privateuint4 = count; + rdataset->private5 = raw; + + return (ISC_R_SUCCESS); } static isc_result_t rdataset_next(dns_rdataset_t *rdataset) { - unsigned int count; - unsigned int length; - unsigned char *raw; /* RDATASLAB */ - - count = rdataset->privateuint4; - if (count == 0) - return (ISC_R_NOMORE); - count--; - rdataset->privateuint4 = count; - - /* - * Skip forward one record (length + 4) or one offset (4). - */ - raw = rdataset->private5; + unsigned int count; + unsigned int length; + unsigned char *raw; /* RDATASLAB */ + + count = rdataset->privateuint4; + if (count == 0) + return (ISC_R_NOMORE); + count--; + rdataset->privateuint4 = count; + + /* + * Skip forward one record (length + 4) or one offset (4). + */ + raw = rdataset->private5; #if DNS_RDATASET_FIXED - if ((rdataset->attributes & DNS_RDATASETATTR_LOADORDER) == 0) { + if ((rdataset->attributes & DNS_RDATASETATTR_LOADORDER) == 0) { #endif - length = raw[0] * 256 + raw[1]; - raw += length; + length = raw[0] * 256 + raw[1]; + raw += length; #if DNS_RDATASET_FIXED - } - rdataset->private5 = raw + 4; /* length(2) + order(2) */ + } + rdataset->private5 = raw + 4; /* length(2) + order(2) */ #else - rdataset->private5 = raw + 2; /* length(2) */ + rdataset->private5 = raw + 2; /* length(2) */ #endif - return (ISC_R_SUCCESS); + return (ISC_R_SUCCESS); } static void rdataset_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata) { - unsigned char *raw = rdataset->private5; /* RDATASLAB */ + unsigned char *raw = rdataset->private5; /* RDATASLAB */ #if DNS_RDATASET_FIXED - unsigned int offset; + unsigned int offset; #endif - isc_region_t r; + isc_region_t r; - REQUIRE(raw != NULL); + REQUIRE(raw != NULL); - /* - * Find the start of the record if not already in private5 - * then skip the length and order fields. - */ + /* + * Find the start of the record if not already in private5 + * then skip the length and order fields. + */ #if DNS_RDATASET_FIXED - if ((rdataset->attributes & DNS_RDATASETATTR_LOADORDER) != 0) { - offset = (raw[0] << 24) + (raw[1] << 16) + - (raw[2] << 8) + raw[3]; - raw = rdataset->private3; - raw += offset; - } + if ((rdataset->attributes & DNS_RDATASETATTR_LOADORDER) != 0) { + offset = (raw[0] << 24) + (raw[1] << 16) + + (raw[2] << 8) + raw[3]; + raw = rdataset->private3; + raw += offset; + } #endif - r.length = raw[0] * 256 + raw[1]; + r.length = raw[0] * 256 + raw[1]; #if DNS_RDATASET_FIXED - raw += 4; + raw += 4; #else - raw += 2; + raw += 2; #endif - r.base = raw; - dns_rdata_fromregion(rdata, rdataset->rdclass, rdataset->type, &r); + r.base = raw; + dns_rdata_fromregion(rdata, rdataset->rdclass, rdataset->type, &r); } static void rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target) { - dns_db_t *db = source->private1; - dns_dbnode_t *node = source->private2; - dns_dbnode_t *cloned_node = NULL; - - attachnode(db, node, &cloned_node); - *target = *source; - - /* - * Reset iterator state. - */ - target->privateuint4 = 0; - target->private5 = NULL; + dns_db_t *db = source->private1; + dns_dbnode_t *node = source->private2; + dns_dbnode_t *cloned_node = NULL; + + attachnode(db, node, &cloned_node); + *target = *source; + + /* + * Reset iterator state. + */ + target->privateuint4 = 0; + target->private5 = NULL; } static unsigned int rdataset_count(dns_rdataset_t *rdataset) { - unsigned char *raw = rdataset->private3; /* RDATASLAB */ - unsigned int count; + unsigned char *raw = rdataset->private3; /* RDATASLAB */ + unsigned int count; - count = raw[0] * 256 + raw[1]; + count = raw[0] * 256 + raw[1]; - return (count); + return (count); } static isc_result_t rdataset_getnoqname(dns_rdataset_t *rdataset, dns_name_t *name, - dns_rdataset_t *nsec, dns_rdataset_t *nsecsig) + dns_rdataset_t *nsec, dns_rdataset_t *nsecsig) { - dns_db_t *db = rdataset->private1; - dns_dbnode_t *node = rdataset->private2; - dns_dbnode_t *cloned_node; - struct noqname *noqname = rdataset->private6; - - cloned_node = NULL; - attachnode(db, node, &cloned_node); - nsec->methods = &rdataset_methods; - nsec->rdclass = db->rdclass; - nsec->type = dns_rdatatype_nsec; - nsec->covers = 0; - nsec->ttl = rdataset->ttl; - nsec->trust = rdataset->trust; - nsec->private1 = rdataset->private1; - nsec->private2 = rdataset->private2; - nsec->private3 = noqname->nsec; - nsec->privateuint4 = 0; - nsec->private5 = NULL; - nsec->private6 = NULL; - - cloned_node = NULL; - attachnode(db, node, &cloned_node); - nsecsig->methods = &rdataset_methods; - nsecsig->rdclass = db->rdclass; - nsecsig->type = dns_rdatatype_rrsig; - nsecsig->covers = dns_rdatatype_nsec; - nsecsig->ttl = rdataset->ttl; - nsecsig->trust = rdataset->trust; - nsecsig->private1 = rdataset->private1; - nsecsig->private2 = rdataset->private2; - nsecsig->private3 = noqname->nsecsig; - nsecsig->privateuint4 = 0; - nsecsig->private5 = NULL; - nsec->private6 = NULL; - - dns_name_clone(&noqname->name, name); - - return (ISC_R_SUCCESS); + dns_db_t *db = rdataset->private1; + dns_dbnode_t *node = rdataset->private2; + dns_dbnode_t *cloned_node; + struct noqname *noqname = rdataset->private6; + + cloned_node = NULL; + attachnode(db, node, &cloned_node); + nsec->methods = &rdataset_methods; + nsec->rdclass = db->rdclass; + nsec->type = dns_rdatatype_nsec; + nsec->covers = 0; + nsec->ttl = rdataset->ttl; + nsec->trust = rdataset->trust; + nsec->private1 = rdataset->private1; + nsec->private2 = rdataset->private2; + nsec->private3 = noqname->nsec; + nsec->privateuint4 = 0; + nsec->private5 = NULL; + nsec->private6 = NULL; + + cloned_node = NULL; + attachnode(db, node, &cloned_node); + nsecsig->methods = &rdataset_methods; + nsecsig->rdclass = db->rdclass; + nsecsig->type = dns_rdatatype_rrsig; + nsecsig->covers = dns_rdatatype_nsec; + nsecsig->ttl = rdataset->ttl; + nsecsig->trust = rdataset->trust; + nsecsig->private1 = rdataset->private1; + nsecsig->private2 = rdataset->private2; + nsecsig->private3 = noqname->nsecsig; + nsecsig->privateuint4 = 0; + nsecsig->private5 = NULL; + nsec->private6 = NULL; + + dns_name_clone(&noqname->name, name); + + return (ISC_R_SUCCESS); } /* @@ -6533,172 +6364,172 @@ rdataset_getnoqname(dns_rdataset_t *rdataset, dns_name_t *name, static void rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp) { - rbtdb_rdatasetiter_t *rbtiterator; + rbtdb_rdatasetiter_t *rbtiterator; - rbtiterator = (rbtdb_rdatasetiter_t *)(*iteratorp); + rbtiterator = (rbtdb_rdatasetiter_t *)(*iteratorp); - if (rbtiterator->common.version != NULL) - closeversion(rbtiterator->common.db, - &rbtiterator->common.version, ISC_FALSE); - detachnode(rbtiterator->common.db, &rbtiterator->common.node); - isc_mem_put(rbtiterator->common.db->mctx, rbtiterator, - sizeof(*rbtiterator)); + if (rbtiterator->common.version != NULL) + closeversion(rbtiterator->common.db, + &rbtiterator->common.version, ISC_FALSE); + detachnode(rbtiterator->common.db, &rbtiterator->common.node); + isc_mem_put(rbtiterator->common.db->mctx, rbtiterator, + sizeof(*rbtiterator)); - *iteratorp = NULL; + *iteratorp = NULL; } static isc_result_t rdatasetiter_first(dns_rdatasetiter_t *iterator) { - rbtdb_rdatasetiter_t *rbtiterator = (rbtdb_rdatasetiter_t *)iterator; - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)(rbtiterator->common.db); - dns_rbtnode_t *rbtnode = rbtiterator->common.node; - rbtdb_version_t *rbtversion = rbtiterator->common.version; - rdatasetheader_t *header, *top_next; - rbtdb_serial_t serial; - isc_stdtime_t now; - - if (IS_CACHE(rbtdb)) { - serial = 1; - now = rbtiterator->common.now; - } else { - serial = rbtversion->serial; - now = 0; - } - - NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_read); - - for (header = rbtnode->data; header != NULL; header = top_next) { - top_next = header->next; - do { - if (header->serial <= serial && !IGNORE(header)) { - /* - * Is this a "this rdataset doesn't exist" - * record? Or is it too old in the cache? - * - * Note: unlike everywhere else, we - * check for now > header->ttl instead - * of now >= header->ttl. This allows - * ANY and RRSIG queries for 0 TTL - * rdatasets to work. - */ - if (NONEXISTENT(header) || - (now != 0 && now > header->rdh_ttl)) - header = NULL; - break; - } else - header = header->down; - } while (header != NULL); - if (header != NULL) - break; - } - - NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_read); - - rbtiterator->current = header; - - if (header == NULL) - return (ISC_R_NOMORE); - - return (ISC_R_SUCCESS); + rbtdb_rdatasetiter_t *rbtiterator = (rbtdb_rdatasetiter_t *)iterator; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)(rbtiterator->common.db); + dns_rbtnode_t *rbtnode = rbtiterator->common.node; + rbtdb_version_t *rbtversion = rbtiterator->common.version; + rdatasetheader_t *header, *top_next; + rbtdb_serial_t serial; + isc_stdtime_t now; + + if (IS_CACHE(rbtdb)) { + serial = 1; + now = rbtiterator->common.now; + } else { + serial = rbtversion->serial; + now = 0; + } + + NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_read); + + for (header = rbtnode->data; header != NULL; header = top_next) { + top_next = header->next; + do { + if (header->serial <= serial && !IGNORE(header)) { + /* + * Is this a "this rdataset doesn't exist" + * record? Or is it too old in the cache? + * + * Note: unlike everywhere else, we + * check for now > header->ttl instead + * of now >= header->ttl. This allows + * ANY and RRSIG queries for 0 TTL + * rdatasets to work. + */ + if (NONEXISTENT(header) || + (now != 0 && now > header->rdh_ttl)) + header = NULL; + break; + } else + header = header->down; + } while (header != NULL); + if (header != NULL) + break; + } + + NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_read); + + rbtiterator->current = header; + + if (header == NULL) + return (ISC_R_NOMORE); + + return (ISC_R_SUCCESS); } static isc_result_t rdatasetiter_next(dns_rdatasetiter_t *iterator) { - rbtdb_rdatasetiter_t *rbtiterator = (rbtdb_rdatasetiter_t *)iterator; - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)(rbtiterator->common.db); - dns_rbtnode_t *rbtnode = rbtiterator->common.node; - rbtdb_version_t *rbtversion = rbtiterator->common.version; - rdatasetheader_t *header, *top_next; - rbtdb_serial_t serial; - isc_stdtime_t now; - rbtdb_rdatatype_t type, negtype; - dns_rdatatype_t rdtype, covers; - - header = rbtiterator->current; - if (header == NULL) - return (ISC_R_NOMORE); - - if (IS_CACHE(rbtdb)) { - serial = 1; - now = rbtiterator->common.now; - } else { - serial = rbtversion->serial; - now = 0; - } - - NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_read); - - type = header->type; - rdtype = RBTDB_RDATATYPE_BASE(header->type); - if (rdtype == 0) { - covers = RBTDB_RDATATYPE_EXT(header->type); - negtype = RBTDB_RDATATYPE_VALUE(covers, 0); - } else - negtype = RBTDB_RDATATYPE_VALUE(0, rdtype); - for (header = header->next; header != NULL; header = top_next) { - top_next = header->next; - /* - * If not walking back up the down list. - */ - if (header->type != type && header->type != negtype) { - do { - if (header->serial <= serial && - !IGNORE(header)) { - /* - * Is this a "this rdataset doesn't - * exist" record? - * - * Note: unlike everywhere else, we - * check for now > header->ttl instead - * of now >= header->ttl. This allows - * ANY and RRSIG queries for 0 TTL - * rdatasets to work. - */ - if ((header->attributes & - RDATASET_ATTR_NONEXISTENT) != 0 || - (now != 0 && now > header->rdh_ttl)) - header = NULL; - break; - } else - header = header->down; - } while (header != NULL); - if (header != NULL) - break; - } - } - - NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_read); - - rbtiterator->current = header; - - if (header == NULL) - return (ISC_R_NOMORE); - - return (ISC_R_SUCCESS); + rbtdb_rdatasetiter_t *rbtiterator = (rbtdb_rdatasetiter_t *)iterator; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)(rbtiterator->common.db); + dns_rbtnode_t *rbtnode = rbtiterator->common.node; + rbtdb_version_t *rbtversion = rbtiterator->common.version; + rdatasetheader_t *header, *top_next; + rbtdb_serial_t serial; + isc_stdtime_t now; + rbtdb_rdatatype_t type, negtype; + dns_rdatatype_t rdtype, covers; + + header = rbtiterator->current; + if (header == NULL) + return (ISC_R_NOMORE); + + if (IS_CACHE(rbtdb)) { + serial = 1; + now = rbtiterator->common.now; + } else { + serial = rbtversion->serial; + now = 0; + } + + NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_read); + + type = header->type; + rdtype = RBTDB_RDATATYPE_BASE(header->type); + if (rdtype == 0) { + covers = RBTDB_RDATATYPE_EXT(header->type); + negtype = RBTDB_RDATATYPE_VALUE(covers, 0); + } else + negtype = RBTDB_RDATATYPE_VALUE(0, rdtype); + for (header = header->next; header != NULL; header = top_next) { + top_next = header->next; + /* + * If not walking back up the down list. + */ + if (header->type != type && header->type != negtype) { + do { + if (header->serial <= serial && + !IGNORE(header)) { + /* + * Is this a "this rdataset doesn't + * exist" record? + * + * Note: unlike everywhere else, we + * check for now > header->ttl instead + * of now >= header->ttl. This allows + * ANY and RRSIG queries for 0 TTL + * rdatasets to work. + */ + if ((header->attributes & + RDATASET_ATTR_NONEXISTENT) != 0 || + (now != 0 && now > header->rdh_ttl)) + header = NULL; + break; + } else + header = header->down; + } while (header != NULL); + if (header != NULL) + break; + } + } + + NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_read); + + rbtiterator->current = header; + + if (header == NULL) + return (ISC_R_NOMORE); + + return (ISC_R_SUCCESS); } static void rdatasetiter_current(dns_rdatasetiter_t *iterator, dns_rdataset_t *rdataset) { - rbtdb_rdatasetiter_t *rbtiterator = (rbtdb_rdatasetiter_t *)iterator; - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)(rbtiterator->common.db); - dns_rbtnode_t *rbtnode = rbtiterator->common.node; - rdatasetheader_t *header; + rbtdb_rdatasetiter_t *rbtiterator = (rbtdb_rdatasetiter_t *)iterator; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)(rbtiterator->common.db); + dns_rbtnode_t *rbtnode = rbtiterator->common.node; + rdatasetheader_t *header; - header = rbtiterator->current; - REQUIRE(header != NULL); + header = rbtiterator->current; + REQUIRE(header != NULL); - NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_read); + NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_read); - bind_rdataset(rbtdb, rbtnode, header, rbtiterator->common.now, - rdataset); + bind_rdataset(rbtdb, rbtnode, header, rbtiterator->common.now, + rdataset); - NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, - isc_rwlocktype_read); + NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock, + isc_rwlocktype_read); } @@ -6708,410 +6539,410 @@ rdatasetiter_current(dns_rdatasetiter_t *iterator, dns_rdataset_t *rdataset) { static inline void reference_iter_node(rbtdb_dbiterator_t *rbtdbiter) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)rbtdbiter->common.db; - dns_rbtnode_t *node = rbtdbiter->node; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)rbtdbiter->common.db; + dns_rbtnode_t *node = rbtdbiter->node; - if (node == NULL) - return; + if (node == NULL) + return; - INSIST(rbtdbiter->tree_locked != isc_rwlocktype_none); - NODE_STRONGLOCK(&rbtdb->node_locks[node->locknum].lock); - new_reference(rbtdb, node); - NODE_STRONGUNLOCK(&rbtdb->node_locks[node->locknum].lock); + INSIST(rbtdbiter->tree_locked != isc_rwlocktype_none); + NODE_STRONGLOCK(&rbtdb->node_locks[node->locknum].lock); + new_reference(rbtdb, node); + NODE_STRONGUNLOCK(&rbtdb->node_locks[node->locknum].lock); } static inline void dereference_iter_node(rbtdb_dbiterator_t *rbtdbiter) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)rbtdbiter->common.db; - dns_rbtnode_t *node = rbtdbiter->node; - nodelock_t *lock; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)rbtdbiter->common.db; + dns_rbtnode_t *node = rbtdbiter->node; + nodelock_t *lock; - if (node == NULL) - return; + if (node == NULL) + return; - lock = &rbtdb->node_locks[node->locknum].lock; - NODE_LOCK(lock, isc_rwlocktype_read); - decrement_reference(rbtdb, node, 0, isc_rwlocktype_read, - rbtdbiter->tree_locked); - NODE_UNLOCK(lock, isc_rwlocktype_read); + lock = &rbtdb->node_locks[node->locknum].lock; + NODE_LOCK(lock, isc_rwlocktype_read); + decrement_reference(rbtdb, node, 0, isc_rwlocktype_read, + rbtdbiter->tree_locked); + NODE_UNLOCK(lock, isc_rwlocktype_read); - rbtdbiter->node = NULL; + rbtdbiter->node = NULL; } static void flush_deletions(rbtdb_dbiterator_t *rbtdbiter) { - dns_rbtnode_t *node; - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)rbtdbiter->common.db; - isc_boolean_t was_read_locked = ISC_FALSE; - nodelock_t *lock; - int i; - - if (rbtdbiter->delete != 0) { - /* - * Note that "%d node of %d in tree" can report things like - * "flush_deletions: 59 nodes of 41 in tree". This means - * That some nodes appear on the deletions list more than - * once. Only the last occurence will actually be deleted. - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_CACHE, ISC_LOG_DEBUG(1), - "flush_deletions: %d nodes of %d in tree", - rbtdbiter->delete, - dns_rbt_nodecount(rbtdb->tree)); - - if (rbtdbiter->tree_locked == isc_rwlocktype_read) { - RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); - was_read_locked = ISC_TRUE; - } - RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_write); - rbtdbiter->tree_locked = isc_rwlocktype_write; - - for (i = 0; i < rbtdbiter->delete; i++) { - node = rbtdbiter->deletions[i]; - lock = &rbtdb->node_locks[node->locknum].lock; - - NODE_LOCK(lock, isc_rwlocktype_read); - decrement_reference(rbtdb, node, 0, - isc_rwlocktype_read, - rbtdbiter->tree_locked); - NODE_UNLOCK(lock, isc_rwlocktype_read); - } - - rbtdbiter->delete = 0; - - RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_write); - if (was_read_locked) { - RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); - rbtdbiter->tree_locked = isc_rwlocktype_read; - - } else { - rbtdbiter->tree_locked = isc_rwlocktype_none; - } - } + dns_rbtnode_t *node; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)rbtdbiter->common.db; + isc_boolean_t was_read_locked = ISC_FALSE; + nodelock_t *lock; + int i; + + if (rbtdbiter->delete != 0) { + /* + * Note that "%d node of %d in tree" can report things like + * "flush_deletions: 59 nodes of 41 in tree". This means + * That some nodes appear on the deletions list more than + * once. Only the last occurence will actually be deleted. + */ + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_CACHE, ISC_LOG_DEBUG(1), + "flush_deletions: %d nodes of %d in tree", + rbtdbiter->delete, + dns_rbt_nodecount(rbtdb->tree)); + + if (rbtdbiter->tree_locked == isc_rwlocktype_read) { + RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); + was_read_locked = ISC_TRUE; + } + RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_write); + rbtdbiter->tree_locked = isc_rwlocktype_write; + + for (i = 0; i < rbtdbiter->delete; i++) { + node = rbtdbiter->deletions[i]; + lock = &rbtdb->node_locks[node->locknum].lock; + + NODE_LOCK(lock, isc_rwlocktype_read); + decrement_reference(rbtdb, node, 0, + isc_rwlocktype_read, + rbtdbiter->tree_locked); + NODE_UNLOCK(lock, isc_rwlocktype_read); + } + + rbtdbiter->delete = 0; + + RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_write); + if (was_read_locked) { + RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); + rbtdbiter->tree_locked = isc_rwlocktype_read; + + } else { + rbtdbiter->tree_locked = isc_rwlocktype_none; + } + } } static inline void resume_iteration(rbtdb_dbiterator_t *rbtdbiter) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)rbtdbiter->common.db; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)rbtdbiter->common.db; - REQUIRE(rbtdbiter->paused); - REQUIRE(rbtdbiter->tree_locked == isc_rwlocktype_none); + REQUIRE(rbtdbiter->paused); + REQUIRE(rbtdbiter->tree_locked == isc_rwlocktype_none); - RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); - rbtdbiter->tree_locked = isc_rwlocktype_read; + RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); + rbtdbiter->tree_locked = isc_rwlocktype_read; - rbtdbiter->paused = ISC_FALSE; + rbtdbiter->paused = ISC_FALSE; } static void dbiterator_destroy(dns_dbiterator_t **iteratorp) { - rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)(*iteratorp); - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)rbtdbiter->common.db; - dns_db_t *db = NULL; + rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)(*iteratorp); + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)rbtdbiter->common.db; + dns_db_t *db = NULL; - if (rbtdbiter->tree_locked == isc_rwlocktype_read) { - RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); - rbtdbiter->tree_locked = isc_rwlocktype_none; - } else - INSIST(rbtdbiter->tree_locked == isc_rwlocktype_none); + if (rbtdbiter->tree_locked == isc_rwlocktype_read) { + RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); + rbtdbiter->tree_locked = isc_rwlocktype_none; + } else + INSIST(rbtdbiter->tree_locked == isc_rwlocktype_none); - dereference_iter_node(rbtdbiter); + dereference_iter_node(rbtdbiter); - flush_deletions(rbtdbiter); + flush_deletions(rbtdbiter); - dns_db_attach(rbtdbiter->common.db, &db); - dns_db_detach(&rbtdbiter->common.db); + dns_db_attach(rbtdbiter->common.db, &db); + dns_db_detach(&rbtdbiter->common.db); - dns_rbtnodechain_reset(&rbtdbiter->chain); - isc_mem_put(db->mctx, rbtdbiter, sizeof(*rbtdbiter)); - dns_db_detach(&db); + dns_rbtnodechain_reset(&rbtdbiter->chain); + isc_mem_put(db->mctx, rbtdbiter, sizeof(*rbtdbiter)); + dns_db_detach(&db); - *iteratorp = NULL; + *iteratorp = NULL; } static isc_result_t dbiterator_first(dns_dbiterator_t *iterator) { - isc_result_t result; - rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator; - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)iterator->db; - dns_name_t *name, *origin; - - if (rbtdbiter->result != ISC_R_SUCCESS && - rbtdbiter->result != ISC_R_NOMORE) - return (rbtdbiter->result); - - if (rbtdbiter->paused) - resume_iteration(rbtdbiter); - - dereference_iter_node(rbtdbiter); - - name = dns_fixedname_name(&rbtdbiter->name); - origin = dns_fixedname_name(&rbtdbiter->origin); - dns_rbtnodechain_reset(&rbtdbiter->chain); - - result = dns_rbtnodechain_first(&rbtdbiter->chain, rbtdb->tree, name, - origin); - - if (result == ISC_R_SUCCESS || result == DNS_R_NEWORIGIN) { - result = dns_rbtnodechain_current(&rbtdbiter->chain, NULL, - NULL, &rbtdbiter->node); - if (result == ISC_R_SUCCESS) { - rbtdbiter->new_origin = ISC_TRUE; - reference_iter_node(rbtdbiter); - } - } else { - INSIST(result == ISC_R_NOTFOUND); - result = ISC_R_NOMORE; /* The tree is empty. */ - } - - rbtdbiter->result = result; - - return (result); + isc_result_t result; + rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)iterator->db; + dns_name_t *name, *origin; + + if (rbtdbiter->result != ISC_R_SUCCESS && + rbtdbiter->result != ISC_R_NOMORE) + return (rbtdbiter->result); + + if (rbtdbiter->paused) + resume_iteration(rbtdbiter); + + dereference_iter_node(rbtdbiter); + + name = dns_fixedname_name(&rbtdbiter->name); + origin = dns_fixedname_name(&rbtdbiter->origin); + dns_rbtnodechain_reset(&rbtdbiter->chain); + + result = dns_rbtnodechain_first(&rbtdbiter->chain, rbtdb->tree, name, + origin); + + if (result == ISC_R_SUCCESS || result == DNS_R_NEWORIGIN) { + result = dns_rbtnodechain_current(&rbtdbiter->chain, NULL, + NULL, &rbtdbiter->node); + if (result == ISC_R_SUCCESS) { + rbtdbiter->new_origin = ISC_TRUE; + reference_iter_node(rbtdbiter); + } + } else { + INSIST(result == ISC_R_NOTFOUND); + result = ISC_R_NOMORE; /* The tree is empty. */ + } + + rbtdbiter->result = result; + + return (result); } static isc_result_t dbiterator_last(dns_dbiterator_t *iterator) { - isc_result_t result; - rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator; - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)iterator->db; - dns_name_t *name, *origin; - - if (rbtdbiter->result != ISC_R_SUCCESS && - rbtdbiter->result != ISC_R_NOMORE) - return (rbtdbiter->result); - - if (rbtdbiter->paused) - resume_iteration(rbtdbiter); - - dereference_iter_node(rbtdbiter); - - name = dns_fixedname_name(&rbtdbiter->name); - origin = dns_fixedname_name(&rbtdbiter->origin); - dns_rbtnodechain_reset(&rbtdbiter->chain); - - result = dns_rbtnodechain_last(&rbtdbiter->chain, rbtdb->tree, name, - origin); - if (result == ISC_R_SUCCESS || result == DNS_R_NEWORIGIN) { - result = dns_rbtnodechain_current(&rbtdbiter->chain, NULL, - NULL, &rbtdbiter->node); - if (result == ISC_R_SUCCESS) { - rbtdbiter->new_origin = ISC_TRUE; - reference_iter_node(rbtdbiter); - } - } else { - INSIST(result == ISC_R_NOTFOUND); - result = ISC_R_NOMORE; /* The tree is empty. */ - } - - rbtdbiter->result = result; - - return (result); + isc_result_t result; + rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)iterator->db; + dns_name_t *name, *origin; + + if (rbtdbiter->result != ISC_R_SUCCESS && + rbtdbiter->result != ISC_R_NOMORE) + return (rbtdbiter->result); + + if (rbtdbiter->paused) + resume_iteration(rbtdbiter); + + dereference_iter_node(rbtdbiter); + + name = dns_fixedname_name(&rbtdbiter->name); + origin = dns_fixedname_name(&rbtdbiter->origin); + dns_rbtnodechain_reset(&rbtdbiter->chain); + + result = dns_rbtnodechain_last(&rbtdbiter->chain, rbtdb->tree, name, + origin); + if (result == ISC_R_SUCCESS || result == DNS_R_NEWORIGIN) { + result = dns_rbtnodechain_current(&rbtdbiter->chain, NULL, + NULL, &rbtdbiter->node); + if (result == ISC_R_SUCCESS) { + rbtdbiter->new_origin = ISC_TRUE; + reference_iter_node(rbtdbiter); + } + } else { + INSIST(result == ISC_R_NOTFOUND); + result = ISC_R_NOMORE; /* The tree is empty. */ + } + + rbtdbiter->result = result; + + return (result); } static isc_result_t dbiterator_seek(dns_dbiterator_t *iterator, dns_name_t *name) { - isc_result_t result; - rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator; - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)iterator->db; - dns_name_t *iname, *origin; + isc_result_t result; + rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)iterator->db; + dns_name_t *iname, *origin; - if (rbtdbiter->result != ISC_R_SUCCESS && - rbtdbiter->result != ISC_R_NOMORE) - return (rbtdbiter->result); + if (rbtdbiter->result != ISC_R_SUCCESS && + rbtdbiter->result != ISC_R_NOMORE) + return (rbtdbiter->result); - if (rbtdbiter->paused) - resume_iteration(rbtdbiter); + if (rbtdbiter->paused) + resume_iteration(rbtdbiter); - dereference_iter_node(rbtdbiter); + dereference_iter_node(rbtdbiter); - iname = dns_fixedname_name(&rbtdbiter->name); - origin = dns_fixedname_name(&rbtdbiter->origin); - dns_rbtnodechain_reset(&rbtdbiter->chain); + iname = dns_fixedname_name(&rbtdbiter->name); + origin = dns_fixedname_name(&rbtdbiter->origin); + dns_rbtnodechain_reset(&rbtdbiter->chain); - result = dns_rbt_findnode(rbtdb->tree, name, NULL, &rbtdbiter->node, - &rbtdbiter->chain, DNS_RBTFIND_EMPTYDATA, - NULL, NULL); - if (result == ISC_R_SUCCESS) { - result = dns_rbtnodechain_current(&rbtdbiter->chain, iname, - origin, NULL); - if (result == ISC_R_SUCCESS) { - rbtdbiter->new_origin = ISC_TRUE; - reference_iter_node(rbtdbiter); - } + result = dns_rbt_findnode(rbtdb->tree, name, NULL, &rbtdbiter->node, + &rbtdbiter->chain, DNS_RBTFIND_EMPTYDATA, + NULL, NULL); + if (result == ISC_R_SUCCESS) { + result = dns_rbtnodechain_current(&rbtdbiter->chain, iname, + origin, NULL); + if (result == ISC_R_SUCCESS) { + rbtdbiter->new_origin = ISC_TRUE; + reference_iter_node(rbtdbiter); + } - } else if (result == DNS_R_PARTIALMATCH) - result = ISC_R_NOTFOUND; + } else if (result == DNS_R_PARTIALMATCH) + result = ISC_R_NOTFOUND; - rbtdbiter->result = result; + rbtdbiter->result = result; - return (result); + return (result); } static isc_result_t dbiterator_prev(dns_dbiterator_t *iterator) { - isc_result_t result; - rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator; - dns_name_t *name, *origin; + isc_result_t result; + rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator; + dns_name_t *name, *origin; - REQUIRE(rbtdbiter->node != NULL); + REQUIRE(rbtdbiter->node != NULL); - if (rbtdbiter->result != ISC_R_SUCCESS) - return (rbtdbiter->result); + if (rbtdbiter->result != ISC_R_SUCCESS) + return (rbtdbiter->result); - if (rbtdbiter->paused) - resume_iteration(rbtdbiter); + if (rbtdbiter->paused) + resume_iteration(rbtdbiter); - name = dns_fixedname_name(&rbtdbiter->name); - origin = dns_fixedname_name(&rbtdbiter->origin); - result = dns_rbtnodechain_prev(&rbtdbiter->chain, name, origin); + name = dns_fixedname_name(&rbtdbiter->name); + origin = dns_fixedname_name(&rbtdbiter->origin); + result = dns_rbtnodechain_prev(&rbtdbiter->chain, name, origin); - dereference_iter_node(rbtdbiter); + dereference_iter_node(rbtdbiter); - if (result == DNS_R_NEWORIGIN || result == ISC_R_SUCCESS) { - rbtdbiter->new_origin = ISC_TF(result == DNS_R_NEWORIGIN); - result = dns_rbtnodechain_current(&rbtdbiter->chain, NULL, - NULL, &rbtdbiter->node); - } + if (result == DNS_R_NEWORIGIN || result == ISC_R_SUCCESS) { + rbtdbiter->new_origin = ISC_TF(result == DNS_R_NEWORIGIN); + result = dns_rbtnodechain_current(&rbtdbiter->chain, NULL, + NULL, &rbtdbiter->node); + } - if (result == ISC_R_SUCCESS) - reference_iter_node(rbtdbiter); + if (result == ISC_R_SUCCESS) + reference_iter_node(rbtdbiter); - rbtdbiter->result = result; + rbtdbiter->result = result; - return (result); + return (result); } static isc_result_t dbiterator_next(dns_dbiterator_t *iterator) { - isc_result_t result; - rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator; - dns_name_t *name, *origin; + isc_result_t result; + rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator; + dns_name_t *name, *origin; - REQUIRE(rbtdbiter->node != NULL); + REQUIRE(rbtdbiter->node != NULL); - if (rbtdbiter->result != ISC_R_SUCCESS) - return (rbtdbiter->result); + if (rbtdbiter->result != ISC_R_SUCCESS) + return (rbtdbiter->result); - if (rbtdbiter->paused) - resume_iteration(rbtdbiter); + if (rbtdbiter->paused) + resume_iteration(rbtdbiter); - name = dns_fixedname_name(&rbtdbiter->name); - origin = dns_fixedname_name(&rbtdbiter->origin); - result = dns_rbtnodechain_next(&rbtdbiter->chain, name, origin); + name = dns_fixedname_name(&rbtdbiter->name); + origin = dns_fixedname_name(&rbtdbiter->origin); + result = dns_rbtnodechain_next(&rbtdbiter->chain, name, origin); - dereference_iter_node(rbtdbiter); + dereference_iter_node(rbtdbiter); - if (result == DNS_R_NEWORIGIN || result == ISC_R_SUCCESS) { - rbtdbiter->new_origin = ISC_TF(result == DNS_R_NEWORIGIN); - result = dns_rbtnodechain_current(&rbtdbiter->chain, NULL, - NULL, &rbtdbiter->node); - } - if (result == ISC_R_SUCCESS) - reference_iter_node(rbtdbiter); + if (result == DNS_R_NEWORIGIN || result == ISC_R_SUCCESS) { + rbtdbiter->new_origin = ISC_TF(result == DNS_R_NEWORIGIN); + result = dns_rbtnodechain_current(&rbtdbiter->chain, NULL, + NULL, &rbtdbiter->node); + } + if (result == ISC_R_SUCCESS) + reference_iter_node(rbtdbiter); - rbtdbiter->result = result; + rbtdbiter->result = result; - return (result); + return (result); } static isc_result_t dbiterator_current(dns_dbiterator_t *iterator, dns_dbnode_t **nodep, - dns_name_t *name) + dns_name_t *name) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)iterator->db; - rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator; - dns_rbtnode_t *node = rbtdbiter->node; - isc_result_t result; - dns_name_t *nodename = dns_fixedname_name(&rbtdbiter->name); - dns_name_t *origin = dns_fixedname_name(&rbtdbiter->origin); - - REQUIRE(rbtdbiter->result == ISC_R_SUCCESS); - REQUIRE(rbtdbiter->node != NULL); - - if (rbtdbiter->paused) - resume_iteration(rbtdbiter); - - if (name != NULL) { - if (rbtdbiter->common.relative_names) - origin = NULL; - result = dns_name_concatenate(nodename, origin, name, NULL); - if (result != ISC_R_SUCCESS) - return (result); - if (rbtdbiter->common.relative_names && rbtdbiter->new_origin) - result = DNS_R_NEWORIGIN; - } else - result = ISC_R_SUCCESS; - - NODE_STRONGLOCK(&rbtdb->node_locks[node->locknum].lock); - new_reference(rbtdb, node); - NODE_STRONGUNLOCK(&rbtdb->node_locks[node->locknum].lock); - - *nodep = rbtdbiter->node; - - if (iterator->cleaning && result == ISC_R_SUCCESS) { - isc_result_t expire_result; - - /* - * If the deletion array is full, flush it before trying - * to expire the current node. The current node can't - * fully deleted while the iteration cursor is still on it. - */ - if (rbtdbiter->delete == DELETION_BATCH_MAX) - flush_deletions(rbtdbiter); - - expire_result = expirenode(iterator->db, *nodep, 0); - - /* - * expirenode() currently always returns success. - */ - if (expire_result == ISC_R_SUCCESS && node->down == NULL) { - unsigned int refs; - - rbtdbiter->deletions[rbtdbiter->delete++] = node; - NODE_STRONGLOCK(&rbtdb->node_locks[node->locknum].lock); - dns_rbtnode_refincrement(node, &refs); - INSIST(refs != 0); - NODE_STRONGUNLOCK(&rbtdb->node_locks[node->locknum].lock); - } - } - - return (result); + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)iterator->db; + rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator; + dns_rbtnode_t *node = rbtdbiter->node; + isc_result_t result; + dns_name_t *nodename = dns_fixedname_name(&rbtdbiter->name); + dns_name_t *origin = dns_fixedname_name(&rbtdbiter->origin); + + REQUIRE(rbtdbiter->result == ISC_R_SUCCESS); + REQUIRE(rbtdbiter->node != NULL); + + if (rbtdbiter->paused) + resume_iteration(rbtdbiter); + + if (name != NULL) { + if (rbtdbiter->common.relative_names) + origin = NULL; + result = dns_name_concatenate(nodename, origin, name, NULL); + if (result != ISC_R_SUCCESS) + return (result); + if (rbtdbiter->common.relative_names && rbtdbiter->new_origin) + result = DNS_R_NEWORIGIN; + } else + result = ISC_R_SUCCESS; + + NODE_STRONGLOCK(&rbtdb->node_locks[node->locknum].lock); + new_reference(rbtdb, node); + NODE_STRONGUNLOCK(&rbtdb->node_locks[node->locknum].lock); + + *nodep = rbtdbiter->node; + + if (iterator->cleaning && result == ISC_R_SUCCESS) { + isc_result_t expire_result; + + /* + * If the deletion array is full, flush it before trying + * to expire the current node. The current node can't + * fully deleted while the iteration cursor is still on it. + */ + if (rbtdbiter->delete == DELETION_BATCH_MAX) + flush_deletions(rbtdbiter); + + expire_result = expirenode(iterator->db, *nodep, 0); + + /* + * expirenode() currently always returns success. + */ + if (expire_result == ISC_R_SUCCESS && node->down == NULL) { + unsigned int refs; + + rbtdbiter->deletions[rbtdbiter->delete++] = node; + NODE_STRONGLOCK(&rbtdb->node_locks[node->locknum].lock); + dns_rbtnode_refincrement(node, &refs); + INSIST(refs != 0); + NODE_STRONGUNLOCK(&rbtdb->node_locks[node->locknum].lock); + } + } + + return (result); } static isc_result_t dbiterator_pause(dns_dbiterator_t *iterator) { - dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)iterator->db; - rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator; + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)iterator->db; + rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator; - if (rbtdbiter->result != ISC_R_SUCCESS && - rbtdbiter->result != ISC_R_NOMORE) - return (rbtdbiter->result); + if (rbtdbiter->result != ISC_R_SUCCESS && + rbtdbiter->result != ISC_R_NOMORE) + return (rbtdbiter->result); - if (rbtdbiter->paused) - return (ISC_R_SUCCESS); + if (rbtdbiter->paused) + return (ISC_R_SUCCESS); - rbtdbiter->paused = ISC_TRUE; + rbtdbiter->paused = ISC_TRUE; - if (rbtdbiter->tree_locked != isc_rwlocktype_none) { - INSIST(rbtdbiter->tree_locked == isc_rwlocktype_read); - RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); - rbtdbiter->tree_locked = isc_rwlocktype_none; - } + if (rbtdbiter->tree_locked != isc_rwlocktype_none) { + INSIST(rbtdbiter->tree_locked == isc_rwlocktype_read); + RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read); + rbtdbiter->tree_locked = isc_rwlocktype_none; + } - flush_deletions(rbtdbiter); + flush_deletions(rbtdbiter); - return (ISC_R_SUCCESS); + return (ISC_R_SUCCESS); } static isc_result_t dbiterator_origin(dns_dbiterator_t *iterator, dns_name_t *name) { - rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator; - dns_name_t *origin = dns_fixedname_name(&rbtdbiter->origin); + rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator; + dns_name_t *origin = dns_fixedname_name(&rbtdbiter->origin); - if (rbtdbiter->result != ISC_R_SUCCESS) - return (rbtdbiter->result); + if (rbtdbiter->result != ISC_R_SUCCESS) + return (rbtdbiter->result); - return (dns_name_copy(origin, name, NULL)); + return (dns_name_copy(origin, name, NULL)); } /*% @@ -7119,352 +6950,351 @@ dbiterator_origin(dns_dbiterator_t *iterator, dns_name_t *name) { */ static isc_result_t rdataset_getadditional(dns_rdataset_t *rdataset, dns_rdatasetadditional_t type, - dns_rdatatype_t qtype, dns_acache_t *acache, - dns_zone_t **zonep, dns_db_t **dbp, - dns_dbversion_t **versionp, dns_dbnode_t **nodep, - dns_name_t *fname, dns_message_t *msg, - isc_stdtime_t now) + dns_rdatatype_t qtype, dns_acache_t *acache, + dns_zone_t **zonep, dns_db_t **dbp, + dns_dbversion_t **versionp, dns_dbnode_t **nodep, + dns_name_t *fname, dns_message_t *msg, + isc_stdtime_t now) { - dns_rbtdb_t *rbtdb = rdataset->private1; - dns_rbtnode_t *rbtnode = rdataset->private2; - unsigned char *raw = rdataset->private3; /* RDATASLAB */ - unsigned int current_count = rdataset->privateuint4; - unsigned int count; - rdatasetheader_t *header; - nodelock_t *nodelock; - unsigned int total_count; - acachectl_t *acarray; - dns_acacheentry_t *entry; - isc_result_t result; - - UNUSED(qtype); /* we do not use this value at least for now */ - UNUSED(acache); - - header = (struct rdatasetheader *)(raw - sizeof(*header)); - - total_count = raw[0] * 256 + raw[1]; - INSIST(total_count > current_count); - count = total_count - current_count - 1; - - acarray = NULL; - - nodelock = &rbtdb->node_locks[rbtnode->locknum].lock; - NODE_LOCK(nodelock, isc_rwlocktype_read); - - switch (type) { - case dns_rdatasetadditional_fromauth: - acarray = header->additional_auth; - break; - case dns_rdatasetadditional_fromcache: - acarray = NULL; - break; - case dns_rdatasetadditional_fromglue: - acarray = header->additional_glue; - break; - default: - INSIST(0); - } - - if (acarray == NULL) { - if (type != dns_rdatasetadditional_fromcache) - dns_acache_countquerymiss(acache); - NODE_UNLOCK(nodelock, isc_rwlocktype_read); - return (ISC_R_NOTFOUND); - } - - if (acarray[count].entry == NULL) { - dns_acache_countquerymiss(acache); - NODE_UNLOCK(nodelock, isc_rwlocktype_read); - return (ISC_R_NOTFOUND); - } - - entry = NULL; - dns_acache_attachentry(acarray[count].entry, &entry); - - NODE_UNLOCK(nodelock, isc_rwlocktype_read); - - result = dns_acache_getentry(entry, zonep, dbp, versionp, - nodep, fname, msg, now); - - dns_acache_detachentry(&entry); - - return (result); + dns_rbtdb_t *rbtdb = rdataset->private1; + dns_rbtnode_t *rbtnode = rdataset->private2; + unsigned char *raw = rdataset->private3; /* RDATASLAB */ + unsigned int current_count = rdataset->privateuint4; + unsigned int count; + rdatasetheader_t *header; + nodelock_t *nodelock; + unsigned int total_count; + acachectl_t *acarray; + dns_acacheentry_t *entry; + isc_result_t result; + + UNUSED(qtype); /* we do not use this value at least for now */ + UNUSED(acache); + + header = (struct rdatasetheader *)(raw - sizeof(*header)); + + total_count = raw[0] * 256 + raw[1]; + INSIST(total_count > current_count); + count = total_count - current_count - 1; + + acarray = NULL; + + nodelock = &rbtdb->node_locks[rbtnode->locknum].lock; + NODE_LOCK(nodelock, isc_rwlocktype_read); + + switch (type) { + case dns_rdatasetadditional_fromauth: + acarray = header->additional_auth; + break; + case dns_rdatasetadditional_fromcache: + acarray = NULL; + break; + case dns_rdatasetadditional_fromglue: + acarray = header->additional_glue; + break; + default: + INSIST(0); + } + + if (acarray == NULL) { + if (type != dns_rdatasetadditional_fromcache) + dns_acache_countquerymiss(acache); + NODE_UNLOCK(nodelock, isc_rwlocktype_read); + return (ISC_R_NOTFOUND); + } + + if (acarray[count].entry == NULL) { + dns_acache_countquerymiss(acache); + NODE_UNLOCK(nodelock, isc_rwlocktype_read); + return (ISC_R_NOTFOUND); + } + + entry = NULL; + dns_acache_attachentry(acarray[count].entry, &entry); + + NODE_UNLOCK(nodelock, isc_rwlocktype_read); + + result = dns_acache_getentry(entry, zonep, dbp, versionp, + nodep, fname, msg, now); + + dns_acache_detachentry(&entry); + + return (result); } static void acache_callback(dns_acacheentry_t *entry, void **arg) { - dns_rbtdb_t *rbtdb; - dns_rbtnode_t *rbtnode; - nodelock_t *nodelock; - acachectl_t *acarray = NULL; - acache_cbarg_t *cbarg; - unsigned int count; - - REQUIRE(arg != NULL); - cbarg = *arg; - - /* - * The caller must hold the entry lock. - */ - - rbtdb = (dns_rbtdb_t *)cbarg->db; - rbtnode = (dns_rbtnode_t *)cbarg->node; - - nodelock = &rbtdb->node_locks[rbtnode->locknum].lock; - NODE_LOCK(nodelock, isc_rwlocktype_write); - - switch (cbarg->type) { - case dns_rdatasetadditional_fromauth: - acarray = cbarg->header->additional_auth; - break; - case dns_rdatasetadditional_fromglue: - acarray = cbarg->header->additional_glue; - break; - default: - INSIST(0); - } - - count = cbarg->count; - if (acarray[count].entry == entry) - acarray[count].entry = NULL; - INSIST(acarray[count].cbarg != NULL); - isc_mem_put(rbtdb->common.mctx, acarray[count].cbarg, - sizeof(acache_cbarg_t)); - acarray[count].cbarg = NULL; - - dns_acache_detachentry(&entry); - - NODE_UNLOCK(nodelock, isc_rwlocktype_write); - - dns_db_detachnode((dns_db_t *)rbtdb, (dns_dbnode_t **)(void*)&rbtnode); - dns_db_detach((dns_db_t **)(void*)&rbtdb); - - *arg = NULL; + dns_rbtdb_t *rbtdb; + dns_rbtnode_t *rbtnode; + nodelock_t *nodelock; + acachectl_t *acarray = NULL; + acache_cbarg_t *cbarg; + unsigned int count; + + REQUIRE(arg != NULL); + cbarg = *arg; + + /* + * The caller must hold the entry lock. + */ + + rbtdb = (dns_rbtdb_t *)cbarg->db; + rbtnode = (dns_rbtnode_t *)cbarg->node; + + nodelock = &rbtdb->node_locks[rbtnode->locknum].lock; + NODE_LOCK(nodelock, isc_rwlocktype_write); + + switch (cbarg->type) { + case dns_rdatasetadditional_fromauth: + acarray = cbarg->header->additional_auth; + break; + case dns_rdatasetadditional_fromglue: + acarray = cbarg->header->additional_glue; + break; + default: + INSIST(0); + } + + count = cbarg->count; + if (acarray != NULL && acarray[count].entry == entry) { + acarray[count].entry = NULL; + INSIST(acarray[count].cbarg == cbarg); + isc_mem_put(rbtdb->common.mctx, cbarg, sizeof(acache_cbarg_t)); + acarray[count].cbarg = NULL; + } else + isc_mem_put(rbtdb->common.mctx, cbarg, sizeof(acache_cbarg_t)); + + dns_acache_detachentry(&entry); + + NODE_UNLOCK(nodelock, isc_rwlocktype_write); + + dns_db_detachnode((dns_db_t *)rbtdb, (dns_dbnode_t **)(void*)&rbtnode); + dns_db_detach((dns_db_t **)(void*)&rbtdb); + + *arg = NULL; } static void acache_cancelentry(isc_mem_t *mctx, dns_acacheentry_t *entry, - acache_cbarg_t **cbargp) + acache_cbarg_t **cbargp) { - acache_cbarg_t *cbarg; + acache_cbarg_t *cbarg; - REQUIRE(mctx != NULL); - REQUIRE(entry != NULL); - REQUIRE(cbargp != NULL && *cbargp != NULL); + REQUIRE(mctx != NULL); + REQUIRE(entry != NULL); + REQUIRE(cbargp != NULL && *cbargp != NULL); - cbarg = *cbargp; + cbarg = *cbargp; - dns_acache_cancelentry(entry); - dns_db_detachnode(cbarg->db, &cbarg->node); - dns_db_detach(&cbarg->db); + dns_acache_cancelentry(entry); + dns_db_detachnode(cbarg->db, &cbarg->node); + dns_db_detach(&cbarg->db); - isc_mem_put(mctx, cbarg, sizeof(acache_cbarg_t)); + isc_mem_put(mctx, cbarg, sizeof(acache_cbarg_t)); - *cbargp = NULL; + *cbargp = NULL; } static isc_result_t rdataset_setadditional(dns_rdataset_t *rdataset, dns_rdatasetadditional_t type, - dns_rdatatype_t qtype, dns_acache_t *acache, - dns_zone_t *zone, dns_db_t *db, - dns_dbversion_t *version, dns_dbnode_t *node, - dns_name_t *fname) + dns_rdatatype_t qtype, dns_acache_t *acache, + dns_zone_t *zone, dns_db_t *db, + dns_dbversion_t *version, dns_dbnode_t *node, + dns_name_t *fname) { - dns_rbtdb_t *rbtdb = rdataset->private1; - dns_rbtnode_t *rbtnode = rdataset->private2; - unsigned char *raw = rdataset->private3; /* RDATASLAB */ - unsigned int current_count = rdataset->privateuint4; - rdatasetheader_t *header; - unsigned int total_count, count; - nodelock_t *nodelock; - isc_result_t result; - acachectl_t *acarray; - dns_acacheentry_t *newentry, *oldentry = NULL; - acache_cbarg_t *newcbarg, *oldcbarg = NULL; - - UNUSED(qtype); - - if (type == dns_rdatasetadditional_fromcache) - return (ISC_R_SUCCESS); - - header = (struct rdatasetheader *)(raw - sizeof(*header)); - - total_count = raw[0] * 256 + raw[1]; - INSIST(total_count > current_count); - count = total_count - current_count - 1; /* should be private data */ - - newcbarg = isc_mem_get(rbtdb->common.mctx, sizeof(*newcbarg)); - if (newcbarg == NULL) - return (ISC_R_NOMEMORY); - newcbarg->type = type; - newcbarg->count = count; - newcbarg->header = header; - newcbarg->db = NULL; - dns_db_attach((dns_db_t *)rbtdb, &newcbarg->db); - newcbarg->node = NULL; - dns_db_attachnode((dns_db_t *)rbtdb, (dns_dbnode_t *)rbtnode, - &newcbarg->node); - newentry = NULL; - result = dns_acache_createentry(acache, (dns_db_t *)rbtdb, - acache_callback, newcbarg, &newentry); - if (result != ISC_R_SUCCESS) - goto fail; - /* Set cache data in the new entry. */ - result = dns_acache_setentry(acache, newentry, zone, db, - version, node, fname); - if (result != ISC_R_SUCCESS) - goto fail; - - nodelock = &rbtdb->node_locks[rbtnode->locknum].lock; - NODE_LOCK(nodelock, isc_rwlocktype_write); - - acarray = NULL; - switch (type) { - case dns_rdatasetadditional_fromauth: - acarray = header->additional_auth; - break; - case dns_rdatasetadditional_fromglue: - acarray = header->additional_glue; - break; - default: - INSIST(0); - } - - if (acarray == NULL) { - unsigned int i; - - acarray = isc_mem_get(rbtdb->common.mctx, total_count * - sizeof(acachectl_t)); - - if (acarray == NULL) { - NODE_UNLOCK(nodelock, isc_rwlocktype_write); - goto fail; - } - - for (i = 0; i < total_count; i++) { - acarray[i].entry = NULL; - acarray[i].cbarg = NULL; - } - } - switch (type) { - case dns_rdatasetadditional_fromauth: - header->additional_auth = acarray; - break; - case dns_rdatasetadditional_fromglue: - header->additional_glue = acarray; - break; - default: - INSIST(0); - } - - if (acarray[count].entry != NULL) { - /* - * Swap the entry. Delay cleaning-up the old entry since - * it would require a node lock. - */ - oldentry = acarray[count].entry; - INSIST(acarray[count].cbarg != NULL); - oldcbarg = acarray[count].cbarg; - } - acarray[count].entry = newentry; - acarray[count].cbarg = newcbarg; - - NODE_UNLOCK(nodelock, isc_rwlocktype_write); - - if (oldentry != NULL) { - if (oldcbarg != NULL) - acache_cancelentry(rbtdb->common.mctx, oldentry, - &oldcbarg); - dns_acache_detachentry(&oldentry); - } - - return (ISC_R_SUCCESS); + dns_rbtdb_t *rbtdb = rdataset->private1; + dns_rbtnode_t *rbtnode = rdataset->private2; + unsigned char *raw = rdataset->private3; /* RDATASLAB */ + unsigned int current_count = rdataset->privateuint4; + rdatasetheader_t *header; + unsigned int total_count, count; + nodelock_t *nodelock; + isc_result_t result; + acachectl_t *acarray; + dns_acacheentry_t *newentry, *oldentry = NULL; + acache_cbarg_t *newcbarg, *oldcbarg = NULL; + + UNUSED(qtype); + + if (type == dns_rdatasetadditional_fromcache) + return (ISC_R_SUCCESS); + + header = (struct rdatasetheader *)(raw - sizeof(*header)); + + total_count = raw[0] * 256 + raw[1]; + INSIST(total_count > current_count); + count = total_count - current_count - 1; /* should be private data */ + + newcbarg = isc_mem_get(rbtdb->common.mctx, sizeof(*newcbarg)); + if (newcbarg == NULL) + return (ISC_R_NOMEMORY); + newcbarg->type = type; + newcbarg->count = count; + newcbarg->header = header; + newcbarg->db = NULL; + dns_db_attach((dns_db_t *)rbtdb, &newcbarg->db); + newcbarg->node = NULL; + dns_db_attachnode((dns_db_t *)rbtdb, (dns_dbnode_t *)rbtnode, + &newcbarg->node); + newentry = NULL; + result = dns_acache_createentry(acache, (dns_db_t *)rbtdb, + acache_callback, newcbarg, &newentry); + if (result != ISC_R_SUCCESS) + goto fail; + /* Set cache data in the new entry. */ + result = dns_acache_setentry(acache, newentry, zone, db, + version, node, fname); + if (result != ISC_R_SUCCESS) + goto fail; + + nodelock = &rbtdb->node_locks[rbtnode->locknum].lock; + NODE_LOCK(nodelock, isc_rwlocktype_write); + + acarray = NULL; + switch (type) { + case dns_rdatasetadditional_fromauth: + acarray = header->additional_auth; + break; + case dns_rdatasetadditional_fromglue: + acarray = header->additional_glue; + break; + default: + INSIST(0); + } + + if (acarray == NULL) { + unsigned int i; + + acarray = isc_mem_get(rbtdb->common.mctx, total_count * + sizeof(acachectl_t)); + + if (acarray == NULL) { + NODE_UNLOCK(nodelock, isc_rwlocktype_write); + goto fail; + } + + for (i = 0; i < total_count; i++) { + acarray[i].entry = NULL; + acarray[i].cbarg = NULL; + } + } + switch (type) { + case dns_rdatasetadditional_fromauth: + header->additional_auth = acarray; + break; + case dns_rdatasetadditional_fromglue: + header->additional_glue = acarray; + break; + default: + INSIST(0); + } + + if (acarray[count].entry != NULL) { + /* + * Swap the entry. Delay cleaning-up the old entry since + * it would require a node lock. + */ + oldentry = acarray[count].entry; + INSIST(acarray[count].cbarg != NULL); + oldcbarg = acarray[count].cbarg; + } + acarray[count].entry = newentry; + acarray[count].cbarg = newcbarg; + + NODE_UNLOCK(nodelock, isc_rwlocktype_write); + + if (oldentry != NULL) { + acache_cancelentry(rbtdb->common.mctx, oldentry, &oldcbarg); + dns_acache_detachentry(&oldentry); + } + + return (ISC_R_SUCCESS); fail: - if (newcbarg != NULL) { - if (newentry != NULL) { - acache_cancelentry(rbtdb->common.mctx, newentry, - &newcbarg); - dns_acache_detachentry(&newentry); - } else { - dns_db_detachnode((dns_db_t *)rbtdb, &newcbarg->node); - dns_db_detach(&newcbarg->db); - isc_mem_put(rbtdb->common.mctx, newcbarg, - sizeof(*newcbarg)); - } - } - - return (result); + if (newcbarg != NULL) { + if (newentry != NULL) { + acache_cancelentry(rbtdb->common.mctx, newentry, + &newcbarg); + dns_acache_detachentry(&newentry); + } else { + dns_db_detachnode((dns_db_t *)rbtdb, &newcbarg->node); + dns_db_detach(&newcbarg->db); + isc_mem_put(rbtdb->common.mctx, newcbarg, + sizeof(*newcbarg)); + } + } + + return (result); } static isc_result_t rdataset_putadditional(dns_acache_t *acache, dns_rdataset_t *rdataset, - dns_rdatasetadditional_t type, dns_rdatatype_t qtype) + dns_rdatasetadditional_t type, dns_rdatatype_t qtype) { - dns_rbtdb_t *rbtdb = rdataset->private1; - dns_rbtnode_t *rbtnode = rdataset->private2; - unsigned char *raw = rdataset->private3; /* RDATASLAB */ - unsigned int current_count = rdataset->privateuint4; - rdatasetheader_t *header; - nodelock_t *nodelock; - unsigned int total_count, count; - acachectl_t *acarray; - dns_acacheentry_t *entry; - acache_cbarg_t *cbarg; - - UNUSED(qtype); /* we do not use this value at least for now */ - UNUSED(acache); - - if (type == dns_rdatasetadditional_fromcache) - return (ISC_R_SUCCESS); - - header = (struct rdatasetheader *)(raw - sizeof(*header)); - - total_count = raw[0] * 256 + raw[1]; - INSIST(total_count > current_count); - count = total_count - current_count - 1; - - acarray = NULL; - entry = NULL; - - nodelock = &rbtdb->node_locks[rbtnode->locknum].lock; - NODE_LOCK(nodelock, isc_rwlocktype_write); - - switch (type) { - case dns_rdatasetadditional_fromauth: - acarray = header->additional_auth; - break; - case dns_rdatasetadditional_fromglue: - acarray = header->additional_glue; - break; - default: - INSIST(0); - } - - if (acarray == NULL) { - NODE_UNLOCK(nodelock, isc_rwlocktype_write); - return (ISC_R_NOTFOUND); - } - - entry = acarray[count].entry; - if (entry == NULL) { - NODE_UNLOCK(nodelock, isc_rwlocktype_write); - return (ISC_R_NOTFOUND); - } - - acarray[count].entry = NULL; - cbarg = acarray[count].cbarg; - acarray[count].cbarg = NULL; - - NODE_UNLOCK(nodelock, isc_rwlocktype_write); - - if (entry != NULL) { - if (cbarg != NULL) - acache_cancelentry(rbtdb->common.mctx, entry, &cbarg); - dns_acache_detachentry(&entry); - } - - return (ISC_R_SUCCESS); + dns_rbtdb_t *rbtdb = rdataset->private1; + dns_rbtnode_t *rbtnode = rdataset->private2; + unsigned char *raw = rdataset->private3; /* RDATASLAB */ + unsigned int current_count = rdataset->privateuint4; + rdatasetheader_t *header; + nodelock_t *nodelock; + unsigned int total_count, count; + acachectl_t *acarray; + dns_acacheentry_t *entry; + acache_cbarg_t *cbarg; + + UNUSED(qtype); /* we do not use this value at least for now */ + UNUSED(acache); + + if (type == dns_rdatasetadditional_fromcache) + return (ISC_R_SUCCESS); + + header = (struct rdatasetheader *)(raw - sizeof(*header)); + + total_count = raw[0] * 256 + raw[1]; + INSIST(total_count > current_count); + count = total_count - current_count - 1; + + acarray = NULL; + entry = NULL; + + nodelock = &rbtdb->node_locks[rbtnode->locknum].lock; + NODE_LOCK(nodelock, isc_rwlocktype_write); + + switch (type) { + case dns_rdatasetadditional_fromauth: + acarray = header->additional_auth; + break; + case dns_rdatasetadditional_fromglue: + acarray = header->additional_glue; + break; + default: + INSIST(0); + } + + if (acarray == NULL) { + NODE_UNLOCK(nodelock, isc_rwlocktype_write); + return (ISC_R_NOTFOUND); + } + + entry = acarray[count].entry; + if (entry == NULL) { + NODE_UNLOCK(nodelock, isc_rwlocktype_write); + return (ISC_R_NOTFOUND); + } + + acarray[count].entry = NULL; + cbarg = acarray[count].cbarg; + acarray[count].cbarg = NULL; + + NODE_UNLOCK(nodelock, isc_rwlocktype_write); + + if (entry != NULL) { + if (cbarg != NULL) + acache_cancelentry(rbtdb->common.mctx, entry, &cbarg); + dns_acache_detachentry(&entry); + } + + return (ISC_R_SUCCESS); } /*% @@ -7487,28 +7317,28 @@ rdataset_putadditional(dns_acache_t *acache, dns_rdataset_t *rdataset, */ static inline isc_boolean_t need_headerupdate(rdatasetheader_t *header, isc_stdtime_t now) { - if ((header->attributes & - (RDATASET_ATTR_NONEXISTENT|RDATASET_ATTR_STALE)) != 0) - return (ISC_FALSE); + if ((header->attributes & + (RDATASET_ATTR_NONEXISTENT|RDATASET_ATTR_STALE)) != 0) + return (ISC_FALSE); #ifdef ISC_PLATFORM_USETHREADS - if (header->type == dns_rdatatype_ns || - (header->trust == dns_trust_glue && - (header->type == dns_rdatatype_a || - header->type == dns_rdatatype_aaaa))) { - /* - * Glue records are updated if at least 60 seconds have passed - * since the previous update time. - */ - return (header->last_used + 60 <= now); - } - - /* Other records are updated if 5 minutes have passed. */ - return (header->last_used + 300 <= now); + if (header->type == dns_rdatatype_ns || + (header->trust == dns_trust_glue && + (header->type == dns_rdatatype_a || + header->type == dns_rdatatype_aaaa))) { + /* + * Glue records are updated if at least 60 seconds have passed + * since the previous update time. + */ + return (header->last_used + 60 <= now); + } + + /* Other records are updated if 5 minutes have passed. */ + return (header->last_used + 300 <= now); #else - UNUSED(now); + UNUSED(now); - return (ISC_TRUE); + return (ISC_TRUE); #endif } @@ -7522,16 +7352,16 @@ need_headerupdate(rdatasetheader_t *header, isc_stdtime_t now) { */ static void update_header(dns_rbtdb_t *rbtdb, rdatasetheader_t *header, - isc_stdtime_t now) + isc_stdtime_t now) { - /* To be checked: can we really assume this? XXXMLG */ - INSIST(ISC_LINK_LINKED(header, lru_link)); - - ISC_LIST_UNLINK(rbtdb->rdatasets[header->node->locknum], - header, lru_link); - header->last_used = now; - ISC_LIST_PREPEND(rbtdb->rdatasets[header->node->locknum], - header, lru_link); + /* To be checked: can we really assume this? XXXMLG */ + INSIST(ISC_LINK_LINKED(header, lru_link)); + + ISC_LIST_UNLINK(rbtdb->rdatasets[header->node->locknum], + header, lru_link); + header->last_used = now; + ISC_LIST_PREPEND(rbtdb->rdatasets[header->node->locknum], + header, lru_link); } /*% @@ -7549,83 +7379,65 @@ update_header(dns_rbtdb_t *rbtdb, rdatasetheader_t *header, */ static void check_stale_cache(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, - isc_stdtime_t now, isc_boolean_t tree_locked) + isc_stdtime_t now, isc_boolean_t tree_locked) { - rdatasetheader_t *victim; - isc_boolean_t overmem = rbtdb->overmem; - int scans = 0; /* for debug */ - int victims = 0; - - /* - * Check for TTL-based expiry. - */ - victim = isc_heap_element(rbtdb->heaps[rbtnode->locknum], 1); - if (victim != NULL && victim->rdh_ttl <= now - RBTDB_VIRTUAL) { - INSIST(victim->node->locknum == rbtnode->locknum); - -#ifdef LRU_DEBUG - /* for debug */ - rbtdb->cachestat.stale_expire++; -#endif - victims++; - - set_ttl(rbtdb, victim, 0); - victim->attributes |= RDATASET_ATTR_STALE; - victim->node->dirty = 1; - - if (dns_rbtnode_refcurrent(victim->node) == 0) { - INSIST(rbtnode != victim->node); - /* - * If no one else is using the node, we can - * clean it up now. We first need to gain - * a new reference to the node to meet a - * requirement of decrement_reference(). - */ - new_reference(rbtdb, victim->node); - decrement_reference(rbtdb, victim->node, 0, - isc_rwlocktype_write, - tree_locked ? isc_rwlocktype_write : - isc_rwlocktype_none); - } - } - - /* - * If we are over memory, delete the end entry from the LRU. - */ - victim = ISC_LIST_TAIL(rbtdb->rdatasets[rbtnode->locknum]); - if (victim != NULL && overmem) { - INSIST(victim->node->locknum == rbtnode->locknum); - -#ifdef LRU_DEBUG - /* for debug */ - rbtdb->cachestat.stale_lru++; -#endif - victims++; - scans++; - - set_ttl(rbtdb, victim, 0); - victim->attributes |= RDATASET_ATTR_STALE; - victim->node->dirty = 1; - - if (dns_rbtnode_refcurrent(victim->node) == 0) { - INSIST(rbtnode != victim->node); - /* - * If no one else is using the node, we can - * clean it up now. We first need to gain - * a new reference to the node to meet a - * requirement of decrement_reference(). - */ - new_reference(rbtdb, victim->node); - decrement_reference(rbtdb, victim->node, 0, - isc_rwlocktype_write, - tree_locked ? isc_rwlocktype_write : - isc_rwlocktype_none); - } - } - -#ifdef LRU_DEBUG - /* update statistics for debug (no lock for brevity) */ - rbtdb->cachestat.stale_scan += scans; - rbtdb->cachestat.stale_purge += victims; -#endif + rdatasetheader_t *victim; + isc_boolean_t overmem = rbtdb->overmem; + int victims = 0; + + /* + * Check for TTL-based expiry. + */ + victim = isc_heap_element(rbtdb->heaps[rbtnode->locknum], 1); + if (victim != NULL && victim->rdh_ttl <= now - RBTDB_VIRTUAL) { + INSIST(victim->node->locknum == rbtnode->locknum); + victims++; + + set_ttl(rbtdb, victim, 0); + victim->attributes |= RDATASET_ATTR_STALE; + victim->node->dirty = 1; + + if (dns_rbtnode_refcurrent(victim->node) == 0) { + INSIST(rbtnode != victim->node); + /* + * If no one else is using the node, we can + * clean it up now. We first need to gain + * a new reference to the node to meet a + * requirement of decrement_reference(). + */ + new_reference(rbtdb, victim->node); + decrement_reference(rbtdb, victim->node, 0, + isc_rwlocktype_write, + tree_locked ? isc_rwlocktype_write : + isc_rwlocktype_none); + } + } + + /* + * If we are over memory, delete the end entry from the LRU. + */ + victim = ISC_LIST_TAIL(rbtdb->rdatasets[rbtnode->locknum]); + if (victim != NULL && overmem) { + INSIST(victim->node->locknum == rbtnode->locknum); + victims++; + + set_ttl(rbtdb, victim, 0); + victim->attributes |= RDATASET_ATTR_STALE; + victim->node->dirty = 1; + + if (dns_rbtnode_refcurrent(victim->node) == 0) { + INSIST(rbtnode != victim->node); + /* + * If no one else is using the node, we can + * clean it up now. We first need to gain + * a new reference to the node to meet a + * requirement of decrement_reference(). + */ + new_reference(rbtdb, victim->node); + decrement_reference(rbtdb, victim->node, 0, + isc_rwlocktype_write, + tree_locked ? isc_rwlocktype_write : + isc_rwlocktype_none); + } + } } diff --git a/lib/dns/rdata/generic/txt_16.c b/lib/dns/rdata/generic/txt_16.c index 1d0a27a0..d3c9dc39 100644 --- a/lib/dns/rdata/generic/txt_16.c +++ b/lib/dns/rdata/generic/txt_16.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-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: txt_16.c,v 1.43 2007/06/19 23:47:17 tbox Exp $ */ +/* $Id: txt_16.c,v 1.43.128.2 2008/02/15 23:46:22 tbox Exp $ */ /* Reviewed: Thu Mar 16 15:40:00 PST 2000 by bwelling */ @@ -142,7 +142,7 @@ fromstruct_txt(ARGS_FROMSTRUCT) { while (region.length > 0) { length = uint8_fromregion(®ion); isc_region_consume(®ion, 1); - if (region.length <= length) + if (region.length < length) return (ISC_R_UNEXPECTEDEND); isc_region_consume(®ion, length); } diff --git a/lib/dns/rdata/in_1/naptr_35.c b/lib/dns/rdata/in_1/naptr_35.c index 2b28711a..18ea614a 100644 --- a/lib/dns/rdata/in_1/naptr_35.c +++ b/lib/dns/rdata/in_1/naptr_35.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2008 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: naptr_35.c,v 1.51 2007/06/19 23:47:17 tbox Exp $ */ +/* $Id: naptr_35.c,v 1.51.128.2 2008/02/15 23:46:22 tbox Exp $ */ /* Reviewed: Thu Mar 16 16:52:50 PST 2000 by bwelling */ @@ -154,7 +154,7 @@ totext_in_naptr(ARGS_TOTEXT) { static inline isc_result_t fromwire_in_naptr(ARGS_FROMWIRE) { - dns_name_t name; + dns_name_t name; isc_region_t sr; REQUIRE(type == 35); @@ -165,7 +165,7 @@ fromwire_in_naptr(ARGS_FROMWIRE) { dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE); - dns_name_init(&name, NULL); + dns_name_init(&name, NULL); /* * Order, preference. @@ -321,8 +321,8 @@ fromstruct_in_naptr(ARGS_FROMSTRUCT) { REQUIRE(naptr->common.rdtype == type); REQUIRE(naptr->common.rdclass == rdclass); REQUIRE(naptr->flags != NULL || naptr->flags_len == 0); - REQUIRE(naptr->service != NULL && naptr->service_len == 0); - REQUIRE(naptr->regexp != NULL && naptr->regexp_len == 0); + REQUIRE(naptr->service != NULL || naptr->service_len == 0); + REQUIRE(naptr->regexp != NULL || naptr->regexp_len == 0); UNUSED(type); UNUSED(rdclass); diff --git a/lib/dns/rdatalist.c b/lib/dns/rdatalist.c index 4c775d2a..836d9974 100644 --- a/lib/dns/rdatalist.c +++ b/lib/dns/rdatalist.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2008 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.33 2007/06/19 23:47:16 tbox Exp $ */ +/* $Id: rdatalist.c,v 1.33.128.2 2008/04/03 06:08:27 tbox Exp $ */ /*! \file */ @@ -88,6 +88,16 @@ dns_rdatalist_tordataset(dns_rdatalist_t *rdatalist, return (ISC_R_SUCCESS); } +isc_result_t +dns_rdatalist_fromrdataset(dns_rdataset_t *rdataset, + dns_rdatalist_t **rdatalist) +{ + REQUIRE(rdatalist != NULL && rdataset != NULL); + *rdatalist = rdataset->private1; + + return (ISC_R_SUCCESS); +} + void isc__rdatalist_disassociate(dns_rdataset_t *rdataset) { UNUSED(rdataset); diff --git a/lib/dns/rdataslab.c b/lib/dns/rdataslab.c index 6de77bac..5059a744 100644 --- a/lib/dns/rdataslab.c +++ b/lib/dns/rdataslab.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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.43 2007/06/18 23:47:41 tbox Exp $ */ +/* $Id: rdataslab.c,v 1.43.128.2 2008/04/23 23:46:29 tbox Exp $ */ /*! \file */ @@ -33,10 +33,6 @@ #include <dns/rdataset.h> #include <dns/rdataslab.h> -#ifndef DNS_RDATASET_FIXED -#define DNS_RDATASET_FIXED 1 -#endif - /* * The rdataslab structure allows iteration to occur in both load order * and DNSSEC order. The structure is as follows: @@ -246,7 +242,7 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx, result = ISC_R_NOMEMORY; goto free_rdatas; } - + #if DNS_RDATASET_FIXED /* Allocate temporary offset table. */ offsettable = isc_mem_get(mctx, nalloc * sizeof(unsigned int)); @@ -288,7 +284,7 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx, memcpy(rawbuf, x[i].rdata.data, x[i].rdata.length); rawbuf += x[i].rdata.length; } - + #if DNS_RDATASET_FIXED fillin_offsets(offsetbase, offsettable, nalloc); isc_mem_put(mctx, offsettable, nalloc * sizeof(unsigned int)); @@ -368,7 +364,7 @@ rdataset_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata) { raw += 4; #else raw += 2; -#endif +#endif r.base = raw; dns_rdata_fromregion(rdata, rdataset->rdclass, rdataset->type, &r); } @@ -511,7 +507,7 @@ rdata_in_slab(unsigned char *slab, unsigned int reservelen, for (i = 0; i < count; i++) { rdata_from_slab(¤t, rdclass, type, &trdata); - + n = dns_rdata_compare(&trdata, rdata); if (n == 0) return (ISC_TRUE); @@ -799,8 +795,8 @@ dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab, #if DNS_RDATASET_FIXED unsigned char *offsetbase; unsigned int *offsettable; -#endif unsigned int order; +#endif REQUIRE(tslabp != NULL && *tslabp == NULL); REQUIRE(mslab != NULL && sslab != NULL); diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index e655686b..12a371d3 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -15,12 +15,13 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: resolver.c,v 1.355.12.4 2008/01/17 23:46:37 tbox Exp $ */ +/* $Id: resolver.c,v 1.355.12.15 2008/05/06 01:11:30 each Exp $ */ /*! \file */ #include <config.h> +#include <isc/platform.h> #include <isc/print.h> #include <isc/string.h> #include <isc/random.h> @@ -53,6 +54,7 @@ #include <dns/resolver.h> #include <dns/result.h> #include <dns/rootns.h> +#include <dns/stats.h> #include <dns/tsig.h> #include <dns/validator.h> @@ -222,7 +224,7 @@ struct fetchctx { /*% * Look aside state for DS lookups. */ - dns_name_t nsname; + dns_name_t nsname; dns_fetch_t * nsfetch; dns_rdataset_t nsrrset; @@ -351,11 +353,7 @@ struct dns_resolver { isc_timer_t * spillattimer; isc_boolean_t zero_no_soa_ttl; isc_timer_t * disppooltimer; -#ifdef LRU_DEBUG -#define DUMP_INTERVAL 30 /* seconds */ - isc_timer_t * dumptimer; - isc_time_t dump_time; -#endif + /* Locked by lock. */ unsigned int references; isc_boolean_t exiting; @@ -371,15 +369,6 @@ struct dns_resolver { /* Locked by poollock. */ dns_dispatch_t ** dispatchv4pool; dns_dispatch_t ** dispatchv6pool; - -#ifdef LRU_DEBUG - /* Unlocked: just for debug */ - unsigned int extqueries; - unsigned int extqueries_ns; - unsigned int extqueries_soa; - unsigned int extqueries_a; - unsigned int extqueries_aaaa; -#endif }; #define RES_MAGIC ISC_MAGIC('R', 'e', 's', '!') @@ -403,7 +392,7 @@ 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); +static void fctx_try(fetchctx_t *fctx, isc_boolean_t retrying); 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, @@ -414,9 +403,14 @@ static isc_result_t ncache_adderesult(dns_message_t *message, static void validated(isc_task_t *task, isc_event_t *event); static void maybe_destroy(fetchctx_t *fctx); -#ifdef LRU_DEBUG -static void timer_dump(isc_task_t *task, isc_event_t *ev); -#endif +/*% + * Increment resolver-related statistics counters. + */ +static inline void +inc_stats(dns_resolver_t *res, dns_statscounter_t counter) { + if (res->view->resstats != NULL) + dns_generalstats_increment(res->view->resstats, counter); +} static isc_result_t valcreate(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo, dns_name_t *name, @@ -444,6 +438,7 @@ valcreate(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo, dns_name_t *name, valoptions, task, validated, valarg, &validator); if (result == ISC_R_SUCCESS) { + inc_stats(fctx->res, dns_resstatscounter_val); if ((valoptions & DNS_VALIDATOR_DEFER) == 0) { INSIST(fctx->validator == NULL); fctx->validator = validator; @@ -988,12 +983,13 @@ resquery_senddone(isc_task_t *task, isc_event_t *event) { if (result != ISC_R_SUCCESS) fctx_done(fctx, result); else - fctx_try(fctx); + fctx_try(fctx, ISC_TRUE); } } static inline isc_result_t -fctx_addopt(dns_message_t *message, unsigned int version, isc_uint16_t udpsize) +fctx_addopt(dns_message_t *message, unsigned int version, + isc_uint16_t udpsize, isc_boolean_t request_nsid) { dns_rdataset_t *rdataset; dns_rdatalist_t *rdatalist; @@ -1029,10 +1025,23 @@ fctx_addopt(dns_message_t *message, unsigned int version, isc_uint16_t udpsize) rdatalist->ttl |= DNS_MESSAGEEXTFLAG_DO; /* - * No EDNS options. + * Set EDNS options if applicable */ - rdata->data = NULL; - rdata->length = 0; + if (request_nsid) { + /* Send empty NSID option (RFC5001) */ + unsigned char data[4]; + isc_buffer_t buf; + + isc_buffer_init(&buf, data, sizeof(data)); + isc_buffer_putuint16(&buf, DNS_OPT_NSID); + isc_buffer_putuint16(&buf, 0); + rdata->data = data; + rdata->length = sizeof(data); + } else { + rdata->data = NULL; + rdata->length = 0; + } + rdata->rdclass = rdatalist->rdclass; rdata->type = rdatalist->type; rdata->flags = 0; @@ -1289,6 +1298,13 @@ fctx_query(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo, ISC_LIST_APPEND(fctx->queries, query, link); query->fctx->nqueries++; + if (isc_sockaddr_pf(&addrinfo->sockaddr) == PF_INET) + inc_stats(res, dns_resstatscounter_queryv4); + else + inc_stats(res, dns_resstatscounter_queryv6); + if (res->view->resquerystats != NULL) + dns_rdatatypestats_increment(res->view->resquerystats, + fctx->type); return (ISC_R_SUCCESS); @@ -1548,6 +1564,7 @@ resquery_send(resquery_t *query) { unsigned int version = 0; /* Default version. */ unsigned int flags; isc_uint16_t udpsize = res->udpsize; + isc_boolean_t reqnsid = res->view->requestnsid; flags = query->addrinfo->flags; if ((flags & DNS_FETCHOPT_EDNSVERSIONSET) != 0) { @@ -1558,8 +1575,15 @@ resquery_send(resquery_t *query) { udpsize = 512; else if (peer != NULL) (void)dns_peer_getudpsize(peer, &udpsize); - result = fctx_addopt(fctx->qmessage, version, udpsize); - if (result != ISC_R_SUCCESS) { + + /* request NSID for current view or peer? */ + if (peer != NULL) + (void) dns_peer_getrequestnsid(peer, &reqnsid); + result = fctx_addopt(fctx->qmessage, version, + udpsize, reqnsid); + if (reqnsid && result == ISC_R_SUCCESS) { + query->options |= DNS_FETCHOPT_WANTNSID; + } else if (result != ISC_R_SUCCESS) { /* * We couldn't add the OPT, but we'll press on. * We're not using EDNS0, so set the NOEDNS0 @@ -1665,23 +1689,6 @@ resquery_send(resquery_t *query) { if (result != ISC_R_SUCCESS) goto cleanup_message; -#ifdef LRU_DEBUG - res->extqueries++; - switch (fctx->type) { - case dns_rdatatype_ns: - res->extqueries_ns++; - break; - case dns_rdatatype_soa: - res->extqueries_soa++; - break; - case dns_rdatatype_a: - res->extqueries_a++; - break; - case dns_rdatatype_aaaa: - res->extqueries_aaaa++; - break; - } -#endif query->sends++; QTRACE("sent"); @@ -1816,7 +1823,7 @@ resquery_connected(isc_task_t *task, isc_event_t *event) { if (result != ISC_R_SUCCESS) fctx_done(fctx, result); else - fctx_try(fctx); + fctx_try(fctx, ISC_TRUE); } } @@ -1875,7 +1882,7 @@ fctx_finddone(isc_task_t *task, isc_event_t *event) { dns_adb_destroyfind(&find); if (want_try) - fctx_try(fctx); + fctx_try(fctx, ISC_TRUE); else if (want_done) fctx_done(fctx, ISC_R_FAILURE); else if (bucket_empty) @@ -2270,6 +2277,13 @@ fctx_getaddresses(fetchctx_t *fctx) { } while (sa != NULL) { + if ((isc_sockaddr_pf(sa) == AF_INET && + fctx->res->dispatchv4 == NULL) || + (isc_sockaddr_pf(sa) == AF_INET6 && + fctx->res->dispatchv6 == NULL)) { + sa = ISC_LIST_NEXT(sa, link); + continue; + } ai = NULL; result = dns_adb_findaddrinfo(fctx->adb, sa, &ai, 0); /* XXXMLG */ @@ -2627,7 +2641,7 @@ fctx_nextaddress(fetchctx_t *fctx) { } static void -fctx_try(fetchctx_t *fctx) { +fctx_try(fetchctx_t *fctx, isc_boolean_t retrying) { isc_result_t result; dns_adbaddrinfo_t *addrinfo; @@ -2675,6 +2689,8 @@ fctx_try(fetchctx_t *fctx) { result = fctx_query(fctx, addrinfo, fctx->options); if (result != ISC_R_SUCCESS) fctx_done(fctx, result); + else if (retrying) + inc_stats(fctx->res, dns_resstatscounter_retry); } static isc_boolean_t @@ -2792,7 +2808,7 @@ fctx_timeout(isc_task_t *task, isc_event_t *event) { /* * Keep trying. */ - fctx_try(fctx); + fctx_try(fctx, ISC_TRUE); } isc_event_free(&event); @@ -2962,7 +2978,7 @@ fctx_start(isc_task_t *task, isc_event_t *event) { if (result != ISC_R_SUCCESS) fctx_done(fctx, result); else - fctx_try(fctx); + fctx_try(fctx, ISC_FALSE); } else if (bucket_empty) empty_bucket(res); } @@ -3565,6 +3581,7 @@ validated(isc_task_t *task, isc_event_t *event) { if (vevent->result != ISC_R_SUCCESS) { FCTXTRACE("validation failed"); + inc_stats(fctx->res, dns_resstatscounter_valfail); result = ISC_R_NOTFOUND; if (vevent->rdataset != NULL) result = dns_db_findnode(fctx->cache, vevent->name, @@ -3589,7 +3606,7 @@ validated(isc_task_t *task, isc_event_t *event) { } else if (sentresponse) fctx_done(fctx, result); /* Locks bucket. */ else - fctx_try(fctx); /* Locks bucket. */ + fctx_try(fctx, ISC_TRUE); /* Locks bucket. */ return; } @@ -3599,6 +3616,8 @@ validated(isc_task_t *task, isc_event_t *event) { dns_rdatatype_t covers; FCTXTRACE("nonexistence validation OK"); + inc_stats(fctx->res, dns_resstatscounter_valnegsuccess); + if (fctx->rmessage->rcode == dns_rcode_nxdomain) covers = dns_rdatatype_any; else @@ -3626,7 +3645,8 @@ validated(isc_task_t *task, isc_event_t *event) { if (result != ISC_R_SUCCESS) goto noanswer_response; goto answer_response; - } + } else + inc_stats(fctx->res, dns_resstatscounter_valsuccess); FCTXTRACE("validation OK"); @@ -5355,7 +5375,7 @@ resume_dslookup(isc_task_t *task, isc_event_t *event) { /* * Try again. */ - fctx_try(fctx); + fctx_try(fctx, ISC_TRUE); } else { unsigned int n; dns_rdataset_t *nsrdataset = NULL; @@ -5461,6 +5481,65 @@ checknames(dns_message_t *message) { checknamessection(message, DNS_SECTION_ADDITIONAL); } +/* + * Log server NSID at log level 'level' + */ +static isc_result_t +log_nsid(dns_rdataset_t *opt, resquery_t *query, int level, isc_mem_t *mctx) +{ + static const char hex[17] = "0123456789abcdef"; + char addrbuf[ISC_SOCKADDR_FORMATSIZE]; + isc_uint16_t optcode, nsid_len, buflen, i; + isc_result_t result; + isc_buffer_t nsidbuf; + dns_rdata_t rdata; + unsigned char *p, *buf, *nsid; + + /* Extract rdata from OPT rdataset */ + result = dns_rdataset_first(opt); + if (result != ISC_R_SUCCESS) + return (ISC_R_FAILURE); + + dns_rdata_init(&rdata); + dns_rdataset_current(opt, &rdata); + if (rdata.length < 4) + return (ISC_R_FAILURE); + + /* Check for NSID */ + isc_buffer_init(&nsidbuf, rdata.data, rdata.length); + isc_buffer_add(&nsidbuf, rdata.length); + optcode = isc_buffer_getuint16(&nsidbuf); + nsid_len = isc_buffer_getuint16(&nsidbuf); + if (optcode != DNS_OPT_NSID || nsid_len == 0) + return (ISC_R_FAILURE); + + /* Allocate buffer for storing hex version of the NSID */ + buflen = nsid_len * 2 + 1; + buf = isc_mem_get(mctx, buflen); + if (buf == NULL) + return (ISC_R_NOSPACE); + + /* Convert to hex */ + p = buf; + nsid = rdata.data + 4; + for (i = 0; i < nsid_len; i++) { + *p++ = hex[(nsid[0] >> 4) & 0xf]; + *p++ = hex[nsid[0] & 0xf]; + nsid++; + } + *p = '\0'; + + isc_sockaddr_format(&query->addrinfo->sockaddr, addrbuf, + sizeof(addrbuf)); + isc_log_write(dns_lctx, DNS_LOGCATEGORY_RESOLVER, + DNS_LOGMODULE_RESOLVER, level, + "received NSID '%s' from %s", buf, addrbuf); + + /* Clean up */ + isc_mem_put(mctx, buf, buflen); + return (ISC_R_SUCCESS); +} + static void log_packet(dns_message_t *message, int level, isc_mem_t *mctx) { isc_buffer_t buffer; @@ -5506,6 +5585,7 @@ resquery_response(isc_task_t *task, isc_event_t *event) { isc_boolean_t keep_trying, get_nameservers, resend; isc_boolean_t truncated; dns_message_t *message; + dns_rdataset_t *opt; fetchctx_t *fctx; dns_name_t *fname; dns_fixedname_t foundname; @@ -5524,6 +5604,11 @@ resquery_response(isc_task_t *task, isc_event_t *event) { QTRACE("response"); + if (isc_sockaddr_pf(&query->addrinfo->sockaddr) == PF_INET) + inc_stats(fctx->res, dns_resstatscounter_responsev4); + else + inc_stats(fctx->res, dns_resstatscounter_responsev6); + (void)isc_timer_touch(fctx->timer); keep_trying = ISC_FALSE; @@ -5625,6 +5710,8 @@ resquery_response(isc_task_t *task, isc_event_t *event) { query->addrinfo, DNS_FETCHOPT_NOEDNS0, DNS_FETCHOPT_NOEDNS0); + inc_stats(fctx->res, + dns_resstatscounter_edns0fail); } else { broken_server = result; keep_trying = ISC_TRUE; @@ -5653,6 +5740,8 @@ resquery_response(isc_task_t *task, isc_event_t *event) { query->addrinfo, DNS_FETCHOPT_NOEDNS0, DNS_FETCHOPT_NOEDNS0); + inc_stats(fctx->res, + dns_resstatscounter_edns0fail); } else { broken_server = DNS_R_UNEXPECTEDRCODE; keep_trying = ISC_TRUE; @@ -5666,12 +5755,21 @@ resquery_response(isc_task_t *task, isc_event_t *event) { } } + /* * Log the incoming packet. */ log_packet(message, ISC_LOG_DEBUG(10), fctx->res->mctx); /* + * Did we request NSID? If so, and if the response contains + * NSID data, log it at INFO level. + */ + opt = dns_message_getopt(message); + if (opt != NULL && (query->options & DNS_FETCHOPT_WANTNSID) != 0) + log_nsid(opt, query, ISC_LOG_INFO, fctx->res->mctx); + + /* * If the message is signed, check the signature. If not, this * returns success anyway. */ @@ -5699,6 +5797,7 @@ resquery_response(isc_task_t *task, isc_event_t *event) { truncated = ISC_TRUE; if (truncated) { + inc_stats(fctx->res, dns_resstatscounter_truncated); if ((options & DNS_FETCHOPT_TCP) != 0) { broken_server = DNS_R_TRUNCATEDTCP; keep_trying = ISC_TRUE; @@ -5720,6 +5819,26 @@ resquery_response(isc_task_t *task, isc_event_t *event) { } /* + * Update statistics about erroneous responses. + */ + if (message->rcode != dns_rcode_noerror) { + switch (message->rcode) { + case dns_rcode_nxdomain: + inc_stats(fctx->res, dns_resstatscounter_nxdomain); + break; + case dns_rcode_servfail: + inc_stats(fctx->res, dns_resstatscounter_servfail); + break; + case dns_rcode_formerr: + inc_stats(fctx->res, dns_resstatscounter_formerr); + break; + default: + inc_stats(fctx->res, dns_resstatscounter_othererror); + break; + } + } + + /* * Is the remote server broken, or does it dislike us? */ if (message->rcode != dns_rcode_noerror && @@ -5744,6 +5863,7 @@ resquery_response(isc_task_t *task, isc_event_t *event) { dns_adb_changeflags(fctx->adb, query->addrinfo, DNS_FETCHOPT_NOEDNS0, DNS_FETCHOPT_NOEDNS0); + inc_stats(fctx->res, dns_resstatscounter_edns0fail); } else if (message->rcode == dns_rcode_formerr) { if (ISFORWARDER(query->addrinfo)) { /* @@ -5771,12 +5891,10 @@ resquery_response(isc_task_t *task, isc_event_t *event) { */ result = DNS_R_YXDOMAIN; } else if (message->rcode == dns_rcode_badvers) { - dns_rdataset_t *opt; unsigned int flags, mask; unsigned int version; resend = ISC_TRUE; - opt = dns_message_getopt(message); version = (opt->ttl >> 16) & 0xff; flags = (version << DNS_FETCHOPT_EDNSVERSIONSHIFT) | DNS_FETCHOPT_EDNSVERSIONSET; @@ -5819,6 +5937,7 @@ resquery_response(isc_task_t *task, isc_event_t *event) { */ if (fctx->res->lame_ttl != 0 && !ISFORWARDER(query->addrinfo) && is_lame(fctx)) { + inc_stats(fctx->res, dns_resstatscounter_lame); log_lame(fctx, query->addrinfo); result = dns_adb_marklame(fctx->adb, query->addrinfo, &fctx->name, fctx->type, @@ -6062,12 +6181,13 @@ resquery_response(isc_task_t *task, isc_event_t *event) { /* * Try again. */ - fctx_try(fctx); + fctx_try(fctx, !get_nameservers); } else if (resend) { /* * Resend (probably with changed options). */ FCTXTRACE("resend"); + inc_stats(fctx->res, dns_resstatscounter_retry); result = fctx_query(fctx, addrinfo, options); if (result != ISC_R_SUCCESS) fctx_done(fctx, result); @@ -6137,16 +6257,6 @@ destroy(dns_resolver_t *res) { INSIST(res->nfctx == 0); -#ifdef LRU_DEBUG - isc_log_write(dns_lctx, DNS_LOGCATEGORY_RESOLVER, - DNS_LOGMODULE_RESOLVER, ISC_LOG_INFO, - "destroying resolver %p: external queries " - "total/NS/SOA/A/AAAA=%u/%u/%u/%u/%u", - res, res->extqueries, res->extqueries_ns, - res->extqueries_soa, res->extqueries_a, - res->extqueries_aaaa); -#endif - RES_DESTROYLOCK(&res->poollock); DESTROYLOCK(&res->primelock); DESTROYLOCK(&res->nlock); @@ -6184,10 +6294,6 @@ destroy(dns_resolver_t *res) { } if (res->disppooltimer != NULL) isc_timer_detach(&res->disppooltimer); -#ifdef LRU_DEBUG - if (res->dumptimer != NULL) - isc_timer_detach(&res->dumptimer); -#endif dns_resolver_reset_algorithms(res); dns_resolver_resetmustbesecure(res); #if USE_ALGLOCK @@ -6321,15 +6427,6 @@ dns_resolver_create(dns_view_t *view, res->dispatchv4pool = NULL; res->dispatchv6pool = NULL; res->disppooltimer = NULL; -#ifdef LRU_DEBUG - res->dumptimer = NULL; - res->extqueries = 0; - res->extqueries_ns = 0; - res->extqueries_soa = 0; - res->extqueries_a = 0; - res->extqueries_aaaa = 0; -#endif - res->nbuckets = ntasks; res->activebuckets = ntasks; res->buckets = isc_mem_get(view->mctx, @@ -6349,13 +6446,23 @@ dns_resolver_create(dns_view_t *view, goto cleanup_buckets; } res->buckets[i].mctx = NULL; + snprintf(name, sizeof(name), "res%u", i); +#ifdef ISC_PLATFORM_USETHREADS + /* + * Use a separate memory context for each bucket to reduce + * contention among multiple threads. Do this only when + * enabling threads because it will be require more memory. + */ result = isc_mem_create(0, 0, &res->buckets[i].mctx); if (result != ISC_R_SUCCESS) { isc_task_detach(&res->buckets[i].task); DESTROYLOCK(&res->buckets[i].lock); goto cleanup_buckets; } - snprintf(name, sizeof(name), "res%u", i); + isc_mem_setname(res->buckets[i].mctx, name, NULL); +#else + isc_mem_attach(view->mctx, &res->buckets[i].mctx); +#endif isc_task_setname(res->buckets[i].task, name, res); ISC_LIST_INIT(res->buckets[i].fctxs); res->buckets[i].exiting = ISC_FALSE; @@ -6402,22 +6509,6 @@ dns_resolver_create(dns_view_t *view, result = isc_timer_create(timermgr, isc_timertype_inactive, NULL, NULL, task, spillattimer_countdown, res, &res->spillattimer); - -#ifdef LRU_DEBUG - { - isc_interval_t interval; - - interval.seconds = DUMP_INTERVAL; - interval.nanoseconds = 0; - RUNTIME_CHECK(isc_time_nowplusinterval(&res->dump_time, - &interval) == - ISC_R_SUCCESS); - - result = isc_timer_create(timermgr, isc_timertype_once, - &res->dump_time, NULL, task, - timer_dump, res, &res->dumptimer); - } -#endif isc_task_detach(&task); if (result != ISC_R_SUCCESS) goto cleanup_poollock; @@ -7605,38 +7696,3 @@ dns_resolver_createdispatchpool(dns_resolver_t *res, unsigned int ndisps, return (result); } - -#ifdef LRU_DEBUG -static void -timer_dump(isc_task_t *task, isc_event_t *ev) { - dns_resolver_t *res; - isc_interval_t interval; - isc_time_t nexttime; - - UNUSED(task); - - res = ev->ev_arg; - INSIST(VALID_RESOLVER(res)); - - if (res->extqueries > 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_RESOLVER, - DNS_LOGMODULE_RESOLVER, ISC_LOG_INFO, - "resolver dump %p: external queries " - "total/NS/SOA/A/AAAA=%u/%u/%u/%u/%u", - res, res->extqueries, res->extqueries_ns, - res->extqueries_soa, res->extqueries_a, - res->extqueries_aaaa); - } - - interval.seconds = DUMP_INTERVAL; - interval.nanoseconds = 0; - - RUNTIME_CHECK(isc_time_add(&res->dump_time, &interval, &nexttime) == - ISC_R_SUCCESS); /* XXX: this is not always true */ - res->dump_time = nexttime; - (void)isc_timer_reset(res->dumptimer, isc_timertype_once, - &res->dump_time, NULL, ISC_FALSE); - - isc_event_free(&ev); -} -#endif diff --git a/lib/dns/rootns.c b/lib/dns/rootns.c index b3c302bd..0121325f 100644 --- a/lib/dns/rootns.c +++ b/lib/dns/rootns.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2008 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: rootns.c,v 1.32 2007/10/30 23:44:01 marka Exp $ */ +/* $Id: rootns.c,v 1.32.24.2 2008/02/05 23:46:39 tbox Exp $ */ /*! \file */ @@ -45,8 +45,6 @@ static char root_ns[] = ";\n" "; Internet Root Nameservers\n" ";\n" -"; Thu Sep 23 17:57:37 PDT 1999\n" -";\n" "$TTL 518400\n" ". 518400 IN NS A.ROOT-SERVERS.NET.\n" ". 518400 IN NS B.ROOT-SERVERS.NET.\n" @@ -62,25 +60,31 @@ static char root_ns[] = ". 518400 IN NS L.ROOT-SERVERS.NET.\n" ". 518400 IN NS M.ROOT-SERVERS.NET.\n" "A.ROOT-SERVERS.NET. 3600000 IN A 198.41.0.4\n" +"A.ROOT-SERVERS.NET. 3600000 IN AAAA 2001:503:BA3E::2:30\n" "B.ROOT-SERVERS.NET. 3600000 IN A 192.228.79.201\n" "C.ROOT-SERVERS.NET. 3600000 IN A 192.33.4.12\n" "D.ROOT-SERVERS.NET. 3600000 IN A 128.8.10.90\n" "E.ROOT-SERVERS.NET. 3600000 IN A 192.203.230.10\n" "F.ROOT-SERVERS.NET. 3600000 IN A 192.5.5.241\n" +"F.ROOT-SERVERS.NET. 3600000 IN AAAA 2001:500:2F::F\n" "G.ROOT-SERVERS.NET. 3600000 IN A 192.112.36.4\n" "H.ROOT-SERVERS.NET. 3600000 IN A 128.63.2.53\n" +"H.ROOT-SERVERS.NET. 3600000 IN AAAA 2001:500:1::803F:235\n" "I.ROOT-SERVERS.NET. 3600000 IN A 192.36.148.17\n" "J.ROOT-SERVERS.NET. 3600000 IN A 192.58.128.30\n" +"J.ROOT-SERVERS.NET. 3600000 IN AAAA 2001:503:C27::2:30\n" "K.ROOT-SERVERS.NET. 3600000 IN A 193.0.14.129\n" +"K.ROOT-SERVERS.NET. 3600000 IN AAAA 2001:7FD::1\n" "L.ROOT-SERVERS.NET. 3600000 IN A 199.7.83.42\n" -"M.ROOT-SERVERS.NET. 3600000 IN A 202.12.27.33\n"; +"M.ROOT-SERVERS.NET. 3600000 IN A 202.12.27.33\n" +"M.ROOT-SERVERS.NET. 3600000 IN AAAA 2001:DC3::35\n"; static isc_result_t in_rootns(dns_rdataset_t *rootns, dns_name_t *name) { isc_result_t result; dns_rdata_t rdata = DNS_RDATA_INIT; dns_rdata_ns_t ns; - + if (!dns_rdataset_isassociated(rootns)) return (ISC_R_NOTFOUND); @@ -99,7 +103,7 @@ in_rootns(dns_rdataset_t *rootns, dns_name_t *name) { return (result); } -static isc_result_t +static isc_result_t check_node(dns_rdataset_t *rootns, dns_name_t *name, dns_rdatasetiter_t *rdsiter) { isc_result_t result; @@ -227,7 +231,7 @@ dns_rootns_create(isc_mem_t *mctx, dns_rdataclass_t rdclass, * Default to using the Internet root servers. */ result = dns_master_loadbuffer(&source, &db->origin, - &db->origin, db->rdclass, + &db->origin, db->rdclass, DNS_MASTER_HINT, &callbacks, db->mctx); } else @@ -262,11 +266,11 @@ report(dns_view_t *view, dns_name_t *name, isc_boolean_t missing, isc_buffer_t buffer; isc_result_t result; - if (strcmp(view->name, "_bind") != 0 && - strcmp(view->name, "_default") != 0) { - viewname = view->name; - sep = ": view "; - } + if (strcmp(view->name, "_bind") != 0 && + strcmp(view->name, "_default") != 0) { + viewname = view->name; + sep = ": view "; + } dns_name_format(name, namebuf, sizeof(namebuf)); dns_rdatatype_format(rdata->type, typebuf, sizeof(typebuf)); @@ -346,7 +350,7 @@ check_address_records(dns_view_t *view, dns_db_t *hints, dns_db_t *db, report(view, name, ISC_FALSE, &rdata); result = dns_rdataset_next(&hintrrset); } - } + } if (hresult == ISC_R_NOTFOUND && (rresult == ISC_R_SUCCESS || rresult == DNS_R_GLUE)) { result = dns_rdataset_first(&rootrrset); @@ -387,7 +391,7 @@ check_address_records(dns_view_t *view, dns_db_t *hints, dns_db_t *db, dns_rdata_reset(&rdata); result = dns_rdataset_next(&hintrrset); } - } + } if (hresult == ISC_R_NOTFOUND && (rresult == ISC_R_SUCCESS || rresult == DNS_R_GLUE)) { result = dns_rdataset_first(&rootrrset); @@ -421,11 +425,11 @@ dns_root_checkhints(dns_view_t *view, dns_db_t *hints, dns_db_t *db) { isc_stdtime_get(&now); - if (strcmp(view->name, "_bind") != 0 && - strcmp(view->name, "_default") != 0) { - viewname = view->name; - sep = ": view "; - } + if (strcmp(view->name, "_bind") != 0 && + strcmp(view->name, "_default") != 0) { + viewname = view->name; + sep = ": view "; + } dns_rdataset_init(&hintns); dns_rdataset_init(&rootns); @@ -453,7 +457,7 @@ dns_root_checkhints(dns_view_t *view, dns_db_t *hints, dns_db_t *db) { dns_result_totext(result)); goto cleanup; } - + /* * Look for missing root NS names. */ @@ -472,7 +476,7 @@ dns_root_checkhints(dns_view_t *view, dns_db_t *hints, dns_db_t *db) { "checkhints%s%s: unable to find root " "NS '%s' in hints", sep, viewname, namebuf); - } else + } else check_address_records(view, hints, db, &ns.name, now); dns_rdata_reset(&rdata); result = dns_rdataset_next(&rootns); diff --git a/lib/dns/sdb.c b/lib/dns/sdb.c index 8c035ccd..2c3002bb 100644 --- a/lib/dns/sdb.c +++ b/lib/dns/sdb.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: sdb.c,v 1.59.94.3 2008/01/17 23:46:37 tbox Exp $ */ +/* $Id: sdb.c,v 1.59.94.5 2008/04/03 10:51:01 marka Exp $ */ /*! \file */ @@ -1247,6 +1247,7 @@ static dns_dbmethods_t sdb_methods = { overmem, settask, NULL, + NULL, NULL }; diff --git a/lib/dns/sdlz.c b/lib/dns/sdlz.c index 627ea2e1..5ab04834 100644 --- a/lib/dns/sdlz.c +++ b/lib/dns/sdlz.c @@ -1,5 +1,5 @@ /* - * Portions Copyright (C) 2005-2007 Internet Systems Consortium, Inc. ("ISC") + * Portions Copyright (C) 2005-2008 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.14 2007/08/27 03:32:27 marka Exp $ */ +/* $Id: sdlz.c,v 1.14.94.3 2008/04/03 10:51:01 marka Exp $ */ /*! \file */ @@ -1051,6 +1051,7 @@ static dns_dbmethods_t sdlzdb_methods = { overmem, settask, NULL, + NULL, NULL }; @@ -1328,7 +1329,7 @@ dns_sdlzallowzonexfr(void *driverarg, void *dbdata, isc_mem_t *mctx, return (result); isc_buffer_putuint8(&b2, 0); - /* make sure strings are always lowercase */ + /* make sure strings are always lowercase */ dns_sdlz_tolower(namestr); dns_sdlz_tolower(clientstr); @@ -1441,7 +1442,7 @@ dns_sdlzfindzone(void *driverarg, void *dbdata, isc_mem_t *mctx, return (result); isc_buffer_putuint8(&b, 0); - /* make sure strings are always lowercase */ + /* make sure strings are always lowercase */ dns_sdlz_tolower(namestr); /* Call SDLZ driver's find zone method */ @@ -1572,7 +1573,7 @@ dns_sdlz_putrr(dns_sdlzlookup_t *lookup, const char *type, dns_ttl_t ttl, return (ISC_R_SUCCESS); failure: - if (rdatabuf != NULL) + if (rdatabuf != NULL) isc_buffer_free(&rdatabuf); if (lex != NULL) isc_lex_destroy(&lex); diff --git a/lib/dns/spnego.c b/lib/dns/spnego.c index 279d945f..cc61fd6e 100644 --- a/lib/dns/spnego.c +++ b/lib/dns/spnego.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2006-2008 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: spnego.c,v 1.5 2007/06/19 23:47:16 tbox Exp $ */ +/* $Id: spnego.c,v 1.5.128.3 2008/04/03 06:08:27 tbox Exp $ */ /*! \file * \brief @@ -59,21 +59,21 @@ * Copyright (c) 2004 Masarykova universita * (Masaryk University, Brno, Czech Republic) * 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. 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 COPYRIGHT HOLDERS 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 @@ -89,35 +89,35 @@ * ---------------------------------------------------------------- * * Copyright (c) 1997 - 2003 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: + * 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. + * 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. + * 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. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. + * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE 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 INSTITUTE 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. */ /* @@ -169,88 +169,6 @@ */ #include "spnego.h" -/* - * The isc_mem function keep track of allocation sizes, but we can't - * get at that information, and we need to know sizes to implement a - * realloc() clone. So we use a little more memory to keep track of - * sizes allocated here. - * - * These functions follow Harbison & Steele, 4th edition, particularly - * with regard to realloc()'s behavior. - */ - -static void * -spnego_malloc(size_t size, const char *file, int line) -{ - char *p; - - if (size == 0) - return (NULL); - p = isc_mem_allocate(dst__memory_pool, size + sizeof(size_t)); - if (p == NULL) - return NULL; - *(size_t *)p = size; - p += sizeof(size_t); -#ifdef SPNEGO_ALLOC_DEBUG - printf("spnego_malloc(%lu) %lx %s %u\n", - (unsigned long) size, (unsigned long) p, file, line); -#else - (void)file; - (void)line; -#endif - return (p); -} - -static void -spnego_free(void *ptr, const char *file, int line) -{ - char *p = ptr; - - if (p == NULL) - return; -#ifdef SPNEGO_ALLOC_DEBUG - printf("spnego_free(%lx) %s %u\n", - (unsigned long) p, file, line); -#else - (void)file; - (void)line; -#endif - p -= sizeof(size_t); - isc_mem_free(dst__memory_pool, p); -} - -static void * -spnego_realloc(void *old_ptr, size_t new_size, const char *file, int line) -{ - size_t *old_size; - void *new_ptr; - - if (old_ptr == NULL) - return (spnego_malloc(new_size, file, line)); - - if (new_size == 0) { - spnego_free(old_ptr, file, line); - return (NULL); - } - - old_size = old_ptr; - old_size--; - if (*old_size >= new_size) - return (old_ptr); - - new_ptr = spnego_malloc(new_size, file, line); - if (new_ptr == NULL) - return (NULL); - - memcpy(new_ptr, old_ptr, *old_size); - spnego_free(old_ptr, file, line); - return (new_ptr); -} - -#define malloc(x) spnego_malloc(x, __FILE__, __LINE__) -#define free(x) spnego_free(x, __FILE__, __LINE__) -#define realloc(x,y) spnego_realloc(x, y, __FILE__, __LINE__) - /* asn1_err.h */ /* Generated from ../../../lib/asn1/asn1_err.et */ @@ -318,31 +236,31 @@ enum { #define ASN1_INDEFINITE 0xdce0deed -static int +static int der_get_length(const unsigned char *p, size_t len, size_t * val, size_t * size); -static int +static int der_get_octet_string(const unsigned char *p, size_t len, octet_string * data, size_t * size); -static int +static int der_get_oid(const unsigned char *p, size_t len, oid * data, size_t * size); -static int +static int der_get_tag(const unsigned char *p, size_t len, Der_class * class, Der_type * type, int *tag, size_t * size); -static int +static int der_match_tag(const unsigned char *p, size_t len, Der_class class, Der_type type, int tag, size_t * size); -static int +static int der_match_tag_and_length(const unsigned char *p, size_t len, Der_class class, Der_type type, int tag, size_t * length_ret, size_t * size); -static int +static int decode_oid(const unsigned char *p, size_t len, oid * k, size_t * size); @@ -359,27 +277,27 @@ der_put_int(unsigned char *p, size_t len, int val, size_t *); static int der_put_length(unsigned char *p, size_t len, size_t val, size_t *); -static int +static int der_put_octet_string(unsigned char *p, size_t len, const octet_string * data, size_t *); -static int +static int der_put_oid(unsigned char *p, size_t len, const oid * data, size_t * size); -static int +static int der_put_tag(unsigned char *p, size_t len, Der_class class, Der_type type, int tag, size_t *); -static int +static int der_put_length_and_tag(unsigned char *, size_t, size_t, Der_class, Der_type, int, size_t *); -static int +static int encode_enumerated(unsigned char *p, size_t len, const unsigned *data, size_t *); -static int +static int encode_octet_string(unsigned char *p, size_t len, const octet_string * k, size_t *); -static int +static int encode_oid(unsigned char *p, size_t len, const oid * k, size_t *); @@ -756,7 +674,7 @@ gss_accept_sec_context_spnego(OM_uint32 *minor_status, ot = &obuf; } ret = send_accept(&minor_status2, output_token, ot, pref); - if (ot != NULL) + if (ot != NULL && ot->length != 0) gss_release_buffer(&minor_status2, ot); return (ret); @@ -1485,8 +1403,11 @@ gssapi_spnego_encapsulate(OM_uint32 * minor_status, return (GSS_S_FAILURE); } p = gssapi_mech_make_header(output_token->value, len, mech); - if (p == NULL) + if (p == NULL) { + if (output_token->length != 0) + gss_release_buffer(minor_status, output_token); return (GSS_S_FAILURE); + } memcpy(p, buf, buf_size); return (GSS_S_COMPLETE); } @@ -1550,7 +1471,7 @@ gssapi_krb5_get_mech(const u_char *ptr, return (mech_len); } -static OM_uint32 +static OM_uint32 spnego_initial(OM_uint32 *minor_status, const gss_cred_id_t initiator_cred_handle, gss_ctx_id_t *context_handle, @@ -1659,16 +1580,16 @@ spnego_initial(OM_uint32 *minor_status, ret = gssapi_spnego_encapsulate(minor_status, buf + buf_size - len, len, output_token, GSS_SPNEGO_MECH); - - ret = major_status; + if (ret == GSS_S_COMPLETE) + ret = major_status; end: if (token_init.mechToken != NULL) { - free(token_init.mechToken); + free(token_init.mechToken); token_init.mechToken = NULL; } free_NegTokenInit(&token_init); - if (krb5_output_token.length > 0) + if (krb5_output_token.length != 0) gss_release_buffer(&minor_status2, &krb5_output_token); if (buf) free(buf); @@ -1711,7 +1632,7 @@ spnego_reply(OM_uint32 *minor_status, * SPNEGO doesn't include gss wrapping on SubsequentContextToken * like the Kerberos 5 mech does. But lets check for it anyway. */ - + mech_len = gssapi_krb5_get_mech(input_token->value, input_token->length, &p); @@ -1766,7 +1687,7 @@ spnego_reply(OM_uint32 *minor_status, free_NegTokenResp(&resp); return (GSS_S_BAD_MECH); } - + ret = der_put_oid(oidbuf + sizeof(oidbuf) - 1, sizeof(oidbuf), resp.supportedMech, @@ -1819,7 +1740,7 @@ spnego_reply(OM_uint32 *minor_status, -OM_uint32 +OM_uint32 gss_init_sec_context_spnego(OM_uint32 *minor_status, const gss_cred_id_t initiator_cred_handle, gss_ctx_id_t *context_handle, diff --git a/lib/dns/stats.c b/lib/dns/stats.c index 4144b21a..38eda3bd 100644 --- a/lib/dns/stats.c +++ b/lib/dns/stats.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: stats.c,v 1.12.128.2 2008/01/24 23:46:25 tbox Exp $ */ +/* $Id: stats.c,v 1.12.128.4 2008/04/03 06:20:34 tbox Exp $ */ /*! \file */ @@ -24,24 +24,48 @@ #include <string.h> #include <isc/atomic.h> +#include <isc/buffer.h> +#include <isc/magic.h> #include <isc/mem.h> #include <isc/platform.h> +#include <isc/print.h> #include <isc/rwlock.h> #include <isc/util.h> +#include <dns/opcode.h> +#include <dns/rdatatype.h> #include <dns/stats.h> -LIBDNS_EXTERNAL_DATA const char *dns_statscounter_names[DNS_STATS_NCOUNTERS] = - { - "success", - "referral", - "nxrrset", - "nxdomain", - "recursion", - "failure", - "duplicate", - "dropped" - }; +#define DNS_STATS_MAGIC ISC_MAGIC('D', 's', 't', 't') +#define DNS_STATS_VALID(x) ISC_MAGIC_VALID(x, DNS_STATS_MAGIC) + +/*% + * Statistics types. + */ +typedef enum { + dns_statstype_general = 0, + dns_statstype_rdtype = 1, + dns_statstype_rdataset = 2, + dns_statstype_opcode = 3 +} dns_statstype_t; + +/*% + * It doesn't make sense to have 2^16 counters for all possible types since + * most of them won't be used. We have counters for the first 256 types and + * those explicitly supported in the rdata implementation. + * XXXJT: this introduces tight coupling with the rdata implementation. + * Ideally, we should have rdata handle this type of details. + */ +enum { + /* For 0-255, we use the rdtype value as counter indices */ + rdtypecounter_dlv = 256, /* for dns_rdatatype_dlv */ + rdtypecounter_others = 257, /* anything else */ + rdtypecounter_max = 258, + /* The following are used for rdataset */ + rdtypenxcounter_max = rdtypecounter_max * 2, + rdtypecounter_nxdomain = rdtypenxcounter_max, + rdatasettypecounter_max = rdtypecounter_nxdomain + 1 +}; #ifndef DNS_STATS_USEMULTIFIELDS #if defined(ISC_RWLOCK_USEATOMIC) && defined(ISC_PLATFORM_HAVEXADD) && !defined(ISC_PLATFORM_HAVEXADDQ) @@ -61,15 +85,42 @@ typedef isc_uint64_t dns_stat_t; #endif struct dns_stats { - /* XXXJT: do we need a magic? */ + /*% Unlocked */ + unsigned int magic; + dns_statstype_t type; + isc_mem_t *mctx; + int ncounters; + + isc_mutex_t lock; + unsigned int references; /* locked by lock */ + + /*% + * Locked by counterlock or unlocked if efficient rwlock is not + * available. + */ #ifdef ISC_RWLOCK_USEATOMIC - isc_rwlock_t lock; + isc_rwlock_t counterlock; #endif - dns_stat_t counters[DNS_STATS_NCOUNTERS]; + dns_stat_t *counters; + + /*% + * We don't want to lock the counters while we are dumping, so we first + * copy the current counter values into a local array. This buffer + * will be used as the copy destination. It's allocated on creation + * of the stats structure so that the dump operation won't fail due + * to memory allocation failure. + * XXX: this approach is weird for non-threaded build because the + * additional memory and the copy overhead could be avoided. We prefer + * simplicity here, however, under the assumption that this function + * should be only rarely called. + */ + isc_uint64_t *copiedcounters; }; -isc_result_t -dns_stats_create(isc_mem_t *mctx, dns_stats_t **statsp) { +static isc_result_t +create_stats(isc_mem_t *mctx, dns_statstype_t type, int ncounters, + dns_stats_t **statsp) +{ dns_stats_t *stats; isc_result_t result = ISC_R_SUCCESS; @@ -79,50 +130,107 @@ dns_stats_create(isc_mem_t *mctx, dns_stats_t **statsp) { if (stats == NULL) return (ISC_R_NOMEMORY); -#ifdef ISC_RWLOCK_USEATOMIC - result = isc_rwlock_init(&stats->lock, 0, 0); - if (result != ISC_R_SUCCESS) { - isc_mem_put(mctx, stats, sizeof(*stats)); - return (result); + result = isc_mutex_init(&stats->lock); + if (result != ISC_R_SUCCESS) + goto clean_stats; + + stats->counters = isc_mem_get(mctx, sizeof(dns_stat_t) * ncounters); + if (stats->counters == NULL) { + result = ISC_R_NOMEMORY; + goto clean_mutex; } + stats->copiedcounters = isc_mem_get(mctx, + sizeof(isc_uint64_t) * ncounters); + if (stats->copiedcounters == NULL) { + result = ISC_R_NOMEMORY; + goto clean_counters; + } + +#ifdef ISC_RWLOCK_USEATOMIC + result = isc_rwlock_init(&stats->counterlock, 0, 0); + if (result != ISC_R_SUCCESS) + goto clean_copiedcounters; #endif - memset(stats->counters, 0, sizeof(dns_stat_t) * DNS_STATS_NCOUNTERS); + stats->type = type; + stats->references = 1; + memset(stats->counters, 0, sizeof(dns_stat_t) * ncounters); + stats->mctx = NULL; + isc_mem_attach(mctx, &stats->mctx); + stats->ncounters = ncounters; + stats->magic = DNS_STATS_MAGIC; *statsp = stats; return (result); + +clean_counters: + isc_mem_put(mctx, stats->counters, sizeof(dns_stat_t) * ncounters); + +#ifdef ISC_RWLOCK_USEATOMIC +clean_copiedcounters: + isc_mem_put(mctx, stats->copiedcounters, + sizeof(dns_stat_t) * ncounters); +#endif + +clean_mutex: + DESTROYLOCK(&stats->lock); + +clean_stats: + isc_mem_put(mctx, stats, sizeof(*stats)); + + return (result); +} + +void +dns_stats_attach(dns_stats_t *stats, dns_stats_t **statsp) { + REQUIRE(DNS_STATS_VALID(stats)); + REQUIRE(statsp != NULL && *statsp == NULL); + + LOCK(&stats->lock); + stats->references++; + UNLOCK(&stats->lock); + + *statsp = stats; } void -dns_stats_destroy(isc_mem_t *mctx, dns_stats_t **statsp) { +dns_stats_detach(dns_stats_t **statsp) { dns_stats_t *stats; - REQUIRE(statsp != NULL && *statsp != NULL); + REQUIRE(statsp != NULL && DNS_STATS_VALID(*statsp)); stats = *statsp; + *statsp = NULL; + LOCK(&stats->lock); + stats->references--; + UNLOCK(&stats->lock); + + if (stats->references == 0) { + isc_mem_put(stats->mctx, stats->copiedcounters, + sizeof(dns_stat_t) * stats->ncounters); + isc_mem_put(stats->mctx, stats->counters, + sizeof(dns_stat_t) * stats->ncounters); + DESTROYLOCK(&stats->lock); #ifdef ISC_RWLOCK_USEATOMIC - isc_rwlock_destroy(&stats->lock); + isc_rwlock_destroy(&stats->counterlock); #endif - isc_mem_put(mctx, stats, sizeof(*stats)); - - *statsp = NULL; + isc_mem_putanddetach(&stats->mctx, stats, sizeof(*stats)); + } } -void -dns_stats_incrementcounter(dns_stats_t *stats, dns_statscounter_t counter) { +static inline void +incrementcounter(dns_stats_t *stats, int counter) { isc_int32_t prev; - REQUIRE(counter < DNS_STATS_NCOUNTERS); - #ifdef ISC_RWLOCK_USEATOMIC /* * We use a "read" lock to prevent other threads from reading the * counter while we "writing" a counter field. The write access itself * is protected by the atomic operation. */ - isc_rwlock_lock(&stats->lock, isc_rwlocktype_read); + isc_rwlock_lock(&stats->counterlock, isc_rwlocktype_read); #endif #if DNS_STATS_USEMULTIFIELDS @@ -146,12 +254,38 @@ dns_stats_incrementcounter(dns_stats_t *stats, dns_statscounter_t counter) { #endif #ifdef ISC_RWLOCK_USEATOMIC - isc_rwlock_unlock(&stats->lock, isc_rwlocktype_read); + isc_rwlock_unlock(&stats->counterlock, isc_rwlocktype_read); #endif } -void -dns_stats_copy(dns_stats_t *src, isc_uint64_t *dst) { +static inline void +decrementcounter(dns_stats_t *stats, int counter) { + isc_int32_t prev; + +#ifdef ISC_RWLOCK_USEATOMIC + isc_rwlock_lock(&stats->counterlock, isc_rwlocktype_read); +#endif + +#if DNS_STATS_USEMULTIFIELDS + prev = isc_atomic_xadd((isc_int32_t *)&stats->counters[counter].lo, -1); + if (prev == 0) + isc_atomic_xadd((isc_int32_t *)&stats->counters[counter].hi, + -1); +#elif defined(ISC_PLATFORM_HAVEXADDQ) + UNUSED(prev); + isc_atomic_xaddq((isc_int64_t *)&stats->counters[counter], -1); +#else + UNUSED(prev); + stats->counters[counter]--; +#endif + +#ifdef ISC_RWLOCK_USEATOMIC + isc_rwlock_unlock(&stats->counterlock, isc_rwlocktype_read); +#endif +} + +static void +copy_counters(dns_stats_t *stats) { int i; #ifdef ISC_RWLOCK_USEATOMIC @@ -159,27 +293,257 @@ dns_stats_copy(dns_stats_t *src, isc_uint64_t *dst) { * We use a "write" lock before "reading" the statistics counters as * an exclusive lock. */ - isc_rwlock_lock(&src->lock, isc_rwlocktype_write); + isc_rwlock_lock(&stats->counterlock, isc_rwlocktype_write); #endif #if DNS_STATS_USEMULTIFIELDS - for (i = 0; i < DNS_STATS_NCOUNTERS; i++) { - dst[i] = ((isc_uint64_t)src->counters[i].hi) << 32 | - src->counters[i].lo; + for (i = 0; i < stats->ncounters; i++) { + stats->copiedcounters[i] = + (isc_uint64_t)(stats->counters[i].hi) << 32 | + stats->counters[i].lo; } #else UNUSED(i); - memcpy(dst, src->counters, DNS_STATS_NCOUNTERS * sizeof(dst[0])); + memcpy(stats->copiedcounters, stats->counters, + stats->ncounters * sizeof(dns_stat_t)); #endif #ifdef ISC_RWLOCK_USEATOMIC - isc_rwlock_unlock(&src->lock, isc_rwlocktype_write); + isc_rwlock_unlock(&stats->counterlock, isc_rwlocktype_write); #endif } +/*% + * Create methods + */ +isc_result_t +dns_generalstats_create(isc_mem_t *mctx, dns_stats_t **statsp, int ncounters) { + REQUIRE(statsp != NULL && *statsp == NULL); + + return (create_stats(mctx, dns_statstype_general, ncounters, statsp)); +} + +isc_result_t +dns_rdatatypestats_create(isc_mem_t *mctx, dns_stats_t **statsp) { + REQUIRE(statsp != NULL && *statsp == NULL); + + return (create_stats(mctx, dns_statstype_rdtype, rdtypecounter_max, + statsp)); +} + +isc_result_t +dns_rdatasetstats_create(isc_mem_t *mctx, dns_stats_t **statsp) { + REQUIRE(statsp != NULL && *statsp == NULL); + + return (create_stats(mctx, dns_statstype_rdataset, + (rdtypecounter_max * 2) + 1, statsp)); +} + +isc_result_t +dns_opcodestats_create(isc_mem_t *mctx, dns_stats_t **statsp) { + REQUIRE(statsp != NULL && *statsp == NULL); + + return (create_stats(mctx, dns_statstype_opcode, 16, statsp)); +} + +/*% + * Increment/Decrement methods + */ +void +dns_generalstats_increment(dns_stats_t *stats, dns_statscounter_t counter) { + REQUIRE(DNS_STATS_VALID(stats) && stats->type == dns_statstype_general); + REQUIRE(counter < stats->ncounters); + + incrementcounter(stats, (int)counter); +} + +void +dns_rdatatypestats_increment(dns_stats_t *stats, dns_rdatatype_t type) { + int counter; + + REQUIRE(DNS_STATS_VALID(stats) && stats->type == dns_statstype_rdtype); + + if (type == dns_rdatatype_dlv) + counter = rdtypecounter_dlv; + else if (type > dns_rdatatype_any) + counter = rdtypecounter_others; + else + counter = (int)type; + + incrementcounter(stats, counter); +} + +static inline void +update_rdatasetstats(dns_stats_t *stats, dns_rdatastatstype_t rrsettype, + isc_boolean_t increment) +{ + int counter; + dns_rdatatype_t rdtype; + + if ((DNS_RDATASTATSTYPE_ATTR(rrsettype) & + DNS_RDATASTATSTYPE_ATTR_NXDOMAIN) != 0) { + counter = rdtypecounter_nxdomain; + } else { + rdtype = DNS_RDATASTATSTYPE_BASE(rrsettype); + if (rdtype == dns_rdatatype_dlv) + counter = (int)rdtypecounter_dlv; + else if (rdtype > dns_rdatatype_any) + counter = (int)rdtypecounter_others; + else + counter = (int)rdtype; + + if ((DNS_RDATASTATSTYPE_ATTR(rrsettype) & + DNS_RDATASTATSTYPE_ATTR_NXRRSET) != 0) + counter += rdtypecounter_max; + } + + if (increment) + incrementcounter(stats, counter); + else + decrementcounter(stats, counter); +} + +void +dns_rdatasetstats_increment(dns_stats_t *stats, dns_rdatastatstype_t rrsettype) +{ + REQUIRE(DNS_STATS_VALID(stats) && + stats->type == dns_statstype_rdataset); + + update_rdatasetstats(stats, rrsettype, ISC_TRUE); +} + +void +dns_rdatasetstats_decrement(dns_stats_t *stats, dns_rdatastatstype_t rrsettype) +{ + REQUIRE(DNS_STATS_VALID(stats) && + stats->type == dns_statstype_rdataset); + + update_rdatasetstats(stats, rrsettype, ISC_FALSE); +} +void +dns_opcodestats_increment(dns_stats_t *stats, dns_opcode_t code) { + REQUIRE(DNS_STATS_VALID(stats) && stats->type == dns_statstype_opcode); + + incrementcounter(stats, (int)code); +} + +/*% + * Dump methods + */ +void +dns_generalstats_dump(dns_stats_t *stats, dns_generalstats_dumper_t dump_fn, + void *arg, unsigned int options) +{ + int i; + + REQUIRE(DNS_STATS_VALID(stats) && stats->type == dns_statstype_general); + + copy_counters(stats); + + for (i = 0; i < stats->ncounters; i++) { + if ((options & DNS_STATSDUMP_VERBOSE) == 0 && + stats->copiedcounters[i] == 0) + continue; + dump_fn(i, stats->copiedcounters[i], arg); + } +} + +static void +dump_rdentry(dns_stats_t *stats, int counter, int rdcounter, + dns_rdatastatstype_t attributes, + dns_rdatatypestats_dumper_t dump_fn, void * arg, + unsigned int options) +{ + dns_rdatatype_t rdtype = dns_rdatatype_none; /* sentinel */ + dns_rdatastatstype_t type; + + if ((options & DNS_STATSDUMP_VERBOSE) == 0 && + stats->copiedcounters[counter] == 0) + return; + if (rdcounter == rdtypecounter_others) + attributes |= DNS_RDATASTATSTYPE_ATTR_OTHERTYPE; + else { + if (rdcounter == rdtypecounter_dlv) + rdtype = dns_rdatatype_dlv; + else + rdtype = (dns_rdatatype_t)rdcounter; + } + type = DNS_RDATASTATSTYPE_VALUE((dns_rdatastatstype_t)rdtype, + attributes); + dump_fn(type, stats->copiedcounters[counter], arg); +} + +void +dns_rdatatypestats_dump(dns_stats_t *stats, dns_rdatatypestats_dumper_t dump_fn, + void *arg, unsigned int options) +{ + int i; + + REQUIRE(DNS_STATS_VALID(stats) && stats->type == dns_statstype_rdtype); + + copy_counters(stats); + + for (i = 0; i < stats->ncounters; i++) + dump_rdentry(stats, i, i, 0, dump_fn, arg, options); +} + +void +dns_rdatasetstats_dump(dns_stats_t *stats, dns_rdatatypestats_dumper_t dump_fn, + void *arg, unsigned int options) +{ + int i; + + REQUIRE(DNS_STATS_VALID(stats) && + stats->type == dns_statstype_rdataset); + + copy_counters(stats); + + for (i = 0; i < rdtypecounter_max; i++) + dump_rdentry(stats, i, i, 0, dump_fn, arg, options); + for (i = rdtypecounter_max; i < rdtypenxcounter_max; i++) { + dump_rdentry(stats, i, i - rdtypecounter_max, + DNS_RDATASTATSTYPE_ATTR_NXRRSET, + dump_fn, arg, options); + } + dump_rdentry(stats, rdtypecounter_nxdomain, 0, + DNS_RDATASTATSTYPE_ATTR_NXDOMAIN, dump_fn, arg, options); + + INSIST(i < stats->ncounters); +} + +void +dns_opcodestats_dump(dns_stats_t *stats, dns_opcodestats_dumper_t dump_fn, + void *arg, unsigned int options) +{ + int i; + + REQUIRE(DNS_STATS_VALID(stats) && stats->type == dns_statstype_opcode); + + copy_counters(stats); + + for (i = 0; i < stats->ncounters; i++) { + if ((options & DNS_STATSDUMP_VERBOSE) == 0 && + stats->copiedcounters[i] == 0) + continue; + dump_fn((dns_opcode_t)i, stats->copiedcounters[i], arg); + } +} + /*** - *** Obsolete functions follow + *** Obsolete variables and functions follow: ***/ +LIBDNS_EXTERNAL_DATA const char *dns_statscounter_names[DNS_STATS_NCOUNTERS] = + { + "success", + "referral", + "nxrrset", + "nxdomain", + "recursion", + "failure", + "duplicate", + "dropped" + }; + isc_result_t dns_stats_alloccounters(isc_mem_t *mctx, isc_uint64_t **ctrp) { int i; diff --git a/lib/dns/tkey.c b/lib/dns/tkey.c index 8ca3aeed..f94b3ae0 100644 --- a/lib/dns/tkey.c +++ b/lib/dns/tkey.c @@ -16,7 +16,7 @@ */ /* - * $Id: tkey.c,v 1.87.2.2 2008/01/17 23:46:37 tbox Exp $ + * $Id: tkey.c,v 1.87.2.3 2008/04/03 00:47:46 marka Exp $ */ /*! \file */ #include <config.h> @@ -69,7 +69,7 @@ tkey_log(const char *fmt, ...) { static void _dns_tkey_dumpmessage(dns_message_t *msg) { isc_buffer_t outbuf; - unsigned char output[2048]; + unsigned char output[4096]; isc_result_t result; isc_buffer_init(&outbuf, output, sizeof(output)); @@ -846,7 +846,7 @@ buildquery(dns_message_t *msg, dns_name_t *name, dns_rdataset_makequestion(question, dns_rdataclass_any, dns_rdatatype_tkey); - RETERR(isc_buffer_allocate(msg->mctx, &dynbuf, 2048)); + RETERR(isc_buffer_allocate(msg->mctx, &dynbuf, 4096)); RETERR(dns_message_gettemprdata(msg, &rdata)); RETERR(dns_rdata_fromstruct(rdata, dns_rdataclass_any, @@ -984,7 +984,7 @@ dns_tkey_buildgssquery(dns_message_t *msg, dns_name_t *name, dns_name_t *gname, isc_result_t result; isc_stdtime_t now; isc_buffer_t token; - unsigned char array[2048]; + unsigned char array[4096]; UNUSED(intoken); diff --git a/lib/dns/validator.c b/lib/dns/validator.c index 93df96c9..7fea6a37 100644 --- a/lib/dns/validator.c +++ b/lib/dns/validator.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: validator.c,v 1.155.52.3 2008/01/17 23:46:37 tbox Exp $ */ +/* $Id: validator.c,v 1.155.52.5 2008/02/19 17:09:08 each Exp $ */ #include <config.h> @@ -132,7 +132,8 @@ static isc_result_t nsecvalidate(dns_validator_t *val, isc_boolean_t resume); static isc_result_t -proveunsecure(dns_validator_t *val, isc_boolean_t resume); +proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, + isc_boolean_t resume); static void validator_logv(dns_validator_t *val, isc_logcategory_t *category, @@ -363,7 +364,7 @@ dsfetched(isc_task_t *task, isc_event_t *event) { "falling back to insecurity proof (%s)", dns_result_totext(eresult)); val->attributes |= VALATTR_INSECURITY; - result = proveunsecure(val, ISC_FALSE); + result = proveunsecure(val, ISC_FALSE, ISC_FALSE); if (result != DNS_R_WAIT) validator_done(val, result); } else { @@ -442,7 +443,7 @@ dsfetched2(isc_task_t *task, isc_event_t *event) { validator_done(val, result); } } else { - result = proveunsecure(val, ISC_TRUE); + result = proveunsecure(val, ISC_FALSE, ISC_TRUE); if (result != DNS_R_WAIT) validator_done(val, result); } @@ -455,7 +456,8 @@ dsfetched2(isc_task_t *task, isc_event_t *event) { * In either case we are still in a secure zone resume * validation. */ - result = proveunsecure(val, ISC_TRUE); + result = proveunsecure(val, ISC_TF(eresult == ISC_R_SUCCESS), + ISC_TRUE); if (result != DNS_R_WAIT) validator_done(val, result); } else { @@ -556,7 +558,7 @@ dsvalidated(isc_task_t *task, isc_event_t *event) { 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); + result = proveunsecure(val, ISC_TRUE, ISC_TRUE); else result = validatezonekey(val); if (result != DNS_R_WAIT) @@ -2222,7 +2224,7 @@ nsecvalidate(dns_validator_t *val, isc_boolean_t resume) { validator_log(val, ISC_LOG_DEBUG(3), "nonexistence proof(s) not found"); val->attributes |= VALATTR_INSECURITY; - return (proveunsecure(val, ISC_FALSE)); + return (proveunsecure(val, ISC_FALSE, ISC_FALSE)); } static isc_boolean_t @@ -2496,7 +2498,8 @@ finddlvsep(dns_validator_t *val, isc_boolean_t resume) { * \li DNS_R_NOTINSECURE */ static isc_result_t -proveunsecure(dns_validator_t *val, isc_boolean_t resume) { +proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume) +{ isc_result_t result; dns_fixedname_t fixedsecroot; dns_name_t *secroot; @@ -2544,12 +2547,19 @@ proveunsecure(dns_validator_t *val, isc_boolean_t resume) { val->labels = dns_name_countlabels(secroot) + 1; } else { validator_log(val, ISC_LOG_DEBUG(3), "resuming proveunsecure"); - if (val->frdataset.trust >= dns_trust_secure && + /* + * If we have a DS rdataset and it is secure then check if + * the DS rdataset has a supported algorithm combination. + * If not this is a insecure delegation as far as this + * resolver is concerned. Fall back to DLV if available. + */ + if (have_ds && val->frdataset.trust >= dns_trust_secure && !check_ds(val, dns_fixedname_name(&val->fname), &val->frdataset)) { dns_name_format(dns_fixedname_name(&val->fname), namebuf, sizeof(namebuf)); - if (val->mustbesecure) { + if ((val->view->dlv == NULL || DLVTRIED(val)) && + val->mustbesecure) { validator_log(val, ISC_LOG_WARNING, "must be secure failure at '%s'", namebuf); @@ -2794,7 +2804,7 @@ validator_start(isc_task_t *task, isc_event_t *event) { validator_log(val, ISC_LOG_DEBUG(3), "falling back to insecurity proof"); val->attributes |= VALATTR_INSECURITY; - result = proveunsecure(val, ISC_FALSE); + result = proveunsecure(val, ISC_FALSE, ISC_FALSE); if (result == DNS_R_NOTINSECURE) result = saved_result; } @@ -2808,7 +2818,7 @@ validator_start(isc_task_t *task, isc_event_t *event) { "attempting insecurity proof"); val->attributes |= VALATTR_INSECURITY; - result = proveunsecure(val, ISC_FALSE); + result = proveunsecure(val, ISC_FALSE, ISC_FALSE); } else if (val->event->rdataset == NULL && val->event->sigrdataset == NULL) { diff --git a/lib/dns/view.c b/lib/dns/view.c index 762b1922..17966c21 100644 --- a/lib/dns/view.c +++ b/lib/dns/view.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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.143 2007/06/18 23:47:42 tbox Exp $ */ +/* $Id: view.c,v 1.143.128.3 2008/04/03 06:10:20 marka Exp $ */ /*! \file */ @@ -25,7 +25,6 @@ #include <isc/string.h> /* Required for HP/UX (and others?) */ #include <isc/task.h> #include <isc/util.h> -#include <isc/xml.h> #include <dns/acache.h> #include <dns/acl.h> @@ -44,6 +43,7 @@ #include <dns/request.h> #include <dns/resolver.h> #include <dns/result.h> +#include <dns/stats.h> #include <dns/tsig.h> #include <dns/zone.h> #include <dns/zt.h> @@ -152,6 +152,8 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass, view->delonly = NULL; view->rootdelonly = ISC_FALSE; view->rootexclude = NULL; + view->resstats = NULL; + view->resquerystats = NULL; /* * Initialize configuration data with default values. @@ -322,7 +324,7 @@ destroy(dns_view_t *view) { name = ISC_LIST_HEAD(view->rootexclude[i]); while (name != NULL) { ISC_LIST_UNLINK(view->rootexclude[i], - name, link); + name, link); dns_name_free(name, view->mctx); isc_mem_put(view->mctx, name, sizeof(*name)); name = ISC_LIST_HEAD(view->rootexclude[i]); @@ -332,6 +334,10 @@ destroy(dns_view_t *view) { sizeof(dns_namelist_t) * DNS_VIEW_DELONLYHASH); view->rootexclude = NULL; } + if (view->resstats != NULL) + dns_stats_detach(&view->resstats); + if (view->resquerystats != NULL) + dns_stats_detach(&view->resquerystats); dns_keytable_detach(&view->trustedkeys); dns_keytable_detach(&view->secroots); dns_fwdtable_destroy(&view->fwdtable); @@ -578,6 +584,7 @@ dns_view_createresolver(dns_view_t *view, } result = dns_adb_create(mctx, view, timermgr, taskmgr, &view->adb); + isc_mem_setname(mctx, "ADB", NULL); isc_mem_detach(&mctx); if (result != ISC_R_SUCCESS) { dns_resolver_shutdown(view->resolver); @@ -943,7 +950,7 @@ dns_view_simplefind(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type, isc_result_t dns_view_findzonecut(dns_view_t *view, dns_name_t *name, dns_name_t *fname, isc_stdtime_t now, unsigned int options, - isc_boolean_t use_hints, + isc_boolean_t use_hints, dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset) { return(dns_view_findzonecut2(view, name, fname, now, options, @@ -1157,8 +1164,8 @@ dns_viewlist_findzone(dns_viewlist_t *list, dns_name_t *name, REQUIRE(list != NULL); for (view = ISC_LIST_HEAD(*list); - view != NULL; - view = ISC_LIST_NEXT(view, link)) { + view != NULL; + view = ISC_LIST_NEXT(view, link)) { if (allclasses == ISC_FALSE && view->rdclass != rdclass) continue; result = dns_zt_find(view->zonetable, name, 0, NULL, @@ -1389,7 +1396,7 @@ dns_view_isdelegationonly(dns_view_t *view, dns_name_t *name) { return (ISC_TRUE); } -void +void dns_view_setrootdelonly(dns_view_t *view, isc_boolean_t value) { REQUIRE(DNS_VIEW_VALID(view)); view->rootdelonly = value; @@ -1407,46 +1414,38 @@ dns_view_freezezones(dns_view_t *view, isc_boolean_t value) { return (dns_zt_freezezones(view->zonetable, value)); } -#ifdef HAVE_LIBXML2 - -struct xmlarg { - int flags; - xmlTextWriterPtr xml; -}; - -static isc_result_t -zone_xmlrender(dns_zone_t *zone, void *arg) { - struct xmlarg *xmlarg = arg; +void +dns_view_setresstats(dns_view_t *view, dns_stats_t *stats) { + REQUIRE(DNS_VIEW_VALID(view)); + REQUIRE(!view->frozen); + REQUIRE(view->resstats == NULL); - return (dns_zone_xmlrender(zone, xmlarg->xml, xmlarg->flags)); + dns_stats_attach(stats, &view->resstats); } -isc_result_t -dns_view_xmlrender(dns_view_t *view, xmlTextWriterPtr xml, int flags) -{ - struct xmlarg xmlargs; - - xmlargs.flags = flags; - xmlargs.xml = xml; - - /* XXXMLG render config data here */ +void +dns_view_getresstats(dns_view_t *view, dns_stats_t **statsp) { + REQUIRE(DNS_VIEW_VALID(view)); + REQUIRE(statsp != NULL && *statsp == NULL); - if ((flags & ISC_XML_RENDERSTATS) != 0) { - xmlTextWriterStartElement(xml, ISC_XMLCHAR "view"); + if (view->resstats != NULL) + dns_stats_attach(view->resstats, statsp); +} - xmlTextWriterStartElement(xml, ISC_XMLCHAR "name"); - xmlTextWriterWriteString(xml, ISC_XMLCHAR view->name); - xmlTextWriterEndElement(xml); +void +dns_view_setresquerystats(dns_view_t *view, dns_stats_t *stats) { + REQUIRE(DNS_VIEW_VALID(view)); + REQUIRE(!view->frozen); + REQUIRE(view->resquerystats == NULL); - xmlTextWriterStartElement(xml, ISC_XMLCHAR "zones"); - dns_zt_apply(view->zonetable, ISC_FALSE, zone_xmlrender, - &xmlargs); - xmlTextWriterEndElement(xml); + dns_stats_attach(stats, &view->resquerystats); +} - xmlTextWriterEndElement(xml); - } +void +dns_view_getresquerystats(dns_view_t *view, dns_stats_t **statsp) { + REQUIRE(DNS_VIEW_VALID(view)); + REQUIRE(statsp != NULL && *statsp == NULL); - return (ISC_R_SUCCESS); + if (view->resquerystats != NULL) + dns_stats_attach(view->resquerystats, statsp); } - -#endif /* HAVE_LIBXML2 */ diff --git a/lib/dns/win32/libdns.def b/lib/dns/win32/libdns.def index cc27de6b..3c833854 100644 --- a/lib/dns/win32/libdns.def +++ b/lib/dns/win32/libdns.def @@ -100,6 +100,7 @@ dns_db_findnode dns_db_findrdataset dns_db_findzonecut dns_db_getoriginnode +dns_db_getrrsetstats dns_db_getsoaserial dns_db_iscache dns_db_ispersistent @@ -172,6 +173,7 @@ dns_dispatchmgr_destroy dns_dispatchmgr_getblackhole dns_dispatchmgr_setblackhole dns_dispatchmgr_setblackportlist +dns_dispatchmgr_setstats dns_dlzallowzonexfr dns_dlzcreate dns_dlzdestroy @@ -194,6 +196,9 @@ dns_fwdtable_add dns_fwdtable_create dns_fwdtable_destroy dns_fwdtable_find +dns_generalstats_create +dns_generalstats_dump +dns_generalstats_increment dns_iptable_addprefix dns_iptable_attach dns_iptable_create @@ -348,6 +353,10 @@ dns_ncache_towire dns_nsec_build dns_nsec_buildrdata dns_nsec_typepresent +dns_opcode_totext +dns_opcodestats_create +dns_opcodestats_dump +dns_opcodestats_increment dns_order_add dns_order_attach dns_order_create @@ -360,6 +369,7 @@ dns_peer_getkey dns_peer_getmaxudp dns_peer_getprovideixfr dns_peer_getrequestixfr +dns_peer_getrequestnsid dns_peer_getsupportedns dns_peer_gettransferformat dns_peer_gettransfers @@ -373,6 +383,7 @@ dns_peer_setnotifysource dns_peer_setprovideixfr dns_peer_setquerysource dns_peer_setrequestixfr +dns_peer_setrequestnsid dns_peer_setsupportedns dns_peer_settransferformat dns_peer_settransfers @@ -434,6 +445,7 @@ dns_rdataclass_format dns_rdataclass_fromtext dns_rdataclass_ismeta dns_rdataclass_totext +dns_rdatalist_fromrdataset dns_rdatalist_init dns_rdatalist_tordataset dns_rdataset_additionaldata @@ -454,6 +466,10 @@ dns_rdataset_setadditional dns_rdataset_totext dns_rdataset_towire dns_rdataset_towiresorted +dns_rdatasetstats_create +dns_rdatasetstats_decrement +dns_rdatasetstats_dump +dns_rdatasetstats_increment dns_rdatasetiter_current dns_rdatasetiter_destroy dns_rdatasetiter_first @@ -475,6 +491,9 @@ dns_rdatatype_iszonecutauth dns_rdatatype_notquestion dns_rdatatype_questiononly dns_rdatatype_totext +dns_rdatatypestats_create +dns_rdatatypestats_dump +dns_rdatatypestats_increment dns_request_cancel dns_request_create dns_request_createraw @@ -548,11 +567,9 @@ dns_ssutable_checkrules dns_ssutable_create dns_ssutable_detach dns_stats_alloccounters -dns_stats_copy -dns_stats_create -dns_stats_destroy +dns_stats_attach +dns_stats_detach dns_stats_freecounters -dns_stats_incrementcounter dns_tcpmsg_cancelread dns_tcpmsg_init dns_tcpmsg_invalidate @@ -610,6 +627,8 @@ dns_view_flushname dns_view_freeze dns_view_freezezones dns_view_getpeertsig +dns_view_getresstats +dns_view_getresquerystats dns_view_gettsig dns_view_load dns_view_loadnew @@ -617,6 +636,8 @@ dns_view_setcache dns_view_setdstport dns_view_sethints dns_view_setkeyring +dns_view_setresstats +dns_view_setresquerystats dns_view_setrootdelonly dns_view_simplefind dns_view_weakattach @@ -667,9 +688,10 @@ dns_zone_getnotifysrc6 dns_zone_getoptions dns_zone_getorigin dns_zone_getqueryacl +dns_zone_getrequeststats +dns_zone_getserial dns_zone_getsigvalidityinterval dns_zone_getssutable -dns_zone_getstats dns_zone_getstatscounters dns_zone_gettask dns_zone_gettype @@ -731,8 +753,10 @@ dns_zone_setoption dns_zone_setorigin dns_zone_setqueryacl dns_zone_setqueryonacl +dns_zone_setrequeststats dns_zone_setsigvalidityinterval dns_zone_setssutable +dns_zone_setstats dns_zone_setstatistics dns_zone_settask dns_zone_settype diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 87add9f6..8e489fc8 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: zone.c,v 1.470.12.2 2008/01/24 23:46:25 tbox Exp $ */ +/* $Id: zone.c,v 1.470.12.5 2008/04/07 05:30:58 marka Exp $ */ /*! \file */ @@ -33,7 +33,6 @@ #include <isc/taskpool.h> #include <isc/timer.h> #include <isc/util.h> -#include <isc/xml.h> #include <dns/acache.h> #include <dns/acl.h> @@ -249,9 +248,15 @@ struct dns_zone { ISC_LINK(dns_zone_t) statelink; dns_zonelist_t *statelist; /*% - * Optional per-zone statistics counters (NULL if not present). + * Statistics counters about zone management. */ - dns_stats_t *counters; + dns_stats_t *stats; + /*% + * Optional per-zone statistics counters. Counted outside of this + * module. + */ + isc_boolean_t requeststats_on; + dns_stats_t *requeststats; isc_uint32_t notifydelay; dns_isselffunc_t isself; void *isselfarg; @@ -547,6 +552,15 @@ static const char *dbargv_default[] = { "rbt" }; } \ } while (0) +/*% + * Increment resolver-related statistics counters. Zone must be locked. + */ +static inline void +inc_stats(dns_zone_t *zone, dns_statscounter_t counter) { + if (zone->stats != NULL) + dns_generalstats_increment(zone->stats, counter); +} + /*** *** Public functions. ***/ @@ -663,7 +677,9 @@ dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) { zone->checkns = NULL; ISC_LINK_INIT(zone, statelink); zone->statelist = NULL; - zone->counters = NULL; + zone->stats = NULL; + zone->requeststats_on = ISC_FALSE; + zone->requeststats = NULL; zone->notifydelay = 5; zone->isself = NULL; zone->isselfarg = NULL; @@ -735,8 +751,10 @@ zone_free(dns_zone_t *zone) { if (zone->journal != NULL) isc_mem_free(zone->mctx, zone->journal); zone->journal = NULL; - if (zone->counters != NULL) - dns_stats_destroy(zone->mctx, &zone->counters); + if (zone->stats != NULL) + dns_stats_detach(&zone->stats); + if (zone->requeststats != NULL) + dns_stats_detach(&zone->requeststats); if (zone->db != NULL) zone_detachdb(zone); if (zone->acache != NULL) @@ -814,7 +832,7 @@ dns_zone_setclass(dns_zone_t *zone, dns_rdataclass_t rdclass) { } dns_rdataclass_t -dns_zone_getclass(dns_zone_t *zone){ +dns_zone_getclass(dns_zone_t *zone) { REQUIRE(DNS_ZONE_VALID(zone)); return (zone->rdclass); @@ -829,6 +847,19 @@ 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; + + REQUIRE(DNS_ZONE_VALID(zone)); + + LOCK_ZONE(zone); + serial = zone->serial; + UNLOCK_ZONE(zone); + + return (serial); +} + /* * Single shot. */ @@ -3850,6 +3881,16 @@ notify_send_toaddr(isc_task_t *task, isc_event_t *event) { timeout * 3, timeout, notify->zone->task, notify_done, notify, ¬ify->request); + if (result == ISC_R_SUCCESS) { + if (isc_sockaddr_pf(¬ify->dst) == AF_INET) { + inc_stats(notify->zone, + dns_zonestatscounter_notifyoutv4); + } else { + inc_stats(notify->zone, + dns_zonestatscounter_notifyoutv6); + } + } + cleanup_key: if (key != NULL) dns_tsigkey_detach(&key); @@ -4919,7 +4960,7 @@ create_query(dns_zone_t *zone, dns_rdatatype_t rdtype, } static isc_result_t -add_opt(dns_message_t *message, isc_uint16_t udpsize) { +add_opt(dns_message_t *message, isc_uint16_t udpsize, isc_boolean_t reqnsid) { dns_rdataset_t *rdataset = NULL; dns_rdatalist_t *rdatalist = NULL; dns_rdata_t *rdata = NULL; @@ -4949,11 +4990,21 @@ add_opt(dns_message_t *message, isc_uint16_t udpsize) { */ rdatalist->ttl = 0; - /* - * No EDNS options. - */ - rdata->data = NULL; - rdata->length = 0; + /* Set EDNS options if applicable */ + if (reqnsid) { + unsigned char data[4]; + isc_buffer_t buf; + + isc_buffer_init(&buf, data, sizeof(data)); + isc_buffer_putuint16(&buf, DNS_OPT_NSID); + isc_buffer_putuint16(&buf, 0); + rdata->data = data; + rdata->length = sizeof(data); + } else { + rdata->data = NULL; + rdata->length = 0; + } + rdata->rdclass = rdatalist->rdclass; rdata->type = rdatalist->type; rdata->flags = 0; @@ -4988,7 +5039,7 @@ soa_query(isc_task_t *task, isc_event_t *event) { isc_uint32_t options; isc_boolean_t cancel = ISC_TRUE; int timeout; - isc_boolean_t have_xfrsource; + isc_boolean_t have_xfrsource, reqnsid; isc_uint16_t udpsize = SEND_BUFFER_SIZE; REQUIRE(DNS_ZONE_VALID(zone)); @@ -5040,6 +5091,7 @@ soa_query(isc_task_t *task, isc_event_t *event) { (void)dns_view_getpeertsig(zone->view, &masterip, &key); have_xfrsource = ISC_FALSE; + reqnsid = zone->view->requestnsid; if (zone->view->peers != NULL) { dns_peer_t *peer = NULL; isc_boolean_t edns; @@ -5057,6 +5109,7 @@ soa_query(isc_task_t *task, isc_event_t *event) { udpsize = dns_resolver_getudpsize(zone->view->resolver); (void)dns_peer_getudpsize(peer, &udpsize); + (void)dns_peer_getrequestnsid(peer, &reqnsid); } } @@ -5088,7 +5141,7 @@ soa_query(isc_task_t *task, isc_event_t *event) { DNS_REQUESTOPT_TCP : 0; if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_NOEDNS)) { - result = add_opt(message, udpsize); + result = add_opt(message, udpsize, reqnsid); if (result != ISC_R_SUCCESS) zone_debuglog(zone, me, 1, "unable to add opt record: %s", @@ -5110,6 +5163,11 @@ soa_query(isc_task_t *task, isc_event_t *event) { "dns_request_createvia2() failed: %s", dns_result_totext(result)); goto cleanup; + } else { + if (isc_sockaddr_pf(&zone->masteraddr) == PF_INET) + inc_stats(zone, dns_zonestatscounter_soaoutv4); + else + inc_stats(zone, dns_zonestatscounter_soaoutv6); } cancel = ISC_FALSE; @@ -5152,7 +5210,7 @@ ns_query(dns_zone_t *zone, dns_rdataset_t *soardataset, dns_stub_t *stub) { dns_tsigkey_t *key = NULL; dns_dbnode_t *node = NULL; int timeout; - isc_boolean_t have_xfrsource = ISC_FALSE; + isc_boolean_t have_xfrsource = ISC_FALSE, reqnsid; isc_uint16_t udpsize = SEND_BUFFER_SIZE; REQUIRE(DNS_ZONE_VALID(zone)); @@ -5264,6 +5322,7 @@ ns_query(dns_zone_t *zone, dns_rdataset_t *soardataset, dns_stub_t *stub) { if (key == NULL) (void)dns_view_getpeertsig(zone->view, &masterip, &key); + reqnsid = zone->view->requestnsid; if (zone->view->peers != NULL) { dns_peer_t *peer = NULL; isc_boolean_t edns; @@ -5281,11 +5340,12 @@ ns_query(dns_zone_t *zone, dns_rdataset_t *soardataset, dns_stub_t *stub) { udpsize = dns_resolver_getudpsize(zone->view->resolver); (void)dns_peer_getudpsize(peer, &udpsize); + (void)dns_peer_getrequestnsid(peer, &reqnsid); } } if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_NOEDNS)) { - result = add_opt(message, udpsize); + result = add_opt(message, udpsize, reqnsid); if (result != ISC_R_SUCCESS) zone_debuglog(zone, me, 1, "unable to add opt record: %s", @@ -5750,6 +5810,10 @@ dns_zone_notifyreceive(dns_zone_t *zone, isc_sockaddr_t *from, * We only handle NOTIFY (SOA) at the present. */ LOCK_ZONE(zone); + if (isc_sockaddr_pf(from) == PF_INET) + inc_stats(zone, dns_zonestatscounter_notifyinv4); + else + inc_stats(zone, dns_zonestatscounter_notifyinv6); if (msg->counts[DNS_SECTION_QUESTION] == 0 || dns_message_findname(msg, DNS_SECTION_QUESTION, &zone->origin, dns_rdatatype_soa, dns_rdatatype_none, @@ -5804,6 +5868,7 @@ dns_zone_notifyreceive(dns_zone_t *zone, isc_sockaddr_t *from, UNLOCK_ZONE(zone); dns_zone_log(zone, ISC_LOG_INFO, "refused notify from non-master: %s", fromtext); + inc_stats(zone, dns_zonestatscounter_notifyrej); return (DNS_R_REFUSED); } @@ -6772,6 +6837,7 @@ zone_xfrdone(dns_zone_t *zone, isc_result_t result) { dns_result_totext(result)); } + inc_stats(zone, dns_zonestatscounter_xfrsuccess); break; case DNS_R_BADIXFR: @@ -6806,6 +6872,7 @@ zone_xfrdone(dns_zone_t *zone, isc_result_t result) { DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_REFRESH); again = ISC_TRUE; } + inc_stats(zone, dns_zonestatscounter_xfrfail); break; } zone_settimer(zone, &now); @@ -7095,6 +7162,21 @@ got_transfer_quota(isc_task_t *task, isc_event_t *event) { zone->tsigkey, zone->mctx, zone->zmgr->timermgr, zone->zmgr->socketmgr, zone->task, zone_xfrdone, &zone->xfr); + if (result == ISC_R_SUCCESS) { + LOCK_ZONE(zone); + if (xfrtype == dns_rdatatype_axfr) { + if (isc_sockaddr_pf(&masteraddr) == PF_INET) + inc_stats(zone, dns_zonestatscounter_axfrreqv4); + else + inc_stats(zone, dns_zonestatscounter_axfrreqv6); + } else if (xfrtype == dns_rdatatype_ixfr) { + if (isc_sockaddr_pf(&masteraddr) == PF_INET) + inc_stats(zone, dns_zonestatscounter_ixfrreqv4); + else + inc_stats(zone, dns_zonestatscounter_ixfrreqv6); + } + UNLOCK_ZONE(zone); + } cleanup: /* * Any failure in this function is handled like a failed @@ -8086,35 +8168,66 @@ dns_zone_isforced(dns_zone_t *zone) { isc_result_t dns_zone_setstatistics(dns_zone_t *zone, isc_boolean_t on) { - isc_result_t result = ISC_R_SUCCESS; - - LOCK_ZONE(zone); - if (on) { - if (zone->counters != NULL) - goto done; - result = dns_stats_create(zone->mctx, &zone->counters); - } else { - if (zone->counters == NULL) - goto done; - dns_stats_destroy(zone->mctx, &zone->counters); - } - done: - UNLOCK_ZONE(zone); - return (result); + /* + * This function is obsoleted. + */ + UNUSED(zone); + UNUSED(on); + return (ISC_R_NOTIMPLEMENTED); } isc_uint64_t * dns_zone_getstatscounters(dns_zone_t *zone) { /* - * This function is obsoleted by dns_zone_getstats(). + * This function is obsoleted. */ UNUSED(zone); return (NULL); } +void +dns_zone_setstats(dns_zone_t *zone, dns_stats_t *stats) { + REQUIRE(DNS_ZONE_VALID(zone)); + REQUIRE(zone->stats == NULL); + + LOCK_ZONE(zone); + zone->stats = NULL; + dns_stats_attach(stats, &zone->stats); + UNLOCK_ZONE(zone); +} + +void +dns_zone_setrequeststats(dns_zone_t *zone, dns_stats_t *stats) { + REQUIRE(DNS_ZONE_VALID(zone)); + + LOCK_ZONE(zone); + if (zone->requeststats_on && stats == NULL) + zone->requeststats_on = ISC_FALSE; + else if (!zone->requeststats_on && stats != NULL) { + if (zone->requeststats == NULL) { + dns_stats_attach(stats, &zone->requeststats); + zone->requeststats_on = ISC_TRUE; + } + } + UNLOCK_ZONE(zone); + + return; +} + dns_stats_t * -dns_zone_getstats(dns_zone_t *zone) { - return (zone->counters); +dns_zone_getrequeststats(dns_zone_t *zone) { + /* + * We don't lock zone for efficiency reason. This is not catastrophic + * because requeststats must always be valid when requeststats_on is + * true. + * Some counters may be incremented while requeststats_on is becoming + * false, or some cannot be incremented just after the statistics are + * installed, but it shouldn't matter much in practice. + */ + if (zone->requeststats_on) + return (zone->requeststats); + else + return (NULL); } void @@ -8325,50 +8438,3 @@ dns_zone_getnotifydelay(dns_zone_t *zone) { return (zone->notifydelay); } - -#ifdef HAVE_LIBXML2 - -isc_result_t -dns_zone_xmlrender(dns_zone_t *zone, xmlTextWriterPtr xml, int flags) -{ - int i; - - /* XXXMLG render config data here */ - - if ((flags & ISC_XML_RENDERSTATS) != 0) { - xmlTextWriterStartElement(xml, ISC_XMLCHAR "zone"); - - xmlTextWriterStartElement(xml, ISC_XMLCHAR "name"); - xmlTextWriterWriteString(xml, ISC_XMLCHAR zone->strname); - xmlTextWriterEndElement(xml); - - xmlTextWriterStartElement(xml, ISC_XMLCHAR "rdataclass"); - xmlTextWriterWriteString(xml, ISC_XMLCHAR zone->strrdclass); - xmlTextWriterEndElement(xml); - - xmlTextWriterStartElement(xml, ISC_XMLCHAR "serial"); - xmlTextWriterWriteFormatString(xml, "%u", zone->serial); - xmlTextWriterEndElement(xml); - - if (zone->counters != NULL) { - isc_uint64_t counters[DNS_STATS_NCOUNTERS]; - - xmlTextWriterStartElement(xml, ISC_XMLCHAR "counters"); - dns_stats_copy(zone->counters, counters); - for (i = 0 ; i < DNS_STATS_NCOUNTERS ; i++) { - xmlTextWriterStartElement(xml, - ISC_XMLCHAR dns_statscounter_names[i]); - xmlTextWriterWriteFormatString(xml, - "%" ISC_PRINT_QUADFORMAT "u", - counters[i]); - xmlTextWriterEndElement(xml); - } - xmlTextWriterEndElement(xml); /* counters */ - } - xmlTextWriterEndElement(xml); /* zone */ - } - - return (ISC_R_SUCCESS); -} - -#endif /* HAVE_LIBXML2 */ diff --git a/lib/isc/api b/lib/isc/api index 58fb9f89..d2b48eaa 100644 --- a/lib/isc/api +++ b/lib/isc/api @@ -1,3 +1,3 @@ -LIBINTERFACE = 41 +LIBINTERFACE = 42 LIBREVISION = 0 -LIBAGE = 0 +LIBAGE = 1 diff --git a/lib/isc/include/isc/mem.h b/lib/isc/include/isc/mem.h index ade0794a..37a83668 100644 --- a/lib/isc/include/isc/mem.h +++ b/lib/isc/include/isc/mem.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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.72 2007/06/18 23:47:44 tbox Exp $ */ +/* $Id: mem.h,v 1.72.128.3 2008/03/31 05:06:47 marka Exp $ */ #ifndef ISC_MEM_H #define ISC_MEM_H 1 @@ -157,7 +157,7 @@ LIBISC_EXTERNAL_DATA extern unsigned int isc_mem_debugging; #define isc_mem_strdup(c, p) isc__mem_strdup((c), (p) _ISC_MEM_FILELINE) #define isc_mempool_get(c) isc__mempool_get((c) _ISC_MEM_FILELINE) -/*% +/*% * isc_mem_putanddetach() is a convienence function for use where you * have a structure with an attached memory context. * @@ -216,7 +216,7 @@ LIBISC_EXTERNAL_DATA extern unsigned int isc_mem_debugging; #endif /*@{*/ -isc_result_t +isc_result_t isc_mem_create(size_t max_size, size_t target_size, isc_mem_t **mctxp); @@ -224,12 +224,12 @@ isc_result_t isc_mem_create2(size_t max_size, size_t target_size, isc_mem_t **mctxp, unsigned int flags); -isc_result_t +isc_result_t isc_mem_createx(size_t max_size, size_t target_size, isc_memalloc_t memalloc, isc_memfree_t memfree, void *arg, isc_mem_t **mctxp); -isc_result_t +isc_result_t isc_mem_createx2(size_t max_size, size_t target_size, isc_memalloc_t memalloc, isc_memfree_t memfree, void *arg, isc_mem_t **mctxp, unsigned int flags); @@ -266,9 +266,9 @@ isc_mem_createx2(size_t max_size, size_t target_size, /*@}*/ /*@{*/ -void +void isc_mem_attach(isc_mem_t *, isc_mem_t **); -void +void isc_mem_detach(isc_mem_t **); /*!< * \brief Attach to / detach from a memory context. @@ -276,7 +276,7 @@ isc_mem_detach(isc_mem_t **); * This is intended for applications that use multiple memory contexts * in such a way that it is not obvious when the last allocations from * a given context has been freed and destroying the context is safe. - * + * * Most applications do not need to call these functions as they can * simply create a single memory context at the beginning of main() * and destroy it at the end of main(), thereby guaranteeing that it @@ -284,13 +284,13 @@ isc_mem_detach(isc_mem_t **); */ /*@}*/ -void +void isc_mem_destroy(isc_mem_t **); /*%< * Destroy a memory context. */ -isc_result_t +isc_result_t isc_mem_ondestroy(isc_mem_t *ctx, isc_task_t *task, isc_event_t **event); @@ -299,13 +299,13 @@ isc_mem_ondestroy(isc_mem_t *ctx, * been successfully destroyed. */ -void +void isc_mem_stats(isc_mem_t *mctx, FILE *out); /*%< * Print memory usage statistics for 'mctx' on the stream 'out'. */ -void +void isc_mem_setdestroycheck(isc_mem_t *mctx, isc_boolean_t on); /*%< @@ -314,9 +314,9 @@ isc_mem_setdestroycheck(isc_mem_t *mctx, */ /*@{*/ -void +void isc_mem_setquota(isc_mem_t *, size_t); -size_t +size_t isc_mem_getquota(isc_mem_t *); /*%< * Set/get the memory quota of 'mctx'. This is a hard limit @@ -325,7 +325,7 @@ isc_mem_getquota(isc_mem_t *); */ /*@}*/ -size_t +size_t isc_mem_inuse(isc_mem_t *mctx); /*%< * Get an estimate of the number of memory in use in 'mctx', in bytes. @@ -337,13 +337,29 @@ void isc_mem_setwater(isc_mem_t *mctx, isc_mem_water_t water, void *water_arg, size_t hiwater, size_t lowater); /*%< - * Set high and low water marks for this memory context. - * - * When the memory - * usage of 'mctx' exceeds 'hiwater', '(water)(water_arg, #ISC_MEM_HIWATER)' - * will be called. When the usage drops below 'lowater', 'water' will - * again be called, this time with #ISC_MEM_LOWATER. - * + * Set high and low water marks for this memory context. + * + * When the memory usage of 'mctx' exceeds 'hiwater', + * '(water)(water_arg, #ISC_MEM_HIWATER)' will be called. 'water' needs to + * call isc_mem_waterack() with #ISC_MEM_HIWATER to acknowlege the state + * change. 'water' may be called multiple times. + * + * When the usage drops below 'lowater', 'water' will again be called, this + * time with #ISC_MEM_LOWATER. 'water' need to calls isc_mem_waterack() with + * #ISC_MEM_LOWATER to acknowlege the change. + * + * static void + * water(void *arg, int mark) { + * struct foo *foo = arg; + * + * LOCK(&foo->marklock); + * if (foo->mark != mark) { + * foo->mark = mark; + * .... + * isc_mem_waterack(foo->mctx, mark); + * } + * UNLOCK(&foo->marklock); + * } * If 'water' is NULL then 'water_arg', 'hi_water' and 'lo_water' are * ignored and the state is reset. * @@ -354,6 +370,12 @@ isc_mem_setwater(isc_mem_t *mctx, isc_mem_water_t water, void *water_arg, */ void +isc_mem_waterack(isc_mem_t *ctx, int mark); +/*%< + * Called to acknowledge changes in signalled by calls to 'water'. + */ + +void isc_mem_printactive(isc_mem_t *mctx, FILE *file); /*%< * Print to 'file' all active memory in 'mctx'. @@ -377,6 +399,59 @@ isc_mem_checkdestroyed(FILE *file); * Fatally fails if there are still active contexts. */ +void +isc_mem_setname(isc_mem_t *ctx, const char *name, void *tag); +/*%< + * Name 'ctx'. + * + * Notes: + * + *\li Only the first 15 characters of 'name' will be copied. + * + *\li 'tag' is for debugging purposes only. + * + * Requires: + * + *\li 'ctx' is a valid ctx. + */ + +const char * +isc_mem_getname(isc_mem_t *ctx); +/*%< + * Get the name of 'ctx', as previously set using isc_mem_setname(). + * + * Requires: + *\li 'ctx' is a valid ctx. + * + * Returns: + *\li A non-NULL pointer to a null-terminated string. + * If the ctx has not been named, the string is + * empty. + */ + +void * +isc_mem_gettag(isc_mem_t *ctx); +/*%< + * Get the tag value for 'task', as previously set using isc_mem_setname(). + * + * Requires: + *\li 'ctx' is a valid ctx. + * + * Notes: + *\li This function is for debugging purposes only. + * + * Requires: + *\li 'ctx' is a valid task. + */ + +#ifdef HAVE_LIBXML2 +void +isc_mem_renderxml(xmlTextWriterPtr writer); +/*%< + * Render all contexts' statistics and status in XML for writer. + */ +#endif /* HAVE_LIBXML2 */ + /* * Memory pools */ @@ -521,28 +596,23 @@ isc_mempool_setfillcount(isc_mempool_t *mpctx, unsigned int limit); /* * Pseudo-private functions for use via macros. Do not call directly. */ -void * +void * isc__mem_get(isc_mem_t *, size_t _ISC_MEM_FLARG); -void +void isc__mem_putanddetach(isc_mem_t **, void *, size_t _ISC_MEM_FLARG); -void +void isc__mem_put(isc_mem_t *, void *, size_t _ISC_MEM_FLARG); -void * +void * isc__mem_allocate(isc_mem_t *, size_t _ISC_MEM_FLARG); -void +void isc__mem_free(isc_mem_t *, void * _ISC_MEM_FLARG); -char * +char * isc__mem_strdup(isc_mem_t *, const char *_ISC_MEM_FLARG); -void * +void * isc__mempool_get(isc_mempool_t * _ISC_MEM_FLARG); -void -isc__mempool_put(isc_mempool_t *, void * _ISC_MEM_FLARG); - -#ifdef HAVE_LIBXML2 void -isc_mem_renderxml(isc_mem_t *mgr, xmlTextWriterPtr writer); -#endif /* HAVE_LIBXML2 */ +isc__mempool_put(isc_mempool_t *, void * _ISC_MEM_FLARG); ISC_LANG_ENDDECLS diff --git a/lib/isc/mem.c b/lib/isc/mem.c index 36b9a7b0..bf82ad56 100644 --- a/lib/isc/mem.c +++ b/lib/isc/mem.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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.137 2007/11/26 04:27:19 marka Exp $ */ +/* $Id: mem.c,v 1.137.16.4 2008/03/31 23:46:42 tbox Exp $ */ /*! \file */ @@ -34,6 +34,7 @@ #include <isc/ondestroy.h> #include <isc/string.h> #include <isc/mutex.h> +#include <isc/print.h> #include <isc/util.h> #include <isc/xml.h> @@ -113,6 +114,12 @@ static ISC_LIST(isc_mem_t) contexts; static isc_once_t once = ISC_ONCE_INIT; static isc_mutex_t lock; +/*% + * Total size of lost memory due to a bug of external library. + * Locked by the global lock. + */ +static isc_uint64_t totallost; + struct isc_mem { unsigned int magic; isc_ondestroy_t ondestroy; @@ -125,6 +132,8 @@ struct isc_mem { isc_boolean_t checkfree; struct stats * stats; unsigned int references; + char name[16]; + void * tag; size_t quota; size_t total; size_t inuse; @@ -135,6 +144,7 @@ struct isc_mem { isc_mem_water_t water; void * water_arg; ISC_LIST(isc_mempool_t) pools; + unsigned int poolcnt; /* ISC_MEMFLAG_INTERNAL */ size_t mem_target; @@ -148,6 +158,7 @@ struct isc_mem { #if ISC_MEM_TRACKLINES debuglist_t * debuglist; + unsigned int debuglistcnt; #endif unsigned int memalloc_failures; @@ -193,7 +204,7 @@ struct isc_mempool { if ((isc_mem_debugging & (ISC_MEM_DEBUGTRACE | \ ISC_MEM_DEBUGRECORD)) != 0 && \ b != NULL) \ - add_trace_entry(a, b, c, d, e); \ + add_trace_entry(a, b, c, d, e); \ } while (0) #define DELETE_TRACE(a, b, c, d, e) delete_trace_entry(a, b, c, d, e) @@ -259,6 +270,7 @@ add_trace_entry(isc_mem_t *mctx, const void *ptr, unsigned int size dl->count = 1; ISC_LIST_PREPEND(mctx->debuglist[size], dl, link); + mctx->debuglistcnt++; } static inline void @@ -314,7 +326,7 @@ delete_trace_entry(isc_mem_t *mctx, const void *ptr, unsigned int size, static inline size_t rmsize(size_t size) { /* - * round down to ALIGNMENT_SIZE + * round down to ALIGNMENT_SIZE */ return (size & (~(ALIGNMENT_SIZE - 1))); } @@ -603,7 +615,7 @@ mem_get(isc_mem_t *ctx, size_t size) { ret = (ctx->memalloc)(ctx->arg, size); if (ret == NULL) - ctx->memalloc_failures++; + ctx->memalloc_failures++; #if ISC_MEM_FILL if (ret != NULL) @@ -692,6 +704,7 @@ static void initialize_action(void) { RUNTIME_CHECK(isc_mutex_init(&lock) == ISC_R_SUCCESS); ISC_LIST_INIT(contexts); + totallost = 0; } /* @@ -705,7 +718,7 @@ isc_mem_createx(size_t init_max_size, size_t target_size, { return (isc_mem_createx2(init_max_size, target_size, memalloc, memfree, arg, ctxp, ISC_MEMFLAG_DEFAULT)); - + } isc_result_t @@ -742,6 +755,8 @@ isc_mem_createx2(size_t init_max_size, size_t target_size, ctx->max_size = init_max_size; ctx->flags = flags; ctx->references = 1; + memset(ctx->name, 0, sizeof(ctx->name)); + ctx->tag = NULL; ctx->quota = 0; ctx->total = 0; ctx->inuse = 0; @@ -760,8 +775,10 @@ isc_mem_createx2(size_t init_max_size, size_t target_size, ctx->checkfree = ISC_TRUE; #if ISC_MEM_TRACKLINES ctx->debuglist = NULL; + ctx->debuglistcnt = 0; #endif ISC_LIST_INIT(ctx->pools); + ctx->poolcnt = 0; ctx->freelists = NULL; ctx->basic_blocks = NULL; ctx->basic_table = NULL; @@ -862,6 +879,7 @@ destroy(isc_mem_t *ctx) { LOCK(&lock); ISC_LIST_UNLINK(contexts, ctx, link); + totallost += ctx->inuse; UNLOCK(&lock); INSIST(ISC_LIST_EMPTY(ctx->pools)); @@ -882,7 +900,7 @@ destroy(isc_mem_t *ctx) { dl != NULL; dl = ISC_LIST_HEAD(ctx->debuglist[i])) { ISC_LIST_UNLINK(ctx->debuglist[i], - dl, link); + dl, link); free(dl); } } @@ -1086,7 +1104,6 @@ isc__mem_get(isc_mem_t *ctx, size_t size FLARG) { ADD_TRACE(ctx, ptr, size, file, line); if (ctx->hi_water != 0U && !ctx->hi_called && ctx->inuse > ctx->hi_water) { - ctx->hi_called = ISC_TRUE; call_water = ISC_TRUE; } if (ctx->inuse > ctx->maxinuse) { @@ -1142,10 +1159,8 @@ 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->hi_called && + if (ctx->hi_called && (ctx->inuse < ctx->lo_water || ctx->lo_water == 0U)) { - ctx->hi_called = ISC_FALSE; - if (ctx->water != NULL) call_water = ISC_TRUE; } @@ -1155,6 +1170,18 @@ isc__mem_put(isc_mem_t *ctx, void *ptr, size_t size FLARG) (ctx->water)(ctx->water_arg, ISC_MEM_LOWATER); } +void +isc_mem_waterack(isc_mem_t *ctx, int flag) { + REQUIRE(VALID_CONTEXT(ctx)); + + MCTXLOCK(ctx, &ctx->lock); + if (flag == ISC_MEM_LOWATER) + ctx->hi_called = ISC_FALSE; + else if (flag == ISC_MEM_HIWATER) + ctx->hi_called = ISC_TRUE; + MCTXUNLOCK(ctx, &ctx->lock); +} + #if ISC_MEM_TRACKLINES static void print_active(isc_mem_t *mctx, FILE *out) { @@ -1170,11 +1197,11 @@ print_active(isc_mem_t *mctx, FILE *out) { "memory allocations:\n")); found = ISC_FALSE; format = isc_msgcat_get(isc_msgcat, ISC_MSGSET_MEM, - ISC_MSG_PTRFILELINE, + ISC_MSG_PTRFILELINE, "\tptr %p size %u file %s line %u\n"); for (i = 0; i <= mctx->max_size; i++) { dl = ISC_LIST_HEAD(mctx->debuglist[i]); - + if (dl != NULL) found = ISC_TRUE; @@ -1372,7 +1399,7 @@ 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->hi_called && + if (ctx->hi_called && (ctx->inuse < ctx->lo_water || ctx->lo_water == 0U)) { ctx->hi_called = ISC_FALSE; @@ -1462,7 +1489,7 @@ isc_mem_inuse(isc_mem_t *ctx) { void isc_mem_setwater(isc_mem_t *ctx, isc_mem_water_t water, void *water_arg, - size_t hiwater, size_t lowater) + size_t hiwater, size_t lowater) { isc_boolean_t callwater = ISC_FALSE; isc_mem_water_t oldwater; @@ -1493,11 +1520,36 @@ isc_mem_setwater(isc_mem_t *ctx, isc_mem_water_t water, void *water_arg, ctx->hi_called = ISC_FALSE; } MCTXUNLOCK(ctx, &ctx->lock); - + if (callwater && oldwater != NULL) (oldwater)(oldwater_arg, ISC_MEM_LOWATER); } +void +isc_mem_setname(isc_mem_t *ctx, const char *name, void *tag) { + REQUIRE(VALID_CONTEXT(ctx)); + + LOCK(&ctx->lock); + memset(ctx->name, 0, sizeof(ctx->name)); + strncpy(ctx->name, name, sizeof(ctx->name) - 1); + ctx->tag = tag; + UNLOCK(&ctx->lock); +} + +const char * +isc_mem_getname(isc_mem_t *ctx) { + REQUIRE(VALID_CONTEXT(ctx)); + + return (ctx->name); +} + +void * +isc_mem_gettag(isc_mem_t *ctx) { + REQUIRE(VALID_CONTEXT(ctx)); + + return (ctx->tag); +} + /* * Memory pool stuff */ @@ -1537,6 +1589,7 @@ isc_mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp) { MCTXLOCK(mctx, &mctx->lock); ISC_LIST_INITANDAPPEND(mctx->pools, mpctx, link); + mctx->poolcnt++; MCTXUNLOCK(mctx, &mctx->lock); return (ISC_R_SUCCESS); @@ -1611,6 +1664,7 @@ isc_mempool_destroy(isc_mempool_t **mpctxp) { */ MCTXLOCK(mctx, &mctx->lock); ISC_LIST_UNLINK(mctx->pools, mpctx, link); + mctx->poolcnt--; MCTXUNLOCK(mctx, &mctx->lock); mpctx->magic = 0; @@ -1932,7 +1986,7 @@ isc_mem_printallactive(FILE *file) { #endif } -void +void isc_mem_checkdestroyed(FILE *file) { RUNTIME_CHECK(isc_once_do(&once, initialize_action) == ISC_R_SUCCESS); @@ -1957,115 +2011,149 @@ isc_mem_checkdestroyed(FILE *file) { #ifdef HAVE_LIBXML2 -void -isc_mem_renderxml(isc_mem_t *ctx, xmlTextWriterPtr writer) -{ - size_t i; - const struct stats *s; - const isc_mempool_t *pool; +typedef struct summarystat { + isc_uint64_t total; + isc_uint64_t inuse; + isc_uint64_t blocksize; + isc_uint64_t contextsize; +} summarystat_t; +static void +renderctx(isc_mem_t *ctx, summarystat_t *summary, xmlTextWriterPtr writer) { REQUIRE(VALID_CONTEXT(ctx)); - MCTXLOCK(ctx, &ctx->lock); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "references"); - xmlTextWriterWriteFormatString(writer, "%d", ctx->references); - xmlTextWriterEndElement(writer); + xmlTextWriterStartElement(writer, ISC_XMLCHAR "context"); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "buckets"); - for (i = 0; i <= ctx->max_size; i++) { - s = &ctx->stats[i]; + xmlTextWriterStartElement(writer, ISC_XMLCHAR "id"); + xmlTextWriterWriteFormatString(writer, "%p", ctx); + xmlTextWriterEndElement(writer); /* id */ - if (s->totalgets == 0U && s->gets == 0U) - continue; + if (ctx->name[0] != 0) { + xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"); + xmlTextWriterWriteFormatString(writer, "%s", ctx->name); + xmlTextWriterEndElement(writer); /* name */ + } - xmlTextWriterStartElement(writer, ISC_XMLCHAR "bucket"); + REQUIRE(VALID_CONTEXT(ctx)); + MCTXLOCK(ctx, &ctx->lock); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "size"); - xmlTextWriterWriteFormatString(writer, "%ld", (long)i); - xmlTextWriterEndElement(writer); /* size */ + summary->contextsize += sizeof(*ctx) + + (ctx->max_size + 1) * sizeof(struct stats) + + ctx->max_size * sizeof(element *) + + ctx->basic_table_count * sizeof(char *); +#if ISC_MEM_TRACKLINES + if (ctx->debuglist != NULL) { + summary->contextsize += + (ctx->max_size + 1) * sizeof(debuglist_t) + + ctx->debuglistcnt * sizeof(debuglink_t); + } +#endif + xmlTextWriterStartElement(writer, ISC_XMLCHAR "references"); + xmlTextWriterWriteFormatString(writer, "%d", ctx->references); + xmlTextWriterEndElement(writer); /* references */ + + summary->total += ctx->total; + xmlTextWriterStartElement(writer, ISC_XMLCHAR "total"); + xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u", + (isc_uint64_t)ctx->total); + xmlTextWriterEndElement(writer); /* total */ + + summary->inuse += ctx->inuse; + xmlTextWriterStartElement(writer, ISC_XMLCHAR "inuse"); + xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u", + (isc_uint64_t)ctx->inuse); + xmlTextWriterEndElement(writer); /* inuse */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "maxinuse"); + xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u", + (isc_uint64_t)ctx->maxinuse); + xmlTextWriterEndElement(writer); /* maxinuse */ + + xmlTextWriterStartElement(writer, ISC_XMLCHAR "blocksize"); + if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0) { + summary->blocksize += ctx->basic_table_count * + NUM_BASIC_BLOCKS * ctx->mem_target; + xmlTextWriterWriteFormatString(writer, + "%" ISC_PRINT_QUADFORMAT "u", + (isc_uint64_t) + ctx->basic_table_count * + NUM_BASIC_BLOCKS * + ctx->mem_target); + } else + xmlTextWriterWriteFormatString(writer, "%s", "-"); + xmlTextWriterEndElement(writer); /* blocksize */ - xmlTextWriterStartElement(writer, ISC_XMLCHAR "totalgets"); - xmlTextWriterWriteFormatString(writer, "%lu", s->totalgets); - xmlTextWriterEndElement(writer); /* totalgets */ + xmlTextWriterStartElement(writer, ISC_XMLCHAR "pools"); + xmlTextWriterWriteFormatString(writer, "%u", ctx->poolcnt); + xmlTextWriterEndElement(writer); /* pools */ + summary->contextsize += ctx->poolcnt * sizeof(isc_mempool_t); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "gets"); - xmlTextWriterWriteFormatString(writer, "%lu", s->gets); - xmlTextWriterEndElement(writer); /* gets */ + xmlTextWriterStartElement(writer, ISC_XMLCHAR "hiwater"); + xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u", + (isc_uint64_t)ctx->hi_water); + xmlTextWriterEndElement(writer); /* hiwater */ - if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0 && - (s->blocks != 0U || s->freefrags != 0U)) { - xmlTextWriterStartElement(writer, - ISC_XMLCHAR "blocks"); - xmlTextWriterWriteFormatString(writer, "%lu", - s->blocks); - xmlTextWriterEndElement(writer); /* blocks */ - - xmlTextWriterStartElement(writer, - ISC_XMLCHAR "freefrags"); - xmlTextWriterWriteFormatString(writer, "%lu", - s->freefrags); - xmlTextWriterEndElement(writer); /* freefrags */ - } + xmlTextWriterStartElement(writer, ISC_XMLCHAR "lowater"); + xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u", + (isc_uint64_t)ctx->lo_water); + xmlTextWriterEndElement(writer); /* lowater */ - xmlTextWriterEndElement(writer); /* bucket */ - } - xmlTextWriterEndElement(writer); /* buckets */ + MCTXUNLOCK(ctx, &ctx->lock); - /* - * Note that since a pool can be locked now, these stats might be - * somewhat off if the pool is in active use at the time the stats - * are dumped. The link fields are protected by the isc_mem_t's - * lock, however, so walking this list and extracting integers from - * stats fields is always safe. - */ - xmlTextWriterStartElement(writer, ISC_XMLCHAR "pools"); - pool = ISC_LIST_HEAD(ctx->pools); - while (pool != NULL) { - xmlTextWriterStartElement(writer, ISC_XMLCHAR "pool"); + xmlTextWriterEndElement(writer); /* context */ +} + +void +isc_mem_renderxml(xmlTextWriterPtr writer) { + isc_mem_t *ctx; + summarystat_t summary; + isc_uint64_t lost; - xmlTextWriterWriteElement(writer, ISC_XMLCHAR "name", - ISC_XMLCHAR pool->name); + memset(&summary, 0, sizeof(summary)); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "size"); - xmlTextWriterWriteFormatString(writer, "%ld", (long)pool->size); - xmlTextWriterEndElement(writer); /* size */ + xmlTextWriterStartElement(writer, ISC_XMLCHAR "contexts"); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "maxalloc"); - xmlTextWriterWriteFormatString(writer, "%u", pool->maxalloc); - xmlTextWriterEndElement(writer); /* maxalloc */ + RUNTIME_CHECK(isc_once_do(&once, initialize_action) == ISC_R_SUCCESS); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "allocated"); - xmlTextWriterWriteFormatString(writer, "%u", pool->allocated); - xmlTextWriterEndElement(writer); /* allocated */ + LOCK(&lock); + lost = totallost; + for (ctx = ISC_LIST_HEAD(contexts); + ctx != NULL; + ctx = ISC_LIST_NEXT(ctx, link)) { + renderctx(ctx, &summary, writer); + } + UNLOCK(&lock); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "freecount"); - xmlTextWriterWriteFormatString(writer, "%u", pool->freecount); - xmlTextWriterEndElement(writer); /* freecount */ + xmlTextWriterEndElement(writer); /* contexts */ - xmlTextWriterStartElement(writer, ISC_XMLCHAR "freemax"); - xmlTextWriterWriteFormatString(writer, "%u", pool->freemax); - xmlTextWriterEndElement(writer); /* freemax */ + xmlTextWriterStartElement(writer, ISC_XMLCHAR "summary"); - xmlTextWriterStartElement(writer, ISC_XMLCHAR "fillcount"); - xmlTextWriterWriteFormatString(writer, "%u", pool->fillcount); - xmlTextWriterEndElement(writer); /* fillcount */ + xmlTextWriterStartElement(writer, ISC_XMLCHAR "TotalUse"); + xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u", + summary.total); + xmlTextWriterEndElement(writer); /* TotalUse */ - xmlTextWriterStartElement(writer, ISC_XMLCHAR "gets"); - xmlTextWriterWriteFormatString(writer, "%u", pool->gets); - xmlTextWriterEndElement(writer); /* gets */ + xmlTextWriterStartElement(writer, ISC_XMLCHAR "InUse"); + xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u", + summary.inuse); + xmlTextWriterEndElement(writer); /* InUse */ - xmlTextWriterStartElement(writer, ISC_XMLCHAR "locked"); - xmlTextWriterWriteFormatString(writer, "%s", - ((pool->lock == NULL) ? "No" : "Yes")); - xmlTextWriterEndElement(writer); /* locked */ + xmlTextWriterStartElement(writer, ISC_XMLCHAR "BlockSize"); + xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u", + summary.blocksize); + xmlTextWriterEndElement(writer); /* BlockSize */ - xmlTextWriterEndElement(writer); /* pool */ + xmlTextWriterStartElement(writer, ISC_XMLCHAR "ContextSize"); + xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u", + summary.contextsize); + xmlTextWriterEndElement(writer); /* ContextSize */ - pool = ISC_LIST_NEXT(pool, link); - } - xmlTextWriterEndElement(writer); /* pools */ + xmlTextWriterStartElement(writer, ISC_XMLCHAR "Lost"); + xmlTextWriterWriteFormatString(writer, "%" ISC_PRINT_QUADFORMAT "u", + lost); + xmlTextWriterEndElement(writer); /* Lost */ - MCTXUNLOCK(ctx, &ctx->lock); + xmlTextWriterEndElement(writer); /* summary */ } #endif /* HAVE_LIBXML2 */ diff --git a/lib/isc/print.c b/lib/isc/print.c index 26bf8e52..a64aaf53 100644 --- a/lib/isc/print.c +++ b/lib/isc/print.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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.33 2007/06/19 23:47:17 tbox Exp $ */ +/* $Id: print.c,v 1.33.128.2 2008/02/18 23:46:30 tbox Exp $ */ /*! \file */ @@ -246,8 +246,24 @@ isc_print_vsnprintf(char *str, size_t size, const char *format, va_list ap) { head = ""; tmpui = tmpi; } - sprintf(buf, "%" ISC_PRINT_QUADFORMAT "u", - tmpui); + if (tmpui <= 0xffffffffU) + sprintf(buf, "%lu", + (unsigned long)tmpui); + else { + unsigned long mid; + unsigned long lo; + unsigned long hi; + lo = tmpui % 1000000000; + tmpui /= 1000000000; + mid = tmpui % 1000000000; + hi = tmpui / 1000000000; + if (hi != 0) + sprintf(buf, "%lu", hi); + else + buf[0] = '\n'; + sprintf(buf + strlen(buf), "%lu", mid); + sprintf(buf + strlen(buf), "%lu", lo); + } goto printint; case 'o': if (q) @@ -256,10 +272,29 @@ isc_print_vsnprintf(char *str, size_t size, const char *format, va_list ap) { tmpui = va_arg(ap, long int); else tmpui = va_arg(ap, int); - sprintf(buf, - alt ? "%#" ISC_PRINT_QUADFORMAT "o" - : "%" ISC_PRINT_QUADFORMAT "o", - tmpui); + if (tmpui <= 0xffffffffU) + sprintf(buf, alt ? "%#lo" : "%lo", + (unsigned long)tmpui); + else { + unsigned long mid; + unsigned long lo; + unsigned long hi; + lo = tmpui % 010000000000; + tmpui /= 010000000000; + mid = tmpui % 010000000000; + hi = tmpui / 010000000000; + if (hi != 0) { + sprintf(buf, + alt ? "%#lo" : "%lo", + hi); + sprintf(buf + strlen(buf), + "%lo", mid); + } else + sprintf(buf, + alt ? "%#lo" : "%lo", + mid); + sprintf(buf + strlen(buf), "%lo", lo); + } goto printint; case 'u': if (q) @@ -268,8 +303,24 @@ isc_print_vsnprintf(char *str, size_t size, const char *format, va_list ap) { tmpui = va_arg(ap, unsigned long int); else tmpui = va_arg(ap, unsigned int); - sprintf(buf, "%" ISC_PRINT_QUADFORMAT "u", - tmpui); + if (tmpui <= 0xffffffffU) + sprintf(buf, "%lu", + (unsigned long)tmpui); + else { + unsigned long mid; + unsigned long lo; + unsigned long hi; + lo = tmpui % 1000000000; + tmpui /= 1000000000; + mid = tmpui % 1000000000; + hi = tmpui / 1000000000; + if (hi != 0) + sprintf(buf, "%lu", hi); + else + buf[0] = '\n'; + sprintf(buf + strlen(buf), "%lu", mid); + sprintf(buf + strlen(buf), "%lu", lo); + } goto printint; case 'x': if (q) @@ -283,8 +334,15 @@ isc_print_vsnprintf(char *str, size_t size, const char *format, va_list ap) { if (precision > 2) precision -= 2; } - sprintf(buf, "%" ISC_PRINT_QUADFORMAT "x", - tmpui); + if (tmpui <= 0xffffffffU) + sprintf(buf, "%lx", + (unsigned long)tmpui); + else { + unsigned long hi = tmpui>>32; + unsigned long lo = tmpui & 0xffffffff; + sprintf(buf, "%lx", hi); + sprintf(buf + strlen(buf), "%lx", lo); + } goto printint; case 'X': if (q) @@ -298,8 +356,15 @@ isc_print_vsnprintf(char *str, size_t size, const char *format, va_list ap) { if (precision > 2) precision -= 2; } - sprintf(buf, "%" ISC_PRINT_QUADFORMAT "X", - tmpui); + if (tmpui <= 0xffffffffU) + sprintf(buf, "%lX", + (unsigned long)tmpui); + else { + unsigned long hi = tmpui>>32; + unsigned long lo = tmpui & 0xffffffff; + sprintf(buf, "%lX", hi); + sprintf(buf + strlen(buf), "%lX", lo); + } goto printint; printint: if (precision != 0 || width != 0) { diff --git a/lib/isc/pthreads/mutex.c b/lib/isc/pthreads/mutex.c index c437343e..794803b2 100644 --- a/lib/isc/pthreads/mutex.c +++ b/lib/isc/pthreads/mutex.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2008 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: mutex.c,v 1.14 2007/06/19 23:47:18 tbox Exp $ */ +/* $Id: mutex.c,v 1.14.128.2 2008/04/04 23:46:31 tbox Exp $ */ /*! \file */ @@ -36,23 +36,23 @@ /*% Operations on timevals; adapted from FreeBSD's sys/time.h */ #define timevalclear(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = 0) #define timevaladd(vvp, uvp) \ - do { \ - (vvp)->tv_sec += (uvp)->tv_sec; \ - (vvp)->tv_usec += (uvp)->tv_usec; \ - if ((vvp)->tv_usec >= 1000000) { \ - (vvp)->tv_sec++; \ - (vvp)->tv_usec -= 1000000; \ - } \ - } while (0) + do { \ + (vvp)->tv_sec += (uvp)->tv_sec; \ + (vvp)->tv_usec += (uvp)->tv_usec; \ + if ((vvp)->tv_usec >= 1000000) { \ + (vvp)->tv_sec++; \ + (vvp)->tv_usec -= 1000000; \ + } \ + } while (0) #define timevalsub(vvp, uvp) \ - do { \ - (vvp)->tv_sec -= (uvp)->tv_sec; \ - (vvp)->tv_usec -= (uvp)->tv_usec; \ - if ((vvp)->tv_usec < 0) { \ - (vvp)->tv_sec--; \ - (vvp)->tv_usec += 1000000; \ - } \ - } while (0) + do { \ + (vvp)->tv_sec -= (uvp)->tv_sec; \ + (vvp)->tv_usec -= (uvp)->tv_usec; \ + if ((vvp)->tv_usec < 0) { \ + (vvp)->tv_sec--; \ + (vvp)->tv_usec += 1000000; \ + } \ + } while (0) /*@}*/ @@ -77,8 +77,11 @@ struct isc_mutexstats { isc_mutexlocker_t lockers[ISC_MUTEX_MAX_LOCKERS]; }; -#define TABLESIZE (8 * 1024) -static isc_mutexstats_t stats[TABLESIZE]; +#ifndef ISC_MUTEX_PROFTABLESIZE +#define ISC_MUTEX_PROFTABLESIZE (16 * 1024) +#endif +static isc_mutexstats_t stats[ISC_MUTEX_PROFTABLESIZE]; +static int stats_next = 0; static isc_boolean_t stats_init = ISC_FALSE; static pthread_mutex_t statslock = PTHREAD_MUTEX_INITIALIZER; @@ -95,21 +98,19 @@ isc_mutex_init_profile(isc_mutex_t *mp, const char *file, int line) { RUNTIME_CHECK(pthread_mutex_lock(&statslock) == 0); - if (stats_init == ISC_FALSE) { - for (i = 0; i < TABLESIZE; i++) { - stats[i].file = NULL; - } + if (stats_init == ISC_FALSE) stats_init = ISC_TRUE; - } - mp->stats = NULL; - for (i = 0; i < TABLESIZE; i++) { - if (stats[i].file == NULL) { - mp->stats = &stats[i]; - break; - } - } - RUNTIME_CHECK(mp->stats != NULL); + /* + * If all statistics entries have been used, give up and trigger an + * assertion failure. There would be no other way to deal with this + * because we'd like to keep record of all locks for the purpose of + * debugging and the number of necessary locks is unpredictable. + * If this failure is triggered while debugging, named should be + * rebuilt with an increased ISC_MUTEX_PROFTABLESIZE. + */ + RUNTIME_CHECK(stats_next < ISC_MUTEX_PROFTABLESIZE); + mp->stats = &stats[stats_next++]; RUNTIME_CHECK(pthread_mutex_unlock(&statslock) == 0); @@ -196,10 +197,9 @@ void isc_mutex_statsprofile(FILE *fp) { isc_mutexlocker_t *locker; int i, j; + fprintf(fp, "Mutex stats (in us)\n"); - for (i = 0; i < TABLESIZE; i++) { - if (stats[i].file == NULL) - continue; + for (i = 0; i < stats_next; i++) { fprintf(fp, "%-12s %4d: %10u %lu.%06lu %lu.%06lu\n", stats[i].file, stats[i].line, stats[i].count, stats[i].locked_total.tv_sec, @@ -236,7 +236,7 @@ isc_mutex_init_errcheck(isc_mutex_t *mp) if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK) != 0) return (ISC_R_UNEXPECTED); - + err = pthread_mutex_init(mp, &attr) != 0) if (err == ENOMEM) return (ISC_R_NOMEMORY); @@ -251,6 +251,7 @@ pthread_mutexattr_t isc__mutex_attrs = { }; #endif +#if !(ISC_MUTEX_DEBUG && defined(PTHREAD_MUTEX_ERRORCHECK)) && !ISC_MUTEX_PROFILE isc_result_t isc__mutex_init(isc_mutex_t *mp, const char *file, unsigned int line) { char strbuf[ISC_STRERRORSIZE]; @@ -268,3 +269,4 @@ isc__mutex_init(isc_mutex_t *mp, const char *file, unsigned int line) { } return (result); } +#endif diff --git a/lib/isc/task.c b/lib/isc/task.c index e4b9b637..4b5a5a3c 100644 --- a/lib/isc/task.c +++ b/lib/isc/task.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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: task.c,v 1.105 2007/06/18 23:47:44 tbox Exp $ */ +/* $Id: task.c,v 1.105.128.2 2008/03/27 23:46:28 tbox Exp $ */ /*! \file * \author Principal Author: Bob Halley @@ -44,8 +44,6 @@ #include "task_p.h" #endif /* ISC_PLATFORM_USETHREADS */ -#define ISC_TASK_NAMES 1 - #ifdef ISC_TASK_TRACE #define XTRACE(m) fprintf(stderr, "task %p thread %lu: %s\n", \ task, isc_thread_self(), (m)) @@ -90,10 +88,8 @@ struct isc_task { unsigned int quantum; unsigned int flags; isc_stdtime_t now; -#ifdef ISC_TASK_NAMES char name[16]; void * tag; -#endif /* Locked by task manager lock. */ LINK(isc_task_t) link; LINK(isc_task_t) ready_link; @@ -203,10 +199,8 @@ isc_task_create(isc_taskmgr_t *manager, unsigned int quantum, task->quantum = quantum; task->flags = 0; task->now = 0; -#ifdef ISC_TASK_NAMES memset(task->name, 0, sizeof(task->name)); task->tag = NULL; -#endif INIT_LINK(task, link); INIT_LINK(task, ready_link); @@ -701,17 +695,11 @@ isc_task_setname(isc_task_t *task, const char *name, void *tag) { REQUIRE(VALID_TASK(task)); -#ifdef ISC_TASK_NAMES LOCK(&task->lock); memset(task->name, 0, sizeof(task->name)); strncpy(task->name, name, sizeof(task->name) - 1); task->tag = tag; UNLOCK(&task->lock); -#else - UNUSED(name); - UNUSED(tag); -#endif - } const char * @@ -813,9 +801,9 @@ dispatch(isc_taskmgr_t *manager) { * task lock. */ while ((EMPTY(manager->ready_tasks) || - manager->exclusive_requested) && - !FINISHED(manager)) - { + manager->exclusive_requested) && + !FINISHED(manager)) + { XTHREADTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL, ISC_MSG_WAIT, "wait")); @@ -1028,7 +1016,7 @@ manager_free(isc_taskmgr_t *manager) { isc_mem_t *mctx; #ifdef ISC_PLATFORM_USETHREADS - (void)isc_condition_destroy(&manager->exclusive_granted); + (void)isc_condition_destroy(&manager->exclusive_granted); (void)isc_condition_destroy(&manager->work_available); isc_mem_free(manager->mctx, manager->threads); #endif /* ISC_PLATFORM_USETHREADS */ @@ -1270,19 +1258,19 @@ isc__taskmgr_dispatch(void) { isc_result_t isc_task_beginexclusive(isc_task_t *task) { -#ifdef ISC_PLATFORM_USETHREADS +#ifdef ISC_PLATFORM_USETHREADS isc_taskmgr_t *manager = task->manager; REQUIRE(task->state == task_state_running); LOCK(&manager->lock); if (manager->exclusive_requested) { - UNLOCK(&manager->lock); + UNLOCK(&manager->lock); return (ISC_R_LOCKBUSY); } manager->exclusive_requested = ISC_TRUE; while (manager->tasks_running > 1) { WAIT(&manager->exclusive_granted, &manager->lock); } - UNLOCK(&manager->lock); + UNLOCK(&manager->lock); #else UNUSED(task); #endif @@ -1291,7 +1279,7 @@ isc_task_beginexclusive(isc_task_t *task) { void isc_task_endexclusive(isc_task_t *task) { -#ifdef ISC_PLATFORM_USETHREADS +#ifdef ISC_PLATFORM_USETHREADS isc_taskmgr_t *manager = task->manager; REQUIRE(task->state == task_state_running); LOCK(&manager->lock); diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index 01ef8a5b..aebd825f 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: socket.c,v 1.275.10.3 2008/01/27 02:06:46 marka Exp $ */ +/* $Id: socket.c,v 1.275.10.4 2008/03/27 21:10:24 jinmei Exp $ */ /*! \file */ @@ -65,12 +65,6 @@ #include "socket_p.h" #endif /* ISC_PLATFORM_USETHREADS */ -/* - * Support names for sockets. - */ -#define ISC_SOCKET_NAMES 1 - - #if defined(SO_BSDCOMPAT) && defined(__linux__) #include <sys/utsname.h> #endif @@ -166,11 +160,8 @@ struct isc_socket { unsigned int references; int fd; int pf; - -#ifdef ISC_SOCKET_NAMES char name[16]; void * tag; -#endif ISC_LIST(isc_socketevent_t) send_list; ISC_LIST(isc_socketevent_t) recv_list; @@ -1696,10 +1687,8 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type, } #endif /* defined(USE_CMSG) || defined(SO_RCVBUF) */ -#ifdef ISC_SOCKET_NAMES memset(sock->name, 0, sizeof(sock->name)); sock->tag = NULL; -#endif sock->references = 1; *socketp = sock; @@ -4048,17 +4037,11 @@ isc_socket_setname(isc_socket_t *socket, const char *name, void *tag) { REQUIRE(VALID_SOCKET(socket)); -#ifdef ISC_SOCKET_NAMES LOCK(&socket->lock); memset(socket->name, 0, sizeof(socket->name)); strncpy(socket->name, name, sizeof(socket->name) - 1); socket->tag = tag; UNLOCK(&socket->lock); -#else - UNUSED(name); - UNUSED(tag); -#endif - } const char * diff --git a/lib/isc/unix/time.c b/lib/isc/unix/time.c index 70fd2e18..2697d836 100644 --- a/lib/isc/unix/time.c +++ b/lib/isc/unix/time.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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: time.c,v 1.54 2007/06/18 23:47:48 tbox Exp $ */ +/* $Id: time.c,v 1.54.128.2 2008/02/18 23:46:30 tbox Exp $ */ /*! \file */ @@ -227,7 +227,7 @@ isc_time_nowplusinterval(isc_time_t *t, const isc_interval_t *i) { t->seconds = tv.tv_sec + i->seconds; t->nanoseconds = tv.tv_usec * NS_PER_US + i->nanoseconds; - if (t->nanoseconds > NS_PER_S) { + if (t->nanoseconds >= NS_PER_S) { t->seconds++; t->nanoseconds -= NS_PER_S; } @@ -410,7 +410,7 @@ isc_time_formattimestamp(const isc_time_t *t, char *buf, unsigned int len) { snprintf(buf + flen, len - flen, ".%03u", t->nanoseconds / 1000000); else - snprintf(buf, len, "99-Bad-9999 99:99:99.999"); + snprintf(buf, len, "99-Bad-9999 99:99:99.999"); } void diff --git a/lib/isc/win32/include/isc/platform.h b/lib/isc/win32/include/isc/platform.h index cababbf6..2354306c 100644 --- a/lib/isc/win32/include/isc/platform.h +++ b/lib/isc/win32/include/isc/platform.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 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: platform.h,v 1.14 2007/06/19 23:47:20 tbox Exp $ */ +/* $Id: platform.h,v 1.14.128.2 2008/04/02 23:46:28 tbox Exp $ */ #ifndef ISC_PLATFORM_H #define ISC_PLATFORM_H 1 @@ -34,6 +34,7 @@ #if _MSC_VER > 1200 #define ISC_PLATFORM_HAVEIN6PKTINFO #endif +#define ISC_PLATFORM_HAVESCOPEID #define ISC_PLATFORM_NEEDPORTT #undef MSG_TRUNC #define ISC_PLATFORM_NEEDNTOP @@ -44,6 +45,8 @@ #define ISC_PLATFORM_NEEDSTRSEP #define ISC_PLATFORM_NEEDSTRLCPY +#define ISC_PLATFORM_NEEDSTRLCAT +#define ISC_PLATFORM_NEEDSTRLCPY /* * Used to control how extern data is linked; needed for Win32 platforms. @@ -68,19 +71,19 @@ #ifdef LIBISC_EXPORTS #define LIBISC_EXTERNAL_DATA __declspec(dllexport) #else -#define LIBISC_EXTERNAL_DATA __declspec(dllimport) +#define LIBISC_EXTERNAL_DATA __declspec(dllimport) #endif #ifdef LIBISCCFG_EXPORTS #define LIBISCCFG_EXTERNAL_DATA __declspec(dllexport) #else -#define LIBISCCFG_EXTERNAL_DATA __declspec(dllimport) +#define LIBISCCFG_EXTERNAL_DATA __declspec(dllimport) #endif #ifdef LIBISCCC_EXPORTS #define LIBISCCC_EXTERNAL_DATA __declspec(dllexport) #else -#define LIBISCCC_EXTERNAL_DATA __declspec(dllimport) +#define LIBISCCC_EXTERNAL_DATA __declspec(dllimport) #endif #ifdef LIBDNS_EXPORTS diff --git a/lib/isc/win32/interfaceiter.c b/lib/isc/win32/interfaceiter.c index d2505beb..ed74f6c9 100644 --- a/lib/isc/win32/interfaceiter.c +++ b/lib/isc/win32/interfaceiter.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-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: interfaceiter.c,v 1.10 2007/06/18 23:47:49 tbox Exp $ */ +/* $Id: interfaceiter.c,v 1.10.128.3 2008/04/18 19:47:26 each Exp $ */ /* * Note that this code will need to be revisited to support IPv6 Interfaces. @@ -62,11 +62,13 @@ struct isc_interfaceiter { int socket; INTERFACE_INFO IFData; /* Current Interface Info */ int numIF; /* Current Interface count */ - int totalIF; /* Total Number - of Interfaces */ - INTERFACE_INFO *buf; /* Buffer for WSAIoctl data. */ - unsigned int bufsize; /* Bytes allocated. */ - INTERFACE_INFO *pos; /* Current offset in IF List */ + int v4IF; /* Number of IPv4 Interfaces */ + INTERFACE_INFO *buf4; /* Buffer for WSAIoctl data. */ + unsigned int buf4size; /* Bytes allocated. */ + INTERFACE_INFO *pos4; /* Current offset in IF List */ + SOCKET_ADDRESS_LIST *buf6; + unsigned int buf6size; /* Bytes allocated. */ + unsigned int pos6; isc_interface_t current; /* Current interface data. */ isc_result_t result; /* Last result code. */ }; @@ -94,6 +96,7 @@ get_addr(unsigned int family, isc_netaddr_t *dst, struct sockaddr *src) { memcpy(&dst->type.in6, &((struct sockaddr_in6 *) src)->sin6_addr, sizeof(struct in6_addr)); + dst->zone = ((struct sockaddr_in6 *) src)->sin6_scope_id; break; default: INSIST(0); @@ -103,7 +106,7 @@ get_addr(unsigned int family, isc_netaddr_t *dst, struct sockaddr *src) { isc_result_t isc_interfaceiter_create(isc_mem_t *mctx, isc_interfaceiter_t **iterp) { - char strbuf[ISC_STRERRORSIZE]; + char strbuf[ISC_STRERRORSIZE]; isc_interfaceiter_t *iter; isc_result_t result; int error; @@ -120,7 +123,15 @@ isc_interfaceiter_create(isc_mem_t *mctx, isc_interfaceiter_t **iterp) { InitSockets(); iter->mctx = mctx; - iter->buf = NULL; + iter->buf4 = NULL; + iter->buf6 = NULL; + iter->pos4 = NULL; + iter->pos6 = 0; + iter->buf6size = 0; + iter->buf4size = 0; + iter->result = ISC_R_FAILURE; + iter->numIF = 0; + iter->v4IF = 0; /* * Create an unbound datagram socket to do the @@ -128,6 +139,8 @@ isc_interfaceiter_create(isc_mem_t *mctx, isc_interfaceiter_t **iterp) { */ if ((iter->socket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { error = WSAGetLastError(); + if (error == WSAEAFNOSUPPORT) + goto inet6_only; isc__strerror(error, strbuf, sizeof(strbuf)); UNEXPECTED_ERROR(__FILE__, __LINE__, "making interface scan socket: %s", @@ -140,17 +153,17 @@ isc_interfaceiter_create(isc_mem_t *mctx, isc_interfaceiter_t **iterp) { * Get the interface configuration, allocating more memory if * necessary. */ - iter->bufsize = IFCONF_SIZE_INITIAL*sizeof(INTERFACE_INFO); + iter->buf4size = IFCONF_SIZE_INITIAL*sizeof(INTERFACE_INFO); for (;;) { - iter->buf = isc_mem_get(mctx, iter->bufsize); - if (iter->buf == NULL) { + iter->buf4 = isc_mem_get(mctx, iter->buf4size); + if (iter->buf4 == NULL) { result = ISC_R_NOMEMORY; goto alloc_failure; } if (WSAIoctl(iter->socket, SIO_GET_INTERFACE_LIST, - 0, 0, iter->buf, iter->bufsize, + 0, 0, iter->buf4, iter->buf4size, &bytesReturned, 0, 0) == SOCKET_ERROR) { error = WSAGetLastError(); @@ -174,19 +187,19 @@ isc_interfaceiter_create(isc_mem_t *mctx, isc_interfaceiter_t **iterp) { * case and retry. */ if (bytesReturned > 0 && - (bytesReturned < iter->bufsize)) + (bytesReturned < iter->buf4size)) break; } - if (iter->bufsize >= IFCONF_SIZE_MAX*sizeof(INTERFACE_INFO)) { + if (iter->buf4size >= IFCONF_SIZE_MAX*sizeof(INTERFACE_INFO)) { UNEXPECTED_ERROR(__FILE__, __LINE__, "get interface configuration: " "maximum buffer size exceeded"); result = ISC_R_UNEXPECTED; goto ioctl_failure; } - isc_mem_put(mctx, iter->buf, iter->bufsize); + isc_mem_put(mctx, iter->buf4, iter->buf4size); - iter->bufsize += IFCONF_SIZE_INCREMENT * + iter->buf4size += IFCONF_SIZE_INCREMENT * sizeof(INTERFACE_INFO); } @@ -194,23 +207,92 @@ isc_interfaceiter_create(isc_mem_t *mctx, isc_interfaceiter_t **iterp) { * A newly created iterator has an undefined position * until isc_interfaceiter_first() is called. */ - iter->pos = NULL; - iter->result = ISC_R_FAILURE; - iter->numIF = 0; - iter->totalIF = bytesReturned/sizeof(INTERFACE_INFO); + iter->v4IF = bytesReturned/sizeof(INTERFACE_INFO); + + /* We don't need the socket any more, so close it */ + closesocket(iter->socket); + inet6_only: + /* + * Create an unbound datagram socket to do the + * SIO_ADDRESS_LIST_QUERY WSAIoctl on. + */ + if ((iter->socket = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { + error = WSAGetLastError(); + if (error == WSAEAFNOSUPPORT) + goto inet_only; + isc__strerror(error, strbuf, sizeof(strbuf)); + UNEXPECTED_ERROR(__FILE__, __LINE__, + "making interface scan socket: %s", + strbuf); + result = ISC_R_UNEXPECTED; + goto ioctl_failure; + } + + /* + * Get the interface configuration, allocating more memory if + * necessary. + */ + iter->buf6size = sizeof(SOCKET_ADDRESS_LIST) + + IFCONF_SIZE_INITIAL*sizeof(SOCKET_ADDRESS); + + for (;;) { + iter->buf6 = isc_mem_get(mctx, iter->buf6size); + if (iter->buf6 == NULL) { + result = ISC_R_NOMEMORY; + goto ioctl_failure; + } + + if (WSAIoctl(iter->socket, SIO_ADDRESS_LIST_QUERY, + 0, 0, iter->buf6, iter->buf6size, + &bytesReturned, 0, 0) == SOCKET_ERROR) + { + error = WSAGetLastError(); + if (error != WSAEFAULT && error != WSAENOBUFS) { + errno = error; + isc__strerror(error, strbuf, sizeof(strbuf)); + UNEXPECTED_ERROR(__FILE__, __LINE__, + "sio address list query: %s", + strbuf); + result = ISC_R_UNEXPECTED; + goto ioctl6_failure; + } + /* + * EINVAL. Retry with a bigger buffer. + */ + } else + break; + + if (iter->buf6size >= IFCONF_SIZE_MAX*sizeof(SOCKET_ADDRESS)) { + UNEXPECTED_ERROR(__FILE__, __LINE__, + "get interface configuration: " + "maximum buffer size exceeded"); + result = ISC_R_UNEXPECTED; + goto ioctl6_failure; + } + isc_mem_put(mctx, iter->buf6, iter->buf6size); + + iter->buf6size += IFCONF_SIZE_INCREMENT * + sizeof(SOCKET_ADDRESS); + } + closesocket(iter->socket); + + inet_only: iter->magic = IFITER_MAGIC; *iterp = iter; - /* We don't need the socket any more, so close it */ - closesocket(iter->socket); return (ISC_R_SUCCESS); + ioctl6_failure: + isc_mem_put(mctx, iter->buf6, iter->buf6size); + ioctl_failure: - isc_mem_put(mctx, iter->buf, iter->bufsize); + if (iter->buf4 != NULL) + isc_mem_put(mctx, iter->buf4, iter->buf4size); alloc_failure: - (void) closesocket(iter->socket); + if (iter->socket >= 0) + (void) closesocket(iter->socket); socket_failure: isc_mem_put(mctx, iter, sizeof(*iter)); @@ -226,7 +308,7 @@ isc_interfaceiter_create(isc_mem_t *mctx, isc_interfaceiter_t **iterp) { */ static isc_result_t -internal_current(isc_interfaceiter_t *iter, int family) { +internal_current(isc_interfaceiter_t *iter) { BOOL ifNamed = FALSE; unsigned long flags; @@ -234,9 +316,9 @@ internal_current(isc_interfaceiter_t *iter, int family) { REQUIRE(iter->numIF >= 0); memset(&iter->current, 0, sizeof(iter->current)); - iter->current.af = family; + iter->current.af = AF_INET; - get_addr(family, &iter->current.address, + get_addr(AF_INET, &iter->current.address, (struct sockaddr *)&(iter->IFData.iiAddress)); /* @@ -266,7 +348,7 @@ internal_current(isc_interfaceiter_t *iter, int family) { * If the interface is point-to-point, get the destination address. */ if ((iter->current.flags & INTERFACE_F_POINTTOPOINT) != 0) { - get_addr(family, &iter->current.dstaddress, + get_addr(AF_INET, &iter->current.dstaddress, (struct sockaddr *)&(iter->IFData.iiBroadcastAddress)); } @@ -277,15 +359,40 @@ internal_current(isc_interfaceiter_t *iter, int family) { /* * Get the network mask. */ - switch (family) { - case AF_INET: - get_addr(family, &iter->current.netmask, - (struct sockaddr *)&(iter->IFData.iiNetmask)); - break; - case AF_INET6: - break; - } + get_addr(AF_INET, &iter->current.netmask, + (struct sockaddr *)&(iter->IFData.iiNetmask)); + + return (ISC_R_SUCCESS); +} + +static isc_result_t +internal_current6(isc_interfaceiter_t *iter) { + BOOL ifNamed = FALSE; + int i; + + REQUIRE(VALID_IFITER(iter)); + REQUIRE(iter->pos6 >= 0); + REQUIRE(iter->buf6 != 0); + + memset(&iter->current, 0, sizeof(iter->current)); + iter->current.af = AF_INET6; + + get_addr(AF_INET6, &iter->current.address, + iter->buf6->Address[iter->pos6].lpSockaddr); + + /* + * Get interface flags. + */ + + iter->current.flags = INTERFACE_F_UP; + + if (ifNamed == FALSE) + sprintf(iter->current.name, + "TCP/IPv6 Interface %d", iter->pos6 + 1); + for (i = 0; i< 16; i++) + iter->current.netmask.type.in6.s6_addr[i] = 0xff; + iter->current.netmask.family = AF_INET6; return (ISC_R_SUCCESS); } @@ -298,7 +405,7 @@ internal_current(isc_interfaceiter_t *iter, int family) { */ static isc_result_t internal_next(isc_interfaceiter_t *iter) { - if (iter->numIF >= iter->totalIF) + if (iter->numIF >= iter->v4IF) return (ISC_R_NOMORE); /* @@ -307,21 +414,29 @@ internal_next(isc_interfaceiter_t *iter) { * Microsoft's implementation is peculiar for returning * the list in reverse order */ - + if (iter->numIF == 0) - iter->pos = (INTERFACE_INFO *)(iter->buf + (iter->totalIF)); + iter->pos4 = (INTERFACE_INFO *)(iter->buf4 + (iter->v4IF)); - iter->pos--; - if (&(iter->pos) < &(iter->buf)) + iter->pos4--; + if (&(iter->pos4) < &(iter->buf4)) return (ISC_R_NOMORE); memset(&(iter->IFData), 0, sizeof(INTERFACE_INFO)); - memcpy(&(iter->IFData), iter->pos, sizeof(INTERFACE_INFO)); + memcpy(&(iter->IFData), iter->pos4, sizeof(INTERFACE_INFO)); iter->numIF++; return (ISC_R_SUCCESS); } +static isc_result_t +internal_next6(isc_interfaceiter_t *iter) { + if (iter->pos6 == 0) + return (ISC_R_NOMORE); + iter->pos6--; + return (ISC_R_SUCCESS); +} + isc_result_t isc_interfaceiter_current(isc_interfaceiter_t *iter, isc_interface_t *ifdata) { @@ -332,21 +447,13 @@ isc_interfaceiter_current(isc_interfaceiter_t *iter, isc_result_t isc_interfaceiter_first(isc_interfaceiter_t *iter) { - isc_result_t result; REQUIRE(VALID_IFITER(iter)); - iter->numIF = 0; - for (;;) { - result = internal_next(iter); - if (result != ISC_R_SUCCESS) - break; - result = internal_current(iter, AF_INET); - if (result != ISC_R_IGNORE) - break; - } - iter->result = result; - return (result); + if (iter->buf6 != NULL) + iter->pos6 = iter->buf6->iAddressCount; + iter->result = ISC_R_SUCCESS; + return (isc_interfaceiter_next(iter)); } isc_result_t @@ -358,9 +465,16 @@ isc_interfaceiter_next(isc_interfaceiter_t *iter) { for (;;) { result = internal_next(iter); - if (result != ISC_R_SUCCESS) + if (result == ISC_R_NOMORE) { + result = internal_next6(iter); + if (result != ISC_R_SUCCESS) + break; + result = internal_current6(iter); + if (result != ISC_R_IGNORE) + break; + } else if (result != ISC_R_SUCCESS) break; - result = internal_current(iter,AF_INET); + result = internal_current(iter); if (result != ISC_R_IGNORE) break; } @@ -375,10 +489,12 @@ isc_interfaceiter_destroy(isc_interfaceiter_t **iterp) { iter = *iterp; REQUIRE(VALID_IFITER(iter)); - isc_mem_put(iter->mctx, iter->buf, iter->bufsize); + if (iter->buf4 != NULL) + isc_mem_put(iter->mctx, iter->buf4, iter->buf4size); + if (iter->buf6 != NULL) + isc_mem_put(iter->mctx, iter->buf6, iter->buf6size); iter->magic = 0; isc_mem_put(iter->mctx, iter, sizeof(*iter)); *iterp = NULL; } - diff --git a/lib/isc/win32/libisc.def b/lib/isc/win32/libisc.def index 22822051..dda07ebf 100644 --- a/lib/isc/win32/libisc.def +++ b/lib/isc/win32/libisc.def @@ -247,13 +247,17 @@ isc_mem_createx isc_mem_createx2 isc_mem_destroy isc_mem_detach +isc_mem_getname isc_mem_getquota +isc_mem_gettag isc_mem_inuse isc_mem_ondestroy isc_mem_setdestroycheck +isc_mem_setname isc_mem_setquota isc_mem_setwater isc_mem_stats +isc_mem_waterack isc_mempool_associatelock isc_mempool_create isc_mempool_destroy diff --git a/lib/isc/win32/net.c b/lib/isc/win32/net.c index df561a07..37246882 100644 --- a/lib/isc/win32/net.c +++ b/lib/isc/win32/net.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2008 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: net.c,v 1.14 2007/06/18 23:47:49 tbox Exp $ */ +/* $Id: net.c,v 1.14.128.2 2008/04/02 23:46:28 tbox Exp $ */ #include <config.h> @@ -51,7 +51,7 @@ try_proto(int domain) { char strbuf[ISC_STRERRORSIZE]; int errval; - s = socket(domain, SOCK_STREAM, 0); + s = socket(domain, SOCK_STREAM, IPPROTO_TCP); if (s == INVALID_SOCKET) { errval = WSAGetLastError(); switch (errval) { @@ -72,53 +72,9 @@ try_proto(int domain) { } } -#ifdef ISC_PLATFORM_HAVEIPV6 -#ifdef WANT_IPV6 -#ifdef ISC_PLATFORM_HAVEIN6PKTINFO - if (domain == PF_INET6) { - struct sockaddr_in6 sin6; - unsigned int len; - - /* - * Check to see if IPv6 is broken, as is common on Linux. - */ - len = sizeof(sin6); - if (getsockname(s, (struct sockaddr *)&sin6, (void *)&len) < 0) - { - isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL, - ISC_LOGMODULE_SOCKET, ISC_LOG_ERROR, - "retrieving the address of an IPv6 " - "socket from the kernel failed."); - isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL, - ISC_LOGMODULE_SOCKET, ISC_LOG_ERROR, - "IPv6 support is disabled."); - result = ISC_R_NOTFOUND; - } else { - if (len == sizeof(struct sockaddr_in6)) - result = ISC_R_SUCCESS; - else { - isc_log_write(isc_lctx, - ISC_LOGCATEGORY_GENERAL, - ISC_LOGMODULE_SOCKET, - ISC_LOG_ERROR, - "IPv6 structures in kernel and " - "user space do not match."); - isc_log_write(isc_lctx, - ISC_LOGCATEGORY_GENERAL, - ISC_LOGMODULE_SOCKET, - ISC_LOG_ERROR, - "IPv6 support is disabled."); - result = ISC_R_NOTFOUND; - } - } - } -#endif -#endif -#endif - closesocket(s); - return (result); + return (ISC_R_SUCCESS); } static void @@ -198,7 +154,7 @@ try_ipv6only(void) { goto close; } - close(s); + closesocket(s); /* check for UDP sockets */ s = socket(PF_INET6, SOCK_DGRAM, 0); @@ -221,12 +177,10 @@ try_ipv6only(void) { goto close; } - close(s); - ipv6only_result = ISC_R_SUCCESS; close: - close(s); + closeocket(s); return; #endif /* IPV6_V6ONLY */ } @@ -252,7 +206,7 @@ try_ipv6pktinfo(void) { /* we only use this for UDP sockets */ s = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP); - if (s == -1) { + if (s == INVALID_SOCKET) { isc__strerror(errno, strbuf, sizeof(strbuf)); UNEXPECTED_ERROR(__FILE__, __LINE__, "socket() %s: %s", @@ -276,11 +230,10 @@ try_ipv6pktinfo(void) { goto close; } - close(s); ipv6pktinfo_result = ISC_R_SUCCESS; close: - close(s); + closesocket(s); return; } diff --git a/lib/isc/win32/socket.c b/lib/isc/win32/socket.c index 5a4d6743..d80d593d 100644 --- a/lib/isc/win32/socket.c +++ b/lib/isc/win32/socket.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008 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: socket.c,v 1.52 2007/08/28 00:39:15 marka Exp $ */ +/* $Id: socket.c,v 1.52.94.2 2008/03/27 23:46:28 tbox Exp $ */ /* This code has been rewritten to take advantage of Windows Sockets * I/O Completion Ports and Events. I/O Completion Ports is ONLY @@ -92,8 +92,6 @@ #include "errno2result.h" -#define ISC_SOCKET_NAMES 1 - /* * Define this macro to control the behavior of connection * resets on UDP sockets. See Microsoft KnowledgeBase Article Q263823 @@ -186,16 +184,16 @@ typedef isc_event_t intev_t; struct msghdr { - void *msg_name; /* optional address */ - u_int msg_namelen; /* size of address */ - WSABUF *msg_iov; /* scatter/gather array */ - u_int msg_iovlen; /* # elements in msg_iov */ - void *msg_control; /* ancillary data, see below */ - u_int msg_controllen; /* ancillary data buffer len */ - int msg_flags; /* flags on received message */ + void *msg_name; /* optional address */ + u_int msg_namelen; /* size of address */ + WSABUF *msg_iov; /* scatter/gather array */ + u_int msg_iovlen; /* # elements in msg_iov */ + void *msg_control; /* ancillary data, see below */ + u_int msg_controllen; /* ancillary data buffer len */ + int msg_flags; /* flags on received message */ int msg_totallen; /* total length of this message */ } msghdr; - + /*% * The size to raise the recieve buffer to. */ @@ -226,11 +224,8 @@ struct isc_socket { unsigned int references; SOCKET fd; int pf; - -#ifdef ISC_SOCKET_NAMES char name[16]; void * tag; -#endif ISC_LIST(isc_socketevent_t) send_list; ISC_LIST(isc_socketevent_t) recv_list; @@ -510,7 +505,7 @@ iocompletionport_init(isc_socketmgr_t *manager) { /* * Worker threads for servicing the I/O - */ + */ iocompletionport_createthreads(manager->maxIOCPThreads, manager); } @@ -665,7 +660,7 @@ socket_eventlist_add(event_change_t *evchange, sock_event_list *evlist, */ isc_boolean_t socket_eventlist_delete(event_change_t *evchange, sock_event_list *evlist, - isc_socketmgr_t *manager) + isc_socketmgr_t *manager) { int i; WSAEVENT hEvent; @@ -948,7 +943,7 @@ initialise(void) { void InitSockets(void) { RUNTIME_CHECK(isc_once_do(&initialise_once, - initialise) == ISC_R_SUCCESS); + initialise) == ISC_R_SUCCESS); if (!initialised) exit(1); } @@ -3865,17 +3860,11 @@ isc_socket_setname(isc_socket_t *socket, const char *name, void *tag) { REQUIRE(VALID_SOCKET(socket)); -#ifdef ISC_SOCKET_NAMES LOCK(&socket->lock); memset(socket->name, 0, sizeof(socket->name)); strncpy(socket->name, name, sizeof(socket->name) - 1); socket->tag = tag; UNLOCK(&socket->lock); -#else - UNUSED(name); - UNUSED(tag); -#endif - } const char * diff --git a/lib/isccfg/api b/lib/isccfg/api index e1227550..f57ff8a1 100644 --- a/lib/isccfg/api +++ b/lib/isccfg/api @@ -1,3 +1,3 @@ LIBINTERFACE = 40 -LIBREVISION = 1 +LIBREVISION = 2 LIBAGE = 0 diff --git a/lib/isccfg/namedconf.c b/lib/isccfg/namedconf.c index 4ecc6c81..16317f29 100644 --- a/lib/isccfg/namedconf.c +++ b/lib/isccfg/namedconf.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: namedconf.c,v 1.78.46.4 2008/01/22 00:31:00 jinmei Exp $ */ +/* $Id: namedconf.c,v 1.78.46.6 2008/04/03 02:12:22 marka Exp $ */ /*! \file */ @@ -733,67 +733,68 @@ static cfg_type_t cfg_type_lookaside = { static cfg_clausedef_t view_clauses[] = { + { "acache-cleaning-interval", &cfg_type_uint32, 0 }, + { "acache-enable", &cfg_type_boolean, 0 }, + { "additional-from-auth", &cfg_type_boolean, 0 }, + { "additional-from-cache", &cfg_type_boolean, 0 }, { "allow-query-cache", &cfg_type_bracketed_aml, 0 }, { "allow-query-cache-on", &cfg_type_bracketed_aml, 0 }, { "allow-recursion", &cfg_type_bracketed_aml, 0 }, { "allow-recursion-on", &cfg_type_bracketed_aml, 0 }, { "allow-v6-synthesis", &cfg_type_bracketed_aml, CFG_CLAUSEFLAG_OBSOLETE }, - { "sortlist", &cfg_type_bracketed_aml, 0 }, - { "topology", &cfg_type_bracketed_aml, CFG_CLAUSEFLAG_NOTIMP }, { "auth-nxdomain", &cfg_type_boolean, CFG_CLAUSEFLAG_NEWDEFAULT }, - { "minimal-responses", &cfg_type_boolean, 0 }, - { "recursion", &cfg_type_boolean, 0 }, - { "rrset-order", &cfg_type_rrsetorder, 0 }, - { "provide-ixfr", &cfg_type_boolean, 0 }, - { "request-ixfr", &cfg_type_boolean, 0 }, - { "fetch-glue", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE }, - { "rfc2308-type1", &cfg_type_boolean, CFG_CLAUSEFLAG_NYI }, - { "additional-from-auth", &cfg_type_boolean, 0 }, - { "additional-from-cache", &cfg_type_boolean, 0 }, - /* - * Note that the query-source option syntax is different - * from the other -source options. - */ - { "query-source", &cfg_type_querysource4, 0 }, - { "query-source-v6", &cfg_type_querysource6, 0 }, - { "cleaning-interval", &cfg_type_uint32, 0 }, - { "min-roots", &cfg_type_uint32, CFG_CLAUSEFLAG_NOTIMP }, - { "lame-ttl", &cfg_type_uint32, 0 }, - { "max-ncache-ttl", &cfg_type_uint32, 0 }, - { "max-cache-ttl", &cfg_type_uint32, 0 }, - { "transfer-format", &cfg_type_transferformat, 0 }, - { "max-cache-size", &cfg_type_size, 0 }, - { "check-names", &cfg_type_checknames, CFG_CLAUSEFLAG_MULTI }, { "cache-file", &cfg_type_qstring, 0 }, - { "suppress-initial-notify", &cfg_type_boolean, CFG_CLAUSEFLAG_NYI }, - { "preferred-glue", &cfg_type_astring, 0 }, - { "dual-stack-servers", &cfg_type_nameportiplist, 0 }, - { "edns-udp-size", &cfg_type_uint32, 0 }, - { "max-udp-size", &cfg_type_uint32, 0 }, - { "root-delegation-only", &cfg_type_optional_exclude, 0 }, + { "check-names", &cfg_type_checknames, CFG_CLAUSEFLAG_MULTI }, + { "cleaning-interval", &cfg_type_uint32, 0 }, + { "clients-per-query", &cfg_type_uint32, 0 }, { "disable-algorithms", &cfg_type_disablealgorithm, CFG_CLAUSEFLAG_MULTI }, + { "disable-empty-zone", &cfg_type_astring, CFG_CLAUSEFLAG_MULTI }, + { "dnssec-accept-expired", &cfg_type_boolean, 0 }, { "dnssec-enable", &cfg_type_boolean, 0 }, - { "dnssec-validation", &cfg_type_boolean, 0 }, { "dnssec-lookaside", &cfg_type_lookaside, CFG_CLAUSEFLAG_MULTI }, { "dnssec-must-be-secure", &cfg_type_mustbesecure, - CFG_CLAUSEFLAG_MULTI }, - { "dnssec-accept-expired", &cfg_type_boolean, 0 }, + CFG_CLAUSEFLAG_MULTI }, + { "dnssec-validation", &cfg_type_boolean, 0 }, + { "dual-stack-servers", &cfg_type_nameportiplist, 0 }, + { "edns-udp-size", &cfg_type_uint32, 0 }, + { "empty-contact", &cfg_type_astring, 0 }, + { "empty-server", &cfg_type_astring, 0 }, + { "empty-zones-enable", &cfg_type_boolean, 0 }, + { "fetch-glue", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE }, { "ixfr-from-differences", &cfg_type_ixfrdifftype, 0 }, - { "acache-enable", &cfg_type_boolean, 0 }, - { "acache-cleaning-interval", &cfg_type_uint32, 0 }, + { "lame-ttl", &cfg_type_uint32, 0 }, { "max-acache-size", &cfg_type_sizenodefault, 0 }, - { "clients-per-query", &cfg_type_uint32, 0 }, + { "max-cache-size", &cfg_type_size, 0 }, + { "max-cache-ttl", &cfg_type_uint32, 0 }, { "max-clients-per-query", &cfg_type_uint32, 0 }, - { "empty-server", &cfg_type_astring, 0 }, - { "empty-contact", &cfg_type_astring, 0 }, - { "empty-zones-enable", &cfg_type_boolean, 0 }, - { "disable-empty-zone", &cfg_type_astring, CFG_CLAUSEFLAG_MULTI }, - { "zero-no-soa-ttl-cache", &cfg_type_boolean, 0 }, - { "use-queryport-pool", &cfg_type_boolean, 0 }, + { "max-ncache-ttl", &cfg_type_uint32, 0 }, + { "max-udp-size", &cfg_type_uint32, 0 }, + { "min-roots", &cfg_type_uint32, CFG_CLAUSEFLAG_NOTIMP }, + { "minimal-responses", &cfg_type_boolean, 0 }, + { "preferred-glue", &cfg_type_astring, 0 }, + { "provide-ixfr", &cfg_type_boolean, 0 }, + /* + * Note that the query-source option syntax is different + * from the other -source options. + */ + { "query-source", &cfg_type_querysource4, 0 }, + { "query-source-v6", &cfg_type_querysource6, 0 }, { "queryport-pool-ports", &cfg_type_uint32, 0 }, { "queryport-pool-updateinterval", &cfg_type_uint32, 0 }, + { "recursion", &cfg_type_boolean, 0 }, + { "request-ixfr", &cfg_type_boolean, 0 }, + { "request-nsid", &cfg_type_boolean, 0 }, + { "rfc2308-type1", &cfg_type_boolean, CFG_CLAUSEFLAG_NYI }, + { "root-delegation-only", &cfg_type_optional_exclude, 0 }, + { "rrset-order", &cfg_type_rrsetorder, 0 }, + { "sortlist", &cfg_type_bracketed_aml, 0 }, + { "suppress-initial-notify", &cfg_type_boolean, CFG_CLAUSEFLAG_NYI }, + { "topology", &cfg_type_bracketed_aml, CFG_CLAUSEFLAG_NOTIMP }, + { "transfer-format", &cfg_type_transferformat, 0 }, + { "use-queryport-pool", &cfg_type_boolean, 0 }, + { "zero-no-soa-ttl-cache", &cfg_type_boolean, 0 }, { NULL, NULL, 0 } }; @@ -1760,6 +1761,7 @@ static isc_result_t parse_logversions(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) { return (parse_enum_or_other(pctx, type, &cfg_type_uint32, ret)); } + static cfg_type_t cfg_type_logversions = { "logversions", parse_logversions, cfg_print_ustring, cfg_doc_terminal, &cfg_rep_string, logversions_enums @@ -1833,8 +1835,19 @@ print_logfile(cfg_printer_t *pctx, const cfg_obj_t *obj) { } } + +static void +doc_logfile(cfg_printer_t *pctx, const cfg_type_t *type) { + UNUSED(type); + cfg_print_cstr(pctx, "<quoted_string>"); + cfg_print_chars(pctx, " ", 1); + cfg_print_cstr(pctx, "[ versions ( \"unlimited\" | <integer> ) ]"); + cfg_print_chars(pctx, " ", 1); + cfg_print_cstr(pctx, "[ size <size> ]"); +} + static cfg_type_t cfg_type_logfile = { - "log_file", parse_logfile, print_logfile, cfg_doc_terminal, + "log_file", parse_logfile, print_logfile, doc_logfile, &cfg_rep_tuple, logfile_fields }; @@ -1865,8 +1878,8 @@ static cfg_type_t cfg_type_lwres_view = { }; static cfg_type_t cfg_type_lwres_searchlist = { - "lwres_searchlist", cfg_parse_bracketed_list, cfg_print_bracketed_list, cfg_doc_bracketed_list, - &cfg_rep_list, &cfg_type_astring }; + "lwres_searchlist", cfg_parse_bracketed_list, cfg_print_bracketed_list, + cfg_doc_bracketed_list, &cfg_rep_list, &cfg_type_astring }; static cfg_clausedef_t lwres_clauses[] = { @@ -1985,15 +1998,15 @@ doc_sockaddrnameport(cfg_printer_t *pctx, const cfg_type_t *type) { cfg_print_chars(pctx, "( ", 2); cfg_print_cstr(pctx, "<quoted_string>"); cfg_print_chars(pctx, " ", 1); - cfg_print_cstr(pctx, "[port <integer>]"); + cfg_print_cstr(pctx, "[ port <integer> ]"); cfg_print_chars(pctx, " | ", 3); cfg_print_cstr(pctx, "<ipv4_address>"); cfg_print_chars(pctx, " ", 1); - cfg_print_cstr(pctx, "[port <integer>]"); + cfg_print_cstr(pctx, "[ port <integer> ]"); cfg_print_chars(pctx, " | ", 3); cfg_print_cstr(pctx, "<ipv6_address>"); cfg_print_chars(pctx, " ", 1); - cfg_print_cstr(pctx, "[port <integer>]"); + cfg_print_cstr(pctx, "[ port <integer> ]"); cfg_print_chars(pctx, " )", 2); } @@ -2071,11 +2084,11 @@ doc_masterselement(cfg_printer_t *pctx, const cfg_type_t *type) { cfg_print_chars(pctx, " | ", 3); cfg_print_cstr(pctx, "<ipv4_address>"); cfg_print_chars(pctx, " ", 1); - cfg_print_cstr(pctx, "[port <integer>]"); + cfg_print_cstr(pctx, "[ port <integer> ]"); cfg_print_chars(pctx, " | ", 3); cfg_print_cstr(pctx, "<ipv6_address>"); cfg_print_chars(pctx, " ", 1); - cfg_print_cstr(pctx, "[port <integer>]"); + cfg_print_cstr(pctx, "[ port <integer> ]"); cfg_print_chars(pctx, " )", 2); } diff --git a/make/rules.in b/make/rules.in index 01f391af..6ffea9b3 100644 --- a/make/rules.in +++ b/make/rules.in @@ -1,4 +1,4 @@ -# Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 1998-2003 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: rules.in,v 1.62 2007/06/18 23:47:57 tbox Exp $ +# $Id: rules.in,v 1.62.128.2 2008/02/18 23:46:30 tbox Exp $ ### ### Common Makefile rules for BIND 9. @@ -104,7 +104,7 @@ STD_CWARNINGS = @STD_CWARNINGS@ BUILD_CC = @BUILD_CC@ BUILD_CFLAGS = @BUILD_CFLAGS@ BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ -BUILD_LDFAGS = @BUILD_LDFAGS@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ BUILD_LIBS = @BUILD_LIBS@ .SUFFIXES: @@ -1,4 +1,4 @@ -# $Id: version,v 1.39.18.1 2008/01/22 23:43:56 each Exp $ +# $Id: version,v 1.39.18.3 2008/05/06 01:47:41 each Exp $ # # This file must follow /bin/sh rules. It is imported directly via # configure. @@ -6,5 +6,5 @@ MAJORVER=9 MINORVER=5 PATCHVER=0 -RELEASETYPE=b -RELEASEVER=2 +RELEASETYPE=rc +RELEASEVER=1 |