diff --git a/Makefile.in b/Makefile.in index 718f47f5c..ef18d120a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -130,7 +130,7 @@ util/fptr_wlist.c util/locks.c util/log.c util/mini_event.c util/module.c \ util/netevent.c util/net_help.c util/random.c util/rbtree.c util/regional.c \ util/rtt.c util/siphash.c util/edns.c util/storage/dnstree.c util/storage/lookup3.c \ util/storage/lruhash.c util/storage/slabhash.c util/tcp_conn_limit.c \ -util/timehist.c util/tube.c \ +util/timehist.c util/tube.c util/proxy_protocol.c \ util/ub_event.c util/ub_event_pluggable.c util/winsock_event.c \ validator/autotrust.c validator/val_anchor.c validator/validator.c \ validator/val_kcache.c validator/val_kentry.c validator/val_neg.c \ @@ -148,7 +148,7 @@ outbound_list.lo alloc.lo config_file.lo configlexer.lo configparser.lo \ fptr_wlist.lo siphash.lo edns.lo locks.lo log.lo mini_event.lo module.lo net_help.lo \ random.lo rbtree.lo regional.lo rtt.lo dnstree.lo lookup3.lo lruhash.lo \ slabhash.lo tcp_conn_limit.lo timehist.lo tube.lo winsock_event.lo \ -autotrust.lo val_anchor.lo rpz.lo \ +autotrust.lo val_anchor.lo rpz.lo proxy_protocol.lo \ validator.lo val_kcache.lo val_kentry.lo val_neg.lo val_nsec3.lo val_nsec.lo \ val_secalgo.lo val_sigcrypt.lo val_utils.lo dns64.lo $(CACHEDB_OBJ) authzone.lo \ $(SUBNET_OBJ) $(PYTHONMOD_OBJ) $(CHECKLOCK_OBJ) $(DNSTAP_OBJ) $(DNSCRYPT_OBJ) \ @@ -985,6 +985,8 @@ netevent.lo netevent.o: $(srcdir)/util/netevent.c config.h $(srcdir)/util/neteve $(srcdir)/sldns/sbuffer.h $(srcdir)/util/config_file.h $(srcdir)/services/authzone.h $(srcdir)/daemon/stats.h \ $(srcdir)/util/timehist.h $(srcdir)/libunbound/unbound.h $(srcdir)/respip/respip.h $(srcdir)/sldns/str2wire.h \ $(srcdir)/dnstap/dnstap.h $(srcdir)/services/listen_dnsport.h +proxy_protocol.lo proxy_protocol.o: $(srcdir)/util/proxy_protocol.c config.h \ + $(srcdir)/util/proxy_protocol.h $(srcdir)/sldns/sbuffer.h net_help.lo net_help.o: $(srcdir)/util/net_help.c config.h $(srcdir)/util/net_help.h $(srcdir)/util/log.h \ $(srcdir)/util/data/dname.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/module.h \ $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h \ @@ -1514,7 +1516,7 @@ asynclook.lo asynclook.o: $(srcdir)/testcode/asynclook.c config.h $(srcdir)/libu $(srcdir)/services/modstack.h $(srcdir)/libunbound/unbound-event.h $(srcdir)/util/data/packed_rrset.h \ $(srcdir)/util/storage/lruhash.h $(srcdir)/sldns/rrdef.h streamtcp.lo streamtcp.o: $(srcdir)/testcode/streamtcp.c config.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \ - $(srcdir)/util/net_help.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/msgparse.h \ + $(srcdir)/util/net_help.h $(srcdir)/util/proxy_protocol.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/msgparse.h \ $(srcdir)/util/storage/lruhash.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/util/data/msgreply.h \ $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/dname.h $(srcdir)/sldns/sbuffer.h \ $(srcdir)/sldns/str2wire.h $(srcdir)/sldns/wire2str.h diff --git a/cachedb/cachedb.c b/cachedb/cachedb.c index b07743d85..6f987fc03 100644 --- a/cachedb/cachedb.c +++ b/cachedb/cachedb.c @@ -390,6 +390,15 @@ prep_data(struct module_qstate* qstate, struct sldns_buffer* buf) if(!qstate->return_msg || !qstate->return_msg->rep) return 0; + /* do not store failures like SERVFAIL in the cachedb, this avoids + * overwriting expired, valid, content with broken content. */ + if(FLAGS_GET_RCODE(qstate->return_msg->rep->flags) != + LDNS_RCODE_NOERROR && + FLAGS_GET_RCODE(qstate->return_msg->rep->flags) != + LDNS_RCODE_NXDOMAIN && + FLAGS_GET_RCODE(qstate->return_msg->rep->flags) != + LDNS_RCODE_YXDOMAIN) + return 0; /* We don't store the reply if its TTL is 0 unless serve-expired is * enabled. Such a reply won't be reusable and simply be a waste for * the backend. It's also compatible with the default behavior of diff --git a/configure b/configure index a2837d185..5823e49f2 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for unbound 1.17.0. +# Generated by GNU Autoconf 2.69 for unbound 1.17.1. # # Report bugs to . # @@ -591,8 +591,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='unbound' PACKAGE_TARNAME='unbound' -PACKAGE_VERSION='1.17.0' -PACKAGE_STRING='unbound 1.17.0' +PACKAGE_VERSION='1.17.1' +PACKAGE_STRING='unbound 1.17.1' PACKAGE_BUGREPORT='unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues' PACKAGE_URL='' @@ -1477,7 +1477,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures unbound 1.17.0 to adapt to many kinds of systems. +\`configure' configures unbound 1.17.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1543,7 +1543,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of unbound 1.17.0:";; + short | recursive ) echo "Configuration of unbound 1.17.1:";; esac cat <<\_ACEOF @@ -1785,7 +1785,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -unbound configure 1.17.0 +unbound configure 1.17.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2494,7 +2494,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by unbound $as_me 1.17.0, which was +It was created by unbound $as_me 1.17.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2846,11 +2846,11 @@ UNBOUND_VERSION_MAJOR=1 UNBOUND_VERSION_MINOR=17 -UNBOUND_VERSION_MICRO=0 +UNBOUND_VERSION_MICRO=1 LIBUNBOUND_CURRENT=9 -LIBUNBOUND_REVISION=20 +LIBUNBOUND_REVISION=21 LIBUNBOUND_AGE=1 # 1.0.0 had 0:12:0 # 1.0.1 had 0:13:0 @@ -2938,6 +2938,7 @@ LIBUNBOUND_AGE=1 # 1.16.2 had 9:18:1 # 1.16.3 had 9:19:1 # 1.17.0 had 9:20:1 +# 1.17.1 had 9:21:1 # Current -- the number of the binary API that we're implementing # Revision -- which iteration of the implementation of the binary @@ -22085,7 +22086,7 @@ _ACEOF -version=1.17.0 +version=1.17.1 date=`date +'%b %e, %Y'` @@ -22604,7 +22605,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by unbound $as_me 1.17.0, which was +This file was extended by unbound $as_me 1.17.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -22670,7 +22671,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -unbound config.status 1.17.0 +unbound config.status 1.17.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index 57cc7e604..2c7583310 100644 --- a/configure.ac +++ b/configure.ac @@ -11,14 +11,14 @@ sinclude(dnscrypt/dnscrypt.m4) # must be numbers. ac_defun because of later processing m4_define([VERSION_MAJOR],[1]) m4_define([VERSION_MINOR],[17]) -m4_define([VERSION_MICRO],[0]) +m4_define([VERSION_MICRO],[1]) AC_INIT([unbound],m4_defn([VERSION_MAJOR]).m4_defn([VERSION_MINOR]).m4_defn([VERSION_MICRO]),[unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues],[unbound]) AC_SUBST(UNBOUND_VERSION_MAJOR, [VERSION_MAJOR]) AC_SUBST(UNBOUND_VERSION_MINOR, [VERSION_MINOR]) AC_SUBST(UNBOUND_VERSION_MICRO, [VERSION_MICRO]) LIBUNBOUND_CURRENT=9 -LIBUNBOUND_REVISION=20 +LIBUNBOUND_REVISION=21 LIBUNBOUND_AGE=1 # 1.0.0 had 0:12:0 # 1.0.1 had 0:13:0 @@ -106,6 +106,7 @@ LIBUNBOUND_AGE=1 # 1.16.2 had 9:18:1 # 1.16.3 had 9:19:1 # 1.17.0 had 9:20:1 +# 1.17.1 had 9:21:1 # Current -- the number of the binary API that we're implementing # Revision -- which iteration of the implementation of the binary diff --git a/daemon/acl_list.c b/daemon/acl_list.c index e6d0470a1..83cfd7ddf 100644 --- a/daemon/acl_list.c +++ b/daemon/acl_list.c @@ -199,7 +199,7 @@ acl_find_or_create(struct acl_list* acl, struct sockaddr_storage* addr, /** apply acl_interface string */ static int -acl_interface_str_cfg(struct acl_list* acl_interface, const char* interface, +acl_interface_str_cfg(struct acl_list* acl_interface, const char* iface, const char* s2, int port) { struct acl_addr* node; @@ -207,9 +207,9 @@ acl_interface_str_cfg(struct acl_list* acl_interface, const char* interface, if(!parse_acl_access(s2, &control)) { return 0; } - if(!(node=acl_find_or_create_str2addr(acl_interface, interface, 1, port))) { + if(!(node=acl_find_or_create_str2addr(acl_interface, iface, 1, port))) { log_err("cannot update ACL on non-configured interface: %s %d", - interface, port); + iface, port); return 0; } node->control = control; diff --git a/daemon/remote.c b/daemon/remote.c index ec7a4d5d9..7d4a41400 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -494,8 +494,8 @@ int remote_accept_callback(struct comm_point* c, void* arg, int err, n->c->do_not_close = 0; comm_point_stop_listening(n->c); comm_point_start_listening(n->c, -1, REMOTE_CONTROL_TCP_TIMEOUT); - memcpy(&n->c->repinfo.addr, &addr, addrlen); - n->c->repinfo.addrlen = addrlen; + memcpy(&n->c->repinfo.remote_addr, &addr, addrlen); + n->c->repinfo.remote_addrlen = addrlen; if(rc->use_cert) { n->shake_state = rc_hs_read; n->ssl = SSL_new(rc->ctx); @@ -3304,7 +3304,7 @@ remote_handshake_later(struct daemon_remote* rc, struct rc_state* s, if(r == 0) log_err("remote control connection closed prematurely"); log_addr(VERB_OPS, "failed connection from", - &s->c->repinfo.addr, s->c->repinfo.addrlen); + &s->c->repinfo.remote_addr, s->c->repinfo.remote_addrlen); log_crypto_err("remote control failed ssl"); clean_point(rc, s); } diff --git a/daemon/stats.c b/daemon/stats.c index fde411a1e..6b3834977 100644 --- a/daemon/stats.c +++ b/daemon/stats.c @@ -521,7 +521,7 @@ void server_stats_insquery(struct ub_server_stats* stats, struct comm_point* c, stats->qhttps++; } } - if(repinfo && addr_is_ip6(&repinfo->addr, repinfo->addrlen)) + if(repinfo && addr_is_ip6(&repinfo->remote_addr, repinfo->remote_addrlen)) stats->qipv6++; if( (flags&BIT_QR) ) stats->qbit_QR++; diff --git a/daemon/worker.c b/daemon/worker.c index 1abf20a7b..47d29ce91 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -547,7 +547,8 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo, static int apply_respip_action(struct worker* worker, const struct query_info* qinfo, struct respip_client_info* cinfo, struct reply_info* rep, - struct comm_reply* repinfo, struct ub_packed_rrset_key** alias_rrset, + struct sockaddr_storage* addr, socklen_t addrlen, + struct ub_packed_rrset_key** alias_rrset, struct reply_info** encode_repp, struct auth_zones* az) { struct respip_action_info actinfo = {0, 0, 0, 0, NULL, 0, NULL}; @@ -574,7 +575,7 @@ apply_respip_action(struct worker* worker, const struct query_info* qinfo, if(actinfo.addrinfo) { respip_inform_print(&actinfo, qinfo->qname, qinfo->qtype, qinfo->qclass, qinfo->local_alias, - repinfo); + addr, addrlen); if(worker->stats.extended && actinfo.rpz_used) { if(actinfo.rpz_disabled) @@ -703,7 +704,7 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo, *alias_rrset = NULL; /* avoid confusion if caller set it to non-NULL */ if((worker->daemon->use_response_ip || worker->daemon->use_rpz) && !partial_rep && !apply_respip_action(worker, qinfo, cinfo, rep, - repinfo, alias_rrset, + &repinfo->client_addr, repinfo->client_addrlen, alias_rrset, &encode_rep, worker->env.auth_zones)) { goto bail_out; } else if(partial_rep && @@ -991,12 +992,14 @@ answer_chaos(struct worker* w, struct query_info* qinfo, * @param w: worker * @param qinfo: query info. Pointer into packet buffer. * @param edns: edns info from query. - * @param repinfo: reply info with source address. + * @param addr: client address. + * @param addrlen: client address length. * @param pkt: packet buffer. */ static void -answer_notify(struct worker* w, struct query_info* qinfo, - struct edns_data* edns, sldns_buffer* pkt, struct comm_reply* repinfo) +answer_notify(struct worker* w, struct query_info* qinfo, + struct edns_data* edns, sldns_buffer* pkt, + struct sockaddr_storage* addr, socklen_t addrlen) { int refused = 0; int rcode = LDNS_RCODE_NOERROR; @@ -1005,8 +1008,8 @@ answer_notify(struct worker* w, struct query_info* qinfo, if(!w->env.auth_zones) return; has_serial = auth_zone_parse_notify_serial(pkt, &serial); if(auth_zones_notify(w->env.auth_zones, &w->env, qinfo->qname, - qinfo->qname_len, qinfo->qclass, &repinfo->addr, - repinfo->addrlen, has_serial, serial, &refused)) { + qinfo->qname_len, qinfo->qclass, addr, + addrlen, has_serial, serial, &refused)) { rcode = LDNS_RCODE_NOERROR; } else { if(refused) @@ -1031,7 +1034,7 @@ answer_notify(struct worker* w, struct query_info* qinfo, "servfail for NOTIFY %sfor %s from", sr, zname); else snprintf(buf, sizeof(buf), "received NOTIFY %sfor %s from", sr, zname); - log_addr(VERB_DETAIL, buf, &repinfo->addr, repinfo->addrlen); + log_addr(VERB_DETAIL, buf, addr, addrlen); } edns->edns_version = EDNS_ADVERTISED_VERSION; edns->udp_size = EDNS_ADVERTISED_SIZE; @@ -1051,8 +1054,8 @@ deny_refuse(struct comm_point* c, enum acl_access acl, { if(acl == deny) { if(verbosity >= VERB_ALGO) { - log_acl_action("dropped", &repinfo->addr, - repinfo->addrlen, acl, acladdr); + log_acl_action("dropped", &repinfo->client_addr, + repinfo->client_addrlen, acl, acladdr); log_buf(VERB_ALGO, "dropped", c->buffer); } comm_point_drop_reply(repinfo); @@ -1063,8 +1066,8 @@ deny_refuse(struct comm_point* c, enum acl_access acl, size_t opt_rr_mark; if(verbosity >= VERB_ALGO) { - log_acl_action("refused", &repinfo->addr, - repinfo->addrlen, acl, acladdr); + log_acl_action("refused", &repinfo->client_addr, + repinfo->client_addrlen, acl, acladdr); log_buf(VERB_ALGO, "refuse", c->buffer); } @@ -1224,12 +1227,24 @@ deny_refuse(struct comm_point* c, enum acl_access acl, } static int -deny_refuse_all(struct comm_point* c, enum acl_access acl, +deny_refuse_all(struct comm_point* c, enum acl_access* acl, struct worker* worker, struct comm_reply* repinfo, - struct acl_addr* acladdr, int ede) + struct acl_addr** acladdr, int ede, int check_proxy) { - return deny_refuse(c, acl, acl_deny, acl_refuse, worker, repinfo, - acladdr, ede); + if(check_proxy) { + *acladdr = acl_addr_lookup(worker->daemon->acl, + &repinfo->remote_addr, repinfo->remote_addrlen); + } else { + *acladdr = acl_addr_lookup(worker->daemon->acl, + &repinfo->client_addr, repinfo->client_addrlen); + } + /* If there is no ACL based on client IP use the interface ACL. */ + if(!(*acladdr) && c->socket) { + *acladdr = c->socket->acl; + } + *acl = acl_get_control(*acladdr); + return deny_refuse(c, *acl, acl_deny, acl_refuse, worker, repinfo, + *acladdr, ede); } static int @@ -1241,7 +1256,7 @@ deny_refuse_non_local(struct comm_point* c, enum acl_access acl, worker, repinfo, acladdr, ede); } -int +int worker_handle_request(struct comm_point* c, void* arg, int error, struct comm_reply* repinfo) { @@ -1286,16 +1301,16 @@ worker_handle_request(struct comm_point* c, void* arg, int error, if(worker_check_request(c->buffer, worker) != 0) { verbose(VERB_ALGO, "dnscrypt: worker check request: bad query."); - log_addr(VERB_CLIENT,"from",&repinfo->addr, - repinfo->addrlen); + log_addr(VERB_CLIENT,"from",&repinfo->client_addr, + repinfo->client_addrlen); comm_point_drop_reply(repinfo); return 0; } if(!query_info_parse(&qinfo, c->buffer)) { verbose(VERB_ALGO, "dnscrypt: worker parse request: formerror."); - log_addr(VERB_CLIENT, "from", &repinfo->addr, - repinfo->addrlen); + log_addr(VERB_CLIENT, "from", &repinfo->client_addr, + repinfo->client_addrlen); comm_point_drop_reply(repinfo); return 0; } @@ -1323,29 +1338,30 @@ worker_handle_request(struct comm_point* c, void* arg, int error, * sending src (client)/dst (local service) addresses over DNSTAP from incoming request handler */ if(worker->dtenv.log_client_query_messages) { - log_addr(VERB_ALGO, "request from client", &repinfo->addr, repinfo->addrlen); + log_addr(VERB_ALGO, "request from client", &repinfo->client_addr, repinfo->client_addrlen); log_addr(VERB_ALGO, "to local addr", (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->socket->addr->ai_addrlen); - dt_msg_send_client_query(&worker->dtenv, &repinfo->addr, (void*)repinfo->c->socket->addr->ai_addr, c->type, c->buffer); + dt_msg_send_client_query(&worker->dtenv, &repinfo->client_addr, (void*)repinfo->c->socket->addr->ai_addr, c->type, c->buffer); } #endif - acladdr = acl_addr_lookup(worker->daemon->acl, &repinfo->addr, - repinfo->addrlen); - /* If there is no ACL based on client IP use the interface ACL. */ - if(!acladdr && c->socket) { - acladdr = c->socket->acl; + /* Check deny/refuse ACLs */ + if(repinfo->is_proxied) { + if((ret=deny_refuse_all(c, &acl, worker, repinfo, &acladdr, + worker->env.cfg->ede, 1)) != -1) { + if(ret == 1) + goto send_reply; + return ret; + } } - acl = acl_get_control(acladdr); - - if((ret=deny_refuse_all(c, acl, worker, repinfo, acladdr, - worker->env.cfg->ede)) != -1) - { + if((ret=deny_refuse_all(c, &acl, worker, repinfo, &acladdr, + worker->env.cfg->ede, 0)) != -1) { if(ret == 1) goto send_reply; return ret; } + if((ret=worker_check_request(c->buffer, worker)) != 0) { verbose(VERB_ALGO, "worker check request: bad query."); - log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); + log_addr(VERB_CLIENT,"from",&repinfo->client_addr, repinfo->client_addrlen); if(ret != -1) { LDNS_QR_SET(sldns_buffer_begin(c->buffer)); LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), ret); @@ -1357,20 +1373,24 @@ worker_handle_request(struct comm_point* c, void* arg, int error, worker->stats.num_queries++; - /* check if this query should be dropped based on source ip rate limiting */ - if(!infra_ip_ratelimit_inc(worker->env.infra_cache, repinfo, + /* check if this query should be dropped based on source ip rate limiting + * NOTE: we always check the repinfo->client_address. IP ratelimiting is + * implicitly disabled for proxies. */ + if(!infra_ip_ratelimit_inc(worker->env.infra_cache, + &repinfo->client_addr, repinfo->client_addrlen, *worker->env.now, worker->env.cfg->ip_ratelimit_backoff, c->buffer)) { /* See if we are passed through with slip factor */ if(worker->env.cfg->ip_ratelimit_factor != 0 && ub_random_max(worker->env.rnd, - worker->env.cfg->ip_ratelimit_factor) == 0) { - + worker->env.cfg->ip_ratelimit_factor) == 0) { char addrbuf[128]; - addr_to_str(&repinfo->addr, repinfo->addrlen, - addrbuf, sizeof(addrbuf)); - verbose(VERB_QUERY, "ip_ratelimit allowed through for ip address %s because of slip in ip_ratelimit_factor", - addrbuf); + addr_to_str(&repinfo->client_addr, + repinfo->client_addrlen, addrbuf, + sizeof(addrbuf)); + verbose(VERB_QUERY, "ip_ratelimit allowed through for " + "ip address %s because of slip in " + "ip_ratelimit_factor", addrbuf); } else { worker->stats.num_queries_ip_ratelimited++; comm_point_drop_reply(repinfo); @@ -1381,7 +1401,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error, /* see if query is in the cache */ if(!query_info_parse(&qinfo, c->buffer)) { verbose(VERB_ALGO, "worker parse request: formerror."); - log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); + log_addr(VERB_CLIENT, "from", &repinfo->client_addr, + repinfo->client_addrlen); memset(&qinfo, 0, sizeof(qinfo)); /* zero qinfo.qname */ if(worker_err_ratelimit(worker, LDNS_RCODE_FORMERR) == -1) { comm_point_drop_reply(repinfo); @@ -1395,13 +1416,14 @@ worker_handle_request(struct comm_point* c, void* arg, int error, } if(worker->env.cfg->log_queries) { char ip[128]; - addr_to_str(&repinfo->addr, repinfo->addrlen, ip, sizeof(ip)); + addr_to_str(&repinfo->client_addr, repinfo->client_addrlen, ip, sizeof(ip)); log_query_in(ip, qinfo.qname, qinfo.qtype, qinfo.qclass); } if(qinfo.qtype == LDNS_RR_TYPE_AXFR || qinfo.qtype == LDNS_RR_TYPE_IXFR) { verbose(VERB_ALGO, "worker request: refused zone transfer."); - log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); + log_addr(VERB_CLIENT, "from", &repinfo->client_addr, + repinfo->client_addrlen); sldns_buffer_rewind(c->buffer); LDNS_QR_SET(sldns_buffer_begin(c->buffer)); LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), @@ -1418,7 +1440,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error, qinfo.qtype == LDNS_RR_TYPE_MAILB || (qinfo.qtype >= 128 && qinfo.qtype <= 248)) { verbose(VERB_ALGO, "worker request: formerror for meta-type."); - log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); + log_addr(VERB_CLIENT, "from", &repinfo->client_addr, + repinfo->client_addrlen); if(worker_err_ratelimit(worker, LDNS_RCODE_FORMERR) == -1) { comm_point_drop_reply(repinfo); return 0; @@ -1438,7 +1461,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error, worker->scratchpad)) != 0) { struct edns_data reply_edns; verbose(VERB_ALGO, "worker parse edns: formerror."); - log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); + log_addr(VERB_CLIENT, "from", &repinfo->client_addr, + repinfo->client_addrlen); memset(&reply_edns, 0, sizeof(reply_edns)); reply_edns.edns_present = 1; error_encode(c->buffer, ret, &qinfo, @@ -1453,7 +1477,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error, edns.opt_list_out = NULL; edns.opt_list_inplace_cb_out = NULL; verbose(VERB_ALGO, "query with bad edns version."); - log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); + log_addr( VERB_CLIENT, "from",&repinfo->remote_addr + , repinfo->remote_addrlen); extended_error_encode(c->buffer, EDNS_RCODE_BADVERS, &qinfo, *(uint16_t*)(void *)sldns_buffer_begin(c->buffer), sldns_buffer_read_u16_at(c->buffer, 2), 0, &edns); @@ -1464,7 +1489,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error, worker->daemon->cfg->harden_short_bufsize) { verbose(VERB_QUERY, "worker request: EDNS bufsize %d ignored", (int)edns.udp_size); - log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); + log_addr(VERB_CLIENT, "from", &repinfo->client_addr, + repinfo->client_addrlen); edns.udp_size = NORMAL_UDP_SIZE; } } @@ -1492,8 +1518,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error, /* Cookie requered, but no cookie present on UDP */ verbose(VERB_ALGO, "worker request: " "need cookie or stateful transport"); - log_addr(VERB_ALGO, "from", - &repinfo->addr, repinfo->addrlen); + log_addr(VERB_ALGO, "from",&repinfo->remote_addr + , repinfo->remote_addrlen); EDNS_OPT_LIST_APPEND_EDE(&edns.opt_list_out, worker->scratchpad, LDNS_EDE_OTHER, "DNS Cookie needed for UDP replies"); @@ -1511,12 +1537,14 @@ worker_handle_request(struct comm_point* c, void* arg, int error, verbose(VERB_QUERY, "worker request: max UDP reply size modified" " (%d to max-udp-size)", (int)edns.udp_size); - log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); + log_addr(VERB_CLIENT, "from", &repinfo->client_addr, + repinfo->client_addrlen); edns.udp_size = worker->daemon->cfg->max_udp_size; } if(edns.udp_size < LDNS_HEADER_SIZE) { verbose(VERB_ALGO, "worker request: edns is too small."); - log_addr(VERB_CLIENT, "from", &repinfo->addr, repinfo->addrlen); + log_addr(VERB_CLIENT, "from", &repinfo->client_addr, + repinfo->client_addrlen); LDNS_QR_SET(sldns_buffer_begin(c->buffer)); LDNS_TC_SET(sldns_buffer_begin(c->buffer)); LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), @@ -1540,7 +1568,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error, } if(LDNS_OPCODE_WIRE(sldns_buffer_begin(c->buffer)) == LDNS_PACKET_NOTIFY) { - answer_notify(worker, &qinfo, &edns, c->buffer, repinfo); + answer_notify(worker, &qinfo, &edns, c->buffer, + &repinfo->client_addr, repinfo->client_addrlen); regional_free_all(worker->scratchpad); goto send_reply; } @@ -1616,7 +1645,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error, sldns_buffer_read_u16_at(c->buffer, 2), &edns); regional_free_all(worker->scratchpad); log_addr(VERB_ALGO, "refused nonrec (cache snoop) query from", - &repinfo->addr, repinfo->addrlen); + &repinfo->client_addr, repinfo->client_addrlen); goto send_reply; } @@ -1756,9 +1785,9 @@ lookup_cache: if(verbosity >= VERB_CLIENT) { if(c->type == comm_udp) log_addr(VERB_CLIENT, "udp request from", - &repinfo->addr, repinfo->addrlen); + &repinfo->client_addr, repinfo->client_addrlen); else log_addr(VERB_CLIENT, "tcp request from", - &repinfo->addr, repinfo->addrlen); + &repinfo->client_addr, repinfo->client_addrlen); } /* grab a work request structure for this new request */ @@ -1790,8 +1819,8 @@ send_reply_rc: */ if(worker->dtenv.log_client_response_messages) { log_addr(VERB_ALGO, "from local addr", (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->socket->addr->ai_addrlen); - log_addr(VERB_ALGO, "response to client", &repinfo->addr, repinfo->addrlen); - dt_msg_send_client_response(&worker->dtenv, &repinfo->addr, (void*)repinfo->c->socket->addr->ai_addr, c->type, c->buffer); + log_addr(VERB_ALGO, "response to client", &repinfo->client_addr, repinfo->client_addrlen); + dt_msg_send_client_response(&worker->dtenv, &repinfo->client_addr, (void*)repinfo->c->socket->addr->ai_addr, c->type, c->buffer); } #endif if(worker->env.cfg->log_replies) @@ -1803,10 +1832,12 @@ send_reply_rc: /* log original qname, before the local alias was * used to resolve that CNAME to something else */ qinfo.qname = qinfo.local_alias->rrset->rk.dname; - log_reply_info(NO_VERBOSE, &qinfo, &repinfo->addr, repinfo->addrlen, + log_reply_info(NO_VERBOSE, &qinfo, + &repinfo->client_addr, repinfo->client_addrlen, tv, 1, c->buffer); } else { - log_reply_info(NO_VERBOSE, &qinfo, &repinfo->addr, repinfo->addrlen, + log_reply_info(NO_VERBOSE, &qinfo, + &repinfo->client_addr, repinfo->client_addrlen, tv, 1, c->buffer); } } diff --git a/doc/Changelog b/doc/Changelog index bbcef6f31..32e7ae8ae 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,72 @@ +21 October 2022: George + - Merge #767 from jonathangray: consistently use IPv4/IPv6 in + unbound.conf.5. + +21 October 2022: Wouter + - Fix that cachedb does not store failures in the external cache. + +18 October 2022: George + - Clarify the use of MAX_SENT_COUNT in the iterator code. + +17 October 2022: Wouter + - testcode/dohclient sets log identity to its name. + +14 October 2022: Wouter + - Merge #768 from fobser: Arithmetic on a pointer to void is a GNU + extension. + - In unit test, print python script name list correctly. + +13 October 2022: Wouter + - Tag for 1.17.0 release. The code repository continues with 1.17.1. + +11 October 2022: George + - Fix PROXYv2 header read for TCP connections when no proxied addresses + are provided. + +7 October 2022: Wouter + - Tag for 1.17.0rc1 release. + +7 October 2022: George + - Fix to stop possible loops in the tcp reuse code (write_wait list + and tcp_wait list). Based on analysis and patch from Prad Seniappan + and Karthik Umashankar. + - Fix unit test to properly test the reuse_write_wait_pop function. + +6 October 2022: Wouter + - Fix to stop responses with TC flag from resulting in partial + responses. It retries to fetch the data elsewhere, or fails the + query and in depth fix removes the TC flag from the cached item. + - Fix proxy length debug output printout typecasts. + +5 October 2022: Wouter + - Fix dnscrypt compile for proxy protocol code changes. + +5 October 2022: George + - Use DEBUG_TDIR from environment in mini_tdir.sh for debugging. + - Fix string comparison in mini_tdir.sh. + - Make ede.tdir test more predictable by using static data. + - Fix checkconf test for dnscrypt and proxy port. + +4 October 2022: George + - Merge #764: Leniency for target discovery when under load (for + NRDelegation changes). + +4 October 2022: Wouter + - Fix static analysis report to remove dead code from the + rpz_callback_from_iterator_module function. + - Fix to clean up after the acl_interface unit test. + +3 October 2022: George + - Merge #760: PROXYv2 downstream support. (New proxy-protocol-port + configuration option). + +3 October 2022: Wouter + - Fix to remove erroneous TC flag from TCP upstream. + - Fix test tdir skip report printout. + - Fix windows compile, the identifier interface is defined in headers. + - Fix to close errno block in comm_point_tcp_handle_read outside of + ifdef. + 26 September 2022: George - Better output for skipped tdir tests. diff --git a/doc/example.conf.in b/doc/example.conf.in index 51e51b58b..c21246e4c 100644 --- a/doc/example.conf.in +++ b/doc/example.conf.in @@ -902,6 +902,10 @@ server: # Disable TLS for DNS-over-HTTP downstream service. # http-notls-downstream: no + # The interfaces that use these listed port numbers will support and + # expect PROXYv2. For UDP and TCP/TLS interfaces. + # proxy-protocol-port: portno for each of the port numbers. + # DNS64 prefix. Must be specified when DNS64 is use. # Enable dns64 in module-config. Used to synthesize IPv6 from IPv4. # dns64-prefix: 64:ff9b::0/96 diff --git a/doc/unbound.conf.5.in b/doc/unbound.conf.5.in index e187452de..53923ac2b 100644 --- a/doc/unbound.conf.5.in +++ b/doc/unbound.conf.5.in @@ -349,7 +349,7 @@ ip\-transparent option is also available. The value of the Differentiated Services Codepoint (DSCP) in the differentiated services field (DS) of the outgoing IP packet headers. The field replaces the outdated IPv4 Type-Of-Service field and the -IPV6 traffic class field. +IPv6 traffic class field. .TP .B rrset\-cache\-size: \fI Number of bytes size of the RRset cache. Default is 4 megabytes. @@ -416,7 +416,7 @@ Enable or disable whether ip4 queries are answered or issued. Default is yes. Enable or disable whether ip6 queries are answered or issued. Default is yes. If disabled, queries are not answered on IPv6, and queries are not sent on IPv6 to the internet nameservers. With this option you can disable the -ipv6 transport for sending DNS traffic, it does not impact the contents of +IPv6 transport for sending DNS traffic, it does not impact the contents of the DNS traffic, which may have ip4 and ip6 addresses in it. .TP .B prefer\-ip4: \fI @@ -656,6 +656,17 @@ Ignored if the option is not available. Default is yes. Disable use of TLS for the downstream DNS-over-HTTP connections. Useful for local back end servers. Default is no. .TP +.B proxy\-protocol\-port: \fI +List port numbers as proxy\-protocol\-port, and when interfaces are defined, +eg. with the @port suffix, as this port number, they support and expect PROXYv2. +In this case the proxy address will only be used for the network communication +and initial ACL (check if the proxy itself is denied/refused by configuration). +The proxied address (if any) will then be used as the true client address and +will be used where applicable for logging, ACL, DNSTAP, RPZ and IP ratelimiting. +PROXYv2 is supported for UDP and TCP/TLS listening interfaces. +There is no support for PROXYv2 on a DoH or DNSCrypt listening interface. +Can list multiple, each on a new statement. +.TP .B use\-systemd: \fI Enable or disable systemd socket activation. Default is no. @@ -1668,7 +1679,7 @@ This specifies the action data for \fIresponse-ip\fR with action being to redirect as specified by "\fIresource record string\fR". "Resource record string" is similar to that of \fIaccess-control-tag-action\fR, but it must be of either AAAA, A or CNAME types. -If the IP-netblock is an IPv6/IPV4 prefix, the record +If the IP-netblock is an IPv6/IPv4 prefix, the record must be AAAA/A respectively, unless it is a CNAME (which can be used for both versions of IP netblocks). If it is CNAME there must not be more than one \fIresponse-ip-data\fR for the same IP-netblock. diff --git a/edns-subnet/subnetmod.c b/edns-subnet/subnetmod.c index d4f61bdd6..0f1df417f 100644 --- a/edns-subnet/subnetmod.c +++ b/edns-subnet/subnetmod.c @@ -765,7 +765,7 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event, } else if(qstate->mesh_info->reply_list) { subnet_option_from_ss( - &qstate->mesh_info->reply_list->query_reply.addr, + &qstate->mesh_info->reply_list->query_reply.client_addr, &sq->ecs_client_in, qstate->env->cfg); } diff --git a/iterator/iter_resptype.c b/iterator/iter_resptype.c index f146a2b6b..c2b824a0f 100644 --- a/iterator/iter_resptype.c +++ b/iterator/iter_resptype.c @@ -113,7 +113,11 @@ response_type_from_server(int rdset, if(!msg || !request) return RESPONSE_TYPE_THROWAWAY; - + /* If the TC flag is set, the response is incomplete. Too large to + * fit even in TCP or so. Discard it, it cannot be retrieved here. */ + if((msg->rep->flags & BIT_TC)) + return RESPONSE_TYPE_THROWAWAY; + /* If the message is NXDOMAIN, then it answers the question. */ if(FLAGS_GET_RCODE(msg->rep->flags) == LDNS_RCODE_NXDOMAIN) { /* make sure its not recursive when we don't want it to */ diff --git a/iterator/iterator.c b/iterator/iterator.c index da9b7990c..9c8d256d3 100644 --- a/iterator/iterator.c +++ b/iterator/iterator.c @@ -255,9 +255,9 @@ error_supers(struct module_qstate* qstate, int id, struct module_qstate* super) log_err("out of memory adding missing"); } delegpt_mark_neg(dpns, qstate->qinfo.qtype); - dpns->resolved = 1; /* mark as failed */ if((dpns->got4 == 2 || !ie->supports_ipv4) && (dpns->got6 == 2 || !ie->supports_ipv6)) { + dpns->resolved = 1; /* mark as failed */ target_count_increase_nx(super_iq, 1); } } @@ -596,15 +596,17 @@ errinf_reply(struct module_qstate* qstate, struct iter_qstate* iq) { if(qstate->env->cfg->val_log_level < 2 && !qstate->env->cfg->log_servfail) return; - if((qstate->reply && qstate->reply->addrlen != 0) || - (iq->fail_reply && iq->fail_reply->addrlen != 0)) { + if((qstate->reply && qstate->reply->remote_addrlen != 0) || + (iq->fail_reply && iq->fail_reply->remote_addrlen != 0)) { char from[256], frm[512]; - if(qstate->reply && qstate->reply->addrlen != 0) - addr_to_str(&qstate->reply->addr, qstate->reply->addrlen, - from, sizeof(from)); + if(qstate->reply && qstate->reply->remote_addrlen != 0) + addr_to_str(&qstate->reply->remote_addr, + qstate->reply->remote_addrlen, from, + sizeof(from)); else - addr_to_str(&iq->fail_reply->addr, iq->fail_reply->addrlen, - from, sizeof(from)); + addr_to_str(&iq->fail_reply->remote_addr, + iq->fail_reply->remote_addrlen, from, + sizeof(from)); snprintf(frm, sizeof(frm), "from %s", from); errinf(qstate, frm); } @@ -2262,6 +2264,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq, size_t qout_orig_len = 0; int sq_check_ratelimit = 1; int sq_was_ratelimited = 0; + int can_do_promisc = 0; /* NOTE: a request will encounter this state for each target it * needs to send a query to. That is, at least one per referral, @@ -2273,7 +2276,6 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq, iq->num_current_queries, iq->sent_count); /* Make sure that we haven't run away */ - /* FIXME: is this check even necessary? */ if(iq->referral_count > MAX_REFERRAL_COUNT) { verbose(VERB_QUERY, "request has exceeded the maximum " "number of referrrals with %d", iq->referral_count); @@ -2589,12 +2591,12 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq, if(iq->depth < ie->max_dependency_depth && iq->num_target_queries == 0 && (!iq->target_count || iq->target_count[TARGET_COUNT_NX]==0) - && iq->sent_count < TARGET_FETCH_STOP - /* if the mesh query list is full, then do not waste cpu - * and sockets to fetch promiscuous targets. They can be - * looked up when needed. */ - && !mesh_jostle_exceeded(qstate->env->mesh) - ) { + && iq->sent_count < TARGET_FETCH_STOP) { + can_do_promisc = 1; + } + /* if the mesh query list is full, then do not waste cpu and sockets to + * fetch promiscuous targets. They can be looked up when needed. */ + if(can_do_promisc && !mesh_jostle_exceeded(qstate->env->mesh)) { tf_policy = ie->target_fetch_policy[iq->depth]; } @@ -2766,6 +2768,37 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq, return 0; } + /* We have a target. We could have created promiscuous target + * queries but we are currently under pressure (mesh_jostle_exceeded). + * If we are configured to allow promiscuous target queries and haven't + * gone out to the network for a target query for this delegation, then + * it is possible to slip in a promiscuous one with a 1/10 chance. */ + if(can_do_promisc && tf_policy == 0 && iq->depth == 0 + && iq->depth < ie->max_dependency_depth + && ie->target_fetch_policy[iq->depth] != 0 + && iq->dp_target_count == 0 + && !ub_random_max(qstate->env->rnd, 10)) { + int extra = 0; + verbose(VERB_ALGO, "available target exists in cache but " + "attempt to get extra 1 target"); + (void)query_for_targets(qstate, iq, ie, id, 1, &extra); + /* errors ignored, these targets are not strictly necessary for + * this result, we do not have to reply with SERVFAIL */ + if(extra > 0) { + iq->num_target_queries += extra; + target_count_increase(iq, extra); + check_waiting_queries(iq, qstate, id); + /* undo qname minimise step because we'll get back here + * to do it again */ + if(qout_orig && iq->minimise_count > 0) { + iq->minimise_count--; + iq->qinfo_out.qname = qout_orig; + iq->qinfo_out.qname_len = qout_orig_len; + } + return 0; + } + } + /* Do not check ratelimit for forwarding queries or if we already got a * pass. */ sq_check_ratelimit = (!(iq->chase_flags & BIT_RD) && !iq->ratelimit_ok); @@ -2873,6 +2906,8 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq, (int)((iq->chase_flags&BIT_RD) || iq->chase_to_rd), iq->response, &iq->qinfo_out, iq->dp); iq->chase_to_rd = 0; + /* remove TC flag, if this is erroneously set by TCP upstream */ + iq->response->rep->flags &= ~BIT_TC; if(type == RESPONSE_TYPE_REFERRAL && (iq->chase_flags&BIT_RD) && !iq->auth_zone_response) { /* When forwarding (RD bit is set), we handle referrals @@ -2896,8 +2931,8 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq, * use dnssec-lame-bypass if it needs to query there.*/ if(qstate->reply) { struct delegpt_addr* a = delegpt_find_addr( - iq->dp, &qstate->reply->addr, - qstate->reply->addrlen); + iq->dp, &qstate->reply->remote_addr, + qstate->reply->remote_addrlen); if(a) a->dnsseclame = 1; } /* test the answer is from the zone we expected, @@ -2993,9 +3028,9 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq, (*qstate->env->detach_subs)(qstate); iq->num_target_queries = 0; if(qstate->reply) - sock_list_insert(&qstate->reply_origin, - &qstate->reply->addr, qstate->reply->addrlen, - qstate->region); + sock_list_insert(&qstate->reply_origin, + &qstate->reply->remote_addr, + qstate->reply->remote_addrlen, qstate->region); if(iq->minimisation_state != DONOT_MINIMISE_STATE && !(iq->chase_flags & BIT_RD)) { if(FLAGS_GET_RCODE(iq->response->rep->flags) != @@ -3250,9 +3285,9 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq, (*qstate->env->detach_subs)(qstate); iq->num_target_queries = 0; if(qstate->reply) - sock_list_insert(&qstate->reply_origin, - &qstate->reply->addr, qstate->reply->addrlen, - qstate->region); + sock_list_insert(&qstate->reply_origin, + &qstate->reply->remote_addr, + qstate->reply->remote_addrlen, qstate->region); verbose(VERB_ALGO, "cleared outbound list for query restart"); /* go to INIT_REQUEST_STATE for new qname. */ return next_state(iq, INIT_REQUEST_STATE); @@ -3266,9 +3301,10 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq, } else if(qstate->reply) { /* need addr for lameness cache, but we may have * gotten this from cache, so test to be sure */ - if(!infra_set_lame(qstate->env->infra_cache, - &qstate->reply->addr, qstate->reply->addrlen, - iq->dp->name, iq->dp->namelen, + if(!infra_set_lame(qstate->env->infra_cache, + &qstate->reply->remote_addr, + qstate->reply->remote_addrlen, + iq->dp->name, iq->dp->namelen, *qstate->env->now, dnsseclame, 0, iq->qchase.qtype)) log_err("mark host lame: out of memory"); @@ -3285,8 +3321,9 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq, * gotten this from cache, so test to be sure */ verbose(VERB_DETAIL, "mark as REC_LAME"); if(!infra_set_lame(qstate->env->infra_cache, - &qstate->reply->addr, qstate->reply->addrlen, - iq->dp->name, iq->dp->namelen, + &qstate->reply->remote_addr, + qstate->reply->remote_addrlen, + iq->dp->name, iq->dp->namelen, *qstate->env->now, 0, 1, iq->qchase.qtype)) log_err("mark host lame: out of memory"); } @@ -3527,12 +3564,13 @@ processTargetResponse(struct module_qstate* qstate, int id, } else { verbose(VERB_ALGO, "iterator TargetResponse failed"); delegpt_mark_neg(dpns, qstate->qinfo.qtype); - dpns->resolved = 1; /* fail the target */ if((dpns->got4 == 2 || !ie->supports_ipv4) && - (dpns->got6 == 2 || !ie->supports_ipv6) && + (dpns->got6 == 2 || !ie->supports_ipv6)) { + dpns->resolved = 1; /* fail the target */ /* do not count cached answers */ - (qstate->reply_origin && qstate->reply_origin->len != 0)) { - target_count_increase_nx(foriq, 1); + if(qstate->reply_origin && qstate->reply_origin->len != 0) { + target_count_increase_nx(foriq, 1); + } } } } @@ -4014,8 +4052,8 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq, if(!iq->response) goto handle_it; log_query_info(VERB_DETAIL, "response for", &qstate->qinfo); - log_name_addr(VERB_DETAIL, "reply from", iq->dp->name, - &qstate->reply->addr, qstate->reply->addrlen); + log_name_addr(VERB_DETAIL, "reply from", iq->dp->name, + &qstate->reply->remote_addr, qstate->reply->remote_addrlen); if(verbosity >= VERB_ALGO) log_dns_msg("incoming scrubbed packet:", &iq->response->qinfo, iq->response->rep); diff --git a/iterator/iterator.h b/iterator/iterator.h index b71b7fe99..18d3270a0 100644 --- a/iterator/iterator.h +++ b/iterator/iterator.h @@ -67,7 +67,8 @@ struct rbtree_type; #define MAX_RESTART_COUNT 11 /** max number of referrals. Makes sure resolver does not run away */ #define MAX_REFERRAL_COUNT 130 -/** max number of queries-sent-out. Make sure large NS set does not loop */ +/** max number of queries-sent-out. Make sure large NS set does not loop. + * Resets on query restarts (e.g., CNAMES) and referrals. */ #define MAX_SENT_COUNT 32 /** max number of queries for which to perform dnsseclameness detection, * (rrsigs missing detection) after that, just pick up that response */ @@ -324,7 +325,7 @@ struct iter_qstate { /** the number of times this query has been restarted. */ int query_restart_count; - /** the number of times this query as followed a referral. */ + /** the number of times this query has followed a referral. */ int referral_count; /** number of queries fired off */ diff --git a/pythonmod/interface.i b/pythonmod/interface.i index 0d95613f8..df8514b47 100644 --- a/pythonmod/interface.i +++ b/pythonmod/interface.i @@ -609,9 +609,9 @@ struct mesh_reply { struct comm_reply query_reply; }; -%rename(_addr) comm_reply::addr; +%rename(_addr) comm_reply::client_addr; struct comm_reply { - struct sockaddr_storage addr; + struct sockaddr_storage client_addr; }; %extend comm_reply { diff --git a/pythonmod/pythonmod_utils.c b/pythonmod/pythonmod_utils.c index 1f6f25129..aebe4d2bb 100644 --- a/pythonmod/pythonmod_utils.c +++ b/pythonmod/pythonmod_utils.c @@ -172,14 +172,14 @@ int createResponse(struct module_qstate* qstate, sldns_buffer* pkt) } -/* Convert reply->addr to string */ +/* Convert reply->client_addr to string */ void reply_addr2str(struct comm_reply* reply, char* dest, int maxlen) { - int af = (int)((struct sockaddr_in*) &(reply->addr))->sin_family; - void* sinaddr = &((struct sockaddr_in*) &(reply->addr))->sin_addr; + int af = (int)((struct sockaddr_in*) &(reply->client_addr))->sin_family; + void* sinaddr = &((struct sockaddr_in*) &(reply->client_addr))->sin_addr; if(af == AF_INET6) - sinaddr = &((struct sockaddr_in6*)&(reply->addr))->sin6_addr; + sinaddr = &((struct sockaddr_in6*)&(reply->client_addr))->sin6_addr; dest[0] = 0; if (inet_ntop(af, sinaddr, dest, (socklen_t)maxlen) == 0) return; diff --git a/respip/respip.c b/respip/respip.c index deff66317..942e082b9 100644 --- a/respip/respip.c +++ b/respip/respip.c @@ -1290,7 +1290,7 @@ respip_set_is_empty(const struct respip_set* set) void respip_inform_print(struct respip_action_info* respip_actinfo, uint8_t* qname, uint16_t qtype, uint16_t qclass, struct local_rrset* local_alias, - struct comm_reply* repinfo) + struct sockaddr_storage* addr, socklen_t addrlen) { char srcip[128], respip[128], txt[512]; unsigned port; @@ -1300,10 +1300,10 @@ respip_inform_print(struct respip_action_info* respip_actinfo, uint8_t* qname, if(local_alias) qname = local_alias->rrset->rk.dname; - port = (unsigned)((repinfo->addr.ss_family == AF_INET) ? - ntohs(((struct sockaddr_in*)&repinfo->addr)->sin_port) : - ntohs(((struct sockaddr_in6*)&repinfo->addr)->sin6_port)); - addr_to_str(&repinfo->addr, repinfo->addrlen, srcip, sizeof(srcip)); + port = (unsigned)((addr->ss_family == AF_INET) ? + ntohs(((struct sockaddr_in*)addr)->sin_port) : + ntohs(((struct sockaddr_in6*)addr)->sin6_port)); + addr_to_str(addr, addrlen, srcip, sizeof(srcip)); addr_to_str(&respip_addr->addr, respip_addr->addrlen, respip, sizeof(respip)); if(respip_actinfo->rpz_log) { diff --git a/respip/respip.h b/respip/respip.h index 988a72263..e4ab5cc9c 100644 --- a/respip/respip.h +++ b/respip/respip.h @@ -251,11 +251,13 @@ int respip_set_is_empty(const struct respip_set* set); * @param local_alias: set to a local alias if the query matches an alias in * a local zone. In this case its owner name will be considered the actual * query name. - * @param repinfo: reply info containing the client's source address and port. + * @param addr: the client's source address and port. + * @param addrlen: the client's source address length. */ void respip_inform_print(struct respip_action_info* respip_actinfo, uint8_t* qname, uint16_t qtype, uint16_t qclass, - struct local_rrset* local_alias, struct comm_reply* repinfo); + struct local_rrset* local_alias, struct sockaddr_storage* addr, + socklen_t addrlen); /** * Find resp_addr in tree, create and add to tree if it does not exist. diff --git a/services/cache/infra.c b/services/cache/infra.c index 9d5cdb162..537cb949c 100644 --- a/services/cache/infra.c +++ b/services/cache/infra.c @@ -834,14 +834,13 @@ static struct lruhash_entry* infra_find_ratedata(struct infra_cache* infra, /** find data item in array for ip addresses */ static struct lruhash_entry* infra_find_ip_ratedata(struct infra_cache* infra, - struct comm_reply* repinfo, int wr) + struct sockaddr_storage* addr, socklen_t addrlen, int wr) { struct ip_rate_key key; - hashvalue_type h = hash_addr(&(repinfo->addr), - repinfo->addrlen, 0); + hashvalue_type h = hash_addr(addr, addrlen, 0); memset(&key, 0, sizeof(key)); - key.addr = repinfo->addr; - key.addrlen = repinfo->addrlen; + key.addr = *addr; + key.addrlen = addrlen; key.entry.hash = h; return slabhash_lookup(infra->client_ip_rates, h, &key, wr); } @@ -876,10 +875,9 @@ static void infra_create_ratedata(struct infra_cache* infra, /** create rate data item for ip address */ static void infra_ip_create_ratedata(struct infra_cache* infra, - struct comm_reply* repinfo, time_t timenow) + struct sockaddr_storage* addr, socklen_t addrlen, time_t timenow) { - hashvalue_type h = hash_addr(&(repinfo->addr), - repinfo->addrlen, 0); + hashvalue_type h = hash_addr(addr, addrlen, 0); struct ip_rate_key* k = (struct ip_rate_key*)calloc(1, sizeof(*k)); struct ip_rate_data* d = (struct ip_rate_data*)calloc(1, sizeof(*d)); if(!k || !d) { @@ -887,8 +885,8 @@ static void infra_ip_create_ratedata(struct infra_cache* infra, free(d); return; /* alloc failure */ } - k->addr = repinfo->addr; - k->addrlen = repinfo->addrlen; + k->addr = *addr; + k->addrlen = addrlen; lock_rw_init(&k->entry.lock); k->entry.hash = h; k->entry.key = k; @@ -985,8 +983,8 @@ int infra_ratelimit_inc(struct infra_cache* infra, uint8_t* name, sldns_wire2str_class_buf(qinfo->qclass, cs, sizeof(cs)); ip[0]=0; if(replylist) { - addr_to_str((struct sockaddr_storage *)&replylist->addr, - replylist->addrlen, ip, sizeof(ip)); + addr_to_str((struct sockaddr_storage *)&replylist->remote_addr, + replylist->remote_addrlen, ip, sizeof(ip)); verbose(VERB_OPS, "ratelimit exceeded %s %d query %s %s %s from %s", buf, lim, qnm, cs, ts, ip); } else { verbose(VERB_OPS, "ratelimit exceeded %s %d query %s %s %s", buf, lim, qnm, cs, ts); @@ -1054,8 +1052,8 @@ infra_get_mem(struct infra_cache* infra) } int infra_ip_ratelimit_inc(struct infra_cache* infra, - struct comm_reply* repinfo, time_t timenow, int backoff, - struct sldns_buffer* buffer) + struct sockaddr_storage* addr, socklen_t addrlen, time_t timenow, + int backoff, struct sldns_buffer* buffer) { int max; struct lruhash_entry* entry; @@ -1065,7 +1063,7 @@ int infra_ip_ratelimit_inc(struct infra_cache* infra, return 1; } /* find or insert ratedata */ - entry = infra_find_ip_ratedata(infra, repinfo, 1); + entry = infra_find_ip_ratedata(infra, addr, addrlen, 1); if(entry) { int premax = infra_rate_max(entry->data, timenow, backoff); int* cur = infra_rate_give_second(entry->data, timenow); @@ -1075,8 +1073,7 @@ int infra_ip_ratelimit_inc(struct infra_cache* infra, if(premax <= infra_ip_ratelimit && max > infra_ip_ratelimit) { char client_ip[128], qnm[LDNS_MAX_DOMAINLEN+1+12+12]; - addr_to_str((struct sockaddr_storage *)&repinfo->addr, - repinfo->addrlen, client_ip, sizeof(client_ip)); + addr_to_str(addr, addrlen, client_ip, sizeof(client_ip)); qnm[0]=0; if(sldns_buffer_limit(buffer)>LDNS_HEADER_SIZE && LDNS_QDCOUNT(sldns_buffer_begin(buffer))!=0) { @@ -1101,6 +1098,6 @@ int infra_ip_ratelimit_inc(struct infra_cache* infra, } /* create */ - infra_ip_create_ratedata(infra, repinfo, timenow); + infra_ip_create_ratedata(infra, addr, addrlen, timenow); return 1; } diff --git a/services/cache/infra.h b/services/cache/infra.h index 6a2371aca..faf7fd2f3 100644 --- a/services/cache/infra.h +++ b/services/cache/infra.h @@ -416,15 +416,16 @@ int infra_find_ratelimit(struct infra_cache* infra, uint8_t* name, /** Update query ratelimit hash and decide * whether or not a query should be dropped. * @param infra: infra cache - * @param repinfo: information about client + * @param addr: client address + * @param addrlen: client address length * @param timenow: what time it is now. * @param backoff: if backoff is enabled. * @param buffer: with query for logging. * @return 1 if it could be incremented. 0 if the increment overshot the * ratelimit and the query should be dropped. */ int infra_ip_ratelimit_inc(struct infra_cache* infra, - struct comm_reply* repinfo, time_t timenow, int backoff, - struct sldns_buffer* buffer); + struct sockaddr_storage* addr, socklen_t addrlen, time_t timenow, + int backoff, struct sldns_buffer* buffer); /** * Get memory used by the infra cache. diff --git a/services/listen_dnsport.c b/services/listen_dnsport.c index e823b3c12..95606aff5 100644 --- a/services/listen_dnsport.c +++ b/services/listen_dnsport.c @@ -1093,11 +1093,13 @@ make_sock_port(int stype, const char* ifname, const char* port, * @param list: list head. changed. * @param s: fd. * @param ftype: if fd is UDP. + * @param pp2_enabled: if PROXYv2 is enabled for this port. * @param ub_sock: socket with address. * @return false on failure. list in unchanged then. */ static int -port_insert(struct listen_port** list, int s, enum listen_type ftype, struct unbound_socket* ub_sock) +port_insert(struct listen_port** list, int s, enum listen_type ftype, + int pp2_enabled, struct unbound_socket* ub_sock) { struct listen_port* item = (struct listen_port*)malloc( sizeof(struct listen_port)); @@ -1106,6 +1108,7 @@ port_insert(struct listen_port** list, int s, enum listen_type ftype, struct unb item->next = *list; item->fd = s; item->ftype = ftype; + item->pp2_enabled = pp2_enabled; item->socket = ub_sock; *list = item; return 1; @@ -1201,6 +1204,7 @@ if_is_ssl(const char* ifname, const char* port, int ssl_port, * @param ssl_port: ssl service port number * @param tls_additional_port: list of additional ssl service port numbers. * @param https_port: DoH service port number + * @param proxy_protocol_port: list of PROXYv2 port numbers. * @param reuseport: try to set SO_REUSEPORT if nonNULL and true. * set to false on exit if reuseport failed due to no kernel support. * @param transparent: set IP_TRANSPARENT socket option. @@ -1217,25 +1221,30 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, struct addrinfo *hints, const char* port, struct listen_port** list, size_t rcv, size_t snd, int ssl_port, struct config_strlist* tls_additional_port, int https_port, + struct config_strlist* proxy_protocol_port, int* reuseport, int transparent, int tcp_mss, int freebind, int http2_nodelay, int use_systemd, int dnscrypt_port, int dscp) { int s, noip6=0; int is_https = if_is_https(ifname, port, https_port); + int is_dnscrypt = if_is_dnscrypt(ifname, port, dnscrypt_port); + int is_pp2 = if_is_pp2(ifname, port, proxy_protocol_port); int nodelay = is_https && http2_nodelay; struct unbound_socket* ub_sock; -#ifdef USE_DNSCRYPT - int is_dnscrypt = ((strchr(ifname, '@') && - atoi(strchr(ifname, '@')+1) == dnscrypt_port) || - (!strchr(ifname, '@') && atoi(port) == dnscrypt_port)); -#else - int is_dnscrypt = 0; - (void)dnscrypt_port; -#endif if(!do_udp && !do_tcp) return 0; + if(is_pp2) { + if(is_dnscrypt) { + fatal_exit("PROXYv2 and DNSCrypt combination not " + "supported!"); + } else if(is_https) { + fatal_exit("PROXYv2 and DoH combination not " + "supported!"); + } + } + if(do_auto) { ub_sock = calloc(1, sizeof(struct unbound_socket)); if(!ub_sock) @@ -1260,7 +1269,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, } if(!port_insert(list, s, is_dnscrypt ?listen_type_udpancil_dnscrypt:listen_type_udpancil, - ub_sock)) { + is_pp2, ub_sock)) { sock_close(s); freeaddrinfo(ub_sock->addr); free(ub_sock); @@ -1283,7 +1292,8 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, return 0; } if(!port_insert(list, s, is_dnscrypt - ?listen_type_udp_dnscrypt:listen_type_udp, ub_sock)) { + ?listen_type_udp_dnscrypt:listen_type_udp, + is_pp2, ub_sock)) { sock_close(s); freeaddrinfo(ub_sock->addr); free(ub_sock); @@ -1318,7 +1328,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, } if(is_ssl) verbose(VERB_ALGO, "setup TCP for SSL service"); - if(!port_insert(list, s, port_type, ub_sock)) { + if(!port_insert(list, s, port_type, is_pp2, ub_sock)) { sock_close(s); freeaddrinfo(ub_sock->addr); free(ub_sock); @@ -1407,14 +1417,16 @@ listen_create(struct comm_base* base, struct listen_port* ports, if(ports->ftype == listen_type_udp || ports->ftype == listen_type_udp_dnscrypt) { cp = comm_point_create_udp(base, ports->fd, - front->udp_buff, cb, cb_arg, ports->socket); + front->udp_buff, ports->pp2_enabled, cb, + cb_arg, ports->socket); } else if(ports->ftype == listen_type_tcp || ports->ftype == listen_type_tcp_dnscrypt) { cp = comm_point_create_tcp(base, ports->fd, tcp_accept_count, tcp_idle_timeout, harden_large_queries, 0, NULL, tcp_conn_limit, bufsize, front->udp_buff, - ports->ftype, cb, cb_arg, ports->socket); + ports->ftype, ports->pp2_enabled, cb, cb_arg, + ports->socket); } else if(ports->ftype == listen_type_ssl || ports->ftype == listen_type_http) { cp = comm_point_create_tcp(base, ports->fd, @@ -1422,7 +1434,8 @@ listen_create(struct comm_base* base, struct listen_port* ports, harden_large_queries, http_max_streams, http_endpoint, tcp_conn_limit, bufsize, front->udp_buff, - ports->ftype, cb, cb_arg, ports->socket); + ports->ftype, ports->pp2_enabled, cb, cb_arg, + ports->socket); if(ports->ftype == listen_type_http) { if(!sslctx && !http_notls) { log_warn("HTTPS port configured, but " @@ -1448,7 +1461,8 @@ listen_create(struct comm_base* base, struct listen_port* ports, } else if(ports->ftype == listen_type_udpancil || ports->ftype == listen_type_udpancil_dnscrypt) { cp = comm_point_create_udp_ancil(base, ports->fd, - front->udp_buff, cb, cb_arg, ports->socket); + front->udp_buff, ports->pp2_enabled, cb, + cb_arg, ports->socket); } if(!cp) { log_err("can't create commpoint"); @@ -1783,7 +1797,9 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs, &hints, portbuf, &list, cfg->so_rcvbuf, cfg->so_sndbuf, cfg->ssl_port, cfg->tls_additional_port, - cfg->https_port, reuseport, cfg->ip_transparent, + cfg->https_port, + cfg->proxy_protocol_port, + reuseport, cfg->ip_transparent, cfg->tcp_mss, cfg->ip_freebind, cfg->http_nodelay, cfg->use_systemd, cfg->dnscrypt_port, cfg->ip_dscp)) { @@ -1798,7 +1814,9 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs, &hints, portbuf, &list, cfg->so_rcvbuf, cfg->so_sndbuf, cfg->ssl_port, cfg->tls_additional_port, - cfg->https_port, reuseport, cfg->ip_transparent, + cfg->https_port, + cfg->proxy_protocol_port, + reuseport, cfg->ip_transparent, cfg->tcp_mss, cfg->ip_freebind, cfg->http_nodelay, cfg->use_systemd, cfg->dnscrypt_port, cfg->ip_dscp)) { @@ -1816,7 +1834,8 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs, &hints, portbuf, &list, cfg->so_rcvbuf, cfg->so_sndbuf, cfg->ssl_port, cfg->tls_additional_port, - cfg->https_port, reuseport, cfg->ip_transparent, + cfg->https_port, cfg->proxy_protocol_port, + reuseport, cfg->ip_transparent, cfg->tcp_mss, cfg->ip_freebind, cfg->http_nodelay, cfg->use_systemd, cfg->dnscrypt_port, cfg->ip_dscp)) { @@ -1831,7 +1850,8 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs, &hints, portbuf, &list, cfg->so_rcvbuf, cfg->so_sndbuf, cfg->ssl_port, cfg->tls_additional_port, - cfg->https_port, reuseport, cfg->ip_transparent, + cfg->https_port, cfg->proxy_protocol_port, + reuseport, cfg->ip_transparent, cfg->tcp_mss, cfg->ip_freebind, cfg->http_nodelay, cfg->use_systemd, cfg->dnscrypt_port, cfg->ip_dscp)) { @@ -1848,7 +1868,8 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs, do_tcp, &hints, portbuf, &list, cfg->so_rcvbuf, cfg->so_sndbuf, cfg->ssl_port, cfg->tls_additional_port, - cfg->https_port, reuseport, cfg->ip_transparent, + cfg->https_port, cfg->proxy_protocol_port, + reuseport, cfg->ip_transparent, cfg->tcp_mss, cfg->ip_freebind, cfg->http_nodelay, cfg->use_systemd, cfg->dnscrypt_port, cfg->ip_dscp)) { @@ -1863,7 +1884,8 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs, do_tcp, &hints, portbuf, &list, cfg->so_rcvbuf, cfg->so_sndbuf, cfg->ssl_port, cfg->tls_additional_port, - cfg->https_port, reuseport, cfg->ip_transparent, + cfg->https_port, cfg->proxy_protocol_port, + reuseport, cfg->ip_transparent, cfg->tcp_mss, cfg->ip_freebind, cfg->http_nodelay, cfg->use_systemd, cfg->dnscrypt_port, cfg->ip_dscp)) { diff --git a/services/listen_dnsport.h b/services/listen_dnsport.h index f27fa597b..816d79aea 100644 --- a/services/listen_dnsport.h +++ b/services/listen_dnsport.h @@ -128,7 +128,10 @@ struct listen_port { int fd; /** type of file descriptor, udp or tcp */ enum listen_type ftype; - /** fill in unbpound_socket structure for every opened socket at Unbound startup */ + /** if the port should support PROXYv2 */ + int pp2_enabled; + /** fill in unbound_socket structure for every opened socket at + * Unbound startup */ struct unbound_socket* socket; }; diff --git a/services/localzone.c b/services/localzone.c index 3ed7d835d..3536b7aaa 100644 --- a/services/localzone.c +++ b/services/localzone.c @@ -1744,13 +1744,13 @@ local_zones_zone_answer(struct local_zone* z, struct module_env* env, /** print log information for an inform zone query */ static void lz_inform_print(struct local_zone* z, struct query_info* qinfo, - struct comm_reply* repinfo) + struct sockaddr_storage* addr, socklen_t addrlen) { char ip[128], txt[512]; char zname[LDNS_MAX_DOMAINLEN+1]; - uint16_t port = ntohs(((struct sockaddr_in*)&repinfo->addr)->sin_port); + uint16_t port = ntohs(((struct sockaddr_in*)addr)->sin_port); dname_str(z->name, zname); - addr_to_str(&repinfo->addr, repinfo->addrlen, ip, sizeof(ip)); + addr_to_str(addr, addrlen, ip, sizeof(ip)); snprintf(txt, sizeof(txt), "%s %s %s@%u", zname, local_zone_type2str(z->type), ip, (unsigned)port); log_nametypeclass(NO_VERBOSE, txt, qinfo->qname, qinfo->qtype, qinfo->qclass); @@ -1765,7 +1765,8 @@ lz_type(uint8_t *taglist, size_t taglen, uint8_t *taglist2, size_t taglen2, struct local_zone_override* lzo; if(repinfo && override_tree) { lzo = (struct local_zone_override*)addr_tree_lookup( - override_tree, &repinfo->addr, repinfo->addrlen); + override_tree, &repinfo->client_addr, + repinfo->client_addrlen); if(lzo && lzo->type) { verbose(VERB_ALGO, "local zone override to type %s", local_zone_type2str(lzo->type)); @@ -1888,7 +1889,8 @@ local_zones_answer(struct local_zones* zones, struct module_env* env, lzt == local_zone_inform_deny || lzt == local_zone_inform_redirect) && repinfo) - lz_inform_print(z, qinfo, repinfo); + lz_inform_print(z, qinfo, &repinfo->client_addr, + repinfo->client_addrlen); if(lzt != local_zone_always_refuse && lzt != local_zone_always_transparent diff --git a/services/mesh.c b/services/mesh.c index 2a4119426..9007b6e08 100644 --- a/services/mesh.c +++ b/services/mesh.c @@ -806,7 +806,7 @@ static void mesh_schedule_prefetch_subnet(struct mesh_area* mesh, /* Fake the ECS data from the client's IP */ struct ecs_data ecs; memset(&ecs, 0, sizeof(ecs)); - subnet_option_from_ss(&rep->addr, &ecs, mesh->env->cfg); + subnet_option_from_ss(&rep->client_addr, &ecs, mesh->env->cfg); if(ecs.subnet_validdata == 0) { log_err("prefetch_subnet subnet_option_from_ss: invalid data"); return; @@ -1488,8 +1488,9 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep, } /* Log reply sent */ if(m->s.env->cfg->log_replies) { - log_reply_info(NO_VERBOSE, &m->s.qinfo, &r->query_reply.addr, - r->query_reply.addrlen, duration, 0, r_buffer); + log_reply_info(NO_VERBOSE, &m->s.qinfo, + &r->query_reply.client_addr, + r->query_reply.client_addrlen, duration, 0, r_buffer); } } @@ -1530,7 +1531,8 @@ void mesh_query_done(struct mesh_state* mstate) respip_inform_print(mstate->s.respip_action_info, r->qname, mstate->s.qinfo.qtype, mstate->s.qinfo.qclass, r->local_alias, - &r->query_reply); + &r->query_reply.client_addr, + r->query_reply.client_addrlen); if(mstate->s.env->cfg->stat_extended && mstate->s.respip_action_info->rpz_used) { if(mstate->s.respip_action_info->rpz_disabled) @@ -2180,7 +2182,8 @@ mesh_serve_expired_callback(void* arg) if(actinfo.addrinfo) { respip_inform_print(&actinfo, r->qname, qstate->qinfo.qtype, qstate->qinfo.qclass, - r->local_alias, &r->query_reply); + r->local_alias, &r->query_reply.client_addr, + r->query_reply.client_addrlen); if(qstate->env->cfg->stat_extended && actinfo.rpz_used) { if(actinfo.rpz_disabled) diff --git a/services/outside_network.c b/services/outside_network.c index b5b20cbb0..a4529ade5 100644 --- a/services/outside_network.c +++ b/services/outside_network.c @@ -86,10 +86,6 @@ static void serviced_tcp_initiate(struct serviced_query* sq, sldns_buffer* buff) static int randomize_and_send_udp(struct pending* pend, sldns_buffer* packet, int timeout); -/** remove waiting tcp from the outnet waiting list */ -static void waiting_list_remove(struct outside_network* outnet, - struct waiting_tcp* w); - /** select a DNS ID for a TCP stream */ static uint16_t tcp_select_id(struct outside_network* outnet, struct reuse_tcp* reuse); @@ -372,7 +368,8 @@ log_reuse_tcp(enum verbosity_value v, const char* msg, struct reuse_tcp* reuse) } /** pop the first element from the writewait list */ -static struct waiting_tcp* reuse_write_wait_pop(struct reuse_tcp* reuse) +struct waiting_tcp* +reuse_write_wait_pop(struct reuse_tcp* reuse) { struct waiting_tcp* w = reuse->write_wait_first; if(!w) @@ -390,8 +387,8 @@ static struct waiting_tcp* reuse_write_wait_pop(struct reuse_tcp* reuse) } /** remove the element from the writewait list */ -static void reuse_write_wait_remove(struct reuse_tcp* reuse, - struct waiting_tcp* w) +void +reuse_write_wait_remove(struct reuse_tcp* reuse, struct waiting_tcp* w) { log_assert(w); log_assert(w->write_wait_queued); @@ -415,8 +412,8 @@ static void reuse_write_wait_remove(struct reuse_tcp* reuse, } /** push the element after the last on the writewait list */ -static void reuse_write_wait_push_back(struct reuse_tcp* reuse, - struct waiting_tcp* w) +void +reuse_write_wait_push_back(struct reuse_tcp* reuse, struct waiting_tcp* w) { if(!w) return; log_assert(!w->write_wait_queued); @@ -427,7 +424,9 @@ static void reuse_write_wait_push_back(struct reuse_tcp* reuse, w->write_wait_prev = reuse->write_wait_last; } else { reuse->write_wait_first = w; + w->write_wait_prev = NULL; } + w->write_wait_next = NULL; reuse->write_wait_last = w; w->write_wait_queued = 1; } @@ -721,12 +720,12 @@ outnet_tcp_take_into_use(struct waiting_tcp* w) pend->next_free = NULL; pend->query = w; pend->reuse.outnet = w->outnet; - pend->c->repinfo.addrlen = w->addrlen; + pend->c->repinfo.remote_addrlen = w->addrlen; pend->c->tcp_more_read_again = &pend->reuse.cp_more_read_again; pend->c->tcp_more_write_again = &pend->reuse.cp_more_write_again; pend->reuse.cp_more_read_again = 0; pend->reuse.cp_more_write_again = 0; - memcpy(&pend->c->repinfo.addr, &w->addr, w->addrlen); + memcpy(&pend->c->repinfo.remote_addr, &w->addr, w->addrlen); pend->reuse.pending = pend; /* Remove from tree in case the is_ssl will be different and causes the @@ -810,20 +809,50 @@ reuse_tcp_lru_snip(struct outside_network* outnet) return reuse; } -/** call callback on waiting_tcp, if not NULL */ -static void -waiting_tcp_callback(struct waiting_tcp* w, struct comm_point* c, int error, - struct comm_reply* reply_info) +/** remove waiting tcp from the outnet waiting list */ +void +outnet_waiting_tcp_list_remove(struct outside_network* outnet, struct waiting_tcp* w) { - if(w && w->cb) { - fptr_ok(fptr_whitelist_pending_tcp(w->cb)); - (void)(*w->cb)(c, w->cb_arg, error, reply_info); + struct waiting_tcp* p = outnet->tcp_wait_first, *prev = NULL; + w->on_tcp_waiting_list = 0; + while(p) { + if(p == w) { + /* remove w */ + if(prev) + prev->next_waiting = w->next_waiting; + else outnet->tcp_wait_first = w->next_waiting; + if(outnet->tcp_wait_last == w) + outnet->tcp_wait_last = prev; + w->next_waiting = NULL; + return; + } + prev = p; + p = p->next_waiting; } + /* outnet_waiting_tcp_list_remove is currently called only with items + * that are already in the waiting list. */ + log_assert(0); +} + +/** pop the first waiting tcp from the outnet waiting list */ +struct waiting_tcp* +outnet_waiting_tcp_list_pop(struct outside_network* outnet) +{ + struct waiting_tcp* w = outnet->tcp_wait_first; + if(!outnet->tcp_wait_first) return NULL; + log_assert(w->on_tcp_waiting_list); + outnet->tcp_wait_first = w->next_waiting; + if(outnet->tcp_wait_last == w) + outnet->tcp_wait_last = NULL; + w->on_tcp_waiting_list = 0; + w->next_waiting = NULL; + return w; } /** add waiting_tcp element to the outnet tcp waiting list */ -static void -outnet_add_tcp_waiting(struct outside_network* outnet, struct waiting_tcp* w) +void +outnet_waiting_tcp_list_add(struct outside_network* outnet, + struct waiting_tcp* w, int set_timer) { struct timeval tv; log_assert(!w->on_tcp_waiting_list); @@ -835,16 +864,18 @@ outnet_add_tcp_waiting(struct outside_network* outnet, struct waiting_tcp* w) else outnet->tcp_wait_first = w; outnet->tcp_wait_last = w; w->on_tcp_waiting_list = 1; + if(set_timer) { #ifndef S_SPLINT_S - tv.tv_sec = w->timeout/1000; - tv.tv_usec = (w->timeout%1000)*1000; + tv.tv_sec = w->timeout/1000; + tv.tv_usec = (w->timeout%1000)*1000; #endif - comm_timer_set(w->timer, &tv); + comm_timer_set(w->timer, &tv); + } } /** add waiting_tcp element as first to the outnet tcp waiting list */ -static void -outnet_add_tcp_waiting_first(struct outside_network* outnet, +void +outnet_waiting_tcp_list_add_first(struct outside_network* outnet, struct waiting_tcp* w, int reset_timer) { struct timeval tv; @@ -869,6 +900,17 @@ outnet_add_tcp_waiting_first(struct outside_network* outnet, (outnet->tcp_reuse_first && outnet->tcp_reuse_last)); } +/** call callback on waiting_tcp, if not NULL */ +static void +waiting_tcp_callback(struct waiting_tcp* w, struct comm_point* c, int error, + struct comm_reply* reply_info) +{ + if(w && w->cb) { + fptr_ok(fptr_whitelist_pending_tcp(w->cb)); + (void)(*w->cb)(c, w->cb_arg, error, reply_info); + } +} + /** see if buffers can be used to service TCP queries */ static void use_free_buffer(struct outside_network* outnet) @@ -879,15 +921,10 @@ use_free_buffer(struct outside_network* outnet) struct pending_tcp* pend_tcp = NULL; #endif struct reuse_tcp* reuse = NULL; - w = outnet->tcp_wait_first; - log_assert(w->on_tcp_waiting_list); - outnet->tcp_wait_first = w->next_waiting; - if(outnet->tcp_wait_last == w) - outnet->tcp_wait_last = NULL; + w = outnet_waiting_tcp_list_pop(outnet); log_assert( (!outnet->tcp_reuse_first && !outnet->tcp_reuse_last) || (outnet->tcp_reuse_first && outnet->tcp_reuse_last)); - w->on_tcp_waiting_list = 0; reuse = reuse_tcp_find(outnet, &w->addr, w->addrlen, w->ssl_upstream); /* re-select an ID when moving to a new TCP buffer */ @@ -934,7 +971,7 @@ use_free_buffer(struct outside_network* outnet) #endif } else { /* no reuse and no free buffer, put back at the start */ - outnet_add_tcp_waiting_first(outnet, w, 0); + outnet_waiting_tcp_list_add_first(outnet, w, 0); break; } #ifdef USE_DNSTAP @@ -1008,7 +1045,7 @@ reuse_move_writewait_away(struct outside_network* outnet, * fail the query */ w->error_count ++; reuse_tree_by_id_delete(&pend->reuse, w); - outnet_add_tcp_waiting(outnet, w); + outnet_waiting_tcp_list_add(outnet, w, 1); } while((w = reuse_write_wait_pop(&pend->reuse)) != NULL) { if(verbosity >= VERB_CLIENT && w->pkt_len > 12+2+2 && @@ -1019,7 +1056,7 @@ reuse_move_writewait_away(struct outside_network* outnet, verbose(VERB_CLIENT, "reuse_move_writewait_away item %s", buf); } reuse_tree_by_id_delete(&pend->reuse, w); - outnet_add_tcp_waiting(outnet, w); + outnet_waiting_tcp_list_add(outnet, w, 1); } } @@ -1417,11 +1454,11 @@ outnet_udp_cb(struct comm_point* c, void* arg, int error, /* setup lookup key */ key.id = (unsigned)LDNS_ID_WIRE(sldns_buffer_begin(c->buffer)); - memcpy(&key.addr, &reply_info->addr, reply_info->addrlen); - key.addrlen = reply_info->addrlen; + memcpy(&key.addr, &reply_info->remote_addr, reply_info->remote_addrlen); + key.addrlen = reply_info->remote_addrlen; verbose(VERB_ALGO, "Incoming reply id = %4.4x", key.id); log_addr(VERB_ALGO, "Incoming reply addr =", - &reply_info->addr, reply_info->addrlen); + &reply_info->remote_addr, reply_info->remote_addrlen); /* find it, see if this thing is a valid query response */ verbose(VERB_ALGO, "lookup size is %d entries", (int)outnet->pending->count); @@ -1690,7 +1727,7 @@ outside_network_create(struct comm_base *base, size_t bufsize, return NULL; } pc->cp = comm_point_create_udp(outnet->base, -1, - outnet->udp_buff, outnet_udp_cb, outnet, NULL); + outnet->udp_buff, 0, outnet_udp_cb, outnet, NULL); if(!pc->cp) { log_err("malloc failed"); free(pc); @@ -2237,7 +2274,7 @@ outnet_tcptimer(void* arg) verbose(VERB_CLIENT, "outnet_tcptimer"); if(w->on_tcp_waiting_list) { /* it is on the waiting list */ - waiting_list_remove(outnet, w); + outnet_waiting_tcp_list_remove(outnet, w); waiting_tcp_callback(w, NULL, NETEVENT_TIMEOUT, NULL); waiting_tcp_delete(w); } else { @@ -2464,7 +2501,7 @@ pending_tcp_query(struct serviced_query* sq, sldns_buffer* packet, #ifdef USE_DNSTAP w->sq = sq; #endif - outnet_add_tcp_waiting(sq->outnet, w); + outnet_waiting_tcp_list_add(sq->outnet, w, 1); } return w; } @@ -2612,30 +2649,6 @@ serviced_create(struct outside_network* outnet, sldns_buffer* buff, int dnssec, return sq; } -/** remove waiting tcp from the outnet waiting list */ -static void -waiting_list_remove(struct outside_network* outnet, struct waiting_tcp* w) -{ - struct waiting_tcp* p = outnet->tcp_wait_first, *prev = NULL; - w->on_tcp_waiting_list = 0; - while(p) { - if(p == w) { - /* remove w */ - if(prev) - prev->next_waiting = w->next_waiting; - else outnet->tcp_wait_first = w->next_waiting; - if(outnet->tcp_wait_last == w) - outnet->tcp_wait_last = prev; - return; - } - prev = p; - p = p->next_waiting; - } - /* waiting_list_remove is currently called only with items that are - * already in the waiting list. */ - log_assert(0); -} - /** reuse tcp stream, remove serviced query from stream, * return true if the stream is kept, false if it is to be closed */ static int @@ -2730,7 +2743,7 @@ serviced_delete(struct serviced_query* sq) sq->pending = NULL; } else { verbose(VERB_CLIENT, "serviced_delete: tcpwait"); - waiting_list_remove(sq->outnet, w); + outnet_waiting_tcp_list_remove(sq->outnet, w); if(!w->in_cb_and_decommission) waiting_tcp_delete(w); } @@ -3103,8 +3116,8 @@ serviced_tcp_callback(struct comm_point* c, void* arg, int error, rep = &r2; r2.c = c; } - memcpy(&rep->addr, &sq->addr, sq->addrlen); - rep->addrlen = sq->addrlen; + memcpy(&rep->remote_addr, &sq->addr, sq->addrlen); + rep->remote_addrlen = sq->addrlen; serviced_callbacks(sq, error, c, rep); return 0; } @@ -3582,7 +3595,7 @@ outnet_comm_point_for_udp(struct outside_network* outnet, if(fd == -1) { return NULL; } - cp = comm_point_create_udp(outnet->base, fd, outnet->udp_buff, + cp = comm_point_create_udp(outnet->base, fd, outnet->udp_buff, 0, cb, cb_arg, NULL); if(!cp) { log_err("malloc failure"); @@ -3670,8 +3683,8 @@ outnet_comm_point_for_tcp(struct outside_network* outnet, close(fd); return 0; } - cp->repinfo.addrlen = to_addrlen; - memcpy(&cp->repinfo.addr, to_addr, to_addrlen); + cp->repinfo.remote_addrlen = to_addrlen; + memcpy(&cp->repinfo.remote_addr, to_addr, to_addrlen); /* setup for SSL (if needed) */ if(ssl) { @@ -3746,8 +3759,8 @@ outnet_comm_point_for_http(struct outside_network* outnet, close(fd); return 0; } - cp->repinfo.addrlen = to_addrlen; - memcpy(&cp->repinfo.addr, to_addr, to_addrlen); + cp->repinfo.remote_addrlen = to_addrlen; + memcpy(&cp->repinfo.remote_addr, to_addr, to_addrlen); /* setup for SSL (if needed) */ if(ssl) { diff --git a/services/outside_network.h b/services/outside_network.h index c383b8f09..467c81f60 100644 --- a/services/outside_network.h +++ b/services/outside_network.h @@ -718,6 +718,30 @@ struct reuse_tcp* reuse_tcp_lru_snip(struct outside_network* outnet); /** delete readwait waiting_tcp elements, deletes the elements in the list */ void reuse_del_readwait(rbtree_type* tree_by_id); +/** remove waiting tcp from the outnet waiting list */ +void outnet_waiting_tcp_list_remove(struct outside_network* outnet, + struct waiting_tcp* w); + +/** pop the first waiting tcp from the outnet waiting list */ +struct waiting_tcp* outnet_waiting_tcp_list_pop(struct outside_network* outnet); + +/** add waiting_tcp element to the outnet tcp waiting list */ +void outnet_waiting_tcp_list_add(struct outside_network* outnet, + struct waiting_tcp* w, int set_timer); + +/** add waiting_tcp element as first to the outnet tcp waiting list */ +void outnet_waiting_tcp_list_add_first(struct outside_network* outnet, + struct waiting_tcp* w, int reset_timer); + +/** pop the first element from the writewait list */ +struct waiting_tcp* reuse_write_wait_pop(struct reuse_tcp* reuse); + +/** remove the element from the writewait list */ +void reuse_write_wait_remove(struct reuse_tcp* reuse, struct waiting_tcp* w); + +/** push the element after the last on the writewait list */ +void reuse_write_wait_push_back(struct reuse_tcp* reuse, struct waiting_tcp* w); + /** get TCP file descriptor for address, returns -1 on failure, * tcp_mss is 0 or maxseg size to set for TCP packets. */ int outnet_get_tcp_fd(struct sockaddr_storage* addr, socklen_t addrlen, diff --git a/services/rpz.c b/services/rpz.c index 77b6266fe..e876f3f94 100644 --- a/services/rpz.c +++ b/services/rpz.c @@ -1392,11 +1392,13 @@ log_rpz_apply(char* trigger, uint8_t* dname, struct addr_tree_node* addrnode, dnamestr[0]=0; } if(repinfo) { - addr_to_str(&repinfo->addr, repinfo->addrlen, ip, sizeof(ip)); - port = ntohs(((struct sockaddr_in*)&repinfo->addr)->sin_port); + addr_to_str(&repinfo->client_addr, repinfo->client_addrlen, ip, sizeof(ip)); + port = ntohs(((struct sockaddr_in*)&repinfo->client_addr)->sin_port); } else if(ms && ms->mesh_info && ms->mesh_info->reply_list) { - addr_to_str(&ms->mesh_info->reply_list->query_reply.addr, ms->mesh_info->reply_list->query_reply.addrlen, ip, sizeof(ip)); - port = ntohs(((struct sockaddr_in*)&ms->mesh_info->reply_list->query_reply.addr)->sin_port); + addr_to_str(&ms->mesh_info->reply_list->query_reply.client_addr, + ms->mesh_info->reply_list->query_reply.client_addrlen, + ip, sizeof(ip)); + port = ntohs(((struct sockaddr_in*)&ms->mesh_info->reply_list->query_reply.client_addr)->sin_port); } else { ip[0]=0; port = 0; @@ -1468,7 +1470,9 @@ rpz_resolve_client_action_and_zone(struct auth_zones* az, struct query_info* qin } z = rpz_find_zone(r->local_zones, qinfo->qname, qinfo->qname_len, qinfo->qclass, 0, 0, 0); - node = rpz_ipbased_trigger_lookup(r->client_set, &repinfo->addr, repinfo->addrlen, "clientip"); + node = rpz_ipbased_trigger_lookup(r->client_set, + &repinfo->client_addr, repinfo->client_addrlen, + "clientip"); if((z || node) && r->action_override == RPZ_DISABLED_ACTION) { if(r->log) log_rpz_apply((node?"clientip":"qname"), @@ -2164,18 +2168,16 @@ rpz_callback_from_iterator_module(struct module_qstate* ms, struct iter_qstate* lock_rw_unlock(&az->rpz_lock); - if(raddr == NULL && z == NULL) { return NULL; } - else if(raddr != NULL) { + if(raddr == NULL && z == NULL) + return NULL; + + if(raddr != NULL) { if(z) { lock_rw_unlock(&z->lock); } return rpz_apply_nsip_trigger(ms, r, raddr, a); - } else if(z != NULL) { - if(raddr) { - lock_rw_unlock(&raddr->lock); - } - return rpz_apply_nsdname_trigger(ms, r, z, &match, a); - } else { return NULL; } + } + return rpz_apply_nsdname_trigger(ms, r, z, &match, a); } struct dns_msg* rpz_callback_from_iterator_cname(struct module_qstate* ms, diff --git a/smallapp/unbound-checkconf.c b/smallapp/unbound-checkconf.c index 39b507499..f850469ba 100644 --- a/smallapp/unbound-checkconf.c +++ b/smallapp/unbound-checkconf.c @@ -338,6 +338,8 @@ interfacechecks(struct config_file* cfg) int i, j, i2, j2; char*** resif = NULL; int* num_resif = NULL; + char portbuf[32]; + snprintf(portbuf, sizeof(portbuf), "%d", cfg->port); if(cfg->num_ifs != 0) { resif = (char***)calloc(cfg->num_ifs, sizeof(char**)); @@ -359,9 +361,21 @@ interfacechecks(struct config_file* cfg) fatal_exit("could not resolve interface names, for %s", cfg->ifs[i]); } + /* check for port combinations that are not supported */ + if(if_is_pp2(resif[i][0], portbuf, cfg->proxy_protocol_port)) { + if(if_is_dnscrypt(resif[i][0], portbuf, + cfg->dnscrypt_port)) { + fatal_exit("PROXYv2 and DNSCrypt combination not " + "supported!"); + } else if(if_is_https(resif[i][0], portbuf, + cfg->https_port)) { + fatal_exit("PROXYv2 and DoH combination not " + "supported!"); + } + } /* search for duplicates in the returned addresses */ for(j=0; jport)) { if(strcmp(cfg->ifs[i], resif[i][j]) != 0) fatal_exit("cannot parse interface address '%s' from the interface specified as '%s'", resif[i][j], cfg->ifs[i]); diff --git a/testcode/do-tests.sh b/testcode/do-tests.sh index 1669d6c33..6599f9f66 100755 --- a/testcode/do-tests.sh +++ b/testcode/do-tests.sh @@ -16,7 +16,7 @@ NEED_WHOAMI='07-confroot.tdir' NEED_IPV6='fwd_ancil.tdir fwd_tcp_tc6.tdir stub_udp6.tdir edns_cache.tdir' NEED_NOMINGW='tcp_sigpipe.tdir 07-confroot.tdir 08-host-lib.tdir fwd_ancil.tdir' NEED_DNSCRYPT_PROXY='dnscrypt_queries.tdir dnscrypt_queries_chacha.tdir' -NEED_UNSHARE='acl_interface.tdir' +NEED_UNSHARE='acl_interface.tdir proxy_protocol.tdir' # test if dig and ldns-testns are available. test_tool_avail "dig" diff --git a/testcode/dohclient.c b/testcode/dohclient.c index 82e522f90..64af699bc 100644 --- a/testcode/dohclient.c +++ b/testcode/dohclient.c @@ -573,6 +573,7 @@ int main(int argc, char** argv) #endif checklock_start(); log_init(0, 0, 0); + log_ident_set("dohclient"); h2_session = http2_session_create(); if(!h2_session) fatal_exit("out of memory"); diff --git a/testcode/fake_event.c b/testcode/fake_event.c index c93ceaa4c..433078753 100644 --- a/testcode/fake_event.c +++ b/testcode/fake_event.c @@ -384,8 +384,8 @@ answer_callback_from_entry(struct replay_runtime* runtime, fill_buffer_with_reply(c.buffer, entry, pend->pkt, pend->pkt_len, pend->tcp_pkt_counter); repinfo.c = &c; - repinfo.addrlen = pend->addrlen; - memcpy(&repinfo.addr, &pend->addr, pend->addrlen); + repinfo.remote_addrlen = pend->addrlen; + memcpy(&repinfo.remote_addr, &pend->addr, pend->addrlen); if(!pend->serviced) { if(entry && entry->reply_list->next && pend->tcp_pkt_counter < count_reply_packets(entry)) { @@ -415,7 +415,7 @@ answer_check_it(struct replay_runtime* runtime) tr = transport_udp; if((runtime->now->addrlen == 0 || sockaddr_cmp( &runtime->now->addr, runtime->now->addrlen, - &ans->repinfo.addr, ans->repinfo.addrlen) == 0) && + &ans->repinfo.remote_addr, ans->repinfo.remote_addrlen) == 0) && find_match(runtime->now->match, ans->pkt, ans->pkt_len, tr)) { log_info("testbound matched event entry from line %d", @@ -453,10 +453,12 @@ fake_front_query(struct replay_runtime* runtime, struct replay_moment *todo) repinfo.c = (struct comm_point*)calloc(1, sizeof(struct comm_point)); if(!repinfo.c) fatal_exit("out of memory in fake_front_query"); - repinfo.addrlen = (socklen_t)sizeof(struct sockaddr_in); + repinfo.remote_addrlen = (socklen_t)sizeof(struct sockaddr_in); if(todo->addrlen != 0) { - repinfo.addrlen = todo->addrlen; - memcpy(&repinfo.addr, &todo->addr, todo->addrlen); + repinfo.remote_addrlen = todo->addrlen; + memcpy(&repinfo.remote_addr, &todo->addr, todo->addrlen); + repinfo.client_addrlen = todo->addrlen; + memcpy(&repinfo.client_addr, &todo->addr, todo->addrlen); } repinfo.c->fd = -1; repinfo.c->ev = (struct internal_event*)runtime; @@ -510,8 +512,8 @@ fake_pending_callback(struct replay_runtime* runtime, p->pkt_len, p->tcp_pkt_counter); } repinfo.c = &c; - repinfo.addrlen = p->addrlen; - memcpy(&repinfo.addr, &p->addr, p->addrlen); + repinfo.remote_addrlen = p->addrlen; + memcpy(&repinfo.remote_addr, &p->addr, p->addrlen); if(!p->serviced) { if(todo->match && todo->match->reply_list->next && !error && p->tcp_pkt_counter < count_reply_packets(todo->match)) { @@ -1665,6 +1667,7 @@ int create_udp_sock(int ATTR_UNUSED(family), int ATTR_UNUSED(socktype), struct comm_point* comm_point_create_udp(struct comm_base *ATTR_UNUSED(base), int ATTR_UNUSED(fd), sldns_buffer* ATTR_UNUSED(buffer), + int ATTR_UNUSED(pp2_enabled), comm_point_callback_type* ATTR_UNUSED(callback), void* ATTR_UNUSED(callback_arg), struct unbound_socket* ATTR_UNUSED(socket)) diff --git a/testcode/mini_tdir.sh b/testcode/mini_tdir.sh index 46914b38a..624ecdf7f 100755 --- a/testcode/mini_tdir.sh +++ b/testcode/mini_tdir.sh @@ -8,6 +8,7 @@ fi # This will keep the temporary directory around and return 1 when the test failed. DEBUG=0 +test -n "$DEBUG_TDIR" && DEBUG=1 quiet=0 if test "$1" = "-q"; then @@ -56,7 +57,7 @@ if test "$1" = "-f" && test "$2" = "report"; then fi elif test -f ".skip-$name"; then echo ".. SKIPPED.. $timelen $name: $desc" - skip=`expr $pass + 1` + skip=`expr $skip + 1` else if test -f "result.$name"; then echo "!! FAILED !! $timelen $name: $desc" @@ -92,7 +93,9 @@ if test "$1" = "report" || test "$2" = "report"; then if test -f "result.$name"; then echo "!! FAILED !! : $name" else - echo ".. SKIPPED.. : $name" + if test $quiet = 0; then + echo ".. SKIPPED.. : $name" + fi fi fi done @@ -211,7 +214,7 @@ if test $DEBUG -eq 0; then rm -rf $dir fi else - if test $success == "no"; then + if test $success = "no"; then exit 1 fi exit 0 diff --git a/testcode/streamtcp.c b/testcode/streamtcp.c index 0761e9d18..b2c0d5328 100644 --- a/testcode/streamtcp.c +++ b/testcode/streamtcp.c @@ -49,6 +49,7 @@ #include "util/locks.h" #include "util/log.h" #include "util/net_help.h" +#include "util/proxy_protocol.h" #include "util/data/msgencode.h" #include "util/data/msgparse.h" #include "util/data/msgreply.h" @@ -71,6 +72,7 @@ static void usage(char* argv[]) printf("usage: %s [options] name type class ...\n", argv[0]); printf(" sends the name-type-class queries over TCP.\n"); printf("-f server what ipaddr@portnr to send the queries to\n"); + printf("-p client what ipaddr@portnr to include in PROXYv2\n"); printf("-u use UDP. No retries are attempted.\n"); printf("-n do not wait for an answer.\n"); printf("-a print answers as they arrive.\n"); @@ -82,18 +84,17 @@ static void usage(char* argv[]) /** open TCP socket to svr */ static int -open_svr(const char* svr, int udp) +open_svr(const char* svr, int udp, struct sockaddr_storage* addr, + socklen_t* addrlen) { - struct sockaddr_storage addr; - socklen_t addrlen; int fd = -1; /* svr can be ip@port */ - memset(&addr, 0, sizeof(addr)); - if(!extstrtoaddr(svr, &addr, &addrlen, UNBOUND_DNS_PORT)) { + memset(addr, 0, sizeof(*addr)); + if(!extstrtoaddr(svr, addr, addrlen, UNBOUND_DNS_PORT)) { printf("fatal: bad server specs '%s'\n", svr); exit(1); } - fd = socket(addr_is_ip6(&addr, addrlen)?PF_INET6:PF_INET, + fd = socket(addr_is_ip6(addr, *addrlen)?PF_INET6:PF_INET, udp?SOCK_DGRAM:SOCK_STREAM, 0); if(fd == -1) { #ifndef USE_WINSOCK @@ -103,7 +104,7 @@ open_svr(const char* svr, int udp) #endif exit(1); } - if(connect(fd, (struct sockaddr*)&addr, addrlen) < 0) { + if(connect(fd, (struct sockaddr*)addr, *addrlen) < 0) { #ifndef USE_WINSOCK perror("connect() error"); #else @@ -116,11 +117,12 @@ open_svr(const char* svr, int udp) /** write a query over the TCP fd */ static void -write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id, +write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id, + sldns_buffer* proxy_buf, int pp2_parsed, const char* strname, const char* strtype, const char* strclass) { struct query_info qinfo; - uint16_t len; + size_t proxy_buf_limit = sldns_buffer_limit(proxy_buf); /* qname */ qinfo.qname = sldns_str2wire_dname(strname, &qinfo.qname_len); if(!qinfo.qname) { @@ -152,9 +154,27 @@ write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id, attach_edns_record(buf, &edns); } + /* we need to send the PROXYv2 information in every UDP message */ + if(udp && pp2_parsed) { + /* append the proxy_buf with the buf's content + * and use that for sending */ + if(sldns_buffer_capacity(proxy_buf) < + sldns_buffer_limit(proxy_buf) + + sldns_buffer_limit(buf)) { + printf("buffer too small for packet + proxy"); + exit(1); + } + sldns_buffer_clear(proxy_buf); + sldns_buffer_skip(proxy_buf, proxy_buf_limit); + sldns_buffer_write(proxy_buf, sldns_buffer_begin(buf), + sldns_buffer_limit(buf)); + sldns_buffer_flip(proxy_buf); + buf = proxy_buf; + } + /* send it */ if(!udp) { - len = (uint16_t)sldns_buffer_limit(buf); + uint16_t len = (uint16_t)sldns_buffer_limit(buf); len = htons(len); if(ssl) { if(SSL_write(ssl, (void*)&len, (int)sizeof(len)) <= 0) { @@ -167,7 +187,7 @@ write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id, #ifndef USE_WINSOCK perror("send() len failed"); #else - printf("send len: %s\n", + printf("send len: %s\n", wsa_strerror(WSAGetLastError())); #endif exit(1); @@ -182,17 +202,20 @@ write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id, } } else { if(send(fd, (void*)sldns_buffer_begin(buf), - sldns_buffer_limit(buf), 0) < + sldns_buffer_limit(buf), 0) < (ssize_t)sldns_buffer_limit(buf)) { #ifndef USE_WINSOCK perror("send() data failed"); #else - printf("send data: %s\n", wsa_strerror(WSAGetLastError())); + printf("send data: %s\n", + wsa_strerror(WSAGetLastError())); #endif exit(1); } } + /* reset the proxy_buf for next packet */ + sldns_buffer_set_limit(proxy_buf, proxy_buf_limit); free(qinfo.qname); } @@ -224,7 +247,7 @@ recv_one(int fd, int udp, SSL* ssl, sldns_buffer* buf) #ifndef USE_WINSOCK perror("read() len failed"); #else - printf("read len: %s\n", + printf("read len: %s\n", wsa_strerror(WSAGetLastError())); #endif exit(1); @@ -243,12 +266,12 @@ recv_one(int fd, int udp, SSL* ssl, sldns_buffer* buf) if(r != (int)len) fatal_exit("ssl_read %d of %d", r, len); } else { - if(recv(fd, (void*)sldns_buffer_begin(buf), len, 0) < + if(recv(fd, (void*)sldns_buffer_begin(buf), len, 0) < (ssize_t)len) { #ifndef USE_WINSOCK perror("read() data failed"); #else - printf("read data: %s\n", + printf("read data: %s\n", wsa_strerror(WSAGetLastError())); #endif exit(1); @@ -257,12 +280,12 @@ recv_one(int fd, int udp, SSL* ssl, sldns_buffer* buf) } else { ssize_t l; sldns_buffer_clear(buf); - if((l=recv(fd, (void*)sldns_buffer_begin(buf), + if((l=recv(fd, (void*)sldns_buffer_begin(buf), sldns_buffer_capacity(buf), 0)) < 0) { #ifndef USE_WINSOCK perror("read() data failed"); #else - printf("read data: %s\n", + printf("read data: %s\n", wsa_strerror(WSAGetLastError())); #endif exit(1); @@ -324,17 +347,40 @@ static int get_random(void) return (int)arc4random(); } +/* parse the pp2_client and populate the proxy_buffer + * It doesn't populate the destination parts. */ +static int parse_pp2_client(const char* pp2_client, int udp, + sldns_buffer* proxy_buf) +{ + struct sockaddr_storage pp2_addr; + socklen_t pp2_addrlen = 0; + memset(&pp2_addr, 0, sizeof(pp2_addr)); + if(*pp2_client == 0) return 0; + if(!extstrtoaddr(pp2_client, &pp2_addr, &pp2_addrlen, UNBOUND_DNS_PORT)) { + printf("fatal: bad proxy client specs '%s'\n", pp2_client); + exit(1); + } + sldns_buffer_clear(proxy_buf); + pp2_write_to_buf(proxy_buf, &pp2_addr, !udp); + sldns_buffer_flip(proxy_buf); + return 1; +} + /** send the TCP queries and print answers */ static void -send_em(const char* svr, int udp, int usessl, int noanswer, int onarrival, - int delay, int num, char** qs) +send_em(const char* svr, const char* pp2_client, int udp, int usessl, + int noanswer, int onarrival, int delay, int num, char** qs) { sldns_buffer* buf = sldns_buffer_new(65553); - int fd = open_svr(svr, udp); - int i, wait_results = 0; + sldns_buffer* proxy_buf = sldns_buffer_new(65553); + struct sockaddr_storage svr_addr; + socklen_t svr_addrlen; + int fd = open_svr(svr, udp, &svr_addr, &svr_addrlen); + int i, wait_results = 0, pp2_parsed; SSL_CTX* ctx = NULL; SSL* ssl = NULL; if(!buf) fatal_exit("out of memory"); + pp2_parsed = parse_pp2_client(pp2_client, udp, proxy_buf); if(usessl) { ctx = connect_sslctx_create(NULL, NULL, NULL, 0); if(!ctx) fatal_exit("cannot create ssl ctx"); @@ -361,6 +407,28 @@ send_em(const char* svr, int udp, int usessl, int noanswer, int onarrival, } } } + /* Send the PROXYv2 information once per stream */ + if(!udp && pp2_parsed) { + if(ssl) { + if(SSL_write(ssl, (void*)sldns_buffer_begin(proxy_buf), + (int)sldns_buffer_limit(proxy_buf)) <= 0) { + log_crypto_err("cannot SSL_write"); + exit(1); + } + } else { + if(send(fd, (void*)sldns_buffer_begin(proxy_buf), + sldns_buffer_limit(proxy_buf), 0) < + (ssize_t)sldns_buffer_limit(proxy_buf)) { +#ifndef USE_WINSOCK + perror("send() data failed"); +#else + printf("send data: %s\n", + wsa_strerror(WSAGetLastError())); +#endif + exit(1); + } + } + } for(i=0; itcp_wait_first; + struct waiting_tcp* n = NULL; + if(first) unit_assert(outnet->tcp_wait_first == first); + if(last) unit_assert(outnet->tcp_wait_last == last && !last->next_waiting); + for(i=0; w; i++) { + unit_assert(ion_tcp_waiting_list); + n = w->next_waiting; + for(j=0; n; j++) { + unit_assert(jnext_waiting; + } + w = w->next_waiting; + } +} + +/** clear the tcp waiting list */ +static void waiting_tcp_list_clear(struct outside_network* outnet) +{ + struct waiting_tcp* w = outnet->tcp_wait_first, *n = NULL; + if(!w) return; + unit_assert(outnet->tcp_wait_first); + unit_assert(outnet->tcp_wait_last); + while(w) { + n = w->next_waiting; + w->on_tcp_waiting_list = 0; + w->next_waiting = (struct waiting_tcp*)1; /* In purpose faux value */ + w = n; + } + outnet->tcp_wait_first = NULL; + outnet->tcp_wait_last = NULL; +} + +/** check removal of the waiting_tcp element on the given position of total + * elements */ +static void check_waiting_tcp_removal(int is_pop, + struct outside_network* outnet, struct waiting_tcp* store, + size_t position, size_t total) +{ + size_t i; + struct waiting_tcp* w; + waiting_tcp_list_clear(outnet); + for(i=0; itcp_wait_first; + for(i=0; inext_waiting; + } + unit_assert(w); /* please clang-analyser */ + outnet_waiting_tcp_list_remove(outnet, w); + } + unit_assert(!(w->on_tcp_waiting_list || w->next_waiting)); + + if(position == 0 && total == 1) { + /* the list should be empty */ + check_waiting_tcp_list(outnet, NULL, NULL, total-1); + } else if(position == 0) { + /* first element should be gone */ + check_waiting_tcp_list(outnet, &store[1], &store[total-1], total-1); + } else if(position == total - 1) { + /* last element should be gone */ + check_waiting_tcp_list(outnet, &store[0], &store[total-2], total-1); + } else { + /* an element should be gone */ + check_waiting_tcp_list(outnet, &store[0], &store[total-1], total-1); + } +} + +static void waiting_tcp_list_test(void) +{ + size_t i = 0; + struct outside_network outnet; + struct waiting_tcp* w, *t = NULL; + struct waiting_tcp store[MAX_TCP_WAITING_NODES]; + memset(&outnet, 0, sizeof(outnet)); + memset(&store, 0, sizeof(store)); + + /* Check add first on empty list */ + unit_show_func("services/outside_network.c", "outnet_waiting_tcp_list_add_first"); + t = &store[i]; + outnet_waiting_tcp_list_add_first(&outnet, t, 0); + check_waiting_tcp_list(&outnet, t, t, 1); + + /* Check add */ + unit_show_func("services/outside_network.c", "outnet_waiting_tcp_list_add"); + for(i=1; iwrite_wait_first; + struct waiting_tcp* n = NULL; + if(first) unit_assert(reuse->write_wait_first == first && !first->write_wait_prev); + if(last) unit_assert(reuse->write_wait_last == last && !last->write_wait_next); + /* check one way */ + for(i=0; w; i++) { + unit_assert(iwrite_wait_queued); + n = w->write_wait_next; + for(j=0; n; j++) { + unit_assert(jwrite_wait_next; + } + w = w->write_wait_next; + } + /* check the other way */ + w = reuse->write_wait_last; + for(i=0; w; i++) { + unit_assert(iwrite_wait_queued); + n = w->write_wait_prev; + for(j=0; n; j++) { + unit_assert(jwrite_wait_prev; + } + w = w->write_wait_prev; + } +} + +/** clear the tcp waiting list */ +static void reuse_write_wait_clear(struct reuse_tcp* reuse) +{ + struct waiting_tcp* w = reuse->write_wait_first, *n = NULL; + if(!w) return; + unit_assert(reuse->write_wait_first); + unit_assert(reuse->write_wait_last); + while(w) { + n = w->write_wait_next; + w->write_wait_queued = 0; + w->write_wait_next = (struct waiting_tcp*)1; /* In purpose faux value */ + w->write_wait_prev = (struct waiting_tcp*)1; /* In purpose faux value */ + w = n; + } + reuse->write_wait_first = NULL; + reuse->write_wait_last = NULL; +} + +/** check removal of the reuse_write_wait element on the given position of total + * elements */ +static void check_reuse_write_wait_removal(int is_pop, + struct reuse_tcp* reuse, struct waiting_tcp* store, + size_t position, size_t total) +{ + size_t i; + struct waiting_tcp* w; + reuse_write_wait_clear(reuse); + for(i=0; iwrite_wait_first; + for(i=0; iwrite_wait_next; + reuse_write_wait_remove(reuse, w); + } + unit_assert(!(w->write_wait_queued || w->write_wait_next || w->write_wait_prev)); + + if(position == 0 && total == 1) { + /* the list should be empty */ + check_reuse_write_wait(reuse, NULL, NULL, total-1); + } else if(position == 0) { + /* first element should be gone */ + check_reuse_write_wait(reuse, &store[1], &store[total-1], total-1); + } else if(position == total - 1) { + /* last element should be gone */ + check_reuse_write_wait(reuse, &store[0], &store[total-2], total-1); + } else { + /* an element should be gone */ + check_reuse_write_wait(reuse, &store[0], &store[total-1], total-1); + } +} + +static void reuse_write_wait_test(void) +{ + size_t i; + struct reuse_tcp reuse; + struct waiting_tcp store[MAX_TCP_WAITING_NODES]; + struct waiting_tcp* w; + memset(&reuse, 0, sizeof(reuse)); + memset(&store, 0, sizeof(store)); + + /* Check adding */ + unit_show_func("services/outside_network.c", "reuse_write_wait_push_back"); + for(i=0; i/dev/null 2>&1; then + if grep "define USE_CACHEDB 1" $PRE/config.h >/dev/null 2>&1; then + : # CACHEDB is supported + else + continue + fi + fi + if test $do_valgrind = "yes"; then echo if (valgrind $VALGRIND_FLAGS $PRE/testbound -p $input >tmpout 2>&1;); then diff --git a/testdata/04-checkconf.tdir/04-checkconf.test b/testdata/04-checkconf.tdir/04-checkconf.test index a2396fef7..339e346d9 100644 --- a/testdata/04-checkconf.tdir/04-checkconf.test +++ b/testdata/04-checkconf.tdir/04-checkconf.test @@ -28,6 +28,12 @@ if grep "define UB_ON_WINDOWS 1" ../../config.h; then else onwin=0 fi +# detect dnscrypt +if grep "define USE_DNSCRYPT 1" ../../config.h; then + with_dnscrypt=1 +else + with_dnscrypt=0 +fi # test check of config files. for f in bad.*; do @@ -37,6 +43,10 @@ for f in bad.*; do echo "skipped on windows" continue fi + if test $f = "bad.proxy-and-dnscrypt" -a $with_dnscrypt -eq 0; then + echo "skipped; no DNSCRYPT support" + continue + fi $PRE/unbound-checkconf $f if test $? != 1; then diff --git a/testdata/04-checkconf.tdir/bad.proxy-and-dnscrypt b/testdata/04-checkconf.tdir/bad.proxy-and-dnscrypt new file mode 100644 index 000000000..f62f7868c --- /dev/null +++ b/testdata/04-checkconf.tdir/bad.proxy-and-dnscrypt @@ -0,0 +1,6 @@ +server: + interface: 127.0.0.1 + proxy-protocol-port: 53 +dnscrypt: + dnscrypt-enable: yes + dnscrypt-port: 53 diff --git a/testdata/04-checkconf.tdir/bad.proxy-and-https b/testdata/04-checkconf.tdir/bad.proxy-and-https new file mode 100644 index 000000000..d27373ce0 --- /dev/null +++ b/testdata/04-checkconf.tdir/bad.proxy-and-https @@ -0,0 +1,4 @@ +server: + interface: 127.0.0.1 + proxy-protocol-port: 53 + https-port: 53 diff --git a/testdata/acl_interface.tdir/acl_interface.dsc b/testdata/acl_interface.tdir/acl_interface.dsc index 3e5e94de8..cfe5c3cf5 100644 --- a/testdata/acl_interface.tdir/acl_interface.dsc +++ b/testdata/acl_interface.tdir/acl_interface.dsc @@ -9,7 +9,7 @@ CmdDepends: Depends: Help: Pre: acl_interface.pre -Post: +Post: acl_interface.post Test: acl_interface.test AuxFiles: Passed: diff --git a/testdata/acl_interface.tdir/acl_interface.post b/testdata/acl_interface.tdir/acl_interface.post new file mode 100644 index 000000000..982e2b895 --- /dev/null +++ b/testdata/acl_interface.tdir/acl_interface.post @@ -0,0 +1,11 @@ +# #-- acl_interface.post --# +# source the master var file when it's there +[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master +# source the test var file when it's there +[ -f .tpkg.var.test ] && source .tpkg.var.test +# +# do your teardown here +. ../common.sh +kill_pid $UNBOUND_PID +kill_pid $FWD_PID +kill_pid $STUB_PID diff --git a/testdata/cachedb_servfail_cname.crpl b/testdata/cachedb_servfail_cname.crpl new file mode 100644 index 000000000..221f00d4d --- /dev/null +++ b/testdata/cachedb_servfail_cname.crpl @@ -0,0 +1,181 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + qname-minimisation: no + minimal-responses: no + ;serve-expired: yes + module-config: "cachedb iterator" + +cachedb: + backend: "testframe" + secret-seed: "testvalue" + +stub-zone: + name: "." + stub-addr: 193.0.14.129 +CONFIG_END + +SCENARIO_BEGIN Test cachedb store and servfail reply from cname. +; the servfail reply should not overwrite the cache contents. + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns2.example.com. +SECTION ADDITIONAL +ns2.example.com. IN A 1.2.3.5 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +foo.com. IN NS +SECTION AUTHORITY +foo.com. IN NS ns.example.com. +ENTRY_END +RANGE_END + +; ns2.example.com. +RANGE_BEGIN 0 20 + ADDRESS 1.2.3.5 +ENTRY_BEGIN +MATCH opcode qname qtype +REPLY QR AA NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. 10 IN A 1.2.3.4 +ENTRY_END +RANGE_END + +; ns2.example.com., now failing +RANGE_BEGIN 20 100 + ADDRESS 1.2.3.5 +ENTRY_BEGIN +MATCH opcode qname qtype +REPLY QR AA NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. 10 IN CNAME foo.example.com. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qname qtype +REPLY QR AA SERVFAIL +SECTION QUESTION +foo.example.com. IN A +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qname qtype +REPLY QR AA SERVFAIL +SECTION QUESTION +ns2.example.com. IN A +SECTION ANSWER +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qname qtype +REPLY QR AA SERVFAIL +SECTION QUESTION +ns2.example.com. IN AAAA +SECTION ANSWER +ENTRY_END +RANGE_END + +; get and entry in cache, to make it expired. +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; get the answer for it +STEP 10 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. 10 IN A 1.2.3.4 +ENTRY_END + +; it is now expired +STEP 20 TIME_PASSES ELAPSE 20 + +; get a servfail in cache for the destination +STEP 30 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +foo.example.com. IN A +ENTRY_END + +STEP 40 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA SERVFAIL +SECTION QUESTION +foo.example.com. IN A +ENTRY_END + +; the query is now a CNAME to servfail. +; there is a valid, but expired, entry in cache. +STEP 50 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +STEP 60 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. 10 IN CNAME foo.example.com. +ENTRY_END + +SCENARIO_END diff --git a/testdata/ede.tdir/bogus/clean.sh b/testdata/ede.tdir/bogus/clean.sh deleted file mode 100755 index 54128f807..000000000 --- a/testdata/ede.tdir/bogus/clean.sh +++ /dev/null @@ -1 +0,0 @@ -rm -f K* piece1 base expired notyetincepted trust-anchors dnssec-failures.test.signed dnskey-failures.test.signed nsec-failures.test.signed rrsig-failures.test.signed diff --git a/testdata/ede.tdir/bogus/dnskey-failures.test.signed b/testdata/ede.tdir/bogus/dnskey-failures.test.signed new file mode 100644 index 000000000..69bfde48b --- /dev/null +++ b/testdata/ede.tdir/bogus/dnskey-failures.test.signed @@ -0,0 +1,7 @@ +dnskey-failures.test. 3600 IN SOA ns.dnskey-failures.test. hostmaster.dnskey-failures.test. 1 14400 1800 2419200 300 +dnskey-failures.test. 3600 IN RRSIG SOA 13 2 3600 20010201000000 20001230000000 45928 dnskey-failures.test. NKixvGKa0WHSI8oE5THI1hjm5nExVkryUmW15VoNZ3pwqUYexGWLIlfuYsTaDE5GVEtPpSKbA+PlYDk19EsLNQ== +dnskey-failures.test. 3600 IN A 192.0.2.1 +dnskey-failures.test. 3600 IN RRSIG A 13 2 3600 20010201000000 20001230000000 45928 dnskey-failures.test. FCEvbVL3TkzO7jWeOz7E/A3Q64QkpegVazS4OL+ybxN2o8OzXdCJN3QbCGdFP26/Rbj089ThDCZ0+OormAk1dw== +dnskey-failures.test. 3600 IN RRSIG DNSKEY 13 2 3600 20010201000000 20001230000000 45928 dnskey-failures.test. pEjWVsJbFiQBvwNGV3v0nVirMJDOYKXqC4IX9dFuRTnoWSb95anvB08pgaZ1ie+thk6YC1fX2fUTRKRFr3vHnA== +dnskey-failures.test. 300 IN NSEC dnskey-failures.test. A SOA RRSIG NSEC DNSKEY +dnskey-failures.test. 300 IN RRSIG NSEC 13 2 300 20010201000000 20001230000000 45928 dnskey-failures.test. /vAazBDetA5+np+fE7V6f9W+faEQT3ETGueNNhFPjUsPF1dU9Gglu4PZ15fWOxsk0DPWHNmTMF70ZCGQJ2k+fw== diff --git a/testdata/ede.tdir/bogus/dnssec-failures.test.signed b/testdata/ede.tdir/bogus/dnssec-failures.test.signed new file mode 100644 index 000000000..ed8f5d9d9 --- /dev/null +++ b/testdata/ede.tdir/bogus/dnssec-failures.test.signed @@ -0,0 +1,25 @@ +dnssec-failures.test. 3600 IN SOA ns.dnssec-failures.test. hostmaster.dnssec-failures.test. 1 14400 1800 2419200 300 +dnssec-failures.test. 3600 IN RRSIG SOA 13 2 3600 20010201000000 20001230000000 53876 dnssec-failures.test. K37BIR/jLR4tN1JtTx3MwzgozslvnFtwUquCSfiBykCcKIv6wErSI9Gnw/tjH0tXrLI1eoLa5oWkgtxy0KKybg== +dnssec-failures.test. 3600 IN NS ns.dnssec-failures.test. +dnssec-failures.test. 3600 IN RRSIG NS 13 2 3600 20010201000000 20001230000000 53876 dnssec-failures.test. JP6mYQORwnwwv+2q9UxpeeaVs5/171y3lyc1FKAY3FHmFqjd4Uo0byW8jgk/BrJyVkaDeZbjvuZq+BED0codpw== +dnssec-failures.test. 3600 IN DNSKEY 257 3 13 mx6xe39HZrYCpyC+9YmquHIf1WdWYaDqOfcpXg2Gtv5VJGS/WSO14txlUoKjYCldyRwcg9wT6JAwikpkzWS6UQ== ;{id = 53876 (ksk), size = 256b} +dnssec-failures.test. 3600 IN RRSIG DNSKEY 13 2 3600 20010201000000 20001230000000 53876 dnssec-failures.test. F760TrogHIBkenX7nGr6LEvocTcGAZamfAaiftIkwprBp21/LZ+qotGsFu9YWsxlGqB3KAINXYATjS6AEJfGEQ== +dnssec-failures.test. 300 IN NSEC expired.dnssec-failures.test. NS SOA RRSIG NSEC DNSKEY +dnssec-failures.test. 300 IN RRSIG NSEC 13 2 300 20010201000000 20001230000000 53876 dnssec-failures.test. Zk+RW0mbLSzwvSYuNQJhNdd4XmtQv47CiLtHbqOyS8/xt5Pt87T0v1UxnCkZAlA+VTEWbJkasq06ER1wMuTetA== +expired.dnssec-failures.test. 300 IN RRSIG NSEC 13 3 300 20010201000000 20001230000000 53876 dnssec-failures.test. UAhzOVumQZ2PVspwJS5NyOjZypIaQXfHMiXGEUYaZ161IfQdB3coBx2vF8MHdqbePOl6Z4oa51ltITMlBL+Stw== +missingrrsigs.dnssec-failures.test. 3600 IN TXT "Signatures missing" +missingrrsigs.dnssec-failures.test. 300 IN NSEC notyetincepted.dnssec-failures.test. TXT RRSIG NSEC +missingrrsigs.dnssec-failures.test. 300 IN RRSIG NSEC 13 3 300 20010201000000 20001230000000 53876 dnssec-failures.test. 4phKld6eMt4cxA4w6I1i29uAbdfbwFrkpRGLBWwerUgDbOdDwUm1de6t4QhBys7DtoZb3wIS+DLJYjBNbz7Sig== +notyetincepted.dnssec-failures.test. 300 IN RRSIG NSEC 13 3 300 20010201000000 20001230000000 53876 dnssec-failures.test. ix6Gg9uUZ0A56IQXbDJuBQ3vIm6QipuvzQTKd2wF6kZuEW/53wuy4ROBDIQ4IgnQD17vG8tJNeDOCfj0hh8+dQ== +ns.dnssec-failures.test. 3600 IN A 192.0.2.1 +ns.dnssec-failures.test. 3600 IN RRSIG A 13 3 3600 20010201000000 20001230000000 53876 dnssec-failures.test. PbcykgJEHG218vCkj9pD8W5JVqyCD9VRNOy3SHqCTvWGVAApasdZ7n5wzNVpHdKrqlTpyLwf6z6vv4NMYbEQdw== +ns.dnssec-failures.test. 300 IN NSEC sigsinvalid.dnssec-failures.test. A RRSIG NSEC +ns.dnssec-failures.test. 300 IN RRSIG NSEC 13 3 300 20010201000000 20001230000000 53876 dnssec-failures.test. SEO+C116gcmI0sY4lnIM4DQrUxqyaGIIqlvhxyGrzF9jJopRZB8gflQcYPy5qhIwGZJoEMB+SO4er4LCaS8NwA== +sigsinvalid.dnssec-failures.test. 3600 IN TXT "Signatures INVALID" +sigsinvalid.dnssec-failures.test. 3600 IN RRSIG TXT 13 3 3600 20010201000000 20001230000000 53876 dnssec-failures.test. 3XFjjPt+UyY4ZIj8PAINTtOTh7sk4OIAO5akFDQhqgB/Wv6f7dWdqvl8Y2RIqdh0WQz+nGPRMktS8exA3FKW4Q== +sigsinvalid.dnssec-failures.test. 300 IN NSEC dnssec-failures.test. TXT RRSIG NSEC +sigsinvalid.dnssec-failures.test. 300 IN RRSIG NSEC 13 3 300 20010201000000 20001230000000 53876 dnssec-failures.test. gmft6HYmqZalLwmdnuWBqJod3JD5fRoGqiwYXVFxySm2bHPvz8J9xSe7RdTSONXPUc+7mE8IHYff/gGW7gctqw== +expired.dnssec-failures.test. 3600 IN TXT "Expired" +expired.dnssec-failures.test. 3600 IN RRSIG TXT 13 3 3600 20001230000000 20001201000000 53876 dnssec-failures.test. 8zosYGmmGGcGcBuWaf3oL3TE/hpKDrddtm7ZQGndjmqkZ8CVg6RwFb+8YLqcG5du3Si0rmTuZId+qBOV/pnViA== +notyetincepted.dnssec-failures.test. 3600 IN TXT "Not yet incepted" +notyetincepted.dnssec-failures.test. 3600 IN RRSIG TXT 13 3 3600 20010201000000 20010103000000 53876 dnssec-failures.test. lmk0+oEdnnKa1oujIsMeimuElrKvrUSlBknsfSNqOo07VxJxT2R4qkKc95oiEmeSWHcVTOrXxEhtl4kAAactPg== diff --git a/testdata/ede.tdir/bogus/make-broken-zone.sh b/testdata/ede.tdir/bogus/make-broken-zone.sh index 67b4fcfb2..f93df3978 100755 --- a/testdata/ede.tdir/bogus/make-broken-zone.sh +++ b/testdata/ede.tdir/bogus/make-broken-zone.sh @@ -1,21 +1,28 @@ #!/usr/bin/env bash -# create oudated zones -CSK=`ldns-keygen -a ECDSAP256SHA256 -k -r /dev/urandom dnssec-failures.test` -echo $CSK +# This script was used to generate the broken signed zones used for testing. -echo ". IN DS 20326 8 2 e06d44b80b8f1d39a95c0b0d7c65d08458e880409bbc683457104237c7f8ec8d" | \ - cat $CSK.ds - > bogus/trust-anchors +# Override the current date; it is used in Unbound's configuration also. +NOW=20010101 # differentiate for MacOS with "gdate" DATE=date which gdate > /dev/null 2>&1 && DATE=gdate -ONEMONTHAGO=`$DATE -d 'now - 1 month' +%Y%m%d` -YESTERDAY=`$DATE -d 'now - 2 days' +%Y%m%d` -TOMORROW=`$DATE -d 'now + 2 days' +%Y%m%d` +ONEMONTHAGO=`$DATE -d "$NOW - 1 month" +%Y%m%d` +ONEMONTH=`$DATE -d "$NOW + 1 month" +%Y%m%d` +YESTERDAY=`$DATE -d "$NOW - 2 days" +%Y%m%d` +TOMORROW=`$DATE -d "$NOW + 2 days" +%Y%m%d` -ldns-signzone -i $YESTERDAY -f - bogus/dnssec-failures.test $CSK | \ +# Root trust anchor +echo ". IN DS 20326 8 2 e06d44b80b8f1d39a95c0b0d7c65d08458e880409bbc683457104237c7f8ec8d" > bogus/trust-anchors + +# create oudated zones +CSK=`ldns-keygen -a ECDSAP256SHA256 -k -r /dev/urandom dnssec-failures.test` +echo $CSK +cat $CSK.ds >> bogus/trust-anchors + +ldns-signzone -i $YESTERDAY -e $ONEMONTH -f - bogus/dnssec-failures.test $CSK | \ grep -v '^missingrrsigs\.dnssec-failures\.test\..*IN.*RRSIG.*TXT' | \ sed 's/Signatures invalid/Signatures INVALID/g' | \ grep -v '^notyetincepted\.dnssec-failures\.test\..*IN.*TXT' | \ @@ -25,7 +32,7 @@ ldns-signzone -i $YESTERDAY -f - bogus/dnssec-failures.test $CSK | \ ldns-signzone -i $ONEMONTHAGO -e $YESTERDAY -f - bogus/dnssec-failures.test $CSK | \ grep -v '[ ]NSEC[ ]' | \ grep '^expired\.dnssec-failures\.test\..*IN.*TXT' > expired -ldns-signzone -i $TOMORROW -f - bogus/dnssec-failures.test $CSK | \ +ldns-signzone -i $TOMORROW -e $ONEMONTH -f - bogus/dnssec-failures.test $CSK | \ grep -v '[ ]NSEC[ ]' | \ grep '^notyetincepted\.dnssec-failures\.test\..*IN.*TXT' > notyetincepted @@ -33,34 +40,35 @@ cat base expired notyetincepted > bogus/dnssec-failures.test.signed # cleanup old zone keys rm -f $CSK.* + # create zone with DNSKEY missing CSK=`ldns-keygen -a ECDSAP256SHA256 -k -r /dev/urandom dnskey-failures.test` echo $CSK cat $CSK.ds >> bogus/trust-anchors -ldns-signzone -f tmp.signed bogus/dnskey-failures.test $CSK +ldns-signzone -i $YESTERDAY -e $ONEMONTH -f tmp.signed bogus/dnskey-failures.test $CSK grep -v ' DNSKEY ' tmp.signed > bogus/dnskey-failures.test.signed - # cleanup old zone keys rm -f $CSK.* + # create zone with NSEC missing CSK=`ldns-keygen -a ECDSAP256SHA256 -k -r /dev/urandom nsec-failures.test` echo $CSK cat $CSK.ds >> bogus/trust-anchors -ldns-signzone -f tmp.signed bogus/nsec-failures.test $CSK +ldns-signzone -i $YESTERDAY -e $ONEMONTH -f tmp.signed bogus/nsec-failures.test $CSK grep -v ' NSEC ' tmp.signed > bogus/nsec-failures.test.signed - # cleanup old zone keys rm -f $CSK.* + # create zone with RRSIGs missing CSK=`ldns-keygen -a ECDSAP256SHA256 -k -r /dev/urandom rrsig-failures.test` echo $CSK cat $CSK.ds >> bogus/trust-anchors -ldns-signzone -f tmp.signed bogus/rrsig-failures.test $CSK +ldns-signzone -i $YESTERDAY -e $ONEMONTH -f tmp.signed bogus/rrsig-failures.test $CSK grep -v ' RRSIG ' tmp.signed > bogus/rrsig-failures.test.signed # cleanup diff --git a/testdata/ede.tdir/bogus/nsec-failures.test.signed b/testdata/ede.tdir/bogus/nsec-failures.test.signed new file mode 100644 index 000000000..b63138613 --- /dev/null +++ b/testdata/ede.tdir/bogus/nsec-failures.test.signed @@ -0,0 +1,7 @@ +nsec-failures.test. 3600 IN SOA ns.nsec-failures.test. hostmaster.nsec-failures.test. 1 14400 1800 2419200 300 +nsec-failures.test. 3600 IN RRSIG SOA 13 2 3600 20010201000000 20001230000000 12342 nsec-failures.test. ZdnRF2uI0IDJsHTXsd4TclX9gUEkxjp19LykHuI3DaCKe3bY8uTETta8i73hlKWJWeRjmgQojIsi9tBlivOwjQ== +nsec-failures.test. 3600 IN A 192.0.2.1 +nsec-failures.test. 3600 IN RRSIG A 13 2 3600 20010201000000 20001230000000 12342 nsec-failures.test. /JccCtWkuQgSF81gv6DPsxaicmlJoGAhVpCpR4JGgVz3tZMhIp+iXUGeI+CkBofw9G/MK66Hk937JRmMh9UTvQ== +nsec-failures.test. 3600 IN DNSKEY 257 3 13 41tJnzHY0o3WKid0ZsIo6S5SJdC1JiW0H/KizsAD2phHdi1AIDiBclL+nG2lKvPjMoX2hcMfd8h9DfU99HR3kg== ;{id = 12342 (ksk), size = 256b} +nsec-failures.test. 3600 IN RRSIG DNSKEY 13 2 3600 20010201000000 20001230000000 12342 nsec-failures.test. Y23xTzxdqQBjFsWLlqCRgPKT7raPcP0lAy2tR8trW5+vUAhBePXdVixp4AjoxEqXsLLalAtnJnc4QgH7+HO6PA== +nsec-failures.test. 300 IN RRSIG NSEC 13 2 300 20010201000000 20001230000000 12342 nsec-failures.test. KfpncqGIzIPNB2ExkH22/z0jAPmq8jTTjDkLte29iKqR9t3bSZlcS0MQ2QB7Z6tgks8fo7Zpc9+BvaDq7Y6ONg== diff --git a/testdata/ede.tdir/bogus/rrsig-failures.test.signed b/testdata/ede.tdir/bogus/rrsig-failures.test.signed new file mode 100644 index 000000000..222bdc0c6 --- /dev/null +++ b/testdata/ede.tdir/bogus/rrsig-failures.test.signed @@ -0,0 +1,4 @@ +rrsig-failures.test. 3600 IN SOA ns.rrsig-failures.test. hostmaster.rrsig-failures.test. 1 14400 1800 2419200 300 +rrsig-failures.test. 3600 IN A 192.0.2.1 +rrsig-failures.test. 3600 IN DNSKEY 257 3 13 rIMJ4/qnOb91GuxKzAYiCdPNdEtUhyt+mi1Jz+NPP0rJQdGOhXr37LpctEiKK4isabCXcwYlVtFdDPopa4RufA== ;{id = 13838 (ksk), size = 256b} +rrsig-failures.test. 300 IN NSEC rrsig-failures.test. A SOA RRSIG NSEC DNSKEY diff --git a/testdata/ede.tdir/bogus/trust-anchors b/testdata/ede.tdir/bogus/trust-anchors new file mode 100644 index 000000000..bd20c8702 --- /dev/null +++ b/testdata/ede.tdir/bogus/trust-anchors @@ -0,0 +1,5 @@ +. IN DS 20326 8 2 e06d44b80b8f1d39a95c0b0d7c65d08458e880409bbc683457104237c7f8ec8d +dnssec-failures.test. IN DS 53876 13 2 e0207223d847e0d8f3bd2afcf887f727178777a94563b94e1d0be8ca2f070d9a +dnskey-failures.test. IN DS 45928 13 2 9295d5c0d9296599809ce968f994a974d4da7752266ee124ead4ce980c006c20 +nsec-failures.test. IN DS 12342 13 2 b0a994fe4ff12a706b2a47a794601b254a8d28e040832ad6e39e96dbf7736ca2 +rrsig-failures.test. IN DS 13838 13 2 b083d59d2e7ac370e1103bc5ada2a921e4e65745ea8550350b6fcb57eba9f917 diff --git a/testdata/ede.tdir/ede.conf b/testdata/ede.tdir/ede.conf index 13730d42f..639899d13 100644 --- a/testdata/ede.tdir/ede.conf +++ b/testdata/ede.tdir/ede.conf @@ -11,6 +11,7 @@ server: val-log-level: 2 trust-anchor-file: "bogus/trust-anchors" + val-override-date: "20010101020202" module-config: "respip validator iterator" diff --git a/testdata/ede.tdir/ede.pre b/testdata/ede.tdir/ede.pre index e5a0667b0..57e15cc5a 100644 --- a/testdata/ede.tdir/ede.pre +++ b/testdata/ede.tdir/ede.pre @@ -4,7 +4,9 @@ # use .tpkg.var.test for in test variable passing [ -f .tpkg.var.test ] && source .tpkg.var.test +PRE="../.." . ../common.sh + get_random_port 2 UNBOUND_PORT=$RND_PORT UNBOUND_PORT2=$(($RND_PORT + 1)) @@ -16,11 +18,7 @@ sed -e 's/@PORT\@/'$UNBOUND_PORT'/' < ede.conf > temp.conf sed -e 's/@PORT2\@/'$UNBOUND_PORT2'/' < temp.conf > ub.conf sed -e 's/@PORT2\@/'$UNBOUND_PORT2'/' < ede-auth.conf > ub2.conf -# create broken dnssec zone -bogus/make-broken-zone.sh - # start unbound in the background -PRE="../.." $PRE/unbound -d -c ub.conf > unbound.log 2>&1 & UNBOUND_PID=$! echo "UNBOUND_PID=$UNBOUND_PID" >> .tpkg.var.test @@ -30,8 +28,6 @@ $PRE/unbound -d -c ub2.conf > unbound2.log 2>&1 & UNBOUND_PID2=$! echo "UNBOUND_PID2=$UNBOUND_PID2" >> .tpkg.var.test - cat .tpkg.var.test wait_unbound_up unbound.log wait_unbound_up unbound2.log - diff --git a/testdata/fetch_glue.rpl b/testdata/fetch_glue.rpl index 3e9f64f8d..8860d85b0 100644 --- a/testdata/fetch_glue.rpl +++ b/testdata/fetch_glue.rpl @@ -176,36 +176,7 @@ SECTION ADDITIONAL ns.example.com. IN A 1.2.3.4 ENTRY_END -; due to ordering of answer packets, this is still outstanding, remove it -STEP 21 CHECK_OUT_QUERY -ENTRY_BEGIN -ADJUST copy_id -MATCH qname qtype -REPLY QR -SECTION QUESTION -ns.example.com IN AAAA -ENTRY_END - -; some more recursion needed. -; to finish the NS query -STEP 40 QUERY -ENTRY_BEGIN -REPLY RD -SECTION QUESTION -. IN NS -ENTRY_END - -STEP 41 CHECK_ANSWER -ENTRY_BEGIN -MATCH all -REPLY QR RD RA NOERROR -SECTION QUESTION -. IN NS -SECTION ANSWER -. IN NS K.ROOT-SERVERS.NET. -SECTION AUTHORITY -SECTION ADDITIONAL -K.ROOT-SERVERS.NET. IN A 193.0.14.129 -ENTRY_END +; let (possible) outstanding queries finish resolving +STEP 21 TRAFFIC SCENARIO_END diff --git a/testdata/fetch_glue_cname.rpl b/testdata/fetch_glue_cname.rpl index 4a86afa50..64f00fb20 100644 --- a/testdata/fetch_glue_cname.rpl +++ b/testdata/fetch_glue_cname.rpl @@ -155,7 +155,7 @@ ENTRY_END ENTRY_BEGIN MATCH opcode qtype qname ADJUST copy_id -REPLY QR NOERROR +REPLY QR AA NOERROR SECTION QUESTION ns.example.com. IN AAAA SECTION AUTHORITY @@ -188,36 +188,7 @@ SECTION ADDITIONAL ns.example.com. IN A 1.2.3.4 ENTRY_END -; due to ordering of answer packets, this is still outstanding, remove it -STEP 21 CHECK_OUT_QUERY -ENTRY_BEGIN -ADJUST copy_id -MATCH qname qtype -REPLY QR -SECTION QUESTION -ns.example.com IN AAAA -ENTRY_END - -; some more recursion needed. -; to finish the NS query -STEP 40 QUERY -ENTRY_BEGIN -REPLY RD -SECTION QUESTION -. IN NS -ENTRY_END - -STEP 41 CHECK_ANSWER -ENTRY_BEGIN -MATCH all -REPLY QR RD RA NOERROR -SECTION QUESTION -. IN NS -SECTION ANSWER -. IN NS K.ROOT-SERVERS.NET. -SECTION AUTHORITY -SECTION ADDITIONAL -K.ROOT-SERVERS.NET. IN A 193.0.14.129 -ENTRY_END +; let (possible) outstanding queries finish resolving +STEP 21 TRAFFIC SCENARIO_END diff --git a/testdata/iter_auth_tc.rpl b/testdata/iter_auth_tc.rpl new file mode 100644 index 000000000..417807724 --- /dev/null +++ b/testdata/iter_auth_tc.rpl @@ -0,0 +1,138 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + qname-minimisation: "no" + minimal-responses: no + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authoritative response with erroneous TC flag + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.4 +ENTRY_END +RANGE_END + +; ns.example.com. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.4 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.com. +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.4 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +ns.example.com. IN A +SECTION ANSWER +ns.example.com. IN A 1.2.3.4 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +ns.example.com. IN AAAA +SECTION ANSWER +SECTION AUTHORITY +example.com. IN NS ns.example.com. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +; erroneous TC flag here +REPLY QR TC NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +SECTION AUTHORITY +example.com. IN NS ns.example.com. +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.4 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 10 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +SCENARIO_END diff --git a/testdata/iter_emptydp_for_glue.rpl b/testdata/iter_emptydp_for_glue.rpl index 2e7db65e1..68fad6f15 100644 --- a/testdata/iter_emptydp_for_glue.rpl +++ b/testdata/iter_emptydp_for_glue.rpl @@ -164,11 +164,11 @@ a.gtld-servers.net. IN A 192.5.6.30 ENTRY_END ENTRY_BEGIN -MATCH opcode qname +MATCH opcode subdomain ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION -ns.example.org. IN A +example.org. IN A SECTION AUTHORITY example.org. NS ns.example.net. example.org. NS ns.example.org. diff --git a/testdata/iter_recurse.rpl b/testdata/iter_recurse.rpl index 181af1107..be50b4af8 100644 --- a/testdata/iter_recurse.rpl +++ b/testdata/iter_recurse.rpl @@ -216,14 +216,7 @@ example.com. IN NS ns.example.net. ;ns.example.net IN A 1.2.3.44 ENTRY_END -; due to ordering of answer packets, this is still outstanding, remove it -STEP 21 CHECK_OUT_QUERY -ENTRY_BEGIN -ADJUST copy_id -MATCH qname qtype -REPLY QR -SECTION QUESTION -ns.example.net IN AAAA -ENTRY_END +; let (possible) outstanding queries finish resolving +STEP 21 TRAFFIC SCENARIO_END diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.conf b/testdata/proxy_protocol.tdir/proxy_protocol.conf new file mode 100644 index 000000000..c5fa0ab33 --- /dev/null +++ b/testdata/proxy_protocol.tdir/proxy_protocol.conf @@ -0,0 +1,34 @@ +server: + verbosity: 5 + num-threads: 1 + interface: 127.0.0.1@@PORT@ + interface: 127.0.0.1@@PROXYPORT@ + interface: 127.0.0.1@@PROXYTLSPORT@ + interface: @INTERFACE_ALLOW_ADDR@@@PORT@ + interface: @INTERFACE_ALLOW_ADDR@@@PROXYPORT@ + interface: @INTERFACE_ALLOW_ADDR@@@PROXYTLSPORT@ + interface: @INTERFACE_REFUSE_ADDR@@@PORT@ + interface: @INTERFACE_REFUSE_ADDR@@@PROXYPORT@ + interface: @INTERFACE_REFUSE_ADDR@@@PROXYTLSPORT@ + proxy-protocol-port: @PROXYPORT@ + proxy-protocol-port: @PROXYTLSPORT@ + tls-port: @PROXYTLSPORT@ + use-syslog: no + directory: . + pidfile: "unbound.pid" + chroot: "" + username: "" + do-not-query-localhost: no + tls-service-key: "unbound_server.key" + tls-service-pem: "unbound_server.pem" + + # 127.0.0.0/8 is allowed by default. + access-control: @CLIENT_ADDR_ALLOW@/32 allow + access-control: @CLIENT_ADDR_REFUSE@/32 refuse + access-control: @CLIENT_ADDR_ALLOW6@/128 allow + access-control: @CLIENT_ADDR_REFUSE6@/128 refuse + access-control: @INTERFACE_ALLOW_ADDR@/32 allow + +forward-zone: + name: "." + forward-addr: "127.0.0.1@@TOPORT@" diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.dsc b/testdata/proxy_protocol.tdir/proxy_protocol.dsc new file mode 100644 index 000000000..34155f035 --- /dev/null +++ b/testdata/proxy_protocol.tdir/proxy_protocol.dsc @@ -0,0 +1,16 @@ +BaseName: proxy_protocol +Version: 1.0 +Description: Test proxy protocol +CreationDate: Mon Mar 14 16:17:00 CET 2022 +Maintainer: Yorgos Thessalonikefs +Category: +Component: +CmdDepends: +Depends: +Help: +Pre: proxy_protocol.pre +Post: proxy_protocol.post +Test: proxy_protocol.test +AuxFiles: +Passed: +Failure: diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.post b/testdata/proxy_protocol.tdir/proxy_protocol.post new file mode 100644 index 000000000..cbf56bbd9 --- /dev/null +++ b/testdata/proxy_protocol.tdir/proxy_protocol.post @@ -0,0 +1,12 @@ +# #-- proxy_protocol.post --# +# source the master var file when it's there +[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master +# source the test var file when it's there +[ -f .tpkg.var.test ] && source .tpkg.var.test +# +# do your teardown here +. ../common.sh +kill_pid $FWD_PID +kill_pid $UNBOUND_PID +cat unbound.log +exit 0 diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.pre b/testdata/proxy_protocol.tdir/proxy_protocol.pre new file mode 100644 index 000000000..01cf357f5 --- /dev/null +++ b/testdata/proxy_protocol.tdir/proxy_protocol.pre @@ -0,0 +1,66 @@ +# #-- proxy_protocol.pre--# +# source the master var file when it's there +[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master +# use .tpkg.var.test for in test variable passing +[ -f .tpkg.var.test ] && source .tpkg.var.test + +PRE="../.." +. ../common.sh + +# This test uses the unshare utility +if test ! -x "`which unshare 2>&1`"; then + skip_test "no unshare (from util-linux package) available, skip test" +fi + +get_make +(cd $PRE; $MAKE streamtcp) + +get_random_port 4 +UNBOUND_PORT=$RND_PORT +FWD_PORT=$(($RND_PORT + 1)) +PROXY_PORT=$(($RND_PORT + 2)) +PROXY_TLS_PORT=$(($RND_PORT + 3)) + +INTERFACE_ALLOW=eth123 +INTERFACE_ALLOW_ADDR=10.1.2.3 +INTERFACE_REFUSE=eth234 +INTERFACE_REFUSE_ADDR=10.2.3.4 + +CLIENT_ADDR_ALLOW=1.2.3.4 +CLIENT_ADDR_ALLOW6=2001:db8::cafe:cafe +CLIENT_ADDR_REFUSE=5.6.7.8 +CLIENT_ADDR_REFUSE6=2001:db8::dead:beef + +# make config file +sed \ + -e 's/@PORT\@/'$UNBOUND_PORT'/' \ + -e 's/@TOPORT\@/'$FWD_PORT'/' \ + -e 's/@PROXYPORT\@/'$PROXY_PORT'/' \ + -e 's/@PROXYTLSPORT\@/'$PROXY_TLS_PORT'/' \ + -e 's/@INTERFACE_ALLOW_ADDR\@/'$INTERFACE_ALLOW_ADDR'/' \ + -e 's/@INTERFACE_REFUSE_ADDR\@/'$INTERFACE_REFUSE_ADDR'/' \ + -e 's/@CLIENT_ADDR_ALLOW\@/'$CLIENT_ADDR_ALLOW'/' \ + -e 's/@CLIENT_ADDR_ALLOW6\@/'$CLIENT_ADDR_ALLOW6'/' \ + -e 's/@CLIENT_ADDR_REFUSE\@/'$CLIENT_ADDR_REFUSE'/' \ + -e 's/@CLIENT_ADDR_REFUSE6\@/'$CLIENT_ADDR_REFUSE6'/' \ + < proxy_protocol.conf > ub.conf + +if test -x "`which bash`"; then + shell="bash" +else + shell="sh" +fi + +echo "UNBOUND_PORT=$UNBOUND_PORT" >> .tpkg.var.test +echo "FWD_PORT=$FWD_PORT" >> .tpkg.var.test +echo "PROXY_PORT=$PROXY_PORT" >> .tpkg.var.test +echo "PROXY_TLS_PORT=$PROXY_TLS_PORT" >> .tpkg.var.test +echo "INTERFACE_ALLOW=$INTERFACE_ALLOW" >> .tpkg.var.test +echo "INTERFACE_ALLOW_ADDR=$INTERFACE_ALLOW_ADDR" >> .tpkg.var.test +echo "INTERFACE_REFUSE=$INTERFACE_REFUSE" >> .tpkg.var.test +echo "INTERFACE_REFUSE_ADDR=$INTERFACE_REFUSE_ADDR" >> .tpkg.var.test +echo "CLIENT_ADDR_ALLOW=$CLIENT_ADDR_ALLOW" >> .tpkg.var.test +echo "CLIENT_ADDR_ALLOW6=$CLIENT_ADDR_ALLOW6" >> .tpkg.var.test +echo "CLIENT_ADDR_REFUSE=$CLIENT_ADDR_REFUSE" >> .tpkg.var.test +echo "CLIENT_ADDR_REFUSE6=$CLIENT_ADDR_REFUSE6" >> .tpkg.var.test +echo "shell=$shell" >> .tpkg.var.test diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.test b/testdata/proxy_protocol.tdir/proxy_protocol.test new file mode 100644 index 000000000..3f65e2932 --- /dev/null +++ b/testdata/proxy_protocol.tdir/proxy_protocol.test @@ -0,0 +1,12 @@ +# #-- proxy_protocol.test --# +# source the master var file when it's there +[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master +# use .tpkg.var.test for in test variable passing +[ -f .tpkg.var.test ] && source .tpkg.var.test + +PRE="../.." +. ../common.sh + +# Run the scenario in an unshared namespace +unshare -rUn $shell proxy_protocol.test.scenario +exit $? diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.test.scenario b/testdata/proxy_protocol.tdir/proxy_protocol.test.scenario new file mode 100644 index 000000000..0b8fe6efa --- /dev/null +++ b/testdata/proxy_protocol.tdir/proxy_protocol.test.scenario @@ -0,0 +1,193 @@ +# #-- proxy_protocol.test.scenario --# +# source the master var file when it's there +[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master +# use .tpkg.var.test for in test variable passing +[ -f .tpkg.var.test ] && source .tpkg.var.test + +PRE="../.." +. ../common.sh + +ip addr add 127.0.0.1 dev lo +ip link set lo up + +ip link add $INTERFACE_ALLOW type dummy +ip addr add $INTERFACE_ALLOW_ADDR dev $INTERFACE_ALLOW +ip link set $INTERFACE_ALLOW up + +ip link add $INTERFACE_REFUSE type dummy +ip addr add $INTERFACE_REFUSE_ADDR dev $INTERFACE_REFUSE +ip link set $INTERFACE_REFUSE up + +# start forwarder in the background +get_ldns_testns +$LDNS_TESTNS -p $FWD_PORT proxy_protocol.testns >fwd.log 2>&1 & +FWD_PID=$! +echo "FWD_PID=$FWD_PID" >> .tpkg.var.test + +# start unbound in the background +$PRE/unbound -d -c ub.conf >unbound.log 2>&1 & +UNBOUND_PID=$! +echo "UNBOUND_PID=$UNBOUND_PID" >> .tpkg.var.test + +wait_ldns_testns_up fwd.log +wait_unbound_up unbound.log + +# call streamtcp and check return value +do_streamtcp () { + $PRE/streamtcp $* A IN >outfile 2>&1 + if test "$?" -ne 0; then + echo "exit status not OK" + echo "> cat logfiles" + cat outfile + cat unbound.log + echo "Not OK" + exit 1 + fi +} + +send_query () { + server=$1 + client=$2 + prot=$3 + query=$4 + echo -n "> query $query to $server" + port=$UNBOUND_PORT + if test ! -z "$client"; then + port=$PROXY_PORT + fi + case $prot in + -u) + echo -n " (over UDP)" + ;; + -s) + echo -n " (over TLS)" + port=$PROXY_TLS_PORT + ;; + *) + echo -n " (over TCP)" + esac + if test ! -z "$client"; then + echo -n " ($client proxied)" + fi + echo + do_streamtcp $prot -f $server@$port $client $query + #cat outfile +} + +expect_answer () { + #query=$1 + #answer=$2 + if grep "$query" outfile | grep "$answer"; then + echo "content OK" + echo + else + echo "> cat logfiles" + cat outfile + cat unbound.log + echo "result contents not OK" + exit 1 + fi +} + +expect_refuse () { + if grep "rcode: REFUSE" outfile; then + echo "content OK" + echo + else + echo "> cat logfiles" + cat outfile + cat unbound.log + echo "result contents not OK" + exit 1 + fi +} + +# Start the test + +# Query without PROXYv2 +# Client localhost +# Expect the result back +server=127.0.0.1 +client="" +query="two.example.net." +answer="2.2.2.2" +for prot in "-u" ""; do + send_query "$server" "$client" "$prot" "$query" + expect_answer +done + +# Query with PROXYv2 +# Client $CLIENT_ADDR_ALLOW should be allowed +# Expect the result back +server=127.0.0.1 +client="-p $CLIENT_ADDR_ALLOW@1234" +query="one.example.net." +answer="1.1.1.1" +for prot in "-u" "" "-s"; do + send_query "$server" "$client" "$prot" "$query" + expect_answer +done + +# Query with PROXYv2 +# Client $CLIENT_ADDR_ALLOW6 should be allowed +# Expect the result back +server=127.0.0.1 +client="-p $CLIENT_ADDR_ALLOW6@1234" +query="one.example.net." +answer="1.1.1.1" +for prot in "-u" "" "-s"; do + send_query "$server" "$client" "$prot" "$query" + expect_answer +done + +# Query with PROXYv2 +# Client $CLIENT_ADDR_REFUSE should be refused +# Expect the REFUSE back +server=127.0.0.1 +client="-p $CLIENT_ADDR_REFUSE" +query="one.example.net." +answer="" +for prot in "-u" "" "-s"; do + send_query "$server" "$client" "$prot" "$query" + expect_refuse +done + +# Query with PROXYv2 +# Client $CLIENT_ADDR_REFUSE6 should be refused +# Expect the REFUSE back +server=127.0.0.1 +client="-p $CLIENT_ADDR_REFUSE6" +query="one.example.net." +answer="" +for prot in "-u" "" "-s"; do + send_query "$server" "$client" "$prot" "$query" + expect_refuse +done + +# Query with PROXYv2 +# Client $CLIENT_ADDR_ALLOW should be allowed; proxy source address should be allowed +# Expect the result back +server=$INTERFACE_ALLOW_ADDR +client="-p $CLIENT_ADDR_ALLOW@1234" +query="one.example.net." +answer="1.1.1.1" +for prot in "-u" "" "-s"; do + send_query "$server" "$client" "$prot" "$query" + expect_answer +done + +# Query with PROXYv2 +# Client $CLIENT_ADDR_ALLOW should be allowed; proxy source address should be refused +# Expect the REFUSE back +server=$INTERFACE_REFUSE_ADDR +client="-p $CLIENT_ADDR_ALLOW@1234" +query="one.example.net." +answer="" +for prot in "-u" "" "-s"; do + send_query "$server" "$client" "$prot" "$query" + expect_refuse +done + +echo "OK" +exit 0 + diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.testns b/testdata/proxy_protocol.tdir/proxy_protocol.testns new file mode 100644 index 000000000..176bc936a --- /dev/null +++ b/testdata/proxy_protocol.tdir/proxy_protocol.testns @@ -0,0 +1,23 @@ +; nameserver test file +$ORIGIN example.net. +$TTL 3600 + +ENTRY_BEGIN +MATCH opcode qtype qname +REPLY QR RD RA NOERROR +ADJUST copy_id +SECTION QUESTION +one IN A +SECTION ANSWER +one IN A 1.1.1.1 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +REPLY QR RD RA NOERROR +ADJUST copy_id +SECTION QUESTION +two IN A +SECTION ANSWER +two IN A 2.2.2.2 +ENTRY_END diff --git a/testdata/proxy_protocol.tdir/unbound_server.key b/testdata/proxy_protocol.tdir/unbound_server.key new file mode 100644 index 000000000..370a7bbb2 --- /dev/null +++ b/testdata/proxy_protocol.tdir/unbound_server.key @@ -0,0 +1,39 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIG5AIBAAKCAYEAvjSVSN2QMXudpzukdLCqgg/IOhCX8KYkD0FFFfWcQjgKq5wI +0x41iG32a6wbGanre4IX7VxaSPu9kkHfnGgynCk5nwDRedE/FLFhAU78PoT0+Nqq +GRS7XVQ24vLmIz9Hqc2Ozx1um1BXBTmIT0UfN2e22I0LWQ6a3seZlEDRj45gnk7Z +uh9MDgotaBdm+v1JAbupSf6Zis4VEH3JNdvVGE3O1DHEIeuuz/3BDhpf6WBDH+8K +WaBe1ca4TZHr9ThL2gEMEfAQl0wXDwRWRoi3NjNMH+mw0L1rjwThI5GXqNIee7o5 +FzUReSXZuTdFMyGe3Owcx+XoYnwi6cplSNoGsDBu4B9bKKglR9YleJVw4L4Xi8xP +q6O9UPj4+nypHk/DOoC7DIM3ufN0yxPBsFo5TVowxfhdjZXJbbftd2TZv7AH8+XL +A5UoZgRzXgzECelXSCTBFlMTnT48LfA9pMLydyjAz2UdPHs5Iv+TK5nnI+aJoeaP +7kFZSngxdy1+A/bNAgMBAAECggGBALpTOIqQwVg4CFBylL/a8K1IWJTI/I65sklf +XxYL7G7SB2HlEJ//z+E+F0+S4Vlao1vyLQ5QkgE82pAUB8FoMWvY1qF0Y8A5wtm6 +iZSGk4OLK488ZbT8Ii9i+AGKgPe2XbVxsJwj8N4k7Zooqec9hz73Up8ATEWJkRz7 +2u7oMGG4z91E0PULA64dOi3l/vOQe5w/Aa+CwVbAWtI05o7kMvQEBMDJn6C7CByo +MB5op9wueJMnz7PM7hns+U7Dy6oE4ljuolJUy51bDzFWwoM54cRoQqLFNHd8JVQj +WxldCkbfF43iyprlsEcUrTyUjtdA+ZeiG39vg/mtdmgNpGmdupHJZQvSuG8IcVlz +O+eMSeQS1QXPD6Ik8UK4SU0h+zOl8xIWtRrsxQuh4fnTN40udm/YUWl/6gOebsBI +IrVLlKGqJSfB3tMjpCRqdTzJ0dA9keVpkqm2ugZkxEf1+/efq/rFIQ2pUBLCqNTN +qpNqruK8y8FphP30I2uI4Ej2UIB8AQKBwQDd2Yptj2FyDyaXCycsyde0wYkNyzGU +dRnzdibfHnMZwjgTjwAwgIUBVIS8H0/z7ZJQKN7osJfddMrtjJtYYUk9g/dCpHXs +bNh2QSoWah3FdzNGuWd0iRf9+LFxhjAAMo/FS8zFJAJKrFsBdCGTfFUMdsLC0bjr +YjiWBuvV72uKf8XIZX5KIZruKdWBBcWukcb21R1UDyFYyXRBsly5XHaIYKZql3km +7pV7MKWO0IYgHbHIqGUqPQlzZ/lkunS1jKECgcEA23wHffD6Ou9/x3okPx2AWpTr +gh8rgqbyo6hQkBW5Y90Wz824cqaYebZDaBR/xlVx/YwjKkohv8Bde2lpH/ZxRZ1Z +5Sk2s6GJ/vU0L9RsJZgCgj4L6Coal1NMxuZtCXAlnOpiCdxSZgfqbshbTVz30KsG +ZJG361Cua1ScdAHxlZBxT52/1Sm0zRC2hnxL7h4qo7Idmtzs40LAJvYOKekR0pPN +oWeJfra7vgx/jVNvMFWoOoSLpidVO4g+ot4ery6tAoHAdW3rCic1C2zdnmH28Iw+ +s50l8Lk3mz+I5wgJd1zkzCO0DxZIoWPGA3g7cmCYr6N3KRsZMs4W9NAXgjpFGDkW +zYsG3K21BdpvkdjYcFjnPVjlOXB2RIc0vehf9Jl02wXoeCSxVUDEPcaRvWk9RJYx +ZpGOchUU7vNkxHURbIJ4yCzuAi9G8/Jp0dsu+kaV5tufF5SjG5WOrzKjaQsCbdN1 +oqaWMCHRrTvov/Z2C+xwsptFOdN5CSyZzg6hQiI4GMlBAoHAXyb6KINcOEi0YMp3 +BFXJ23tMTnEs78tozcKeipigcsbaqORK3omS+NEnj+uzKUzJyl4CsMbKstK2tFYS +mSTCHqgE3PBtIpsZtEqhgUraR8IK9GPpzZDTTl9ynZgwFTNlWw3RyuyVXF56J+T8 +kCGJ3hEHCHqT/ZRQyX85BKIDFhA0z4tYKxWVqIFiYBNq56R0X9tMMmMs36mEnF93 +7Ht6mowxTZQRa7nU0qOgeKh/P7ki4Zus3y+WJ+T9IqahLtlRAoHBAIhqMrcxSAB8 +RpB9jukJlAnidw2jCMPgrFE8tP0khhVvGrXMldxAUsMKntDIo8dGCnG1KTcWDI0O +jepvSPHSsxVLFugL79h0eVIS5z4huW48i9xgU8VlHdgAcgEPIAOFcOw2BCu/s0Vp +O+MM/EyUOdo3NsibB3qc/GJI6iNBYS7AljYEVo6rXo5V/MZvZUF4vClen6Obzsre +MTTb+4sJjfqleWuvr1XNMeu2mBfXBQkWGZP1byBK0MvD/aQ2PWq92A== +-----END RSA PRIVATE KEY----- diff --git a/testdata/proxy_protocol.tdir/unbound_server.pem b/testdata/proxy_protocol.tdir/unbound_server.pem new file mode 100644 index 000000000..986807310 --- /dev/null +++ b/testdata/proxy_protocol.tdir/unbound_server.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDqzCCAhMCFBHWXeQ6ZIa9QcQbXLFfC6tj+KA+MA0GCSqGSIb3DQEBCwUAMBIx +EDAOBgNVBAMMB3VuYm91bmQwHhcNMjAwNzA4MTMzMjI5WhcNNDAwMzI1MTMzMjI5 +WjASMRAwDgYDVQQDDAd1bmJvdW5kMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB +igKCAYEAvjSVSN2QMXudpzukdLCqgg/IOhCX8KYkD0FFFfWcQjgKq5wI0x41iG32 +a6wbGanre4IX7VxaSPu9kkHfnGgynCk5nwDRedE/FLFhAU78PoT0+NqqGRS7XVQ2 +4vLmIz9Hqc2Ozx1um1BXBTmIT0UfN2e22I0LWQ6a3seZlEDRj45gnk7Zuh9MDgot +aBdm+v1JAbupSf6Zis4VEH3JNdvVGE3O1DHEIeuuz/3BDhpf6WBDH+8KWaBe1ca4 +TZHr9ThL2gEMEfAQl0wXDwRWRoi3NjNMH+mw0L1rjwThI5GXqNIee7o5FzUReSXZ +uTdFMyGe3Owcx+XoYnwi6cplSNoGsDBu4B9bKKglR9YleJVw4L4Xi8xPq6O9UPj4 ++nypHk/DOoC7DIM3ufN0yxPBsFo5TVowxfhdjZXJbbftd2TZv7AH8+XLA5UoZgRz +XgzECelXSCTBFlMTnT48LfA9pMLydyjAz2UdPHs5Iv+TK5nnI+aJoeaP7kFZSngx +dy1+A/bNAgMBAAEwDQYJKoZIhvcNAQELBQADggGBABunf93MKaCUHiZgnoOTinsW +84/EgInrgtKzAyH+BhnKkJOhhR0kkIAx5d9BpDlaSiRTACFon9moWCgDIIsK/Ar7 +JE0Kln9cV//wiiNoFU0O4mnzyGUIMvlaEX6QHMJJQYvL05+w/3AAcf5XmMJtR5ca +fJ8FqvGC34b2WxX9lTQoyT52sRt+1KnQikiMEnEyAdKktMG+MwKsFDdOwDXyZhZg +XZhRrfX3/NVJolqB6EahjWIGXDeKuSSKZVtCyib6LskyeMzN5lcRfvubKDdlqFVF +qlD7rHBsKhQUWK/IO64mGf7y/de+CgHtED5vDvr/p2uj/9sABATfbrOQR3W/Of25 +sLBj4OEfrJ7lX8hQgFaxkMI3x6VFT3W8dTCp7xnQgb6bgROWB5fNEZ9jk/gjSRmD +yIU+r0UbKe5kBk/CmZVFXL2TyJ92V5NYEQh8V4DGy19qZ6u/XKYyNJL4ocs35GGe +CA8SBuyrmdhx38h1RHErR2Skzadi1S7MwGf1y431fQ== +-----END CERTIFICATE----- diff --git a/testdata/pymod.tdir/pymod.py b/testdata/pymod.tdir/pymod.py index a8018e7f7..1eb7af5b1 100644 --- a/testdata/pymod.tdir/pymod.py +++ b/testdata/pymod.tdir/pymod.py @@ -37,7 +37,12 @@ import os def init(id, cfg): - log_info("pythonmod: init called, module id is %d port: %d script: %s" % (id, cfg.port, cfg.python_script)) + scripts=[] + s = cfg.python_script + while s != None: + scripts.append(s.str) + s = s.next + log_info("pythonmod: init called, module id is %d port: %d script: %s" % (id, cfg.port, scripts)) return True def deinit(id): diff --git a/testdata/stub_auth_tc.tdir/stub_auth_tc.conf b/testdata/stub_auth_tc.tdir/stub_auth_tc.conf new file mode 100644 index 000000000..b74942799 --- /dev/null +++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.conf @@ -0,0 +1,16 @@ +server: + verbosity: 4 + # num-threads: 1 + interface: 127.0.0.1 + port: @PORT@ + use-syslog: no + directory: . + pidfile: "unbound.pid" + chroot: "" + username: "" + do-not-query-localhost: no + +stub-zone: + name: "example.com" + stub-addr: "127.0.0.1@@TOPORT@" + diff --git a/testdata/stub_auth_tc.tdir/stub_auth_tc.dsc b/testdata/stub_auth_tc.tdir/stub_auth_tc.dsc new file mode 100644 index 000000000..1f71961f1 --- /dev/null +++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.dsc @@ -0,0 +1,16 @@ +BaseName: stub_auth_tc +Version: 1.0 +Description: Authority reply with erroneous TC in TCP +CreationDate: Mon Oct 3 09:11:32 CEST 2022 +Maintainer: dr. W.C.A. Wijngaards +Category: +Component: +CmdDepends: +Depends: +Help: +Pre: stub_auth_tc.pre +Post: stub_auth_tc.post +Test: stub_auth_tc.test +AuxFiles: +Passed: +Failure: diff --git a/testdata/stub_auth_tc.tdir/stub_auth_tc.post b/testdata/stub_auth_tc.tdir/stub_auth_tc.post new file mode 100644 index 000000000..907a885e4 --- /dev/null +++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.post @@ -0,0 +1,11 @@ +# #-- stub_auth_tc.post --# +# source the master var file when it's there +[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master +# source the test var file when it's there +[ -f .tpkg.var.test ] && source .tpkg.var.test +# +# do your teardown here +. ../common.sh +kill_pid $FWD_PID +kill_pid $UNBOUND_PID + diff --git a/testdata/stub_auth_tc.tdir/stub_auth_tc.pre b/testdata/stub_auth_tc.tdir/stub_auth_tc.pre new file mode 100644 index 000000000..2f7e317bc --- /dev/null +++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.pre @@ -0,0 +1,31 @@ +# #-- stub_auth_tc.pre--# +# source the master var file when it's there +[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master +# use .tpkg.var.test for in test variable passing +[ -f .tpkg.var.test ] && source .tpkg.var.test + +. ../common.sh +get_random_port 2 +UNBOUND_PORT=$RND_PORT +FWD_PORT=$(($RND_PORT + 1)) +echo "UNBOUND_PORT=$UNBOUND_PORT" >> .tpkg.var.test +echo "FWD_PORT=$FWD_PORT" >> .tpkg.var.test + +# start forwarder +get_ldns_testns +$LDNS_TESTNS -p $FWD_PORT stub_auth_tc.testns >fwd.log 2>&1 & +FWD_PID=$! +echo "FWD_PID=$FWD_PID" >> .tpkg.var.test + +# make config file +sed -e 's/@PORT\@/'$UNBOUND_PORT'/' -e 's/@TOPORT\@/'$FWD_PORT'/' < stub_auth_tc.conf > ub.conf +# start unbound in the background +PRE="../.." +$PRE/unbound -d -c ub.conf >unbound.log 2>&1 & +UNBOUND_PID=$! +echo "UNBOUND_PID=$UNBOUND_PID" >> .tpkg.var.test + +cat .tpkg.var.test +wait_ldns_testns_up fwd.log +wait_unbound_up unbound.log + diff --git a/testdata/stub_auth_tc.tdir/stub_auth_tc.test b/testdata/stub_auth_tc.tdir/stub_auth_tc.test new file mode 100644 index 000000000..7b7440274 --- /dev/null +++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.test @@ -0,0 +1,26 @@ +# #-- stub_auth_tc.test --# +# source the master var file when it's there +[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master +# use .tpkg.var.test for in test variable passing +[ -f .tpkg.var.test ] && source .tpkg.var.test + +PRE="../.." +# do the test +echo "> dig www.example.com." +dig @localhost -p $UNBOUND_PORT www.example.com. | tee outfile +echo "> cat logfiles" +cat fwd.log +cat unbound.log +echo "> check answer" +if grep "SERVFAIL" outfile; then + echo "OK" +else + echo "Not OK" + exit 1 +fi +if grep "flags:" outfile | grep " tc "; then + echo "Not OK, TC flag in output" + exit 1 +fi + +exit 0 diff --git a/testdata/stub_auth_tc.tdir/stub_auth_tc.testns b/testdata/stub_auth_tc.tdir/stub_auth_tc.testns new file mode 100644 index 000000000..f2829add4 --- /dev/null +++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.testns @@ -0,0 +1,26 @@ +; nameserver test file +$ORIGIN example.com. +$TTL 3600 + +ENTRY_BEGIN +MATCH opcode qtype qname UDP +REPLY QR AA TC NOERROR +ADJUST copy_id +SECTION QUESTION +www IN A +SECTION ANSWER +www IN A 10.20.30.40 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname TCP +; erroneous TC flag here. +REPLY QR AA TC NOERROR +ADJUST copy_id +SECTION QUESTION +www IN A +SECTION ANSWER +www IN A 10.20.30.40 +www IN A 10.20.30.41 +www IN A 10.20.30.42 +ENTRY_END diff --git a/util/config_file.c b/util/config_file.c index a92342761..cb890f31b 100644 --- a/util/config_file.c +++ b/util/config_file.c @@ -794,6 +794,7 @@ int config_set_option(struct config_file* cfg, const char* opt, else S_SIZET_NONZERO("pad-responses-block-size:", pad_responses_block_size) else S_YNO("pad-queries:", pad_queries) else S_SIZET_NONZERO("pad-queries-block-size:", pad_queries_block_size) + else S_STRLIST("proxy-protocol-port:", proxy_protocol_port) #ifdef USE_IPSECMOD else S_YNO("ipsecmod-enabled:", ipsecmod_enabled) else S_YNO("ipsecmod-ignore-bogus:", ipsecmod_ignore_bogus) @@ -1270,6 +1271,7 @@ config_get_option(struct config_file* cfg, const char* opt, else O_YNO(opt, "pad-queries", pad_queries) else O_DEC(opt, "pad-queries-block-size", pad_queries_block_size) else O_LS2(opt, "edns-client-strings", edns_client_strings) + else O_LST(opt, "proxy-protocol-port", proxy_protocol_port) #ifdef USE_IPSECMOD else O_YNO(opt, "ipsecmod-enabled", ipsecmod_enabled) else O_YNO(opt, "ipsecmod-ignore-bogus", ipsecmod_ignore_bogus) @@ -1650,6 +1652,7 @@ config_delete(struct config_file* cfg) config_delstrlist(cfg->python_script); config_delstrlist(cfg->dynlib_file); config_deldblstrlist(cfg->edns_client_strings); + config_delstrlist(cfg->proxy_protocol_port); #ifdef USE_IPSECMOD free(cfg->ipsecmod_hook); config_delstrlist(cfg->ipsecmod_whitelist); @@ -2647,3 +2650,35 @@ int cfg_has_https(struct config_file* cfg) } return 0; } + +/** see if interface is PROXYv2, its port number == the proxy port number */ +int +if_is_pp2(const char* ifname, const char* port, + struct config_strlist* proxy_protocol_port) +{ + struct config_strlist* s; + char* p = strchr(ifname, '@'); + for(s = proxy_protocol_port; s; s = s->next) { + if(p && atoi(p+1) == atoi(s->str)) + return 1; + if(!p && atoi(port) == atoi(s->str)) + return 1; + } + return 0; +} + +/** see if interface is DNSCRYPT, its port number == the dnscrypt port number */ +int +if_is_dnscrypt(const char* ifname, const char* port, int dnscrypt_port) +{ +#ifdef USE_DNSCRYPT + return ((strchr(ifname, '@') && + atoi(strchr(ifname, '@')+1) == dnscrypt_port) || + (!strchr(ifname, '@') && atoi(port) == dnscrypt_port)); +#else + (void)ifname; + (void)port; + (void)dnscrypt_port; + return 0; +#endif +} diff --git a/util/config_file.h b/util/config_file.h index 3db4676b9..499cf42e4 100644 --- a/util/config_file.h +++ b/util/config_file.h @@ -114,6 +114,8 @@ struct config_file { int do_tcp_keepalive; /** tcp keepalive timeout, in msec */ int tcp_keepalive_timeout; + /** proxy protocol ports */ + struct config_strlist* proxy_protocol_port; /** private key file for dnstcp-ssl service (enabled if not NULL) */ char* ssl_service_key; @@ -1329,6 +1331,12 @@ int if_is_https(const char* ifname, const char* port, int https_port); */ int cfg_has_https(struct config_file* cfg); +/** see if interface is PROXYv2, its port number == the proxy port number */ +int if_is_pp2(const char* ifname, const char* port, + struct config_strlist* proxy_protocol_port); + +/** see if interface is DNSCRYPT, its port number == the dnscrypt port number */ +int if_is_dnscrypt(const char* ifname, const char* port, int dnscrypt_port); #ifdef USE_LINUX_IP_LOCAL_PORT_RANGE #define LINUX_IP_LOCAL_PORT_RANGE_PATH "/proc/sys/net/ipv4/ip_local_port_range" #endif diff --git a/util/configlexer.c b/util/configlexer.c index 2fc27d089..934b9aa84 100644 --- a/util/configlexer.c +++ b/util/configlexer.c @@ -354,8 +354,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 370 -#define YY_END_OF_BUFFER 371 +#define YY_NUM_RULES 371 +#define YY_END_OF_BUFFER 372 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -363,410 +363,411 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[3653] = +static const flex_int16_t yy_accept[3671] = { 0, - 1, 1, 344, 344, 348, 348, 352, 352, 356, 356, - 1, 1, 360, 360, 364, 364, 371, 368, 1, 342, - 342, 369, 2, 369, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 344, 345, 345, 346, - 369, 348, 349, 349, 350, 369, 355, 352, 353, 353, - 354, 369, 356, 357, 357, 358, 369, 367, 343, 2, - 347, 369, 367, 363, 360, 361, 361, 362, 369, 364, - 365, 365, 366, 369, 368, 0, 1, 2, 2, 2, - 2, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 1, 1, 345, 345, 349, 349, 353, 353, 357, 357, + 1, 1, 361, 361, 365, 365, 372, 369, 1, 343, + 343, 370, 2, 370, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 345, 346, 346, 347, + 370, 349, 350, 350, 351, 370, 356, 353, 354, 354, + 355, 370, 357, 358, 358, 359, 370, 368, 344, 2, + 348, 370, 368, 364, 361, 362, 362, 363, 370, 365, + 366, 366, 367, 370, 369, 0, 1, 2, 2, 2, + 2, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 344, 0, 348, 0, 355, 0, 352, 356, 0, 367, - 0, 2, 2, 367, 363, 0, 360, 364, 0, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 345, 0, 349, 0, 356, 0, 353, 357, 0, 368, + 0, 2, 2, 368, 364, 0, 361, 365, 0, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 367, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 368, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 341, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 133, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 143, 368, - 368, 368, 368, 368, 368, 368, 367, 368, 368, 368, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 341, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 133, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 143, 369, 369, 369, 369, 369, 369, 369, 368, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 115, - 368, 340, 368, 368, 368, 368, 368, 368, 368, 368, - 8, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 115, 369, 340, 369, 369, 369, 369, 369, 369, + 369, 369, 8, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 134, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 148, 368, 368, 367, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 134, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 148, 369, + 369, 368, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 331, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 331, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 367, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 69, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 260, 368, 14, 15, 368, 19, - 18, 368, 368, 240, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 368, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 69, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 260, 369, + 14, 15, 369, 19, 18, 369, 369, 240, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 141, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 238, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 3, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 141, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 238, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 3, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 367, 368, 368, 368, - 368, 368, 368, 368, 368, 325, 368, 368, 324, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 368, 369, 369, 369, 369, 369, 369, 369, 369, + 325, 369, 369, 324, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 351, 368, 368, 368, 368, 368, 368, 368, 368, 68, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 72, 368, 294, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 332, 333, - 368, 368, 368, 368, 368, 368, 368, 368, 73, 368, - 368, 142, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 137, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 227, 368, 368, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 352, 369, 369, 369, 369, + 369, 369, 369, 369, 68, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 72, 369, 294, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 332, 333, 369, 369, 369, 369, 369, + 369, 369, 369, 73, 369, 369, 142, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 137, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 21, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 169, 368, 368, 368, 368, 368, 367, - 351, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 113, 368, 368, 368, 368, 368, - 368, 368, 302, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 227, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 21, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 169, + 369, 369, 369, 369, 369, 368, 352, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 113, 369, 369, 369, 369, 369, 369, 369, 302, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 196, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 168, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 112, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 196, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 168, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 112, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 35, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 36, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 70, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 140, 368, 368, 368, 367, 368, 368, 368, 368, - 368, 368, 132, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 71, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 35, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 36, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 70, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 140, 369, + 369, 369, 368, 369, 369, 369, 369, 369, 369, 132, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 264, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 197, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 58, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 369, 369, 369, 71, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 264, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 197, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 58, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 282, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 63, 368, 64, 368, 368, 368, - 368, 368, 116, 368, 117, 368, 368, 368, 368, 368, - 114, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 7, 368, 368, 368, 368, 367, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 282, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 63, 369, 64, 369, 369, 369, 369, 369, + 116, 369, 117, 369, 369, 369, 369, 369, 114, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 249, 368, 368, 368, 368, 172, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 265, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 49, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 59, 368, 368, 368, 368, + 369, 369, 7, 369, 369, 369, 369, 368, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 249, 369, + 369, 369, 369, 172, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 265, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 49, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 219, 368, 218, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 16, 17, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 74, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 226, 368, 368, 368, 368, 368, 368, 119, - 368, 118, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 59, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 219, 369, + 218, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 16, 17, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 74, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 226, 369, 369, 369, 369, 369, 369, 119, 369, + 118, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 210, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 149, 368, - 368, 368, 367, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 107, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 95, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 239, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 100, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 210, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 149, 369, 369, + 369, 368, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 107, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 95, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 239, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 67, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 213, 214, - 368, 368, 368, 296, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 6, 368, 368, - 368, 368, 368, 368, 368, 315, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 300, 368, 368, 368, 368, 368, - 368, 368, 326, 368, 368, 368, 368, 368, 368, 368, + 369, 100, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 67, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 213, 214, 369, + 369, 369, 296, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 6, 369, 369, 369, + 369, 369, 369, 369, 315, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 300, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 46, 368, 368, - 368, 368, 368, 48, 368, 368, 368, 96, 368, 368, - 368, 368, 368, 56, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 367, 368, 206, 368, 368, - 368, 144, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 231, 368, 368, 207, 368, 368, 368, - 246, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 57, 368, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 326, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 46, 369, 369, + 369, 369, 369, 48, 369, 369, 369, 96, 369, 369, + 369, 369, 369, 56, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 368, 369, 206, 369, 369, + 369, 144, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 231, 369, 369, 207, 369, 369, 369, + 246, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 146, 125, 368, 126, 368, 368, 368, - 368, 124, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 165, 368, 368, 54, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 281, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 208, 368, 368, 368, 368, - 368, 211, 368, 217, 368, 368, 368, 368, 368, 368, - 245, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 111, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 369, 57, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 146, 125, 369, 126, 369, 369, 369, + 369, 124, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 165, 369, 369, 54, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 281, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 208, 369, 369, 369, 369, + 369, 211, 369, 217, 369, 369, 369, 369, 369, 369, + 245, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 111, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 138, 368, - 368, 368, 368, 368, 368, 368, 368, 65, 368, 368, - 368, 29, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 20, 368, 368, 368, 368, 368, - 368, 368, 30, 39, 368, 177, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 204, 368, 368, 367, 368, 368, 368, 368, 336, 368, - 368, 82, 84, 368, 368, 368, 368, 368, 368, 368, - 337, 368, 368, 368, 368, 368, 368, 304, 368, 368, - 368, 368, 261, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 138, + 369, 369, 369, 369, 369, 369, 369, 369, 65, 369, + 369, 369, 29, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 20, 369, 369, 369, 369, + 369, 369, 369, 30, 39, 369, 177, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 204, 369, 369, 368, 369, 369, 369, 369, 336, + 369, 369, 82, 84, 369, 369, 369, 369, 369, 369, + 369, 337, 369, 369, 369, 369, 369, 369, 304, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 127, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 164, 368, - 50, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 255, 368, 368, 368, 368, 368, 368, 368, 319, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 171, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 313, 368, 368, 368, 237, 368, 368, + 369, 369, 369, 261, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 127, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 164, + 369, 50, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 255, 369, 369, 369, 369, 369, 369, 369, + 319, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 171, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 329, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 189, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 120, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 184, 368, 198, 368, 368, - 368, 368, 368, 368, 368, 367, 368, 152, 368, 368, - 368, 368, 368, 106, 368, 368, 368, 368, 229, 368, - 368, 368, 368, 368, 368, 247, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 369, 313, 369, 369, 369, 369, 237, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 329, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 189, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 120, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 184, 369, 198, + 369, 369, 369, 369, 369, 369, 369, 368, 369, 152, + 369, 369, 369, 369, 369, 106, 369, 369, 369, 369, + 229, 369, 369, 369, 369, 369, 369, 247, 369, 369, - 368, 368, 273, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 145, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 188, 368, 368, 368, 368, 368, 368, 368, - 85, 368, 86, 368, 368, 368, 368, 368, 258, 368, - 368, 368, 368, 66, 322, 368, 368, 368, 368, 368, - 94, 199, 368, 220, 368, 250, 368, 368, 212, 297, - 368, 368, 368, 368, 368, 368, 78, 368, 201, 368, - 368, 368, 368, 368, 368, 9, 368, 368, 368, 368, - 368, 110, 368, 368, 368, 368, 368, 286, 368, 368, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 273, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 145, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 188, 369, 369, 369, 369, 369, + 369, 369, 85, 369, 86, 369, 369, 369, 369, 369, + 258, 369, 369, 369, 369, 66, 322, 369, 369, 369, + 369, 369, 94, 199, 369, 220, 369, 250, 369, 369, + 212, 297, 369, 369, 369, 369, 369, 369, 78, 369, + 201, 369, 369, 369, 369, 369, 369, 9, 369, 369, - 368, 368, 228, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 367, 368, 368, - 368, 368, 187, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 173, 368, 303, 368, 368, 368, 368, - 368, 272, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 241, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 110, 369, 369, 369, 369, 369, 369, + 286, 369, 369, 369, 369, 228, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 368, 369, 369, 369, 369, 187, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 173, 369, 303, 369, + 369, 369, 369, 369, 272, 369, 369, 369, 369, 369, - 295, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 170, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 323, - 368, 200, 368, 368, 368, 368, 368, 368, 368, 368, - 77, 79, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 109, 368, 368, 368, 368, 368, 284, 368, - 368, 368, 368, 299, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 233, 37, 31, - 33, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 369, 369, 369, 241, 369, 369, 369, + 369, 369, 369, 295, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 170, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 323, 369, 200, 369, 369, 369, 369, 369, + 369, 369, 369, 77, 79, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 109, 369, 369, 369, 369, + 369, 369, 284, 369, 369, 369, 369, 299, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 38, 368, 32, 34, 368, 40, 368, - 368, 368, 368, 368, 368, 368, 105, 368, 183, 368, - 368, 368, 368, 368, 368, 368, 367, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 235, 232, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 76, - 368, 368, 368, 147, 368, 128, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 166, 51, 368, 368, - 368, 359, 13, 368, 368, 368, 368, 368, 368, 368, - 153, 368, 368, 368, 368, 368, 368, 368, 317, 368, + 369, 233, 37, 31, 33, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 38, 369, 32, + 34, 369, 40, 369, 369, 369, 369, 369, 369, 369, + 105, 369, 183, 369, 369, 369, 369, 369, 369, 369, + 368, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 235, 232, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 76, 369, 369, 369, 147, 369, 128, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 166, 51, 369, 369, 369, 360, 13, 369, 369, 369, - 320, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 12, 368, 368, 22, 368, 368, 368, - 368, 368, 368, 290, 368, 368, 368, 368, 301, 368, - 368, 368, 368, 80, 368, 243, 368, 368, 368, 368, - 368, 234, 368, 368, 75, 368, 368, 368, 368, 368, - 368, 23, 368, 368, 47, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 182, 181, 368, - 368, 359, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 236, 230, 368, 248, 368, 368, 305, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 369, 153, 369, 369, 369, 369, 369, + 369, 369, 317, 369, 320, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 12, 369, 369, + 22, 369, 369, 369, 369, 369, 369, 369, 290, 369, + 369, 369, 369, 301, 369, 369, 369, 369, 80, 369, + 243, 369, 369, 369, 369, 369, 234, 369, 369, 75, + 369, 369, 369, 369, 369, 369, 23, 369, 369, 47, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 182, 181, 369, 369, 360, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 236, 230, 369, 248, - 368, 368, 194, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 87, 368, 368, 368, 368, 368, - 368, 368, 285, 368, 368, 368, 368, 216, 368, 368, - 368, 368, 368, 242, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 292, 368, 368, 368, 327, 328, 179, - 368, 368, 368, 81, 368, 368, 368, 368, 190, 368, - 368, 368, 121, 123, 122, 368, 368, 368, 25, 368, - 368, 174, 368, 176, 368, 221, 368, 368, 368, 368, - 180, 368, 368, 368, 368, 251, 368, 368, 368, 368, + 369, 369, 305, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 194, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 87, + 369, 369, 369, 369, 369, 369, 369, 285, 369, 369, + 369, 369, 216, 369, 369, 369, 369, 369, 242, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 292, + 369, 369, 369, 327, 328, 179, 369, 369, 369, 81, + 369, 369, 369, 369, 190, 369, 369, 369, 121, 123, + 122, 369, 369, 369, 25, 369, 369, 174, 369, 176, - 368, 368, 368, 155, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 263, 368, 368, 368, - 368, 368, 368, 368, 338, 368, 27, 368, 298, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 92, 222, 368, 368, - 257, 368, 368, 283, 368, 321, 368, 215, 368, 368, - 368, 368, 368, 293, 60, 368, 368, 368, 368, 368, - 368, 4, 368, 368, 368, 368, 136, 368, 154, 368, - 368, 368, 195, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 369, 221, 369, 369, 369, 369, 180, 369, 369, 369, + 369, 251, 369, 369, 369, 369, 369, 369, 369, 155, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 263, 369, 369, 369, 369, 369, 369, 369, + 338, 369, 27, 369, 298, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 92, 222, 369, 369, 257, 369, 369, 283, + 369, 321, 369, 215, 369, 369, 369, 369, 369, 293, + 60, 369, 369, 369, 369, 369, 369, 369, 4, 369, + 369, 369, 369, 136, 369, 154, 369, 369, 369, 195, - 368, 254, 41, 42, 368, 368, 368, 368, 368, 368, - 368, 306, 368, 368, 368, 368, 368, 368, 368, 271, - 368, 368, 368, 368, 368, 368, 368, 368, 225, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 91, 90, 368, 368, 61, 368, 368, - 289, 368, 259, 368, 368, 368, 368, 368, 11, 368, - 368, 368, 368, 368, 368, 368, 368, 135, 368, 368, - 368, 368, 368, 223, 97, 368, 368, 44, 368, 368, - 368, 368, 368, 368, 368, 368, 186, 368, 368, 368, - 368, 368, 368, 368, 157, 368, 368, 368, 368, 262, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 254, 41, + 42, 369, 369, 369, 369, 369, 369, 369, 306, 369, + 369, 369, 369, 369, 369, 369, 271, 369, 369, 369, + 369, 369, 369, 369, 369, 225, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 91, 90, 369, 369, 61, 369, 369, 289, 369, 259, + 369, 369, 369, 369, 369, 11, 369, 369, 369, 369, + 342, 369, 369, 369, 369, 135, 369, 369, 369, 369, + 369, 223, 97, 369, 369, 44, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 270, 368, 368, 368, 368, - 150, 368, 368, 368, 129, 131, 130, 368, 368, 368, - 99, 103, 98, 167, 368, 368, 368, 368, 88, 368, - 256, 291, 368, 368, 368, 368, 368, 368, 10, 368, - 368, 368, 368, 368, 287, 330, 368, 368, 368, 368, - 368, 368, 335, 43, 368, 368, 368, 368, 368, 185, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 104, 102, 368, 55, 368, - 368, 89, 368, 318, 368, 368, 368, 368, 24, 368, + 369, 369, 369, 369, 186, 369, 369, 369, 369, 369, + 369, 369, 157, 369, 369, 369, 369, 262, 369, 369, + 369, 369, 369, 270, 369, 369, 369, 369, 150, 369, + 369, 369, 129, 131, 130, 369, 369, 369, 99, 103, + 98, 167, 369, 369, 369, 369, 88, 369, 256, 291, + 369, 369, 369, 369, 369, 369, 10, 369, 369, 369, + 369, 369, 287, 330, 369, 369, 369, 369, 369, 369, + 335, 43, 369, 369, 369, 369, 369, 185, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 209, 368, 368, 368, 368, 368, - 368, 224, 368, 368, 368, 368, 368, 368, 368, 368, - 205, 368, 368, 175, 83, 368, 368, 368, 368, 368, - 307, 368, 368, 368, 368, 368, 368, 368, 267, 368, - 368, 266, 151, 368, 368, 101, 52, 368, 368, 158, - 159, 162, 163, 160, 161, 93, 316, 368, 368, 288, - 139, 368, 368, 368, 26, 368, 178, 368, 368, 368, - 368, 203, 368, 253, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 192, 191, 45, 368, 368, + 369, 369, 369, 104, 102, 369, 55, 369, 369, 89, + 369, 318, 369, 369, 369, 369, 24, 369, 369, 369, + 369, 369, 209, 369, 369, 369, 369, 369, 369, 224, + 369, 369, 369, 369, 369, 369, 369, 369, 205, 369, + 369, 175, 83, 369, 369, 369, 369, 369, 307, 369, + 369, 369, 369, 369, 369, 369, 267, 369, 369, 266, + 151, 369, 369, 101, 52, 369, 369, 158, 159, 162, + 163, 160, 161, 93, 316, 369, 369, 288, 139, 369, + 369, 369, 26, 369, 178, 369, 369, 369, 369, 203, + 369, 253, 369, 369, 369, 369, 369, 369, 369, 369, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 314, 368, 368, 368, 368, 108, 368, 252, 368, - 280, 311, 368, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 339, 368, 53, 62, 5, 368, 368, - 244, 368, 368, 312, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 268, 28, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 269, 368, 368, - 368, 156, 368, 368, 368, 368, 368, 368, 368, 368, - 193, 368, 202, 368, 368, 368, 368, 368, 368, 368, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 192, 191, 45, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 314, + 369, 369, 369, 369, 108, 369, 252, 369, 280, 311, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 339, 369, 53, 62, 5, 369, 369, 244, 369, + 369, 312, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 268, 28, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 269, 369, 369, 369, 156, - 368, 368, 308, 368, 368, 368, 368, 368, 368, 368, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, - 334, 368, 368, 276, 368, 368, 368, 368, 368, 309, - 368, 368, 368, 368, 368, 368, 310, 368, 368, 368, - 274, 368, 277, 278, 368, 368, 368, 368, 368, 275, - 279, 0 + 369, 369, 369, 369, 369, 369, 369, 369, 193, 369, + 202, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 308, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 334, 369, + 369, 276, 369, 369, 369, 369, 369, 309, 369, 369, + 369, 369, 369, 369, 310, 369, 369, 369, 274, 369, + 277, 278, 369, 369, 369, 369, 369, 275, 279, 0 } ; static const YY_CHAR yy_ec[256] = @@ -809,821 +810,825 @@ static const YY_CHAR yy_meta[41] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; -static const flex_int16_t yy_base[3671] = +static const flex_int16_t yy_base[3689] = { 0, 0, 0, 38, 41, 44, 46, 59, 65, 71, 77, - 90, 112, 96, 118, 124, 136, 4330, 4228, 81, 7121, - 7121, 7121, 129, 52, 137, 63, 130, 159, 70, 132, + 90, 112, 96, 118, 124, 136, 3008, 2948, 81, 7165, + 7165, 7165, 129, 52, 137, 63, 130, 159, 70, 132, 134, 146, 57, 88, 76, 166, 177, 95, 199, 155, - 187, 201, 210, 172, 156, 148, 3871, 7121, 7121, 7121, - 107, 3650, 7121, 7121, 7121, 190, 3188, 3039, 7121, 7121, - 7121, 239, 2873, 7121, 7121, 7121, 203, 2554, 7121, 243, - 7121, 247, 212, 2406, 2140, 7121, 7121, 7121, 251, 1861, - 7121, 7121, 7121, 228, 1795, 257, 261, 0, 264, 0, + 187, 201, 210, 172, 156, 148, 2567, 7165, 7165, 7165, + 107, 2370, 7165, 7165, 7165, 190, 2209, 2185, 7165, 7165, + 7165, 239, 2121, 7165, 7165, 7165, 203, 1992, 7165, 243, + 7165, 247, 212, 1863, 1689, 7165, 7165, 7165, 251, 1626, + 7165, 7165, 7165, 228, 1526, 257, 261, 0, 264, 0, 0, 258, 262, 260, 195, 170, 251, 265, 269, 92, 270, 259, 275, 276, 277, 278, 288, 284, 286, 283, 293, 179, 290, 292, 302, 306, 307, 310, 315, 314, 318, 317, 325, 327, 328, 319, 139, 331, 336, 335, 337, 342, 347, 350, 351, 353, 339, 355, 352, 360, - 361, 363, 366, 368, 367, 381, 378, 383, 370, 387, - 374, 225, 391, 394, 397, 395, 398, 402, 406, 399, - 1443, 424, 1413, 426, 1334, 433, 1311, 1193, 437, 1049, - 441, 445, 0, 422, 799, 449, 766, 418, 453, 441, - 453, 412, 448, 449, 450, 455, 215, 451, 452, 454, - 456, 457, 460, 477, 461, 474, 480, 488, 487, 489, + 361, 363, 366, 374, 367, 381, 370, 383, 387, 386, + 371, 225, 391, 395, 396, 393, 399, 403, 409, 410, + 1485, 422, 1144, 426, 792, 432, 740, 663, 436, 538, + 440, 444, 0, 436, 474, 450, 429, 378, 455, 442, + 454, 449, 400, 429, 450, 451, 215, 453, 455, 456, + 457, 460, 459, 475, 464, 473, 479, 487, 485, 482, - 483, 492, 497, 475, 495, 501, 499, 502, 514, 512, - 513, 392, 505, 515, 517, 520, 521, 523, 535, 540, - 524, 527, 531, 533, 548, 552, 547, 556, 557, 549, - 564, 560, 568, 559, 575, 571, 580, 572, 576, 561, - 577, 579, 586, 584, 588, 464, 587, 589, 590, 604, - 591, 595, 607, 599, 606, 608, 615, 612, 614, 616, - 617, 622, 630, 631, 620, 634, 623, 633, 637, 641, - 648, 649, 644, 645, 650, 652, 651, 653, 654, 657, - 656, 660, 673, 675, 671, 672, 684, 680, 682, 681, - 683, 686, 685, 687, 694, 698, 689, 658, 705, 690, + 492, 494, 501, 490, 499, 507, 498, 497, 514, 511, + 513, 516, 519, 520, 524, 466, 521, 522, 540, 523, + 525, 531, 548, 529, 549, 556, 534, 557, 559, 552, + 567, 564, 571, 562, 576, 572, 581, 577, 578, 563, + 580, 582, 585, 588, 587, 589, 592, 591, 597, 598, + 608, 605, 593, 599, 612, 620, 617, 621, 619, 622, + 623, 624, 626, 637, 638, 628, 646, 629, 616, 644, + 649, 656, 657, 652, 642, 653, 655, 659, 660, 661, + 664, 662, 670, 672, 679, 677, 683, 686, 676, 684, + 687, 690, 689, 692, 693, 701, 694, 702, 706, 711, - 703, 706, 697, 709, 711, 715, 716, 717, 710, 7121, - 727, 718, 728, 731, 736, 734, 739, 737, 741, 749, - 744, 745, 746, 747, 750, 720, 748, 752, 753, 757, - 758, 761, 762, 769, 776, 771, 773, 786, 778, 783, - 784, 791, 777, 797, 788, 790, 808, 811, 816, 813, - 817, 819, 818, 820, 822, 824, 821, 827, 837, 825, - 839, 841, 842, 843, 845, 852, 847, 7121, 849, 851, - 864, 857, 865, 868, 867, 872, 874, 854, 884, 880, - 877, 894, 916, 885, 887, 886, 889, 892, 7121, 899, - 896, 940, 898, 900, 926, 921, 923, 911, 914, 922, + 696, 709, 712, 715, 717, 716, 720, 721, 725, 722, + 7165, 729, 726, 733, 735, 742, 739, 744, 746, 753, + 754, 738, 749, 750, 752, 755, 759, 757, 764, 761, + 763, 769, 766, 774, 776, 778, 779, 783, 796, 789, + 785, 786, 799, 787, 793, 797, 819, 824, 807, 801, + 811, 812, 825, 826, 829, 830, 833, 836, 834, 845, + 837, 842, 847, 848, 849, 850, 851, 859, 855, 7165, + 861, 864, 871, 872, 873, 880, 875, 876, 854, 886, + 888, 891, 893, 899, 921, 894, 904, 896, 901, 905, + 7165, 910, 909, 945, 903, 906, 932, 928, 930, 927, - 928, 951, 946, 924, 938, 948, 963, 960, 941, 949, - 966, 968, 970, 971, 978, 976, 974, 979, 982, 990, - 980, 985, 987, 1000, 988, 993, 995, 989, 1002, 1007, - 1013, 1006, 1017, 1018, 1020, 999, 1022, 1023, 1026, 1034, - 1057, 1030, 1028, 1027, 1025, 1035, 1051, 1031, 1047, 1046, - 933, 1055, 1048, 1058, 1063, 1065, 1061, 1067, 1072, 1083, - 1081, 1069, 1079, 1082, 1086, 1088, 1090, 1092, 1093, 1094, - 1095, 1096, 1099, 1104, 1107, 1105, 1109, 1113, 1115, 7121, - 1117, 7121, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, - 7121, 1132, 1133, 1127, 1134, 1141, 1146, 1149, 1153, 1154, + 935, 943, 936, 939, 938, 949, 953, 954, 972, 962, + 963, 969, 965, 974, 977, 971, 984, 987, 970, 981, + 991, 998, 994, 995, 996, 1002, 997, 1004, 1006, 1007, + 1008, 1009, 1013, 1023, 1024, 1025, 1012, 1003, 1029, 1030, + 1032, 1041, 1064, 1040, 1035, 1037, 1047, 1053, 1058, 1036, + 1054, 1055, 1065, 1066, 1056, 1038, 1067, 1073, 1070, 1074, + 1083, 1092, 1089, 1079, 1088, 1090, 1091, 1097, 1099, 1100, + 1101, 1102, 1104, 1103, 1112, 1105, 1121, 1110, 1113, 1123, + 1118, 7165, 1125, 7165, 1127, 1128, 1129, 1130, 1131, 1132, + 1133, 1135, 7165, 1138, 1141, 1142, 1149, 1146, 1151, 1154, - 1156, 1136, 1157, 1159, 1160, 1172, 1161, 1162, 1176, 1163, - 1173, 1175, 1179, 1180, 1182, 1183, 1185, 1186, 1188, 1191, - 1208, 7121, 1192, 1189, 1196, 1195, 1201, 1213, 1203, 1217, - 1226, 1215, 1232, 1223, 1229, 1246, 1233, 1225, 1244, 1236, - 1243, 1205, 1245, 1249, 1252, 1253, 1254, 1255, 1258, 1260, - 1261, 1262, 1264, 1272, 1268, 7121, 1275, 1276, 1281, 1279, - 1278, 1286, 1288, 1289, 1297, 1293, 1292, 1294, 1296, 1300, - 1295, 1304, 1306, 1317, 1313, 1320, 1321, 1316, 1323, 1318, - 1322, 1324, 1327, 1331, 1333, 1342, 1335, 1339, 1344, 1351, - 1353, 1355, 1362, 1364, 1357, 1346, 1359, 1365, 1361, 1360, + 1161, 1164, 1157, 1165, 1167, 1166, 1168, 1172, 1184, 1174, + 1179, 1191, 1175, 1187, 1177, 1186, 1193, 1190, 1188, 1196, + 1198, 1200, 1202, 1220, 7165, 1204, 1206, 1208, 1212, 1210, + 1213, 1217, 1231, 1232, 1230, 1238, 1242, 1244, 1254, 1247, + 1249, 1222, 1250, 1251, 1255, 1252, 1266, 1257, 1264, 1260, + 1268, 1270, 1274, 1278, 1279, 1280, 1282, 1205, 7165, 1281, + 1287, 1294, 1292, 1293, 1285, 1284, 1295, 1307, 1302, 1304, + 1306, 1308, 1311, 1312, 1315, 1319, 1320, 1316, 1330, 1331, + 1326, 1329, 1327, 1333, 1334, 1337, 1335, 1342, 1353, 1343, + 1346, 1350, 1361, 1360, 1363, 1370, 1372, 1357, 1365, 1367, - 1369, 1370, 1376, 1372, 1374, 1378, 1386, 1383, 1384, 1387, - 1385, 1392, 1396, 1389, 1391, 1394, 1398, 1400, 1401, 1408, - 1409, 1410, 1415, 1407, 1419, 1411, 1422, 1428, 1430, 1431, - 1432, 7121, 1440, 1437, 1436, 1444, 1449, 1450, 1451, 1441, - 1442, 1452, 1455, 1458, 1461, 1465, 1462, 1466, 1467, 1473, - 1469, 1472, 1480, 1476, 1483, 1493, 1492, 1494, 1479, 1487, - 1496, 1498, 1500, 1508, 1504, 1511, 1512, 1506, 1513, 1522, - 1507, 1514, 1523, 1530, 1517, 1525, 1532, 1526, 1538, 1533, - 1541, 1544, 1535, 1545, 1549, 1556, 1551, 1553, 1475, 1558, - 1559, 1563, 1565, 1566, 1560, 1567, 1574, 1569, 1571, 1570, + 1373, 1369, 1368, 1377, 1378, 1383, 1380, 1382, 1389, 1390, + 1391, 1392, 1394, 1395, 1399, 1397, 1402, 1404, 1405, 1407, + 1406, 1408, 1415, 1414, 1416, 1421, 1418, 1434, 1420, 1423, + 1437, 1440, 1427, 1431, 7165, 1449, 1444, 1447, 1448, 1451, + 1454, 1455, 1459, 1458, 1461, 1464, 1462, 1463, 1466, 1469, + 1470, 1471, 1472, 1473, 1479, 1486, 1481, 1490, 1497, 1496, + 1498, 1484, 1500, 1501, 1504, 1505, 1512, 1508, 1516, 1517, + 1507, 1518, 1511, 1531, 1521, 1522, 1528, 1542, 1519, 1537, + 1539, 1529, 1540, 1543, 1545, 1551, 1559, 1555, 1556, 1563, + 1564, 1558, 1566, 1560, 1570, 1573, 1574, 1575, 1576, 1577, - 1575, 1576, 1572, 1586, 1582, 1599, 1588, 1592, 1595, 1596, - 1600, 1601, 1605, 1604, 1602, 1610, 1611, 1612, 1613, 1614, - 1603, 1623, 1633, 1625, 1616, 1627, 1626, 1636, 1634, 1642, - 1643, 1644, 1647, 1646, 1645, 1649, 1655, 1648, 1657, 1658, - 1659, 1662, 1663, 1674, 1665, 1676, 1677, 1672, 1678, 1680, - 1682, 1683, 1684, 1689, 1690, 1693, 1696, 1694, 7121, 1698, - 1706, 1702, 1704, 1707, 1708, 1709, 1710, 1718, 1714, 1716, - 1713, 1715, 1719, 1741, 7121, 1727, 7121, 7121, 1730, 7121, - 7121, 1726, 1732, 7121, 1729, 1748, 1736, 1733, 1752, 1757, - 1764, 1744, 1759, 1762, 1766, 1773, 1787, 1770, 1769, 1771, + 1584, 1581, 1580, 1586, 1587, 1582, 1588, 1596, 1590, 1604, + 1594, 1603, 1606, 1609, 1610, 1611, 1612, 1615, 1613, 1619, + 1620, 1621, 1622, 1627, 1634, 1623, 1642, 1635, 1625, 1636, + 1643, 1645, 1651, 1652, 1653, 1654, 1655, 1656, 1658, 1659, + 1665, 1662, 1668, 1669, 1672, 1674, 1673, 1687, 1679, 1688, + 1689, 1676, 1692, 1694, 1695, 1696, 1697, 1700, 1702, 1705, + 1707, 1706, 7165, 1708, 1719, 1714, 1716, 1717, 1720, 1722, + 1723, 1730, 1726, 1728, 1725, 1729, 1731, 1755, 7165, 1737, + 7165, 7165, 1739, 7165, 7165, 1740, 1738, 7165, 1746, 1742, + 1750, 1745, 1758, 1765, 1769, 1771, 1763, 1772, 1753, 1784, - 1775, 1768, 1778, 1780, 1796, 1779, 1803, 1782, 1785, 1804, - 1815, 1811, 1812, 1816, 1817, 1819, 1821, 1824, 1823, 1830, - 1781, 1725, 1825, 1832, 1833, 1835, 1834, 1837, 1840, 1843, - 1845, 1841, 1839, 1847, 1856, 1858, 1849, 1866, 7121, 1862, - 1870, 1852, 1874, 1872, 1879, 1875, 1876, 1880, 1884, 1886, - 1881, 1887, 1890, 1892, 1891, 1893, 1894, 1897, 1900, 1903, - 1901, 1907, 1908, 1904, 7121, 1913, 1915, 1914, 1920, 1917, - 1918, 1927, 1919, 1928, 1930, 1929, 1937, 1934, 1940, 1935, - 1943, 1945, 1944, 1946, 1949, 7121, 1955, 1959, 1951, 1956, - 1963, 1947, 1965, 1966, 1969, 1970, 1971, 1973, 1974, 1976, + 1787, 1776, 1780, 1779, 1783, 1793, 1790, 1798, 1803, 1792, + 1804, 1795, 1807, 1812, 1822, 1813, 1823, 1819, 1825, 1826, + 1828, 1835, 1831, 1840, 1841, 1817, 1837, 1842, 1844, 1847, + 1845, 1848, 1850, 1854, 1851, 1855, 1857, 1858, 1867, 1870, + 1860, 1877, 7165, 1874, 1878, 1862, 1888, 1884, 1891, 1883, + 1887, 1890, 1895, 1897, 1892, 1899, 1901, 1903, 1902, 1904, + 1905, 1908, 1911, 1914, 1912, 1916, 1919, 1918, 1924, 7165, + 1925, 1926, 1928, 1932, 1929, 1930, 1939, 1931, 1940, 1941, + 1942, 1954, 1946, 1956, 1947, 1949, 1958, 1951, 1959, 1961, + 7165, 1969, 1974, 1963, 1976, 1966, 1970, 1978, 1979, 1980, - 1981, 1978, 1986, 1980, 1982, 1983, 1993, 2000, 1990, 2002, - 2006, 1991, 2003, 2009, 2011, 2012, 2013, 2014, 2015, 2017, - 2019, 2022, 2027, 2024, 2032, 2028, 2025, 2035, 2046, 2043, - 2030, 2041, 2050, 2044, 2051, 2054, 2062, 2057, 2058, 2059, - 2069, 2064, 2067, 2068, 2070, 2071, 2079, 2077, 2081, 2082, - 2080, 2088, 2090, 2091, 2093, 7121, 2094, 2095, 7121, 2097, - 2099, 2100, 2122, 2098, 2106, 2111, 2101, 2114, 2104, 2120, - 2117, 2123, 2130, 2126, 2142, 2139, 2144, 2145, 2147, 2150, - 2134, 2151, 2152, 2153, 2154, 2160, 2159, 2157, 2167, 2176, - 2177, 2179, 2180, 2187, 2173, 2182, 2184, 2203, 2185, 2183, + 1982, 1983, 1985, 1986, 1988, 1999, 1994, 1996, 1995, 1997, + 2005, 2009, 2002, 2012, 2013, 2021, 2014, 2017, 2022, 2023, + 2024, 2025, 2027, 2028, 2030, 2034, 2035, 2042, 2038, 2046, + 2039, 2041, 2057, 2062, 2044, 2055, 2058, 2059, 2060, 2065, + 2069, 2073, 2068, 2072, 2075, 2082, 2077, 2080, 2083, 2084, + 2091, 2093, 2085, 2095, 2102, 2086, 2096, 2098, 2105, 2104, + 7165, 2106, 2111, 7165, 2114, 2112, 2115, 2137, 2117, 2118, + 2120, 2126, 2129, 2131, 2134, 2135, 2133, 2139, 2143, 2155, + 2151, 2145, 2161, 2152, 2163, 2162, 2164, 2166, 2170, 2171, + 2172, 2179, 2176, 2183, 2192, 2193, 2190, 2199, 2201, 2175, - 2186, 2193, 2189, 2191, 2198, 2192, 2199, 2207, 2212, 2194, - 2220, 2216, 2215, 2218, 2219, 2224, 2225, 2233, 2230, 2228, - 7121, 2244, 2237, 2239, 2241, 2247, 2251, 2249, 2250, 7121, - 2252, 2253, 2255, 2263, 2256, 2259, 2267, 2264, 2266, 2268, - 2270, 2274, 2276, 2273, 2275, 2287, 7121, 2277, 7121, 2286, - 2289, 2290, 2291, 2294, 2296, 2297, 2298, 2299, 7121, 7121, - 2301, 2302, 2315, 2313, 2323, 2318, 2305, 2319, 7121, 2321, - 2330, 7121, 2334, 2322, 2326, 2328, 2331, 2333, 2336, 2339, - 2350, 2341, 2352, 2342, 2353, 2345, 7121, 2355, 2360, 2343, - 2362, 2365, 2366, 2368, 2369, 2371, 2372, 7121, 2373, 2375, + 2196, 2198, 2217, 2200, 2202, 2205, 2208, 2203, 2206, 2213, + 2210, 2214, 2222, 2227, 2224, 2235, 2233, 2230, 2232, 2239, + 2234, 2244, 2248, 2245, 2251, 7165, 2259, 2254, 2256, 2258, + 2260, 2267, 2264, 2265, 7165, 2268, 2270, 2266, 2278, 2274, + 2276, 2280, 2281, 2286, 2287, 2290, 2288, 2289, 2293, 2291, + 2309, 7165, 2294, 7165, 2292, 2296, 2312, 2304, 2305, 2311, + 2313, 2315, 2321, 7165, 7165, 2322, 2324, 2330, 2338, 2340, + 2335, 2336, 2337, 7165, 2325, 2348, 7165, 2345, 2339, 2352, + 2343, 2353, 2356, 2358, 2361, 2360, 2365, 2362, 2369, 2364, + 2366, 2367, 7165, 2377, 2380, 2368, 2385, 2386, 2384, 2387, - 2380, 2387, 2389, 2383, 2378, 2390, 2394, 2385, 2397, 2398, - 2399, 2400, 2407, 2410, 2411, 2409, 2412, 2421, 2419, 2426, - 7121, 2422, 2423, 2408, 2431, 2429, 2433, 2430, 2435, 2437, - 2436, 2438, 2440, 2445, 2447, 2446, 2449, 2450, 2452, 2459, - 2461, 2460, 2463, 2465, 2466, 2456, 2469, 2472, 2477, 2474, - 2478, 2476, 2479, 7121, 2480, 2483, 2486, 2484, 2488, 2491, - 280, 2496, 2497, 2501, 2498, 2500, 2502, 2506, 2507, 2514, - 2521, 2516, 2518, 2520, 2519, 2525, 2526, 2528, 2529, 2530, - 2531, 2535, 2536, 2537, 7121, 2546, 2538, 2541, 2543, 2547, - 2548, 2550, 7121, 2557, 2562, 2560, 2571, 2567, 2572, 2573, + 2388, 2392, 2394, 7165, 2395, 2398, 2399, 2408, 2404, 2407, + 2409, 2410, 2411, 2415, 2417, 2418, 2419, 2421, 2426, 2429, + 2430, 2432, 2435, 2431, 2439, 2447, 7165, 2443, 2428, 2442, + 2451, 2449, 2453, 2450, 2455, 2456, 2457, 2458, 2460, 2465, + 2467, 2466, 2469, 2470, 2472, 2479, 2480, 2481, 2483, 2485, + 2476, 2486, 2489, 2490, 2318, 2492, 2493, 2494, 2497, 7165, + 2498, 2504, 2499, 2506, 2509, 2505, 280, 2512, 2515, 2516, + 2518, 2520, 2519, 2532, 2521, 2533, 2542, 2524, 2538, 2535, + 2539, 2545, 2546, 2547, 2548, 2549, 2550, 2551, 2554, 2555, + 7165, 2557, 2561, 2562, 2564, 2565, 2566, 2573, 7165, 2572, - 2575, 2577, 2578, 2579, 2580, 2581, 2588, 2585, 2583, 2589, - 2591, 7121, 2602, 2598, 2604, 2592, 2606, 2613, 2596, 2607, - 2608, 2614, 2615, 2616, 2619, 2620, 2621, 2624, 2625, 2628, - 2629, 2636, 2635, 2637, 2638, 2639, 2641, 2646, 2642, 2648, - 2649, 2656, 2651, 7121, 2659, 2652, 2662, 2666, 2663, 2665, - 2670, 2668, 2678, 2669, 2679, 2682, 2684, 2696, 2686, 2689, - 2700, 2690, 2687, 2702, 2712, 2703, 2713, 2716, 2707, 2720, - 2722, 2710, 2714, 2729, 2724, 2726, 2731, 2734, 2735, 2743, - 2744, 2740, 2747, 2739, 2741, 2749, 2742, 2762, 2767, 2758, - 7121, 2766, 2760, 2768, 2771, 2778, 2773, 2774, 2776, 2779, + 2581, 2583, 2585, 2570, 2590, 2591, 2593, 2595, 2596, 2597, + 2598, 2599, 2606, 2603, 2601, 2607, 2609, 7165, 2620, 2616, + 2622, 2610, 2624, 2631, 2614, 2625, 2626, 2632, 2633, 2634, + 2637, 2638, 2639, 2642, 2643, 2646, 2647, 2654, 2653, 2655, + 2656, 2657, 2659, 2664, 2660, 2666, 2667, 2674, 2669, 7165, + 2677, 2670, 2680, 2684, 2681, 2683, 2688, 2686, 2696, 2687, + 2697, 2700, 2702, 2714, 2704, 2707, 2718, 2708, 2705, 2720, + 2730, 2721, 2731, 2734, 2725, 2738, 2740, 2728, 2732, 2747, + 2742, 2744, 2749, 2752, 2753, 2761, 2762, 2758, 2765, 2757, + 2759, 2767, 2760, 2780, 2785, 2776, 7165, 2784, 2778, 2786, - 2783, 2784, 2785, 2787, 2794, 2789, 2795, 2791, 2797, 2800, - 2798, 2806, 2802, 2808, 2810, 2813, 2817, 2814, 2820, 2821, - 7121, 2822, 2827, 2824, 2828, 2831, 2833, 2839, 2840, 2842, - 2834, 2836, 2844, 2846, 2848, 2849, 2851, 2850, 2858, 2856, - 2860, 2862, 2859, 7121, 2871, 2863, 2867, 2876, 2872, 2879, - 2875, 2882, 2885, 2889, 2890, 2892, 2893, 2895, 2896, 2899, - 7121, 2904, 2906, 2902, 2905, 2914, 2909, 2913, 2915, 2917, - 2919, 7121, 2920, 2922, 2921, 2923, 2924, 2927, 2934, 2935, - 2930, 2937, 7121, 2947, 2942, 2933, 2943, 2945, 2946, 2949, - 2951, 2954, 2955, 2958, 2959, 2961, 2966, 2968, 2970, 7121, + 2789, 2790, 2797, 2792, 2794, 2795, 2798, 2802, 2803, 2804, + 2805, 2814, 2809, 2813, 2818, 2815, 2827, 2817, 2821, 2828, + 2820, 2824, 2834, 2837, 2833, 2841, 2842, 7165, 2843, 2845, + 2847, 2851, 2853, 2854, 2856, 2857, 2859, 2861, 2862, 2863, + 2868, 2865, 2869, 2870, 2871, 2878, 2875, 2879, 2887, 2876, + 7165, 2890, 2877, 2895, 2896, 2897, 2898, 2899, 2900, 2906, + 2910, 2912, 2914, 2902, 2916, 2917, 2918, 7165, 2927, 2929, + 2925, 2928, 2932, 2934, 2935, 2936, 2938, 2939, 7165, 2940, + 2942, 2941, 2946, 2944, 2881, 2955, 2956, 2952, 2957, 7165, + 2969, 2953, 2962, 2965, 2966, 2970, 2971, 2974, 2972, 2976, - 2969, 2978, 2971, 2973, 2984, 2981, 2983, 2985, 2994, 2987, - 3004, 2993, 7121, 3011, 2986, 2997, 3015, 3001, 3010, 3012, - 3013, 3016, 3017, 3019, 3023, 3024, 3025, 7121, 3026, 3028, - 3031, 3032, 3034, 3035, 3039, 3047, 3042, 3044, 3048, 3050, - 3051, 3055, 3052, 3056, 3062, 3063, 3057, 3059, 3065, 3072, - 3076, 3077, 3078, 3081, 3085, 3089, 3087, 3092, 3095, 3084, - 3088, 3096, 3097, 3105, 3106, 3109, 3107, 3110, 7121, 3113, - 3114, 3115, 3116, 3119, 3121, 3122, 3120, 3125, 3123, 3128, - 3133, 3139, 3129, 3146, 3150, 3141, 3151, 3147, 3154, 3155, - 3157, 3156, 3158, 3142, 3165, 3163, 3167, 3169, 3176, 3171, + 2977, 2981, 2979, 2988, 2980, 2991, 7165, 2983, 2999, 2990, + 3000, 3004, 3005, 3006, 3007, 3010, 3011, 3014, 3013, 7165, + 3023, 3024, 3026, 3035, 3030, 3031, 3032, 3033, 3036, 3039, + 3040, 3042, 3043, 3045, 7165, 3046, 3051, 3052, 3053, 3055, + 3056, 3047, 3067, 3063, 3064, 3068, 3071, 3073, 3076, 3077, + 3078, 3072, 3081, 3082, 3084, 3089, 3092, 3094, 3090, 3095, + 3101, 3103, 3110, 3106, 3107, 3112, 3113, 3114, 3116, 3117, + 3124, 3127, 3129, 3125, 3131, 7165, 3134, 3135, 3136, 3128, + 3138, 3140, 3141, 3142, 3143, 3147, 3152, 3157, 3155, 3158, + 3165, 3172, 3148, 3173, 3161, 3163, 3170, 3176, 3175, 3178, - 3174, 3183, 3172, 3179, 3181, 3182, 3184, 3185, 3186, 3189, - 3192, 3194, 3196, 3202, 3205, 3209, 3211, 3213, 3212, 3206, - 3214, 3220, 3222, 7121, 3225, 3226, 3227, 3229, 3230, 3235, - 3232, 3244, 3236, 3239, 3253, 3240, 3250, 3255, 3248, 3256, - 3257, 3258, 3267, 3263, 7121, 3264, 7121, 3260, 3265, 3271, - 3275, 3273, 7121, 3277, 7121, 3280, 3285, 3279, 3286, 3287, - 7121, 3288, 3289, 3292, 3290, 3294, 3296, 3298, 3300, 3301, - 3304, 3305, 3317, 3306, 3315, 3308, 3316, 3318, 3322, 3327, - 3323, 3329, 3325, 3333, 3335, 3332, 3338, 3339, 3341, 3345, - 3344, 3346, 3349, 3351, 7121, 3353, 3354, 3359, 3360, 3361, + 3183, 3190, 3186, 3185, 3187, 3195, 3188, 3193, 3202, 3192, + 3197, 3200, 3203, 3204, 3206, 3208, 3209, 3214, 3218, 3212, + 3217, 3225, 3227, 3233, 3230, 3234, 3228, 3239, 3240, 3242, + 3244, 7165, 3243, 3247, 3245, 3248, 3251, 3257, 3253, 3265, + 3262, 3266, 3270, 3269, 3271, 3272, 3273, 3278, 3280, 3281, + 3288, 3284, 7165, 3285, 7165, 3286, 3287, 3290, 3300, 3295, + 7165, 3298, 7165, 3299, 3305, 3306, 3308, 3309, 7165, 3310, + 3311, 3314, 3312, 3316, 3317, 3320, 3319, 3323, 3326, 3327, + 3339, 3328, 3337, 3330, 3338, 3343, 3344, 3349, 3345, 3347, + 3351, 3352, 3355, 3357, 3358, 3362, 3360, 3366, 3369, 3370, - 3362, 3367, 3366, 3369, 3370, 3373, 3374, 3371, 3378, 3379, - 3388, 3384, 3389, 3390, 3400, 3391, 3403, 3392, 3407, 3404, - 7121, 3405, 3414, 3406, 3411, 7121, 3415, 3408, 3421, 3423, - 3416, 3418, 3426, 3428, 3433, 3427, 3435, 3429, 3437, 3444, - 3446, 3439, 7121, 3448, 3454, 3450, 3453, 3461, 3452, 3468, - 3469, 3465, 3466, 3471, 3479, 3477, 3474, 3478, 3464, 3480, - 3481, 3491, 3492, 3494, 3490, 3499, 3489, 3497, 3504, 3501, - 3498, 3505, 3507, 3508, 3509, 3510, 3513, 3511, 3514, 3515, - 3518, 3517, 3530, 7121, 3521, 3522, 3531, 3538, 3535, 3540, - 3541, 3543, 3542, 3546, 3549, 7121, 3551, 3548, 3554, 3552, + 3371, 3372, 7165, 3376, 3381, 3373, 3383, 3379, 3387, 3389, + 3391, 3392, 3393, 3398, 3396, 3394, 3400, 3401, 3409, 3404, + 3412, 3402, 3414, 3419, 3429, 3415, 3431, 3427, 7165, 3426, + 3434, 3428, 3430, 7165, 3437, 3438, 3443, 3445, 3439, 3441, + 3448, 3449, 3450, 3454, 3455, 3456, 3465, 3464, 3461, 3470, + 7165, 3460, 3474, 3457, 3475, 3481, 3477, 3490, 3491, 3487, + 3493, 3495, 3503, 3499, 3498, 3488, 3486, 3500, 3507, 3508, + 3515, 3518, 3514, 3522, 3513, 3521, 3524, 3525, 3517, 3527, + 3529, 3531, 3528, 3532, 3538, 3537, 3533, 3539, 3554, 3534, + 3550, 7165, 3549, 3559, 3560, 3568, 3544, 3563, 3545, 3566, - 3565, 3560, 3553, 3562, 3569, 3570, 3573, 3571, 3572, 3574, - 7121, 3576, 7121, 3577, 3580, 3593, 3595, 3585, 3582, 3598, - 3604, 3599, 3589, 3605, 3606, 3611, 3607, 3613, 3614, 3615, - 3618, 3619, 3631, 3621, 3617, 3622, 3632, 3633, 3635, 3636, - 3644, 3641, 3647, 7121, 7121, 3637, 3639, 3653, 3640, 3655, - 3660, 3666, 3663, 3668, 3658, 3648, 3670, 3680, 7121, 3671, - 3677, 3678, 3682, 3683, 3690, 3686, 3694, 3695, 3691, 3698, - 3705, 3701, 7121, 3702, 3703, 3714, 3706, 3715, 3716, 7121, - 3713, 7121, 3709, 3711, 3720, 3723, 3727, 3725, 3729, 3726, - 3733, 3736, 3737, 3741, 3744, 3749, 3745, 3747, 3753, 3754, + 3567, 3540, 3569, 7165, 3575, 3572, 3576, 3577, 3582, 3584, + 3586, 3585, 3587, 3593, 3591, 3590, 3595, 3594, 7165, 3596, + 7165, 3598, 3612, 3614, 3618, 3608, 3601, 3621, 3626, 3622, + 3627, 3628, 3629, 3631, 3630, 3634, 3638, 3637, 3639, 3643, + 3659, 3641, 3654, 3642, 3644, 3645, 3655, 3658, 3666, 3667, + 3664, 7165, 7165, 3668, 3670, 3677, 3679, 3671, 3675, 3680, + 3689, 3683, 3686, 3694, 3696, 3697, 3706, 7165, 3699, 3701, + 3698, 3702, 3708, 3709, 3710, 3719, 3727, 3724, 3711, 3732, + 3730, 7165, 3714, 3723, 3739, 3731, 3738, 3746, 7165, 3735, + 7165, 3742, 3745, 3748, 3749, 3750, 3751, 3752, 3753, 3756, - 3755, 3756, 3758, 3759, 3767, 3763, 3764, 3765, 7121, 3769, - 3766, 3777, 3771, 3770, 3779, 3782, 3788, 3778, 7121, 3789, - 3793, 3791, 3792, 3795, 3799, 3796, 3805, 3803, 3807, 3808, - 3809, 3811, 3812, 3814, 7121, 3816, 3819, 3827, 3820, 3825, - 3828, 3830, 3833, 3831, 3838, 7121, 3840, 3841, 3848, 3847, - 3844, 3852, 3855, 3849, 3853, 3859, 3860, 3857, 3861, 3863, - 3864, 3865, 3868, 3870, 3867, 3881, 3883, 3874, 3885, 3896, - 3882, 7121, 3891, 3894, 3895, 3899, 3897, 3898, 3902, 3904, - 3909, 3911, 3901, 3920, 3922, 3906, 3912, 3924, 3926, 3928, - 3935, 3931, 7121, 3936, 3937, 3944, 3941, 3939, 3940, 3948, + 3754, 3758, 3771, 3779, 3780, 3763, 3775, 3777, 3778, 3781, + 3782, 3784, 3787, 3791, 3786, 3789, 3793, 7165, 3795, 3790, + 3802, 3804, 3796, 3807, 3813, 3814, 3797, 7165, 3815, 3819, + 3821, 3817, 3822, 3831, 3825, 3827, 3832, 3834, 3835, 3836, + 3838, 3841, 3842, 7165, 3843, 3846, 3855, 3847, 3852, 3857, + 3861, 3864, 3848, 3872, 7165, 3869, 3856, 3879, 3876, 3877, + 3878, 3881, 3882, 3883, 3885, 3886, 3887, 3888, 3890, 3894, + 3895, 3891, 3898, 3897, 3909, 3908, 3900, 3912, 3922, 3918, + 7165, 3919, 3923, 3924, 3925, 3926, 3927, 3931, 3932, 3937, + 3949, 3930, 3952, 3953, 3934, 3938, 3940, 3957, 3958, 3966, - 3942, 3949, 3951, 3952, 3953, 3956, 3958, 3959, 3965, 3972, - 3968, 3957, 3971, 3973, 3975, 3976, 3978, 3979, 3983, 7121, - 3991, 3992, 3984, 3995, 3994, 4000, 4007, 4002, 4003, 4004, - 4009, 4010, 4012, 4014, 4016, 4017, 4020, 4021, 7121, 7121, - 4027, 4022, 4024, 7121, 4028, 4029, 4045, 4030, 4032, 4035, - 4040, 4042, 4043, 4044, 4053, 4048, 4051, 7121, 4063, 4059, - 4066, 4058, 4061, 4071, 4073, 7121, 4062, 4082, 4080, 4072, - 4083, 4069, 4084, 4085, 4086, 4087, 4091, 4093, 4094, 4102, - 4105, 4097, 4100, 4104, 7121, 4101, 4106, 4107, 4111, 4113, - 4114, 4116, 7121, 4120, 4118, 4125, 4123, 4127, 4135, 4138, + 3964, 7165, 3969, 3965, 3974, 3970, 3971, 3973, 3978, 3972, + 3979, 3981, 3982, 3985, 3986, 3988, 3989, 3994, 4001, 3998, + 3987, 4000, 4002, 4009, 4004, 4005, 4008, 4014, 7165, 4027, + 4016, 4013, 4029, 4023, 4020, 4038, 4033, 4036, 4037, 4040, + 4041, 4043, 4045, 4046, 4047, 4050, 4051, 7165, 7165, 4053, + 4054, 4055, 7165, 4057, 4059, 4069, 3928, 4061, 4062, 4070, + 4074, 4073, 4072, 4075, 4077, 4078, 7165, 4090, 4086, 4093, + 4088, 4089, 4101, 4097, 7165, 4092, 4106, 4105, 4102, 4109, + 4110, 4112, 4114, 4113, 4115, 4117, 4119, 4121, 4122, 4130, + 4134, 4126, 4129, 4131, 7165, 4136, 4138, 4140, 4142, 4139, - 4130, 4144, 4132, 4140, 4145, 4147, 4148, 4149, 4150, 4157, - 4155, 4156, 4158, 4159, 4161, 4165, 4174, 7121, 4167, 4175, - 4162, 4179, 4181, 7121, 4188, 4195, 4183, 7121, 4196, 4185, - 4192, 4193, 4204, 7121, 4200, 4199, 4201, 4206, 4202, 4214, - 4209, 4216, 4218, 4215, 4219, 4220, 4221, 7121, 4223, 4222, - 4224, 7121, 4237, 4240, 4244, 4247, 4249, 4230, 4232, 4251, - 4253, 4254, 4252, 7121, 4259, 4256, 7121, 4262, 4263, 4266, - 7121, 4268, 4269, 4271, 4273, 4270, 4277, 4278, 4284, 4286, - 4274, 4288, 4289, 4290, 4238, 4291, 4298, 4293, 4295, 4299, - 4300, 7121, 4301, 4303, 4306, 4310, 4305, 4322, 4318, 4308, + 4143, 4149, 7165, 4148, 4150, 4152, 4155, 4157, 4159, 4165, + 4168, 4171, 4172, 4173, 4175, 4176, 4177, 4178, 4180, 4188, + 4174, 4186, 4185, 4183, 4203, 4204, 4191, 7165, 4199, 4206, + 4189, 4207, 4211, 7165, 4214, 4221, 4224, 7165, 4225, 4216, + 4223, 4226, 4233, 7165, 4229, 4230, 4231, 4235, 4232, 4245, + 4237, 4246, 4248, 4244, 4249, 4250, 4252, 7165, 4253, 4251, + 4256, 7165, 4267, 4268, 4272, 4275, 4277, 4258, 4260, 4279, + 4281, 4282, 4280, 7165, 4287, 4284, 7165, 4290, 4291, 4294, + 7165, 4296, 4297, 4299, 4301, 4298, 4305, 4306, 4312, 4314, + 4302, 4316, 4317, 4318, 4319, 4321, 4330, 4320, 4327, 4328, - 4312, 4324, 4326, 7121, 7121, 4331, 7121, 4332, 4328, 4334, - 4336, 7121, 4338, 4337, 4346, 4341, 4342, 4345, 4348, 4355, - 4349, 7121, 4360, 4361, 7121, 4356, 4363, 4370, 4367, 4365, - 4368, 4371, 4373, 4375, 4377, 4380, 4382, 4378, 4383, 4385, - 4387, 4386, 4403, 4389, 4404, 7121, 4388, 4399, 4405, 4414, - 4400, 4407, 4416, 4415, 4409, 7121, 4421, 4428, 4424, 4431, - 4425, 7121, 4434, 7121, 4433, 4435, 4437, 4438, 4439, 4447, - 7121, 4446, 4445, 4453, 4450, 4455, 4454, 4457, 4461, 4463, - 4464, 4465, 4473, 4469, 4470, 4468, 4478, 4471, 7121, 4475, - 4484, 4487, 4488, 4490, 4491, 4492, 4499, 4495, 4502, 4496, + 4329, 7165, 4332, 4331, 4339, 4341, 4334, 4351, 4347, 4345, + 4340, 4353, 4342, 7165, 7165, 4360, 7165, 4362, 4363, 4364, + 4366, 7165, 4368, 4367, 4375, 4370, 4371, 4374, 4373, 4378, + 4384, 7165, 4386, 4388, 7165, 4390, 4393, 4400, 4395, 4396, + 4397, 4398, 4401, 4405, 4404, 4408, 4410, 4411, 4412, 4407, + 4421, 4416, 4429, 4415, 4434, 7165, 4417, 4427, 4432, 4442, + 4439, 4435, 4443, 4447, 4445, 7165, 4449, 4456, 4448, 4459, + 4460, 7165, 4461, 7165, 4451, 4462, 4463, 4472, 4468, 4479, + 7165, 4476, 4477, 4481, 4482, 4483, 4484, 4485, 4489, 4492, + 4493, 4495, 4502, 4498, 4499, 4497, 4506, 4513, 7165, 4501, - 4497, 4508, 4503, 4509, 4516, 4511, 4518, 4519, 7121, 4521, - 4522, 4524, 4527, 4536, 4528, 4529, 4532, 7121, 4533, 4541, - 4542, 7121, 4539, 4543, 4549, 4551, 4553, 4554, 4555, 4559, - 4556, 4560, 4561, 4557, 7121, 4565, 4566, 4564, 4580, 4582, - 4570, 4568, 7121, 7121, 4583, 7121, 4588, 4567, 4591, 4592, - 4593, 4595, 4597, 4598, 4600, 4601, 4603, 4605, 4608, 4611, - 7121, 4612, 4620, 4615, 4627, 4623, 4634, 4629, 7121, 4625, - 4616, 7121, 7121, 4639, 4640, 4635, 4643, 4645, 4647, 4630, - 7121, 4656, 4649, 4651, 4658, 4660, 4667, 7121, 4664, 4653, - 4670, 4662, 7121, 4663, 4671, 4669, 4672, 4675, 4677, 4678, + 4504, 4507, 4517, 4522, 4514, 4524, 4526, 4533, 4529, 4528, + 4531, 4532, 4536, 4538, 4541, 4543, 4545, 4547, 4537, 7165, + 4553, 4551, 4556, 4559, 4567, 4562, 4564, 4565, 7165, 4569, + 4570, 4571, 7165, 4572, 4568, 4578, 4583, 4579, 4584, 4586, + 4589, 4590, 4592, 4593, 4591, 7165, 4595, 4598, 4594, 4611, + 4612, 4600, 4601, 7165, 7165, 4618, 7165, 4620, 4599, 4613, + 4603, 4623, 4625, 4630, 4627, 4632, 4633, 4635, 4638, 4639, + 4640, 7165, 4641, 4649, 4645, 4656, 4652, 4663, 4658, 7165, + 4662, 4659, 7165, 7165, 4665, 4668, 4666, 4672, 4673, 4676, + 4677, 7165, 4684, 4680, 4681, 4687, 4691, 4698, 7165, 4689, - 4679, 4681, 4683, 4685, 4689, 4691, 4696, 4690, 4697, 4698, - 4700, 4702, 4704, 4707, 4710, 4714, 7121, 4703, 4715, 4717, - 4718, 4719, 4722, 4724, 4726, 4727, 4729, 4731, 7121, 4730, - 7121, 4735, 4738, 4749, 4751, 4740, 4733, 4754, 4741, 4756, - 4757, 4758, 4761, 4762, 4765, 4766, 4771, 4767, 4773, 4776, - 4779, 7121, 4778, 4784, 4786, 4790, 4792, 4794, 4795, 7121, - 4796, 4797, 4798, 4803, 4805, 4807, 4808, 4810, 4811, 4813, - 4816, 4814, 4821, 4823, 4824, 4825, 4826, 4828, 4830, 7121, - 4832, 4836, 4833, 4840, 4841, 4845, 4847, 4848, 4854, 4857, - 4844, 4846, 4858, 7121, 4862, 4864, 4866, 7121, 4867, 4869, + 4690, 4697, 4699, 7165, 4700, 4702, 4703, 4705, 4704, 4706, + 4711, 4708, 4712, 4713, 4715, 4718, 4716, 4729, 4721, 4723, + 4730, 4732, 4733, 4736, 4737, 4738, 4743, 7165, 4745, 4740, + 4746, 4747, 4751, 4754, 4757, 4758, 4755, 4760, 4768, 7165, + 4769, 7165, 4764, 4761, 4780, 4770, 4763, 4788, 4785, 4789, + 4782, 4773, 4791, 4793, 4798, 4801, 4794, 4803, 4804, 4807, + 4808, 4809, 7165, 4812, 4814, 4816, 4818, 4824, 4826, 4828, + 7165, 4829, 4820, 4831, 4832, 4836, 4838, 4839, 4842, 4843, + 4846, 4847, 4848, 4850, 4855, 4852, 4856, 4857, 4859, 4860, + 7165, 4863, 4870, 4864, 4872, 4867, 4875, 4876, 4878, 4886, - 4868, 4871, 4872, 4874, 4875, 4880, 4878, 4881, 7121, 4889, - 4879, 4890, 4892, 4882, 4895, 4901, 4898, 4902, 4905, 4907, - 4908, 7121, 4910, 4915, 4912, 4918, 4919, 4920, 4921, 4925, - 4922, 7121, 4929, 4931, 4932, 4935, 4945, 4946, 4938, 4941, - 4949, 4947, 4953, 4951, 4954, 4957, 4955, 4961, 4962, 4963, - 4964, 4965, 4974, 4983, 4978, 7121, 4966, 7121, 4969, 4981, - 4984, 4993, 4991, 4988, 4994, 4996, 4998, 7121, 4999, 5003, - 5005, 5002, 5007, 7121, 5009, 5006, 5008, 5012, 7121, 5010, - 5025, 5011, 5014, 5028, 5032, 7121, 5035, 5036, 5037, 5044, - 5046, 5041, 5048, 5029, 5051, 5045, 5049, 5053, 5054, 5062, + 4889, 4877, 4884, 4890, 7165, 4891, 4893, 4895, 4903, 7165, + 4898, 4900, 4901, 4904, 4905, 4908, 4910, 4911, 4913, 4917, + 7165, 4921, 4914, 4923, 4922, 4925, 4926, 4927, 4931, 4937, + 4939, 4933, 4946, 7165, 4947, 4940, 4945, 4951, 4953, 4954, + 4955, 4958, 4959, 7165, 4960, 4968, 4969, 4962, 4981, 4986, + 4961, 4972, 4989, 4979, 4988, 4970, 4990, 4991, 4992, 4996, + 4997, 4998, 4999, 5000, 5010, 5015, 5013, 7165, 5001, 7165, + 5002, 5011, 5018, 5029, 5024, 5026, 5027, 5031, 5030, 7165, + 5016, 5037, 5039, 5034, 5042, 7165, 5043, 5040, 5044, 5045, + 7165, 5058, 5041, 5047, 5048, 5063, 5064, 7165, 5069, 5070, - 5059, 5060, 7121, 5064, 5058, 5067, 5069, 5070, 5071, 5076, - 5077, 5078, 5084, 5079, 7121, 5081, 5087, 5088, 5089, 5090, - 5091, 5093, 5094, 5102, 5100, 5110, 5098, 5101, 5103, 5112, - 5105, 5115, 7121, 5118, 5119, 5123, 5127, 5131, 5124, 5134, - 7121, 5129, 7121, 5133, 5137, 5139, 5141, 5142, 7121, 5145, - 5146, 5150, 5152, 7121, 7121, 5154, 5161, 5156, 5160, 5157, - 7121, 7121, 5163, 7121, 5164, 7121, 5165, 5167, 7121, 7121, - 5169, 5170, 5171, 5172, 5173, 5181, 7121, 5185, 7121, 5193, - 5175, 5188, 5186, 5190, 5194, 7121, 5191, 5197, 5201, 5203, - 5205, 7121, 5198, 5208, 5217, 5206, 5216, 7121, 5219, 5220, + 5066, 5078, 5080, 5075, 5077, 5079, 5081, 5083, 5085, 5086, + 5087, 5096, 5089, 5092, 7165, 5094, 5101, 5107, 5108, 5109, + 5091, 5102, 5110, 5112, 5118, 5115, 7165, 5119, 5120, 5121, + 5122, 5123, 5125, 5126, 5127, 5139, 5138, 5134, 5131, 5136, + 5143, 5145, 5147, 5152, 7165, 5148, 5153, 5154, 5163, 5164, + 5165, 5170, 7165, 5166, 7165, 5167, 5171, 5176, 5179, 5183, + 7165, 5186, 5187, 5174, 5191, 7165, 7165, 5193, 5194, 5195, + 5199, 5196, 7165, 7165, 5202, 7165, 5203, 7165, 5204, 5206, + 7165, 7165, 5156, 5208, 5209, 5210, 5211, 5213, 7165, 5220, + 7165, 5223, 5224, 5225, 5227, 5214, 5228, 7165, 5229, 5232, - 5209, 5221, 7121, 5225, 5230, 5222, 5232, 5233, 5234, 5235, - 5236, 5237, 5241, 5244, 5243, 5245, 5246, 5249, 5253, 5258, - 5260, 5262, 5263, 5264, 5267, 5268, 5270, 5273, 5276, 5277, - 5278, 5279, 5280, 5284, 5286, 5283, 5292, 5294, 5287, 5296, - 5303, 5304, 5305, 5289, 5307, 5306, 5308, 5314, 5310, 5321, - 5316, 5318, 5322, 5323, 5325, 5324, 5327, 5331, 5332, 5336, - 5334, 5337, 7121, 5330, 5340, 5341, 5350, 5344, 5351, 5354, - 5361, 5366, 5367, 7121, 5369, 7121, 5371, 5355, 5363, 5357, - 5375, 7121, 5377, 5378, 5379, 5380, 5382, 5383, 5384, 5385, - 5381, 5388, 5392, 7121, 5394, 5408, 5395, 5389, 5404, 5415, + 5237, 5238, 5240, 7165, 5231, 5242, 5246, 5259, 5245, 5241, + 7165, 5255, 5257, 5258, 5261, 7165, 5264, 5267, 5268, 5262, + 5269, 5270, 5271, 5178, 5272, 5274, 5275, 5284, 5281, 5282, + 5285, 5292, 5294, 5296, 5298, 5299, 5300, 5303, 5304, 5306, + 5309, 5312, 5313, 5314, 5315, 5316, 5320, 5322, 5319, 5328, + 5330, 5323, 5332, 5339, 5340, 5341, 5325, 5343, 5342, 5344, + 5350, 5346, 5357, 5352, 5354, 5358, 5359, 5361, 5360, 5363, + 5367, 5368, 5372, 5370, 5373, 7165, 5366, 5376, 5377, 5386, + 5380, 5387, 5390, 5397, 5402, 5403, 7165, 5405, 7165, 5407, + 5391, 5399, 5393, 5411, 7165, 5413, 5414, 5415, 5416, 5418, - 7121, 5410, 5417, 5402, 5412, 5418, 5421, 5422, 5423, 5424, - 5427, 5425, 5426, 5432, 5435, 5429, 5438, 5439, 7121, 5447, - 5451, 5454, 5440, 5452, 5453, 5455, 5457, 5459, 5461, 5462, - 5463, 5465, 5466, 5467, 5473, 5479, 5476, 5484, 5489, 7121, - 5472, 7121, 5490, 5492, 5493, 5480, 5496, 5497, 5494, 5498, - 7121, 7121, 5495, 5503, 5504, 5509, 5510, 5506, 5513, 5516, - 5518, 5519, 7121, 5520, 5522, 5526, 5532, 5529, 7121, 5534, - 5536, 5537, 5539, 7121, 5540, 5541, 5543, 5544, 5554, 5546, - 5559, 5555, 5561, 5548, 5551, 5562, 5567, 7121, 7121, 7121, - 7121, 5568, 5571, 5573, 5574, 5575, 5576, 5577, 5581, 5583, + 5419, 5420, 5421, 5417, 5424, 5428, 7165, 5430, 5444, 5431, + 5425, 5440, 5451, 7165, 5446, 5453, 5438, 5448, 5454, 5457, + 5458, 5459, 5460, 5463, 5461, 5462, 5468, 5471, 5465, 5474, + 5475, 7165, 5483, 5487, 5490, 5476, 5488, 5489, 5491, 5493, + 5495, 5497, 5498, 5499, 5501, 5502, 5503, 5509, 5515, 5512, + 5520, 5525, 7165, 5508, 7165, 5526, 5528, 5529, 5516, 5532, + 5533, 5530, 5534, 7165, 7165, 5531, 5539, 5540, 5545, 5546, + 5542, 5549, 5552, 5554, 5555, 7165, 5556, 5558, 5562, 5566, + 5565, 5567, 7165, 5572, 5574, 5575, 5577, 7165, 5578, 5579, + 5581, 5582, 5592, 5584, 5597, 5593, 5599, 5586, 5589, 5600, - 5579, 5580, 5584, 7121, 5595, 7121, 7121, 5591, 7121, 5597, - 5598, 5601, 5603, 5585, 5605, 5607, 7121, 5608, 7121, 5613, - 5616, 5609, 5620, 5626, 5617, 5610, 5628, 5630, 5631, 5632, - 5633, 5640, 5638, 5641, 5639, 5644, 5646, 5648, 7121, 7121, - 5652, 5656, 5657, 5659, 5661, 5662, 5663, 5670, 5668, 5669, - 5671, 5673, 5675, 5676, 5684, 5685, 5681, 5682, 5690, 7121, - 5691, 5687, 5693, 7121, 5695, 7121, 5699, 5700, 5701, 5702, - 5703, 5708, 5709, 5710, 5712, 5714, 7121, 7121, 5713, 5728, - 5723, 7121, 7121, 5715, 5724, 5725, 5727, 5733, 5730, 5735, - 7121, 5738, 5739, 5740, 5736, 5742, 5750, 5743, 7121, 5752, + 5605, 7165, 7165, 7165, 7165, 5606, 5609, 5611, 5612, 5613, + 5614, 5615, 5619, 5621, 5617, 5618, 5622, 7165, 5633, 7165, + 7165, 5629, 7165, 5635, 5636, 5639, 5641, 5623, 5643, 5645, + 7165, 5646, 7165, 5651, 5654, 5647, 5658, 5664, 5655, 5648, + 5666, 5668, 5669, 5670, 5671, 5678, 5676, 5679, 5677, 5682, + 5684, 5686, 7165, 7165, 5690, 5694, 5695, 5697, 5699, 5700, + 5701, 5708, 5706, 5707, 5709, 5711, 5713, 5714, 5722, 5723, + 5719, 5720, 5728, 7165, 5729, 5725, 5731, 7165, 5733, 7165, + 5737, 5738, 5739, 5740, 5741, 5746, 5747, 5748, 5750, 5752, + 7165, 7165, 5751, 5766, 5761, 7165, 7165, 5753, 5762, 5763, - 7121, 5753, 5755, 5761, 5756, 5764, 5769, 5765, 5772, 5771, - 5768, 5774, 5775, 7121, 5777, 5778, 7121, 5785, 5784, 5788, - 5782, 5790, 5793, 7121, 5794, 5797, 5801, 5803, 7121, 5805, - 5806, 5807, 5809, 7121, 5814, 7121, 5811, 5816, 5817, 5825, - 5820, 7121, 5822, 5826, 7121, 5834, 5836, 5838, 5840, 5828, - 5839, 7121, 5845, 5830, 7121, 5846, 5850, 5853, 5856, 5847, - 5858, 5851, 5859, 5860, 5867, 5869, 5871, 7121, 7121, 5876, - 5873, 123, 5885, 5863, 5872, 5880, 5881, 5888, 5798, 5889, - 5891, 7121, 7121, 5894, 7121, 5895, 5898, 7121, 5883, 5902, - 5896, 5904, 5906, 5907, 5909, 5910, 5913, 5914, 5915, 5916, + 5765, 5771, 5768, 5773, 7165, 5776, 5777, 5778, 5774, 5780, + 5788, 5781, 7165, 5790, 7165, 5791, 5793, 5799, 5794, 5802, + 5807, 5803, 5810, 5809, 5806, 5812, 5813, 7165, 5815, 5816, + 7165, 5823, 5822, 5826, 5820, 5827, 5832, 5828, 7165, 5833, + 5835, 5840, 5845, 7165, 5847, 5848, 5849, 5842, 7165, 5856, + 7165, 5850, 5857, 5859, 5864, 5860, 7165, 5861, 5865, 7165, + 5868, 5874, 5876, 5877, 5869, 5878, 7165, 5884, 5879, 7165, + 5885, 5887, 5888, 5893, 5894, 5896, 5890, 5898, 5899, 5906, + 5902, 5904, 7165, 7165, 5917, 5907, 123, 5920, 5910, 5915, + 5918, 5921, 5928, 5923, 5925, 5931, 7165, 7165, 5932, 7165, - 5917, 5919, 7121, 5938, 5940, 5923, 5944, 5945, 5947, 5949, - 5951, 5953, 5941, 5955, 5956, 5933, 5958, 5961, 5962, 5963, - 5964, 5965, 5967, 5969, 7121, 5971, 5975, 5977, 5920, 5979, - 5982, 5983, 7121, 5991, 5986, 5995, 5992, 7121, 5999, 5996, - 6000, 6002, 6003, 7121, 6004, 6007, 6014, 6015, 6008, 6010, - 6016, 6018, 6026, 7121, 6021, 6023, 6024, 7121, 7121, 7121, - 6030, 6037, 6031, 7121, 6039, 6040, 6041, 6042, 7121, 6044, - 6046, 6047, 7121, 7121, 7121, 6048, 6051, 6049, 7121, 6050, - 6063, 7121, 6052, 7121, 6053, 7121, 6062, 6071, 6068, 6072, - 7121, 6075, 6065, 6077, 6082, 7121, 6085, 6088, 6090, 6092, + 5926, 5936, 7165, 5924, 5940, 5941, 5944, 5945, 5946, 5947, + 5951, 5953, 5954, 5955, 5956, 5957, 5963, 7165, 5975, 5978, + 5960, 5981, 5982, 5984, 5986, 5988, 5990, 5992, 5993, 5994, + 5973, 5995, 5996, 5997, 6000, 6002, 6003, 6004, 6006, 7165, + 6013, 6018, 6007, 6015, 6020, 6021, 6022, 7165, 6029, 6025, + 6034, 6031, 7165, 6038, 6035, 6039, 6041, 6042, 7165, 6043, + 6046, 6053, 6054, 6047, 6049, 6055, 6057, 6059, 6070, 7165, + 6060, 6062, 6063, 7165, 7165, 7165, 6075, 6077, 6074, 7165, + 6082, 6078, 6065, 6083, 7165, 6085, 6086, 6087, 7165, 7165, + 7165, 6089, 6091, 6093, 7165, 6097, 6100, 7165, 6098, 7165, - 6079, 6093, 6095, 7121, 6102, 6098, 6104, 6106, 6097, 6107, - 6108, 6111, 6110, 6120, 6113, 6118, 7121, 6121, 6122, 6126, - 6123, 6130, 6132, 6133, 7121, 6134, 7121, 6136, 7121, 6137, - 6139, 6140, 6141, 6142, 6143, 6144, 6156, 6155, 6146, 6157, - 6161, 6162, 6165, 6168, 6172, 6169, 7121, 7121, 6179, 6175, - 7121, 6176, 6184, 7121, 6174, 7121, 6186, 7121, 6177, 6181, - 6187, 6190, 6194, 7121, 7121, 6201, 6196, 6198, 6208, 6203, - 6204, 7121, 6209, 6205, 6211, 6213, 7121, 6220, 7121, 6215, - 6224, 6217, 7121, 6221, 6228, 6232, 6225, 6229, 6234, 6236, - 6237, 6238, 6245, 6241, 6242, 6244, 6251, 6248, 6252, 6256, + 6103, 7165, 6104, 6106, 6107, 6112, 7165, 6113, 6115, 6105, + 6122, 7165, 6130, 6132, 6134, 6116, 6120, 6127, 6136, 7165, + 6143, 6139, 6142, 6149, 6135, 6138, 6145, 6151, 6152, 6160, + 6155, 6158, 7165, 6159, 6162, 6164, 6171, 6165, 6161, 6168, + 7165, 6173, 7165, 6175, 7165, 6177, 6178, 6179, 6181, 6186, + 6182, 6187, 6188, 6189, 6197, 6199, 6201, 6202, 6203, 6205, + 6208, 6209, 7165, 7165, 6219, 6211, 7165, 6215, 6223, 7165, + 6212, 7165, 6227, 7165, 6214, 6216, 6231, 6224, 6234, 7165, + 7165, 6238, 6235, 6241, 6248, 6243, 6245, 6246, 7165, 6251, + 6247, 6249, 6254, 7165, 6262, 7165, 6257, 6264, 6267, 7165, - 6261, 7121, 7121, 7121, 6257, 6265, 6272, 6268, 6270, 6277, - 6274, 7121, 6275, 6279, 6276, 6282, 6289, 6286, 6288, 7121, - 6284, 6290, 6291, 6293, 6295, 6298, 6297, 6300, 7121, 6311, - 6315, 6319, 6302, 6312, 6320, 6322, 6324, 6328, 6330, 6331, - 6332, 6305, 6333, 7121, 7121, 6335, 6336, 7121, 6340, 6342, - 7121, 6337, 7121, 6343, 6345, 6347, 6346, 6348, 7121, 6351, - 6353, 6354, 6355, 6357, 6361, 6360, 6363, 7121, 6364, 6378, - 6371, 6374, 6375, 7121, 7121, 6376, 6384, 7121, 6386, 6387, - 6381, 6394, 6389, 6390, 6400, 6402, 7121, 6404, 6405, 6396, - 6403, 6406, 6409, 6412, 7121, 6414, 6413, 6415, 6417, 7121, + 6259, 6270, 6274, 6260, 6263, 6279, 6271, 6276, 6280, 6290, + 6286, 6287, 6288, 6292, 6289, 6293, 6294, 6301, 7165, 7165, + 7165, 6295, 6303, 6312, 6310, 6311, 6319, 6315, 7165, 6316, + 6318, 6320, 6322, 6330, 6326, 6328, 7165, 6334, 6329, 6331, + 6332, 6336, 6338, 6337, 6339, 7165, 6350, 6352, 6355, 6358, + 6359, 6360, 6362, 6367, 6369, 6371, 6364, 6372, 6380, 6376, + 7165, 7165, 6379, 6375, 7165, 6383, 6385, 7165, 6386, 7165, + 6387, 6388, 6389, 6390, 6392, 7165, 6395, 6396, 6397, 6399, + 7165, 6400, 6402, 6404, 6407, 7165, 6401, 6421, 6414, 6417, + 6418, 7165, 7165, 6424, 6426, 7165, 6428, 6430, 6429, 6437, - 6420, 6424, 6425, 6426, 6428, 7121, 6429, 6419, 6436, 6441, - 7121, 6431, 6445, 6444, 7121, 7121, 7121, 6450, 6453, 6454, - 7121, 7121, 7121, 7121, 6456, 6459, 6460, 6462, 7121, 6463, - 7121, 7121, 6466, 6470, 6474, 6476, 6483, 6469, 7121, 6477, - 6484, 6486, 6487, 6488, 7121, 7121, 6489, 6491, 6492, 6494, - 6496, 6497, 7121, 7121, 6498, 6500, 6504, 6501, 6503, 7121, - 6506, 6509, 6516, 6513, 6519, 6526, 6528, 6521, 6529, 6530, - 6538, 6541, 6531, 6533, 6540, 6544, 6545, 6543, 6547, 6557, - 6552, 6554, 6560, 6555, 6563, 7121, 7121, 6565, 7121, 6567, - 6569, 7121, 6571, 7121, 6573, 6575, 6577, 6580, 7121, 6582, + 6432, 6433, 6439, 6442, 7165, 6446, 6448, 6440, 6449, 6451, + 6452, 6455, 7165, 6454, 6457, 6458, 6459, 7165, 6463, 6466, + 6467, 6465, 6468, 7165, 6470, 6471, 6480, 6472, 7165, 6483, + 6487, 6488, 7165, 7165, 7165, 6493, 6495, 6496, 7165, 7165, + 7165, 7165, 6498, 6499, 6489, 6506, 7165, 6502, 7165, 7165, + 6510, 6514, 6518, 6520, 6524, 6523, 7165, 6525, 6526, 6529, + 6513, 6532, 7165, 7165, 6533, 6536, 6537, 6538, 6540, 6541, + 7165, 7165, 6542, 6544, 6545, 6550, 6547, 7165, 6548, 6553, + 6555, 6560, 6563, 6571, 6573, 6565, 6574, 6575, 6582, 6583, + 6568, 6585, 6578, 6586, 6589, 6588, 6596, 6598, 6597, 6602, - 6584, 6586, 6588, 6590, 7121, 6591, 6593, 6595, 6596, 6597, - 6598, 7121, 6602, 6603, 6607, 6599, 6604, 6608, 6610, 6613, - 7121, 6615, 6624, 7121, 7121, 6619, 6625, 6621, 6626, 6631, - 7121, 6629, 6639, 6634, 6635, 6636, 6638, 6641, 7121, 6644, - 6642, 7121, 7121, 6654, 6645, 7121, 7121, 6643, 6646, 7121, - 7121, 7121, 7121, 7121, 7121, 7121, 7121, 6659, 6662, 7121, - 7121, 6661, 6653, 6668, 7121, 6671, 7121, 6663, 6672, 6673, - 6675, 7121, 6676, 7121, 6678, 6680, 6679, 6683, 6682, 6687, - 6689, 6692, 6694, 6693, 6696, 6698, 6699, 6703, 6700, 6704, - 6714, 6707, 6717, 6710, 6718, 7121, 7121, 7121, 6706, 6722, + 6605, 6606, 6608, 7165, 7165, 6610, 7165, 6612, 6614, 7165, + 6615, 7165, 6617, 6619, 6625, 6627, 7165, 6629, 6631, 6635, + 6637, 6620, 7165, 6632, 6639, 6643, 6640, 6644, 6645, 7165, + 6648, 6650, 6652, 6653, 6654, 6658, 6659, 6662, 7165, 6657, + 6664, 7165, 7165, 6655, 6671, 6666, 6675, 6677, 7165, 6678, + 6685, 6680, 6682, 6683, 6686, 6684, 7165, 6690, 6688, 7165, + 7165, 6689, 6691, 7165, 7165, 6698, 6699, 7165, 7165, 7165, + 7165, 7165, 7165, 7165, 7165, 6703, 6707, 7165, 7165, 6701, + 6712, 6716, 7165, 6718, 7165, 6705, 6713, 6721, 6709, 7165, + 6720, 7165, 6723, 6726, 6727, 6340, 6730, 6735, 6731, 6733, - 6728, 6724, 6732, 6734, 6737, 6739, 6729, 6740, 6741, 6745, - 6746, 6743, 6747, 6755, 6752, 6753, 6754, 6757, 6758, 6764, - 6770, 7121, 6772, 6761, 6767, 6774, 7121, 6775, 7121, 6777, - 7121, 7121, 6780, 6781, 6783, 6784, 6793, 6794, 6785, 6789, - 6792, 6796, 6798, 7121, 6805, 7121, 7121, 7121, 6800, 6806, - 7121, 6808, 6809, 7121, 6807, 6810, 6812, 6816, 6817, 6814, - 6818, 6819, 6835, 7121, 7121, 6820, 6825, 6828, 6837, 6839, - 6838, 6841, 6845, 6846, 6848, 6849, 6858, 7121, 6855, 6856, - 6860, 7121, 6862, 6857, 6863, 6864, 6865, 6873, 6869, 6872, - 7121, 6874, 7121, 6878, 6880, 6881, 6871, 6879, 6882, 6893, + 6738, 6739, 6740, 6742, 6741, 6747, 6743, 6749, 6753, 6754, + 6761, 6751, 6762, 7165, 7165, 7165, 6763, 6764, 6769, 6766, + 6779, 6780, 6783, 6786, 6772, 6774, 6787, 6788, 6792, 6776, + 6789, 6802, 6795, 6798, 6800, 6807, 6799, 6812, 6814, 7165, + 6816, 6803, 6808, 6821, 7165, 6817, 7165, 6822, 7165, 7165, + 6824, 6825, 6828, 6829, 6837, 6839, 6830, 6834, 6835, 6838, + 6842, 7165, 6846, 7165, 7165, 7165, 6849, 6851, 7165, 6850, + 6852, 7165, 6853, 6855, 6857, 6859, 6861, 6858, 6862, 6863, + 6866, 7165, 7165, 6869, 6875, 6878, 6880, 6881, 6888, 6883, + 6885, 6887, 6891, 6894, 6901, 7165, 6899, 6900, 6903, 7165, - 6891, 6887, 7121, 6897, 6901, 6899, 6903, 6905, 6907, 6908, - 6909, 6911, 6914, 6920, 6917, 6924, 6925, 6921, 6929, 6926, - 7121, 6936, 6927, 7121, 6933, 6937, 6930, 6939, 6943, 7121, - 6948, 6941, 6950, 6951, 6954, 6955, 7121, 6957, 6964, 6959, - 7121, 6965, 7121, 7121, 6967, 6961, 6968, 6974, 6976, 7121, - 7121, 7121, 7001, 7008, 7015, 7022, 7029, 7036, 7043, 88, - 7050, 7057, 7064, 7071, 7078, 7085, 7092, 7099, 7106, 7113 + 6904, 6906, 6907, 6909, 6910, 6917, 6912, 6919, 7165, 6915, + 7165, 6921, 6918, 6933, 6922, 6923, 6924, 6934, 6939, 6936, + 7165, 6926, 6945, 6940, 6947, 6950, 6953, 6954, 6943, 6956, + 6960, 6964, 6968, 6963, 6969, 6971, 6972, 6973, 7165, 6975, + 6978, 7165, 6979, 6980, 6981, 6982, 6986, 7165, 6989, 6983, + 6991, 6993, 6996, 6998, 7165, 7004, 7007, 7008, 7165, 7009, + 7165, 7165, 7011, 6999, 7012, 7020, 7022, 7165, 7165, 7165, + 7045, 7052, 7059, 7066, 7073, 7080, 7087, 88, 7094, 7101, + 7108, 7115, 7122, 7129, 7136, 7143, 7150, 7157 } ; -static const flex_int16_t yy_def[3671] = +static const flex_int16_t yy_def[3689] = { 0, - 3652, 1, 3653, 3653, 3654, 3654, 3655, 3655, 3656, 3656, - 3657, 3657, 3658, 3658, 3659, 3659, 3652, 3660, 3652, 3652, - 3652, 3652, 3661, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3662, 3652, 3652, 3652, - 3662, 3663, 3652, 3652, 3652, 3663, 3664, 3652, 3652, 3652, - 3652, 3664, 3665, 3652, 3652, 3652, 3665, 3666, 3652, 3667, - 3652, 3666, 3666, 3668, 3652, 3652, 3652, 3652, 3668, 3669, - 3652, 3652, 3652, 3669, 3660, 3660, 3652, 3670, 3661, 3670, - 3661, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3670, 1, 3671, 3671, 3672, 3672, 3673, 3673, 3674, 3674, + 3675, 3675, 3676, 3676, 3677, 3677, 3670, 3678, 3670, 3670, + 3670, 3670, 3679, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3680, 3670, 3670, 3670, + 3680, 3681, 3670, 3670, 3670, 3681, 3682, 3670, 3670, 3670, + 3670, 3682, 3683, 3670, 3670, 3670, 3683, 3684, 3670, 3685, + 3670, 3684, 3684, 3686, 3670, 3670, 3670, 3670, 3686, 3687, + 3670, 3670, 3670, 3687, 3678, 3678, 3670, 3688, 3679, 3688, + 3679, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3662, 3662, 3663, 3663, 3664, 3664, 3652, 3665, 3665, 3666, - 3666, 3667, 3667, 3666, 3668, 3668, 3652, 3669, 3669, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3680, 3680, 3681, 3681, 3682, 3682, 3670, 3683, 3683, 3684, + 3684, 3685, 3685, 3684, 3686, 3686, 3670, 3687, 3687, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3666, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3684, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3666, 3660, 3660, 3660, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3684, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3670, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3666, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3678, 3684, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3666, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3652, 3660, 3652, 3652, 3660, 3652, - 3652, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3684, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3670, 3670, 3678, 3670, 3670, 3678, 3678, 3670, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3666, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3684, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3652, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3670, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3670, 3670, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3670, 3678, 3678, 3670, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3666, - 3666, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, + 3678, 3678, 3678, 3678, 3678, 3684, 3684, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3666, 3660, 3660, 3660, 3660, - 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3678, 3678, 3684, 3678, 3678, 3678, 3678, 3678, 3678, 3670, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3652, 3660, 3652, 3660, 3660, 3660, - 3660, 3660, 3652, 3660, 3652, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3666, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3670, 3678, 3670, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, + 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3684, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3652, 3652, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3652, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3670, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3666, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, + 3678, 3684, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3652, - 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3670, 3678, + 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, - 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3652, 3660, 3660, - 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3666, 3660, 3652, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3652, 3660, 3660, 3652, 3660, 3660, 3660, - 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, + 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3670, 3678, 3678, + 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3684, 3678, 3670, 3678, 3678, + 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3670, 3678, 3678, 3670, 3678, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3652, 3652, 3660, 3652, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3670, 3670, 3678, 3670, 3678, 3678, 3678, + 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3670, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, + 3678, 3670, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3652, 3652, 3660, 3652, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3660, 3666, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3652, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, - 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3670, 3670, 3678, 3670, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3670, 3678, 3678, 3684, 3678, 3678, 3678, 3678, 3670, + 3678, 3678, 3670, 3670, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3652, 3660, 3660, + 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, + 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3652, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3666, 3660, 3652, 3660, 3660, - 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3670, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3670, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3684, 3678, 3670, + 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, - 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3652, 3652, 3660, 3660, 3660, 3660, 3660, - 3652, 3652, 3660, 3652, 3660, 3652, 3660, 3660, 3652, 3652, - 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3670, 3678, 3670, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3670, 3670, 3678, 3678, 3678, + 3678, 3678, 3670, 3670, 3678, 3670, 3678, 3670, 3678, 3678, + 3670, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, - 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3666, 3660, 3660, - 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3652, 3660, 3652, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3684, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3670, 3678, + 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, - 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3652, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3652, 3652, - 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, + 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3670, 3678, 3670, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3670, 3670, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, + 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3670, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3652, 3660, 3652, 3652, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3666, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3652, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, - 3660, 3660, 3660, 3652, 3660, 3652, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3652, 3660, 3660, - 3660, 3652, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, + 3678, 3670, 3670, 3670, 3670, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3670, + 3670, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3684, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3670, 3670, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3670, 3678, 3670, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3670, 3678, 3678, 3678, 3670, 3670, 3678, 3678, 3678, - 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3652, 3660, 3660, 3652, 3660, 3660, 3660, - 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3652, 3660, 3652, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3652, 3660, - 3660, 3666, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3652, 3652, 3660, 3652, 3660, 3660, 3652, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3670, 3678, 3670, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3670, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3670, + 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3670, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3670, 3670, 3678, 3678, 3684, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3670, 3678, 3670, - 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3652, 3660, 3660, - 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3652, 3652, 3652, - 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3652, 3652, 3652, 3660, 3660, 3660, 3652, 3660, - 3660, 3652, 3660, 3652, 3660, 3652, 3660, 3660, 3660, 3660, - 3652, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, + 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, + 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, + 3678, 3678, 3678, 3670, 3670, 3670, 3678, 3678, 3678, 3670, + 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3670, 3670, + 3670, 3678, 3678, 3678, 3670, 3678, 3678, 3670, 3678, 3670, - 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3652, 3660, 3652, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3652, 3660, 3660, - 3652, 3660, 3660, 3652, 3660, 3652, 3660, 3652, 3660, 3660, - 3660, 3660, 3660, 3652, 3652, 3660, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3652, 3660, 3652, 3660, - 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3670, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, + 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3670, 3678, 3670, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3670, 3670, 3678, 3678, 3670, 3678, 3678, 3670, + 3678, 3670, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3670, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3678, 3678, 3678, 3670, 3678, 3670, 3678, 3678, 3678, 3670, - 3660, 3652, 3652, 3652, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3652, 3652, 3660, 3660, 3652, 3660, 3660, - 3652, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, - 3660, 3660, 3660, 3652, 3652, 3660, 3660, 3652, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3652, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3670, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3670, 3678, 3678, 3670, 3678, 3678, 3670, 3678, 3670, + 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, + 3678, 3670, 3670, 3678, 3678, 3670, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, - 3652, 3660, 3660, 3660, 3652, 3652, 3652, 3660, 3660, 3660, - 3652, 3652, 3652, 3652, 3660, 3660, 3660, 3660, 3652, 3660, - 3652, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3660, 3660, 3660, 3652, 3652, 3660, 3660, 3660, 3660, - 3660, 3660, 3652, 3652, 3660, 3660, 3660, 3660, 3660, 3652, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3652, 3652, 3660, 3652, 3660, - 3660, 3652, 3660, 3652, 3660, 3660, 3660, 3660, 3652, 3660, + 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3670, 3678, 3678, + 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3670, 3678, + 3678, 3678, 3670, 3670, 3670, 3678, 3678, 3678, 3670, 3670, + 3670, 3670, 3678, 3678, 3678, 3678, 3670, 3678, 3670, 3670, + 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, + 3678, 3678, 3670, 3670, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3670, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3660, 3652, 3652, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, - 3660, 3652, 3652, 3660, 3660, 3652, 3652, 3660, 3660, 3652, - 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3660, 3660, 3652, - 3652, 3660, 3660, 3660, 3652, 3660, 3652, 3660, 3660, 3660, - 3660, 3652, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3652, 3652, 3652, 3660, 3660, + 3678, 3678, 3678, 3670, 3670, 3678, 3670, 3678, 3678, 3670, + 3678, 3670, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, + 3678, 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3670, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3678, 3670, 3670, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3670, + 3670, 3678, 3678, 3670, 3670, 3678, 3678, 3670, 3670, 3670, + 3670, 3670, 3670, 3670, 3670, 3678, 3678, 3670, 3670, 3678, + 3678, 3678, 3670, 3678, 3670, 3678, 3678, 3678, 3678, 3670, + 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3652, 3660, 3652, 3660, - 3652, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3652, 3660, 3652, 3652, 3652, 3660, 3660, - 3652, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3652, 3652, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, - 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3670, 3670, 3670, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, + 3678, 3678, 3678, 3678, 3670, 3678, 3670, 3678, 3670, 3670, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3670, 3678, 3670, 3670, 3670, 3678, 3678, 3670, 3678, + 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3670, 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3670, - 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3652, 3660, 3660, 3652, 3660, 3660, 3660, 3660, 3660, 3652, - 3660, 3660, 3660, 3660, 3660, 3660, 3652, 3660, 3660, 3660, - 3652, 3660, 3652, 3652, 3660, 3660, 3660, 3660, 3660, 3652, - 3652, 0, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, - 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652 + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3670, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3670, 3678, + 3678, 3670, 3678, 3678, 3678, 3678, 3678, 3670, 3678, 3678, + 3678, 3678, 3678, 3678, 3670, 3678, 3678, 3678, 3670, 3678, + 3670, 3670, 3678, 3678, 3678, 3678, 3678, 3670, 3670, 0, + 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, + 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670 } ; -static const flex_int16_t yy_nxt[7162] = +static const flex_int16_t yy_nxt[7206] = { 0, 18, 19, 20, 21, 22, 23, 22, 18, 18, 18, 18, 18, 22, 24, 25, 26, 27, 28, 29, 30, @@ -1650,9 +1655,9 @@ static const flex_int16_t yy_nxt[7162] = 86, 139, 184, 155, 156, 140, 168, 168, 86, 129, 209, 130, 86, 132, 86, 141, 142, 133, 143, 144, 183, 134, 145, 86, 149, 171, 150, 135, 86, 146, - 136, 178, 178, 147, 148, 151, 286, 137, 86, 174, + 136, 178, 178, 147, 148, 151, 287, 137, 86, 174, 165, 152, 165, 165, 90, 165, 90, 90, 170, 90, - 170, 170, 175, 170, 175, 175, 173, 175, 85, 265, + 170, 170, 175, 170, 175, 175, 173, 175, 85, 266, 85, 85, 87, 85, 86, 90, 88, 90, 90, 85, 90, 86, 86, 86, 180, 86, 90, 91, 86, 181, 182, 186, 86, 86, 185, 187, 191, 192, 86, 86, @@ -1664,758 +1669,763 @@ static const flex_int16_t yy_nxt[7162] = 86, 86, 86, 224, 214, 212, 222, 225, 86, 231, 86, 86, 217, 218, 86, 230, 221, 220, 86, 86, 86, 233, 86, 226, 229, 86, 223, 227, 234, 237, - 86, 235, 228, 86, 86, 86, 86, 239, 86, 244, - 236, 241, 243, 86, 86, 242, 86, 246, 238, 86, - 86, 86, 240, 86, 252, 245, 247, 86, 256, 249, - 261, 86, 248, 255, 86, 253, 86, 258, 251, 254, - - 86, 262, 250, 257, 86, 86, 264, 86, 86, 267, - 86, 86, 86, 271, 259, 86, 263, 260, 268, 86, - 266, 320, 270, 272, 274, 86, 275, 161, 161, 163, - 269, 179, 163, 273, 165, 171, 165, 165, 276, 165, - 168, 168, 170, 280, 170, 170, 90, 170, 90, 90, - 175, 90, 175, 175, 86, 175, 178, 178, 173, 277, - 278, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 283, 289, 86, 86, 279, 281, 86, 284, 285, - 288, 291, 292, 287, 293, 282, 363, 86, 86, 290, - 86, 294, 296, 86, 297, 298, 86, 307, 299, 295, - - 86, 86, 86, 300, 309, 86, 302, 311, 86, 310, - 86, 303, 86, 312, 86, 86, 304, 308, 86, 313, - 301, 316, 305, 306, 314, 86, 86, 86, 86, 318, - 86, 319, 321, 86, 86, 315, 86, 86, 336, 326, - 86, 327, 323, 322, 86, 324, 86, 337, 86, 328, - 317, 325, 329, 86, 330, 338, 335, 334, 333, 340, - 86, 86, 86, 342, 343, 86, 331, 339, 332, 86, - 86, 346, 86, 86, 86, 348, 349, 86, 347, 344, - 341, 86, 350, 345, 86, 86, 351, 353, 86, 86, - 86, 352, 86, 86, 356, 355, 357, 86, 354, 86, - - 86, 86, 86, 86, 86, 358, 362, 360, 86, 369, - 361, 367, 86, 373, 359, 364, 368, 86, 365, 86, - 86, 86, 376, 366, 371, 86, 370, 86, 86, 86, - 86, 379, 378, 86, 372, 86, 86, 382, 383, 374, - 375, 385, 381, 86, 86, 377, 86, 86, 386, 380, - 86, 388, 384, 389, 86, 390, 392, 86, 86, 393, - 387, 86, 86, 86, 86, 171, 86, 86, 396, 86, - 86, 86, 419, 86, 399, 401, 394, 397, 403, 391, - 404, 395, 405, 398, 86, 86, 86, 400, 86, 406, - 407, 408, 402, 86, 86, 86, 86, 86, 86, 86, - - 86, 416, 86, 86, 418, 412, 414, 86, 409, 410, - 86, 86, 411, 413, 417, 420, 86, 422, 86, 86, - 423, 421, 86, 86, 86, 415, 424, 426, 86, 86, - 86, 86, 427, 86, 431, 433, 448, 425, 428, 429, - 86, 86, 430, 435, 86, 432, 434, 86, 440, 86, - 86, 436, 86, 438, 86, 439, 441, 86, 86, 86, - 86, 86, 86, 86, 447, 86, 86, 177, 437, 450, - 86, 86, 453, 446, 86, 86, 444, 443, 455, 449, - 445, 442, 86, 458, 86, 451, 86, 459, 452, 86, - 86, 86, 454, 474, 457, 456, 86, 86, 460, 86, - - 467, 86, 469, 86, 86, 477, 478, 470, 461, 471, - 86, 462, 176, 476, 468, 479, 463, 464, 465, 466, - 480, 86, 472, 475, 86, 473, 86, 481, 482, 86, - 86, 86, 86, 86, 86, 86, 491, 86, 86, 492, - 86, 493, 489, 483, 490, 485, 484, 486, 487, 488, - 86, 494, 86, 495, 86, 86, 86, 496, 86, 501, - 86, 502, 86, 503, 86, 86, 497, 86, 520, 507, - 86, 508, 504, 500, 498, 509, 499, 86, 86, 505, - 86, 86, 506, 510, 512, 86, 513, 86, 515, 511, - 86, 521, 522, 86, 514, 523, 519, 86, 86, 86, - - 86, 516, 86, 537, 517, 86, 518, 86, 524, 86, - 525, 86, 86, 86, 539, 542, 526, 540, 536, 541, - 527, 538, 554, 544, 86, 528, 553, 86, 529, 86, - 530, 543, 531, 555, 86, 86, 171, 86, 556, 86, - 557, 86, 561, 560, 562, 532, 86, 558, 533, 627, - 534, 86, 535, 86, 86, 545, 546, 559, 564, 86, - 563, 86, 86, 566, 86, 547, 548, 549, 550, 551, - 569, 567, 552, 86, 573, 568, 86, 565, 571, 86, - 570, 86, 574, 86, 86, 579, 576, 86, 577, 86, - 580, 86, 86, 86, 575, 86, 572, 584, 86, 578, - - 86, 86, 86, 86, 582, 587, 86, 581, 86, 583, - 588, 589, 86, 86, 586, 86, 593, 594, 585, 86, - 86, 590, 591, 599, 592, 595, 86, 604, 596, 597, - 86, 86, 602, 86, 600, 86, 86, 618, 86, 86, - 86, 86, 621, 86, 86, 620, 598, 86, 86, 601, - 619, 605, 603, 607, 606, 608, 609, 622, 623, 86, - 86, 86, 171, 626, 86, 624, 625, 610, 86, 611, - 86, 86, 630, 628, 86, 612, 86, 632, 86, 633, - 86, 629, 86, 613, 614, 86, 635, 615, 616, 631, - 636, 617, 86, 634, 86, 86, 86, 638, 637, 86, - - 640, 86, 642, 86, 641, 86, 86, 86, 86, 86, - 643, 648, 86, 639, 649, 644, 650, 86, 86, 647, - 86, 652, 86, 653, 646, 645, 86, 655, 86, 651, - 86, 657, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 659, 663, 654, 661, 86, 86, 86, 671, 86, - 656, 665, 678, 658, 86, 660, 673, 662, 664, 86, - 669, 670, 86, 666, 668, 667, 86, 86, 672, 86, - 86, 674, 86, 86, 86, 86, 86, 676, 684, 682, - 677, 675, 681, 685, 679, 86, 86, 680, 86, 86, - 687, 688, 86, 86, 683, 86, 86, 691, 86, 86, - - 692, 86, 86, 694, 86, 86, 169, 686, 86, 86, - 689, 693, 709, 690, 86, 695, 86, 697, 86, 729, - 696, 86, 698, 707, 708, 706, 86, 699, 86, 700, - 86, 711, 712, 710, 713, 701, 86, 702, 86, 86, - 703, 704, 86, 716, 714, 86, 86, 705, 715, 86, - 717, 721, 719, 722, 725, 720, 86, 86, 86, 86, - 726, 724, 86, 731, 723, 86, 86, 86, 86, 735, - 718, 86, 727, 86, 86, 86, 728, 86, 733, 738, - 732, 86, 734, 730, 739, 86, 746, 742, 86, 86, - 736, 86, 86, 744, 171, 737, 740, 743, 745, 86, - - 741, 86, 86, 747, 751, 86, 86, 86, 86, 86, - 86, 754, 167, 86, 748, 756, 750, 86, 759, 86, - 749, 752, 755, 753, 760, 758, 86, 762, 763, 86, - 86, 86, 757, 86, 86, 86, 86, 86, 761, 765, - 86, 764, 768, 769, 86, 766, 86, 166, 86, 774, - 767, 777, 86, 770, 775, 86, 778, 86, 779, 86, - 771, 776, 773, 772, 86, 780, 86, 781, 86, 782, - 86, 783, 86, 86, 86, 86, 784, 86, 86, 789, - 786, 788, 86, 86, 787, 86, 792, 86, 785, 86, - 791, 86, 790, 797, 793, 796, 86, 86, 86, 86, - - 86, 799, 86, 801, 86, 86, 795, 86, 794, 86, - 803, 86, 806, 86, 86, 810, 798, 804, 800, 802, - 86, 86, 86, 86, 86, 805, 164, 811, 86, 808, - 807, 813, 86, 818, 809, 86, 814, 812, 817, 815, - 816, 86, 819, 86, 86, 86, 821, 825, 822, 86, - 86, 820, 827, 86, 86, 86, 162, 86, 823, 826, - 824, 828, 86, 86, 86, 86, 831, 830, 86, 832, - 833, 86, 835, 834, 86, 86, 837, 839, 86, 86, - 86, 836, 86, 829, 840, 86, 86, 846, 86, 86, - 889, 844, 86, 86, 838, 847, 86, 845, 841, 848, - - 86, 842, 843, 849, 850, 86, 86, 86, 851, 86, - 853, 86, 852, 86, 854, 858, 856, 86, 860, 86, - 86, 86, 859, 855, 86, 86, 86, 86, 861, 864, - 86, 863, 857, 866, 865, 86, 86, 871, 86, 86, - 867, 868, 881, 86, 862, 86, 86, 873, 86, 872, - 874, 86, 876, 877, 86, 869, 870, 86, 86, 875, - 879, 878, 86, 885, 86, 887, 86, 883, 886, 86, - 882, 86, 86, 86, 891, 880, 86, 884, 86, 86, - 86, 897, 86, 86, 86, 86, 898, 86, 86, 86, - 890, 888, 895, 899, 892, 86, 893, 894, 900, 86, - - 896, 86, 904, 901, 903, 86, 907, 902, 86, 86, - 906, 905, 86, 86, 86, 86, 86, 86, 86, 909, - 910, 908, 914, 86, 86, 86, 86, 86, 911, 86, - 923, 916, 922, 913, 912, 915, 86, 924, 86, 86, - 86, 917, 918, 919, 920, 921, 86, 86, 927, 86, - 925, 928, 926, 929, 930, 86, 86, 86, 86, 86, - 86, 86, 86, 931, 934, 935, 936, 938, 86, 933, - 86, 86, 86, 939, 932, 86, 86, 941, 171, 940, - 942, 946, 937, 947, 944, 86, 943, 86, 945, 86, - 86, 86, 948, 86, 949, 86, 86, 86, 953, 950, - - 951, 956, 86, 86, 957, 959, 86, 86, 952, 86, - 954, 86, 958, 963, 960, 86, 961, 86, 955, 86, - 86, 86, 86, 86, 966, 970, 86, 86, 86, 86, - 962, 86, 86, 967, 964, 971, 972, 965, 86, 86, - 86, 969, 86, 86, 973, 86, 86, 968, 985, 86, - 1032, 986, 975, 974, 86, 983, 976, 86, 989, 977, - 984, 86, 990, 978, 987, 86, 979, 988, 994, 991, - 86, 992, 86, 980, 981, 86, 982, 86, 993, 86, - 998, 86, 86, 86, 86, 1010, 86, 1007, 86, 996, - 995, 86, 86, 86, 86, 86, 1031, 1012, 86, 997, - - 86, 999, 1000, 1006, 1001, 1008, 1009, 1002, 86, 86, - 1017, 1015, 1003, 1013, 1014, 1011, 86, 86, 1004, 1005, - 1019, 1016, 1020, 1018, 86, 86, 1023, 1021, 86, 86, - 86, 1022, 86, 1026, 86, 1025, 86, 86, 86, 1027, - 1028, 1029, 1030, 86, 1024, 86, 86, 86, 86, 1034, - 86, 1038, 86, 86, 86, 1037, 86, 1033, 86, 1041, - 86, 1047, 86, 1045, 1043, 86, 1035, 1036, 1039, 86, - 1040, 86, 1042, 1048, 179, 86, 1046, 1051, 1049, 86, - 1050, 1053, 1044, 86, 1052, 86, 1055, 86, 86, 86, - 1054, 1056, 86, 86, 86, 1057, 1059, 86, 1060, 86, - - 86, 1058, 1061, 86, 86, 86, 86, 86, 1063, 1064, - 86, 1065, 1069, 86, 86, 1073, 86, 86, 1062, 1072, - 86, 86, 1071, 1067, 1066, 1070, 86, 86, 86, 1068, - 86, 86, 86, 86, 1080, 1075, 1074, 1076, 1078, 1079, - 86, 86, 86, 86, 1086, 1081, 1082, 86, 86, 1087, - 86, 1077, 1084, 86, 1089, 1085, 86, 86, 86, 86, - 86, 1088, 86, 1090, 86, 1095, 1083, 1092, 86, 86, - 1097, 1098, 86, 1096, 1100, 1091, 86, 1094, 86, 86, - 1102, 1093, 86, 86, 86, 1099, 86, 86, 1111, 86, - 1108, 86, 1106, 86, 86, 86, 86, 1101, 1103, 86, - - 1112, 1104, 1105, 86, 86, 1109, 86, 1107, 1110, 1114, - 1116, 1113, 1117, 86, 1115, 86, 86, 1119, 1121, 86, - 1120, 1118, 86, 1122, 86, 86, 86, 86, 86, 1132, - 86, 1124, 86, 1126, 1133, 86, 1123, 86, 86, 1135, - 86, 86, 1138, 86, 1125, 86, 1127, 1129, 86, 1128, - 1130, 1134, 1131, 1139, 86, 1136, 86, 86, 1137, 86, - 1140, 1147, 1141, 86, 86, 1146, 1142, 86, 1144, 1148, - 86, 86, 86, 1149, 1143, 86, 1152, 86, 1145, 1154, - 86, 86, 86, 86, 86, 1151, 1160, 1157, 1156, 1150, - 86, 1161, 171, 86, 86, 86, 1164, 1153, 1163, 1155, - - 1158, 86, 1159, 86, 86, 1162, 86, 86, 86, 1168, - 86, 86, 86, 86, 86, 1165, 1181, 86, 1167, 86, - 1182, 1166, 1171, 1172, 86, 1169, 1185, 86, 1183, 1184, - 86, 1170, 1173, 86, 1174, 86, 86, 1187, 1175, 86, - 1176, 177, 1186, 86, 1177, 1188, 1178, 86, 1190, 1192, - 1189, 1179, 86, 1191, 1193, 86, 1180, 86, 86, 1201, - 86, 1194, 1196, 86, 86, 86, 86, 86, 1199, 1202, - 86, 1195, 86, 86, 1197, 1198, 1208, 1207, 1200, 1203, - 86, 1205, 1206, 1210, 1211, 1209, 86, 1204, 1213, 86, - 86, 1212, 86, 86, 1214, 86, 86, 86, 86, 86, - - 86, 1226, 86, 1229, 86, 86, 86, 86, 1215, 1230, - 1225, 86, 86, 1227, 1216, 1217, 86, 1218, 1228, 1231, - 86, 1232, 1219, 1236, 1220, 86, 1233, 1237, 86, 86, - 1221, 86, 86, 86, 1238, 1222, 1223, 86, 86, 1234, - 1239, 86, 1224, 86, 1235, 1244, 86, 1245, 1241, 1240, - 86, 1247, 86, 1248, 86, 1242, 1243, 86, 1252, 1250, - 86, 1246, 86, 86, 86, 86, 86, 1253, 86, 86, - 1258, 1249, 86, 1251, 1255, 1256, 86, 86, 1259, 86, - 86, 86, 1254, 86, 1257, 1261, 86, 86, 86, 86, - 86, 1260, 1268, 1263, 1270, 1265, 1266, 1262, 1267, 86, - - 86, 1264, 86, 86, 86, 1269, 1271, 86, 1274, 86, - 86, 86, 86, 1272, 86, 86, 1279, 1280, 86, 1281, - 1284, 1276, 1273, 1275, 1282, 1278, 86, 1277, 86, 1283, - 1285, 86, 86, 1287, 86, 86, 86, 1290, 1294, 86, - 1286, 86, 1291, 86, 86, 1288, 86, 86, 1292, 86, - 1289, 1293, 86, 1295, 86, 86, 86, 1301, 86, 1303, - 1297, 1296, 1299, 86, 1298, 86, 86, 1300, 86, 1307, - 1304, 1305, 1306, 86, 1302, 86, 1308, 1309, 86, 86, - 1310, 86, 86, 1311, 86, 86, 86, 1314, 86, 1315, - 1313, 86, 1317, 86, 1320, 1312, 86, 1316, 86, 1319, - - 86, 1321, 86, 86, 1318, 1322, 1324, 86, 1325, 1323, - 86, 86, 86, 86, 1331, 1329, 1326, 1332, 1333, 176, - 86, 86, 86, 86, 86, 86, 1330, 1334, 1336, 1327, - 1335, 1328, 86, 1338, 86, 86, 86, 1337, 1342, 86, - 1339, 1341, 86, 86, 86, 1344, 86, 1343, 86, 86, - 86, 86, 1345, 86, 1340, 1347, 1350, 1346, 86, 86, - 86, 1351, 86, 86, 1353, 86, 1357, 1348, 1358, 86, - 1349, 1352, 86, 86, 86, 1355, 86, 1361, 86, 86, - 1354, 1360, 86, 1363, 1356, 86, 1366, 86, 1359, 86, - 86, 86, 86, 86, 1364, 1372, 86, 86, 1362, 86, - - 1368, 86, 1374, 1365, 171, 1367, 1375, 1373, 1369, 86, - 86, 86, 1371, 86, 86, 86, 1380, 1370, 1383, 86, - 86, 1385, 1381, 1377, 1376, 1378, 1379, 86, 1386, 86, - 1382, 86, 86, 86, 86, 1389, 1388, 1390, 86, 86, - 1384, 86, 86, 86, 86, 1387, 1393, 1396, 86, 86, - 86, 86, 1391, 1392, 86, 1397, 86, 1394, 1400, 86, - 86, 86, 1395, 86, 1398, 1401, 1404, 171, 1406, 1399, - 86, 1403, 1402, 86, 1410, 86, 1411, 1407, 1412, 1408, - 86, 1405, 1409, 1413, 86, 86, 86, 1414, 86, 1416, - 86, 86, 86, 86, 86, 1423, 86, 1420, 86, 1415, - - 1419, 86, 86, 1424, 86, 86, 1422, 1417, 1418, 86, - 1425, 86, 1421, 1426, 1428, 86, 1429, 86, 1434, 86, - 86, 86, 1430, 1427, 1432, 1431, 86, 86, 86, 86, - 1433, 1438, 86, 86, 86, 1435, 1436, 86, 86, 1441, - 1439, 86, 86, 1448, 1440, 1442, 1437, 1446, 86, 86, - 86, 86, 86, 1443, 86, 86, 1445, 1447, 1444, 86, - 1451, 86, 86, 1458, 86, 86, 1460, 1452, 1449, 86, - 1450, 1454, 86, 1453, 1455, 86, 86, 1457, 86, 86, - 1461, 86, 86, 86, 1459, 1468, 1456, 1463, 1466, 1462, - 1469, 86, 86, 1467, 1465, 86, 1464, 86, 1473, 86, - - 86, 1470, 86, 86, 1484, 1485, 1471, 1483, 1472, 86, - 1474, 1482, 1481, 86, 1475, 86, 86, 1476, 1477, 1487, - 86, 1488, 1478, 86, 1486, 86, 86, 86, 1479, 86, - 1490, 1489, 1480, 86, 1492, 86, 1497, 86, 1493, 86, - 1494, 1491, 86, 1495, 86, 1496, 1498, 86, 86, 1500, - 1503, 1504, 86, 86, 86, 86, 86, 86, 1505, 1499, - 86, 1501, 86, 1508, 1506, 1507, 1502, 1513, 1509, 1514, - 1510, 86, 1511, 86, 1512, 86, 1515, 1516, 1517, 86, - 86, 86, 1518, 1519, 86, 1523, 86, 86, 1520, 86, - 1524, 86, 86, 1522, 1527, 1525, 86, 86, 86, 1521, - - 86, 1533, 86, 1534, 86, 1529, 1528, 86, 86, 1526, - 86, 86, 1536, 86, 1532, 86, 1530, 1531, 1538, 86, - 1535, 86, 1541, 86, 1537, 1539, 86, 86, 1540, 1545, - 86, 1544, 1547, 86, 86, 86, 1548, 86, 1549, 1542, - 86, 86, 1546, 1553, 86, 1550, 86, 86, 1543, 86, - 1552, 1555, 86, 86, 1556, 86, 1551, 86, 1561, 86, - 1557, 86, 86, 86, 86, 1566, 1554, 1564, 1558, 86, - 1559, 86, 86, 86, 1567, 86, 86, 1569, 1560, 1563, - 86, 1562, 1568, 1565, 86, 86, 169, 1571, 86, 86, - 1570, 1572, 86, 1573, 1574, 86, 1577, 1576, 86, 1575, - - 1578, 1579, 86, 86, 1581, 86, 86, 1580, 86, 86, - 1582, 1587, 86, 1588, 1584, 86, 1585, 86, 86, 86, - 1589, 1591, 86, 1590, 1583, 1586, 86, 86, 86, 1595, - 86, 1592, 86, 86, 86, 86, 171, 86, 1597, 1594, - 86, 1603, 1604, 86, 1599, 1593, 86, 86, 86, 1605, - 86, 1600, 1596, 1598, 1607, 86, 86, 1601, 86, 86, - 86, 1606, 86, 1602, 86, 1615, 1610, 86, 86, 1608, - 1612, 86, 86, 1613, 86, 1609, 1611, 1619, 1621, 86, - 1614, 86, 86, 86, 86, 1625, 86, 1616, 1623, 1618, - 1626, 86, 1620, 1617, 86, 1628, 86, 86, 86, 86, - - 86, 1624, 1627, 1640, 1622, 1629, 86, 86, 1630, 1636, - 86, 1631, 1634, 1632, 86, 1635, 1633, 86, 1639, 1637, - 1638, 1641, 1642, 86, 86, 86, 86, 1643, 86, 86, - 86, 1647, 86, 1644, 1648, 1649, 86, 86, 86, 86, - 167, 86, 1652, 1646, 86, 86, 1657, 86, 86, 1645, - 1650, 1658, 86, 1654, 1661, 86, 1651, 86, 1653, 1655, - 86, 86, 1656, 86, 86, 86, 1659, 1662, 86, 86, - 86, 1660, 86, 1663, 1669, 86, 86, 1665, 86, 1666, - 1664, 1671, 1670, 1667, 1668, 86, 1675, 1674, 1672, 86, - 86, 86, 1680, 1673, 86, 1679, 1681, 86, 86, 1677, - - 86, 86, 86, 1685, 1676, 86, 1683, 1684, 86, 86, - 86, 1678, 1689, 1690, 1682, 1688, 1691, 1686, 86, 86, - 86, 1692, 86, 86, 1693, 1696, 86, 86, 86, 86, - 1687, 1697, 86, 86, 86, 86, 86, 1698, 86, 1704, - 1703, 86, 86, 1694, 1700, 1695, 86, 1699, 1701, 1706, - 1702, 1707, 86, 1710, 86, 86, 1705, 1712, 1711, 86, - 86, 1709, 1713, 86, 86, 1715, 1708, 86, 86, 86, - 86, 86, 1723, 1722, 1714, 1719, 86, 1718, 86, 1716, - 86, 1724, 86, 1727, 86, 86, 1717, 86, 1720, 86, - 1730, 1721, 86, 1729, 86, 86, 86, 86, 86, 86, - - 1725, 166, 86, 1728, 1731, 86, 1739, 86, 1726, 86, - 1740, 1732, 1736, 1733, 1734, 86, 1735, 1738, 86, 86, - 1737, 1744, 86, 1745, 86, 86, 86, 86, 1741, 1747, - 1743, 1746, 1748, 86, 1742, 86, 1749, 1751, 86, 86, - 86, 1752, 86, 86, 1755, 86, 1750, 1759, 86, 86, - 1760, 1761, 86, 86, 1753, 1756, 1754, 86, 1765, 1758, - 1764, 86, 1757, 86, 1762, 1763, 86, 1766, 86, 86, - 86, 86, 1767, 86, 1772, 1773, 86, 86, 86, 1770, - 86, 1768, 1778, 1776, 86, 1777, 86, 1769, 86, 1780, - 86, 1771, 86, 86, 1775, 1774, 1781, 1782, 86, 86, - - 86, 86, 86, 86, 1786, 86, 1779, 86, 1783, 86, - 1791, 86, 1789, 86, 86, 1784, 1785, 86, 86, 86, - 1798, 86, 1795, 1787, 1797, 1788, 1792, 1790, 86, 86, - 86, 86, 1796, 1794, 1793, 86, 86, 1799, 86, 1800, - 86, 1804, 86, 1807, 1801, 86, 86, 1809, 86, 1810, - 1805, 86, 86, 1812, 86, 1803, 1802, 86, 86, 86, - 1806, 1808, 86, 1816, 86, 1819, 86, 86, 1815, 1818, - 1820, 1811, 86, 86, 171, 86, 1813, 1814, 1822, 86, - 86, 1817, 86, 86, 86, 1821, 86, 86, 1831, 1832, - 1823, 86, 86, 1824, 1825, 1830, 1828, 86, 1826, 1827, - - 1835, 86, 86, 86, 86, 86, 1836, 1837, 1829, 1840, - 1841, 1833, 1834, 86, 1843, 1839, 86, 86, 86, 86, - 86, 86, 1844, 1838, 86, 1842, 1846, 86, 86, 86, - 1848, 86, 1845, 1849, 86, 1851, 86, 1852, 1847, 86, - 86, 86, 86, 1853, 1856, 1850, 86, 1857, 86, 1854, - 86, 1864, 86, 1861, 1855, 1866, 1862, 86, 1858, 86, - 1859, 86, 1860, 86, 1865, 86, 86, 86, 1863, 1871, - 1868, 1867, 1869, 1872, 86, 1874, 1875, 86, 86, 86, - 1877, 86, 86, 1876, 86, 1878, 1879, 86, 1870, 1873, - 86, 86, 86, 86, 86, 1880, 1883, 1885, 1886, 1887, - - 1881, 1888, 86, 86, 86, 86, 1890, 86, 1889, 1882, - 86, 86, 86, 1884, 86, 1892, 1893, 86, 86, 1894, - 86, 86, 86, 86, 86, 1891, 86, 86, 86, 1895, - 86, 86, 1904, 1905, 86, 86, 1899, 1900, 1896, 1897, - 1901, 1898, 1902, 86, 86, 1911, 1908, 1909, 86, 1906, - 1907, 86, 1903, 86, 86, 86, 86, 1910, 1916, 86, - 1918, 86, 86, 1920, 86, 86, 86, 86, 1912, 1913, - 1915, 1919, 1922, 86, 1914, 86, 1917, 1923, 86, 1924, - 1926, 1921, 86, 86, 86, 86, 86, 86, 1925, 86, - 86, 1931, 1929, 86, 1932, 86, 1938, 1933, 86, 1927, - - 1928, 1930, 86, 1934, 1935, 1939, 86, 1940, 86, 1936, - 1941, 86, 86, 1942, 1943, 1937, 1944, 86, 86, 86, - 86, 1946, 1948, 1947, 86, 1945, 86, 86, 86, 1949, - 86, 86, 86, 1958, 86, 86, 1952, 1959, 1957, 1950, - 1954, 1956, 1951, 1955, 86, 86, 86, 1953, 86, 86, - 86, 1965, 86, 86, 86, 1960, 1966, 86, 1961, 1967, - 86, 86, 1963, 164, 1962, 1964, 86, 1971, 86, 1972, - 1970, 86, 1968, 86, 1974, 1969, 86, 1973, 1975, 86, - 1976, 86, 1982, 86, 86, 1978, 1980, 1984, 1979, 1981, - 86, 86, 1985, 86, 1977, 86, 86, 1991, 1986, 86, - - 1989, 1983, 1994, 86, 86, 1987, 1993, 86, 86, 1995, - 1990, 86, 1997, 1988, 86, 86, 86, 1992, 86, 86, - 1998, 2001, 86, 2005, 86, 1996, 86, 86, 86, 86, - 2000, 2003, 2002, 86, 2006, 1999, 86, 2004, 86, 86, - 86, 2007, 86, 2008, 2010, 2011, 86, 2012, 2014, 86, - 86, 2020, 2009, 2018, 86, 2013, 2021, 86, 86, 2015, - 86, 2022, 86, 2016, 2017, 2024, 86, 86, 86, 86, - 2028, 86, 86, 2023, 2030, 2019, 86, 86, 86, 86, - 86, 2034, 86, 86, 86, 2029, 2026, 2025, 2027, 2037, - 86, 86, 86, 2032, 2036, 86, 2033, 2039, 2031, 2035, - - 2040, 86, 86, 2038, 86, 171, 86, 2045, 86, 86, - 2041, 2048, 86, 2043, 2042, 2044, 86, 2046, 86, 2052, - 86, 86, 86, 2047, 86, 86, 2053, 86, 2049, 86, - 2050, 2055, 86, 86, 2060, 2051, 2054, 2056, 86, 2057, - 86, 86, 2064, 86, 86, 2061, 86, 2063, 2058, 2065, - 2067, 86, 2059, 86, 86, 2070, 2062, 86, 2068, 2071, - 86, 86, 86, 2069, 2066, 86, 86, 2073, 86, 2072, - 86, 2074, 86, 86, 86, 2079, 86, 86, 86, 2080, - 86, 86, 2075, 86, 162, 2081, 2084, 86, 2076, 2082, - 2077, 2078, 2085, 2083, 86, 86, 86, 2092, 86, 2088, - - 2087, 2090, 2091, 2093, 86, 2086, 2089, 86, 86, 86, - 86, 86, 86, 2100, 86, 86, 2094, 86, 2103, 86, - 2095, 2104, 86, 2105, 86, 86, 2096, 2097, 2098, 2101, - 2099, 2102, 2107, 86, 2106, 86, 2108, 86, 2112, 86, - 2109, 86, 2114, 2116, 86, 2113, 2110, 2115, 86, 86, - 86, 2118, 86, 86, 86, 86, 2121, 86, 2111, 2119, - 2122, 86, 86, 2125, 86, 86, 86, 2124, 2117, 86, - 86, 86, 86, 2130, 2128, 2123, 2129, 2120, 86, 2132, - 2126, 86, 2140, 2131, 86, 86, 86, 2127, 86, 86, - 2137, 86, 86, 2133, 2134, 2135, 86, 86, 2145, 2143, - - 2136, 2144, 2138, 2146, 86, 86, 2139, 86, 86, 2141, - 2149, 2142, 2148, 86, 2152, 86, 86, 86, 2150, 2147, - 86, 2156, 86, 86, 2153, 86, 2158, 86, 2151, 86, - 86, 2161, 2162, 86, 86, 86, 2154, 86, 2155, 2164, - 86, 86, 86, 86, 2171, 86, 2166, 2159, 86, 2157, - 2167, 2160, 2169, 86, 2163, 86, 86, 86, 86, 2170, - 2165, 86, 2174, 2168, 86, 2175, 86, 2177, 2173, 2172, - 2180, 86, 86, 2182, 86, 86, 86, 2181, 2185, 86, - 2179, 2184, 86, 2176, 86, 86, 86, 2178, 2186, 2188, - 2190, 2183, 2189, 86, 2187, 86, 86, 86, 86, 86, - - 86, 2194, 2192, 2196, 86, 2191, 86, 86, 2199, 2200, - 86, 2195, 2201, 86, 86, 86, 2193, 86, 86, 86, - 86, 2204, 2197, 2209, 86, 2208, 86, 86, 2203, 86, - 2202, 86, 2198, 86, 2206, 2214, 86, 2205, 86, 2215, - 86, 2207, 2216, 86, 2212, 86, 2211, 2218, 86, 2217, - 2210, 86, 2213, 86, 2220, 2219, 2222, 86, 86, 2221, - 86, 86, 86, 86, 2230, 2226, 2223, 2224, 86, 86, - 86, 86, 86, 2235, 86, 86, 2233, 2225, 86, 2236, - 86, 2227, 2228, 2229, 2232, 2234, 2231, 86, 86, 2238, - 2247, 2237, 86, 2243, 86, 2241, 86, 2242, 86, 2239, - - 2244, 86, 2245, 2248, 2240, 86, 86, 2246, 86, 86, - 2250, 2252, 86, 86, 86, 86, 2254, 86, 2251, 86, - 2256, 2258, 86, 2260, 2249, 2253, 2255, 86, 86, 86, - 2261, 86, 86, 171, 86, 86, 86, 86, 2264, 2275, - 2257, 86, 2268, 86, 2259, 86, 2265, 2262, 2266, 2269, - 86, 86, 2263, 86, 2267, 2298, 2270, 86, 2271, 2272, - 86, 2273, 86, 2274, 86, 86, 86, 86, 2281, 86, - 2276, 2277, 86, 2278, 2279, 86, 86, 2280, 2282, 86, - 2284, 86, 86, 86, 86, 2288, 86, 86, 2283, 2287, - 86, 86, 2289, 2285, 2286, 2290, 2291, 86, 2293, 86, - - 2292, 86, 86, 86, 86, 2300, 86, 2294, 86, 2299, - 2295, 86, 86, 86, 86, 2305, 86, 2302, 86, 86, - 2296, 86, 2297, 86, 2301, 86, 2306, 2304, 2308, 3652, - 2303, 86, 2309, 2313, 2307, 86, 2311, 86, 2310, 86, - 2312, 86, 2315, 2317, 86, 86, 2314, 86, 2318, 86, - 86, 86, 2316, 2324, 86, 86, 2326, 2319, 86, 86, - 2327, 86, 86, 2320, 2323, 2321, 2322, 2329, 86, 86, - 2330, 2325, 2331, 86, 86, 2332, 86, 2335, 86, 2328, - 86, 86, 2334, 86, 86, 2337, 86, 2340, 86, 2341, - 86, 86, 2333, 86, 2336, 86, 86, 2342, 86, 86, - - 86, 86, 86, 2338, 2339, 2344, 2346, 2345, 2347, 2349, - 2351, 2343, 86, 86, 2350, 2352, 86, 86, 86, 2354, - 86, 2357, 86, 2355, 2348, 2353, 2360, 86, 86, 86, - 2359, 2361, 2363, 2364, 86, 2358, 2356, 86, 86, 2366, - 2362, 86, 2365, 2367, 86, 2370, 86, 86, 86, 2369, - 86, 86, 86, 2375, 2377, 2368, 2371, 2373, 86, 86, - 86, 2378, 2374, 86, 2372, 2380, 86, 86, 86, 2383, - 86, 2376, 2379, 2382, 86, 2384, 86, 86, 86, 2385, - 2389, 86, 86, 86, 86, 2393, 86, 2390, 86, 2381, - 2394, 86, 2395, 2392, 2386, 2387, 2391, 86, 2388, 2398, - - 86, 86, 2399, 86, 86, 86, 2403, 2396, 86, 86, - 86, 2397, 86, 2404, 2400, 86, 86, 2405, 2407, 2401, - 2409, 86, 86, 2411, 86, 2402, 2408, 2406, 2410, 86, - 2412, 86, 86, 2413, 86, 86, 2414, 86, 2416, 2419, - 86, 86, 86, 2421, 2417, 86, 86, 2418, 2422, 86, - 2415, 2424, 86, 2423, 86, 86, 86, 2425, 2426, 2427, - 2428, 2420, 86, 2432, 86, 2429, 86, 86, 86, 86, - 86, 2431, 86, 86, 86, 2440, 2430, 86, 86, 86, - 86, 86, 3652, 86, 2433, 2434, 2435, 2438, 2436, 2439, - 2441, 2442, 2446, 86, 2437, 86, 86, 2443, 2444, 2447, - - 2445, 86, 2448, 2451, 86, 86, 86, 2450, 86, 2456, - 86, 86, 2458, 86, 86, 2449, 86, 2455, 86, 2452, - 2457, 86, 2461, 2453, 86, 86, 2462, 2465, 171, 86, - 2469, 2454, 2459, 86, 2467, 2460, 86, 2463, 86, 2468, - 86, 2470, 86, 86, 2464, 2471, 2472, 86, 86, 2473, - 2466, 2474, 86, 86, 2475, 2479, 86, 2478, 86, 2480, - 86, 2482, 86, 2483, 86, 2485, 86, 2484, 2476, 86, - 2486, 86, 2481, 86, 2488, 86, 86, 86, 2487, 2477, - 86, 2489, 86, 86, 86, 86, 2490, 2491, 86, 2494, - 86, 86, 86, 2497, 86, 2492, 86, 2503, 86, 2501, - - 2496, 2493, 86, 86, 86, 2495, 2504, 2499, 2498, 86, - 86, 86, 2500, 86, 2506, 86, 86, 86, 2502, 2505, - 86, 2507, 2512, 86, 2516, 2510, 2515, 86, 86, 2509, - 86, 86, 86, 2513, 2511, 86, 2508, 86, 2526, 86, - 86, 2514, 86, 86, 86, 2533, 86, 2517, 86, 2518, - 2519, 86, 2524, 86, 86, 2520, 2522, 2535, 2527, 2521, - 2523, 2528, 86, 2525, 86, 2529, 2531, 86, 2530, 86, - 86, 86, 2534, 2532, 86, 86, 2540, 2541, 86, 86, - 86, 2542, 2536, 2543, 86, 2538, 86, 2539, 3652, 86, - 2549, 86, 86, 2547, 2537, 2544, 2548, 86, 2550, 86, - - 2551, 2545, 2546, 86, 2554, 86, 2555, 86, 86, 86, - 86, 86, 2552, 2556, 2557, 2553, 86, 2561, 86, 2562, - 86, 86, 2564, 86, 86, 2566, 86, 86, 2560, 86, - 2558, 2559, 2568, 2569, 86, 2570, 86, 86, 86, 86, - 2563, 86, 2565, 86, 2567, 86, 86, 2572, 2577, 86, - 2576, 2571, 2579, 86, 86, 2574, 2573, 86, 86, 86, - 86, 86, 2575, 2581, 2583, 2578, 2582, 86, 2584, 2586, - 86, 86, 2580, 2589, 2588, 86, 2587, 86, 2592, 86, - 86, 86, 86, 2585, 86, 86, 2598, 86, 86, 2597, - 2590, 86, 86, 86, 86, 86, 2591, 2594, 2600, 2596, - - 2593, 2603, 86, 86, 2595, 86, 2601, 2599, 86, 2602, - 2605, 86, 2604, 2607, 86, 86, 2611, 2617, 86, 2606, - 86, 86, 2613, 86, 2614, 86, 2608, 2612, 86, 2609, - 2619, 86, 86, 86, 86, 86, 2620, 2610, 86, 2615, - 2618, 2616, 86, 2624, 86, 86, 2622, 2626, 86, 2627, - 2628, 86, 2630, 2631, 86, 2623, 2634, 2621, 86, 86, - 86, 2625, 86, 2629, 86, 2635, 86, 86, 86, 2633, - 86, 2636, 2632, 2639, 86, 86, 86, 86, 86, 86, - 2638, 2646, 86, 2641, 2642, 2643, 2644, 86, 2640, 2637, - 2647, 86, 2645, 3652, 86, 2648, 86, 86, 2652, 2649, - - 2653, 86, 2650, 2651, 86, 2654, 86, 86, 2657, 171, - 2656, 86, 86, 2655, 2658, 86, 86, 2663, 86, 86, - 86, 86, 86, 86, 86, 86, 2670, 86, 2661, 2665, - 2664, 2659, 2662, 2660, 2666, 2667, 2668, 2669, 86, 2673, - 2674, 86, 86, 2671, 2672, 86, 2675, 2676, 86, 86, - 86, 2679, 2677, 2680, 86, 2678, 2683, 86, 86, 86, - 2682, 86, 86, 2681, 86, 2684, 86, 86, 2688, 2689, - 2685, 86, 86, 86, 2693, 86, 2686, 86, 2691, 2694, - 86, 2692, 86, 86, 86, 2687, 2690, 2695, 2696, 86, - 86, 86, 86, 2697, 86, 2700, 2701, 86, 2698, 2703, - - 86, 86, 86, 86, 86, 2702, 86, 86, 2708, 2711, - 2699, 86, 2710, 86, 86, 86, 86, 2707, 86, 2712, - 2704, 2705, 2706, 86, 2713, 86, 2709, 2719, 86, 2714, - 2717, 86, 86, 2715, 2723, 2716, 86, 86, 2724, 2718, - 86, 2722, 86, 2720, 86, 2725, 86, 86, 2721, 2726, - 86, 2727, 86, 2730, 86, 86, 2732, 2731, 86, 86, - 2728, 2733, 2734, 86, 2729, 86, 2736, 86, 2738, 86, - 86, 2737, 2740, 86, 86, 2742, 86, 86, 86, 2741, - 86, 2739, 86, 86, 86, 86, 86, 2746, 86, 2735, - 2749, 2750, 2744, 2751, 86, 2743, 2745, 2752, 86, 86, - - 2753, 86, 2755, 86, 86, 2748, 86, 86, 2754, 2747, - 86, 86, 2758, 2760, 86, 2756, 86, 2763, 86, 86, - 2764, 86, 86, 2759, 2766, 2757, 2761, 2765, 2762, 86, - 86, 2769, 86, 86, 86, 86, 2770, 2767, 86, 2773, - 2775, 2771, 2774, 86, 2768, 86, 86, 86, 86, 86, - 86, 2780, 2772, 2779, 86, 2777, 86, 86, 86, 86, - 2778, 2784, 86, 2776, 2781, 2788, 86, 2787, 2782, 2783, - 2789, 86, 2790, 86, 2791, 86, 86, 86, 2785, 2786, - 86, 86, 2795, 86, 2796, 2794, 86, 2797, 2792, 86, - 86, 86, 86, 86, 3652, 2793, 86, 86, 2804, 86, - - 86, 2798, 86, 2800, 2806, 86, 2807, 86, 2809, 86, - 2799, 2808, 2801, 2803, 2802, 2805, 86, 86, 86, 86, - 86, 86, 2813, 86, 2811, 2814, 2817, 86, 2810, 86, - 2812, 86, 2818, 2819, 86, 86, 86, 86, 86, 2815, - 86, 2816, 2826, 86, 171, 86, 2828, 86, 2822, 86, - 86, 2821, 2824, 86, 86, 2820, 2827, 86, 2829, 2825, - 2823, 2832, 2830, 86, 86, 2831, 2835, 86, 86, 2837, - 86, 2836, 2838, 2839, 86, 2833, 86, 2834, 2840, 86, - 86, 2841, 86, 2842, 86, 2843, 2844, 2845, 86, 2846, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 2854, - - 3652, 86, 86, 2847, 2852, 86, 2858, 86, 86, 2849, - 2848, 2859, 2856, 2851, 2850, 86, 2853, 86, 2855, 2857, - 2860, 86, 2861, 86, 2862, 86, 2863, 2864, 86, 2866, - 86, 86, 2865, 2867, 86, 86, 86, 86, 86, 86, - 86, 2870, 86, 2868, 2877, 86, 2876, 2878, 86, 2869, - 2871, 86, 86, 86, 2872, 2873, 2874, 2875, 2881, 2882, - 86, 2884, 2879, 2883, 86, 86, 86, 86, 86, 2880, - 86, 2885, 86, 2891, 86, 86, 86, 2890, 86, 86, - 86, 2887, 3652, 2886, 2889, 86, 86, 2888, 2899, 86, - 2895, 2897, 86, 86, 2898, 2892, 2893, 86, 2894, 2900, - - 2896, 2901, 86, 86, 2902, 86, 86, 86, 86, 86, - 86, 86, 2903, 2906, 2907, 2908, 86, 86, 2905, 86, - 2913, 2914, 86, 86, 2904, 2917, 86, 2909, 2911, 86, - 2910, 86, 86, 86, 2912, 86, 2920, 2916, 2915, 86, - 2918, 2922, 86, 2923, 2924, 86, 2919, 86, 2921, 86, - 86, 2929, 86, 86, 86, 2925, 86, 86, 2933, 86, - 2932, 86, 2926, 2931, 86, 2930, 2934, 86, 86, 2927, - 2928, 2936, 86, 2937, 86, 86, 2940, 2939, 2935, 2942, - 86, 86, 2943, 2938, 86, 2945, 86, 86, 86, 86, - 86, 2952, 86, 86, 86, 2941, 86, 86, 86, 2949, - - 2946, 2947, 2948, 2950, 86, 2951, 2944, 2955, 86, 2956, - 86, 86, 2954, 2953, 86, 2957, 86, 2961, 86, 2959, - 86, 86, 86, 86, 2960, 2958, 86, 2962, 2963, 86, - 86, 2965, 2968, 86, 2966, 2970, 2964, 2967, 2969, 86, - 2972, 171, 2971, 86, 86, 86, 86, 2977, 3652, 2974, - 2973, 86, 86, 86, 86, 2979, 2978, 86, 2982, 86, - 2983, 86, 2981, 2975, 2976, 86, 2987, 2980, 2985, 86, - 86, 2988, 86, 2986, 86, 86, 86, 2992, 2984, 2989, - 2990, 86, 86, 86, 86, 2993, 86, 2994, 86, 86, - 2991, 2999, 3000, 2995, 86, 86, 2997, 86, 86, 3001, - - 86, 2996, 3003, 86, 86, 3005, 86, 3002, 86, 3006, - 2998, 3004, 86, 86, 86, 86, 86, 3008, 3009, 3010, - 3007, 86, 86, 86, 3015, 86, 86, 86, 86, 3012, - 3013, 3014, 3017, 3011, 3016, 3019, 86, 86, 86, 3652, - 86, 86, 3020, 86, 3018, 3025, 86, 3021, 86, 86, - 3026, 86, 86, 86, 3030, 86, 86, 3022, 3023, 3024, - 3028, 3029, 3033, 86, 3031, 86, 86, 3027, 86, 86, - 3032, 3040, 3037, 3038, 86, 3034, 3041, 86, 86, 3043, - 3035, 86, 86, 3044, 86, 86, 3036, 86, 86, 3045, - 86, 86, 3050, 3047, 3039, 86, 3042, 86, 86, 3048, - - 3051, 86, 3054, 86, 3049, 3052, 86, 86, 3056, 3053, - 86, 86, 3046, 3058, 86, 3059, 86, 3060, 86, 86, - 86, 3055, 86, 3061, 86, 3062, 3064, 86, 3057, 86, - 86, 3063, 3068, 86, 3066, 86, 3102, 3069, 86, 86, - 3072, 86, 3067, 86, 3065, 3070, 3073, 86, 3074, 86, - 3075, 86, 86, 86, 3077, 3071, 3076, 3079, 86, 86, - 86, 3080, 3082, 86, 86, 3078, 86, 3083, 3084, 86, - 3086, 86, 86, 86, 3090, 3085, 86, 3087, 3652, 3081, - 86, 3091, 86, 3093, 86, 86, 86, 3089, 3092, 86, - 3088, 3094, 3095, 86, 86, 3101, 86, 3096, 86, 3097, - - 3100, 86, 86, 3104, 86, 3098, 3103, 86, 86, 86, - 3110, 86, 3105, 3099, 3107, 86, 3106, 86, 3109, 86, - 86, 3108, 86, 86, 3113, 3117, 86, 86, 86, 86, - 86, 3119, 86, 86, 3111, 3112, 86, 3116, 3114, 3120, - 3123, 3118, 3115, 3121, 3652, 3124, 86, 3126, 3150, 3122, - 3125, 86, 3127, 86, 86, 3128, 3129, 86, 86, 3130, - 86, 3131, 86, 3132, 86, 3133, 86, 3134, 86, 86, - 3135, 86, 3138, 3136, 86, 86, 86, 86, 86, 3140, - 86, 3142, 86, 3147, 86, 3139, 3143, 3148, 86, 3137, - 86, 3151, 86, 3149, 3141, 86, 86, 3652, 3144, 86, - - 3145, 3152, 3146, 3154, 86, 86, 3155, 3156, 86, 86, - 3157, 3158, 86, 86, 3153, 86, 86, 86, 3159, 3164, - 86, 86, 3160, 86, 3161, 3162, 3165, 86, 86, 86, - 3167, 86, 3166, 3171, 86, 3163, 86, 86, 3172, 86, - 3169, 3175, 3168, 86, 86, 3174, 3170, 3173, 3176, 3177, - 86, 3179, 86, 86, 86, 86, 3183, 86, 3178, 86, - 86, 86, 86, 86, 86, 86, 86, 3180, 3184, 3187, - 3190, 3188, 3185, 3182, 3652, 86, 86, 3191, 86, 3181, - 3193, 86, 3195, 3189, 86, 86, 3186, 3192, 86, 3194, - 86, 3198, 86, 3197, 3196, 86, 3200, 3202, 86, 3201, - - 3203, 86, 3204, 86, 3199, 86, 86, 3652, 86, 3209, - 86, 86, 3206, 3208, 3205, 86, 3210, 86, 3212, 86, - 86, 86, 3211, 86, 86, 3207, 86, 3218, 3213, 3216, - 3220, 86, 3214, 86, 86, 86, 86, 3224, 3221, 86, - 3222, 3217, 3215, 86, 3223, 86, 86, 86, 3229, 86, - 86, 3219, 86, 86, 86, 86, 86, 86, 3233, 86, - 3226, 3227, 3225, 3230, 3234, 3231, 3232, 3228, 86, 86, - 86, 3240, 3235, 3238, 86, 86, 3236, 3237, 86, 3239, - 3244, 86, 86, 3241, 3245, 86, 3247, 86, 86, 86, - 86, 3248, 86, 3242, 86, 3250, 3251, 86, 3253, 86, - - 86, 3246, 3249, 86, 3243, 3256, 3254, 86, 3252, 86, - 3255, 86, 3258, 3259, 86, 3262, 86, 86, 86, 3257, - 3261, 86, 86, 3265, 86, 3268, 86, 3269, 86, 3260, - 86, 3271, 3266, 86, 86, 3272, 3264, 86, 86, 3263, - 3274, 86, 86, 3267, 3275, 86, 3278, 86, 3270, 86, - 86, 86, 3283, 3276, 86, 86, 3273, 86, 86, 3281, - 3280, 86, 3277, 3287, 86, 86, 3279, 3285, 3289, 86, - 86, 3282, 3290, 3284, 86, 3291, 3288, 3286, 86, 3294, - 3295, 86, 3292, 86, 3297, 86, 3296, 86, 86, 86, - 86, 3300, 86, 3299, 3301, 86, 3303, 86, 3293, 86, - - 3306, 86, 86, 86, 86, 3298, 86, 3311, 86, 3307, - 86, 86, 3327, 86, 3302, 86, 3304, 3305, 86, 3310, - 3318, 3308, 3314, 3315, 86, 86, 3313, 3316, 86, 3309, - 3312, 3317, 86, 86, 3321, 86, 3322, 86, 3320, 3319, - 3323, 86, 3324, 86, 86, 86, 86, 3329, 86, 86, - 86, 3328, 3331, 86, 3332, 86, 86, 3325, 86, 86, - 86, 86, 3338, 3339, 86, 3330, 86, 86, 86, 3333, - 86, 3326, 3345, 86, 86, 3346, 86, 86, 3334, 3336, - 3335, 3337, 3342, 3344, 86, 3348, 3341, 86, 86, 86, - 3343, 86, 3340, 3351, 86, 3347, 3353, 86, 3354, 86, - - 86, 3357, 86, 86, 3349, 3355, 3350, 86, 3356, 86, - 3352, 3359, 3360, 86, 3358, 86, 86, 86, 86, 86, - 3361, 3362, 86, 3363, 3366, 86, 86, 86, 86, 3364, - 86, 3368, 86, 86, 3367, 3369, 3365, 86, 86, 86, - 3652, 86, 86, 3381, 86, 3370, 3378, 3379, 3371, 86, - 3372, 3373, 3380, 3374, 86, 3375, 3376, 86, 86, 3382, - 3377, 3384, 3386, 86, 3383, 3387, 86, 86, 3389, 86, - 3385, 3388, 86, 86, 3392, 86, 86, 3390, 3394, 86, - 3395, 3396, 86, 86, 3397, 3398, 3402, 86, 3399, 86, - 86, 3393, 3391, 3400, 3401, 3403, 86, 86, 3405, 86, - - 86, 86, 86, 3408, 86, 86, 3404, 86, 3412, 86, - 86, 86, 3411, 86, 86, 3407, 86, 86, 3406, 86, - 3415, 3416, 86, 3417, 3409, 3410, 86, 3420, 3421, 86, - 3413, 3418, 86, 3423, 86, 3422, 3414, 3419, 3424, 86, - 3425, 86, 86, 86, 86, 3430, 86, 3427, 3432, 3426, - 3431, 86, 3428, 86, 86, 3429, 86, 86, 86, 3439, - 86, 3434, 3436, 3437, 3440, 86, 3442, 86, 86, 3433, - 86, 3441, 3443, 86, 3435, 3438, 86, 3446, 86, 3447, - 86, 3445, 86, 3444, 86, 3450, 86, 3451, 86, 3452, - 86, 3448, 3453, 86, 3454, 86, 3455, 86, 3456, 86, - - 3457, 86, 3449, 86, 86, 3460, 86, 3461, 86, 86, - 86, 86, 86, 3459, 3465, 86, 86, 86, 3462, 3467, - 86, 86, 3463, 86, 3471, 3472, 86, 3468, 86, 3458, - 3469, 3464, 86, 3470, 86, 3466, 3474, 86, 86, 86, - 3478, 3476, 86, 3473, 86, 3480, 3481, 86, 86, 86, - 3475, 86, 86, 3483, 86, 86, 86, 86, 86, 86, - 3477, 3482, 3479, 3487, 3488, 3496, 86, 86, 3484, 3485, - 3486, 3489, 86, 3490, 86, 86, 86, 3493, 3494, 3492, - 3497, 86, 3491, 3498, 86, 86, 86, 3495, 86, 86, - 3501, 86, 86, 86, 3500, 86, 86, 3506, 3507, 3499, - - 86, 3509, 86, 3503, 3505, 86, 86, 86, 3502, 86, - 3508, 86, 86, 86, 3504, 3510, 86, 86, 3518, 86, - 86, 3516, 3513, 86, 3511, 3512, 3515, 86, 3517, 3522, - 86, 86, 3520, 3525, 3514, 86, 3524, 86, 3519, 3521, - 3527, 86, 86, 3523, 3529, 86, 3528, 86, 3530, 3531, - 86, 3532, 86, 86, 86, 3526, 86, 3535, 86, 86, - 86, 3533, 3540, 3536, 3537, 86, 86, 86, 86, 3544, - 86, 86, 3543, 3534, 86, 3539, 3546, 86, 3542, 3541, - 86, 3538, 3547, 86, 3548, 86, 3551, 86, 86, 3549, - 86, 3545, 3554, 86, 86, 3555, 86, 86, 86, 3550, - - 3558, 3559, 86, 3552, 3556, 86, 86, 86, 3553, 86, - 3564, 86, 3560, 86, 3563, 3561, 3557, 3565, 86, 86, - 86, 86, 86, 86, 3562, 86, 3569, 86, 3571, 86, - 86, 86, 86, 86, 3566, 3568, 3576, 3577, 86, 3567, - 3570, 86, 3573, 3574, 3572, 3584, 3575, 3578, 86, 3582, - 86, 86, 86, 3579, 86, 3585, 3580, 3583, 86, 86, - 3581, 86, 86, 3586, 3587, 3590, 3588, 3591, 86, 86, - 86, 86, 3593, 86, 3592, 86, 86, 86, 86, 3594, - 3599, 3589, 86, 3596, 86, 86, 86, 86, 3602, 3595, - 3603, 86, 86, 86, 86, 86, 3597, 3598, 3601, 3606, - - 86, 3600, 3604, 3607, 86, 3605, 86, 3610, 3609, 3611, - 86, 3608, 86, 3612, 86, 3614, 86, 3616, 86, 3617, - 86, 86, 86, 3621, 86, 3618, 3652, 86, 3619, 3624, - 86, 3615, 3622, 86, 86, 3623, 3613, 86, 86, 86, - 86, 3620, 86, 86, 3625, 3626, 86, 3628, 3630, 86, - 86, 3632, 86, 3627, 86, 3633, 86, 3636, 3629, 3631, - 3637, 86, 3634, 86, 86, 3640, 3641, 86, 86, 3643, - 86, 3635, 86, 3638, 86, 3642, 3644, 86, 86, 3645, - 86, 86, 3639, 3646, 3652, 3647, 3650, 86, 3651, 86, - 3652, 3652, 3652, 3648, 3652, 3652, 3652, 3652, 3652, 3652, - - 3649, 47, 47, 47, 47, 47, 47, 47, 52, 52, - 52, 52, 52, 52, 52, 57, 57, 57, 57, 57, - 57, 57, 63, 63, 63, 63, 63, 63, 63, 68, - 68, 68, 68, 68, 68, 68, 74, 74, 74, 74, - 74, 74, 74, 80, 80, 80, 80, 80, 80, 80, - 89, 89, 3652, 89, 89, 89, 89, 161, 161, 3652, - 3652, 3652, 161, 161, 163, 163, 3652, 3652, 163, 3652, - 163, 165, 3652, 3652, 3652, 3652, 3652, 165, 168, 168, - 3652, 3652, 3652, 168, 168, 170, 3652, 3652, 3652, 3652, - 3652, 170, 172, 172, 3652, 172, 172, 172, 172, 175, - - 3652, 3652, 3652, 3652, 3652, 175, 178, 178, 3652, 3652, - 3652, 178, 178, 90, 90, 3652, 90, 90, 90, 90, - 17, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, - 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, - 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, - 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, - 3652 + 86, 235, 228, 86, 86, 86, 86, 239, 86, 245, + 236, 241, 244, 86, 86, 242, 86, 247, 238, 86, + 86, 243, 240, 86, 86, 246, 248, 86, 257, 250, + 253, 179, 249, 256, 86, 258, 86, 259, 252, 86, + + 86, 254, 251, 265, 86, 255, 86, 262, 86, 86, + 268, 272, 86, 86, 260, 264, 86, 261, 263, 269, + 267, 271, 86, 86, 273, 161, 161, 275, 282, 163, + 177, 270, 163, 165, 274, 165, 165, 276, 165, 168, + 168, 170, 86, 170, 170, 90, 170, 90, 90, 171, + 90, 175, 277, 175, 175, 86, 175, 173, 178, 178, + 278, 279, 86, 86, 86, 283, 86, 86, 86, 86, + 86, 284, 86, 86, 290, 286, 280, 86, 285, 86, + 281, 293, 294, 289, 292, 288, 86, 176, 86, 295, + 291, 297, 86, 298, 299, 86, 300, 326, 86, 303, + + 86, 301, 296, 86, 304, 86, 308, 86, 310, 305, + 86, 86, 86, 311, 86, 306, 307, 313, 302, 309, + 86, 317, 312, 315, 86, 314, 86, 86, 319, 86, + 316, 320, 86, 86, 86, 86, 86, 86, 86, 327, + 328, 334, 86, 338, 86, 321, 322, 86, 323, 324, + 318, 171, 325, 86, 329, 337, 339, 330, 335, 331, + 336, 86, 86, 341, 343, 86, 344, 342, 340, 86, + 86, 332, 86, 333, 347, 86, 86, 86, 349, 350, + 86, 345, 348, 351, 86, 86, 346, 352, 354, 86, + 86, 86, 353, 86, 86, 86, 357, 356, 86, 358, + + 86, 86, 86, 355, 86, 86, 86, 364, 359, 362, + 86, 86, 86, 363, 365, 369, 373, 360, 86, 366, + 370, 86, 361, 371, 372, 86, 367, 375, 378, 86, + 86, 368, 86, 86, 86, 86, 86, 86, 381, 86, + 380, 86, 86, 389, 384, 385, 383, 374, 376, 377, + 86, 86, 379, 387, 388, 86, 382, 86, 390, 86, + 386, 391, 86, 392, 394, 86, 86, 395, 171, 86, + 86, 398, 86, 86, 86, 86, 169, 86, 397, 406, + 399, 401, 403, 86, 396, 86, 407, 393, 405, 86, + 86, 400, 86, 410, 402, 408, 86, 86, 404, 86, + + 86, 409, 86, 86, 411, 86, 86, 86, 418, 86, + 419, 412, 414, 416, 86, 86, 415, 420, 413, 86, + 421, 422, 86, 424, 86, 86, 425, 423, 86, 86, + 86, 417, 428, 86, 86, 86, 433, 429, 86, 86, + 435, 167, 86, 430, 426, 427, 86, 431, 86, 437, + 436, 86, 86, 434, 432, 86, 438, 86, 440, 86, + 442, 443, 86, 86, 441, 86, 86, 86, 86, 449, + 86, 445, 86, 439, 86, 450, 86, 86, 448, 86, + 446, 452, 86, 455, 447, 460, 444, 86, 451, 86, + 457, 86, 86, 453, 454, 461, 86, 456, 86, 86, + + 86, 459, 86, 476, 471, 166, 86, 458, 462, 86, + 86, 469, 86, 484, 86, 472, 470, 473, 463, 477, + 86, 464, 478, 483, 86, 86, 465, 466, 467, 468, + 474, 481, 86, 475, 479, 480, 482, 86, 86, 86, + 487, 485, 86, 86, 486, 493, 86, 86, 495, 86, + 86, 491, 492, 488, 494, 86, 489, 490, 86, 496, + 86, 86, 86, 86, 86, 499, 504, 86, 86, 505, + 498, 506, 86, 500, 86, 497, 522, 86, 511, 503, + 507, 501, 510, 502, 86, 86, 86, 508, 86, 86, + 512, 513, 518, 86, 509, 524, 515, 514, 516, 86, + + 523, 86, 517, 525, 86, 519, 86, 86, 520, 86, + 521, 526, 86, 527, 86, 528, 86, 86, 86, 86, + 540, 529, 86, 86, 542, 530, 545, 539, 557, 543, + 531, 556, 544, 532, 86, 533, 547, 534, 541, 558, + 86, 86, 546, 171, 559, 86, 567, 560, 86, 86, + 535, 86, 86, 536, 561, 537, 86, 538, 86, 563, + 548, 549, 86, 564, 562, 565, 86, 86, 566, 568, + 550, 551, 552, 553, 554, 86, 86, 555, 86, 572, + 574, 571, 86, 86, 86, 86, 570, 86, 569, 573, + 86, 582, 579, 578, 86, 580, 576, 86, 575, 581, + + 86, 583, 577, 584, 86, 587, 585, 86, 86, 86, + 86, 86, 591, 592, 590, 86, 86, 86, 586, 86, + 86, 86, 86, 597, 589, 86, 86, 598, 599, 600, + 593, 607, 588, 594, 596, 595, 86, 86, 86, 605, + 602, 603, 86, 86, 606, 86, 601, 621, 86, 86, + 86, 86, 633, 86, 86, 623, 604, 622, 608, 610, + 86, 609, 611, 612, 624, 626, 86, 86, 86, 86, + 627, 86, 629, 628, 613, 625, 614, 86, 86, 86, + 86, 630, 615, 86, 631, 635, 86, 86, 636, 632, + 616, 617, 86, 634, 618, 619, 86, 638, 620, 639, + + 637, 86, 86, 86, 86, 86, 640, 641, 643, 644, + 86, 645, 86, 86, 86, 86, 86, 86, 86, 646, + 651, 652, 642, 86, 647, 86, 86, 650, 656, 653, + 654, 86, 649, 648, 86, 655, 86, 658, 86, 660, + 86, 86, 86, 86, 86, 86, 86, 657, 86, 662, + 666, 86, 664, 659, 86, 86, 673, 164, 675, 86, + 668, 661, 86, 663, 86, 665, 667, 86, 677, 669, + 86, 670, 671, 674, 86, 672, 676, 86, 86, 86, + 86, 86, 678, 682, 679, 86, 680, 86, 86, 681, + 86, 686, 86, 683, 685, 688, 684, 86, 689, 86, + + 86, 86, 691, 86, 86, 692, 86, 687, 696, 86, + 695, 86, 693, 86, 698, 86, 697, 86, 86, 86, + 694, 86, 690, 86, 746, 86, 86, 699, 701, 713, + 86, 715, 700, 86, 702, 86, 712, 710, 730, 703, + 711, 704, 714, 86, 86, 86, 716, 705, 717, 706, + 718, 86, 707, 708, 719, 86, 721, 86, 720, 709, + 86, 726, 86, 86, 86, 86, 725, 86, 86, 733, + 86, 723, 727, 86, 724, 728, 722, 86, 729, 86, + 735, 86, 739, 86, 732, 736, 731, 86, 738, 737, + 734, 86, 86, 86, 86, 86, 742, 86, 86, 750, + + 86, 743, 740, 747, 748, 86, 86, 171, 86, 741, + 745, 749, 744, 752, 755, 86, 753, 86, 751, 86, + 86, 86, 754, 758, 86, 86, 760, 764, 86, 86, + 756, 763, 86, 86, 759, 757, 762, 766, 767, 86, + 86, 765, 86, 86, 86, 769, 86, 86, 86, 761, + 86, 768, 772, 773, 770, 86, 86, 774, 781, 86, + 778, 771, 782, 86, 775, 779, 86, 776, 783, 780, + 86, 777, 784, 86, 86, 785, 86, 786, 86, 787, + 86, 86, 86, 86, 788, 86, 86, 793, 789, 792, + 86, 86, 791, 86, 796, 86, 86, 801, 795, 790, + + 794, 797, 86, 86, 86, 86, 800, 86, 86, 803, + 86, 807, 86, 805, 799, 86, 798, 86, 86, 86, + 86, 86, 814, 810, 802, 804, 806, 86, 86, 86, + 808, 86, 815, 86, 86, 812, 86, 817, 809, 811, + 86, 813, 818, 816, 86, 819, 820, 86, 822, 821, + 86, 823, 824, 86, 827, 825, 829, 86, 826, 828, + 86, 86, 86, 831, 86, 832, 830, 86, 86, 834, + 835, 86, 86, 836, 86, 86, 86, 86, 843, 86, + 841, 839, 86, 86, 86, 86, 86, 833, 837, 838, + 840, 844, 86, 850, 86, 848, 842, 86, 162, 86, + + 851, 847, 845, 86, 849, 846, 852, 853, 854, 86, + 86, 86, 855, 86, 86, 857, 856, 86, 86, 862, + 86, 86, 860, 864, 86, 86, 863, 858, 859, 86, + 86, 86, 86, 865, 86, 86, 867, 861, 869, 86, + 868, 86, 86, 870, 86, 866, 873, 871, 872, 876, + 86, 877, 86, 86, 881, 86, 86, 879, 86, 878, + 874, 875, 880, 882, 86, 883, 886, 884, 86, 86, + 890, 86, 86, 86, 888, 891, 86, 86, 892, 86, + 887, 894, 885, 86, 889, 896, 86, 86, 86, 86, + 86, 902, 895, 86, 86, 86, 893, 86, 903, 86, + + 86, 86, 904, 86, 897, 898, 899, 86, 900, 86, + 901, 912, 909, 907, 905, 906, 86, 86, 911, 86, + 908, 910, 86, 86, 86, 86, 86, 913, 86, 919, + 914, 915, 86, 86, 86, 86, 86, 929, 86, 179, + 86, 916, 921, 918, 917, 927, 920, 86, 86, 86, + 922, 923, 924, 925, 926, 86, 86, 932, 86, 930, + 933, 928, 931, 935, 86, 86, 86, 86, 86, 86, + 934, 86, 86, 940, 939, 86, 941, 943, 86, 938, + 936, 86, 86, 944, 937, 86, 86, 86, 946, 86, + 177, 947, 171, 945, 951, 942, 949, 952, 950, 948, + + 86, 86, 86, 955, 953, 86, 954, 86, 86, 86, + 86, 958, 961, 86, 956, 86, 962, 964, 86, 86, + 86, 86, 957, 959, 963, 965, 968, 86, 966, 86, + 86, 960, 86, 86, 971, 86, 86, 975, 86, 86, + 967, 86, 86, 86, 86, 972, 969, 976, 977, 970, + 86, 86, 86, 86, 974, 86, 978, 991, 86, 86, + 973, 993, 990, 86, 980, 988, 86, 979, 86, 989, + 981, 86, 994, 982, 995, 996, 86, 983, 86, 997, + 984, 992, 86, 998, 86, 86, 1002, 985, 986, 86, + 987, 1003, 86, 86, 1000, 999, 86, 86, 1012, 1001, + + 86, 1004, 1005, 86, 1006, 86, 86, 1007, 86, 1011, + 1015, 86, 1008, 1013, 1014, 1017, 86, 86, 1009, 1010, + 86, 1019, 1021, 1022, 1020, 86, 86, 1016, 1024, 1025, + 86, 1018, 86, 1027, 1026, 86, 86, 1028, 86, 86, + 1031, 86, 1037, 1030, 86, 1023, 1032, 1029, 86, 1034, + 86, 1033, 1035, 86, 86, 86, 1036, 86, 86, 1039, + 86, 86, 1043, 86, 86, 1046, 1042, 86, 86, 1038, + 86, 86, 1052, 86, 1050, 86, 176, 1040, 1044, 1041, + 86, 1045, 1048, 86, 1053, 1056, 1047, 86, 1051, 1054, + 86, 86, 1055, 1049, 1057, 1058, 86, 86, 1060, 1061, + + 86, 86, 1059, 86, 86, 86, 1062, 1064, 86, 1065, + 86, 1063, 86, 1066, 86, 86, 86, 86, 86, 1068, + 1069, 86, 1070, 1074, 86, 86, 1078, 86, 1077, 86, + 1067, 86, 86, 1076, 1072, 1071, 1075, 86, 86, 86, + 1073, 86, 86, 86, 86, 86, 1086, 1081, 1082, 1079, + 1084, 1085, 86, 86, 86, 86, 1080, 1087, 1088, 86, + 86, 1092, 86, 1090, 86, 1083, 1093, 86, 1091, 86, + 1095, 86, 86, 1094, 86, 1096, 86, 1101, 1089, 86, + 1098, 1097, 86, 86, 1103, 1102, 1104, 86, 1099, 86, + 1100, 86, 86, 86, 1106, 86, 86, 1105, 86, 86, + + 1107, 86, 1114, 1108, 1112, 171, 1117, 86, 86, 86, + 86, 1109, 86, 1111, 1110, 86, 1118, 1115, 86, 1113, + 1116, 1119, 86, 1124, 1120, 86, 86, 86, 1123, 1121, + 86, 1126, 1122, 1127, 86, 86, 86, 86, 86, 1125, + 86, 86, 1138, 86, 1130, 1132, 1128, 86, 86, 1139, + 1129, 86, 86, 1141, 86, 86, 1131, 86, 1133, 86, + 1135, 1146, 1134, 1136, 1144, 1140, 1142, 1137, 86, 1145, + 86, 86, 86, 86, 1143, 86, 1153, 1150, 86, 1152, + 1154, 86, 86, 1148, 1155, 86, 86, 1147, 86, 1158, + 86, 1149, 1160, 86, 1151, 86, 86, 86, 86, 86, + + 1166, 1157, 1162, 1156, 86, 1167, 171, 1163, 86, 86, + 1159, 86, 1169, 1168, 1161, 86, 1170, 86, 86, 86, + 1164, 1171, 1165, 1174, 86, 86, 1173, 86, 86, 1172, + 86, 86, 1188, 86, 169, 1187, 1175, 1189, 1177, 86, + 1178, 1191, 86, 1176, 86, 1179, 86, 86, 86, 1180, + 86, 1193, 86, 1181, 1190, 1182, 86, 1196, 86, 1183, + 1195, 1184, 1198, 1194, 86, 86, 1185, 1199, 86, 1192, + 1197, 1186, 1201, 1200, 86, 86, 86, 86, 1202, 86, + 1204, 1205, 1208, 86, 86, 86, 167, 1207, 86, 86, + 1203, 1206, 86, 1209, 1212, 1214, 86, 1213, 1211, 1216, + + 1217, 1215, 1218, 86, 1210, 86, 86, 1219, 1220, 86, + 1221, 86, 86, 86, 86, 86, 86, 1235, 86, 86, + 1232, 86, 166, 86, 1236, 1231, 86, 86, 1222, 1223, + 86, 1224, 1233, 1234, 1237, 86, 1225, 86, 1226, 1238, + 86, 1239, 1243, 86, 1227, 86, 86, 86, 86, 1228, + 1229, 1244, 86, 1242, 1240, 1245, 1230, 86, 86, 1241, + 1250, 86, 1251, 1246, 86, 1248, 1253, 86, 1247, 86, + 1254, 86, 86, 86, 1258, 1249, 1256, 86, 86, 86, + 86, 86, 1259, 86, 1252, 1264, 1257, 86, 1255, 86, + 1261, 86, 1262, 86, 86, 1263, 1265, 1260, 1267, 86, + + 86, 86, 86, 86, 86, 86, 86, 86, 1266, 86, + 1272, 1273, 1274, 1269, 1268, 1271, 1276, 86, 86, 1278, + 1270, 1275, 86, 1277, 86, 86, 86, 1373, 86, 1279, + 1280, 86, 1282, 1285, 86, 86, 1281, 86, 86, 1286, + 1287, 1284, 1283, 86, 1289, 1290, 1288, 1291, 86, 86, + 86, 86, 86, 86, 1295, 1296, 86, 1292, 86, 1298, + 1297, 86, 1299, 1294, 1293, 86, 86, 1300, 1301, 86, + 1302, 86, 1308, 86, 86, 86, 1310, 86, 86, 86, + 86, 86, 86, 164, 1312, 1304, 1303, 1306, 1307, 1305, + 86, 1314, 1311, 86, 1313, 1309, 1315, 86, 86, 86, + + 86, 86, 1316, 1317, 1318, 86, 1321, 86, 86, 1320, + 1322, 86, 86, 1319, 1324, 1327, 1328, 86, 1326, 1323, + 86, 86, 86, 86, 86, 1332, 1331, 1325, 86, 1329, + 86, 86, 86, 1338, 86, 1336, 1339, 1340, 1343, 86, + 1330, 86, 86, 86, 86, 86, 1333, 1337, 86, 1334, + 1341, 1335, 86, 1342, 1345, 86, 86, 1344, 1349, 1347, + 86, 1346, 86, 86, 86, 1351, 86, 1350, 86, 86, + 86, 86, 1352, 86, 1354, 1348, 1357, 1353, 86, 86, + 86, 1358, 86, 86, 1360, 86, 1364, 1365, 1355, 86, + 1356, 1359, 86, 86, 86, 1362, 86, 1368, 86, 86, + + 1361, 1367, 86, 86, 1363, 86, 86, 86, 1369, 1366, + 86, 86, 86, 1370, 1371, 1375, 1379, 86, 171, 86, + 1380, 1372, 86, 1374, 1381, 86, 1376, 1382, 86, 86, + 1378, 86, 86, 86, 86, 1377, 1387, 86, 1383, 1384, + 1392, 1386, 1388, 1385, 1390, 86, 86, 1389, 86, 1393, + 1396, 86, 86, 1394, 1391, 86, 1395, 1397, 86, 86, + 86, 86, 86, 86, 86, 1400, 1403, 86, 86, 1407, + 86, 1404, 1398, 1399, 86, 86, 1401, 86, 86, 86, + 162, 1402, 1405, 86, 1411, 86, 86, 1406, 1408, 1417, + 1421, 1413, 1410, 1409, 86, 1418, 86, 1420, 86, 1412, + + 1414, 1419, 1415, 86, 86, 1416, 86, 1423, 86, 86, + 86, 86, 86, 1430, 86, 1427, 86, 1422, 1426, 86, + 86, 1431, 86, 86, 1429, 1424, 1425, 86, 1432, 86, + 1428, 1433, 1435, 86, 1436, 86, 1441, 86, 86, 86, + 1437, 1434, 1439, 1438, 86, 86, 86, 86, 1440, 1445, + 86, 86, 86, 1442, 1443, 86, 86, 1448, 1446, 86, + 86, 1455, 1447, 1449, 1444, 1453, 86, 86, 86, 86, + 86, 1450, 86, 86, 1452, 1454, 1451, 86, 1458, 86, + 86, 1465, 86, 86, 1467, 1459, 1456, 86, 1457, 1461, + 86, 1460, 1462, 86, 86, 1464, 86, 86, 1468, 86, + + 86, 86, 1466, 1475, 1463, 1470, 1473, 1469, 1476, 86, + 86, 1474, 1472, 86, 1471, 86, 1480, 86, 86, 1477, + 86, 86, 1491, 1492, 1478, 1490, 1479, 86, 1481, 1489, + 1488, 86, 1482, 86, 86, 1483, 1484, 1494, 86, 1495, + 1485, 86, 1493, 86, 86, 86, 1486, 86, 1497, 1496, + 1487, 86, 1499, 86, 1504, 86, 1500, 86, 1501, 1498, + 86, 1502, 86, 1503, 1505, 86, 86, 1507, 1510, 1511, + 86, 86, 86, 86, 86, 86, 1512, 1506, 86, 1508, + 86, 1515, 1513, 1514, 1509, 1520, 1516, 1521, 1517, 86, + 1518, 86, 1519, 86, 1522, 1523, 1524, 86, 86, 86, + + 1525, 1526, 86, 86, 1531, 86, 1527, 86, 86, 1532, + 86, 86, 1530, 1535, 1533, 86, 86, 86, 86, 1528, + 1529, 1541, 86, 1542, 1537, 1536, 86, 86, 86, 1534, + 86, 86, 1540, 86, 86, 1538, 1539, 86, 1543, 1544, + 86, 86, 1545, 1548, 1547, 1546, 86, 86, 1549, 1553, + 86, 1550, 1552, 1555, 86, 86, 86, 1556, 86, 1557, + 86, 1554, 1551, 1558, 86, 1561, 86, 86, 1563, 86, + 86, 1564, 86, 1560, 86, 86, 86, 1565, 86, 1559, + 1569, 86, 86, 86, 86, 1574, 1572, 1562, 86, 86, + 86, 86, 86, 1575, 86, 1566, 1567, 1568, 1570, 1571, + + 86, 1576, 1577, 86, 1573, 1580, 1579, 1578, 86, 86, + 86, 86, 86, 86, 1582, 86, 1584, 1610, 1586, 86, + 1585, 1581, 1587, 86, 1583, 86, 1589, 86, 1588, 86, + 86, 86, 1590, 1591, 1595, 1592, 1596, 1593, 86, 1599, + 86, 86, 86, 1597, 1594, 86, 1598, 86, 86, 86, + 1603, 86, 86, 86, 86, 86, 1600, 86, 1605, 171, + 1602, 86, 1611, 1612, 1607, 86, 86, 1601, 86, 86, + 86, 1613, 1604, 1606, 1608, 86, 1615, 1609, 86, 86, + 1616, 1614, 86, 86, 86, 86, 1617, 86, 1623, 86, + 86, 1620, 86, 86, 86, 1618, 86, 1621, 1619, 1627, + + 1629, 86, 1622, 86, 86, 1624, 1633, 3670, 1626, 1631, + 1628, 1634, 86, 86, 1625, 1632, 1630, 86, 86, 86, + 86, 1635, 1636, 86, 86, 1637, 86, 86, 1642, 1645, + 1647, 1643, 1638, 1644, 1639, 1640, 86, 86, 1641, 86, + 1646, 1648, 1650, 86, 86, 86, 86, 1651, 86, 86, + 1649, 1655, 86, 86, 1656, 86, 86, 1657, 86, 86, + 86, 1660, 1652, 1654, 86, 86, 86, 1665, 86, 86, + 1653, 1658, 1666, 1662, 1669, 1659, 86, 86, 1661, 1668, + 86, 86, 1663, 1664, 86, 86, 86, 1667, 1670, 86, + 86, 86, 1678, 1671, 86, 86, 1677, 86, 1673, 1679, + + 1672, 1674, 86, 86, 1675, 86, 1683, 86, 86, 1676, + 1688, 1682, 1685, 1680, 86, 1687, 86, 1689, 1681, 86, + 86, 1691, 1684, 86, 1692, 86, 86, 86, 1686, 86, + 86, 1697, 1693, 1690, 1698, 1696, 1699, 86, 86, 1700, + 86, 86, 86, 1694, 86, 1701, 1704, 86, 86, 86, + 1695, 86, 1705, 86, 86, 86, 86, 1712, 1706, 1707, + 86, 86, 1711, 1708, 1702, 86, 1703, 1709, 86, 1710, + 86, 86, 1718, 1714, 86, 1715, 86, 1719, 86, 1720, + 1713, 1722, 1716, 86, 1721, 86, 86, 1723, 86, 86, + 1717, 86, 1726, 1724, 1727, 1725, 86, 1731, 86, 86, + + 86, 86, 1735, 86, 1732, 86, 86, 1728, 86, 1738, + 86, 1729, 1737, 86, 1730, 86, 86, 86, 1733, 86, + 1736, 86, 86, 3670, 1739, 86, 1734, 86, 1747, 1740, + 86, 86, 1741, 1744, 1748, 1742, 1743, 1746, 86, 1752, + 86, 86, 1745, 86, 1749, 1753, 86, 86, 1754, 1750, + 1751, 1755, 86, 86, 1756, 86, 86, 86, 86, 1760, + 86, 86, 1758, 1761, 86, 1764, 86, 1757, 1759, 1768, + 86, 1769, 1770, 1765, 1763, 86, 1762, 1773, 86, 86, + 1767, 1766, 86, 86, 86, 86, 86, 1774, 1775, 1776, + 1771, 86, 1772, 86, 86, 1781, 1782, 86, 86, 86, + + 86, 86, 1779, 86, 1786, 1785, 1777, 1787, 86, 1778, + 1789, 86, 86, 86, 1780, 1790, 1783, 1791, 86, 86, + 1784, 86, 86, 86, 86, 86, 1795, 86, 1788, 86, + 86, 1800, 86, 86, 1798, 1792, 86, 1793, 1794, 86, + 86, 86, 1807, 86, 1804, 1796, 1806, 1797, 1801, 1799, + 86, 86, 86, 1802, 1805, 1803, 86, 86, 86, 1808, + 86, 1809, 86, 1813, 86, 86, 1810, 1818, 86, 1816, + 86, 86, 1814, 86, 1819, 86, 1821, 1812, 1815, 86, + 1817, 1811, 86, 86, 86, 86, 86, 1825, 1828, 86, + 1827, 1820, 171, 1824, 86, 1822, 86, 1829, 1823, 1830, + + 86, 1831, 86, 1826, 86, 86, 86, 86, 1832, 86, + 1840, 86, 1841, 86, 86, 86, 1834, 86, 1833, 1837, + 1839, 1844, 86, 1835, 1836, 86, 1845, 86, 86, 1848, + 1846, 1838, 86, 1842, 1843, 1847, 1850, 1849, 1852, 86, + 86, 86, 86, 86, 86, 1853, 1855, 86, 1851, 1857, + 86, 86, 86, 1854, 86, 1858, 86, 1860, 86, 1861, + 1856, 86, 86, 86, 1866, 1865, 1862, 86, 86, 86, + 86, 1873, 1863, 86, 86, 1859, 1864, 86, 86, 1874, + 1868, 1870, 1877, 86, 1871, 1867, 1875, 86, 86, 1869, + 86, 1880, 1878, 1881, 86, 1879, 1872, 1883, 1884, 86, + + 86, 86, 1876, 86, 86, 1885, 86, 1886, 86, 1887, + 1888, 86, 86, 86, 1882, 1895, 86, 1889, 1892, 1891, + 86, 86, 1896, 1894, 1890, 1897, 86, 86, 86, 1899, + 86, 86, 1898, 1893, 86, 86, 1902, 86, 86, 1901, + 86, 86, 86, 1903, 86, 86, 86, 86, 1904, 1900, + 86, 86, 86, 86, 1927, 1908, 1913, 86, 86, 1909, + 1905, 1906, 86, 86, 1907, 1910, 1915, 86, 1911, 1914, + 1916, 1912, 86, 86, 1917, 1920, 86, 1921, 1923, 86, + 86, 86, 86, 1925, 1918, 86, 1919, 1929, 86, 86, + 86, 1928, 1922, 1924, 1931, 86, 1933, 86, 86, 86, + + 86, 1926, 1932, 86, 86, 1930, 86, 86, 86, 86, + 1940, 86, 1934, 1935, 86, 1938, 3670, 1941, 1937, 1939, + 1942, 86, 1936, 1943, 1944, 86, 1948, 86, 1947, 1945, + 1949, 86, 1951, 1950, 86, 86, 1946, 1952, 1953, 86, + 86, 86, 86, 86, 86, 1957, 1956, 86, 1954, 1958, + 86, 86, 86, 1967, 86, 86, 86, 86, 86, 1955, + 1961, 1963, 1959, 1960, 1964, 1965, 1966, 86, 86, 1962, + 1970, 86, 86, 1974, 1968, 1969, 1971, 86, 1975, 86, + 86, 86, 1972, 86, 86, 1976, 3670, 1973, 86, 1977, + 86, 1980, 86, 86, 1984, 1981, 86, 1983, 1985, 86, + + 1982, 1979, 86, 1986, 1990, 1988, 1978, 86, 1989, 86, + 86, 86, 86, 1994, 86, 86, 2001, 1987, 1995, 86, + 1999, 86, 86, 86, 86, 1991, 1996, 86, 1993, 1997, + 1992, 2003, 86, 1998, 2004, 2000, 86, 86, 2006, 2007, + 86, 2002, 2005, 86, 86, 86, 2011, 2009, 86, 2008, + 2010, 86, 86, 2015, 2013, 86, 2016, 2012, 86, 86, + 2014, 86, 86, 86, 86, 86, 86, 86, 2021, 86, + 2020, 86, 3670, 2022, 2017, 2024, 86, 2018, 2023, 2032, + 2019, 2026, 2025, 2028, 86, 2027, 2030, 2031, 86, 2034, + 86, 86, 86, 86, 86, 86, 2038, 86, 2040, 86, + + 86, 2033, 86, 86, 86, 2029, 86, 2044, 86, 86, + 86, 2035, 2036, 2039, 2037, 86, 3670, 86, 2042, 2046, + 86, 2041, 2047, 2045, 2043, 2049, 86, 86, 86, 2048, + 171, 2050, 86, 2052, 86, 86, 2051, 2055, 86, 2053, + 86, 2054, 2056, 2058, 86, 86, 2062, 86, 86, 86, + 2057, 86, 2060, 2063, 86, 86, 86, 2059, 2065, 86, + 86, 86, 2070, 2064, 2061, 86, 2066, 2067, 86, 86, + 86, 3670, 2071, 2074, 86, 2068, 2073, 86, 2079, 2069, + 2075, 2076, 86, 2072, 2077, 86, 2080, 2078, 2081, 86, + 86, 86, 86, 2083, 86, 86, 86, 2084, 86, 86, + + 86, 86, 2082, 86, 86, 2089, 2090, 86, 86, 2094, + 86, 86, 2091, 86, 3670, 2085, 2087, 2088, 2086, 2092, + 2095, 86, 86, 2093, 2102, 86, 2100, 2098, 2101, 2103, + 2097, 86, 86, 2096, 2099, 86, 86, 86, 86, 86, + 86, 86, 2110, 86, 86, 86, 2113, 86, 2105, 2114, + 86, 86, 2104, 86, 2108, 2106, 2107, 2180, 2111, 2109, + 2112, 2115, 86, 2116, 2117, 86, 86, 2118, 2119, 2122, + 86, 86, 2120, 2124, 2121, 2123, 2126, 86, 86, 86, + 2125, 2128, 86, 86, 86, 86, 86, 86, 2129, 2131, + 2132, 86, 86, 2135, 86, 86, 2127, 2134, 86, 86, + + 86, 86, 86, 2140, 2138, 2133, 2139, 86, 2142, 2130, + 2136, 86, 2141, 86, 86, 86, 2150, 86, 86, 2137, + 2147, 86, 86, 2143, 2144, 2145, 86, 86, 2153, 86, + 2146, 2148, 2154, 86, 2155, 2149, 86, 2151, 2152, 2156, + 86, 2158, 86, 2157, 2159, 2162, 86, 2160, 2161, 86, + 86, 86, 2166, 86, 86, 2163, 86, 2168, 86, 86, + 86, 2171, 2172, 86, 86, 2174, 86, 86, 86, 2164, + 86, 2165, 86, 2181, 86, 86, 2179, 2176, 2169, 2177, + 2167, 2170, 86, 86, 2173, 86, 86, 86, 86, 2187, + 86, 86, 2175, 2178, 2184, 2185, 2182, 2190, 2183, 86, + + 2192, 86, 86, 86, 2191, 86, 86, 2189, 2195, 2194, + 86, 2186, 2196, 2198, 86, 86, 2188, 2199, 86, 86, + 2200, 2193, 86, 86, 2197, 86, 86, 86, 86, 2205, + 86, 2201, 86, 2207, 86, 86, 2210, 2211, 2202, 86, + 2206, 2212, 86, 86, 86, 2203, 2204, 86, 2215, 86, + 2208, 86, 86, 86, 2220, 86, 86, 2214, 2219, 2213, + 2209, 86, 86, 86, 2216, 86, 2226, 2225, 86, 2217, + 86, 2229, 86, 2218, 2227, 2222, 2221, 2223, 86, 2228, + 2224, 86, 2230, 2233, 86, 86, 86, 86, 86, 86, + 86, 86, 2231, 86, 2237, 2241, 86, 2232, 86, 86, + + 2235, 86, 86, 2244, 86, 2242, 2234, 2236, 2248, 2245, + 2238, 2239, 86, 2240, 2243, 2246, 86, 86, 2247, 86, + 86, 2249, 2252, 2254, 86, 2253, 2255, 86, 2256, 86, + 2250, 2258, 2259, 2257, 86, 2251, 86, 86, 86, 86, + 2263, 2261, 86, 86, 86, 86, 86, 2265, 86, 2267, + 86, 2262, 2269, 2271, 2264, 2260, 2266, 86, 86, 86, + 2272, 86, 86, 171, 86, 86, 86, 2286, 2275, 86, + 2268, 86, 2270, 86, 2279, 3670, 2273, 2276, 2277, 2280, + 86, 86, 2274, 2278, 2281, 86, 2282, 2283, 86, 2284, + 86, 2285, 86, 86, 86, 86, 2292, 86, 2287, 2288, + + 86, 2289, 2290, 86, 86, 2291, 2293, 86, 2295, 86, + 86, 86, 86, 2299, 86, 86, 2294, 2298, 86, 86, + 2300, 2296, 2297, 2301, 2302, 86, 2304, 86, 2303, 86, + 86, 86, 86, 86, 86, 2305, 2309, 2311, 2306, 2310, + 86, 86, 86, 86, 86, 86, 2316, 86, 2307, 2313, + 2308, 2312, 86, 86, 86, 86, 2315, 2317, 86, 2314, + 86, 2319, 2318, 2320, 86, 2322, 86, 2321, 2327, 2323, + 2324, 2326, 2328, 86, 2325, 86, 86, 86, 2329, 86, + 86, 86, 2335, 86, 86, 2337, 86, 86, 86, 2338, + 2340, 86, 2330, 2331, 2334, 2332, 2333, 86, 2342, 86, + + 2336, 86, 2343, 86, 2339, 2341, 86, 2346, 86, 86, + 86, 86, 2345, 86, 86, 2351, 2348, 86, 86, 2352, + 86, 86, 2347, 86, 86, 86, 2344, 2353, 86, 86, + 86, 2350, 2349, 2355, 86, 2356, 2362, 2358, 2354, 2357, + 86, 2363, 86, 2360, 2361, 86, 2359, 86, 86, 2365, + 2368, 2364, 86, 2366, 2371, 86, 86, 2370, 86, 2374, + 86, 86, 86, 2369, 86, 2375, 2367, 2377, 2373, 86, + 2372, 2378, 86, 86, 86, 86, 86, 2380, 2376, 2379, + 2381, 86, 2383, 2382, 2384, 86, 2388, 2386, 2385, 86, + 86, 2389, 86, 2391, 86, 86, 86, 86, 86, 2394, + + 2387, 2393, 86, 2395, 2390, 86, 86, 2396, 86, 2400, + 86, 86, 86, 2404, 86, 86, 2401, 86, 2405, 86, + 86, 2392, 2403, 2397, 2398, 2402, 86, 86, 2399, 2410, + 86, 2408, 2409, 2407, 2406, 86, 2411, 86, 2412, 86, + 2415, 86, 86, 2417, 86, 86, 86, 2416, 2421, 86, + 86, 86, 2413, 2419, 86, 2423, 86, 2424, 86, 2414, + 86, 2420, 2418, 2422, 86, 2426, 86, 2425, 2427, 86, + 2428, 2431, 86, 2429, 2433, 86, 2430, 86, 86, 2434, + 86, 86, 86, 86, 86, 86, 2436, 2435, 2439, 2440, + 2437, 86, 86, 2432, 2438, 2444, 86, 86, 2441, 86, + + 2443, 2442, 86, 86, 86, 86, 86, 86, 86, 2452, + 2445, 86, 86, 86, 86, 2446, 86, 2447, 2448, 2450, + 2453, 2451, 2458, 2454, 86, 86, 86, 2455, 2449, 2456, + 2457, 86, 2459, 86, 2465, 2463, 86, 2460, 86, 2462, + 86, 2464, 2468, 86, 2470, 86, 86, 2467, 86, 2469, + 2461, 86, 86, 86, 86, 2473, 2477, 2474, 171, 2481, + 3670, 2466, 86, 2479, 2471, 86, 2475, 2472, 2480, 86, + 2482, 86, 86, 2476, 2483, 86, 86, 2486, 86, 86, + 2478, 86, 2487, 2484, 2491, 86, 86, 2492, 2490, 86, + 86, 2495, 2485, 86, 86, 2497, 2488, 86, 2496, 2498, + + 86, 2493, 86, 86, 86, 2500, 2501, 2489, 2494, 2499, + 86, 86, 86, 86, 2503, 86, 86, 86, 86, 86, + 2506, 86, 2509, 2502, 86, 86, 86, 2515, 86, 86, + 2513, 86, 2504, 2508, 86, 2516, 86, 2510, 2505, 2507, + 2511, 2512, 86, 86, 2517, 86, 86, 2518, 2514, 86, + 86, 86, 2519, 86, 2524, 2527, 86, 2522, 86, 86, + 86, 2521, 2520, 2525, 86, 2523, 2528, 86, 86, 2526, + 86, 86, 2529, 86, 86, 2538, 86, 86, 2530, 2531, + 2536, 86, 86, 86, 3670, 2543, 86, 2532, 2541, 2534, + 2540, 2533, 2535, 86, 2537, 86, 2544, 2539, 86, 2542, + + 2545, 86, 86, 2546, 86, 2547, 86, 86, 2548, 2554, + 2549, 86, 2552, 2553, 86, 2555, 86, 86, 2550, 2551, + 86, 86, 86, 2559, 2561, 86, 2560, 86, 2562, 86, + 2563, 86, 2556, 86, 2558, 2557, 2566, 86, 2567, 86, + 2564, 86, 86, 2565, 86, 86, 2568, 2569, 2573, 86, + 2574, 86, 86, 2570, 2576, 86, 86, 2572, 2578, 86, + 86, 86, 2581, 86, 2571, 86, 2580, 2582, 86, 86, + 86, 2575, 86, 86, 2577, 2579, 86, 86, 2584, 2583, + 86, 2588, 2589, 86, 2591, 86, 2586, 2585, 86, 86, + 86, 86, 2587, 2593, 2595, 2594, 2590, 86, 2592, 86, + + 2596, 2598, 86, 86, 86, 2601, 86, 2604, 86, 2599, + 2605, 86, 2600, 86, 86, 2597, 86, 86, 86, 2602, + 2611, 86, 2610, 86, 86, 2603, 86, 86, 2607, 2613, + 86, 2606, 2609, 2616, 86, 86, 86, 2608, 86, 86, + 86, 2614, 2612, 2618, 86, 2615, 86, 2617, 2626, 2619, + 86, 2624, 86, 86, 2630, 2622, 2620, 2621, 86, 86, + 86, 2625, 2627, 2632, 86, 2631, 86, 86, 86, 2633, + 2623, 86, 86, 86, 86, 86, 2637, 2628, 2639, 2629, + 2635, 86, 86, 86, 3670, 86, 2640, 2641, 2643, 2636, + 2642, 2634, 86, 2644, 86, 2645, 2647, 2648, 2638, 86, + + 2646, 86, 86, 86, 86, 86, 2649, 2652, 2650, 86, + 86, 86, 86, 86, 86, 86, 2651, 2659, 2654, 2655, + 2656, 2657, 2660, 86, 86, 2653, 86, 2658, 86, 86, + 2661, 86, 2665, 2664, 2662, 2663, 2666, 86, 2667, 86, + 86, 2670, 86, 86, 171, 2674, 2668, 86, 2669, 2671, + 86, 2676, 86, 86, 86, 86, 86, 86, 86, 2684, + 86, 86, 2677, 2672, 2678, 2673, 2675, 3670, 2679, 2680, + 2682, 86, 2681, 2686, 2683, 2687, 86, 86, 2688, 86, + 2685, 2689, 86, 86, 2691, 2692, 2690, 2693, 86, 2695, + 86, 86, 86, 86, 86, 2697, 86, 2694, 86, 86, + + 86, 2701, 86, 2702, 86, 86, 2696, 86, 2698, 86, + 2704, 2705, 2699, 2710, 86, 86, 2703, 2706, 2700, 2707, + 86, 86, 86, 86, 2711, 86, 2708, 2709, 86, 2713, + 2714, 86, 86, 86, 86, 86, 86, 2716, 86, 86, + 86, 2715, 2721, 2712, 86, 2723, 2724, 86, 2726, 86, + 2720, 86, 86, 2717, 2718, 2719, 86, 2725, 86, 2722, + 86, 86, 2727, 2730, 2732, 86, 86, 86, 2728, 86, + 2736, 2737, 2735, 2733, 2759, 2729, 86, 86, 86, 86, + 86, 2731, 2734, 86, 86, 2739, 2738, 86, 2740, 86, + 2743, 86, 86, 2794, 2741, 2744, 86, 2745, 2742, 86, + + 86, 2751, 2746, 2747, 86, 2749, 86, 86, 86, 86, + 2750, 2753, 86, 2748, 2755, 86, 86, 86, 2754, 86, + 2752, 86, 86, 86, 86, 2764, 86, 86, 2762, 2763, + 2766, 2757, 2765, 86, 2756, 2758, 86, 86, 86, 2768, + 86, 86, 86, 2761, 86, 86, 2771, 2760, 2773, 2770, + 86, 86, 2776, 86, 86, 86, 2769, 2767, 86, 86, + 2777, 2772, 2774, 2775, 2778, 2779, 2780, 2783, 86, 2782, + 86, 86, 86, 2784, 86, 86, 2781, 86, 2787, 2788, + 86, 86, 86, 86, 86, 86, 2789, 86, 86, 2793, + 2785, 2791, 2786, 2790, 86, 86, 2792, 86, 86, 2795, + + 2797, 2796, 2798, 2801, 2802, 86, 2803, 86, 2804, 86, + 2805, 86, 86, 86, 2799, 2800, 86, 86, 2809, 86, + 2810, 2808, 86, 2811, 2806, 86, 86, 86, 86, 86, + 3670, 2807, 86, 86, 2818, 86, 86, 2812, 86, 2814, + 2820, 86, 2821, 86, 2823, 86, 2813, 2822, 2815, 2817, + 2816, 2819, 86, 86, 86, 86, 86, 86, 2827, 86, + 2825, 2828, 2831, 86, 2824, 86, 2826, 86, 2832, 2833, + 86, 86, 86, 86, 86, 2829, 86, 2830, 2840, 86, + 171, 86, 2842, 86, 2836, 86, 86, 2835, 2838, 86, + 86, 2834, 2841, 86, 2843, 2839, 2837, 2846, 2844, 86, + + 86, 2845, 2849, 86, 86, 2851, 86, 2850, 2852, 2853, + 86, 2847, 86, 2848, 2854, 86, 86, 2855, 86, 2856, + 86, 2857, 2858, 2859, 86, 2860, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 2868, 3670, 86, 86, 2861, + 2866, 86, 2872, 86, 86, 2863, 2862, 2873, 2870, 2865, + 2864, 86, 2867, 86, 2869, 2871, 2874, 86, 2875, 86, + 2876, 86, 2877, 2878, 86, 2880, 86, 86, 2879, 2881, + 86, 86, 86, 86, 86, 86, 86, 2884, 86, 2882, + 2891, 86, 2890, 2892, 86, 2883, 2885, 86, 86, 86, + 2886, 2887, 2888, 2889, 2895, 2896, 86, 2898, 2893, 2897, + + 86, 86, 86, 86, 86, 2894, 86, 2899, 86, 2905, + 86, 86, 86, 2904, 86, 86, 86, 2901, 3670, 2900, + 2903, 86, 86, 2902, 2913, 86, 2909, 2911, 86, 86, + 2912, 2906, 2907, 86, 2908, 2914, 2910, 2915, 86, 86, + 2916, 86, 86, 86, 86, 86, 86, 86, 2917, 2920, + 2921, 2922, 86, 86, 2919, 86, 2927, 2928, 86, 86, + 2918, 2931, 86, 2923, 2925, 86, 2924, 86, 86, 86, + 2926, 86, 2934, 2930, 2929, 86, 2932, 2939, 86, 86, + 86, 2937, 2933, 2938, 2935, 86, 2936, 86, 86, 2944, + 86, 86, 86, 2940, 86, 86, 2948, 86, 2947, 86, + + 2941, 2946, 86, 2945, 2949, 86, 86, 2942, 2943, 2951, + 86, 2952, 86, 86, 2955, 2954, 2950, 2957, 86, 86, + 2958, 2953, 86, 2960, 86, 86, 86, 86, 86, 2967, + 86, 86, 86, 2956, 86, 86, 86, 2964, 2961, 2962, + 2963, 2965, 86, 2966, 2959, 2970, 86, 2971, 86, 86, + 2969, 2968, 86, 2972, 86, 2976, 86, 2974, 86, 86, + 86, 86, 2975, 2973, 86, 2977, 2978, 86, 86, 2980, + 2983, 86, 2981, 2985, 2979, 2982, 2984, 86, 2987, 171, + 2986, 86, 86, 86, 86, 2992, 3670, 2989, 2988, 86, + 86, 86, 86, 2994, 2993, 86, 2997, 86, 2998, 86, + + 2996, 2990, 2991, 86, 3002, 2995, 3000, 86, 86, 3003, + 86, 3001, 86, 86, 86, 3007, 2999, 3004, 3005, 86, + 86, 86, 86, 3008, 86, 3009, 86, 86, 3006, 3014, + 3015, 3010, 86, 86, 3012, 86, 86, 3016, 86, 3011, + 3018, 86, 86, 3020, 86, 3017, 86, 3021, 3013, 3019, + 86, 86, 86, 86, 86, 3023, 3024, 3025, 3022, 86, + 86, 86, 3030, 86, 86, 86, 86, 3027, 3028, 3029, + 3032, 3026, 3031, 3034, 86, 86, 86, 3670, 86, 86, + 3035, 86, 3033, 3040, 86, 3036, 86, 86, 3041, 86, + 86, 86, 3045, 86, 86, 3037, 3038, 3039, 3043, 3044, + + 3048, 86, 3046, 86, 86, 3042, 86, 86, 3047, 3055, + 3052, 3053, 86, 3049, 3056, 86, 86, 3058, 3050, 86, + 86, 3059, 86, 86, 3051, 86, 86, 3060, 86, 86, + 3065, 3062, 3054, 86, 3057, 86, 86, 3063, 3066, 86, + 86, 86, 3064, 3067, 3070, 86, 86, 3072, 86, 3670, + 3061, 3068, 3074, 86, 3069, 86, 3071, 3075, 86, 3076, + 86, 86, 86, 86, 3079, 3077, 3073, 3078, 3080, 86, + 86, 3084, 86, 86, 86, 3082, 3085, 86, 86, 3088, + 3089, 86, 86, 3081, 3083, 3086, 3090, 86, 3091, 86, + 86, 86, 86, 3092, 3087, 3093, 3095, 86, 86, 3098, + + 86, 86, 3099, 86, 3094, 3100, 86, 86, 3102, 86, + 3096, 86, 86, 3106, 3107, 86, 3103, 86, 3097, 86, + 86, 3108, 3101, 86, 3109, 3110, 3105, 3111, 86, 3104, + 86, 86, 3112, 86, 86, 3117, 86, 86, 86, 86, + 3116, 86, 3119, 3120, 86, 86, 3113, 3122, 3114, 86, + 3121, 3115, 3123, 86, 86, 3126, 3125, 86, 86, 86, + 86, 3118, 3124, 3129, 86, 3133, 86, 86, 86, 86, + 86, 3135, 3670, 86, 3127, 3128, 86, 3130, 3132, 3136, + 3131, 3134, 3140, 3137, 3139, 3142, 86, 3141, 86, 3138, + 3143, 86, 3144, 3145, 86, 86, 3146, 86, 3147, 86, + + 3148, 86, 3149, 86, 3150, 86, 86, 86, 86, 86, + 86, 3152, 3154, 86, 3156, 86, 86, 86, 3158, 86, + 86, 3151, 3155, 3165, 3159, 3163, 86, 3153, 86, 3157, + 3164, 86, 3167, 86, 86, 86, 3160, 3161, 86, 3162, + 3168, 3170, 86, 3166, 86, 3171, 3172, 86, 86, 3173, + 3174, 86, 86, 3169, 86, 86, 86, 3175, 3180, 86, + 86, 3176, 86, 3177, 3178, 3181, 86, 86, 86, 3183, + 86, 3182, 86, 86, 3179, 86, 86, 3188, 86, 3185, + 3192, 3184, 3189, 86, 3191, 3186, 3190, 86, 86, 3194, + 86, 86, 3187, 3193, 3196, 86, 86, 3200, 86, 86, + + 86, 3195, 86, 3198, 86, 3197, 86, 3207, 3201, 3204, + 86, 86, 3202, 86, 3199, 3205, 86, 86, 86, 86, + 86, 3212, 3210, 3208, 3211, 86, 86, 3203, 86, 86, + 3206, 3214, 3216, 86, 3213, 86, 3217, 3209, 3222, 3218, + 86, 3215, 3219, 86, 3220, 86, 3221, 86, 86, 86, + 3226, 86, 86, 3223, 3225, 86, 86, 3227, 86, 3224, + 3228, 3229, 86, 3231, 86, 86, 3230, 3235, 86, 3233, + 3237, 86, 86, 86, 86, 86, 3238, 86, 86, 3232, + 3239, 86, 3240, 3234, 86, 3241, 86, 3246, 86, 3243, + 86, 86, 86, 3236, 86, 86, 3244, 3242, 3250, 86, + + 86, 86, 86, 3247, 3248, 3249, 3245, 3255, 3251, 3254, + 86, 3252, 86, 3257, 86, 86, 86, 3261, 86, 3253, + 3262, 86, 86, 3258, 86, 86, 3264, 86, 86, 86, + 3256, 3265, 86, 3259, 3267, 3268, 86, 86, 3266, 3270, + 86, 3263, 3260, 3271, 86, 3272, 3269, 86, 86, 3273, + 3276, 86, 3275, 3274, 86, 3279, 86, 3281, 86, 86, + 86, 86, 86, 3278, 86, 3283, 3286, 86, 3277, 3287, + 86, 3289, 86, 86, 3284, 86, 86, 86, 3282, 3280, + 86, 3285, 3292, 86, 86, 3290, 3293, 86, 3294, 86, + 3288, 3296, 86, 86, 3291, 3298, 3295, 3301, 3299, 86, + + 86, 86, 86, 86, 3305, 86, 86, 86, 86, 3307, + 3308, 3297, 3303, 3300, 86, 3309, 86, 3306, 3302, 3312, + 3310, 3304, 3313, 86, 86, 86, 3315, 3314, 86, 86, + 3318, 86, 86, 86, 3317, 86, 3311, 3321, 3319, 86, + 3324, 86, 86, 86, 86, 86, 3316, 86, 3329, 86, + 86, 86, 86, 86, 3320, 3525, 3322, 3323, 3328, 3325, + 3326, 3332, 3333, 86, 3334, 86, 3331, 3335, 86, 3327, + 3330, 86, 86, 86, 3339, 86, 3336, 86, 3338, 3340, + 86, 3341, 86, 3342, 86, 86, 3337, 3345, 86, 86, + 3343, 3347, 86, 86, 3346, 3349, 86, 3350, 86, 86, + + 86, 86, 86, 86, 3348, 86, 3356, 3357, 86, 86, + 86, 3344, 86, 86, 86, 86, 3363, 86, 3351, 3364, + 86, 3354, 3352, 3353, 3362, 3355, 3360, 86, 3366, 3359, + 86, 86, 3365, 3361, 86, 3358, 3369, 86, 3371, 86, + 3372, 86, 86, 86, 3375, 86, 86, 3367, 3373, 3368, + 86, 3378, 86, 86, 3377, 86, 3374, 3376, 3370, 86, + 3379, 86, 86, 3380, 86, 86, 3381, 86, 86, 3384, + 86, 86, 86, 3382, 3386, 3387, 86, 3385, 86, 86, + 86, 86, 3383, 86, 86, 86, 3396, 3399, 3397, 3388, + 3400, 3389, 3390, 86, 3391, 3392, 86, 3393, 3394, 3395, + + 86, 86, 86, 3402, 3398, 3404, 86, 3405, 86, 86, + 3407, 86, 86, 3406, 3403, 86, 3401, 3408, 3410, 86, + 3670, 3409, 3412, 86, 3413, 3414, 86, 86, 3415, 3416, + 3411, 86, 3417, 86, 3418, 3419, 86, 86, 86, 86, + 3420, 3423, 86, 3421, 3424, 86, 86, 3426, 3422, 86, + 86, 86, 3430, 86, 86, 86, 3429, 86, 86, 3425, + 86, 86, 3434, 86, 3433, 3670, 86, 3439, 86, 3427, + 3428, 3438, 3435, 86, 3431, 3436, 86, 3441, 86, 3437, + 3432, 86, 3440, 3442, 86, 3443, 86, 86, 86, 3448, + 3450, 86, 3445, 3444, 3449, 86, 86, 3446, 86, 86, + + 3447, 86, 86, 3670, 3454, 3458, 3451, 3455, 3457, 86, + 86, 86, 3453, 3452, 3460, 86, 3459, 3461, 86, 86, + 3456, 86, 3464, 86, 3465, 86, 3463, 86, 86, 3468, + 86, 3469, 86, 86, 3462, 3670, 3466, 3470, 86, 3471, + 86, 3472, 86, 3473, 86, 86, 3467, 3474, 86, 3475, + 86, 3478, 86, 86, 3477, 3479, 86, 86, 86, 3476, + 3483, 86, 3480, 86, 3485, 86, 86, 86, 86, 3481, + 86, 86, 86, 3489, 3490, 86, 3492, 86, 3482, 86, + 3487, 3486, 3484, 3488, 86, 3491, 3493, 3494, 86, 3496, + 86, 86, 3499, 86, 3498, 86, 86, 86, 86, 86, + + 3501, 86, 86, 86, 86, 3495, 3507, 3500, 3497, 3505, + 3506, 86, 86, 3504, 86, 3502, 86, 3503, 86, 3508, + 86, 3511, 86, 3512, 3514, 86, 86, 3513, 3515, 86, + 3516, 86, 3510, 86, 86, 3518, 86, 3509, 3519, 86, + 86, 3517, 3520, 86, 86, 3524, 86, 3521, 86, 3527, + 3523, 86, 86, 86, 86, 86, 86, 3528, 3526, 3522, + 86, 3536, 86, 3534, 86, 3529, 86, 86, 3531, 3530, + 3533, 3538, 3535, 3540, 86, 86, 86, 86, 3532, 86, + 3542, 3545, 86, 3537, 3541, 86, 3539, 86, 3546, 86, + 3543, 3547, 86, 86, 3548, 3549, 86, 3544, 3550, 86, + + 86, 86, 86, 3553, 3551, 86, 3554, 3552, 86, 3558, + 3555, 86, 86, 86, 3556, 86, 86, 3557, 3561, 3562, + 86, 86, 3559, 3560, 3564, 86, 3565, 86, 3566, 86, + 86, 3567, 3563, 3569, 86, 86, 3572, 86, 86, 3573, + 3568, 86, 86, 86, 3576, 3570, 3577, 86, 86, 3574, + 86, 86, 86, 3571, 3582, 86, 3581, 3578, 3583, 86, + 3579, 3575, 86, 86, 86, 86, 86, 3580, 86, 3587, + 86, 86, 86, 3589, 86, 86, 86, 3586, 3596, 86, + 3594, 3595, 86, 3584, 3585, 3591, 3588, 3592, 86, 3590, + 3593, 86, 3600, 86, 86, 3602, 86, 3603, 86, 3601, + + 86, 86, 3597, 3604, 86, 3605, 3598, 86, 3608, 3606, + 3599, 3609, 86, 86, 86, 3611, 86, 86, 3610, 86, + 86, 3612, 86, 86, 3617, 86, 3607, 3614, 86, 3620, + 86, 86, 86, 3621, 86, 86, 86, 86, 3613, 86, + 3622, 3615, 3616, 3623, 3618, 3619, 86, 86, 3628, 86, + 3627, 3624, 86, 86, 3625, 3626, 86, 3629, 86, 3632, + 86, 3634, 3630, 86, 3635, 3631, 86, 86, 3639, 86, + 3670, 3636, 3633, 86, 3637, 3638, 86, 86, 3640, 3641, + 3642, 86, 86, 3643, 86, 86, 86, 3648, 86, 3644, + 3646, 86, 86, 86, 86, 86, 86, 3650, 3651, 86, + + 3654, 3655, 86, 3645, 86, 3647, 86, 3658, 3659, 86, + 3649, 86, 86, 3652, 3653, 3656, 3661, 86, 3660, 3662, + 86, 86, 86, 3657, 86, 86, 3670, 3664, 3663, 3665, + 3670, 3666, 3668, 86, 3669, 86, 3670, 3670, 3670, 3670, + 3670, 3670, 3670, 3670, 3667, 47, 47, 47, 47, 47, + 47, 47, 52, 52, 52, 52, 52, 52, 52, 57, + 57, 57, 57, 57, 57, 57, 63, 63, 63, 63, + 63, 63, 63, 68, 68, 68, 68, 68, 68, 68, + 74, 74, 74, 74, 74, 74, 74, 80, 80, 80, + 80, 80, 80, 80, 89, 89, 3670, 89, 89, 89, + + 89, 161, 161, 3670, 3670, 3670, 161, 161, 163, 163, + 3670, 3670, 163, 3670, 163, 165, 3670, 3670, 3670, 3670, + 3670, 165, 168, 168, 3670, 3670, 3670, 168, 168, 170, + 3670, 3670, 3670, 3670, 3670, 170, 172, 172, 3670, 172, + 172, 172, 172, 175, 3670, 3670, 3670, 3670, 3670, 175, + 178, 178, 3670, 3670, 3670, 178, 178, 90, 90, 3670, + 90, 90, 90, 90, 17, 3670, 3670, 3670, 3670, 3670, + 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, + 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, + 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, + + 3670, 3670, 3670, 3670, 3670 } ; -static const flex_int16_t yy_chk[7162] = +static const flex_int16_t yy_chk[7206] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -2425,13 +2435,13 @@ static const flex_int16_t yy_chk[7162] = 5, 3, 6, 24, 4, 24, 24, 5, 24, 6, 7, 7, 7, 7, 24, 7, 8, 8, 8, 8, 33, 8, 7, 9, 9, 9, 26, 26, 8, 10, - 10, 10, 19, 29, 9, 33, 19, 29, 3660, 35, + 10, 10, 19, 29, 9, 33, 19, 29, 3678, 35, 10, 11, 11, 11, 11, 11, 11, 13, 13, 13, 13, 34, 13, 11, 35, 100, 34, 29, 38, 13, 51, 51, 11, 12, 12, 12, 12, 12, 12, 14, 14, 14, 14, 100, 14, 12, 15, 15, 15, 38, - 23, 14, 23, 23, 12, 23, 2972, 15, 16, 16, + 23, 14, 23, 23, 12, 23, 2987, 15, 16, 16, 16, 23, 23, 27, 27, 30, 30, 31, 31, 16, 25, 27, 127, 25, 25, 27, 31, 25, 27, 32, 30, 46, 25, 32, 25, 127, 32, 31, 40, 45, @@ -2448,7 +2458,7 @@ static const flex_int16_t yy_chk[7162] = 86, 86, 87, 86, 97, 89, 87, 89, 89, 86, 89, 92, 102, 94, 92, 93, 89, 89, 98, 93, 94, 98, 99, 101, 97, 99, 102, 102, 103, 104, - 105, 106, 101, 1161, 103, 107, 110, 108, 99, 109, + 105, 106, 101, 1167, 103, 107, 110, 108, 99, 109, 103, 107, 103, 113, 109, 114, 111, 104, 104, 114, 106, 108, 105, 109, 107, 115, 110, 111, 111, 116, @@ -2458,753 +2468,758 @@ static const flex_int16_t yy_chk[7162] = 131, 128, 137, 122, 124, 132, 121, 123, 129, 132, 133, 130, 123, 134, 135, 139, 136, 134, 138, 138, 131, 136, 137, 140, 141, 136, 142, 140, 133, 143, - 145, 144, 135, 149, 144, 139, 140, 151, 146, 141, - 149, 147, 140, 145, 146, 144, 148, 148, 143, 144, - - 150, 149, 142, 147, 153, 212, 151, 154, 156, 154, - 155, 157, 160, 156, 148, 158, 150, 148, 154, 159, - 153, 212, 155, 157, 159, 182, 160, 162, 162, 164, - 154, 178, 164, 158, 166, 174, 166, 166, 174, 166, - 169, 169, 171, 182, 171, 171, 172, 171, 172, 172, - 176, 172, 176, 176, 180, 176, 179, 179, 172, 180, - 181, 183, 184, 185, 188, 189, 181, 190, 186, 191, - 192, 185, 190, 193, 195, 181, 183, 246, 185, 186, - 189, 192, 193, 188, 194, 184, 246, 196, 204, 191, - 194, 194, 196, 197, 197, 198, 201, 201, 199, 195, - - 199, 198, 200, 199, 203, 202, 200, 204, 205, 203, - 203, 200, 207, 205, 206, 208, 200, 202, 213, 206, - 199, 209, 200, 200, 207, 210, 211, 209, 214, 210, - 215, 211, 213, 216, 217, 208, 218, 221, 223, 217, - 222, 218, 215, 214, 223, 215, 224, 224, 219, 219, - 209, 216, 219, 220, 219, 225, 222, 221, 220, 226, - 227, 225, 230, 228, 229, 226, 219, 225, 219, 228, - 229, 231, 234, 232, 240, 233, 234, 231, 232, 229, - 227, 233, 235, 230, 236, 238, 236, 237, 235, 239, - 241, 236, 242, 237, 240, 239, 241, 244, 238, 243, - - 247, 245, 248, 249, 251, 242, 245, 243, 252, 251, - 244, 250, 254, 255, 242, 247, 250, 250, 248, 255, - 253, 256, 257, 249, 253, 258, 252, 259, 257, 260, - 261, 260, 259, 265, 254, 262, 267, 263, 264, 256, - 256, 266, 262, 263, 264, 258, 268, 266, 267, 261, - 269, 269, 265, 270, 270, 271, 272, 273, 274, 273, - 268, 271, 272, 275, 277, 276, 278, 279, 275, 281, - 280, 298, 298, 282, 278, 280, 273, 276, 282, 271, - 283, 274, 284, 277, 285, 286, 283, 279, 284, 285, - 286, 287, 281, 288, 290, 289, 291, 287, 293, 292, - - 294, 295, 297, 300, 297, 291, 293, 295, 288, 289, - 303, 296, 290, 292, 296, 299, 301, 301, 299, 302, - 302, 300, 304, 309, 305, 294, 303, 305, 306, 307, - 308, 312, 306, 326, 311, 313, 326, 304, 307, 308, - 311, 313, 309, 315, 314, 312, 314, 316, 319, 315, - 318, 316, 317, 317, 319, 318, 320, 321, 322, 323, - 324, 327, 320, 325, 325, 328, 329, 177, 316, 328, - 330, 331, 331, 324, 332, 333, 322, 321, 333, 327, - 323, 320, 334, 335, 336, 329, 337, 336, 330, 335, - 343, 339, 332, 343, 334, 333, 340, 341, 337, 338, - - 339, 345, 341, 346, 342, 346, 346, 342, 338, 342, - 344, 338, 175, 345, 340, 347, 338, 338, 338, 338, - 347, 347, 342, 344, 348, 342, 350, 348, 349, 349, - 351, 353, 352, 354, 357, 355, 356, 356, 360, 357, - 358, 358, 354, 350, 355, 351, 350, 352, 353, 353, - 359, 359, 361, 360, 362, 363, 364, 361, 365, 366, - 367, 367, 369, 367, 370, 366, 362, 378, 378, 370, - 372, 371, 367, 365, 363, 372, 364, 371, 373, 367, - 375, 374, 369, 373, 374, 376, 374, 377, 376, 373, - 381, 379, 380, 380, 375, 381, 377, 379, 384, 386, - - 385, 376, 387, 385, 376, 388, 376, 382, 382, 391, - 382, 393, 390, 394, 386, 390, 382, 387, 384, 388, - 382, 385, 394, 391, 398, 382, 393, 399, 382, 383, - 383, 390, 383, 395, 396, 400, 397, 404, 395, 395, - 396, 401, 399, 398, 400, 383, 451, 396, 383, 451, - 383, 405, 383, 392, 409, 392, 392, 397, 402, 403, - 401, 406, 410, 404, 402, 392, 392, 392, 392, 392, - 407, 405, 392, 408, 409, 406, 407, 403, 408, 411, - 407, 412, 410, 413, 414, 415, 412, 417, 413, 416, - 416, 415, 418, 421, 411, 419, 408, 420, 422, 414, - - 423, 425, 428, 420, 418, 423, 426, 417, 427, 419, - 424, 424, 436, 424, 422, 429, 428, 429, 421, 432, - 430, 425, 426, 432, 427, 430, 431, 436, 431, 431, - 433, 434, 434, 435, 433, 437, 438, 442, 445, 439, - 444, 443, 445, 442, 448, 444, 431, 440, 446, 433, - 443, 437, 435, 439, 438, 440, 440, 446, 447, 450, - 449, 453, 170, 450, 447, 448, 449, 440, 452, 440, - 441, 454, 454, 452, 457, 441, 455, 456, 456, 457, - 458, 453, 462, 441, 441, 459, 459, 441, 441, 455, - 460, 441, 463, 458, 461, 464, 460, 462, 461, 465, - - 464, 466, 466, 467, 465, 468, 469, 470, 471, 472, - 466, 471, 473, 463, 472, 467, 473, 474, 476, 470, - 475, 475, 477, 476, 469, 468, 478, 478, 479, 474, - 481, 481, 483, 484, 485, 486, 487, 488, 489, 490, - 494, 484, 488, 477, 486, 492, 493, 495, 496, 502, - 479, 490, 502, 483, 496, 485, 498, 487, 489, 497, - 494, 495, 498, 492, 493, 492, 499, 500, 497, 501, - 503, 499, 504, 505, 507, 508, 510, 501, 508, 506, - 501, 500, 505, 509, 503, 506, 511, 504, 512, 509, - 510, 511, 513, 514, 507, 515, 516, 514, 517, 518, - - 515, 519, 524, 517, 520, 523, 168, 509, 526, 525, - 512, 516, 526, 513, 527, 518, 529, 520, 542, 542, - 519, 521, 521, 524, 525, 523, 528, 521, 532, 521, - 530, 528, 529, 527, 530, 521, 534, 521, 538, 531, - 521, 521, 535, 532, 531, 533, 537, 521, 531, 540, - 533, 535, 534, 536, 538, 534, 541, 539, 543, 536, - 539, 537, 544, 544, 536, 545, 546, 547, 548, 548, - 533, 549, 540, 550, 551, 552, 541, 553, 546, 551, - 545, 555, 547, 543, 552, 554, 560, 555, 557, 558, - 549, 561, 560, 558, 559, 550, 553, 557, 559, 562, - - 554, 563, 564, 561, 565, 567, 566, 568, 571, 569, - 565, 568, 167, 570, 562, 570, 564, 572, 573, 573, - 563, 566, 569, 567, 574, 572, 575, 576, 577, 578, - 574, 580, 571, 576, 577, 581, 579, 582, 575, 579, - 583, 578, 582, 583, 584, 580, 585, 165, 587, 586, - 581, 588, 588, 584, 586, 586, 589, 589, 590, 596, - 584, 587, 585, 584, 590, 591, 591, 592, 592, 593, - 595, 594, 597, 600, 599, 593, 594, 594, 598, 599, - 596, 598, 601, 602, 597, 604, 602, 605, 595, 603, - 601, 606, 600, 607, 603, 606, 608, 609, 611, 607, - - 610, 609, 614, 611, 615, 612, 605, 616, 604, 613, - 613, 617, 616, 618, 619, 620, 608, 614, 610, 612, - 624, 620, 621, 622, 626, 615, 163, 621, 623, 618, - 617, 623, 625, 625, 619, 627, 623, 622, 624, 623, - 623, 628, 626, 629, 630, 631, 628, 633, 629, 635, - 634, 627, 635, 633, 640, 641, 161, 636, 630, 634, - 631, 636, 637, 638, 639, 642, 638, 637, 643, 639, - 640, 644, 642, 641, 645, 647, 644, 646, 646, 648, - 649, 643, 651, 636, 647, 652, 650, 653, 689, 654, - 689, 651, 659, 653, 645, 654, 655, 652, 648, 655, - - 660, 649, 650, 656, 656, 657, 656, 658, 657, 661, - 659, 662, 658, 663, 660, 664, 662, 665, 666, 668, - 671, 664, 665, 661, 666, 667, 669, 672, 667, 670, - 675, 669, 663, 671, 670, 670, 673, 674, 676, 678, - 672, 673, 683, 674, 668, 677, 680, 676, 683, 675, - 677, 679, 679, 680, 681, 673, 673, 682, 684, 678, - 682, 681, 685, 686, 687, 687, 688, 685, 686, 686, - 684, 690, 691, 695, 691, 682, 692, 685, 693, 694, - 696, 697, 698, 700, 699, 703, 698, 697, 701, 702, - 690, 688, 695, 699, 692, 705, 693, 694, 700, 704, - - 696, 707, 704, 701, 703, 708, 706, 702, 709, 710, - 705, 704, 706, 711, 712, 715, 721, 714, 713, 708, - 709, 707, 713, 716, 717, 718, 719, 720, 710, 725, - 721, 715, 720, 712, 711, 714, 722, 722, 724, 727, - 726, 716, 717, 717, 718, 719, 723, 729, 725, 728, - 723, 726, 724, 727, 728, 730, 731, 732, 735, 734, - 733, 738, 736, 729, 732, 733, 734, 736, 737, 731, - 739, 740, 741, 737, 730, 742, 743, 739, 745, 738, - 740, 744, 735, 745, 742, 748, 741, 744, 743, 746, - 747, 749, 746, 750, 747, 751, 752, 753, 751, 748, - - 749, 754, 754, 755, 755, 756, 756, 758, 750, 757, - 752, 760, 755, 761, 757, 762, 758, 763, 753, 761, - 764, 765, 766, 767, 764, 768, 771, 769, 772, 770, - 760, 768, 773, 765, 762, 769, 770, 763, 822, 782, - 776, 767, 785, 779, 771, 783, 788, 766, 782, 787, - 822, 783, 773, 772, 774, 776, 774, 792, 787, 774, - 779, 786, 788, 774, 785, 789, 774, 786, 792, 789, - 790, 790, 793, 774, 774, 794, 774, 791, 791, 795, - 796, 802, 799, 798, 800, 802, 796, 799, 801, 794, - 793, 803, 806, 804, 821, 808, 821, 804, 809, 795, - - 797, 797, 797, 798, 797, 800, 801, 797, 85, 805, - 808, 806, 797, 804, 805, 803, 807, 810, 797, 797, - 810, 807, 811, 809, 812, 813, 813, 811, 811, 814, - 815, 812, 816, 816, 817, 815, 819, 818, 823, 817, - 818, 819, 820, 820, 814, 824, 825, 827, 826, 824, - 828, 828, 833, 829, 832, 827, 830, 823, 831, 831, - 834, 837, 837, 835, 833, 842, 825, 826, 829, 835, - 830, 836, 832, 838, 80, 840, 836, 841, 838, 838, - 840, 843, 834, 841, 842, 844, 845, 843, 846, 847, - 844, 846, 845, 848, 851, 847, 849, 849, 850, 850, - - 852, 848, 851, 853, 855, 854, 856, 857, 853, 854, - 858, 855, 859, 859, 861, 863, 860, 864, 852, 862, - 862, 863, 861, 857, 856, 860, 866, 868, 867, 858, - 870, 871, 873, 869, 871, 866, 864, 867, 869, 870, - 872, 874, 876, 875, 877, 872, 873, 878, 880, 877, - 877, 868, 875, 879, 879, 876, 881, 883, 882, 884, - 892, 878, 885, 880, 889, 885, 874, 882, 887, 890, - 887, 888, 888, 885, 890, 881, 891, 884, 893, 894, - 892, 883, 895, 896, 897, 889, 898, 899, 901, 900, - 898, 902, 896, 904, 901, 905, 906, 891, 893, 903, - - 902, 894, 895, 909, 912, 899, 907, 897, 900, 904, - 906, 903, 907, 908, 905, 910, 913, 909, 911, 911, - 910, 908, 914, 912, 915, 916, 917, 918, 919, 922, - 920, 914, 921, 916, 923, 922, 913, 924, 927, 925, - 923, 926, 928, 931, 915, 925, 917, 919, 928, 918, - 920, 924, 921, 929, 932, 926, 930, 934, 927, 929, - 930, 936, 931, 933, 935, 935, 932, 936, 933, 937, - 938, 939, 940, 938, 932, 937, 941, 942, 934, 943, - 943, 944, 941, 945, 946, 940, 947, 946, 945, 939, - 948, 947, 947, 951, 949, 950, 950, 942, 949, 944, - - 946, 952, 946, 953, 954, 948, 955, 957, 958, 954, - 960, 964, 961, 962, 967, 951, 964, 969, 953, 965, - 965, 952, 958, 960, 966, 955, 968, 968, 966, 967, - 971, 957, 961, 970, 962, 963, 972, 970, 963, 974, - 963, 75, 969, 973, 963, 971, 963, 981, 973, 975, - 972, 963, 976, 974, 975, 975, 963, 977, 978, 981, - 979, 976, 978, 980, 982, 983, 984, 985, 980, 982, - 988, 977, 987, 986, 978, 979, 988, 987, 980, 983, - 989, 985, 986, 990, 991, 989, 995, 984, 993, 990, - 991, 992, 992, 993, 994, 996, 1000, 997, 999, 1001, - - 994, 1000, 1003, 1003, 1004, 1006, 1002, 1010, 995, 1004, - 999, 1005, 1007, 1001, 996, 997, 998, 998, 1002, 1005, - 1008, 1006, 998, 1010, 998, 1009, 1007, 1011, 1013, 1012, - 998, 1014, 1015, 1011, 1012, 998, 998, 1016, 1017, 1008, - 1013, 1020, 998, 1019, 1009, 1018, 1018, 1019, 1015, 1014, - 1023, 1022, 1024, 1023, 1025, 1016, 1017, 1022, 1027, 1025, - 1026, 1020, 1028, 1029, 1027, 1031, 1032, 1028, 1033, 1035, - 1034, 1024, 1036, 1026, 1031, 1032, 1034, 1038, 1035, 1039, - 1037, 1040, 1029, 1041, 1033, 1037, 1044, 1042, 1045, 1043, - 1048, 1036, 1044, 1039, 1046, 1041, 1042, 1038, 1043, 1050, - - 1046, 1040, 1051, 1052, 1053, 1045, 1048, 1054, 1052, 1055, - 1056, 1057, 1058, 1050, 1061, 1062, 1057, 1058, 1067, 1061, - 1064, 1054, 1051, 1053, 1062, 1056, 1064, 1055, 1063, 1063, - 1065, 1066, 1068, 1067, 1070, 1074, 1065, 1071, 1074, 1075, - 1066, 1076, 1071, 1071, 1077, 1068, 1078, 1073, 1073, 1079, - 1070, 1073, 1080, 1075, 1082, 1084, 1090, 1081, 1086, 1083, - 1077, 1076, 1079, 1081, 1078, 1083, 1085, 1080, 1088, 1088, - 1084, 1085, 1086, 1089, 1082, 1091, 1089, 1090, 1092, 1093, - 1091, 1094, 1095, 1092, 1096, 1097, 1099, 1095, 1100, 1096, - 1094, 1105, 1099, 1101, 1102, 1093, 1104, 1097, 1108, 1101, - - 1102, 1103, 1103, 1106, 1100, 1104, 1106, 1107, 1107, 1105, - 1109, 1110, 1111, 1112, 1113, 1111, 1108, 1114, 1115, 74, - 1113, 1124, 1116, 1114, 1115, 1117, 1112, 1116, 1118, 1109, - 1117, 1110, 1119, 1120, 1118, 1122, 1123, 1119, 1125, 1120, - 1122, 1124, 1126, 1128, 1125, 1127, 1127, 1126, 1129, 1131, - 1130, 1132, 1128, 1133, 1123, 1130, 1133, 1129, 1134, 1136, - 1135, 1134, 1137, 1138, 1136, 1139, 1140, 1131, 1141, 1146, - 1132, 1135, 1140, 1142, 1141, 1138, 1143, 1144, 1144, 1145, - 1137, 1143, 1147, 1146, 1139, 1148, 1149, 1150, 1142, 1152, - 1149, 1151, 1153, 1155, 1147, 1156, 1156, 1158, 1145, 1157, - - 1151, 1159, 1158, 1148, 1160, 1150, 1159, 1157, 1152, 1162, - 1163, 1165, 1155, 1166, 1164, 1167, 1165, 1153, 1168, 1168, - 1169, 1170, 1166, 1162, 1160, 1163, 1164, 1170, 1171, 1172, - 1167, 1173, 1175, 1174, 1171, 1174, 1173, 1175, 1176, 1177, - 1169, 1178, 1179, 1180, 1181, 1172, 1178, 1181, 1182, 1183, - 1184, 1187, 1176, 1177, 1188, 1182, 1189, 1179, 1186, 1186, - 1190, 1191, 1180, 1192, 1183, 1187, 1190, 68, 1192, 1184, - 1194, 1189, 1188, 1196, 1194, 1195, 1195, 1192, 1196, 1192, - 1198, 1191, 1192, 1197, 1197, 1199, 1200, 1198, 1201, 1200, - 1202, 1203, 1204, 1205, 1206, 1207, 1209, 1204, 1208, 1199, - - 1203, 1207, 1210, 1208, 1211, 1216, 1206, 1201, 1202, 1219, - 1209, 1214, 1205, 1210, 1213, 1213, 1214, 1215, 1219, 1217, - 1220, 1221, 1215, 1211, 1217, 1216, 1218, 1222, 1223, 1224, - 1218, 1223, 1225, 1226, 1227, 1220, 1221, 1228, 1229, 1225, - 1223, 1230, 1231, 1232, 1224, 1226, 1222, 1230, 1233, 1232, - 1234, 1235, 1236, 1227, 1237, 1239, 1229, 1231, 1228, 1238, - 1235, 1240, 1241, 1242, 1243, 1246, 1245, 1236, 1233, 1242, - 1234, 1238, 1245, 1237, 1239, 1247, 1249, 1241, 1250, 1248, - 1246, 1252, 1254, 1251, 1243, 1253, 1240, 1248, 1251, 1247, - 1253, 1253, 1255, 1252, 1250, 1256, 1249, 1257, 1257, 1259, - - 1263, 1254, 1260, 1262, 1262, 1263, 1255, 1261, 1256, 1258, - 1258, 1260, 1259, 1261, 1258, 1264, 1266, 1258, 1258, 1265, - 1269, 1266, 1258, 1272, 1264, 1265, 1267, 1273, 1258, 1268, - 1268, 1267, 1258, 1270, 1270, 1271, 1274, 1275, 1271, 1276, - 1271, 1269, 1274, 1272, 1277, 1273, 1275, 1278, 1279, 1277, - 1280, 1281, 1284, 1282, 1285, 1287, 1280, 1281, 1282, 1276, - 1283, 1278, 1286, 1285, 1283, 1284, 1279, 1286, 1285, 1287, - 1285, 1290, 1285, 1293, 1285, 1288, 1288, 1289, 1289, 1292, - 1289, 1294, 1290, 1292, 1295, 1296, 1297, 1298, 1293, 1299, - 1296, 1296, 1300, 1295, 1299, 1297, 1301, 1302, 1303, 1294, - - 1304, 1305, 1306, 1306, 1308, 1301, 1300, 1305, 1307, 1298, - 1309, 1311, 1308, 1310, 1304, 1313, 1302, 1303, 1310, 1312, - 1307, 1314, 1313, 1315, 1309, 1311, 1316, 1318, 1312, 1317, - 1317, 1316, 1319, 1319, 1320, 1322, 1320, 1324, 1322, 1314, - 1323, 1325, 1318, 1326, 1326, 1323, 1327, 1331, 1315, 1332, - 1325, 1328, 1328, 1329, 1329, 1330, 1324, 1333, 1334, 1334, - 1330, 1335, 1336, 1338, 1337, 1339, 1327, 1337, 1331, 1340, - 1332, 1339, 1343, 1341, 1340, 1342, 1346, 1342, 1333, 1336, - 1347, 1335, 1341, 1338, 1345, 1349, 63, 1345, 1351, 1348, - 1343, 1346, 1350, 1347, 1348, 1352, 1351, 1350, 1353, 1349, - - 1352, 1353, 1354, 1355, 1355, 1356, 1357, 1354, 1358, 1359, - 1356, 1362, 1360, 1363, 1358, 1364, 1359, 1362, 1365, 1363, - 1364, 1366, 1367, 1365, 1357, 1360, 1368, 1366, 1369, 1370, - 1370, 1367, 1371, 1373, 1375, 1374, 1376, 1377, 1373, 1369, - 1378, 1379, 1380, 1381, 1375, 1368, 1386, 1379, 1380, 1381, - 1382, 1376, 1371, 1374, 1384, 1385, 1387, 1377, 1388, 1389, - 1384, 1382, 1390, 1378, 1391, 1391, 1386, 1392, 1393, 1385, - 1388, 1394, 1395, 1389, 1396, 1385, 1387, 1395, 1397, 1397, - 1390, 1398, 1401, 1399, 1403, 1402, 1404, 1392, 1399, 1394, - 1402, 1402, 1396, 1393, 1406, 1404, 1407, 1405, 1408, 1415, - - 1410, 1401, 1403, 1415, 1398, 1405, 1412, 1409, 1406, 1410, - 1416, 1407, 1409, 1408, 1418, 1409, 1408, 1411, 1414, 1411, - 1412, 1416, 1417, 1419, 1414, 1420, 1421, 1417, 1417, 1422, - 1423, 1421, 1424, 1418, 1422, 1423, 1425, 1426, 1427, 1429, - 58, 1430, 1426, 1420, 1431, 1432, 1432, 1433, 1434, 1419, - 1424, 1433, 1435, 1429, 1436, 1437, 1425, 1438, 1427, 1430, - 1436, 1439, 1431, 1440, 1441, 1443, 1434, 1437, 1442, 1444, - 1447, 1435, 1448, 1438, 1444, 1445, 1446, 1440, 1449, 1441, - 1439, 1446, 1445, 1442, 1443, 1450, 1450, 1449, 1447, 1451, - 1452, 1453, 1455, 1448, 1454, 1454, 1456, 1460, 1455, 1452, - - 1457, 1461, 1456, 1460, 1451, 1458, 1458, 1459, 1459, 1462, - 1463, 1453, 1464, 1465, 1457, 1463, 1466, 1461, 1464, 1465, - 1467, 1467, 1466, 1468, 1468, 1470, 1470, 1471, 1472, 1473, - 1462, 1471, 1474, 1477, 1475, 1476, 1479, 1472, 1478, 1478, - 1477, 1480, 1483, 1468, 1474, 1468, 1481, 1473, 1475, 1480, - 1476, 1481, 1482, 1484, 1486, 1494, 1479, 1485, 1484, 1484, - 1488, 1483, 1485, 1485, 1487, 1487, 1482, 1489, 1490, 1492, - 1491, 1493, 1495, 1494, 1486, 1491, 1496, 1490, 1495, 1488, - 1497, 1496, 1498, 1499, 1500, 1503, 1489, 1501, 1492, 1499, - 1502, 1493, 1504, 1501, 1505, 1506, 1502, 1507, 1508, 1509, - - 1497, 57, 1510, 1500, 1503, 1511, 1511, 1512, 1498, 1513, - 1512, 1504, 1508, 1505, 1506, 1514, 1507, 1510, 1515, 1520, - 1509, 1516, 1516, 1517, 1517, 1519, 1518, 1521, 1513, 1519, - 1515, 1518, 1520, 1522, 1514, 1523, 1521, 1523, 1525, 1526, - 1527, 1523, 1528, 1529, 1526, 1531, 1522, 1530, 1530, 1533, - 1531, 1532, 1534, 1536, 1523, 1527, 1525, 1532, 1536, 1529, - 1535, 1539, 1528, 1537, 1533, 1534, 1535, 1537, 1538, 1540, - 1541, 1542, 1538, 1548, 1543, 1544, 1544, 1546, 1549, 1541, - 1543, 1539, 1551, 1549, 1550, 1550, 1552, 1540, 1551, 1554, - 1554, 1542, 1558, 1556, 1548, 1546, 1556, 1557, 1557, 1559, - - 1560, 1562, 1563, 1565, 1562, 1564, 1552, 1566, 1558, 1567, - 1567, 1568, 1565, 1569, 1570, 1559, 1560, 1571, 1572, 1574, - 1574, 1576, 1571, 1563, 1573, 1564, 1568, 1566, 1575, 1577, - 1573, 1578, 1572, 1570, 1569, 1579, 1581, 1575, 1583, 1576, - 1580, 1580, 1582, 1583, 1577, 1586, 1584, 1585, 1585, 1586, - 1581, 1587, 1588, 1588, 1589, 1579, 1578, 1591, 1590, 1592, - 1582, 1584, 1593, 1592, 1594, 1596, 1596, 1597, 1591, 1594, - 1597, 1587, 1598, 1599, 1600, 1601, 1589, 1590, 1599, 1603, - 1602, 1593, 1604, 1605, 1608, 1598, 1606, 1607, 1607, 1608, - 1600, 1609, 1610, 1601, 1602, 1606, 1604, 1612, 1603, 1603, - - 1611, 1611, 1613, 1614, 1616, 1618, 1612, 1613, 1605, 1616, - 1617, 1609, 1610, 1615, 1619, 1615, 1617, 1620, 1622, 1624, - 1619, 1628, 1620, 1614, 1625, 1618, 1623, 1623, 1627, 1631, - 1625, 1632, 1622, 1627, 1629, 1629, 1630, 1630, 1624, 1633, - 1636, 1634, 1638, 1631, 1634, 1628, 1635, 1635, 1637, 1632, - 1639, 1640, 1642, 1639, 1633, 1642, 1639, 1640, 1636, 1641, - 1637, 1644, 1638, 1646, 1641, 1649, 1647, 1645, 1639, 1647, - 1644, 1642, 1645, 1648, 1648, 1650, 1651, 1659, 1652, 1653, - 1653, 1650, 1651, 1652, 1654, 1654, 1655, 1657, 1646, 1649, - 1656, 1658, 1655, 1660, 1661, 1656, 1659, 1661, 1662, 1663, - - 1657, 1664, 1667, 1665, 1662, 1663, 1666, 1664, 1665, 1658, - 1668, 1671, 1666, 1660, 1670, 1668, 1669, 1669, 1672, 1670, - 1673, 1674, 1675, 1676, 1678, 1667, 1677, 1679, 1680, 1671, - 1682, 1681, 1680, 1681, 1685, 1686, 1675, 1676, 1672, 1673, - 1677, 1674, 1678, 1683, 1687, 1688, 1685, 1686, 1689, 1682, - 1683, 1688, 1679, 1690, 1691, 1693, 1692, 1687, 1693, 1694, - 1694, 1698, 1695, 1697, 1697, 1700, 1703, 1699, 1689, 1690, - 1692, 1695, 1699, 1702, 1691, 1704, 1693, 1700, 1701, 1701, - 1703, 1698, 1705, 1706, 1708, 1709, 1707, 1710, 1702, 1712, - 1714, 1708, 1706, 1715, 1709, 1719, 1715, 1709, 1718, 1704, - - 1705, 1707, 1723, 1710, 1712, 1716, 1716, 1717, 1717, 1712, - 1718, 1720, 1722, 1719, 1720, 1714, 1721, 1721, 1724, 1725, - 1727, 1723, 1725, 1724, 1726, 1722, 1728, 1729, 1730, 1726, - 1735, 1731, 1732, 1734, 1734, 1736, 1729, 1735, 1733, 1727, - 1731, 1732, 1728, 1731, 1733, 1737, 1738, 1730, 1739, 1740, - 1746, 1741, 1747, 1749, 1742, 1736, 1741, 1741, 1737, 1742, - 1743, 1756, 1739, 52, 1738, 1740, 1748, 1748, 1750, 1749, - 1747, 1755, 1743, 1751, 1751, 1746, 1753, 1750, 1751, 1752, - 1752, 1754, 1756, 1757, 1760, 1753, 1754, 1758, 1753, 1755, - 1761, 1762, 1758, 1758, 1752, 1763, 1764, 1765, 1760, 1766, - - 1763, 1757, 1768, 1765, 1769, 1761, 1767, 1767, 1768, 1769, - 1764, 1770, 1771, 1762, 1772, 1774, 1775, 1766, 1771, 1777, - 1772, 1776, 1783, 1779, 1784, 1770, 1781, 1776, 1778, 1779, - 1775, 1778, 1777, 1785, 1781, 1774, 1786, 1778, 1788, 1790, - 1787, 1783, 1789, 1784, 1786, 1787, 1791, 1788, 1790, 1792, - 1793, 1795, 1785, 1794, 1794, 1789, 1796, 1795, 1797, 1791, - 1798, 1797, 1796, 1792, 1793, 1799, 1799, 1800, 1801, 1802, - 1803, 1803, 1804, 1798, 1805, 1794, 1806, 1807, 1808, 1811, - 1805, 1810, 1810, 1814, 1813, 1804, 1801, 1800, 1802, 1813, - 1812, 1818, 1815, 1807, 1812, 1816, 1808, 1815, 1806, 1811, - - 1816, 1817, 1820, 1814, 1822, 1823, 1821, 1822, 1824, 1826, - 1817, 1825, 1825, 1820, 1818, 1821, 1828, 1823, 1827, 1829, - 1829, 1830, 1831, 1824, 1832, 1833, 1830, 1834, 1826, 1836, - 1827, 1832, 1837, 1839, 1838, 1828, 1831, 1833, 1840, 1834, - 1838, 1841, 1842, 1842, 1844, 1839, 1843, 1841, 1836, 1843, - 1845, 1845, 1837, 1847, 1848, 1849, 1840, 1851, 1847, 1850, - 1850, 1849, 1854, 1848, 1844, 1852, 1855, 1852, 1853, 1851, - 1858, 1853, 1856, 1857, 1859, 1858, 1860, 1861, 1862, 1859, - 1865, 1863, 1854, 1864, 47, 1860, 1863, 1868, 1855, 1861, - 1856, 1857, 1864, 1862, 1866, 1871, 1867, 1869, 1869, 1866, - - 1865, 1867, 1868, 1870, 1873, 1864, 1866, 1874, 1875, 1870, - 1877, 1878, 1876, 1878, 1883, 1879, 1871, 1880, 1880, 1886, - 1873, 1881, 1881, 1882, 1882, 1887, 1874, 1875, 1876, 1879, - 1877, 1879, 1884, 1884, 1883, 1885, 1885, 1888, 1889, 1889, - 1886, 1890, 1891, 1894, 1892, 1890, 1887, 1892, 1891, 1894, - 1895, 1896, 1898, 1899, 1897, 1901, 1899, 1896, 1888, 1897, - 1900, 1900, 1902, 1903, 1903, 1904, 1905, 1902, 1895, 1906, - 1912, 1907, 1908, 1908, 1906, 1901, 1907, 1898, 1909, 1910, - 1904, 1911, 1915, 1909, 1913, 1910, 1914, 1905, 1915, 1916, - 1912, 1917, 1918, 1911, 1911, 1911, 1919, 1923, 1921, 1918, - - 1911, 1919, 1913, 1921, 1921, 1922, 1914, 1925, 1924, 1916, - 1924, 1917, 1923, 1926, 1927, 1928, 1929, 1930, 1925, 1922, - 1927, 1931, 1931, 1932, 1928, 1933, 1933, 1934, 1926, 1935, - 1936, 1936, 1937, 1937, 1938, 1942, 1929, 1943, 1930, 1941, - 1941, 1945, 1946, 1948, 1949, 1949, 1943, 1934, 1950, 1932, - 1945, 1935, 1947, 1951, 1938, 1952, 1953, 1954, 1947, 1948, - 1942, 1956, 1952, 1946, 1957, 1953, 1955, 1955, 1951, 1950, - 1959, 1962, 1960, 1961, 1963, 1967, 1959, 1960, 1964, 1961, - 1957, 1963, 1972, 1954, 1964, 1970, 1965, 1956, 1965, 1968, - 1970, 1962, 1969, 1969, 1967, 1968, 1971, 1973, 1974, 1975, - - 1976, 1974, 1972, 1976, 1977, 1971, 1978, 1979, 1979, 1980, - 1982, 1975, 1981, 1983, 1986, 1980, 1973, 1984, 1981, 1987, - 1988, 1984, 1977, 1989, 1989, 1988, 1990, 1991, 1983, 1992, - 1982, 1995, 1978, 1994, 1986, 1995, 1997, 1984, 1996, 1996, - 1998, 1987, 1997, 2001, 1992, 2003, 1991, 1999, 1999, 1998, - 1990, 2000, 1994, 2004, 2001, 2000, 2002, 2002, 2005, 2001, - 2006, 2007, 2008, 2009, 2010, 2006, 2003, 2004, 2011, 2012, - 2010, 2013, 2014, 2015, 2015, 2021, 2013, 2005, 2016, 2016, - 2019, 2007, 2008, 2009, 2012, 2014, 2011, 2017, 2020, 2019, - 2027, 2017, 2022, 2023, 2023, 2021, 2027, 2022, 2030, 2020, - - 2025, 2025, 2026, 2029, 2020, 2031, 2032, 2026, 2026, 2029, - 2031, 2033, 2036, 2035, 2037, 2039, 2036, 2033, 2032, 2038, - 2038, 2040, 2041, 2042, 2030, 2035, 2037, 2040, 2044, 2042, - 2043, 2043, 2045, 2046, 2047, 2050, 2049, 2051, 2046, 2059, - 2039, 18, 2051, 2058, 2041, 2059, 2047, 2044, 2049, 2053, - 2053, 2085, 2045, 2054, 2050, 2085, 2054, 2055, 2055, 2056, - 2056, 2057, 2057, 2058, 2060, 2063, 2061, 2062, 2066, 2066, - 2060, 2061, 2065, 2062, 2063, 2068, 2069, 2065, 2068, 2070, - 2070, 2072, 2073, 2076, 2074, 2075, 2075, 2081, 2069, 2074, - 2077, 2078, 2076, 2072, 2073, 2077, 2078, 2079, 2080, 2080, - - 2079, 2082, 2083, 2084, 2086, 2087, 2088, 2081, 2089, 2086, - 2082, 2087, 2090, 2091, 2093, 2093, 2094, 2089, 2097, 2095, - 2083, 2100, 2084, 2096, 2088, 2101, 2093, 2091, 2095, 17, - 2090, 2099, 2096, 2100, 2094, 2098, 2098, 2102, 2097, 2103, - 2099, 2109, 2102, 2106, 2106, 2108, 2101, 2110, 2108, 2111, - 2114, 2113, 2103, 2115, 2116, 2117, 2117, 2109, 2118, 2115, - 2118, 2119, 2121, 2110, 2114, 2111, 2113, 2120, 2120, 2126, - 2121, 2116, 2123, 2123, 2124, 2124, 2127, 2128, 2130, 2119, - 2129, 2131, 2127, 2128, 2132, 2130, 2133, 2133, 2134, 2134, - 2135, 2138, 2126, 2136, 2129, 2137, 2139, 2134, 2140, 2142, - - 2141, 2147, 2144, 2131, 2132, 2136, 2138, 2137, 2139, 2141, - 2143, 2135, 2148, 2151, 2142, 2143, 2143, 2145, 2149, 2145, - 2152, 2147, 2155, 2145, 2140, 2144, 2150, 2150, 2154, 2153, - 2149, 2151, 2153, 2154, 2157, 2148, 2145, 2159, 2161, 2157, - 2152, 2158, 2155, 2158, 2160, 2161, 2165, 2163, 2166, 2160, - 2167, 2168, 2169, 2168, 2170, 2159, 2163, 2166, 2173, 2172, - 2170, 2172, 2167, 2175, 2165, 2174, 2174, 2177, 2176, 2177, - 2178, 2169, 2173, 2176, 2179, 2178, 2180, 2181, 2182, 2179, - 2183, 2186, 2184, 2185, 2188, 2187, 2183, 2184, 2190, 2175, - 2187, 2187, 2188, 2186, 2180, 2181, 2185, 2191, 2182, 2192, - - 2192, 2193, 2193, 2194, 2195, 2196, 2197, 2190, 2198, 2200, - 2201, 2191, 2197, 2198, 2194, 2199, 2203, 2199, 2201, 2195, - 2202, 2202, 2204, 2204, 2206, 2196, 2201, 2200, 2203, 2205, - 2205, 2207, 2208, 2206, 2210, 2211, 2207, 2212, 2210, 2212, - 2213, 2215, 2216, 2214, 2211, 2217, 2219, 2211, 2214, 2214, - 2208, 2216, 2223, 2215, 2220, 2221, 2224, 2217, 2219, 2220, - 2221, 2213, 2225, 2226, 2226, 2223, 2227, 2228, 2229, 2231, - 2234, 2225, 2230, 2232, 2233, 2234, 2224, 2238, 2236, 2237, - 2248, 2242, 0, 2241, 2227, 2228, 2229, 2232, 2230, 2233, - 2236, 2237, 2241, 2239, 2231, 2240, 2245, 2238, 2239, 2242, - - 2240, 2247, 2245, 2248, 2249, 2250, 2251, 2247, 2252, 2253, - 2253, 2254, 2255, 2255, 2256, 2245, 2257, 2252, 2258, 2249, - 2254, 2259, 2258, 2250, 2260, 2262, 2259, 2263, 2264, 2271, - 2266, 2251, 2256, 2263, 2265, 2257, 2266, 2260, 2270, 2265, - 2265, 2267, 2268, 2280, 2262, 2268, 2270, 2267, 2276, 2271, - 2264, 2274, 2274, 2275, 2275, 2277, 2277, 2276, 2278, 2278, - 2279, 2280, 2283, 2282, 2284, 2284, 2290, 2283, 2275, 2282, - 2285, 2285, 2279, 2286, 2287, 2292, 2294, 2289, 2286, 2275, - 2287, 2289, 2296, 2291, 2295, 2297, 2290, 2291, 2298, 2295, - 2299, 2300, 2301, 2298, 2302, 2292, 2303, 2304, 2304, 2302, - - 2297, 2294, 2305, 2308, 2306, 2296, 2305, 2300, 2299, 2307, - 2309, 2310, 2301, 2311, 2307, 2312, 2318, 2313, 2303, 2306, - 2314, 2308, 2313, 2315, 2318, 2311, 2316, 2316, 2319, 2310, - 2320, 2321, 2322, 2314, 2312, 2323, 2309, 2324, 2328, 2325, - 2326, 2315, 2327, 2330, 2328, 2337, 2337, 2319, 2332, 2320, - 2321, 2333, 2326, 2336, 2339, 2322, 2324, 2339, 2330, 2323, - 2325, 2332, 2334, 2327, 2335, 2333, 2335, 2338, 2334, 2340, - 2341, 2342, 2338, 2336, 2343, 2344, 2344, 2345, 2345, 2346, - 2348, 2346, 2340, 2347, 2347, 2342, 2349, 2343, 0, 2350, - 2353, 2353, 2351, 2351, 2341, 2348, 2351, 2354, 2354, 2355, - - 2355, 2349, 2350, 2356, 2357, 2357, 2358, 2358, 2359, 2361, - 2362, 2363, 2356, 2359, 2361, 2356, 2364, 2365, 2365, 2366, - 2366, 2367, 2368, 2368, 2369, 2370, 2370, 2372, 2364, 2371, - 2362, 2363, 2372, 2373, 2373, 2374, 2374, 2375, 2376, 2377, - 2367, 2378, 2369, 2379, 2371, 2381, 2383, 2376, 2382, 2382, - 2381, 2375, 2384, 2384, 2385, 2378, 2377, 2391, 2386, 2392, - 2387, 2388, 2379, 2386, 2388, 2383, 2387, 2389, 2389, 2390, - 2390, 2393, 2385, 2393, 2392, 2395, 2391, 2396, 2397, 2397, - 2399, 2401, 2400, 2389, 2402, 2403, 2404, 2404, 2405, 2403, - 2395, 2407, 2411, 2406, 2408, 2414, 2396, 2400, 2406, 2402, - - 2399, 2410, 2410, 2412, 2401, 2413, 2407, 2405, 2415, 2408, - 2412, 2417, 2411, 2414, 2416, 2418, 2418, 2423, 2419, 2413, - 2420, 2421, 2420, 2423, 2421, 2425, 2415, 2419, 2424, 2416, - 2425, 2426, 2427, 2428, 2429, 2431, 2426, 2417, 2430, 2421, - 2424, 2421, 2433, 2430, 2434, 2435, 2428, 2433, 2436, 2434, - 2435, 2439, 2437, 2438, 2440, 2429, 2441, 2427, 2437, 2438, - 2442, 2431, 2441, 2436, 2444, 2442, 2443, 2445, 2447, 2440, - 2446, 2443, 2439, 2446, 2448, 2449, 2450, 2451, 2452, 2457, - 2445, 2453, 2459, 2448, 2449, 2450, 2451, 2453, 2447, 2444, - 2454, 2455, 2452, 0, 2460, 2455, 2454, 2461, 2461, 2457, - - 2462, 2464, 2459, 2460, 2463, 2463, 2462, 2465, 2465, 2466, - 2464, 2467, 2469, 2463, 2466, 2472, 2470, 2471, 2471, 2476, - 2473, 2477, 2475, 2480, 2482, 2478, 2480, 2483, 2469, 2473, - 2472, 2467, 2470, 2467, 2475, 2476, 2477, 2478, 2481, 2483, - 2484, 2484, 2494, 2481, 2482, 2485, 2485, 2487, 2487, 2488, - 2489, 2490, 2488, 2491, 2492, 2489, 2494, 2490, 2496, 2491, - 2493, 2493, 2497, 2492, 2495, 2495, 2498, 2499, 2499, 2500, - 2496, 2505, 2501, 2502, 2505, 2500, 2497, 2504, 2502, 2506, - 2506, 2504, 2507, 2508, 2509, 2498, 2501, 2507, 2508, 2510, - 2511, 2512, 2514, 2509, 2516, 2512, 2513, 2513, 2510, 2516, - - 2517, 2518, 2519, 2520, 2521, 2514, 2522, 2523, 2521, 2524, - 2511, 2527, 2523, 2525, 2528, 2524, 2529, 2520, 2531, 2525, - 2517, 2518, 2519, 2526, 2526, 2530, 2522, 2532, 2532, 2527, - 2530, 2534, 2535, 2528, 2537, 2529, 2536, 2539, 2538, 2531, - 2537, 2536, 2542, 2534, 2538, 2539, 2544, 2540, 2535, 2540, - 2545, 2542, 2546, 2546, 2547, 2548, 2548, 2547, 2550, 2551, - 2544, 2550, 2551, 2552, 2545, 2553, 2553, 2556, 2557, 2558, - 2560, 2556, 2559, 2559, 2557, 2563, 2563, 2565, 2567, 2560, - 2568, 2558, 2571, 2572, 2573, 2574, 2575, 2571, 2581, 2552, - 2574, 2575, 2567, 2576, 2576, 2565, 2568, 2578, 2578, 2583, - - 2580, 2582, 2582, 2584, 2587, 2573, 2580, 2585, 2581, 2572, - 2588, 2593, 2585, 2588, 2589, 2583, 2590, 2591, 2591, 2596, - 2593, 2594, 2601, 2587, 2595, 2584, 2589, 2594, 2590, 2597, - 2595, 2599, 2599, 2600, 2602, 2606, 2600, 2596, 2604, 2604, - 2606, 2601, 2605, 2605, 2597, 2607, 2608, 2609, 2610, 2611, - 2612, 2611, 2602, 2610, 2613, 2608, 2615, 2614, 2616, 2617, - 2609, 2615, 2618, 2607, 2612, 2619, 2619, 2618, 2613, 2614, - 2620, 2620, 2621, 2621, 2622, 2622, 2623, 2624, 2616, 2617, - 2625, 2626, 2626, 2627, 2627, 2625, 2628, 2628, 2623, 2629, - 2630, 2631, 2632, 2633, 0, 2624, 2636, 2634, 2635, 2635, - - 2639, 2629, 2644, 2631, 2637, 2637, 2638, 2638, 2640, 2640, - 2630, 2639, 2632, 2634, 2633, 2636, 2641, 2642, 2643, 2646, - 2645, 2647, 2644, 2649, 2642, 2645, 2648, 2648, 2641, 2651, - 2643, 2652, 2649, 2650, 2650, 2653, 2654, 2656, 2655, 2646, - 2657, 2647, 2657, 2664, 2658, 2659, 2659, 2661, 2653, 2660, - 2662, 2652, 2655, 2665, 2666, 2651, 2658, 2668, 2660, 2656, - 2654, 2664, 2661, 2667, 2669, 2662, 2667, 2670, 2678, 2669, - 2680, 2668, 2670, 2671, 2671, 2665, 2679, 2666, 2672, 2672, - 2673, 2673, 2675, 2675, 2677, 2677, 2678, 2679, 2681, 2680, - 2683, 2684, 2685, 2686, 2691, 2687, 2688, 2689, 2690, 2689, - - 0, 2692, 2698, 2681, 2687, 2693, 2693, 2695, 2697, 2684, - 2683, 2695, 2691, 2686, 2685, 2704, 2688, 2699, 2690, 2692, - 2696, 2696, 2697, 2702, 2698, 2705, 2699, 2700, 2700, 2703, - 2703, 2706, 2702, 2704, 2707, 2708, 2709, 2710, 2712, 2713, - 2711, 2707, 2716, 2705, 2714, 2714, 2713, 2715, 2715, 2706, - 2708, 2717, 2718, 2723, 2709, 2710, 2711, 2712, 2718, 2720, - 2720, 2722, 2716, 2721, 2721, 2724, 2725, 2722, 2726, 2717, - 2727, 2723, 2728, 2729, 2729, 2730, 2731, 2728, 2732, 2733, - 2734, 2725, 0, 2724, 2727, 2741, 2735, 2726, 2737, 2737, - 2733, 2735, 2736, 2746, 2736, 2730, 2731, 2738, 2732, 2738, - - 2734, 2739, 2739, 2743, 2741, 2744, 2745, 2749, 2753, 2747, - 2748, 2750, 2743, 2746, 2747, 2748, 2754, 2755, 2745, 2758, - 2755, 2756, 2756, 2757, 2744, 2759, 2759, 2749, 2753, 2760, - 2750, 2761, 2762, 2764, 2754, 2765, 2762, 2758, 2757, 2766, - 2760, 2765, 2768, 2766, 2767, 2767, 2761, 2770, 2764, 2771, - 2772, 2773, 2773, 2775, 2776, 2768, 2777, 2778, 2778, 2780, - 2777, 2784, 2770, 2776, 2785, 2775, 2779, 2779, 2782, 2771, - 2772, 2781, 2781, 2782, 2783, 2786, 2785, 2784, 2780, 2787, - 2787, 2792, 2792, 2783, 2793, 2794, 2794, 2795, 2796, 2797, - 2798, 2801, 2801, 2802, 2799, 2786, 2800, 2803, 2814, 2798, - - 2795, 2796, 2797, 2799, 2808, 2800, 2793, 2805, 2805, 2808, - 2810, 2811, 2803, 2802, 2812, 2810, 2813, 2814, 2815, 2812, - 2816, 2818, 2822, 2826, 2813, 2811, 2820, 2815, 2816, 2821, - 2825, 2820, 2823, 2823, 2821, 2825, 2818, 2822, 2824, 2824, - 2827, 2827, 2826, 2828, 2829, 2830, 2831, 2832, 0, 2829, - 2828, 2833, 2835, 2832, 2834, 2834, 2833, 2836, 2837, 2837, - 2838, 2838, 2836, 2830, 2831, 2841, 2844, 2835, 2842, 2842, - 2843, 2844, 2844, 2843, 2845, 2846, 2847, 2848, 2841, 2845, - 2846, 2849, 2850, 2848, 2851, 2849, 2852, 2850, 2853, 2854, - 2847, 2855, 2856, 2851, 2857, 2858, 2853, 2855, 2856, 2857, - - 2862, 2852, 2859, 2859, 2861, 2862, 2863, 2858, 2865, 2863, - 2854, 2861, 2867, 2868, 2869, 2870, 2871, 2867, 2868, 2869, - 2865, 2872, 2873, 2874, 2874, 2875, 2879, 2876, 2884, 2871, - 2872, 2873, 2876, 2870, 2875, 2880, 2881, 2885, 2886, 0, - 2887, 2880, 2881, 2889, 2879, 2888, 2888, 2884, 2890, 2895, - 2889, 2892, 2893, 2894, 2894, 2896, 2898, 2885, 2886, 2887, - 2892, 2893, 2897, 2897, 2895, 2900, 2902, 2890, 2903, 2905, - 2896, 2906, 2903, 2904, 2904, 2898, 2907, 2906, 2908, 2909, - 2900, 2911, 2907, 2910, 2910, 2909, 2902, 2912, 2913, 2911, - 2915, 2916, 2918, 2913, 2905, 2921, 2908, 2919, 2918, 2915, - - 2919, 2920, 2922, 2922, 2916, 2920, 2923, 2925, 2925, 2921, - 2926, 2979, 2912, 2927, 2927, 2928, 2928, 2930, 2930, 2931, - 2932, 2923, 2933, 2931, 2937, 2932, 2935, 2935, 2926, 2938, - 2939, 2933, 2940, 2941, 2938, 2943, 2979, 2940, 2940, 2944, - 2944, 2950, 2939, 2954, 2937, 2941, 2946, 2946, 2947, 2947, - 2948, 2948, 2951, 2949, 2950, 2943, 2949, 2953, 2953, 2956, - 2960, 2954, 2957, 2957, 2962, 2951, 2958, 2958, 2959, 2959, - 2961, 2961, 2963, 2964, 2965, 2960, 2974, 2962, 0, 2956, - 2965, 2966, 2966, 2970, 2967, 2975, 2971, 2964, 2967, 2970, - 2963, 2971, 2973, 2976, 2977, 2978, 2989, 2973, 2973, 2974, - - 2977, 2978, 2980, 2981, 2981, 2975, 2980, 2984, 2986, 2991, - 2991, 2987, 2984, 2976, 2987, 2990, 2986, 2992, 2990, 2993, - 2994, 2989, 2995, 2996, 2993, 2997, 2997, 2998, 2999, 3000, - 3001, 2999, 3002, 3029, 2992, 2992, 3006, 2996, 2994, 2999, - 3002, 2998, 2995, 3000, 0, 3004, 3016, 3005, 3029, 3001, - 3004, 3004, 3005, 3005, 3013, 3006, 3007, 3007, 3008, 3008, - 3009, 3009, 3010, 3010, 3011, 3011, 3012, 3012, 3014, 3015, - 3013, 3017, 3016, 3014, 3018, 3019, 3020, 3021, 3022, 3018, - 3023, 3020, 3024, 3026, 3026, 3017, 3021, 3027, 3027, 3015, - 3028, 3030, 3030, 3028, 3019, 3031, 3032, 0, 3022, 3035, - - 3023, 3031, 3024, 3034, 3034, 3037, 3035, 3036, 3036, 3040, - 3037, 3039, 3039, 3041, 3032, 3042, 3043, 3045, 3040, 3046, - 3046, 3049, 3041, 3050, 3042, 3043, 3047, 3047, 3048, 3051, - 3049, 3052, 3048, 3053, 3055, 3045, 3056, 3057, 3053, 3053, - 3051, 3057, 3050, 3061, 3063, 3056, 3052, 3055, 3061, 3062, - 3062, 3065, 3065, 3066, 3067, 3068, 3070, 3070, 3063, 3071, - 3072, 3076, 3078, 3080, 3077, 3083, 3085, 3066, 3071, 3077, - 3081, 3078, 3072, 3068, 0, 3087, 3081, 3083, 3093, 3067, - 3087, 3089, 3089, 3080, 3088, 3090, 3076, 3085, 3092, 3088, - 3094, 3093, 3101, 3092, 3090, 3095, 3095, 3097, 3097, 3095, - - 3098, 3098, 3099, 3099, 3094, 3100, 3102, 0, 3103, 3105, - 3109, 3106, 3101, 3103, 3100, 3105, 3106, 3107, 3108, 3108, - 3110, 3111, 3107, 3113, 3112, 3102, 3115, 3114, 3109, 3112, - 3116, 3116, 3110, 3114, 3118, 3119, 3121, 3121, 3118, 3120, - 3119, 3113, 3111, 3122, 3120, 3123, 3124, 3126, 3128, 3128, - 3130, 3115, 3131, 3132, 3133, 3134, 3135, 3136, 3133, 3139, - 3123, 3124, 3122, 3130, 3134, 3131, 3132, 3126, 3138, 3137, - 3140, 3140, 3135, 3138, 3141, 3142, 3136, 3137, 3143, 3139, - 3144, 3144, 3146, 3141, 3145, 3145, 3149, 3155, 3150, 3152, - 3159, 3149, 3149, 3142, 3160, 3152, 3153, 3153, 3157, 3157, - - 3161, 3146, 3150, 3162, 3143, 3161, 3159, 3163, 3155, 3167, - 3160, 3168, 3163, 3166, 3166, 3169, 3170, 3171, 3174, 3162, - 3168, 3169, 3173, 3173, 3175, 3176, 3176, 3178, 3180, 3167, - 3182, 3181, 3174, 3178, 3184, 3182, 3171, 3181, 3187, 3170, - 3185, 3185, 3188, 3175, 3186, 3186, 3189, 3189, 3180, 3190, - 3191, 3192, 3193, 3187, 3194, 3195, 3184, 3196, 3193, 3191, - 3190, 3198, 3188, 3197, 3197, 3199, 3189, 3195, 3199, 3200, - 3205, 3192, 3200, 3194, 3201, 3201, 3198, 3196, 3206, 3207, - 3208, 3208, 3205, 3209, 3210, 3207, 3209, 3211, 3213, 3215, - 3210, 3214, 3214, 3213, 3215, 3216, 3217, 3221, 3206, 3218, - - 3219, 3219, 3217, 3222, 3223, 3211, 3224, 3225, 3225, 3221, - 3227, 3226, 3242, 3228, 3216, 3233, 3218, 3218, 3242, 3224, - 3233, 3222, 3228, 3230, 3230, 3234, 3227, 3231, 3231, 3223, - 3226, 3232, 3232, 3235, 3236, 3236, 3237, 3237, 3235, 3234, - 3238, 3238, 3239, 3239, 3240, 3241, 3243, 3246, 3246, 3247, - 3252, 3243, 3249, 3249, 3250, 3250, 3254, 3240, 3255, 3257, - 3256, 3258, 3258, 3260, 3260, 3247, 3261, 3262, 3263, 3252, - 3264, 3241, 3266, 3266, 3265, 3267, 3267, 3269, 3254, 3256, - 3255, 3257, 3263, 3265, 3271, 3270, 3262, 3272, 3273, 3276, - 3264, 3270, 3261, 3273, 3281, 3269, 3277, 3277, 3279, 3279, - - 3280, 3282, 3283, 3284, 3271, 3280, 3272, 3282, 3281, 3290, - 3276, 3284, 3285, 3285, 3283, 3286, 3291, 3288, 3289, 3292, - 3286, 3288, 3293, 3289, 3292, 3294, 3297, 3296, 3298, 3290, - 3299, 3294, 3308, 3301, 3293, 3296, 3291, 3302, 3303, 3304, - 0, 3305, 3307, 3309, 3312, 3297, 3305, 3307, 3298, 3309, - 3299, 3301, 3308, 3302, 3310, 3303, 3303, 3314, 3313, 3310, - 3304, 3313, 3318, 3318, 3312, 3319, 3319, 3320, 3325, 3325, - 3314, 3320, 3326, 3327, 3328, 3328, 3330, 3326, 3333, 3333, - 3334, 3334, 3338, 3334, 3335, 3335, 3338, 3335, 3336, 3336, - 3340, 3330, 3327, 3337, 3337, 3340, 3337, 3341, 3342, 3342, - - 3343, 3344, 3347, 3347, 3348, 3349, 3341, 3350, 3351, 3351, - 3352, 3355, 3350, 3356, 3358, 3344, 3359, 3357, 3343, 3361, - 3356, 3357, 3362, 3358, 3348, 3349, 3364, 3362, 3363, 3363, - 3352, 3359, 3365, 3365, 3368, 3364, 3355, 3361, 3366, 3366, - 3367, 3367, 3369, 3370, 3373, 3371, 3374, 3369, 3372, 3368, - 3371, 3371, 3370, 3375, 3372, 3370, 3378, 3376, 3377, 3379, - 3379, 3374, 3376, 3377, 3380, 3381, 3382, 3382, 3384, 3373, - 3380, 3381, 3383, 3383, 3375, 3378, 3385, 3388, 3388, 3390, - 3390, 3385, 3391, 3384, 3393, 3395, 3395, 3396, 3396, 3397, - 3397, 3391, 3398, 3398, 3400, 3400, 3401, 3401, 3402, 3402, - - 3403, 3403, 3393, 3404, 3406, 3407, 3407, 3408, 3408, 3409, - 3410, 3411, 3416, 3406, 3413, 3413, 3414, 3417, 3409, 3415, - 3415, 3418, 3410, 3419, 3419, 3420, 3420, 3416, 3422, 3404, - 3417, 3411, 3426, 3418, 3428, 3414, 3423, 3423, 3427, 3429, - 3429, 3427, 3432, 3422, 3430, 3432, 3433, 3434, 3435, 3436, - 3426, 3437, 3433, 3435, 3438, 3441, 3448, 3440, 3445, 3449, - 3428, 3434, 3430, 3440, 3441, 3463, 3463, 3444, 3436, 3437, - 3438, 3444, 3458, 3445, 3462, 3459, 3468, 3458, 3459, 3449, - 3464, 3464, 3448, 3466, 3466, 3469, 3470, 3462, 3471, 3473, - 3470, 3475, 3477, 3476, 3469, 3479, 3478, 3477, 3478, 3468, - - 3480, 3480, 3481, 3473, 3476, 3482, 3484, 3483, 3471, 3485, - 3479, 3486, 3487, 3489, 3475, 3481, 3488, 3490, 3489, 3499, - 3492, 3487, 3484, 3494, 3482, 3483, 3486, 3491, 3488, 3493, - 3493, 3495, 3491, 3499, 3485, 3500, 3495, 3502, 3490, 3492, - 3501, 3501, 3507, 3494, 3503, 3503, 3502, 3504, 3504, 3505, - 3505, 3506, 3506, 3508, 3509, 3500, 3512, 3509, 3510, 3511, - 3513, 3507, 3514, 3510, 3511, 3515, 3516, 3517, 3514, 3518, - 3518, 3519, 3517, 3508, 3524, 3513, 3520, 3520, 3516, 3515, - 3525, 3512, 3521, 3521, 3523, 3523, 3526, 3526, 3528, 3524, - 3530, 3519, 3533, 3533, 3534, 3534, 3535, 3536, 3539, 3525, - - 3537, 3538, 3540, 3528, 3535, 3541, 3537, 3538, 3530, 3542, - 3543, 3543, 3539, 3549, 3542, 3540, 3536, 3545, 3545, 3550, - 3555, 3552, 3553, 3556, 3541, 3557, 3553, 3560, 3556, 3558, - 3559, 3561, 3562, 3566, 3549, 3552, 3561, 3562, 3567, 3550, - 3555, 3568, 3558, 3559, 3557, 3571, 3560, 3563, 3563, 3569, - 3569, 3571, 3570, 3566, 3572, 3572, 3567, 3570, 3573, 3574, - 3568, 3575, 3576, 3573, 3574, 3577, 3575, 3579, 3579, 3580, - 3584, 3577, 3581, 3581, 3580, 3583, 3585, 3586, 3587, 3583, - 3588, 3576, 3589, 3585, 3597, 3590, 3588, 3592, 3592, 3584, - 3594, 3594, 3598, 3595, 3596, 3599, 3586, 3587, 3590, 3596, - - 3602, 3589, 3595, 3597, 3601, 3595, 3600, 3600, 3599, 3601, - 3604, 3598, 3606, 3602, 3605, 3605, 3607, 3607, 3608, 3608, - 3609, 3610, 3611, 3612, 3612, 3609, 0, 3613, 3610, 3615, - 3615, 3606, 3613, 3614, 3618, 3614, 3604, 3616, 3617, 3620, - 3623, 3611, 3619, 3627, 3616, 3617, 3625, 3619, 3622, 3622, - 3626, 3625, 3628, 3618, 3632, 3626, 3629, 3629, 3620, 3623, - 3631, 3631, 3627, 3633, 3634, 3634, 3635, 3635, 3636, 3638, - 3638, 3628, 3640, 3632, 3646, 3636, 3639, 3639, 3642, 3640, - 3645, 3647, 3633, 3642, 0, 3645, 3648, 3648, 3649, 3649, - 0, 0, 0, 3646, 0, 0, 0, 0, 0, 0, - - 3647, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3654, 3654, - 3654, 3654, 3654, 3654, 3654, 3655, 3655, 3655, 3655, 3655, - 3655, 3655, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3657, - 3657, 3657, 3657, 3657, 3657, 3657, 3658, 3658, 3658, 3658, - 3658, 3658, 3658, 3659, 3659, 3659, 3659, 3659, 3659, 3659, - 3661, 3661, 0, 3661, 3661, 3661, 3661, 3662, 3662, 0, - 0, 0, 3662, 3662, 3663, 3663, 0, 0, 3663, 0, - 3663, 3664, 0, 0, 0, 0, 0, 3664, 3665, 3665, - 0, 0, 0, 3665, 3665, 3666, 0, 0, 0, 0, - 0, 3666, 3667, 3667, 0, 3667, 3667, 3667, 3667, 3668, - - 0, 0, 0, 0, 0, 3668, 3669, 3669, 0, 0, - 0, 3669, 3669, 3670, 3670, 0, 3670, 3670, 3670, 3670, - 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, - 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, - 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, - 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, - 3652 + 145, 136, 135, 147, 151, 139, 140, 144, 146, 141, + 144, 178, 140, 145, 146, 147, 148, 148, 143, 150, + + 149, 144, 142, 151, 153, 144, 156, 149, 154, 155, + 154, 156, 157, 183, 148, 150, 158, 148, 149, 154, + 153, 155, 159, 160, 157, 162, 162, 159, 183, 164, + 177, 154, 164, 166, 158, 166, 166, 160, 166, 169, + 169, 171, 184, 171, 171, 172, 171, 172, 172, 174, + 172, 176, 174, 176, 176, 180, 176, 172, 179, 179, + 180, 181, 182, 185, 186, 184, 188, 181, 189, 190, + 191, 185, 193, 192, 190, 186, 181, 195, 185, 216, + 182, 193, 194, 189, 192, 188, 196, 175, 194, 194, + 191, 196, 197, 197, 198, 200, 199, 216, 199, 200, + + 198, 199, 195, 204, 200, 201, 201, 202, 203, 200, + 208, 207, 205, 203, 203, 200, 200, 205, 199, 202, + 206, 209, 204, 207, 210, 206, 211, 209, 210, 212, + 208, 211, 213, 214, 217, 218, 220, 215, 221, 217, + 218, 220, 224, 224, 222, 212, 213, 227, 214, 215, + 209, 170, 215, 219, 219, 223, 225, 219, 221, 219, + 222, 223, 225, 226, 228, 230, 229, 227, 225, 226, + 228, 219, 229, 219, 231, 234, 240, 232, 233, 234, + 231, 229, 232, 235, 233, 236, 230, 236, 237, 235, + 238, 239, 236, 241, 237, 242, 240, 239, 243, 241, + + 245, 244, 246, 238, 248, 247, 253, 246, 242, 244, + 249, 250, 254, 245, 247, 251, 254, 242, 252, 248, + 251, 251, 243, 252, 253, 255, 249, 256, 258, 269, + 257, 250, 259, 256, 258, 260, 261, 262, 261, 263, + 260, 266, 268, 269, 264, 265, 263, 255, 257, 257, + 264, 265, 259, 267, 268, 275, 262, 270, 270, 267, + 266, 271, 271, 272, 273, 274, 276, 274, 277, 272, + 273, 276, 278, 279, 280, 282, 168, 281, 275, 284, + 277, 279, 281, 283, 274, 284, 285, 272, 283, 289, + 286, 278, 285, 288, 280, 286, 287, 290, 282, 288, + + 291, 287, 293, 292, 289, 294, 295, 297, 296, 301, + 297, 290, 292, 294, 296, 298, 293, 298, 291, 299, + 299, 300, 302, 302, 300, 303, 303, 301, 304, 306, + 305, 295, 306, 307, 308, 310, 312, 307, 309, 313, + 314, 167, 312, 308, 304, 305, 314, 309, 315, 316, + 315, 322, 317, 313, 310, 316, 317, 318, 318, 319, + 320, 321, 323, 324, 319, 325, 320, 321, 326, 326, + 328, 322, 327, 317, 330, 327, 331, 329, 325, 333, + 323, 329, 332, 332, 324, 336, 321, 334, 328, 335, + 334, 336, 337, 330, 331, 337, 338, 333, 341, 342, + + 344, 335, 340, 344, 342, 165, 345, 334, 338, 339, + 346, 340, 343, 350, 350, 343, 341, 343, 339, 345, + 349, 339, 346, 349, 351, 352, 339, 339, 339, 339, + 343, 348, 347, 343, 347, 347, 348, 348, 353, 354, + 352, 351, 355, 356, 351, 357, 357, 359, 359, 358, + 361, 355, 356, 353, 358, 362, 354, 354, 360, 360, + 363, 364, 365, 366, 367, 363, 368, 379, 369, 369, + 362, 369, 368, 364, 371, 361, 379, 372, 373, 367, + 369, 365, 372, 366, 373, 374, 375, 369, 377, 378, + 374, 375, 378, 376, 371, 381, 376, 375, 376, 380, + + 380, 381, 377, 382, 382, 378, 383, 386, 378, 388, + 378, 383, 384, 384, 389, 384, 395, 387, 390, 396, + 387, 384, 393, 392, 388, 384, 392, 386, 396, 389, + 384, 395, 390, 384, 385, 385, 393, 385, 387, 397, + 400, 398, 392, 399, 397, 397, 404, 398, 401, 403, + 385, 405, 404, 385, 398, 385, 402, 385, 394, 400, + 394, 394, 406, 401, 399, 402, 407, 408, 403, 405, + 394, 394, 394, 394, 394, 410, 411, 394, 413, 409, + 410, 408, 412, 419, 416, 409, 407, 414, 406, 409, + 415, 417, 414, 413, 420, 415, 411, 417, 410, 416, + + 418, 418, 412, 419, 421, 422, 420, 423, 424, 425, + 427, 422, 426, 426, 425, 426, 438, 428, 421, 429, + 430, 431, 432, 431, 424, 437, 433, 432, 433, 433, + 427, 438, 423, 428, 430, 429, 434, 435, 436, 436, + 434, 435, 439, 440, 437, 441, 433, 444, 445, 450, + 446, 456, 456, 444, 442, 446, 435, 445, 439, 441, + 447, 440, 442, 442, 447, 449, 448, 451, 452, 455, + 450, 449, 452, 451, 442, 448, 442, 443, 453, 454, + 457, 453, 443, 459, 454, 458, 458, 460, 459, 455, + 443, 443, 464, 457, 443, 443, 461, 461, 443, 462, + + 460, 465, 463, 466, 467, 462, 463, 464, 466, 467, + 468, 468, 469, 470, 471, 472, 474, 473, 476, 468, + 473, 474, 465, 478, 469, 475, 479, 472, 478, 475, + 476, 481, 471, 470, 477, 477, 480, 480, 483, 483, + 485, 486, 487, 488, 489, 490, 491, 479, 492, 486, + 490, 494, 488, 481, 495, 496, 497, 163, 499, 498, + 492, 485, 497, 487, 499, 489, 491, 500, 501, 494, + 503, 494, 495, 498, 501, 496, 500, 502, 504, 506, + 505, 507, 502, 505, 503, 508, 504, 510, 513, 504, + 515, 509, 511, 506, 508, 511, 507, 509, 512, 516, + + 514, 519, 513, 518, 512, 514, 517, 510, 518, 520, + 517, 521, 515, 522, 520, 523, 519, 526, 558, 527, + 516, 528, 512, 530, 558, 529, 531, 521, 523, 529, + 532, 531, 522, 524, 524, 542, 528, 526, 542, 524, + 527, 524, 530, 535, 533, 534, 532, 524, 533, 524, + 534, 536, 524, 524, 534, 537, 536, 538, 535, 524, + 540, 539, 541, 543, 544, 546, 538, 539, 545, 545, + 548, 537, 539, 550, 537, 540, 536, 549, 541, 547, + 547, 551, 551, 552, 544, 548, 543, 553, 550, 549, + 546, 554, 555, 556, 560, 557, 554, 566, 565, 563, + + 561, 555, 552, 560, 561, 563, 564, 562, 567, 553, + 557, 562, 556, 565, 568, 569, 566, 570, 564, 571, + 568, 572, 567, 571, 573, 574, 573, 577, 575, 578, + 569, 576, 576, 577, 572, 570, 575, 579, 580, 581, + 583, 578, 582, 579, 580, 582, 584, 585, 587, 574, + 586, 581, 585, 586, 583, 588, 590, 587, 591, 591, + 589, 584, 592, 592, 587, 589, 589, 587, 593, 590, + 598, 588, 594, 594, 593, 595, 595, 596, 599, 597, + 600, 603, 602, 596, 597, 597, 601, 602, 598, 601, + 604, 605, 600, 607, 605, 608, 606, 610, 604, 599, + + 603, 606, 609, 610, 611, 612, 609, 613, 614, 612, + 616, 616, 615, 614, 608, 617, 607, 618, 619, 621, + 620, 622, 623, 619, 611, 613, 615, 624, 623, 625, + 617, 627, 624, 629, 626, 621, 630, 626, 618, 620, + 633, 622, 626, 625, 634, 626, 626, 628, 628, 627, + 631, 629, 630, 632, 633, 631, 636, 637, 632, 634, + 638, 639, 636, 638, 640, 639, 637, 641, 642, 640, + 641, 644, 643, 642, 645, 647, 648, 646, 649, 649, + 647, 645, 650, 651, 652, 653, 654, 639, 643, 644, + 646, 650, 655, 656, 657, 654, 648, 662, 161, 656, + + 657, 653, 651, 658, 655, 652, 658, 659, 659, 660, + 659, 661, 660, 663, 664, 662, 661, 665, 666, 667, + 671, 668, 665, 669, 673, 667, 668, 663, 664, 669, + 670, 672, 679, 670, 675, 676, 672, 666, 674, 85, + 673, 677, 682, 674, 674, 671, 677, 675, 676, 678, + 680, 679, 681, 683, 683, 678, 684, 681, 685, 680, + 677, 677, 682, 684, 686, 685, 687, 686, 688, 689, + 690, 692, 687, 694, 689, 690, 690, 691, 691, 693, + 688, 693, 686, 695, 689, 695, 696, 697, 698, 699, + 700, 701, 694, 703, 702, 706, 692, 701, 702, 704, + + 705, 707, 703, 709, 696, 697, 698, 711, 699, 708, + 700, 710, 708, 706, 704, 705, 712, 710, 709, 713, + 707, 708, 714, 715, 716, 717, 719, 711, 718, 717, + 712, 713, 720, 721, 722, 723, 726, 726, 729, 80, + 724, 714, 719, 716, 715, 724, 718, 725, 728, 730, + 720, 721, 721, 722, 723, 727, 731, 729, 732, 727, + 730, 725, 728, 732, 733, 734, 735, 736, 737, 738, + 731, 739, 740, 737, 736, 742, 738, 740, 741, 735, + 733, 743, 744, 741, 734, 745, 747, 746, 743, 752, + 75, 744, 749, 742, 748, 739, 746, 749, 747, 745, + + 748, 750, 751, 752, 750, 753, 751, 754, 755, 756, + 757, 755, 758, 758, 753, 759, 759, 760, 760, 762, + 761, 764, 754, 756, 759, 761, 765, 766, 762, 767, + 768, 757, 765, 769, 768, 770, 771, 772, 775, 773, + 764, 774, 776, 772, 777, 769, 766, 773, 774, 767, + 780, 787, 783, 786, 771, 790, 775, 787, 792, 789, + 770, 790, 786, 791, 777, 780, 799, 776, 778, 783, + 778, 793, 791, 778, 792, 793, 797, 778, 794, 794, + 778, 789, 795, 795, 796, 798, 799, 778, 778, 802, + 778, 800, 804, 803, 797, 796, 805, 800, 803, 798, + + 801, 801, 801, 807, 801, 810, 806, 801, 812, 802, + 806, 808, 801, 804, 805, 808, 809, 811, 801, 801, + 813, 809, 811, 812, 810, 814, 816, 807, 814, 815, + 826, 808, 818, 816, 815, 815, 817, 817, 819, 820, + 820, 821, 826, 819, 823, 813, 821, 818, 822, 823, + 827, 822, 824, 824, 825, 828, 825, 829, 831, 828, + 830, 832, 832, 833, 835, 835, 831, 834, 836, 827, + 837, 838, 841, 841, 839, 846, 74, 829, 833, 830, + 839, 834, 837, 840, 842, 845, 836, 844, 840, 842, + 842, 845, 844, 838, 846, 847, 850, 848, 849, 850, + + 851, 847, 848, 852, 849, 855, 851, 853, 853, 854, + 854, 852, 856, 855, 857, 859, 858, 860, 861, 857, + 858, 862, 859, 863, 863, 865, 867, 864, 866, 866, + 856, 868, 867, 865, 861, 860, 864, 869, 871, 872, + 862, 873, 875, 876, 878, 874, 876, 871, 872, 868, + 874, 875, 877, 879, 880, 881, 869, 877, 878, 883, + 885, 882, 886, 880, 888, 873, 882, 882, 881, 884, + 884, 887, 889, 883, 890, 885, 894, 890, 879, 896, + 887, 886, 892, 897, 892, 890, 893, 893, 888, 895, + 889, 898, 899, 900, 895, 901, 902, 894, 903, 904, + + 896, 905, 903, 897, 901, 68, 906, 907, 909, 908, + 910, 898, 906, 900, 899, 913, 907, 904, 911, 902, + 905, 908, 912, 913, 909, 914, 915, 917, 912, 910, + 918, 915, 911, 916, 916, 919, 920, 921, 922, 914, + 923, 924, 927, 925, 919, 921, 917, 926, 927, 928, + 918, 929, 931, 930, 932, 928, 920, 935, 922, 930, + 924, 935, 923, 925, 933, 929, 931, 926, 936, 934, + 933, 937, 938, 939, 932, 934, 941, 938, 940, 940, + 942, 943, 941, 937, 943, 944, 942, 936, 945, 946, + 947, 937, 948, 948, 939, 946, 949, 950, 953, 956, + + 952, 945, 950, 944, 951, 952, 952, 951, 954, 957, + 947, 958, 954, 953, 949, 955, 955, 960, 959, 962, + 951, 956, 951, 959, 963, 966, 958, 965, 967, 957, + 969, 970, 970, 971, 63, 969, 960, 971, 963, 972, + 965, 973, 973, 962, 974, 966, 977, 975, 976, 967, + 968, 975, 978, 968, 972, 968, 979, 978, 982, 968, + 977, 968, 980, 976, 981, 984, 968, 980, 980, 974, + 979, 968, 982, 981, 983, 986, 985, 987, 983, 988, + 984, 985, 987, 989, 990, 991, 58, 986, 1000, 993, + 983, 985, 992, 988, 991, 993, 994, 992, 990, 995, + + 996, 994, 997, 997, 989, 995, 996, 998, 999, 1001, + 1000, 1002, 998, 1004, 999, 1005, 1008, 1008, 1006, 1009, + 1005, 1007, 57, 1011, 1009, 1004, 1010, 1012, 1001, 1002, + 1003, 1003, 1006, 1007, 1010, 1013, 1003, 1015, 1003, 1011, + 1014, 1012, 1016, 1018, 1003, 1019, 1017, 1021, 1016, 1003, + 1003, 1017, 1020, 1015, 1013, 1018, 1003, 1022, 1024, 1014, + 1023, 1023, 1024, 1019, 1025, 1021, 1027, 1028, 1020, 1029, + 1028, 1030, 1027, 1031, 1032, 1022, 1030, 1033, 1034, 1038, + 1032, 1036, 1033, 1037, 1025, 1039, 1031, 1040, 1029, 1041, + 1036, 1039, 1037, 1042, 1043, 1038, 1040, 1034, 1042, 1044, + + 1045, 1047, 1048, 1046, 1050, 1055, 1049, 1053, 1041, 1056, + 1047, 1048, 1049, 1044, 1043, 1046, 1051, 1058, 1059, 1055, + 1045, 1050, 1051, 1053, 1060, 1057, 1061, 1155, 1062, 1056, + 1057, 1155, 1059, 1062, 1063, 1066, 1058, 1067, 1075, 1063, + 1066, 1061, 1060, 1068, 1068, 1069, 1067, 1070, 1071, 1072, + 1073, 1069, 1079, 1070, 1075, 1076, 1081, 1071, 1078, 1078, + 1076, 1076, 1078, 1073, 1072, 1080, 1082, 1079, 1080, 1083, + 1081, 1084, 1087, 1086, 1085, 1088, 1089, 1090, 1087, 1091, + 1092, 1096, 1089, 52, 1091, 1083, 1082, 1085, 1086, 1084, + 1094, 1094, 1090, 1095, 1092, 1088, 1095, 1099, 1097, 1098, + + 1100, 1101, 1096, 1097, 1098, 1102, 1101, 1103, 1105, 1100, + 1102, 1106, 1107, 1099, 1105, 1108, 1109, 1109, 1107, 1103, + 1110, 1108, 1111, 1112, 1113, 1113, 1112, 1106, 1114, 1110, + 1115, 1116, 1117, 1119, 1118, 1117, 1120, 1121, 1124, 1119, + 1111, 1129, 1120, 1121, 1124, 1122, 1114, 1118, 1123, 1115, + 1122, 1116, 1125, 1123, 1126, 1130, 1128, 1125, 1131, 1129, + 1126, 1128, 1132, 1134, 1131, 1133, 1133, 1132, 1135, 1136, + 1137, 1138, 1134, 1139, 1136, 1130, 1139, 1135, 1140, 1142, + 1141, 1140, 1143, 1144, 1142, 1145, 1146, 1147, 1137, 1151, + 1138, 1141, 1146, 1147, 1148, 1144, 1149, 1150, 1150, 1152, + + 1143, 1149, 1153, 1154, 1145, 1156, 1157, 1158, 1151, 1148, + 1159, 1161, 1163, 1152, 1153, 1157, 1162, 1162, 1166, 1164, + 1163, 1154, 1165, 1156, 1164, 1168, 1158, 1165, 1169, 1170, + 1161, 1171, 1173, 1172, 1175, 1159, 1171, 1178, 1166, 1168, + 1176, 1170, 1172, 1169, 1174, 1174, 1176, 1173, 1180, 1177, + 1180, 1179, 1181, 1178, 1175, 1177, 1179, 1181, 1182, 1183, + 1184, 1185, 1186, 1187, 1188, 1184, 1187, 1189, 1190, 1192, + 1192, 1188, 1182, 1183, 1193, 1194, 1185, 1195, 1196, 1197, + 47, 1186, 1189, 1204, 1196, 1200, 1198, 1190, 1193, 1200, + 1204, 1198, 1195, 1194, 1201, 1201, 1202, 1203, 1203, 1197, + + 1198, 1202, 1198, 1205, 1206, 1198, 1207, 1206, 1208, 1209, + 1210, 1211, 1212, 1213, 1215, 1210, 1214, 1205, 1209, 1213, + 1216, 1214, 1217, 1222, 1212, 1207, 1208, 1225, 1215, 1220, + 1211, 1216, 1219, 1219, 1220, 1221, 1225, 1223, 1226, 1227, + 1221, 1217, 1223, 1222, 1224, 1228, 1229, 1230, 1224, 1229, + 1231, 1232, 1233, 1226, 1227, 1234, 1235, 1231, 1229, 1236, + 1237, 1238, 1230, 1232, 1228, 1236, 1239, 1238, 1240, 1241, + 1242, 1233, 1243, 1245, 1235, 1237, 1234, 1244, 1241, 1246, + 1247, 1248, 1249, 1252, 1251, 1242, 1239, 1248, 1240, 1244, + 1251, 1243, 1245, 1253, 1255, 1247, 1256, 1254, 1252, 1258, + + 1260, 1257, 1249, 1259, 1246, 1254, 1257, 1253, 1259, 1259, + 1261, 1258, 1256, 1262, 1255, 1263, 1263, 1265, 1269, 1260, + 1266, 1268, 1268, 1269, 1261, 1267, 1262, 1264, 1264, 1266, + 1265, 1267, 1264, 1270, 1272, 1264, 1264, 1271, 1275, 1272, + 1264, 1278, 1270, 1271, 1273, 1279, 1264, 1274, 1274, 1273, + 1264, 1276, 1276, 1277, 1280, 1281, 1277, 1282, 1277, 1275, + 1280, 1278, 1283, 1279, 1281, 1284, 1285, 1283, 1286, 1287, + 1290, 1288, 1291, 1293, 1286, 1287, 1288, 1282, 1289, 1284, + 1292, 1291, 1289, 1290, 1285, 1292, 1291, 1293, 1291, 1296, + 1291, 1299, 1291, 1294, 1294, 1295, 1295, 1298, 1295, 1300, + + 1296, 1298, 1301, 1302, 1303, 1304, 1299, 1305, 1306, 1303, + 1303, 1307, 1302, 1306, 1304, 1308, 1309, 1310, 1311, 1300, + 1301, 1312, 1313, 1313, 1308, 1307, 1314, 1312, 1316, 1305, + 1318, 1315, 1311, 1321, 1319, 1309, 1310, 1322, 1314, 1315, + 1317, 1320, 1316, 1319, 1318, 1317, 1325, 1323, 1320, 1324, + 1324, 1321, 1323, 1326, 1326, 1327, 1329, 1327, 1330, 1329, + 1331, 1325, 1322, 1330, 1332, 1333, 1333, 1334, 1335, 1335, + 1336, 1336, 1337, 1332, 1338, 1339, 1340, 1337, 1342, 1331, + 1341, 1341, 1343, 1344, 1345, 1346, 1344, 1334, 1347, 1350, + 1353, 1346, 1348, 1347, 1385, 1338, 1339, 1340, 1342, 1343, + + 1349, 1348, 1349, 1352, 1345, 1353, 1352, 1350, 1354, 1355, + 1356, 1357, 1358, 1359, 1355, 1364, 1357, 1385, 1359, 1360, + 1358, 1354, 1360, 1361, 1356, 1362, 1362, 1363, 1361, 1365, + 1366, 1367, 1363, 1364, 1369, 1365, 1370, 1366, 1371, 1373, + 1369, 1372, 1370, 1371, 1367, 1373, 1372, 1374, 1375, 1376, + 1377, 1377, 1378, 1380, 1382, 1381, 1374, 1384, 1380, 1383, + 1376, 18, 1386, 1387, 1382, 1388, 1392, 1375, 1386, 1387, + 1389, 1388, 1378, 1381, 1383, 1393, 1391, 1384, 1394, 1395, + 1392, 1389, 1391, 1396, 1397, 1399, 1392, 1398, 1398, 1400, + 1401, 1395, 1403, 1405, 1402, 1393, 1408, 1396, 1394, 1402, + + 1404, 1404, 1397, 1410, 1406, 1399, 1409, 17, 1401, 1406, + 1403, 1409, 1409, 1411, 1400, 1408, 1405, 1412, 1413, 1414, + 1415, 1410, 1411, 1416, 1417, 1412, 1419, 1418, 1416, 1418, + 1421, 1416, 1413, 1417, 1414, 1415, 1421, 1422, 1415, 1423, + 1419, 1422, 1424, 1425, 1426, 1427, 1428, 1424, 1424, 1429, + 1423, 1428, 1430, 1431, 1429, 1432, 1433, 1430, 1434, 1436, + 1442, 1433, 1425, 1427, 1437, 1438, 1439, 1439, 1440, 1441, + 1426, 1431, 1440, 1436, 1443, 1432, 1444, 1445, 1434, 1442, + 1443, 1446, 1437, 1438, 1447, 1452, 1448, 1441, 1444, 1449, + 1450, 1451, 1452, 1445, 1453, 1454, 1451, 1455, 1447, 1453, + + 1446, 1448, 1456, 1459, 1449, 1457, 1457, 1458, 1460, 1450, + 1462, 1456, 1459, 1454, 1461, 1461, 1462, 1463, 1455, 1464, + 1465, 1465, 1458, 1463, 1466, 1466, 1467, 1468, 1460, 1469, + 1470, 1471, 1467, 1464, 1472, 1470, 1473, 1471, 1474, 1474, + 1472, 1480, 1473, 1468, 1475, 1475, 1477, 1477, 1478, 1479, + 1469, 1481, 1478, 1482, 1483, 1484, 1485, 1485, 1479, 1480, + 1486, 1493, 1484, 1481, 1475, 1487, 1475, 1482, 1489, 1483, + 1488, 1490, 1491, 1487, 1495, 1488, 1496, 1491, 1491, 1492, + 1486, 1493, 1489, 1497, 1492, 1492, 1494, 1494, 1499, 1498, + 1490, 1500, 1497, 1495, 1498, 1496, 1501, 1502, 1504, 1503, + + 1505, 1507, 1506, 1502, 1503, 1510, 1508, 1499, 1506, 1509, + 1511, 1500, 1508, 1512, 1501, 1509, 1513, 1514, 1504, 1515, + 1507, 1516, 1517, 0, 1510, 1520, 1505, 1518, 1518, 1511, + 1521, 1519, 1512, 1515, 1519, 1513, 1514, 1517, 1522, 1523, + 1523, 1527, 1516, 1525, 1520, 1524, 1524, 1526, 1525, 1521, + 1522, 1526, 1528, 1529, 1527, 1530, 1533, 1531, 1535, 1531, + 1534, 1536, 1529, 1531, 1537, 1534, 1539, 1528, 1530, 1538, + 1538, 1539, 1540, 1535, 1533, 1541, 1531, 1543, 1540, 1542, + 1537, 1536, 1544, 1543, 1545, 1546, 1547, 1544, 1545, 1546, + 1541, 1548, 1542, 1549, 1550, 1551, 1552, 1552, 1554, 1556, + + 1557, 1551, 1549, 1558, 1558, 1557, 1547, 1559, 1560, 1548, + 1562, 1562, 1564, 1559, 1550, 1564, 1554, 1565, 1565, 1566, + 1556, 1567, 1568, 1570, 1571, 1573, 1570, 1572, 1560, 1574, + 1575, 1575, 1577, 1576, 1573, 1566, 1578, 1567, 1568, 1579, + 1580, 1582, 1582, 1584, 1579, 1571, 1581, 1572, 1576, 1574, + 1583, 1585, 1581, 1577, 1580, 1578, 1586, 1587, 1589, 1583, + 1590, 1584, 1588, 1588, 1591, 1592, 1585, 1593, 1593, 1591, + 1594, 1595, 1589, 1597, 1594, 1596, 1596, 1587, 1590, 1598, + 1592, 1586, 1599, 1600, 1601, 1602, 1606, 1600, 1604, 1604, + 1602, 1595, 1608, 1599, 1605, 1597, 1607, 1605, 1598, 1606, + + 1609, 1607, 1610, 1601, 1611, 1612, 1613, 1616, 1608, 1615, + 1615, 1614, 1616, 1617, 1618, 1622, 1610, 1620, 1609, 1612, + 1614, 1619, 1619, 1611, 1611, 1621, 1620, 1623, 1626, 1623, + 1621, 1613, 1624, 1617, 1618, 1622, 1625, 1624, 1627, 1630, + 1628, 1632, 1625, 1633, 1627, 1628, 1631, 1631, 1626, 1633, + 1635, 1636, 1639, 1630, 1640, 1635, 1637, 1637, 1638, 1638, + 1632, 1641, 1642, 1643, 1643, 1642, 1639, 1644, 1645, 1646, + 1654, 1648, 1640, 1652, 1649, 1636, 1641, 1648, 1647, 1649, + 1645, 1647, 1652, 1650, 1647, 1644, 1650, 1653, 1655, 1646, + 1657, 1655, 1653, 1656, 1656, 1654, 1647, 1658, 1659, 1667, + + 1660, 1666, 1650, 1658, 1659, 1660, 1661, 1661, 1662, 1662, + 1663, 1665, 1664, 1668, 1657, 1670, 1663, 1664, 1667, 1666, + 1669, 1670, 1671, 1669, 1665, 1672, 1675, 1673, 1671, 1674, + 1679, 1672, 1673, 1668, 1676, 1674, 1677, 1677, 1678, 1676, + 1680, 1683, 1681, 1678, 1682, 1684, 1687, 1690, 1679, 1675, + 1686, 1685, 1688, 1702, 1702, 1683, 1688, 1697, 1699, 1684, + 1680, 1681, 1693, 1691, 1682, 1685, 1690, 1689, 1686, 1689, + 1691, 1687, 1694, 1695, 1693, 1696, 1698, 1697, 1699, 1700, + 1701, 1696, 1703, 1701, 1694, 1706, 1695, 1705, 1705, 1707, + 1708, 1703, 1698, 1700, 1707, 1709, 1709, 1710, 1712, 1711, + + 1713, 1701, 1708, 1716, 1715, 1706, 1714, 1718, 1717, 1720, + 1716, 1722, 1710, 1711, 1727, 1714, 0, 1717, 1713, 1715, + 1717, 1726, 1712, 1718, 1720, 1723, 1724, 1724, 1723, 1720, + 1725, 1725, 1727, 1726, 1728, 1730, 1722, 1728, 1729, 1729, + 1731, 1732, 1733, 1735, 1734, 1733, 1732, 1736, 1730, 1734, + 1738, 1737, 1739, 1742, 1742, 1744, 1740, 1745, 1746, 1731, + 1737, 1739, 1735, 1736, 1739, 1740, 1741, 1743, 1747, 1738, + 1745, 1748, 1741, 1749, 1743, 1744, 1746, 1751, 1749, 1749, + 1750, 1754, 1747, 1755, 1758, 1750, 0, 1748, 1759, 1751, + 1756, 1756, 1757, 1760, 1760, 1757, 1762, 1759, 1760, 1763, + + 1758, 1755, 1761, 1761, 1763, 1762, 1754, 1764, 1762, 1765, + 1766, 1771, 1769, 1767, 1770, 1772, 1774, 1761, 1767, 1767, + 1772, 1773, 1774, 1775, 1779, 1764, 1769, 1783, 1766, 1770, + 1765, 1776, 1776, 1771, 1777, 1773, 1784, 1778, 1779, 1780, + 1777, 1775, 1778, 1781, 1786, 1780, 1785, 1783, 1790, 1781, + 1784, 1787, 1785, 1788, 1787, 1792, 1790, 1786, 1793, 1788, + 1787, 1794, 1795, 1796, 1797, 1798, 1799, 1801, 1796, 1800, + 1795, 1802, 0, 1797, 1792, 1799, 1806, 1793, 1798, 1806, + 1794, 1801, 1800, 1803, 1803, 1802, 1804, 1805, 1807, 1808, + 1808, 1809, 1804, 1805, 1810, 1811, 1812, 1812, 1814, 1815, + + 1813, 1807, 1816, 1820, 1814, 1803, 1817, 1819, 1819, 1823, + 1827, 1809, 1810, 1813, 1811, 1821, 0, 1822, 1816, 1821, + 1824, 1815, 1822, 1820, 1817, 1824, 1825, 1826, 1829, 1823, + 1832, 1825, 1830, 1827, 1831, 1833, 1826, 1831, 1835, 1829, + 1836, 1830, 1832, 1834, 1834, 1837, 1838, 1838, 1839, 1840, + 1833, 1841, 1836, 1839, 1842, 1843, 1845, 1835, 1841, 1846, + 1848, 1853, 1847, 1840, 1837, 1849, 1842, 1843, 1847, 1857, + 1850, 0, 1848, 1851, 1851, 1845, 1850, 1852, 1857, 1846, + 1852, 1853, 1856, 1849, 1854, 1854, 1858, 1856, 1859, 1859, + 1860, 1861, 1858, 1861, 1862, 1863, 1864, 1862, 1865, 1866, + + 1867, 1868, 1860, 1869, 1872, 1867, 1868, 1870, 1871, 1872, + 1874, 1873, 1869, 1877, 0, 1863, 1865, 1866, 1864, 1870, + 1873, 1876, 1875, 1871, 1878, 1878, 1876, 1875, 1877, 1879, + 1874, 1880, 1882, 1873, 1875, 1879, 1883, 1884, 1885, 1886, + 1887, 1957, 1887, 1892, 1888, 1889, 1889, 1895, 1882, 1890, + 1890, 1896, 1880, 1897, 1885, 1883, 1884, 1957, 1888, 1886, + 1888, 1891, 1891, 1892, 1893, 1893, 1894, 1894, 1895, 1898, + 1898, 1899, 1896, 1900, 1897, 1899, 1903, 1901, 1904, 1900, + 1901, 1905, 1903, 1906, 1907, 1910, 1908, 1905, 1906, 1908, + 1909, 1909, 1911, 1912, 1912, 1913, 1904, 1911, 1914, 1915, + + 1921, 1916, 1917, 1917, 1915, 1910, 1916, 1918, 1919, 1907, + 1913, 1920, 1918, 1922, 1919, 1923, 1924, 1925, 1926, 1914, + 1921, 1927, 1924, 1920, 1920, 1920, 1932, 1928, 1927, 1931, + 1920, 1922, 1928, 1935, 1930, 1923, 1934, 1925, 1926, 1930, + 1930, 1932, 1933, 1931, 1933, 1936, 1937, 1934, 1935, 1938, + 1939, 1936, 1940, 1940, 1941, 1937, 1942, 1942, 1943, 1944, + 1945, 1945, 1946, 1946, 1947, 1950, 1950, 1951, 1952, 1938, + 1954, 1939, 1955, 1958, 1958, 1959, 1956, 1952, 1943, 1954, + 1941, 1944, 1956, 1960, 1947, 1963, 1962, 1961, 1964, 1964, + 1965, 1966, 1951, 1955, 1961, 1962, 1959, 1968, 1960, 1969, + + 1970, 1971, 1972, 1968, 1969, 1976, 1970, 1966, 1973, 1972, + 1974, 1963, 1974, 1977, 1973, 1979, 1965, 1978, 1978, 1977, + 1979, 1971, 1980, 1981, 1976, 1982, 1984, 1983, 1985, 1984, + 1986, 1980, 1987, 1986, 1988, 1989, 1989, 1990, 1981, 1992, + 1985, 1991, 1993, 1990, 1994, 1982, 1983, 1991, 1994, 1996, + 1987, 1997, 2000, 1998, 1999, 1999, 2001, 1993, 1998, 1992, + 1988, 2004, 2002, 2005, 1994, 2006, 2006, 2005, 2007, 1996, + 2008, 2009, 2009, 1997, 2007, 2001, 2000, 2002, 2010, 2008, + 2004, 2011, 2010, 2012, 2012, 2013, 2014, 2021, 2015, 2016, + 2017, 2018, 2011, 2019, 2016, 2020, 2024, 2011, 2023, 2022, + + 2014, 2020, 2031, 2023, 2027, 2021, 2013, 2015, 2027, 2024, + 2017, 2018, 2029, 2019, 2022, 2025, 2025, 2026, 2026, 2030, + 2032, 2029, 2031, 2033, 2033, 2032, 2035, 2035, 2036, 2040, + 2030, 2037, 2039, 2036, 2036, 2030, 2041, 2037, 2039, 2042, + 2043, 2041, 2045, 2046, 2047, 2049, 2043, 2046, 2048, 2048, + 2051, 2042, 2050, 2052, 2045, 2040, 2047, 2054, 2050, 2052, + 2053, 2053, 2055, 2056, 2060, 2057, 2059, 2069, 2056, 2061, + 2049, 2068, 2051, 2069, 2061, 0, 2054, 2057, 2059, 2063, + 2063, 2064, 2055, 2060, 2064, 2065, 2065, 2066, 2066, 2067, + 2067, 2068, 2070, 2073, 2071, 2072, 2076, 2076, 2070, 2071, + + 2075, 2072, 2073, 2078, 2079, 2075, 2078, 2080, 2080, 2082, + 2083, 2086, 2084, 2085, 2085, 2091, 2079, 2084, 2087, 2088, + 2086, 2082, 2083, 2087, 2088, 2089, 2090, 2090, 2089, 2092, + 2093, 2094, 2095, 2098, 2096, 2091, 2095, 2097, 2092, 2096, + 2099, 2100, 2101, 2097, 2104, 2103, 2103, 2107, 2093, 2099, + 2094, 2098, 2105, 2111, 2106, 2113, 2101, 2103, 2110, 2100, + 2109, 2105, 2104, 2106, 2108, 2108, 2112, 2107, 2113, 2109, + 2110, 2112, 2116, 2116, 2111, 2118, 2119, 2120, 2118, 2121, + 2124, 2123, 2125, 2126, 2127, 2127, 2129, 2128, 2125, 2128, + 2130, 2130, 2119, 2120, 2124, 2121, 2123, 2131, 2133, 2133, + + 2126, 2134, 2134, 2136, 2129, 2131, 2137, 2138, 2139, 2140, + 2141, 2142, 2137, 2138, 2143, 2143, 2140, 2145, 2144, 2144, + 2150, 2146, 2139, 2147, 2148, 2149, 2136, 2144, 2154, 2152, + 2157, 2142, 2141, 2146, 2151, 2147, 2153, 2149, 2145, 2148, + 2158, 2153, 2153, 2151, 2152, 2159, 2150, 2155, 2162, 2155, + 2157, 2154, 2161, 2155, 2160, 2160, 2163, 2159, 2165, 2163, + 2164, 2169, 2167, 2158, 2175, 2164, 2155, 2167, 2162, 2168, + 2161, 2168, 2170, 2171, 2173, 2176, 2177, 2170, 2165, 2169, + 2171, 2179, 2175, 2173, 2176, 2178, 2180, 2178, 2177, 2182, + 2183, 2182, 2180, 2184, 2184, 2185, 2186, 2187, 2188, 2187, + + 2179, 2186, 2189, 2188, 2183, 2190, 2191, 2189, 2192, 2193, + 2196, 2194, 2195, 2197, 2200, 2193, 2194, 2201, 2197, 2197, + 2202, 2185, 2196, 2190, 2191, 2195, 2198, 2205, 2192, 2203, + 2203, 2201, 2202, 2200, 2198, 2204, 2204, 2206, 2205, 2207, + 2208, 2210, 2209, 2210, 2211, 2212, 2208, 2209, 2213, 2213, + 2219, 2214, 2206, 2212, 2215, 2215, 2216, 2216, 2217, 2207, + 2218, 2212, 2211, 2214, 2222, 2218, 2221, 2217, 2219, 2223, + 2221, 2223, 2224, 2222, 2225, 2226, 2222, 2227, 2228, 2225, + 2225, 2235, 2230, 2231, 2232, 2234, 2227, 2226, 2231, 2232, + 2228, 2236, 2238, 2224, 2230, 2237, 2237, 2239, 2234, 2240, + + 2236, 2235, 2241, 2242, 2245, 2243, 2244, 2249, 2247, 2245, + 2238, 2248, 2259, 2252, 2253, 2239, 2261, 2240, 2241, 2243, + 2247, 2244, 2252, 2248, 2250, 2251, 2260, 2249, 2242, 2250, + 2251, 2256, 2253, 2258, 2261, 2259, 2262, 2256, 2263, 2258, + 2265, 2260, 2264, 2264, 2266, 2266, 2267, 2263, 2268, 2265, + 2256, 2269, 2270, 2271, 2273, 2269, 2274, 2270, 2275, 2277, + 0, 2262, 2274, 2276, 2267, 2277, 2271, 2268, 2276, 2276, + 2278, 2279, 2282, 2273, 2279, 2281, 2278, 2285, 2285, 2287, + 2275, 2286, 2286, 2281, 2288, 2288, 2289, 2289, 2287, 2290, + 2291, 2293, 2282, 2294, 2295, 2295, 2286, 2293, 2294, 2296, + + 2296, 2290, 2300, 2301, 2297, 2298, 2300, 2286, 2291, 2297, + 2302, 2298, 2303, 2305, 2302, 2306, 2307, 2309, 2308, 2310, + 2306, 2312, 2309, 2301, 2311, 2313, 2314, 2315, 2315, 2317, + 2313, 2316, 2303, 2308, 2319, 2316, 2320, 2310, 2305, 2307, + 2311, 2312, 2318, 2321, 2317, 2322, 2323, 2318, 2314, 2324, + 2325, 2326, 2319, 2330, 2324, 2327, 2327, 2322, 2329, 2331, + 2332, 2321, 2320, 2325, 2333, 2323, 2329, 2334, 2337, 2326, + 2335, 2336, 2330, 2338, 2344, 2339, 2347, 2343, 2331, 2332, + 2337, 2339, 2341, 2346, 0, 2346, 2352, 2333, 2344, 2335, + 2343, 2334, 2336, 2345, 2338, 2351, 2347, 2341, 2349, 2345, + + 2348, 2348, 2350, 2349, 2353, 2350, 2354, 2357, 2351, 2357, + 2352, 2355, 2355, 2356, 2356, 2358, 2358, 2359, 2353, 2354, + 2360, 2361, 2362, 2362, 2364, 2364, 2362, 2365, 2365, 2366, + 2366, 2367, 2359, 2373, 2361, 2360, 2368, 2368, 2369, 2369, + 2367, 2370, 2372, 2367, 2374, 2375, 2370, 2372, 2376, 2376, + 2377, 2377, 2378, 2373, 2379, 2379, 2380, 2375, 2381, 2381, + 2382, 2383, 2384, 2384, 2374, 2386, 2383, 2385, 2385, 2387, + 2388, 2378, 2389, 2390, 2380, 2382, 2392, 2394, 2387, 2386, + 2396, 2392, 2393, 2393, 2395, 2395, 2389, 2388, 2397, 2398, + 2402, 2399, 2390, 2397, 2399, 2398, 2394, 2403, 2396, 2400, + + 2400, 2401, 2401, 2404, 2406, 2404, 2407, 2408, 2408, 2402, + 2409, 2411, 2403, 2412, 2413, 2400, 2409, 2414, 2415, 2406, + 2416, 2416, 2415, 2417, 2418, 2407, 2419, 2423, 2412, 2418, + 2420, 2411, 2414, 2422, 2422, 2425, 2424, 2413, 2426, 2427, + 2428, 2419, 2417, 2424, 2429, 2420, 2432, 2423, 2432, 2425, + 2430, 2430, 2431, 2436, 2435, 2428, 2426, 2427, 2437, 2433, + 2435, 2431, 2433, 2437, 2438, 2436, 2439, 2440, 2441, 2438, + 2429, 2442, 2443, 2445, 2451, 2448, 2442, 2433, 2445, 2433, + 2440, 2446, 2447, 2456, 0, 2452, 2446, 2447, 2449, 2441, + 2448, 2439, 2454, 2450, 2449, 2451, 2453, 2454, 2443, 2450, + + 2452, 2455, 2453, 2457, 2458, 2459, 2455, 2458, 2456, 2460, + 2461, 2462, 2463, 2464, 2469, 2471, 2457, 2465, 2460, 2461, + 2462, 2463, 2466, 2465, 2472, 2459, 2467, 2464, 2466, 2481, + 2467, 2473, 2473, 2472, 2469, 2471, 2474, 2475, 2475, 2476, + 2477, 2477, 2474, 2479, 2478, 2481, 2475, 2484, 2476, 2478, + 2482, 2483, 2483, 2488, 2493, 2485, 2487, 2489, 2490, 2493, + 2494, 2495, 2484, 2479, 2485, 2479, 2482, 0, 2487, 2488, + 2490, 2492, 2489, 2495, 2492, 2496, 2496, 2497, 2497, 2501, + 2494, 2499, 2499, 2500, 2501, 2502, 2500, 2503, 2504, 2505, + 2505, 2502, 2506, 2503, 2507, 2507, 2508, 2504, 2509, 2510, + + 2511, 2511, 2513, 2512, 2521, 2514, 2506, 2516, 2508, 2512, + 2514, 2516, 2509, 2521, 2517, 2522, 2513, 2517, 2510, 2518, + 2518, 2519, 2520, 2523, 2522, 2524, 2519, 2520, 2526, 2524, + 2525, 2525, 2528, 2529, 2530, 2531, 2532, 2528, 2533, 2534, + 2535, 2526, 2533, 2523, 2539, 2535, 2536, 2538, 2538, 2540, + 2532, 2537, 2536, 2529, 2530, 2531, 2541, 2537, 2542, 2534, + 2543, 2546, 2539, 2542, 2544, 2544, 2547, 2548, 2540, 2583, + 2549, 2550, 2548, 2546, 2583, 2541, 2549, 2550, 2551, 2554, + 2556, 2543, 2547, 2552, 2557, 2552, 2551, 2564, 2554, 2558, + 2558, 2624, 2559, 2624, 2556, 2559, 2560, 2560, 2557, 2562, + + 2563, 2569, 2562, 2563, 2565, 2565, 2568, 2569, 2570, 2572, + 2568, 2571, 2571, 2564, 2575, 2575, 2577, 2579, 2572, 2580, + 2570, 2584, 2585, 2586, 2587, 2588, 2588, 2596, 2586, 2587, + 2592, 2579, 2590, 2590, 2577, 2580, 2592, 2593, 2594, 2594, + 2595, 2597, 2599, 2585, 2605, 2600, 2597, 2584, 2600, 2596, + 2601, 2602, 2603, 2603, 2610, 2606, 2595, 2593, 2609, 2607, + 2605, 2599, 2601, 2602, 2606, 2607, 2608, 2612, 2612, 2610, + 2613, 2614, 2608, 2613, 2615, 2620, 2609, 2617, 2617, 2618, + 2618, 2619, 2621, 2622, 2623, 2625, 2619, 2626, 2627, 2623, + 2614, 2621, 2615, 2620, 2629, 2630, 2622, 2628, 2631, 2625, + + 2627, 2626, 2628, 2631, 2632, 2632, 2633, 2633, 2634, 2634, + 2635, 2635, 2636, 2637, 2629, 2630, 2638, 2639, 2639, 2640, + 2640, 2638, 2641, 2641, 2636, 2642, 2643, 2644, 2645, 2646, + 0, 2637, 2649, 2647, 2648, 2648, 2652, 2642, 2657, 2644, + 2650, 2650, 2651, 2651, 2653, 2653, 2643, 2652, 2645, 2647, + 2646, 2649, 2654, 2655, 2656, 2659, 2658, 2660, 2657, 2662, + 2655, 2658, 2661, 2661, 2654, 2664, 2656, 2665, 2662, 2663, + 2663, 2666, 2667, 2669, 2668, 2659, 2670, 2660, 2670, 2677, + 2671, 2672, 2672, 2674, 2666, 2673, 2675, 2665, 2668, 2678, + 2679, 2664, 2671, 2681, 2673, 2669, 2667, 2677, 2674, 2680, + + 2682, 2675, 2680, 2683, 2691, 2682, 2693, 2681, 2683, 2684, + 2684, 2678, 2692, 2679, 2685, 2685, 2686, 2686, 2688, 2688, + 2690, 2690, 2691, 2692, 2694, 2693, 2696, 2697, 2698, 2699, + 2704, 2700, 2701, 2702, 2703, 2702, 0, 2705, 2711, 2694, + 2700, 2706, 2706, 2708, 2710, 2697, 2696, 2708, 2704, 2699, + 2698, 2717, 2701, 2712, 2703, 2705, 2709, 2709, 2710, 2715, + 2711, 2718, 2712, 2713, 2713, 2716, 2716, 2719, 2715, 2717, + 2720, 2721, 2722, 2723, 2725, 2726, 2724, 2720, 2729, 2718, + 2727, 2727, 2726, 2728, 2728, 2719, 2721, 2730, 2731, 2736, + 2722, 2723, 2724, 2725, 2731, 2733, 2733, 2735, 2729, 2734, + + 2734, 2737, 2738, 2735, 2739, 2730, 2740, 2736, 2741, 2742, + 2742, 2743, 2744, 2741, 2745, 2746, 2747, 2738, 0, 2737, + 2740, 2754, 2748, 2739, 2750, 2750, 2746, 2748, 2749, 2759, + 2749, 2743, 2744, 2751, 2745, 2751, 2747, 2752, 2752, 2756, + 2754, 2757, 2758, 2762, 2766, 2760, 2761, 2763, 2756, 2759, + 2760, 2761, 2767, 2768, 2758, 2771, 2768, 2769, 2769, 2770, + 2757, 2772, 2772, 2762, 2766, 2773, 2763, 2774, 2775, 2777, + 2767, 2778, 2775, 2771, 2770, 2779, 2773, 2781, 2781, 2780, + 2782, 2779, 2774, 2780, 2777, 2784, 2778, 2785, 2786, 2787, + 2787, 2789, 2790, 2782, 2791, 2792, 2792, 2794, 2791, 2798, + + 2784, 2790, 2799, 2789, 2793, 2793, 2796, 2785, 2786, 2795, + 2795, 2796, 2797, 2800, 2799, 2798, 2794, 2801, 2801, 2806, + 2806, 2797, 2807, 2808, 2808, 2809, 2810, 2811, 2812, 2815, + 2815, 2816, 2813, 2800, 2814, 2817, 2828, 2812, 2809, 2810, + 2811, 2813, 2822, 2814, 2807, 2819, 2819, 2822, 2824, 2825, + 2817, 2816, 2826, 2824, 2827, 2828, 2829, 2826, 2830, 2832, + 2836, 2840, 2827, 2825, 2834, 2829, 2830, 2835, 2839, 2834, + 2837, 2837, 2835, 2839, 2832, 2836, 2838, 2838, 2841, 2841, + 2840, 2842, 2843, 2844, 2845, 2846, 0, 2843, 2842, 2847, + 2849, 2846, 2848, 2848, 2847, 2850, 2851, 2851, 2852, 2852, + + 2850, 2844, 2845, 2855, 2858, 2849, 2856, 2856, 2857, 2858, + 2858, 2857, 2859, 2860, 2861, 2862, 2855, 2859, 2860, 2863, + 2864, 2862, 2865, 2863, 2866, 2864, 2867, 2868, 2861, 2869, + 2870, 2865, 2871, 2872, 2867, 2869, 2870, 2871, 2876, 2866, + 2873, 2873, 2875, 2876, 2877, 2872, 2879, 2877, 2868, 2875, + 2881, 2882, 2883, 2884, 2885, 2881, 2882, 2883, 2879, 2886, + 2887, 2888, 2888, 2889, 2893, 2890, 2898, 2885, 2886, 2887, + 2890, 2884, 2889, 2894, 2895, 2899, 2900, 0, 2901, 2894, + 2895, 2903, 2893, 2902, 2902, 2898, 2904, 2909, 2903, 2906, + 2907, 2908, 2908, 2910, 2912, 2899, 2900, 2901, 2906, 2907, + + 2911, 2911, 2909, 2914, 2916, 2904, 2917, 2919, 2910, 2920, + 2917, 2918, 2918, 2912, 2921, 2920, 2922, 2923, 2914, 2925, + 2921, 2924, 2924, 2923, 2916, 2926, 2927, 2925, 2929, 2930, + 2932, 2927, 2919, 2935, 2922, 2933, 2932, 2929, 2933, 2934, + 2936, 2938, 2930, 2934, 2937, 2937, 2940, 2940, 2941, 0, + 2926, 2935, 2942, 2942, 2936, 2948, 2938, 2943, 2943, 2945, + 2945, 2946, 2947, 2952, 2948, 2946, 2941, 2947, 2950, 2950, + 2953, 2955, 2954, 2956, 2958, 2953, 2955, 2955, 2959, 2959, + 2961, 2961, 2965, 2952, 2954, 2956, 2962, 2962, 2963, 2963, + 2964, 2966, 2969, 2964, 2958, 2965, 2968, 2968, 2971, 2972, + + 2972, 2973, 2973, 2977, 2966, 2974, 2974, 2975, 2976, 2976, + 2969, 2978, 2979, 2980, 2981, 2981, 2977, 2982, 2971, 2980, + 2986, 2982, 2975, 2989, 2985, 2986, 2979, 2988, 2990, 2978, + 2985, 2991, 2988, 2988, 2992, 2993, 2994, 3004, 2995, 3001, + 2992, 2993, 2995, 2996, 2996, 2999, 2989, 3001, 2990, 3002, + 2999, 2991, 3002, 3005, 3006, 3006, 3005, 3007, 3008, 3009, + 3010, 2994, 3004, 3008, 3011, 3012, 3012, 3013, 3014, 3015, + 3016, 3014, 0, 3021, 3007, 3007, 3017, 3009, 3011, 3014, + 3010, 3013, 3019, 3015, 3017, 3020, 3031, 3019, 3019, 3016, + 3020, 3020, 3021, 3022, 3022, 3023, 3023, 3024, 3024, 3025, + + 3025, 3026, 3026, 3027, 3027, 3028, 3029, 3030, 3032, 3033, + 3034, 3029, 3031, 3035, 3033, 3036, 3037, 3038, 3035, 3039, + 3043, 3028, 3032, 3043, 3036, 3041, 3041, 3030, 3044, 3034, + 3042, 3042, 3045, 3045, 3046, 3047, 3037, 3038, 3050, 3039, + 3046, 3049, 3049, 3044, 3052, 3050, 3051, 3051, 3055, 3052, + 3054, 3054, 3056, 3047, 3057, 3058, 3060, 3055, 3061, 3061, + 3064, 3056, 3065, 3057, 3058, 3062, 3062, 3063, 3066, 3064, + 3067, 3063, 3068, 3071, 3060, 3072, 3073, 3069, 3083, 3066, + 3073, 3065, 3069, 3069, 3072, 3067, 3071, 3079, 3077, 3078, + 3078, 3082, 3068, 3077, 3081, 3081, 3084, 3086, 3086, 3087, + + 3088, 3079, 3092, 3083, 3093, 3082, 3094, 3097, 3087, 3093, + 3096, 3099, 3088, 3097, 3084, 3094, 3101, 3103, 3110, 3104, + 3105, 3105, 3103, 3099, 3104, 3106, 3108, 3092, 3109, 3116, + 3096, 3108, 3110, 3117, 3106, 3111, 3111, 3101, 3116, 3111, + 3118, 3109, 3113, 3113, 3114, 3114, 3115, 3115, 3125, 3119, + 3121, 3126, 3122, 3117, 3119, 3123, 3121, 3122, 3127, 3118, + 3123, 3124, 3124, 3126, 3128, 3129, 3125, 3130, 3131, 3128, + 3132, 3132, 3134, 3130, 3139, 3135, 3134, 3136, 3138, 3127, + 3135, 3140, 3136, 3129, 3137, 3137, 3142, 3144, 3144, 3139, + 3146, 3147, 3148, 3131, 3149, 3151, 3140, 3138, 3149, 3150, + + 3152, 3153, 3154, 3146, 3147, 3148, 3142, 3154, 3150, 3153, + 3155, 3151, 3156, 3156, 3157, 3158, 3159, 3160, 3160, 3152, + 3161, 3161, 3162, 3157, 3166, 3171, 3165, 3175, 3168, 3176, + 3155, 3165, 3165, 3158, 3168, 3169, 3169, 3178, 3166, 3173, + 3173, 3162, 3159, 3175, 3177, 3176, 3171, 3179, 3183, 3177, + 3182, 3182, 3179, 3178, 3184, 3185, 3186, 3187, 3187, 3188, + 3191, 3185, 3192, 3184, 3190, 3190, 3193, 3193, 3183, 3195, + 3197, 3198, 3201, 3204, 3191, 3195, 3205, 3198, 3188, 3186, + 3199, 3192, 3202, 3202, 3207, 3199, 3203, 3203, 3204, 3208, + 3197, 3206, 3206, 3209, 3201, 3207, 3205, 3210, 3208, 3211, + + 3212, 3213, 3215, 3210, 3214, 3214, 3216, 3217, 3222, 3216, + 3217, 3206, 3212, 3209, 3218, 3218, 3223, 3215, 3211, 3224, + 3222, 3213, 3225, 3225, 3226, 3224, 3227, 3226, 3228, 3230, + 3231, 3231, 3227, 3232, 3230, 3233, 3223, 3234, 3232, 3235, + 3236, 3236, 3239, 3234, 3240, 3241, 3228, 3238, 3242, 3242, + 3244, 3243, 3245, 3496, 3233, 3496, 3235, 3235, 3241, 3238, + 3239, 3245, 3247, 3247, 3248, 3248, 3244, 3249, 3249, 3240, + 3243, 3250, 3251, 3252, 3253, 3253, 3250, 3257, 3252, 3254, + 3254, 3255, 3255, 3256, 3256, 3258, 3251, 3259, 3264, 3260, + 3257, 3263, 3263, 3259, 3260, 3266, 3266, 3267, 3267, 3269, + + 3271, 3272, 3273, 3274, 3264, 3275, 3275, 3277, 3277, 3278, + 3279, 3258, 3280, 3282, 3287, 3283, 3284, 3284, 3269, 3285, + 3285, 3273, 3271, 3272, 3283, 3274, 3280, 3289, 3288, 3279, + 3290, 3291, 3287, 3282, 3288, 3278, 3291, 3294, 3295, 3295, + 3297, 3297, 3299, 3298, 3300, 3301, 3302, 3289, 3298, 3290, + 3300, 3303, 3303, 3308, 3302, 3304, 3299, 3301, 3294, 3306, + 3304, 3307, 3309, 3306, 3310, 3311, 3307, 3314, 3312, 3310, + 3315, 3316, 3317, 3308, 3312, 3314, 3319, 3311, 3322, 3320, + 3321, 3323, 3309, 3325, 3326, 3328, 3323, 3327, 3325, 3315, + 3328, 3316, 3317, 3327, 3319, 3320, 3330, 3321, 3321, 3322, + + 3331, 3332, 3345, 3331, 3326, 3336, 3336, 3337, 3337, 3338, + 3343, 3343, 3344, 3338, 3332, 3348, 3330, 3344, 3346, 3346, + 0, 3345, 3351, 3351, 3352, 3352, 3361, 3352, 3353, 3353, + 3348, 3353, 3354, 3354, 3355, 3355, 3356, 3355, 3358, 3359, + 3356, 3360, 3360, 3358, 3361, 3362, 3365, 3365, 3359, 3366, + 3367, 3368, 3369, 3369, 3370, 3373, 3368, 3374, 3375, 3362, + 3377, 3379, 3375, 3376, 3374, 0, 3380, 3381, 3381, 3366, + 3367, 3380, 3376, 3382, 3370, 3377, 3383, 3383, 3386, 3379, + 3373, 3391, 3382, 3384, 3384, 3385, 3385, 3387, 3388, 3389, + 3390, 3393, 3387, 3386, 3389, 3389, 3390, 3388, 3392, 3394, + + 3388, 3396, 3395, 0, 3394, 3398, 3391, 3395, 3397, 3397, + 3399, 3398, 3393, 3392, 3400, 3400, 3399, 3401, 3401, 3402, + 3396, 3403, 3406, 3406, 3408, 3408, 3403, 3409, 3411, 3413, + 3413, 3414, 3414, 3422, 3402, 0, 3409, 3415, 3415, 3416, + 3416, 3418, 3418, 3419, 3419, 3424, 3411, 3420, 3420, 3421, + 3421, 3425, 3425, 3427, 3424, 3426, 3426, 3428, 3429, 3422, + 3431, 3431, 3427, 3432, 3433, 3433, 3434, 3435, 3444, 3428, + 3440, 3436, 3437, 3437, 3438, 3438, 3441, 3441, 3429, 3446, + 3435, 3434, 3432, 3436, 3445, 3440, 3444, 3445, 3447, 3447, + 3448, 3450, 3451, 3452, 3450, 3453, 3454, 3456, 3451, 3455, + + 3453, 3459, 3462, 3458, 3463, 3446, 3462, 3452, 3448, 3458, + 3459, 3466, 3467, 3456, 3480, 3454, 3476, 3455, 3486, 3463, + 3477, 3476, 3489, 3477, 3481, 3481, 3487, 3480, 3482, 3482, + 3484, 3484, 3467, 3491, 3488, 3487, 3493, 3466, 3488, 3494, + 3495, 3486, 3489, 3497, 3499, 3495, 3500, 3491, 3498, 3498, + 3494, 3501, 3502, 3503, 3505, 3504, 3507, 3499, 3497, 3493, + 3506, 3507, 3508, 3505, 3512, 3500, 3509, 3510, 3502, 3501, + 3504, 3509, 3506, 3511, 3511, 3513, 3517, 3518, 3503, 3520, + 3513, 3519, 3519, 3508, 3512, 3525, 3510, 3526, 3520, 3530, + 3517, 3521, 3521, 3522, 3522, 3523, 3523, 3518, 3524, 3524, + + 3527, 3528, 3531, 3527, 3525, 3529, 3528, 3526, 3533, 3532, + 3529, 3534, 3537, 3535, 3530, 3532, 3542, 3531, 3535, 3536, + 3536, 3543, 3533, 3534, 3538, 3538, 3539, 3539, 3541, 3541, + 3546, 3542, 3537, 3544, 3544, 3548, 3551, 3551, 3552, 3552, + 3543, 3553, 3554, 3557, 3555, 3546, 3556, 3558, 3559, 3553, + 3555, 3560, 3556, 3548, 3561, 3561, 3560, 3557, 3563, 3563, + 3558, 3554, 3567, 3570, 3568, 3571, 3573, 3559, 3574, 3571, + 3575, 3578, 3576, 3574, 3577, 3579, 3580, 3570, 3581, 3581, + 3579, 3580, 3584, 3567, 3568, 3576, 3573, 3577, 3585, 3575, + 3578, 3586, 3587, 3587, 3588, 3589, 3590, 3590, 3591, 3588, + + 3592, 3589, 3584, 3591, 3593, 3592, 3585, 3594, 3595, 3593, + 3586, 3597, 3597, 3598, 3595, 3599, 3599, 3601, 3598, 3602, + 3603, 3601, 3604, 3605, 3606, 3607, 3594, 3603, 3610, 3610, + 3606, 3613, 3608, 3612, 3612, 3615, 3616, 3617, 3602, 3622, + 3613, 3604, 3605, 3613, 3607, 3608, 3614, 3618, 3618, 3620, + 3617, 3614, 3619, 3624, 3615, 3616, 3629, 3619, 3623, 3623, + 3625, 3625, 3620, 3626, 3626, 3622, 3627, 3628, 3630, 3630, + 0, 3627, 3624, 3631, 3628, 3629, 3634, 3632, 3631, 3632, + 3633, 3633, 3635, 3634, 3636, 3637, 3638, 3640, 3640, 3635, + 3637, 3641, 3643, 3644, 3645, 3646, 3650, 3643, 3644, 3647, + + 3647, 3649, 3649, 3636, 3651, 3638, 3652, 3652, 3653, 3653, + 3641, 3654, 3664, 3645, 3646, 3650, 3656, 3656, 3654, 3657, + 3657, 3658, 3660, 3651, 3663, 3665, 0, 3660, 3658, 3663, + 0, 3664, 3666, 3666, 3667, 3667, 0, 0, 0, 0, + 0, 0, 0, 0, 3665, 3671, 3671, 3671, 3671, 3671, + 3671, 3671, 3672, 3672, 3672, 3672, 3672, 3672, 3672, 3673, + 3673, 3673, 3673, 3673, 3673, 3673, 3674, 3674, 3674, 3674, + 3674, 3674, 3674, 3675, 3675, 3675, 3675, 3675, 3675, 3675, + 3676, 3676, 3676, 3676, 3676, 3676, 3676, 3677, 3677, 3677, + 3677, 3677, 3677, 3677, 3679, 3679, 0, 3679, 3679, 3679, + + 3679, 3680, 3680, 0, 0, 0, 3680, 3680, 3681, 3681, + 0, 0, 3681, 0, 3681, 3682, 0, 0, 0, 0, + 0, 3682, 3683, 3683, 0, 0, 0, 3683, 3683, 3684, + 0, 0, 0, 0, 0, 3684, 3685, 3685, 0, 3685, + 3685, 3685, 3685, 3686, 0, 0, 0, 0, 0, 3686, + 3687, 3687, 0, 0, 0, 3687, 3687, 3688, 3688, 0, + 3688, 3688, 3688, 3688, 3670, 3670, 3670, 3670, 3670, 3670, + 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, + 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, + 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, + + 3670, 3670, 3670, 3670, 3670 } ; static yy_state_type yy_last_accepting_state; @@ -3410,7 +3425,7 @@ static void config_end_include(void) } #endif -#line 3412 "" +#line 3427 "" #define YY_NO_INPUT 1 #line 191 "./util/configlexer.lex" #ifndef YY_NO_UNPUT @@ -3419,9 +3434,9 @@ static void config_end_include(void) #ifndef YY_NO_INPUT #define YY_NO_INPUT 1 #endif -#line 3421 "" +#line 3436 "" -#line 3423 "" +#line 3438 "" #define INITIAL 0 #define quotedstring 1 @@ -3645,7 +3660,7 @@ YY_DECL { #line 211 "./util/configlexer.lex" -#line 3647 "" +#line 3662 "" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -3678,13 +3693,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3653 ) + if ( yy_current_state >= 3671 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 7121 ); + while ( yy_base[yy_current_state] != 7165 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -5428,40 +5443,45 @@ YY_RULE_SETUP { YDVAR(1, VAR_EDE ) } YY_BREAK case 342: -/* rule 342 can match eol */ YY_RULE_SETUP #line 567 "./util/configlexer.lex" +{ YDVAR(1, VAR_PROXY_PROTOCOL_PORT) } + YY_BREAK +case 343: +/* rule 343 can match eol */ +YY_RULE_SETUP +#line 568 "./util/configlexer.lex" { LEXOUT(("NL\n")); cfg_parser->line++; } YY_BREAK /* Quoted strings. Strip leading and ending quotes */ -case 343: +case 344: YY_RULE_SETUP -#line 570 "./util/configlexer.lex" +#line 571 "./util/configlexer.lex" { BEGIN(quotedstring); LEXOUT(("QS ")); } YY_BREAK case YY_STATE_EOF(quotedstring): -#line 571 "./util/configlexer.lex" +#line 572 "./util/configlexer.lex" { yyerror("EOF inside quoted string"); if(--num_args == 0) { BEGIN(INITIAL); } else { BEGIN(val); } } YY_BREAK -case 344: -YY_RULE_SETUP -#line 576 "./util/configlexer.lex" -{ LEXOUT(("STR(%s) ", yytext)); yymore(); } - YY_BREAK case 345: -/* rule 345 can match eol */ YY_RULE_SETUP #line 577 "./util/configlexer.lex" +{ LEXOUT(("STR(%s) ", yytext)); yymore(); } + YY_BREAK +case 346: +/* rule 346 can match eol */ +YY_RULE_SETUP +#line 578 "./util/configlexer.lex" { yyerror("newline inside quoted string, no end \""); cfg_parser->line++; BEGIN(INITIAL); } YY_BREAK -case 346: +case 347: YY_RULE_SETUP -#line 579 "./util/configlexer.lex" +#line 580 "./util/configlexer.lex" { LEXOUT(("QE ")); if(--num_args == 0) { BEGIN(INITIAL); } @@ -5474,34 +5494,34 @@ YY_RULE_SETUP } YY_BREAK /* Single Quoted strings. Strip leading and ending quotes */ -case 347: +case 348: YY_RULE_SETUP -#line 591 "./util/configlexer.lex" +#line 592 "./util/configlexer.lex" { BEGIN(singlequotedstr); LEXOUT(("SQS ")); } YY_BREAK case YY_STATE_EOF(singlequotedstr): -#line 592 "./util/configlexer.lex" +#line 593 "./util/configlexer.lex" { yyerror("EOF inside quoted string"); if(--num_args == 0) { BEGIN(INITIAL); } else { BEGIN(val); } } YY_BREAK -case 348: -YY_RULE_SETUP -#line 597 "./util/configlexer.lex" -{ LEXOUT(("STR(%s) ", yytext)); yymore(); } - YY_BREAK case 349: -/* rule 349 can match eol */ YY_RULE_SETUP #line 598 "./util/configlexer.lex" +{ LEXOUT(("STR(%s) ", yytext)); yymore(); } + YY_BREAK +case 350: +/* rule 350 can match eol */ +YY_RULE_SETUP +#line 599 "./util/configlexer.lex" { yyerror("newline inside quoted string, no end '"); cfg_parser->line++; BEGIN(INITIAL); } YY_BREAK -case 350: +case 351: YY_RULE_SETUP -#line 600 "./util/configlexer.lex" +#line 601 "./util/configlexer.lex" { LEXOUT(("SQE ")); if(--num_args == 0) { BEGIN(INITIAL); } @@ -5514,38 +5534,38 @@ YY_RULE_SETUP } YY_BREAK /* include: directive */ -case 351: +case 352: YY_RULE_SETUP -#line 612 "./util/configlexer.lex" +#line 613 "./util/configlexer.lex" { LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include); } YY_BREAK case YY_STATE_EOF(include): -#line 614 "./util/configlexer.lex" +#line 615 "./util/configlexer.lex" { yyerror("EOF inside include directive"); BEGIN(inc_prev); } YY_BREAK -case 352: -YY_RULE_SETUP -#line 618 "./util/configlexer.lex" -{ LEXOUT(("ISP ")); /* ignore */ } - YY_BREAK case 353: -/* rule 353 can match eol */ YY_RULE_SETUP #line 619 "./util/configlexer.lex" -{ LEXOUT(("NL\n")); cfg_parser->line++;} +{ LEXOUT(("ISP ")); /* ignore */ } YY_BREAK case 354: +/* rule 354 can match eol */ YY_RULE_SETUP #line 620 "./util/configlexer.lex" -{ LEXOUT(("IQS ")); BEGIN(include_quoted); } +{ LEXOUT(("NL\n")); cfg_parser->line++;} YY_BREAK case 355: YY_RULE_SETUP #line 621 "./util/configlexer.lex" +{ LEXOUT(("IQS ")); BEGIN(include_quoted); } + YY_BREAK +case 356: +YY_RULE_SETUP +#line 622 "./util/configlexer.lex" { LEXOUT(("Iunquotedstr(%s) ", yytext)); config_start_include_glob(yytext, 0); @@ -5553,27 +5573,27 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(include_quoted): -#line 626 "./util/configlexer.lex" +#line 627 "./util/configlexer.lex" { yyerror("EOF inside quoted string"); BEGIN(inc_prev); } YY_BREAK -case 356: -YY_RULE_SETUP -#line 630 "./util/configlexer.lex" -{ LEXOUT(("ISTR(%s) ", yytext)); yymore(); } - YY_BREAK case 357: -/* rule 357 can match eol */ YY_RULE_SETUP #line 631 "./util/configlexer.lex" +{ LEXOUT(("ISTR(%s) ", yytext)); yymore(); } + YY_BREAK +case 358: +/* rule 358 can match eol */ +YY_RULE_SETUP +#line 632 "./util/configlexer.lex" { yyerror("newline before \" in include name"); cfg_parser->line++; BEGIN(inc_prev); } YY_BREAK -case 358: +case 359: YY_RULE_SETUP -#line 633 "./util/configlexer.lex" +#line 634 "./util/configlexer.lex" { LEXOUT(("IQE ")); yytext[yyleng - 1] = '\0'; @@ -5583,7 +5603,7 @@ YY_RULE_SETUP YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(val): -#line 639 "./util/configlexer.lex" +#line 640 "./util/configlexer.lex" { LEXOUT(("LEXEOF ")); yy_set_bol(1); /* Set beginning of line, so "^" rules match. */ @@ -5598,39 +5618,39 @@ case YY_STATE_EOF(val): } YY_BREAK /* include-toplevel: directive */ -case 359: +case 360: YY_RULE_SETUP -#line 653 "./util/configlexer.lex" +#line 654 "./util/configlexer.lex" { LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include_toplevel); } YY_BREAK case YY_STATE_EOF(include_toplevel): -#line 656 "./util/configlexer.lex" +#line 657 "./util/configlexer.lex" { yyerror("EOF inside include_toplevel directive"); BEGIN(inc_prev); } YY_BREAK -case 360: -YY_RULE_SETUP -#line 660 "./util/configlexer.lex" -{ LEXOUT(("ITSP ")); /* ignore */ } - YY_BREAK case 361: -/* rule 361 can match eol */ YY_RULE_SETUP #line 661 "./util/configlexer.lex" -{ LEXOUT(("NL\n")); cfg_parser->line++; } +{ LEXOUT(("ITSP ")); /* ignore */ } YY_BREAK case 362: +/* rule 362 can match eol */ YY_RULE_SETUP #line 662 "./util/configlexer.lex" -{ LEXOUT(("ITQS ")); BEGIN(include_toplevel_quoted); } +{ LEXOUT(("NL\n")); cfg_parser->line++; } YY_BREAK case 363: YY_RULE_SETUP #line 663 "./util/configlexer.lex" +{ LEXOUT(("ITQS ")); BEGIN(include_toplevel_quoted); } + YY_BREAK +case 364: +YY_RULE_SETUP +#line 664 "./util/configlexer.lex" { LEXOUT(("ITunquotedstr(%s) ", yytext)); config_start_include_glob(yytext, 1); @@ -5639,29 +5659,29 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(include_toplevel_quoted): -#line 669 "./util/configlexer.lex" +#line 670 "./util/configlexer.lex" { yyerror("EOF inside quoted string"); BEGIN(inc_prev); } YY_BREAK -case 364: -YY_RULE_SETUP -#line 673 "./util/configlexer.lex" -{ LEXOUT(("ITSTR(%s) ", yytext)); yymore(); } - YY_BREAK case 365: -/* rule 365 can match eol */ YY_RULE_SETUP #line 674 "./util/configlexer.lex" +{ LEXOUT(("ITSTR(%s) ", yytext)); yymore(); } + YY_BREAK +case 366: +/* rule 366 can match eol */ +YY_RULE_SETUP +#line 675 "./util/configlexer.lex" { yyerror("newline before \" in include name"); cfg_parser->line++; BEGIN(inc_prev); } YY_BREAK -case 366: +case 367: YY_RULE_SETUP -#line 678 "./util/configlexer.lex" +#line 679 "./util/configlexer.lex" { LEXOUT(("ITQE ")); yytext[yyleng - 1] = '\0'; @@ -5670,33 +5690,33 @@ YY_RULE_SETUP return (VAR_FORCE_TOPLEVEL); } YY_BREAK -case 367: +case 368: YY_RULE_SETUP -#line 686 "./util/configlexer.lex" +#line 687 "./util/configlexer.lex" { LEXOUT(("unquotedstr(%s) ", yytext)); if(--num_args == 0) { BEGIN(INITIAL); } yylval.str = strdup(yytext); return STRING_ARG; } YY_BREAK -case 368: +case 369: YY_RULE_SETUP -#line 690 "./util/configlexer.lex" +#line 691 "./util/configlexer.lex" { ub_c_error_msg("unknown keyword '%s'", yytext); } YY_BREAK -case 369: +case 370: YY_RULE_SETUP -#line 694 "./util/configlexer.lex" +#line 695 "./util/configlexer.lex" { ub_c_error_msg("stray '%s'", yytext); } YY_BREAK -case 370: +case 371: YY_RULE_SETUP -#line 698 "./util/configlexer.lex" +#line 699 "./util/configlexer.lex" ECHO; YY_BREAK -#line 5698 "" +#line 5718 "" case YY_END_OF_BUFFER: { @@ -5991,7 +6011,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3653 ) + if ( yy_current_state >= 3671 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -6019,11 +6039,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3653 ) + if ( yy_current_state >= 3671 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 3652); + yy_is_jam = (yy_current_state == 3670); return yy_is_jam ? 0 : yy_current_state; } @@ -6662,6 +6682,6 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 698 "./util/configlexer.lex" +#line 699 "./util/configlexer.lex" diff --git a/util/configlexer.lex b/util/configlexer.lex index 4fdb2cde0..5672cb156 100644 --- a/util/configlexer.lex +++ b/util/configlexer.lex @@ -564,6 +564,7 @@ edns-client-string{COLON} { YDVAR(2, VAR_EDNS_CLIENT_STRING) } edns-client-string-opcode{COLON} { YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) } nsid{COLON} { YDVAR(1, VAR_NSID ) } ede{COLON} { YDVAR(1, VAR_EDE ) } +proxy-protocol-port{COLON} { YDVAR(1, VAR_PROXY_PROTOCOL_PORT) } {NEWLINE} { LEXOUT(("NL\n")); cfg_parser->line++; } /* Quoted strings. Strip leading and ending quotes */ diff --git a/util/configparser.c b/util/configparser.c index 3b1e994da..d2b288b09 100644 --- a/util/configparser.c +++ b/util/configparser.c @@ -462,366 +462,368 @@ enum yysymbol_kind_t YYSYMBOL_VAR_INTERFACE_TAG = 332, /* VAR_INTERFACE_TAG */ YYSYMBOL_VAR_INTERFACE_TAG_ACTION = 333, /* VAR_INTERFACE_TAG_ACTION */ YYSYMBOL_VAR_INTERFACE_TAG_DATA = 334, /* VAR_INTERFACE_TAG_DATA */ - YYSYMBOL_YYACCEPT = 335, /* $accept */ - YYSYMBOL_toplevelvars = 336, /* toplevelvars */ - YYSYMBOL_toplevelvar = 337, /* toplevelvar */ - YYSYMBOL_force_toplevel = 338, /* force_toplevel */ - YYSYMBOL_serverstart = 339, /* serverstart */ - YYSYMBOL_contents_server = 340, /* contents_server */ - YYSYMBOL_content_server = 341, /* content_server */ - YYSYMBOL_stubstart = 342, /* stubstart */ - YYSYMBOL_contents_stub = 343, /* contents_stub */ - YYSYMBOL_content_stub = 344, /* content_stub */ - YYSYMBOL_forwardstart = 345, /* forwardstart */ - YYSYMBOL_contents_forward = 346, /* contents_forward */ - YYSYMBOL_content_forward = 347, /* content_forward */ - YYSYMBOL_viewstart = 348, /* viewstart */ - YYSYMBOL_contents_view = 349, /* contents_view */ - YYSYMBOL_content_view = 350, /* content_view */ - YYSYMBOL_authstart = 351, /* authstart */ - YYSYMBOL_contents_auth = 352, /* contents_auth */ - YYSYMBOL_content_auth = 353, /* content_auth */ - YYSYMBOL_rpz_tag = 354, /* rpz_tag */ - YYSYMBOL_rpz_action_override = 355, /* rpz_action_override */ - YYSYMBOL_rpz_cname_override = 356, /* rpz_cname_override */ - YYSYMBOL_rpz_log = 357, /* rpz_log */ - YYSYMBOL_rpz_log_name = 358, /* rpz_log_name */ - YYSYMBOL_rpz_signal_nxdomain_ra = 359, /* rpz_signal_nxdomain_ra */ - YYSYMBOL_rpzstart = 360, /* rpzstart */ - YYSYMBOL_contents_rpz = 361, /* contents_rpz */ - YYSYMBOL_content_rpz = 362, /* content_rpz */ - YYSYMBOL_server_num_threads = 363, /* server_num_threads */ - YYSYMBOL_server_verbosity = 364, /* server_verbosity */ - YYSYMBOL_server_statistics_interval = 365, /* server_statistics_interval */ - YYSYMBOL_server_statistics_cumulative = 366, /* server_statistics_cumulative */ - YYSYMBOL_server_extended_statistics = 367, /* server_extended_statistics */ - YYSYMBOL_server_shm_enable = 368, /* server_shm_enable */ - YYSYMBOL_server_shm_key = 369, /* server_shm_key */ - YYSYMBOL_server_port = 370, /* server_port */ - YYSYMBOL_server_send_client_subnet = 371, /* server_send_client_subnet */ - YYSYMBOL_server_client_subnet_zone = 372, /* server_client_subnet_zone */ - YYSYMBOL_server_client_subnet_always_forward = 373, /* server_client_subnet_always_forward */ - YYSYMBOL_server_client_subnet_opcode = 374, /* server_client_subnet_opcode */ - YYSYMBOL_server_max_client_subnet_ipv4 = 375, /* server_max_client_subnet_ipv4 */ - YYSYMBOL_server_max_client_subnet_ipv6 = 376, /* server_max_client_subnet_ipv6 */ - YYSYMBOL_server_min_client_subnet_ipv4 = 377, /* server_min_client_subnet_ipv4 */ - YYSYMBOL_server_min_client_subnet_ipv6 = 378, /* server_min_client_subnet_ipv6 */ - YYSYMBOL_server_max_ecs_tree_size_ipv4 = 379, /* server_max_ecs_tree_size_ipv4 */ - YYSYMBOL_server_max_ecs_tree_size_ipv6 = 380, /* server_max_ecs_tree_size_ipv6 */ - YYSYMBOL_server_interface = 381, /* server_interface */ - YYSYMBOL_server_outgoing_interface = 382, /* server_outgoing_interface */ - YYSYMBOL_server_outgoing_range = 383, /* server_outgoing_range */ - YYSYMBOL_server_outgoing_port_permit = 384, /* server_outgoing_port_permit */ - YYSYMBOL_server_outgoing_port_avoid = 385, /* server_outgoing_port_avoid */ - YYSYMBOL_server_outgoing_num_tcp = 386, /* server_outgoing_num_tcp */ - YYSYMBOL_server_incoming_num_tcp = 387, /* server_incoming_num_tcp */ - YYSYMBOL_server_interface_automatic = 388, /* server_interface_automatic */ - YYSYMBOL_server_interface_automatic_ports = 389, /* server_interface_automatic_ports */ - YYSYMBOL_server_do_ip4 = 390, /* server_do_ip4 */ - YYSYMBOL_server_do_ip6 = 391, /* server_do_ip6 */ - YYSYMBOL_server_do_udp = 392, /* server_do_udp */ - YYSYMBOL_server_do_tcp = 393, /* server_do_tcp */ - YYSYMBOL_server_prefer_ip4 = 394, /* server_prefer_ip4 */ - YYSYMBOL_server_prefer_ip6 = 395, /* server_prefer_ip6 */ - YYSYMBOL_server_tcp_mss = 396, /* server_tcp_mss */ - YYSYMBOL_server_outgoing_tcp_mss = 397, /* server_outgoing_tcp_mss */ - YYSYMBOL_server_tcp_idle_timeout = 398, /* server_tcp_idle_timeout */ - YYSYMBOL_server_max_reuse_tcp_queries = 399, /* server_max_reuse_tcp_queries */ - YYSYMBOL_server_tcp_reuse_timeout = 400, /* server_tcp_reuse_timeout */ - YYSYMBOL_server_tcp_auth_query_timeout = 401, /* server_tcp_auth_query_timeout */ - YYSYMBOL_server_tcp_keepalive = 402, /* server_tcp_keepalive */ - YYSYMBOL_server_tcp_keepalive_timeout = 403, /* server_tcp_keepalive_timeout */ - YYSYMBOL_server_tcp_upstream = 404, /* server_tcp_upstream */ - YYSYMBOL_server_udp_upstream_without_downstream = 405, /* server_udp_upstream_without_downstream */ - YYSYMBOL_server_ssl_upstream = 406, /* server_ssl_upstream */ - YYSYMBOL_server_ssl_service_key = 407, /* server_ssl_service_key */ - YYSYMBOL_server_ssl_service_pem = 408, /* server_ssl_service_pem */ - YYSYMBOL_server_ssl_port = 409, /* server_ssl_port */ - YYSYMBOL_server_tls_cert_bundle = 410, /* server_tls_cert_bundle */ - YYSYMBOL_server_tls_win_cert = 411, /* server_tls_win_cert */ - YYSYMBOL_server_tls_additional_port = 412, /* server_tls_additional_port */ - YYSYMBOL_server_tls_ciphers = 413, /* server_tls_ciphers */ - YYSYMBOL_server_tls_ciphersuites = 414, /* server_tls_ciphersuites */ - YYSYMBOL_server_tls_session_ticket_keys = 415, /* server_tls_session_ticket_keys */ - YYSYMBOL_server_tls_use_sni = 416, /* server_tls_use_sni */ - YYSYMBOL_server_https_port = 417, /* server_https_port */ - YYSYMBOL_server_http_endpoint = 418, /* server_http_endpoint */ - YYSYMBOL_server_http_max_streams = 419, /* server_http_max_streams */ - YYSYMBOL_server_http_query_buffer_size = 420, /* server_http_query_buffer_size */ - YYSYMBOL_server_http_response_buffer_size = 421, /* server_http_response_buffer_size */ - YYSYMBOL_server_http_nodelay = 422, /* server_http_nodelay */ - YYSYMBOL_server_http_notls_downstream = 423, /* server_http_notls_downstream */ - YYSYMBOL_server_use_systemd = 424, /* server_use_systemd */ - YYSYMBOL_server_do_daemonize = 425, /* server_do_daemonize */ - YYSYMBOL_server_use_syslog = 426, /* server_use_syslog */ - YYSYMBOL_server_log_time_ascii = 427, /* server_log_time_ascii */ - YYSYMBOL_server_log_queries = 428, /* server_log_queries */ - YYSYMBOL_server_log_replies = 429, /* server_log_replies */ - YYSYMBOL_server_log_tag_queryreply = 430, /* server_log_tag_queryreply */ - YYSYMBOL_server_log_servfail = 431, /* server_log_servfail */ - YYSYMBOL_server_log_local_actions = 432, /* server_log_local_actions */ - YYSYMBOL_server_chroot = 433, /* server_chroot */ - YYSYMBOL_server_username = 434, /* server_username */ - YYSYMBOL_server_directory = 435, /* server_directory */ - YYSYMBOL_server_logfile = 436, /* server_logfile */ - YYSYMBOL_server_pidfile = 437, /* server_pidfile */ - YYSYMBOL_server_root_hints = 438, /* server_root_hints */ - YYSYMBOL_server_dlv_anchor_file = 439, /* server_dlv_anchor_file */ - YYSYMBOL_server_dlv_anchor = 440, /* server_dlv_anchor */ - YYSYMBOL_server_auto_trust_anchor_file = 441, /* server_auto_trust_anchor_file */ - YYSYMBOL_server_trust_anchor_file = 442, /* server_trust_anchor_file */ - YYSYMBOL_server_trusted_keys_file = 443, /* server_trusted_keys_file */ - YYSYMBOL_server_trust_anchor = 444, /* server_trust_anchor */ - YYSYMBOL_server_trust_anchor_signaling = 445, /* server_trust_anchor_signaling */ - YYSYMBOL_server_root_key_sentinel = 446, /* server_root_key_sentinel */ - YYSYMBOL_server_domain_insecure = 447, /* server_domain_insecure */ - YYSYMBOL_server_hide_identity = 448, /* server_hide_identity */ - YYSYMBOL_server_hide_version = 449, /* server_hide_version */ - YYSYMBOL_server_hide_trustanchor = 450, /* server_hide_trustanchor */ - YYSYMBOL_server_hide_http_user_agent = 451, /* server_hide_http_user_agent */ - YYSYMBOL_server_identity = 452, /* server_identity */ - YYSYMBOL_server_version = 453, /* server_version */ - YYSYMBOL_server_http_user_agent = 454, /* server_http_user_agent */ - YYSYMBOL_server_nsid = 455, /* server_nsid */ - YYSYMBOL_server_so_rcvbuf = 456, /* server_so_rcvbuf */ - YYSYMBOL_server_so_sndbuf = 457, /* server_so_sndbuf */ - YYSYMBOL_server_so_reuseport = 458, /* server_so_reuseport */ - YYSYMBOL_server_ip_transparent = 459, /* server_ip_transparent */ - YYSYMBOL_server_ip_freebind = 460, /* server_ip_freebind */ - YYSYMBOL_server_ip_dscp = 461, /* server_ip_dscp */ - YYSYMBOL_server_stream_wait_size = 462, /* server_stream_wait_size */ - YYSYMBOL_server_edns_buffer_size = 463, /* server_edns_buffer_size */ - YYSYMBOL_server_msg_buffer_size = 464, /* server_msg_buffer_size */ - YYSYMBOL_server_msg_cache_size = 465, /* server_msg_cache_size */ - YYSYMBOL_server_msg_cache_slabs = 466, /* server_msg_cache_slabs */ - YYSYMBOL_server_num_queries_per_thread = 467, /* server_num_queries_per_thread */ - YYSYMBOL_server_jostle_timeout = 468, /* server_jostle_timeout */ - YYSYMBOL_server_delay_close = 469, /* server_delay_close */ - YYSYMBOL_server_udp_connect = 470, /* server_udp_connect */ - YYSYMBOL_server_unblock_lan_zones = 471, /* server_unblock_lan_zones */ - YYSYMBOL_server_insecure_lan_zones = 472, /* server_insecure_lan_zones */ - YYSYMBOL_server_rrset_cache_size = 473, /* server_rrset_cache_size */ - YYSYMBOL_server_rrset_cache_slabs = 474, /* server_rrset_cache_slabs */ - YYSYMBOL_server_infra_host_ttl = 475, /* server_infra_host_ttl */ - YYSYMBOL_server_infra_lame_ttl = 476, /* server_infra_lame_ttl */ - YYSYMBOL_server_infra_cache_numhosts = 477, /* server_infra_cache_numhosts */ - YYSYMBOL_server_infra_cache_lame_size = 478, /* server_infra_cache_lame_size */ - YYSYMBOL_server_infra_cache_slabs = 479, /* server_infra_cache_slabs */ - YYSYMBOL_server_infra_cache_min_rtt = 480, /* server_infra_cache_min_rtt */ - YYSYMBOL_server_infra_cache_max_rtt = 481, /* server_infra_cache_max_rtt */ - YYSYMBOL_server_infra_keep_probing = 482, /* server_infra_keep_probing */ - YYSYMBOL_server_target_fetch_policy = 483, /* server_target_fetch_policy */ - YYSYMBOL_server_harden_short_bufsize = 484, /* server_harden_short_bufsize */ - YYSYMBOL_server_harden_large_queries = 485, /* server_harden_large_queries */ - YYSYMBOL_server_harden_glue = 486, /* server_harden_glue */ - YYSYMBOL_server_harden_dnssec_stripped = 487, /* server_harden_dnssec_stripped */ - YYSYMBOL_server_harden_below_nxdomain = 488, /* server_harden_below_nxdomain */ - YYSYMBOL_server_harden_referral_path = 489, /* server_harden_referral_path */ - YYSYMBOL_server_harden_algo_downgrade = 490, /* server_harden_algo_downgrade */ - YYSYMBOL_server_use_caps_for_id = 491, /* server_use_caps_for_id */ - YYSYMBOL_server_caps_whitelist = 492, /* server_caps_whitelist */ - YYSYMBOL_server_private_address = 493, /* server_private_address */ - YYSYMBOL_server_private_domain = 494, /* server_private_domain */ - YYSYMBOL_server_prefetch = 495, /* server_prefetch */ - YYSYMBOL_server_prefetch_key = 496, /* server_prefetch_key */ - YYSYMBOL_server_deny_any = 497, /* server_deny_any */ - YYSYMBOL_server_unwanted_reply_threshold = 498, /* server_unwanted_reply_threshold */ - YYSYMBOL_server_do_not_query_address = 499, /* server_do_not_query_address */ - YYSYMBOL_server_do_not_query_localhost = 500, /* server_do_not_query_localhost */ - YYSYMBOL_server_access_control = 501, /* server_access_control */ - YYSYMBOL_server_interface_action = 502, /* server_interface_action */ - YYSYMBOL_server_module_conf = 503, /* server_module_conf */ - YYSYMBOL_server_val_override_date = 504, /* server_val_override_date */ - YYSYMBOL_server_val_sig_skew_min = 505, /* server_val_sig_skew_min */ - YYSYMBOL_server_val_sig_skew_max = 506, /* server_val_sig_skew_max */ - YYSYMBOL_server_val_max_restart = 507, /* server_val_max_restart */ - YYSYMBOL_server_cache_max_ttl = 508, /* server_cache_max_ttl */ - YYSYMBOL_server_cache_max_negative_ttl = 509, /* server_cache_max_negative_ttl */ - YYSYMBOL_server_cache_min_ttl = 510, /* server_cache_min_ttl */ - YYSYMBOL_server_bogus_ttl = 511, /* server_bogus_ttl */ - YYSYMBOL_server_val_clean_additional = 512, /* server_val_clean_additional */ - YYSYMBOL_server_val_permissive_mode = 513, /* server_val_permissive_mode */ - YYSYMBOL_server_aggressive_nsec = 514, /* server_aggressive_nsec */ - YYSYMBOL_server_ignore_cd_flag = 515, /* server_ignore_cd_flag */ - YYSYMBOL_server_serve_expired = 516, /* server_serve_expired */ - YYSYMBOL_server_serve_expired_ttl = 517, /* server_serve_expired_ttl */ - YYSYMBOL_server_serve_expired_ttl_reset = 518, /* server_serve_expired_ttl_reset */ - YYSYMBOL_server_serve_expired_reply_ttl = 519, /* server_serve_expired_reply_ttl */ - YYSYMBOL_server_serve_expired_client_timeout = 520, /* server_serve_expired_client_timeout */ - YYSYMBOL_server_ede_serve_expired = 521, /* server_ede_serve_expired */ - YYSYMBOL_server_serve_original_ttl = 522, /* server_serve_original_ttl */ - YYSYMBOL_server_fake_dsa = 523, /* server_fake_dsa */ - YYSYMBOL_server_fake_sha1 = 524, /* server_fake_sha1 */ - YYSYMBOL_server_val_log_level = 525, /* server_val_log_level */ - YYSYMBOL_server_val_nsec3_keysize_iterations = 526, /* server_val_nsec3_keysize_iterations */ - YYSYMBOL_server_zonemd_permissive_mode = 527, /* server_zonemd_permissive_mode */ - YYSYMBOL_server_add_holddown = 528, /* server_add_holddown */ - YYSYMBOL_server_del_holddown = 529, /* server_del_holddown */ - YYSYMBOL_server_keep_missing = 530, /* server_keep_missing */ - YYSYMBOL_server_permit_small_holddown = 531, /* server_permit_small_holddown */ - YYSYMBOL_server_key_cache_size = 532, /* server_key_cache_size */ - YYSYMBOL_server_key_cache_slabs = 533, /* server_key_cache_slabs */ - YYSYMBOL_server_neg_cache_size = 534, /* server_neg_cache_size */ - YYSYMBOL_server_local_zone = 535, /* server_local_zone */ - YYSYMBOL_server_local_data = 536, /* server_local_data */ - YYSYMBOL_server_local_data_ptr = 537, /* server_local_data_ptr */ - YYSYMBOL_server_minimal_responses = 538, /* server_minimal_responses */ - YYSYMBOL_server_rrset_roundrobin = 539, /* server_rrset_roundrobin */ - YYSYMBOL_server_unknown_server_time_limit = 540, /* server_unknown_server_time_limit */ - YYSYMBOL_server_max_udp_size = 541, /* server_max_udp_size */ - YYSYMBOL_server_dns64_prefix = 542, /* server_dns64_prefix */ - YYSYMBOL_server_dns64_synthall = 543, /* server_dns64_synthall */ - YYSYMBOL_server_dns64_ignore_aaaa = 544, /* server_dns64_ignore_aaaa */ - YYSYMBOL_server_define_tag = 545, /* server_define_tag */ - YYSYMBOL_server_local_zone_tag = 546, /* server_local_zone_tag */ - YYSYMBOL_server_access_control_tag = 547, /* server_access_control_tag */ - YYSYMBOL_server_access_control_tag_action = 548, /* server_access_control_tag_action */ - YYSYMBOL_server_access_control_tag_data = 549, /* server_access_control_tag_data */ - YYSYMBOL_server_local_zone_override = 550, /* server_local_zone_override */ - YYSYMBOL_server_access_control_view = 551, /* server_access_control_view */ - YYSYMBOL_server_interface_tag = 552, /* server_interface_tag */ - YYSYMBOL_server_interface_tag_action = 553, /* server_interface_tag_action */ - YYSYMBOL_server_interface_tag_data = 554, /* server_interface_tag_data */ - YYSYMBOL_server_interface_view = 555, /* server_interface_view */ - YYSYMBOL_server_response_ip_tag = 556, /* server_response_ip_tag */ - YYSYMBOL_server_ip_ratelimit = 557, /* server_ip_ratelimit */ - YYSYMBOL_server_ratelimit = 558, /* server_ratelimit */ - YYSYMBOL_server_ip_ratelimit_size = 559, /* server_ip_ratelimit_size */ - YYSYMBOL_server_ratelimit_size = 560, /* server_ratelimit_size */ - YYSYMBOL_server_ip_ratelimit_slabs = 561, /* server_ip_ratelimit_slabs */ - YYSYMBOL_server_ratelimit_slabs = 562, /* server_ratelimit_slabs */ - YYSYMBOL_server_ratelimit_for_domain = 563, /* server_ratelimit_for_domain */ - YYSYMBOL_server_ratelimit_below_domain = 564, /* server_ratelimit_below_domain */ - YYSYMBOL_server_ip_ratelimit_factor = 565, /* server_ip_ratelimit_factor */ - YYSYMBOL_server_ratelimit_factor = 566, /* server_ratelimit_factor */ - YYSYMBOL_server_ip_ratelimit_backoff = 567, /* server_ip_ratelimit_backoff */ - YYSYMBOL_server_ratelimit_backoff = 568, /* server_ratelimit_backoff */ - YYSYMBOL_server_outbound_msg_retry = 569, /* server_outbound_msg_retry */ - YYSYMBOL_server_low_rtt = 570, /* server_low_rtt */ - YYSYMBOL_server_fast_server_num = 571, /* server_fast_server_num */ - YYSYMBOL_server_fast_server_permil = 572, /* server_fast_server_permil */ - YYSYMBOL_server_qname_minimisation = 573, /* server_qname_minimisation */ - YYSYMBOL_server_qname_minimisation_strict = 574, /* server_qname_minimisation_strict */ - YYSYMBOL_server_pad_responses = 575, /* server_pad_responses */ - YYSYMBOL_server_pad_responses_block_size = 576, /* server_pad_responses_block_size */ - YYSYMBOL_server_pad_queries = 577, /* server_pad_queries */ - YYSYMBOL_server_pad_queries_block_size = 578, /* server_pad_queries_block_size */ - YYSYMBOL_server_ipsecmod_enabled = 579, /* server_ipsecmod_enabled */ - YYSYMBOL_server_ipsecmod_ignore_bogus = 580, /* server_ipsecmod_ignore_bogus */ - YYSYMBOL_server_ipsecmod_hook = 581, /* server_ipsecmod_hook */ - YYSYMBOL_server_ipsecmod_max_ttl = 582, /* server_ipsecmod_max_ttl */ - YYSYMBOL_server_ipsecmod_whitelist = 583, /* server_ipsecmod_whitelist */ - YYSYMBOL_server_ipsecmod_strict = 584, /* server_ipsecmod_strict */ - YYSYMBOL_server_edns_client_string = 585, /* server_edns_client_string */ - YYSYMBOL_server_edns_client_string_opcode = 586, /* server_edns_client_string_opcode */ - YYSYMBOL_server_ede = 587, /* server_ede */ - YYSYMBOL_stub_name = 588, /* stub_name */ - YYSYMBOL_stub_host = 589, /* stub_host */ - YYSYMBOL_stub_addr = 590, /* stub_addr */ - YYSYMBOL_stub_first = 591, /* stub_first */ - YYSYMBOL_stub_no_cache = 592, /* stub_no_cache */ - YYSYMBOL_stub_ssl_upstream = 593, /* stub_ssl_upstream */ - YYSYMBOL_stub_tcp_upstream = 594, /* stub_tcp_upstream */ - YYSYMBOL_stub_prime = 595, /* stub_prime */ - YYSYMBOL_forward_name = 596, /* forward_name */ - YYSYMBOL_forward_host = 597, /* forward_host */ - YYSYMBOL_forward_addr = 598, /* forward_addr */ - YYSYMBOL_forward_first = 599, /* forward_first */ - YYSYMBOL_forward_no_cache = 600, /* forward_no_cache */ - YYSYMBOL_forward_ssl_upstream = 601, /* forward_ssl_upstream */ - YYSYMBOL_forward_tcp_upstream = 602, /* forward_tcp_upstream */ - YYSYMBOL_auth_name = 603, /* auth_name */ - YYSYMBOL_auth_zonefile = 604, /* auth_zonefile */ - YYSYMBOL_auth_master = 605, /* auth_master */ - YYSYMBOL_auth_url = 606, /* auth_url */ - YYSYMBOL_auth_allow_notify = 607, /* auth_allow_notify */ - YYSYMBOL_auth_zonemd_check = 608, /* auth_zonemd_check */ - YYSYMBOL_auth_zonemd_reject_absence = 609, /* auth_zonemd_reject_absence */ - YYSYMBOL_auth_for_downstream = 610, /* auth_for_downstream */ - YYSYMBOL_auth_for_upstream = 611, /* auth_for_upstream */ - YYSYMBOL_auth_fallback_enabled = 612, /* auth_fallback_enabled */ - YYSYMBOL_view_name = 613, /* view_name */ - YYSYMBOL_view_local_zone = 614, /* view_local_zone */ - YYSYMBOL_view_response_ip = 615, /* view_response_ip */ - YYSYMBOL_view_response_ip_data = 616, /* view_response_ip_data */ - YYSYMBOL_view_local_data = 617, /* view_local_data */ - YYSYMBOL_view_local_data_ptr = 618, /* view_local_data_ptr */ - YYSYMBOL_view_first = 619, /* view_first */ - YYSYMBOL_rcstart = 620, /* rcstart */ - YYSYMBOL_contents_rc = 621, /* contents_rc */ - YYSYMBOL_content_rc = 622, /* content_rc */ - YYSYMBOL_rc_control_enable = 623, /* rc_control_enable */ - YYSYMBOL_rc_control_port = 624, /* rc_control_port */ - YYSYMBOL_rc_control_interface = 625, /* rc_control_interface */ - YYSYMBOL_rc_control_use_cert = 626, /* rc_control_use_cert */ - YYSYMBOL_rc_server_key_file = 627, /* rc_server_key_file */ - YYSYMBOL_rc_server_cert_file = 628, /* rc_server_cert_file */ - YYSYMBOL_rc_control_key_file = 629, /* rc_control_key_file */ - YYSYMBOL_rc_control_cert_file = 630, /* rc_control_cert_file */ - YYSYMBOL_dtstart = 631, /* dtstart */ - YYSYMBOL_contents_dt = 632, /* contents_dt */ - YYSYMBOL_content_dt = 633, /* content_dt */ - YYSYMBOL_dt_dnstap_enable = 634, /* dt_dnstap_enable */ - YYSYMBOL_dt_dnstap_bidirectional = 635, /* dt_dnstap_bidirectional */ - YYSYMBOL_dt_dnstap_socket_path = 636, /* dt_dnstap_socket_path */ - YYSYMBOL_dt_dnstap_ip = 637, /* dt_dnstap_ip */ - YYSYMBOL_dt_dnstap_tls = 638, /* dt_dnstap_tls */ - YYSYMBOL_dt_dnstap_tls_server_name = 639, /* dt_dnstap_tls_server_name */ - YYSYMBOL_dt_dnstap_tls_cert_bundle = 640, /* dt_dnstap_tls_cert_bundle */ - YYSYMBOL_dt_dnstap_tls_client_key_file = 641, /* dt_dnstap_tls_client_key_file */ - YYSYMBOL_dt_dnstap_tls_client_cert_file = 642, /* dt_dnstap_tls_client_cert_file */ - YYSYMBOL_dt_dnstap_send_identity = 643, /* dt_dnstap_send_identity */ - YYSYMBOL_dt_dnstap_send_version = 644, /* dt_dnstap_send_version */ - YYSYMBOL_dt_dnstap_identity = 645, /* dt_dnstap_identity */ - YYSYMBOL_dt_dnstap_version = 646, /* dt_dnstap_version */ - YYSYMBOL_dt_dnstap_log_resolver_query_messages = 647, /* dt_dnstap_log_resolver_query_messages */ - YYSYMBOL_dt_dnstap_log_resolver_response_messages = 648, /* dt_dnstap_log_resolver_response_messages */ - YYSYMBOL_dt_dnstap_log_client_query_messages = 649, /* dt_dnstap_log_client_query_messages */ - YYSYMBOL_dt_dnstap_log_client_response_messages = 650, /* dt_dnstap_log_client_response_messages */ - YYSYMBOL_dt_dnstap_log_forwarder_query_messages = 651, /* dt_dnstap_log_forwarder_query_messages */ - YYSYMBOL_dt_dnstap_log_forwarder_response_messages = 652, /* dt_dnstap_log_forwarder_response_messages */ - YYSYMBOL_pythonstart = 653, /* pythonstart */ - YYSYMBOL_contents_py = 654, /* contents_py */ - YYSYMBOL_content_py = 655, /* content_py */ - YYSYMBOL_py_script = 656, /* py_script */ - YYSYMBOL_dynlibstart = 657, /* dynlibstart */ - YYSYMBOL_contents_dl = 658, /* contents_dl */ - YYSYMBOL_content_dl = 659, /* content_dl */ - YYSYMBOL_dl_file = 660, /* dl_file */ - YYSYMBOL_server_disable_dnssec_lame_check = 661, /* server_disable_dnssec_lame_check */ - YYSYMBOL_server_log_identity = 662, /* server_log_identity */ - YYSYMBOL_server_response_ip = 663, /* server_response_ip */ - YYSYMBOL_server_response_ip_data = 664, /* server_response_ip_data */ - YYSYMBOL_dnscstart = 665, /* dnscstart */ - YYSYMBOL_contents_dnsc = 666, /* contents_dnsc */ - YYSYMBOL_content_dnsc = 667, /* content_dnsc */ - YYSYMBOL_dnsc_dnscrypt_enable = 668, /* dnsc_dnscrypt_enable */ - YYSYMBOL_dnsc_dnscrypt_port = 669, /* dnsc_dnscrypt_port */ - YYSYMBOL_dnsc_dnscrypt_provider = 670, /* dnsc_dnscrypt_provider */ - YYSYMBOL_dnsc_dnscrypt_provider_cert = 671, /* dnsc_dnscrypt_provider_cert */ - YYSYMBOL_dnsc_dnscrypt_provider_cert_rotated = 672, /* dnsc_dnscrypt_provider_cert_rotated */ - YYSYMBOL_dnsc_dnscrypt_secret_key = 673, /* dnsc_dnscrypt_secret_key */ - YYSYMBOL_dnsc_dnscrypt_shared_secret_cache_size = 674, /* dnsc_dnscrypt_shared_secret_cache_size */ - YYSYMBOL_dnsc_dnscrypt_shared_secret_cache_slabs = 675, /* dnsc_dnscrypt_shared_secret_cache_slabs */ - YYSYMBOL_dnsc_dnscrypt_nonce_cache_size = 676, /* dnsc_dnscrypt_nonce_cache_size */ - YYSYMBOL_dnsc_dnscrypt_nonce_cache_slabs = 677, /* dnsc_dnscrypt_nonce_cache_slabs */ - YYSYMBOL_cachedbstart = 678, /* cachedbstart */ - YYSYMBOL_contents_cachedb = 679, /* contents_cachedb */ - YYSYMBOL_content_cachedb = 680, /* content_cachedb */ - YYSYMBOL_cachedb_backend_name = 681, /* cachedb_backend_name */ - YYSYMBOL_cachedb_secret_seed = 682, /* cachedb_secret_seed */ - YYSYMBOL_redis_server_host = 683, /* redis_server_host */ - YYSYMBOL_redis_server_port = 684, /* redis_server_port */ - YYSYMBOL_redis_timeout = 685, /* redis_timeout */ - YYSYMBOL_redis_expire_records = 686, /* redis_expire_records */ - YYSYMBOL_server_tcp_connection_limit = 687, /* server_tcp_connection_limit */ - YYSYMBOL_server_answer_cookie = 688, /* server_answer_cookie */ - YYSYMBOL_server_cookie_secret = 689, /* server_cookie_secret */ - YYSYMBOL_ipsetstart = 690, /* ipsetstart */ - YYSYMBOL_contents_ipset = 691, /* contents_ipset */ - YYSYMBOL_content_ipset = 692, /* content_ipset */ - YYSYMBOL_ipset_name_v4 = 693, /* ipset_name_v4 */ - YYSYMBOL_ipset_name_v6 = 694 /* ipset_name_v6 */ + YYSYMBOL_VAR_PROXY_PROTOCOL_PORT = 335, /* VAR_PROXY_PROTOCOL_PORT */ + YYSYMBOL_YYACCEPT = 336, /* $accept */ + YYSYMBOL_toplevelvars = 337, /* toplevelvars */ + YYSYMBOL_toplevelvar = 338, /* toplevelvar */ + YYSYMBOL_force_toplevel = 339, /* force_toplevel */ + YYSYMBOL_serverstart = 340, /* serverstart */ + YYSYMBOL_contents_server = 341, /* contents_server */ + YYSYMBOL_content_server = 342, /* content_server */ + YYSYMBOL_stubstart = 343, /* stubstart */ + YYSYMBOL_contents_stub = 344, /* contents_stub */ + YYSYMBOL_content_stub = 345, /* content_stub */ + YYSYMBOL_forwardstart = 346, /* forwardstart */ + YYSYMBOL_contents_forward = 347, /* contents_forward */ + YYSYMBOL_content_forward = 348, /* content_forward */ + YYSYMBOL_viewstart = 349, /* viewstart */ + YYSYMBOL_contents_view = 350, /* contents_view */ + YYSYMBOL_content_view = 351, /* content_view */ + YYSYMBOL_authstart = 352, /* authstart */ + YYSYMBOL_contents_auth = 353, /* contents_auth */ + YYSYMBOL_content_auth = 354, /* content_auth */ + YYSYMBOL_rpz_tag = 355, /* rpz_tag */ + YYSYMBOL_rpz_action_override = 356, /* rpz_action_override */ + YYSYMBOL_rpz_cname_override = 357, /* rpz_cname_override */ + YYSYMBOL_rpz_log = 358, /* rpz_log */ + YYSYMBOL_rpz_log_name = 359, /* rpz_log_name */ + YYSYMBOL_rpz_signal_nxdomain_ra = 360, /* rpz_signal_nxdomain_ra */ + YYSYMBOL_rpzstart = 361, /* rpzstart */ + YYSYMBOL_contents_rpz = 362, /* contents_rpz */ + YYSYMBOL_content_rpz = 363, /* content_rpz */ + YYSYMBOL_server_num_threads = 364, /* server_num_threads */ + YYSYMBOL_server_verbosity = 365, /* server_verbosity */ + YYSYMBOL_server_statistics_interval = 366, /* server_statistics_interval */ + YYSYMBOL_server_statistics_cumulative = 367, /* server_statistics_cumulative */ + YYSYMBOL_server_extended_statistics = 368, /* server_extended_statistics */ + YYSYMBOL_server_shm_enable = 369, /* server_shm_enable */ + YYSYMBOL_server_shm_key = 370, /* server_shm_key */ + YYSYMBOL_server_port = 371, /* server_port */ + YYSYMBOL_server_send_client_subnet = 372, /* server_send_client_subnet */ + YYSYMBOL_server_client_subnet_zone = 373, /* server_client_subnet_zone */ + YYSYMBOL_server_client_subnet_always_forward = 374, /* server_client_subnet_always_forward */ + YYSYMBOL_server_client_subnet_opcode = 375, /* server_client_subnet_opcode */ + YYSYMBOL_server_max_client_subnet_ipv4 = 376, /* server_max_client_subnet_ipv4 */ + YYSYMBOL_server_max_client_subnet_ipv6 = 377, /* server_max_client_subnet_ipv6 */ + YYSYMBOL_server_min_client_subnet_ipv4 = 378, /* server_min_client_subnet_ipv4 */ + YYSYMBOL_server_min_client_subnet_ipv6 = 379, /* server_min_client_subnet_ipv6 */ + YYSYMBOL_server_max_ecs_tree_size_ipv4 = 380, /* server_max_ecs_tree_size_ipv4 */ + YYSYMBOL_server_max_ecs_tree_size_ipv6 = 381, /* server_max_ecs_tree_size_ipv6 */ + YYSYMBOL_server_interface = 382, /* server_interface */ + YYSYMBOL_server_outgoing_interface = 383, /* server_outgoing_interface */ + YYSYMBOL_server_outgoing_range = 384, /* server_outgoing_range */ + YYSYMBOL_server_outgoing_port_permit = 385, /* server_outgoing_port_permit */ + YYSYMBOL_server_outgoing_port_avoid = 386, /* server_outgoing_port_avoid */ + YYSYMBOL_server_outgoing_num_tcp = 387, /* server_outgoing_num_tcp */ + YYSYMBOL_server_incoming_num_tcp = 388, /* server_incoming_num_tcp */ + YYSYMBOL_server_interface_automatic = 389, /* server_interface_automatic */ + YYSYMBOL_server_interface_automatic_ports = 390, /* server_interface_automatic_ports */ + YYSYMBOL_server_do_ip4 = 391, /* server_do_ip4 */ + YYSYMBOL_server_do_ip6 = 392, /* server_do_ip6 */ + YYSYMBOL_server_do_udp = 393, /* server_do_udp */ + YYSYMBOL_server_do_tcp = 394, /* server_do_tcp */ + YYSYMBOL_server_prefer_ip4 = 395, /* server_prefer_ip4 */ + YYSYMBOL_server_prefer_ip6 = 396, /* server_prefer_ip6 */ + YYSYMBOL_server_tcp_mss = 397, /* server_tcp_mss */ + YYSYMBOL_server_outgoing_tcp_mss = 398, /* server_outgoing_tcp_mss */ + YYSYMBOL_server_tcp_idle_timeout = 399, /* server_tcp_idle_timeout */ + YYSYMBOL_server_max_reuse_tcp_queries = 400, /* server_max_reuse_tcp_queries */ + YYSYMBOL_server_tcp_reuse_timeout = 401, /* server_tcp_reuse_timeout */ + YYSYMBOL_server_tcp_auth_query_timeout = 402, /* server_tcp_auth_query_timeout */ + YYSYMBOL_server_tcp_keepalive = 403, /* server_tcp_keepalive */ + YYSYMBOL_server_tcp_keepalive_timeout = 404, /* server_tcp_keepalive_timeout */ + YYSYMBOL_server_tcp_upstream = 405, /* server_tcp_upstream */ + YYSYMBOL_server_udp_upstream_without_downstream = 406, /* server_udp_upstream_without_downstream */ + YYSYMBOL_server_ssl_upstream = 407, /* server_ssl_upstream */ + YYSYMBOL_server_ssl_service_key = 408, /* server_ssl_service_key */ + YYSYMBOL_server_ssl_service_pem = 409, /* server_ssl_service_pem */ + YYSYMBOL_server_ssl_port = 410, /* server_ssl_port */ + YYSYMBOL_server_tls_cert_bundle = 411, /* server_tls_cert_bundle */ + YYSYMBOL_server_tls_win_cert = 412, /* server_tls_win_cert */ + YYSYMBOL_server_tls_additional_port = 413, /* server_tls_additional_port */ + YYSYMBOL_server_tls_ciphers = 414, /* server_tls_ciphers */ + YYSYMBOL_server_tls_ciphersuites = 415, /* server_tls_ciphersuites */ + YYSYMBOL_server_tls_session_ticket_keys = 416, /* server_tls_session_ticket_keys */ + YYSYMBOL_server_tls_use_sni = 417, /* server_tls_use_sni */ + YYSYMBOL_server_https_port = 418, /* server_https_port */ + YYSYMBOL_server_http_endpoint = 419, /* server_http_endpoint */ + YYSYMBOL_server_http_max_streams = 420, /* server_http_max_streams */ + YYSYMBOL_server_http_query_buffer_size = 421, /* server_http_query_buffer_size */ + YYSYMBOL_server_http_response_buffer_size = 422, /* server_http_response_buffer_size */ + YYSYMBOL_server_http_nodelay = 423, /* server_http_nodelay */ + YYSYMBOL_server_http_notls_downstream = 424, /* server_http_notls_downstream */ + YYSYMBOL_server_use_systemd = 425, /* server_use_systemd */ + YYSYMBOL_server_do_daemonize = 426, /* server_do_daemonize */ + YYSYMBOL_server_use_syslog = 427, /* server_use_syslog */ + YYSYMBOL_server_log_time_ascii = 428, /* server_log_time_ascii */ + YYSYMBOL_server_log_queries = 429, /* server_log_queries */ + YYSYMBOL_server_log_replies = 430, /* server_log_replies */ + YYSYMBOL_server_log_tag_queryreply = 431, /* server_log_tag_queryreply */ + YYSYMBOL_server_log_servfail = 432, /* server_log_servfail */ + YYSYMBOL_server_log_local_actions = 433, /* server_log_local_actions */ + YYSYMBOL_server_chroot = 434, /* server_chroot */ + YYSYMBOL_server_username = 435, /* server_username */ + YYSYMBOL_server_directory = 436, /* server_directory */ + YYSYMBOL_server_logfile = 437, /* server_logfile */ + YYSYMBOL_server_pidfile = 438, /* server_pidfile */ + YYSYMBOL_server_root_hints = 439, /* server_root_hints */ + YYSYMBOL_server_dlv_anchor_file = 440, /* server_dlv_anchor_file */ + YYSYMBOL_server_dlv_anchor = 441, /* server_dlv_anchor */ + YYSYMBOL_server_auto_trust_anchor_file = 442, /* server_auto_trust_anchor_file */ + YYSYMBOL_server_trust_anchor_file = 443, /* server_trust_anchor_file */ + YYSYMBOL_server_trusted_keys_file = 444, /* server_trusted_keys_file */ + YYSYMBOL_server_trust_anchor = 445, /* server_trust_anchor */ + YYSYMBOL_server_trust_anchor_signaling = 446, /* server_trust_anchor_signaling */ + YYSYMBOL_server_root_key_sentinel = 447, /* server_root_key_sentinel */ + YYSYMBOL_server_domain_insecure = 448, /* server_domain_insecure */ + YYSYMBOL_server_hide_identity = 449, /* server_hide_identity */ + YYSYMBOL_server_hide_version = 450, /* server_hide_version */ + YYSYMBOL_server_hide_trustanchor = 451, /* server_hide_trustanchor */ + YYSYMBOL_server_hide_http_user_agent = 452, /* server_hide_http_user_agent */ + YYSYMBOL_server_identity = 453, /* server_identity */ + YYSYMBOL_server_version = 454, /* server_version */ + YYSYMBOL_server_http_user_agent = 455, /* server_http_user_agent */ + YYSYMBOL_server_nsid = 456, /* server_nsid */ + YYSYMBOL_server_so_rcvbuf = 457, /* server_so_rcvbuf */ + YYSYMBOL_server_so_sndbuf = 458, /* server_so_sndbuf */ + YYSYMBOL_server_so_reuseport = 459, /* server_so_reuseport */ + YYSYMBOL_server_ip_transparent = 460, /* server_ip_transparent */ + YYSYMBOL_server_ip_freebind = 461, /* server_ip_freebind */ + YYSYMBOL_server_ip_dscp = 462, /* server_ip_dscp */ + YYSYMBOL_server_stream_wait_size = 463, /* server_stream_wait_size */ + YYSYMBOL_server_edns_buffer_size = 464, /* server_edns_buffer_size */ + YYSYMBOL_server_msg_buffer_size = 465, /* server_msg_buffer_size */ + YYSYMBOL_server_msg_cache_size = 466, /* server_msg_cache_size */ + YYSYMBOL_server_msg_cache_slabs = 467, /* server_msg_cache_slabs */ + YYSYMBOL_server_num_queries_per_thread = 468, /* server_num_queries_per_thread */ + YYSYMBOL_server_jostle_timeout = 469, /* server_jostle_timeout */ + YYSYMBOL_server_delay_close = 470, /* server_delay_close */ + YYSYMBOL_server_udp_connect = 471, /* server_udp_connect */ + YYSYMBOL_server_unblock_lan_zones = 472, /* server_unblock_lan_zones */ + YYSYMBOL_server_insecure_lan_zones = 473, /* server_insecure_lan_zones */ + YYSYMBOL_server_rrset_cache_size = 474, /* server_rrset_cache_size */ + YYSYMBOL_server_rrset_cache_slabs = 475, /* server_rrset_cache_slabs */ + YYSYMBOL_server_infra_host_ttl = 476, /* server_infra_host_ttl */ + YYSYMBOL_server_infra_lame_ttl = 477, /* server_infra_lame_ttl */ + YYSYMBOL_server_infra_cache_numhosts = 478, /* server_infra_cache_numhosts */ + YYSYMBOL_server_infra_cache_lame_size = 479, /* server_infra_cache_lame_size */ + YYSYMBOL_server_infra_cache_slabs = 480, /* server_infra_cache_slabs */ + YYSYMBOL_server_infra_cache_min_rtt = 481, /* server_infra_cache_min_rtt */ + YYSYMBOL_server_infra_cache_max_rtt = 482, /* server_infra_cache_max_rtt */ + YYSYMBOL_server_infra_keep_probing = 483, /* server_infra_keep_probing */ + YYSYMBOL_server_target_fetch_policy = 484, /* server_target_fetch_policy */ + YYSYMBOL_server_harden_short_bufsize = 485, /* server_harden_short_bufsize */ + YYSYMBOL_server_harden_large_queries = 486, /* server_harden_large_queries */ + YYSYMBOL_server_harden_glue = 487, /* server_harden_glue */ + YYSYMBOL_server_harden_dnssec_stripped = 488, /* server_harden_dnssec_stripped */ + YYSYMBOL_server_harden_below_nxdomain = 489, /* server_harden_below_nxdomain */ + YYSYMBOL_server_harden_referral_path = 490, /* server_harden_referral_path */ + YYSYMBOL_server_harden_algo_downgrade = 491, /* server_harden_algo_downgrade */ + YYSYMBOL_server_use_caps_for_id = 492, /* server_use_caps_for_id */ + YYSYMBOL_server_caps_whitelist = 493, /* server_caps_whitelist */ + YYSYMBOL_server_private_address = 494, /* server_private_address */ + YYSYMBOL_server_private_domain = 495, /* server_private_domain */ + YYSYMBOL_server_prefetch = 496, /* server_prefetch */ + YYSYMBOL_server_prefetch_key = 497, /* server_prefetch_key */ + YYSYMBOL_server_deny_any = 498, /* server_deny_any */ + YYSYMBOL_server_unwanted_reply_threshold = 499, /* server_unwanted_reply_threshold */ + YYSYMBOL_server_do_not_query_address = 500, /* server_do_not_query_address */ + YYSYMBOL_server_do_not_query_localhost = 501, /* server_do_not_query_localhost */ + YYSYMBOL_server_access_control = 502, /* server_access_control */ + YYSYMBOL_server_interface_action = 503, /* server_interface_action */ + YYSYMBOL_server_module_conf = 504, /* server_module_conf */ + YYSYMBOL_server_val_override_date = 505, /* server_val_override_date */ + YYSYMBOL_server_val_sig_skew_min = 506, /* server_val_sig_skew_min */ + YYSYMBOL_server_val_sig_skew_max = 507, /* server_val_sig_skew_max */ + YYSYMBOL_server_val_max_restart = 508, /* server_val_max_restart */ + YYSYMBOL_server_cache_max_ttl = 509, /* server_cache_max_ttl */ + YYSYMBOL_server_cache_max_negative_ttl = 510, /* server_cache_max_negative_ttl */ + YYSYMBOL_server_cache_min_ttl = 511, /* server_cache_min_ttl */ + YYSYMBOL_server_bogus_ttl = 512, /* server_bogus_ttl */ + YYSYMBOL_server_val_clean_additional = 513, /* server_val_clean_additional */ + YYSYMBOL_server_val_permissive_mode = 514, /* server_val_permissive_mode */ + YYSYMBOL_server_aggressive_nsec = 515, /* server_aggressive_nsec */ + YYSYMBOL_server_ignore_cd_flag = 516, /* server_ignore_cd_flag */ + YYSYMBOL_server_serve_expired = 517, /* server_serve_expired */ + YYSYMBOL_server_serve_expired_ttl = 518, /* server_serve_expired_ttl */ + YYSYMBOL_server_serve_expired_ttl_reset = 519, /* server_serve_expired_ttl_reset */ + YYSYMBOL_server_serve_expired_reply_ttl = 520, /* server_serve_expired_reply_ttl */ + YYSYMBOL_server_serve_expired_client_timeout = 521, /* server_serve_expired_client_timeout */ + YYSYMBOL_server_ede_serve_expired = 522, /* server_ede_serve_expired */ + YYSYMBOL_server_serve_original_ttl = 523, /* server_serve_original_ttl */ + YYSYMBOL_server_fake_dsa = 524, /* server_fake_dsa */ + YYSYMBOL_server_fake_sha1 = 525, /* server_fake_sha1 */ + YYSYMBOL_server_val_log_level = 526, /* server_val_log_level */ + YYSYMBOL_server_val_nsec3_keysize_iterations = 527, /* server_val_nsec3_keysize_iterations */ + YYSYMBOL_server_zonemd_permissive_mode = 528, /* server_zonemd_permissive_mode */ + YYSYMBOL_server_add_holddown = 529, /* server_add_holddown */ + YYSYMBOL_server_del_holddown = 530, /* server_del_holddown */ + YYSYMBOL_server_keep_missing = 531, /* server_keep_missing */ + YYSYMBOL_server_permit_small_holddown = 532, /* server_permit_small_holddown */ + YYSYMBOL_server_key_cache_size = 533, /* server_key_cache_size */ + YYSYMBOL_server_key_cache_slabs = 534, /* server_key_cache_slabs */ + YYSYMBOL_server_neg_cache_size = 535, /* server_neg_cache_size */ + YYSYMBOL_server_local_zone = 536, /* server_local_zone */ + YYSYMBOL_server_local_data = 537, /* server_local_data */ + YYSYMBOL_server_local_data_ptr = 538, /* server_local_data_ptr */ + YYSYMBOL_server_minimal_responses = 539, /* server_minimal_responses */ + YYSYMBOL_server_rrset_roundrobin = 540, /* server_rrset_roundrobin */ + YYSYMBOL_server_unknown_server_time_limit = 541, /* server_unknown_server_time_limit */ + YYSYMBOL_server_max_udp_size = 542, /* server_max_udp_size */ + YYSYMBOL_server_dns64_prefix = 543, /* server_dns64_prefix */ + YYSYMBOL_server_dns64_synthall = 544, /* server_dns64_synthall */ + YYSYMBOL_server_dns64_ignore_aaaa = 545, /* server_dns64_ignore_aaaa */ + YYSYMBOL_server_define_tag = 546, /* server_define_tag */ + YYSYMBOL_server_local_zone_tag = 547, /* server_local_zone_tag */ + YYSYMBOL_server_access_control_tag = 548, /* server_access_control_tag */ + YYSYMBOL_server_access_control_tag_action = 549, /* server_access_control_tag_action */ + YYSYMBOL_server_access_control_tag_data = 550, /* server_access_control_tag_data */ + YYSYMBOL_server_local_zone_override = 551, /* server_local_zone_override */ + YYSYMBOL_server_access_control_view = 552, /* server_access_control_view */ + YYSYMBOL_server_interface_tag = 553, /* server_interface_tag */ + YYSYMBOL_server_interface_tag_action = 554, /* server_interface_tag_action */ + YYSYMBOL_server_interface_tag_data = 555, /* server_interface_tag_data */ + YYSYMBOL_server_interface_view = 556, /* server_interface_view */ + YYSYMBOL_server_response_ip_tag = 557, /* server_response_ip_tag */ + YYSYMBOL_server_ip_ratelimit = 558, /* server_ip_ratelimit */ + YYSYMBOL_server_ratelimit = 559, /* server_ratelimit */ + YYSYMBOL_server_ip_ratelimit_size = 560, /* server_ip_ratelimit_size */ + YYSYMBOL_server_ratelimit_size = 561, /* server_ratelimit_size */ + YYSYMBOL_server_ip_ratelimit_slabs = 562, /* server_ip_ratelimit_slabs */ + YYSYMBOL_server_ratelimit_slabs = 563, /* server_ratelimit_slabs */ + YYSYMBOL_server_ratelimit_for_domain = 564, /* server_ratelimit_for_domain */ + YYSYMBOL_server_ratelimit_below_domain = 565, /* server_ratelimit_below_domain */ + YYSYMBOL_server_ip_ratelimit_factor = 566, /* server_ip_ratelimit_factor */ + YYSYMBOL_server_ratelimit_factor = 567, /* server_ratelimit_factor */ + YYSYMBOL_server_ip_ratelimit_backoff = 568, /* server_ip_ratelimit_backoff */ + YYSYMBOL_server_ratelimit_backoff = 569, /* server_ratelimit_backoff */ + YYSYMBOL_server_outbound_msg_retry = 570, /* server_outbound_msg_retry */ + YYSYMBOL_server_low_rtt = 571, /* server_low_rtt */ + YYSYMBOL_server_fast_server_num = 572, /* server_fast_server_num */ + YYSYMBOL_server_fast_server_permil = 573, /* server_fast_server_permil */ + YYSYMBOL_server_qname_minimisation = 574, /* server_qname_minimisation */ + YYSYMBOL_server_qname_minimisation_strict = 575, /* server_qname_minimisation_strict */ + YYSYMBOL_server_pad_responses = 576, /* server_pad_responses */ + YYSYMBOL_server_pad_responses_block_size = 577, /* server_pad_responses_block_size */ + YYSYMBOL_server_pad_queries = 578, /* server_pad_queries */ + YYSYMBOL_server_pad_queries_block_size = 579, /* server_pad_queries_block_size */ + YYSYMBOL_server_ipsecmod_enabled = 580, /* server_ipsecmod_enabled */ + YYSYMBOL_server_ipsecmod_ignore_bogus = 581, /* server_ipsecmod_ignore_bogus */ + YYSYMBOL_server_ipsecmod_hook = 582, /* server_ipsecmod_hook */ + YYSYMBOL_server_ipsecmod_max_ttl = 583, /* server_ipsecmod_max_ttl */ + YYSYMBOL_server_ipsecmod_whitelist = 584, /* server_ipsecmod_whitelist */ + YYSYMBOL_server_ipsecmod_strict = 585, /* server_ipsecmod_strict */ + YYSYMBOL_server_edns_client_string = 586, /* server_edns_client_string */ + YYSYMBOL_server_edns_client_string_opcode = 587, /* server_edns_client_string_opcode */ + YYSYMBOL_server_ede = 588, /* server_ede */ + YYSYMBOL_server_proxy_protocol_port = 589, /* server_proxy_protocol_port */ + YYSYMBOL_stub_name = 590, /* stub_name */ + YYSYMBOL_stub_host = 591, /* stub_host */ + YYSYMBOL_stub_addr = 592, /* stub_addr */ + YYSYMBOL_stub_first = 593, /* stub_first */ + YYSYMBOL_stub_no_cache = 594, /* stub_no_cache */ + YYSYMBOL_stub_ssl_upstream = 595, /* stub_ssl_upstream */ + YYSYMBOL_stub_tcp_upstream = 596, /* stub_tcp_upstream */ + YYSYMBOL_stub_prime = 597, /* stub_prime */ + YYSYMBOL_forward_name = 598, /* forward_name */ + YYSYMBOL_forward_host = 599, /* forward_host */ + YYSYMBOL_forward_addr = 600, /* forward_addr */ + YYSYMBOL_forward_first = 601, /* forward_first */ + YYSYMBOL_forward_no_cache = 602, /* forward_no_cache */ + YYSYMBOL_forward_ssl_upstream = 603, /* forward_ssl_upstream */ + YYSYMBOL_forward_tcp_upstream = 604, /* forward_tcp_upstream */ + YYSYMBOL_auth_name = 605, /* auth_name */ + YYSYMBOL_auth_zonefile = 606, /* auth_zonefile */ + YYSYMBOL_auth_master = 607, /* auth_master */ + YYSYMBOL_auth_url = 608, /* auth_url */ + YYSYMBOL_auth_allow_notify = 609, /* auth_allow_notify */ + YYSYMBOL_auth_zonemd_check = 610, /* auth_zonemd_check */ + YYSYMBOL_auth_zonemd_reject_absence = 611, /* auth_zonemd_reject_absence */ + YYSYMBOL_auth_for_downstream = 612, /* auth_for_downstream */ + YYSYMBOL_auth_for_upstream = 613, /* auth_for_upstream */ + YYSYMBOL_auth_fallback_enabled = 614, /* auth_fallback_enabled */ + YYSYMBOL_view_name = 615, /* view_name */ + YYSYMBOL_view_local_zone = 616, /* view_local_zone */ + YYSYMBOL_view_response_ip = 617, /* view_response_ip */ + YYSYMBOL_view_response_ip_data = 618, /* view_response_ip_data */ + YYSYMBOL_view_local_data = 619, /* view_local_data */ + YYSYMBOL_view_local_data_ptr = 620, /* view_local_data_ptr */ + YYSYMBOL_view_first = 621, /* view_first */ + YYSYMBOL_rcstart = 622, /* rcstart */ + YYSYMBOL_contents_rc = 623, /* contents_rc */ + YYSYMBOL_content_rc = 624, /* content_rc */ + YYSYMBOL_rc_control_enable = 625, /* rc_control_enable */ + YYSYMBOL_rc_control_port = 626, /* rc_control_port */ + YYSYMBOL_rc_control_interface = 627, /* rc_control_interface */ + YYSYMBOL_rc_control_use_cert = 628, /* rc_control_use_cert */ + YYSYMBOL_rc_server_key_file = 629, /* rc_server_key_file */ + YYSYMBOL_rc_server_cert_file = 630, /* rc_server_cert_file */ + YYSYMBOL_rc_control_key_file = 631, /* rc_control_key_file */ + YYSYMBOL_rc_control_cert_file = 632, /* rc_control_cert_file */ + YYSYMBOL_dtstart = 633, /* dtstart */ + YYSYMBOL_contents_dt = 634, /* contents_dt */ + YYSYMBOL_content_dt = 635, /* content_dt */ + YYSYMBOL_dt_dnstap_enable = 636, /* dt_dnstap_enable */ + YYSYMBOL_dt_dnstap_bidirectional = 637, /* dt_dnstap_bidirectional */ + YYSYMBOL_dt_dnstap_socket_path = 638, /* dt_dnstap_socket_path */ + YYSYMBOL_dt_dnstap_ip = 639, /* dt_dnstap_ip */ + YYSYMBOL_dt_dnstap_tls = 640, /* dt_dnstap_tls */ + YYSYMBOL_dt_dnstap_tls_server_name = 641, /* dt_dnstap_tls_server_name */ + YYSYMBOL_dt_dnstap_tls_cert_bundle = 642, /* dt_dnstap_tls_cert_bundle */ + YYSYMBOL_dt_dnstap_tls_client_key_file = 643, /* dt_dnstap_tls_client_key_file */ + YYSYMBOL_dt_dnstap_tls_client_cert_file = 644, /* dt_dnstap_tls_client_cert_file */ + YYSYMBOL_dt_dnstap_send_identity = 645, /* dt_dnstap_send_identity */ + YYSYMBOL_dt_dnstap_send_version = 646, /* dt_dnstap_send_version */ + YYSYMBOL_dt_dnstap_identity = 647, /* dt_dnstap_identity */ + YYSYMBOL_dt_dnstap_version = 648, /* dt_dnstap_version */ + YYSYMBOL_dt_dnstap_log_resolver_query_messages = 649, /* dt_dnstap_log_resolver_query_messages */ + YYSYMBOL_dt_dnstap_log_resolver_response_messages = 650, /* dt_dnstap_log_resolver_response_messages */ + YYSYMBOL_dt_dnstap_log_client_query_messages = 651, /* dt_dnstap_log_client_query_messages */ + YYSYMBOL_dt_dnstap_log_client_response_messages = 652, /* dt_dnstap_log_client_response_messages */ + YYSYMBOL_dt_dnstap_log_forwarder_query_messages = 653, /* dt_dnstap_log_forwarder_query_messages */ + YYSYMBOL_dt_dnstap_log_forwarder_response_messages = 654, /* dt_dnstap_log_forwarder_response_messages */ + YYSYMBOL_pythonstart = 655, /* pythonstart */ + YYSYMBOL_contents_py = 656, /* contents_py */ + YYSYMBOL_content_py = 657, /* content_py */ + YYSYMBOL_py_script = 658, /* py_script */ + YYSYMBOL_dynlibstart = 659, /* dynlibstart */ + YYSYMBOL_contents_dl = 660, /* contents_dl */ + YYSYMBOL_content_dl = 661, /* content_dl */ + YYSYMBOL_dl_file = 662, /* dl_file */ + YYSYMBOL_server_disable_dnssec_lame_check = 663, /* server_disable_dnssec_lame_check */ + YYSYMBOL_server_log_identity = 664, /* server_log_identity */ + YYSYMBOL_server_response_ip = 665, /* server_response_ip */ + YYSYMBOL_server_response_ip_data = 666, /* server_response_ip_data */ + YYSYMBOL_dnscstart = 667, /* dnscstart */ + YYSYMBOL_contents_dnsc = 668, /* contents_dnsc */ + YYSYMBOL_content_dnsc = 669, /* content_dnsc */ + YYSYMBOL_dnsc_dnscrypt_enable = 670, /* dnsc_dnscrypt_enable */ + YYSYMBOL_dnsc_dnscrypt_port = 671, /* dnsc_dnscrypt_port */ + YYSYMBOL_dnsc_dnscrypt_provider = 672, /* dnsc_dnscrypt_provider */ + YYSYMBOL_dnsc_dnscrypt_provider_cert = 673, /* dnsc_dnscrypt_provider_cert */ + YYSYMBOL_dnsc_dnscrypt_provider_cert_rotated = 674, /* dnsc_dnscrypt_provider_cert_rotated */ + YYSYMBOL_dnsc_dnscrypt_secret_key = 675, /* dnsc_dnscrypt_secret_key */ + YYSYMBOL_dnsc_dnscrypt_shared_secret_cache_size = 676, /* dnsc_dnscrypt_shared_secret_cache_size */ + YYSYMBOL_dnsc_dnscrypt_shared_secret_cache_slabs = 677, /* dnsc_dnscrypt_shared_secret_cache_slabs */ + YYSYMBOL_dnsc_dnscrypt_nonce_cache_size = 678, /* dnsc_dnscrypt_nonce_cache_size */ + YYSYMBOL_dnsc_dnscrypt_nonce_cache_slabs = 679, /* dnsc_dnscrypt_nonce_cache_slabs */ + YYSYMBOL_cachedbstart = 680, /* cachedbstart */ + YYSYMBOL_contents_cachedb = 681, /* contents_cachedb */ + YYSYMBOL_content_cachedb = 682, /* content_cachedb */ + YYSYMBOL_cachedb_backend_name = 683, /* cachedb_backend_name */ + YYSYMBOL_cachedb_secret_seed = 684, /* cachedb_secret_seed */ + YYSYMBOL_redis_server_host = 685, /* redis_server_host */ + YYSYMBOL_redis_server_port = 686, /* redis_server_port */ + YYSYMBOL_redis_timeout = 687, /* redis_timeout */ + YYSYMBOL_redis_expire_records = 688, /* redis_expire_records */ + YYSYMBOL_server_tcp_connection_limit = 689, /* server_tcp_connection_limit */ + YYSYMBOL_server_answer_cookie = 690, /* server_answer_cookie */ + YYSYMBOL_server_cookie_secret = 691, /* server_cookie_secret */ + YYSYMBOL_ipsetstart = 692, /* ipsetstart */ + YYSYMBOL_contents_ipset = 693, /* contents_ipset */ + YYSYMBOL_content_ipset = 694, /* content_ipset */ + YYSYMBOL_ipset_name_v4 = 695, /* ipset_name_v4 */ + YYSYMBOL_ipset_name_v6 = 696 /* ipset_name_v6 */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; @@ -1149,19 +1151,19 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 2 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 715 +#define YYLAST 717 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 335 +#define YYNTOKENS 336 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 360 +#define YYNNTS 361 /* YYNRULES -- Number of rules. */ -#define YYNRULES 697 +#define YYNRULES 699 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 1043 +#define YYNSTATES 1046 /* YYMAXUTOK -- Last valid token kind. */ -#define YYMAXUTOK 589 +#define YYMAXUTOK 590 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM @@ -1233,83 +1235,84 @@ static const yytype_int16 yytranslate[] = 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334 + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { - 0, 201, 201, 201, 202, 202, 203, 203, 204, 204, - 204, 205, 205, 206, 206, 207, 207, 208, 210, 217, - 223, 224, 225, 225, 225, 226, 226, 227, 227, 227, - 228, 228, 229, 229, 229, 230, 230, 231, 231, 231, - 232, 232, 232, 233, 233, 234, 234, 235, 235, 236, - 236, 237, 237, 238, 238, 239, 239, 240, 240, 241, - 241, 241, 242, 242, 243, 243, 243, 244, 244, 244, - 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, - 249, 250, 250, 251, 251, 252, 252, 252, 253, 253, - 254, 254, 255, 255, 256, 256, 256, 257, 257, 258, - 258, 259, 259, 260, 260, 261, 261, 262, 262, 263, - 263, 264, 264, 265, 265, 265, 266, 266, 266, 267, - 267, 267, 268, 268, 268, 268, 269, 270, 270, 270, - 271, 271, 271, 272, 272, 273, 273, 274, 274, 274, - 275, 275, 275, 276, 276, 277, 277, 277, 278, 278, - 278, 279, 279, 279, 280, 280, 281, 281, 282, 282, - 283, 284, 284, 285, 285, 286, 286, 287, 287, 288, - 288, 289, 289, 290, 290, 291, 291, 292, 292, 293, - 293, 294, 294, 294, 295, 295, 296, 296, 297, 297, - 298, 298, 298, 299, 299, 300, 301, 301, 302, 302, - 303, 304, 304, 305, 305, 306, 306, 306, 307, 307, - 308, 308, 308, 309, 309, 309, 310, 310, 311, 312, - 312, 313, 313, 314, 314, 315, 315, 316, 316, 316, - 317, 317, 317, 318, 318, 318, 319, 319, 320, 320, - 321, 321, 322, 322, 323, 323, 324, 324, 325, 325, - 326, 326, 327, 327, 330, 344, 345, 346, 346, 346, - 346, 346, 347, 347, 347, 349, 363, 364, 365, 365, - 365, 365, 366, 366, 366, 368, 384, 385, 386, 386, - 386, 386, 387, 387, 387, 389, 410, 411, 412, 412, - 412, 412, 413, 413, 413, 414, 414, 414, 417, 436, - 453, 461, 471, 478, 488, 507, 508, 509, 509, 509, - 509, 509, 510, 510, 510, 511, 511, 511, 511, 513, - 522, 531, 542, 551, 560, 569, 580, 589, 601, 615, - 630, 641, 658, 675, 692, 709, 724, 739, 752, 767, - 776, 785, 794, 803, 812, 821, 828, 837, 846, 855, - 864, 873, 882, 891, 900, 913, 924, 935, 946, 955, - 968, 977, 986, 995, 1002, 1009, 1018, 1025, 1034, 1042, - 1049, 1056, 1064, 1073, 1081, 1097, 1105, 1113, 1121, 1129, - 1137, 1146, 1155, 1169, 1178, 1187, 1196, 1205, 1214, 1223, - 1230, 1237, 1263, 1271, 1278, 1285, 1292, 1299, 1307, 1315, - 1323, 1330, 1341, 1352, 1359, 1368, 1377, 1386, 1395, 1402, - 1409, 1416, 1432, 1440, 1448, 1458, 1468, 1478, 1492, 1500, - 1513, 1524, 1532, 1545, 1554, 1563, 1572, 1581, 1591, 1601, - 1609, 1622, 1631, 1639, 1648, 1656, 1669, 1678, 1687, 1697, - 1704, 1714, 1724, 1734, 1744, 1754, 1764, 1774, 1784, 1791, - 1798, 1805, 1814, 1823, 1832, 1841, 1848, 1858, 1866, 1875, - 1882, 1900, 1913, 1926, 1939, 1948, 1957, 1966, 1975, 1985, - 1995, 2006, 2015, 2024, 2033, 2042, 2051, 2060, 2069, 2078, - 2091, 2104, 2113, 2120, 2129, 2138, 2147, 2156, 2165, 2173, - 2186, 2194, 2249, 2256, 2271, 2281, 2291, 2298, 2305, 2312, - 2321, 2329, 2343, 2364, 2385, 2397, 2409, 2421, 2430, 2451, - 2463, 2475, 2484, 2505, 2514, 2523, 2531, 2539, 2552, 2565, - 2580, 2595, 2604, 2613, 2623, 2633, 2642, 2648, 2657, 2666, - 2676, 2686, 2696, 2705, 2715, 2724, 2737, 2750, 2762, 2776, - 2788, 2802, 2811, 2822, 2831, 2841, 2848, 2855, 2864, 2873, - 2883, 2893, 2903, 2913, 2920, 2927, 2936, 2945, 2955, 2965, - 2975, 2982, 2989, 2996, 3004, 3014, 3024, 3034, 3044, 3054, - 3064, 3120, 3130, 3138, 3146, 3161, 3170, 3176, 3177, 3178, - 3178, 3178, 3179, 3179, 3179, 3180, 3180, 3182, 3192, 3201, - 3208, 3215, 3222, 3229, 3236, 3243, 3249, 3250, 3251, 3251, - 3251, 3252, 3252, 3252, 3253, 3254, 3254, 3255, 3255, 3256, - 3256, 3257, 3258, 3259, 3260, 3261, 3262, 3264, 3273, 3283, - 3290, 3297, 3306, 3313, 3320, 3327, 3334, 3343, 3352, 3359, - 3366, 3376, 3386, 3396, 3406, 3416, 3426, 3432, 3433, 3434, - 3436, 3442, 3448, 3449, 3450, 3452, 3458, 3468, 3475, 3484, - 3492, 3498, 3499, 3501, 3501, 3501, 3502, 3502, 3503, 3504, - 3505, 3506, 3507, 3509, 3519, 3528, 3535, 3544, 3551, 3560, - 3568, 3581, 3589, 3602, 3608, 3609, 3610, 3610, 3611, 3611, - 3611, 3612, 3614, 3626, 3638, 3650, 3665, 3678, 3691, 3702, - 3711, 3726, 3732, 3733, 3734, 3734, 3736, 3751 + 0, 202, 202, 202, 203, 203, 204, 204, 205, 205, + 205, 206, 206, 207, 207, 208, 208, 209, 211, 218, + 224, 225, 226, 226, 226, 227, 227, 228, 228, 228, + 229, 229, 230, 230, 230, 231, 231, 232, 232, 232, + 233, 233, 233, 234, 234, 235, 235, 236, 236, 237, + 237, 238, 238, 239, 239, 240, 240, 241, 241, 242, + 242, 242, 243, 243, 244, 244, 244, 245, 245, 245, + 246, 246, 247, 247, 248, 248, 249, 249, 250, 250, + 250, 251, 251, 252, 252, 253, 253, 253, 254, 254, + 255, 255, 256, 256, 257, 257, 257, 258, 258, 259, + 259, 260, 260, 261, 261, 262, 262, 263, 263, 264, + 264, 265, 265, 266, 266, 266, 267, 267, 267, 268, + 268, 268, 269, 269, 269, 269, 270, 271, 271, 271, + 272, 272, 272, 273, 273, 274, 274, 275, 275, 275, + 276, 276, 276, 277, 277, 278, 278, 278, 279, 279, + 279, 280, 280, 280, 281, 281, 282, 282, 283, 283, + 284, 285, 285, 286, 286, 287, 287, 288, 288, 289, + 289, 290, 290, 291, 291, 292, 292, 293, 293, 294, + 294, 295, 295, 295, 296, 296, 297, 297, 298, 298, + 299, 299, 299, 300, 300, 301, 302, 302, 303, 303, + 304, 305, 305, 306, 306, 307, 307, 307, 308, 308, + 309, 309, 309, 310, 310, 310, 311, 311, 312, 313, + 313, 314, 314, 315, 315, 316, 316, 317, 317, 317, + 318, 318, 318, 319, 319, 319, 320, 320, 321, 321, + 322, 322, 323, 323, 324, 324, 325, 325, 326, 326, + 327, 327, 328, 328, 329, 331, 345, 346, 347, 347, + 347, 347, 347, 348, 348, 348, 350, 364, 365, 366, + 366, 366, 366, 367, 367, 367, 369, 385, 386, 387, + 387, 387, 387, 388, 388, 388, 390, 411, 412, 413, + 413, 413, 413, 414, 414, 414, 415, 415, 415, 418, + 437, 454, 462, 472, 479, 489, 508, 509, 510, 510, + 510, 510, 510, 511, 511, 511, 512, 512, 512, 512, + 514, 523, 532, 543, 552, 561, 570, 581, 590, 602, + 616, 631, 642, 659, 676, 693, 710, 725, 740, 753, + 768, 777, 786, 795, 804, 813, 822, 829, 838, 847, + 856, 865, 874, 883, 892, 901, 914, 925, 936, 947, + 956, 969, 978, 987, 996, 1003, 1010, 1019, 1026, 1035, + 1043, 1050, 1057, 1065, 1074, 1082, 1098, 1106, 1114, 1122, + 1130, 1138, 1147, 1156, 1170, 1179, 1188, 1197, 1206, 1215, + 1224, 1231, 1238, 1264, 1272, 1279, 1286, 1293, 1300, 1308, + 1316, 1324, 1331, 1342, 1353, 1360, 1369, 1378, 1387, 1396, + 1403, 1410, 1417, 1433, 1441, 1449, 1459, 1469, 1479, 1493, + 1501, 1514, 1525, 1533, 1546, 1555, 1564, 1573, 1582, 1592, + 1602, 1610, 1623, 1632, 1640, 1649, 1657, 1670, 1679, 1688, + 1698, 1705, 1715, 1725, 1735, 1745, 1755, 1765, 1775, 1785, + 1792, 1799, 1806, 1815, 1824, 1833, 1842, 1849, 1859, 1867, + 1876, 1883, 1901, 1914, 1927, 1940, 1949, 1958, 1967, 1976, + 1986, 1996, 2007, 2016, 2025, 2034, 2043, 2052, 2061, 2070, + 2079, 2092, 2105, 2114, 2121, 2130, 2139, 2148, 2157, 2166, + 2174, 2187, 2195, 2250, 2257, 2272, 2282, 2292, 2299, 2306, + 2313, 2322, 2330, 2344, 2365, 2386, 2398, 2410, 2422, 2431, + 2452, 2464, 2476, 2485, 2506, 2515, 2524, 2532, 2540, 2553, + 2566, 2581, 2596, 2605, 2614, 2624, 2634, 2643, 2649, 2658, + 2667, 2677, 2687, 2697, 2706, 2716, 2725, 2738, 2751, 2763, + 2777, 2789, 2803, 2812, 2823, 2832, 2839, 2849, 2856, 2863, + 2872, 2881, 2891, 2901, 2911, 2921, 2928, 2935, 2944, 2953, + 2963, 2973, 2983, 2990, 2997, 3004, 3012, 3022, 3032, 3042, + 3052, 3062, 3072, 3128, 3138, 3146, 3154, 3169, 3178, 3184, + 3185, 3186, 3186, 3186, 3187, 3187, 3187, 3188, 3188, 3190, + 3200, 3209, 3216, 3223, 3230, 3237, 3244, 3251, 3257, 3258, + 3259, 3259, 3259, 3260, 3260, 3260, 3261, 3262, 3262, 3263, + 3263, 3264, 3264, 3265, 3266, 3267, 3268, 3269, 3270, 3272, + 3281, 3291, 3298, 3305, 3314, 3321, 3328, 3335, 3342, 3351, + 3360, 3367, 3374, 3384, 3394, 3404, 3414, 3424, 3434, 3440, + 3441, 3442, 3444, 3450, 3456, 3457, 3458, 3460, 3466, 3476, + 3483, 3492, 3500, 3506, 3507, 3509, 3509, 3509, 3510, 3510, + 3511, 3512, 3513, 3514, 3515, 3517, 3527, 3536, 3543, 3552, + 3559, 3568, 3576, 3589, 3597, 3610, 3616, 3617, 3618, 3618, + 3619, 3619, 3619, 3620, 3622, 3634, 3646, 3658, 3673, 3686, + 3699, 3710, 3719, 3734, 3740, 3741, 3742, 3742, 3744, 3759 }; #endif @@ -1452,12 +1455,13 @@ static const char *const yytname[] = "VAR_ZONEMD_REJECT_ABSENCE", "VAR_RPZ_SIGNAL_NXDOMAIN_RA", "VAR_INTERFACE_AUTOMATIC_PORTS", "VAR_EDE", "VAR_INTERFACE_ACTION", "VAR_INTERFACE_VIEW", "VAR_INTERFACE_TAG", "VAR_INTERFACE_TAG_ACTION", - "VAR_INTERFACE_TAG_DATA", "$accept", "toplevelvars", "toplevelvar", - "force_toplevel", "serverstart", "contents_server", "content_server", - "stubstart", "contents_stub", "content_stub", "forwardstart", - "contents_forward", "content_forward", "viewstart", "contents_view", - "content_view", "authstart", "contents_auth", "content_auth", "rpz_tag", - "rpz_action_override", "rpz_cname_override", "rpz_log", "rpz_log_name", + "VAR_INTERFACE_TAG_DATA", "VAR_PROXY_PROTOCOL_PORT", "$accept", + "toplevelvars", "toplevelvar", "force_toplevel", "serverstart", + "contents_server", "content_server", "stubstart", "contents_stub", + "content_stub", "forwardstart", "contents_forward", "content_forward", + "viewstart", "contents_view", "content_view", "authstart", + "contents_auth", "content_auth", "rpz_tag", "rpz_action_override", + "rpz_cname_override", "rpz_log", "rpz_log_name", "rpz_signal_nxdomain_ra", "rpzstart", "contents_rpz", "content_rpz", "server_num_threads", "server_verbosity", "server_statistics_interval", "server_statistics_cumulative", "server_extended_statistics", @@ -1556,17 +1560,18 @@ static const char *const yytname[] = "server_ipsecmod_ignore_bogus", "server_ipsecmod_hook", "server_ipsecmod_max_ttl", "server_ipsecmod_whitelist", "server_ipsecmod_strict", "server_edns_client_string", - "server_edns_client_string_opcode", "server_ede", "stub_name", - "stub_host", "stub_addr", "stub_first", "stub_no_cache", - "stub_ssl_upstream", "stub_tcp_upstream", "stub_prime", "forward_name", - "forward_host", "forward_addr", "forward_first", "forward_no_cache", - "forward_ssl_upstream", "forward_tcp_upstream", "auth_name", - "auth_zonefile", "auth_master", "auth_url", "auth_allow_notify", - "auth_zonemd_check", "auth_zonemd_reject_absence", "auth_for_downstream", - "auth_for_upstream", "auth_fallback_enabled", "view_name", - "view_local_zone", "view_response_ip", "view_response_ip_data", - "view_local_data", "view_local_data_ptr", "view_first", "rcstart", - "contents_rc", "content_rc", "rc_control_enable", "rc_control_port", + "server_edns_client_string_opcode", "server_ede", + "server_proxy_protocol_port", "stub_name", "stub_host", "stub_addr", + "stub_first", "stub_no_cache", "stub_ssl_upstream", "stub_tcp_upstream", + "stub_prime", "forward_name", "forward_host", "forward_addr", + "forward_first", "forward_no_cache", "forward_ssl_upstream", + "forward_tcp_upstream", "auth_name", "auth_zonefile", "auth_master", + "auth_url", "auth_allow_notify", "auth_zonemd_check", + "auth_zonemd_reject_absence", "auth_for_downstream", "auth_for_upstream", + "auth_fallback_enabled", "view_name", "view_local_zone", + "view_response_ip", "view_response_ip_data", "view_local_data", + "view_local_data_ptr", "view_first", "rcstart", "contents_rc", + "content_rc", "rc_control_enable", "rc_control_port", "rc_control_interface", "rc_control_use_cert", "rc_server_key_file", "rc_server_cert_file", "rc_control_key_file", "rc_control_cert_file", "dtstart", "contents_dt", "content_dt", "dt_dnstap_enable", @@ -1622,31 +1627,31 @@ static const yytype_int16 yypact[] = -286, 250, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, - -286, -286, -13, 225, 252, 219, 56, 38, 143, -14, - -81, -285, 129, -191, -278, 29, 30, 31, 80, 81, + -286, -286, -13, 219, 233, 224, 56, 39, 143, -14, + -81, -285, 129, -190, -278, 29, 30, 31, 73, 81, 87, 92, 119, 120, 121, 123, 124, 132, 165, 208, - 210, 238, 239, 253, 255, 256, 257, 259, 261, 264, - 265, 268, 271, 276, 277, 288, 293, 294, 297, 302, - 303, 304, 316, 318, 319, 320, 321, 323, 324, 326, - 327, 329, 335, 337, 338, 339, 341, 347, 348, 349, - 350, 351, 352, 353, 356, 357, 359, 360, 362, 363, - 364, 365, 366, 367, 368, 369, 383, 385, 387, 388, - 390, 391, 392, 393, 394, 395, 396, 397, 398, 401, - 402, 403, 404, 405, 406, 407, 408, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 443, - 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, - 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, - 464, 465, 466, 467, 468, 469, 470, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 494, 495, - 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 516, 517, - 518, 519, 520, 521, 522, 524, 525, 526, 527, 528, - 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, - 539, 540, 542, 543, 544, 545, 546, 547, 548, 550, - 551, 552, 554, 555, 556, 557, 558, -286, -286, -286, + 210, 238, 239, 253, 255, 260, 261, 262, 263, 264, + 265, 271, 287, 288, 290, 291, 293, 294, 297, 302, + 303, 304, 317, 318, 320, 321, 324, 325, 326, 327, + 329, 335, 337, 338, 339, 341, 342, 348, 349, 350, + 351, 353, 357, 358, 359, 360, 361, 362, 363, 366, + 368, 369, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 406, 407, 408, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 510, 511, 512, 513, 515, 516, 517, 518, + 519, 520, 521, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 550, 551, + 552, 554, 555, 556, 557, 558, 560, 561, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, @@ -1670,60 +1675,60 @@ static const yytype_int16 yypact[] = -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, - 560, 561, 562, 563, 564, 565, 566, 567, -286, -286, - -286, -286, -286, -286, -286, -286, -286, 568, 569, 570, - 571, 572, 573, 574, -286, -286, -286, -286, -286, -286, - -286, -286, 575, 576, 577, 578, 579, 580, 581, -286, - -286, -286, -286, -286, -286, -286, -286, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, -286, -286, -286, - -286, -286, -286, -286, -286, -286, -286, -286, 592, 593, - 594, 595, 596, 597, -286, -286, -286, -286, -286, -286, - -286, -286, -286, -286, -286, -286, -286, 598, 599, 600, - 601, 602, 603, 604, 605, -286, -286, -286, -286, -286, - -286, -286, -286, -286, 606, 607, 608, 609, 610, 611, + -286, -286, 562, 563, 564, 565, 566, 567, 568, 569, + -286, -286, -286, -286, -286, -286, -286, -286, -286, 570, + 571, 572, 573, 574, 575, 576, -286, -286, -286, -286, + -286, -286, -286, -286, 577, 578, 579, 580, 581, 582, + 583, -286, -286, -286, -286, -286, -286, -286, -286, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + 594, 595, 596, 597, 598, 599, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, 600, + 601, 602, 603, 604, 605, 606, 607, -286, -286, -286, + -286, -286, -286, -286, -286, -286, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, - 622, 623, 624, -286, -286, -286, -286, -286, -286, -286, + 622, 623, 624, 625, 626, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, - -286, -286, -286, 625, -286, -286, 626, -286, -286, 627, - 628, 629, 630, 631, 632, 633, 634, 635, 636, -286, - -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, - 637, 638, 639, 640, 641, 642, -286, -286, -286, -286, - -286, -286, -286, 643, 644, -286, -286, -286, -286, -286, - -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, - -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, - -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, - -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, - -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, - -286, -286, -286, -286, -286, -286, -286, -286, 645, 646, + -286, -286, -286, -286, -286, 627, -286, -286, 628, -286, + -286, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, 639, 640, 641, 642, 643, 644, -286, -286, + -286, -286, -286, -286, -286, 645, 646, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, - -286, -286, -286, -286, -286, -286, -286, -286, -286, 647, - 648, 649, -286, -286, -286, -286, -286, -286, -286, -286, - -286, -286, -286, 650, 651, -286, -286, -286, -286, -286, - -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, - -286, -286, -286, -286, -286, -286, 652, 653, 654, 655, - 656, 657, -286, -286, -286, -286, -286, -286, -286, -286, - -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, - -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, - -286, -286, -286, -286, -286, -286, -286, 658, -286, -286, - -286, -286, -286, -286, -286, -286, -286, -286, -286, 659, - -286, -286, -286, -286, -286, 660, 661, 662, 663, 664, - -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, - -286, -286, -286, -286, -286, -286, 665, -286, -286, 666, - 667, -286, -286, -286, -286, -286, -286, -286, -286, -286, + 647, 648, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, - -286, -286, -286, -286, 668, 669, 670, -286, -286, -286, - -286, -286, -286, 671, 672, -286, -286, -286, -286, -286, - -286, -286, -286 + -286, 649, 650, 651, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, 652, 653, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, 654, 655, + 656, 657, 658, 659, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, 660, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, 661, -286, -286, -286, -286, -286, 662, 663, 664, + 665, 666, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, 667, + -286, -286, 668, 669, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, 670, 671, 672, + -286, -286, -286, -286, -286, -286, 673, 674, -286, -286, + -286, -286, -286, -286, -286, -286 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -1731,10 +1736,10 @@ static const yytype_int16 yypact[] = means the default is an error. */ static const yytype_int16 yydefact[] = { - 2, 0, 1, 18, 19, 254, 265, 576, 636, 595, - 275, 650, 673, 285, 691, 304, 641, 3, 17, 21, - 256, 267, 277, 287, 306, 578, 597, 638, 643, 652, - 675, 693, 4, 5, 6, 10, 14, 15, 8, 9, + 2, 0, 1, 18, 19, 255, 266, 578, 638, 597, + 276, 652, 675, 286, 693, 305, 643, 3, 17, 21, + 257, 268, 278, 288, 307, 580, 599, 640, 645, 654, + 677, 695, 4, 5, 6, 10, 14, 15, 8, 9, 7, 16, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1758,84 +1763,84 @@ static const yytype_int16 yydefact[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 20, 22, 23, - 88, 91, 100, 213, 214, 24, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 37, 79, 25, 92, - 93, 48, 72, 87, 252, 26, 27, 30, 31, 28, - 29, 32, 33, 34, 249, 250, 251, 35, 36, 124, - 225, 125, 127, 128, 129, 227, 232, 228, 239, 240, - 241, 244, 130, 131, 132, 133, 134, 135, 136, 209, - 89, 78, 104, 122, 123, 237, 234, 126, 38, 39, - 40, 41, 42, 80, 94, 95, 111, 66, 76, 67, - 217, 218, 105, 58, 59, 216, 62, 60, 61, 63, - 247, 115, 119, 140, 151, 181, 154, 238, 116, 73, - 43, 44, 45, 102, 141, 142, 143, 144, 46, 47, - 49, 50, 52, 53, 51, 148, 149, 155, 54, 55, - 56, 64, 83, 120, 97, 150, 90, 177, 98, 99, - 117, 118, 235, 103, 57, 81, 84, 190, 65, 68, - 106, 107, 108, 82, 178, 109, 69, 70, 71, 226, - 121, 200, 201, 202, 203, 204, 205, 206, 207, 215, - 110, 77, 248, 112, 113, 114, 179, 74, 75, 96, - 85, 86, 101, 137, 138, 236, 139, 145, 146, 147, - 182, 183, 185, 187, 188, 186, 189, 192, 193, 194, - 191, 210, 152, 153, 158, 159, 156, 157, 160, 161, - 163, 162, 165, 164, 166, 229, 231, 230, 180, 195, - 196, 197, 198, 199, 219, 221, 220, 222, 223, 224, - 245, 246, 253, 184, 208, 211, 212, 233, 242, 243, - 0, 0, 0, 0, 0, 0, 0, 0, 255, 257, - 258, 259, 261, 262, 263, 264, 260, 0, 0, 0, - 0, 0, 0, 0, 266, 268, 269, 270, 271, 272, - 273, 274, 0, 0, 0, 0, 0, 0, 0, 276, - 278, 279, 282, 283, 280, 284, 281, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 286, 288, 289, - 290, 291, 295, 296, 297, 292, 293, 294, 0, 0, - 0, 0, 0, 0, 309, 313, 314, 315, 316, 317, - 305, 307, 308, 310, 311, 312, 318, 0, 0, 0, - 0, 0, 0, 0, 0, 577, 579, 581, 580, 586, - 582, 583, 584, 585, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 20, 22, + 23, 88, 91, 100, 213, 214, 24, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 37, 79, 25, + 92, 93, 48, 72, 87, 252, 26, 27, 30, 31, + 28, 29, 32, 33, 34, 249, 250, 251, 35, 36, + 124, 225, 125, 127, 128, 129, 227, 232, 228, 239, + 240, 241, 244, 130, 131, 132, 133, 134, 135, 136, + 209, 89, 78, 104, 122, 123, 237, 234, 126, 38, + 39, 40, 41, 42, 80, 94, 95, 111, 66, 76, + 67, 217, 218, 105, 58, 59, 216, 62, 60, 61, + 63, 247, 115, 119, 140, 151, 181, 154, 238, 116, + 73, 43, 44, 45, 102, 141, 142, 143, 144, 46, + 47, 49, 50, 52, 53, 51, 148, 149, 155, 54, + 55, 56, 64, 83, 120, 97, 150, 90, 177, 98, + 99, 117, 118, 235, 103, 57, 81, 84, 190, 65, + 68, 106, 107, 108, 82, 178, 109, 69, 70, 71, + 226, 121, 200, 201, 202, 203, 204, 205, 206, 207, + 215, 110, 77, 248, 112, 113, 114, 179, 74, 75, + 96, 85, 86, 101, 137, 138, 236, 139, 145, 146, + 147, 182, 183, 185, 187, 188, 186, 189, 192, 193, + 194, 191, 210, 152, 153, 158, 159, 156, 157, 160, + 161, 163, 162, 165, 164, 166, 229, 231, 230, 180, + 195, 196, 197, 198, 199, 219, 221, 220, 222, 223, + 224, 245, 246, 253, 254, 184, 208, 211, 212, 233, + 242, 243, 0, 0, 0, 0, 0, 0, 0, 0, + 256, 258, 259, 260, 262, 263, 264, 265, 261, 0, + 0, 0, 0, 0, 0, 0, 267, 269, 270, 271, + 272, 273, 274, 275, 0, 0, 0, 0, 0, 0, + 0, 277, 279, 280, 283, 284, 281, 285, 282, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, + 289, 290, 291, 292, 296, 297, 298, 293, 294, 295, + 0, 0, 0, 0, 0, 0, 310, 314, 315, 316, + 317, 318, 306, 308, 309, 311, 312, 313, 319, 0, + 0, 0, 0, 0, 0, 0, 0, 579, 581, 583, + 582, 588, 584, 585, 586, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 596, 598, 600, 599, 601, 602, 603, + 0, 0, 0, 0, 0, 598, 600, 602, 601, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 0, 637, 639, 0, 642, 644, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 651, - 653, 654, 655, 657, 658, 656, 659, 660, 661, 662, - 0, 0, 0, 0, 0, 0, 674, 676, 677, 678, - 679, 680, 681, 0, 0, 692, 694, 695, 320, 319, - 326, 339, 337, 350, 346, 347, 351, 348, 349, 352, - 353, 354, 358, 359, 389, 390, 391, 392, 393, 421, - 422, 423, 429, 430, 342, 431, 432, 435, 433, 434, - 439, 440, 441, 455, 404, 405, 408, 409, 442, 459, - 398, 400, 460, 467, 468, 469, 343, 420, 488, 489, - 399, 482, 382, 338, 394, 456, 464, 443, 0, 0, - 492, 344, 321, 381, 447, 322, 340, 341, 395, 396, - 490, 445, 449, 450, 356, 355, 323, 493, 424, 454, - 383, 403, 461, 462, 463, 466, 481, 397, 486, 484, - 485, 412, 419, 451, 452, 413, 414, 444, 471, 384, - 385, 388, 360, 362, 357, 363, 364, 365, 366, 373, - 374, 375, 376, 377, 378, 379, 494, 495, 497, 425, - 426, 427, 428, 436, 437, 438, 498, 499, 500, 0, - 0, 0, 446, 415, 417, 646, 513, 517, 515, 514, - 518, 516, 525, 0, 0, 521, 522, 523, 524, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 448, - 465, 487, 529, 530, 416, 501, 0, 0, 0, 0, - 0, 0, 472, 473, 474, 475, 476, 477, 478, 479, - 480, 647, 406, 407, 410, 401, 470, 380, 324, 325, - 402, 531, 532, 533, 534, 535, 537, 536, 538, 539, - 540, 361, 368, 526, 528, 527, 367, 0, 689, 690, - 387, 453, 496, 386, 418, 369, 370, 372, 371, 0, - 542, 411, 483, 345, 543, 0, 0, 0, 0, 0, - 544, 545, 546, 551, 549, 550, 547, 548, 552, 553, - 554, 555, 557, 558, 556, 569, 0, 573, 574, 0, - 0, 575, 559, 567, 560, 561, 562, 566, 568, 563, - 564, 565, 298, 299, 300, 301, 302, 303, 587, 589, - 588, 591, 592, 593, 594, 590, 617, 619, 620, 621, - 622, 623, 624, 625, 626, 627, 618, 628, 629, 630, - 631, 632, 633, 634, 635, 640, 645, 663, 664, 665, - 668, 666, 667, 669, 670, 671, 672, 682, 683, 684, - 685, 686, 687, 696, 697, 457, 491, 512, 648, 649, - 519, 520, 502, 503, 0, 0, 0, 507, 688, 541, - 458, 511, 508, 0, 0, 570, 571, 572, 506, 504, - 505, 509, 510 + 614, 615, 616, 617, 618, 0, 639, 641, 0, 644, + 646, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 653, 655, 656, 657, 659, 660, 658, 661, 662, + 663, 664, 0, 0, 0, 0, 0, 0, 676, 678, + 679, 680, 681, 682, 683, 0, 0, 694, 696, 697, + 321, 320, 327, 340, 338, 351, 347, 348, 352, 349, + 350, 353, 354, 355, 359, 360, 390, 391, 392, 393, + 394, 422, 423, 424, 430, 431, 343, 432, 433, 436, + 434, 435, 440, 441, 442, 456, 405, 406, 409, 410, + 443, 460, 399, 401, 461, 468, 469, 470, 344, 421, + 489, 490, 400, 483, 383, 339, 395, 457, 465, 444, + 0, 0, 493, 345, 322, 382, 448, 323, 341, 342, + 396, 397, 491, 446, 450, 451, 357, 356, 324, 494, + 425, 455, 384, 404, 462, 463, 464, 467, 482, 398, + 487, 485, 486, 413, 420, 452, 453, 414, 415, 445, + 472, 385, 386, 389, 361, 363, 358, 364, 365, 366, + 367, 374, 375, 376, 377, 378, 379, 380, 495, 496, + 498, 426, 427, 428, 429, 437, 438, 439, 499, 500, + 501, 0, 0, 0, 447, 416, 418, 648, 514, 518, + 516, 515, 519, 517, 526, 0, 0, 522, 523, 524, + 525, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 449, 466, 488, 530, 531, 417, 502, 0, 0, + 0, 0, 0, 0, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 649, 407, 408, 411, 402, 471, 381, + 325, 326, 403, 532, 533, 534, 535, 536, 538, 537, + 539, 540, 541, 362, 369, 527, 529, 528, 368, 0, + 691, 692, 388, 454, 497, 387, 419, 370, 371, 373, + 372, 0, 543, 412, 484, 346, 544, 0, 0, 0, + 0, 0, 545, 546, 547, 548, 553, 551, 552, 549, + 550, 554, 555, 556, 557, 559, 560, 558, 571, 0, + 575, 576, 0, 0, 577, 561, 569, 562, 563, 564, + 568, 570, 565, 566, 567, 299, 300, 301, 302, 303, + 304, 589, 591, 590, 593, 594, 595, 596, 592, 619, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 620, + 630, 631, 632, 633, 634, 635, 636, 637, 642, 647, + 665, 666, 667, 670, 668, 669, 671, 672, 673, 674, + 684, 685, 686, 687, 688, 689, 698, 699, 458, 492, + 513, 650, 651, 520, 521, 503, 504, 0, 0, 0, + 508, 690, 542, 459, 512, 509, 0, 0, 572, 573, + 574, 507, 505, 506, 510, 511 }; /* YYPGOTO[NTERM-NUM]. */ @@ -1867,8 +1872,8 @@ static const yytype_int16 yypgoto[] = -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, - -286, -286, -286, -286, -286, -286, -286, -286, 673, 674, - 675, 676, 677, -286, -286, 678, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, 675, + 676, 677, 678, 679, -286, -286, 680, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, @@ -1876,48 +1881,50 @@ static const yytype_int16 yypgoto[] = -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, - -286, -286, -286, -286, -286, -286, -286, -286, -286, -286 + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - 0, 1, 17, 18, 19, 32, 277, 20, 33, 518, - 21, 34, 534, 22, 35, 549, 23, 36, 567, 584, - 585, 586, 587, 588, 589, 24, 37, 590, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, - 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, - 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, - 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, - 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, - 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, - 500, 501, 502, 519, 520, 521, 522, 523, 524, 525, - 526, 535, 536, 537, 538, 539, 540, 541, 568, 569, - 570, 571, 572, 573, 574, 575, 576, 577, 550, 551, - 552, 553, 554, 555, 556, 25, 38, 605, 606, 607, - 608, 609, 610, 611, 612, 613, 26, 39, 633, 634, - 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 27, 40, - 654, 655, 28, 41, 657, 658, 503, 504, 505, 506, - 29, 42, 669, 670, 671, 672, 673, 674, 675, 676, - 677, 678, 679, 30, 43, 686, 687, 688, 689, 690, - 691, 692, 507, 508, 509, 31, 44, 695, 696, 697 + 0, 1, 17, 18, 19, 32, 278, 20, 33, 520, + 21, 34, 536, 22, 35, 551, 23, 36, 569, 586, + 587, 588, 589, 590, 591, 24, 37, 592, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 521, 522, 523, 524, 525, 526, + 527, 528, 537, 538, 539, 540, 541, 542, 543, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 552, + 553, 554, 555, 556, 557, 558, 25, 38, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 26, 39, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 27, + 40, 656, 657, 28, 41, 659, 660, 505, 506, 507, + 508, 29, 42, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, 681, 30, 43, 688, 689, 690, 691, + 692, 693, 694, 509, 510, 511, 31, 44, 697, 698, + 699 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -1928,75 +1935,75 @@ static const yytype_int16 yytable[] = 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 693, 694, 653, 656, 77, 78, 79, 698, - 699, 700, 80, 81, 82, 83, 84, 85, 86, 87, + 75, 76, 695, 696, 655, 658, 77, 78, 79, 700, + 701, 702, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 557, 680, 681, 682, 683, 684, 685, - 701, 702, 121, 122, 123, 124, 125, 703, 126, 127, - 128, 557, 704, 129, 130, 131, 132, 133, 134, 135, + 118, 119, 120, 703, 559, 682, 683, 684, 685, 686, + 687, 704, 121, 122, 123, 124, 125, 705, 126, 127, + 128, 559, 706, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 705, - 706, 707, 155, 708, 709, 156, 157, 158, 159, 160, - 161, 162, 710, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 614, 615, 616, 617, - 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, - 628, 629, 630, 631, 632, 711, 176, 177, 178, 179, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 707, + 708, 709, 155, 710, 711, 156, 157, 158, 159, 160, + 161, 162, 712, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 713, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 712, 218, - 713, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 210, 211, 212, 213, 214, 215, 216, 217, 714, 218, + 715, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 597, 598, 599, 600, 601, 602, 603, 604, 714, 715, + 599, 600, 601, 602, 603, 604, 605, 606, 716, 717, 2, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 3, 4, 716, 542, 717, 718, 719, 248, 720, - 510, 721, 511, 512, 722, 723, 249, 250, 724, 251, - 252, 725, 253, 254, 255, 256, 726, 727, 257, 258, - 259, 260, 261, 262, 263, 264, 5, 527, 728, 265, - 543, 544, 6, 729, 730, 528, 529, 731, 266, 267, - 268, 269, 732, 733, 734, 270, 271, 272, 273, 274, - 275, 276, 559, 560, 561, 562, 735, 545, 736, 737, - 738, 739, 564, 740, 741, 513, 742, 743, 558, 744, - 559, 560, 561, 562, 563, 745, 7, 746, 747, 748, - 564, 749, 578, 579, 580, 581, 582, 750, 751, 752, - 753, 754, 755, 756, 8, 583, 757, 758, 514, 759, - 760, 515, 761, 762, 763, 764, 765, 766, 767, 768, - 516, 565, 566, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 769, 530, 770, 531, 771, 772, 532, - 773, 774, 775, 776, 777, 778, 779, 780, 781, 546, - 547, 782, 783, 784, 785, 786, 787, 788, 789, 9, - 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, - 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, - 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, - 820, 821, 548, 822, 823, 824, 825, 826, 827, 828, - 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, - 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, - 849, 10, 850, 851, 852, 853, 854, 855, 856, 857, - 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, - 868, 869, 870, 11, 871, 872, 873, 874, 875, 876, - 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, - 887, 888, 889, 890, 12, 517, 891, 892, 893, 894, - 895, 896, 897, 13, 898, 899, 900, 901, 902, 903, + 247, 3, 4, 718, 512, 719, 513, 514, 248, 544, + 720, 721, 722, 723, 724, 725, 249, 250, 529, 251, + 252, 726, 253, 254, 255, 256, 530, 531, 257, 258, + 259, 260, 261, 262, 263, 264, 5, 727, 728, 265, + 729, 730, 6, 731, 732, 545, 546, 733, 266, 267, + 268, 269, 734, 735, 736, 270, 271, 272, 273, 274, + 275, 276, 277, 561, 562, 563, 564, 737, 738, 515, + 739, 740, 547, 566, 741, 742, 743, 744, 560, 745, + 561, 562, 563, 564, 565, 746, 7, 747, 748, 749, + 566, 750, 751, 580, 581, 582, 583, 584, 752, 753, + 754, 755, 516, 756, 8, 517, 585, 757, 758, 759, + 760, 761, 762, 763, 518, 532, 764, 533, 765, 766, + 534, 567, 568, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 767, 768, 769, 770, 771, 772, 773, + 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, + 784, 785, 786, 787, 548, 549, 788, 789, 790, 9, + 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, + 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, + 821, 822, 823, 824, 825, 826, 827, 550, 828, 829, + 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, + 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, + 850, 10, 851, 852, 853, 854, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, + 869, 870, 871, 11, 872, 873, 874, 875, 876, 877, + 878, 879, 880, 881, 882, 883, 884, 885, 886, 519, + 887, 888, 889, 890, 12, 891, 892, 893, 894, 895, + 896, 897, 535, 13, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, - 914, 533, 915, 916, 917, 918, 919, 920, 921, 14, - 922, 923, 924, 15, 925, 926, 927, 928, 929, 16, - 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, - 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, - 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, - 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, - 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, - 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, - 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, - 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, - 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, - 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, - 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, - 1040, 1041, 1042, 0, 0, 0, 0, 0, 0, 0, + 914, 915, 916, 917, 918, 919, 920, 921, 922, 14, + 923, 924, 925, 15, 926, 927, 928, 929, 930, 16, + 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, + 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, + 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, + 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, + 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, + 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, + 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, + 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, + 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, + 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, + 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, + 1041, 1042, 1043, 1044, 1045, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 591, 592, 593, 594, 595, 596 + 0, 0, 593, 594, 595, 596, 597, 598 }; static const yytype_int16 yycheck[] = @@ -2009,8 +2016,8 @@ static const yytype_int16 yycheck[] = 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 45, 275, 276, 277, 278, 279, 280, - 10, 10, 105, 106, 107, 108, 109, 10, 111, 112, + 93, 94, 95, 10, 45, 275, 276, 277, 278, 279, + 280, 10, 105, 106, 107, 108, 109, 10, 111, 112, 113, 45, 10, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 10, @@ -2027,36 +2034,36 @@ static const yytype_int16 yycheck[] = 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 97, 98, 99, 100, 101, 102, 103, 104, 10, 10, 0, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 11, 12, 10, 45, 10, 10, 10, 281, 10, - 45, 10, 47, 48, 10, 10, 289, 290, 10, 292, - 293, 10, 295, 296, 297, 298, 10, 10, 301, 302, - 303, 304, 305, 306, 307, 308, 46, 45, 10, 312, - 81, 82, 52, 10, 10, 53, 54, 10, 321, 322, + 273, 11, 12, 10, 45, 10, 47, 48, 281, 45, + 10, 10, 10, 10, 10, 10, 289, 290, 45, 292, + 293, 10, 295, 296, 297, 298, 53, 54, 301, 302, + 303, 304, 305, 306, 307, 308, 46, 10, 10, 312, + 10, 10, 52, 10, 10, 81, 82, 10, 321, 322, 323, 324, 10, 10, 10, 328, 329, 330, 331, 332, - 333, 334, 284, 285, 286, 287, 10, 108, 10, 10, - 10, 10, 294, 10, 10, 110, 10, 10, 282, 10, + 333, 334, 335, 284, 285, 286, 287, 10, 10, 110, + 10, 10, 108, 294, 10, 10, 10, 10, 282, 10, 284, 285, 286, 287, 288, 10, 96, 10, 10, 10, - 294, 10, 314, 315, 316, 317, 318, 10, 10, 10, - 10, 10, 10, 10, 114, 327, 10, 10, 143, 10, - 10, 146, 10, 10, 10, 10, 10, 10, 10, 10, - 155, 325, 326, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 10, 142, 10, 144, 10, 10, 147, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 190, - 191, 10, 10, 10, 10, 10, 10, 10, 10, 169, + 294, 10, 10, 314, 315, 316, 317, 318, 10, 10, + 10, 10, 143, 10, 114, 146, 327, 10, 10, 10, + 10, 10, 10, 10, 155, 142, 10, 144, 10, 10, + 147, 325, 326, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 190, 191, 10, 10, 10, 169, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 233, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 233, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 231, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 253, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 300, + 10, 10, 10, 10, 274, 10, 10, 10, 10, 10, + 10, 10, 299, 283, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 274, 300, 10, 10, 10, 10, - 10, 10, 10, 283, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 299, 10, 10, 10, 10, 10, 10, 10, 309, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 309, 10, 10, 10, 313, 10, 10, 10, 10, 10, 319, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, @@ -2069,21 +2076,21 @@ static const yytype_int16 yycheck[] = 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, -1, -1, -1, -1, -1, -1, -1, + 10, 10, 10, 10, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 37, 37, 37, 37, 37, 37 + -1, -1, 37, 37, 37, 37, 37, 37 }; /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of state STATE-NUM. */ static const yytype_int16 yystos[] = { - 0, 336, 0, 11, 12, 46, 52, 96, 114, 169, - 231, 253, 274, 283, 309, 313, 319, 337, 338, 339, - 342, 345, 348, 351, 360, 620, 631, 653, 657, 665, - 678, 690, 340, 343, 346, 349, 352, 361, 621, 632, - 654, 658, 666, 679, 691, 13, 14, 15, 16, 17, + 0, 337, 0, 11, 12, 46, 52, 96, 114, 169, + 231, 253, 274, 283, 309, 313, 319, 338, 339, 340, + 343, 346, 349, 352, 361, 622, 633, 655, 659, 667, + 680, 692, 341, 344, 347, 350, 353, 362, 623, 634, + 656, 660, 668, 681, 693, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 49, 50, 51, @@ -2106,7 +2113,7 @@ static const yytype_int16 yystos[] = 266, 267, 268, 269, 270, 271, 272, 273, 281, 289, 290, 292, 293, 295, 296, 297, 298, 301, 302, 303, 304, 305, 306, 307, 308, 312, 321, 322, 323, 324, - 328, 329, 330, 331, 332, 333, 334, 341, 363, 364, + 328, 329, 330, 331, 332, 333, 334, 335, 342, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, @@ -2129,26 +2136,26 @@ static const yytype_int16 yystos[] = 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 661, 662, 663, 664, 687, 688, 689, - 45, 47, 48, 110, 143, 146, 155, 300, 344, 588, - 589, 590, 591, 592, 593, 594, 595, 45, 53, 54, - 142, 144, 147, 299, 347, 596, 597, 598, 599, 600, - 601, 602, 45, 81, 82, 108, 190, 191, 233, 350, - 613, 614, 615, 616, 617, 618, 619, 45, 282, 284, - 285, 286, 287, 288, 294, 325, 326, 353, 603, 604, - 605, 606, 607, 608, 609, 610, 611, 612, 314, 315, - 316, 317, 318, 327, 354, 355, 356, 357, 358, 359, - 362, 603, 604, 605, 606, 607, 610, 97, 98, 99, - 100, 101, 102, 103, 104, 622, 623, 624, 625, 626, - 627, 628, 629, 630, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 633, 634, 635, 636, 637, 638, 639, + 585, 586, 587, 588, 589, 663, 664, 665, 666, 689, + 690, 691, 45, 47, 48, 110, 143, 146, 155, 300, + 345, 590, 591, 592, 593, 594, 595, 596, 597, 45, + 53, 54, 142, 144, 147, 299, 348, 598, 599, 600, + 601, 602, 603, 604, 45, 81, 82, 108, 190, 191, + 233, 351, 615, 616, 617, 618, 619, 620, 621, 45, + 282, 284, 285, 286, 287, 288, 294, 325, 326, 354, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 314, 315, 316, 317, 318, 327, 355, 356, 357, 358, + 359, 360, 363, 605, 606, 607, 608, 609, 612, 97, + 98, 99, 100, 101, 102, 103, 104, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, - 650, 651, 652, 115, 655, 656, 320, 659, 660, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 667, - 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, - 275, 276, 277, 278, 279, 280, 680, 681, 682, 683, - 684, 685, 686, 310, 311, 692, 693, 694, 10, 10, + 650, 651, 652, 653, 654, 115, 657, 658, 320, 661, + 662, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 275, 276, 277, 278, 279, 280, 682, 683, + 684, 685, 686, 687, 688, 310, 311, 694, 695, 696, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, @@ -2183,44 +2190,44 @@ static const yytype_int16 yystos[] = 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10 + 10, 10, 10, 10, 10, 10 }; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ static const yytype_int16 yyr1[] = { - 0, 335, 336, 336, 337, 337, 337, 337, 337, 337, - 337, 337, 337, 337, 337, 337, 337, 337, 338, 339, - 340, 340, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 342, 343, 343, 344, 344, 344, - 344, 344, 344, 344, 344, 345, 346, 346, 347, 347, - 347, 347, 347, 347, 347, 348, 349, 349, 350, 350, - 350, 350, 350, 350, 350, 351, 352, 352, 353, 353, - 353, 353, 353, 353, 353, 353, 353, 353, 354, 355, - 356, 357, 358, 359, 360, 361, 361, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 363, + 0, 336, 337, 337, 338, 338, 338, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 339, 340, + 341, 341, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 343, 344, 344, 345, 345, + 345, 345, 345, 345, 345, 345, 346, 347, 347, 348, + 348, 348, 348, 348, 348, 348, 349, 350, 350, 351, + 351, 351, 351, 351, 351, 351, 352, 353, 353, 354, + 354, 354, 354, 354, 354, 354, 354, 354, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 362, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, @@ -2246,19 +2253,19 @@ static const yytype_int16 yyr1[] = 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619, 620, 621, 621, 622, - 622, 622, 622, 622, 622, 622, 622, 623, 624, 625, - 626, 627, 628, 629, 630, 631, 632, 632, 633, 633, - 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, - 633, 633, 633, 633, 633, 633, 633, 634, 635, 636, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 623, 624, 624, 624, 624, 624, 624, 624, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 634, + 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, + 635, 635, 635, 635, 635, 635, 635, 635, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, - 647, 648, 649, 650, 651, 652, 653, 654, 654, 655, - 656, 657, 658, 658, 659, 660, 661, 662, 663, 664, - 665, 666, 666, 667, 667, 667, 667, 667, 667, 667, - 667, 667, 667, 668, 669, 670, 671, 672, 673, 674, - 675, 676, 677, 678, 679, 679, 680, 680, 680, 680, - 680, 680, 681, 682, 683, 684, 685, 686, 687, 688, - 689, 690, 691, 691, 692, 692, 693, 694 + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 656, 657, 658, 659, 660, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 668, 669, 669, 669, 669, 669, + 669, 669, 669, 669, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, 681, 681, 682, 682, + 682, 682, 682, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 693, 694, 694, 695, 696 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ @@ -2289,51 +2296,51 @@ static const yytype_int8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, - 2, 2, 2, 2, 1, 2, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 3, 3, 4, 4, 4, 3, 3, 4, - 4, 3, 3, 2, 2, 2, 2, 2, 2, 3, - 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 3, 3, 3, 2, 2, 2, 1, 2, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 0, 1, - 2, 1, 2, 0, 1, 2, 2, 2, 3, 3, - 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 1, 2, 0, 1, 1, 1, 1, - 1, 1, 2, 2, 2, 2, 2, 2, 3, 2, - 2, 1, 2, 0, 1, 1, 2, 2 + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 3, 3, 4, 4, 4, 3, 3, + 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, + 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 3, 3, 3, 2, 2, 2, 1, 2, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 1, 2, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, + 0, 1, 2, 1, 2, 0, 1, 2, 2, 2, + 3, 3, 1, 2, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 2, 0, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, + 3, 2, 2, 1, 2, 0, 1, 1, 2, 2 }; @@ -2797,25 +2804,25 @@ yyreduce: switch (yyn) { case 18: /* force_toplevel: VAR_FORCE_TOPLEVEL */ -#line 211 "./util/configparser.y" +#line 212 "./util/configparser.y" { OUTYY(("\nP(force-toplevel)\n")); cfg_parser->started_toplevel = 0; } -#line 2806 "util/configparser.c" +#line 2813 "util/configparser.c" break; case 19: /* serverstart: VAR_SERVER */ -#line 218 "./util/configparser.y" +#line 219 "./util/configparser.y" { OUTYY(("\nP(server:)\n")); cfg_parser->started_toplevel = 1; } -#line 2815 "util/configparser.c" +#line 2822 "util/configparser.c" break; - case 254: /* stubstart: VAR_STUB_ZONE */ -#line 331 "./util/configparser.y" + case 255: /* stubstart: VAR_STUB_ZONE */ +#line 332 "./util/configparser.y" { struct config_stub* s; OUTYY(("\nP(stub_zone:)\n")); @@ -2828,11 +2835,11 @@ yyreduce: yyerror("out of memory"); } } -#line 2832 "util/configparser.c" +#line 2839 "util/configparser.c" break; - case 265: /* forwardstart: VAR_FORWARD_ZONE */ -#line 350 "./util/configparser.y" + case 266: /* forwardstart: VAR_FORWARD_ZONE */ +#line 351 "./util/configparser.y" { struct config_stub* s; OUTYY(("\nP(forward_zone:)\n")); @@ -2845,11 +2852,11 @@ yyreduce: yyerror("out of memory"); } } -#line 2849 "util/configparser.c" +#line 2856 "util/configparser.c" break; - case 275: /* viewstart: VAR_VIEW */ -#line 369 "./util/configparser.y" + case 276: /* viewstart: VAR_VIEW */ +#line 370 "./util/configparser.y" { struct config_view* s; OUTYY(("\nP(view:)\n")); @@ -2864,11 +2871,11 @@ yyreduce: yyerror("out of memory"); } } -#line 2868 "util/configparser.c" +#line 2875 "util/configparser.c" break; - case 285: /* authstart: VAR_AUTH_ZONE */ -#line 390 "./util/configparser.y" + case 286: /* authstart: VAR_AUTH_ZONE */ +#line 391 "./util/configparser.y" { struct config_auth* s; OUTYY(("\nP(auth_zone:)\n")); @@ -2888,11 +2895,11 @@ yyreduce: yyerror("out of memory"); } } -#line 2892 "util/configparser.c" +#line 2899 "util/configparser.c" break; - case 298: /* rpz_tag: VAR_TAGS STRING_ARG */ -#line 418 "./util/configparser.y" + case 299: /* rpz_tag: VAR_TAGS STRING_ARG */ +#line 419 "./util/configparser.y" { uint8_t* bitlist; size_t len = 0; @@ -2909,11 +2916,11 @@ yyreduce: } } -#line 2913 "util/configparser.c" +#line 2920 "util/configparser.c" break; - case 299: /* rpz_action_override: VAR_RPZ_ACTION_OVERRIDE STRING_ARG */ -#line 437 "./util/configparser.y" + case 300: /* rpz_action_override: VAR_RPZ_ACTION_OVERRIDE STRING_ARG */ +#line 438 "./util/configparser.y" { OUTYY(("P(rpz_action_override:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "nxdomain")!=0 && strcmp((yyvsp[0].str), "nodata")!=0 && @@ -2928,21 +2935,21 @@ yyreduce: cfg_parser->cfg->auths->rpz_action_override = (yyvsp[0].str); } } -#line 2932 "util/configparser.c" +#line 2939 "util/configparser.c" break; - case 300: /* rpz_cname_override: VAR_RPZ_CNAME_OVERRIDE STRING_ARG */ -#line 454 "./util/configparser.y" + case 301: /* rpz_cname_override: VAR_RPZ_CNAME_OVERRIDE STRING_ARG */ +#line 455 "./util/configparser.y" { OUTYY(("P(rpz_cname_override:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->auths->rpz_cname); cfg_parser->cfg->auths->rpz_cname = (yyvsp[0].str); } -#line 2942 "util/configparser.c" +#line 2949 "util/configparser.c" break; - case 301: /* rpz_log: VAR_RPZ_LOG STRING_ARG */ -#line 462 "./util/configparser.y" + case 302: /* rpz_log: VAR_RPZ_LOG STRING_ARG */ +#line 463 "./util/configparser.y" { OUTYY(("P(rpz_log:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -2950,21 +2957,21 @@ yyreduce: else cfg_parser->cfg->auths->rpz_log = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 2954 "util/configparser.c" +#line 2961 "util/configparser.c" break; - case 302: /* rpz_log_name: VAR_RPZ_LOG_NAME STRING_ARG */ -#line 472 "./util/configparser.y" + case 303: /* rpz_log_name: VAR_RPZ_LOG_NAME STRING_ARG */ +#line 473 "./util/configparser.y" { OUTYY(("P(rpz_log_name:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->auths->rpz_log_name); cfg_parser->cfg->auths->rpz_log_name = (yyvsp[0].str); } -#line 2964 "util/configparser.c" +#line 2971 "util/configparser.c" break; - case 303: /* rpz_signal_nxdomain_ra: VAR_RPZ_SIGNAL_NXDOMAIN_RA STRING_ARG */ -#line 479 "./util/configparser.y" + case 304: /* rpz_signal_nxdomain_ra: VAR_RPZ_SIGNAL_NXDOMAIN_RA STRING_ARG */ +#line 480 "./util/configparser.y" { OUTYY(("P(rpz_signal_nxdomain_ra:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -2972,11 +2979,11 @@ yyreduce: else cfg_parser->cfg->auths->rpz_signal_nxdomain_ra = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 2976 "util/configparser.c" +#line 2983 "util/configparser.c" break; - case 304: /* rpzstart: VAR_RPZ */ -#line 489 "./util/configparser.y" + case 305: /* rpzstart: VAR_RPZ */ +#line 490 "./util/configparser.y" { struct config_auth* s; OUTYY(("\nP(rpz:)\n")); @@ -2994,11 +3001,11 @@ yyreduce: yyerror("out of memory"); } } -#line 2998 "util/configparser.c" +#line 3005 "util/configparser.c" break; - case 319: /* server_num_threads: VAR_NUM_THREADS STRING_ARG */ -#line 514 "./util/configparser.y" + case 320: /* server_num_threads: VAR_NUM_THREADS STRING_ARG */ +#line 515 "./util/configparser.y" { OUTYY(("P(server_num_threads:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3006,11 +3013,11 @@ yyreduce: else cfg_parser->cfg->num_threads = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3010 "util/configparser.c" +#line 3017 "util/configparser.c" break; - case 320: /* server_verbosity: VAR_VERBOSITY STRING_ARG */ -#line 523 "./util/configparser.y" + case 321: /* server_verbosity: VAR_VERBOSITY STRING_ARG */ +#line 524 "./util/configparser.y" { OUTYY(("P(server_verbosity:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3018,11 +3025,11 @@ yyreduce: else cfg_parser->cfg->verbosity = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3022 "util/configparser.c" +#line 3029 "util/configparser.c" break; - case 321: /* server_statistics_interval: VAR_STATISTICS_INTERVAL STRING_ARG */ -#line 532 "./util/configparser.y" + case 322: /* server_statistics_interval: VAR_STATISTICS_INTERVAL STRING_ARG */ +#line 533 "./util/configparser.y" { OUTYY(("P(server_statistics_interval:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "") == 0 || strcmp((yyvsp[0].str), "0") == 0) @@ -3032,11 +3039,11 @@ yyreduce: else cfg_parser->cfg->stat_interval = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3036 "util/configparser.c" +#line 3043 "util/configparser.c" break; - case 322: /* server_statistics_cumulative: VAR_STATISTICS_CUMULATIVE STRING_ARG */ -#line 543 "./util/configparser.y" + case 323: /* server_statistics_cumulative: VAR_STATISTICS_CUMULATIVE STRING_ARG */ +#line 544 "./util/configparser.y" { OUTYY(("P(server_statistics_cumulative:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3044,11 +3051,11 @@ yyreduce: else cfg_parser->cfg->stat_cumulative = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3048 "util/configparser.c" +#line 3055 "util/configparser.c" break; - case 323: /* server_extended_statistics: VAR_EXTENDED_STATISTICS STRING_ARG */ -#line 552 "./util/configparser.y" + case 324: /* server_extended_statistics: VAR_EXTENDED_STATISTICS STRING_ARG */ +#line 553 "./util/configparser.y" { OUTYY(("P(server_extended_statistics:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3056,11 +3063,11 @@ yyreduce: else cfg_parser->cfg->stat_extended = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3060 "util/configparser.c" +#line 3067 "util/configparser.c" break; - case 324: /* server_shm_enable: VAR_SHM_ENABLE STRING_ARG */ -#line 561 "./util/configparser.y" + case 325: /* server_shm_enable: VAR_SHM_ENABLE STRING_ARG */ +#line 562 "./util/configparser.y" { OUTYY(("P(server_shm_enable:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3068,11 +3075,11 @@ yyreduce: else cfg_parser->cfg->shm_enable = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3072 "util/configparser.c" +#line 3079 "util/configparser.c" break; - case 325: /* server_shm_key: VAR_SHM_KEY STRING_ARG */ -#line 570 "./util/configparser.y" + case 326: /* server_shm_key: VAR_SHM_KEY STRING_ARG */ +#line 571 "./util/configparser.y" { OUTYY(("P(server_shm_key:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "") == 0 || strcmp((yyvsp[0].str), "0") == 0) @@ -3082,11 +3089,11 @@ yyreduce: else cfg_parser->cfg->shm_key = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3086 "util/configparser.c" +#line 3093 "util/configparser.c" break; - case 326: /* server_port: VAR_PORT STRING_ARG */ -#line 581 "./util/configparser.y" + case 327: /* server_port: VAR_PORT STRING_ARG */ +#line 582 "./util/configparser.y" { OUTYY(("P(server_port:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -3094,11 +3101,11 @@ yyreduce: else cfg_parser->cfg->port = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3098 "util/configparser.c" +#line 3105 "util/configparser.c" break; - case 327: /* server_send_client_subnet: VAR_SEND_CLIENT_SUBNET STRING_ARG */ -#line 590 "./util/configparser.y" + case 328: /* server_send_client_subnet: VAR_SEND_CLIENT_SUBNET STRING_ARG */ +#line 591 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(server_send_client_subnet:%s)\n", (yyvsp[0].str))); @@ -3109,11 +3116,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 3113 "util/configparser.c" +#line 3120 "util/configparser.c" break; - case 328: /* server_client_subnet_zone: VAR_CLIENT_SUBNET_ZONE STRING_ARG */ -#line 602 "./util/configparser.y" + case 329: /* server_client_subnet_zone: VAR_CLIENT_SUBNET_ZONE STRING_ARG */ +#line 603 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(server_client_subnet_zone:%s)\n", (yyvsp[0].str))); @@ -3125,11 +3132,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 3129 "util/configparser.c" +#line 3136 "util/configparser.c" break; - case 329: /* server_client_subnet_always_forward: VAR_CLIENT_SUBNET_ALWAYS_FORWARD STRING_ARG */ -#line 616 "./util/configparser.y" + case 330: /* server_client_subnet_always_forward: VAR_CLIENT_SUBNET_ALWAYS_FORWARD STRING_ARG */ +#line 617 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(server_client_subnet_always_forward:%s)\n", (yyvsp[0].str))); @@ -3143,11 +3150,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3147 "util/configparser.c" +#line 3154 "util/configparser.c" break; - case 330: /* server_client_subnet_opcode: VAR_CLIENT_SUBNET_OPCODE STRING_ARG */ -#line 631 "./util/configparser.y" + case 331: /* server_client_subnet_opcode: VAR_CLIENT_SUBNET_OPCODE STRING_ARG */ +#line 632 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(client_subnet_opcode:%s)\n", (yyvsp[0].str))); @@ -3157,11 +3164,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3161 "util/configparser.c" +#line 3168 "util/configparser.c" break; - case 331: /* server_max_client_subnet_ipv4: VAR_MAX_CLIENT_SUBNET_IPV4 STRING_ARG */ -#line 642 "./util/configparser.y" + case 332: /* server_max_client_subnet_ipv4: VAR_MAX_CLIENT_SUBNET_IPV4 STRING_ARG */ +#line 643 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(max_client_subnet_ipv4:%s)\n", (yyvsp[0].str))); @@ -3177,11 +3184,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3181 "util/configparser.c" +#line 3188 "util/configparser.c" break; - case 332: /* server_max_client_subnet_ipv6: VAR_MAX_CLIENT_SUBNET_IPV6 STRING_ARG */ -#line 659 "./util/configparser.y" + case 333: /* server_max_client_subnet_ipv6: VAR_MAX_CLIENT_SUBNET_IPV6 STRING_ARG */ +#line 660 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(max_client_subnet_ipv6:%s)\n", (yyvsp[0].str))); @@ -3197,11 +3204,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3201 "util/configparser.c" +#line 3208 "util/configparser.c" break; - case 333: /* server_min_client_subnet_ipv4: VAR_MIN_CLIENT_SUBNET_IPV4 STRING_ARG */ -#line 676 "./util/configparser.y" + case 334: /* server_min_client_subnet_ipv4: VAR_MIN_CLIENT_SUBNET_IPV4 STRING_ARG */ +#line 677 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(min_client_subnet_ipv4:%s)\n", (yyvsp[0].str))); @@ -3217,11 +3224,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3221 "util/configparser.c" +#line 3228 "util/configparser.c" break; - case 334: /* server_min_client_subnet_ipv6: VAR_MIN_CLIENT_SUBNET_IPV6 STRING_ARG */ -#line 693 "./util/configparser.y" + case 335: /* server_min_client_subnet_ipv6: VAR_MIN_CLIENT_SUBNET_IPV6 STRING_ARG */ +#line 694 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(min_client_subnet_ipv6:%s)\n", (yyvsp[0].str))); @@ -3237,11 +3244,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3241 "util/configparser.c" +#line 3248 "util/configparser.c" break; - case 335: /* server_max_ecs_tree_size_ipv4: VAR_MAX_ECS_TREE_SIZE_IPV4 STRING_ARG */ -#line 710 "./util/configparser.y" + case 336: /* server_max_ecs_tree_size_ipv4: VAR_MAX_ECS_TREE_SIZE_IPV4 STRING_ARG */ +#line 711 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(max_ecs_tree_size_ipv4:%s)\n", (yyvsp[0].str))); @@ -3255,11 +3262,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3259 "util/configparser.c" +#line 3266 "util/configparser.c" break; - case 336: /* server_max_ecs_tree_size_ipv6: VAR_MAX_ECS_TREE_SIZE_IPV6 STRING_ARG */ -#line 725 "./util/configparser.y" + case 337: /* server_max_ecs_tree_size_ipv6: VAR_MAX_ECS_TREE_SIZE_IPV6 STRING_ARG */ +#line 726 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(max_ecs_tree_size_ipv6:%s)\n", (yyvsp[0].str))); @@ -3273,11 +3280,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3277 "util/configparser.c" +#line 3284 "util/configparser.c" break; - case 337: /* server_interface: VAR_INTERFACE STRING_ARG */ -#line 740 "./util/configparser.y" + case 338: /* server_interface: VAR_INTERFACE STRING_ARG */ +#line 741 "./util/configparser.y" { OUTYY(("P(server_interface:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->num_ifs == 0) @@ -3289,11 +3296,11 @@ yyreduce: else cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = (yyvsp[0].str); } -#line 3293 "util/configparser.c" +#line 3300 "util/configparser.c" break; - case 338: /* server_outgoing_interface: VAR_OUTGOING_INTERFACE STRING_ARG */ -#line 753 "./util/configparser.y" + case 339: /* server_outgoing_interface: VAR_OUTGOING_INTERFACE STRING_ARG */ +#line 754 "./util/configparser.y" { OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->num_out_ifs == 0) @@ -3307,11 +3314,11 @@ yyreduce: cfg_parser->cfg->out_ifs[ cfg_parser->cfg->num_out_ifs++] = (yyvsp[0].str); } -#line 3311 "util/configparser.c" +#line 3318 "util/configparser.c" break; - case 339: /* server_outgoing_range: VAR_OUTGOING_RANGE STRING_ARG */ -#line 768 "./util/configparser.y" + case 340: /* server_outgoing_range: VAR_OUTGOING_RANGE STRING_ARG */ +#line 769 "./util/configparser.y" { OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -3319,11 +3326,11 @@ yyreduce: else cfg_parser->cfg->outgoing_num_ports = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3323 "util/configparser.c" +#line 3330 "util/configparser.c" break; - case 340: /* server_outgoing_port_permit: VAR_OUTGOING_PORT_PERMIT STRING_ARG */ -#line 777 "./util/configparser.y" + case 341: /* server_outgoing_port_permit: VAR_OUTGOING_PORT_PERMIT STRING_ARG */ +#line 778 "./util/configparser.y" { OUTYY(("P(server_outgoing_port_permit:%s)\n", (yyvsp[0].str))); if(!cfg_mark_ports((yyvsp[0].str), 1, @@ -3331,11 +3338,11 @@ yyreduce: yyerror("port number or range (\"low-high\") expected"); free((yyvsp[0].str)); } -#line 3335 "util/configparser.c" +#line 3342 "util/configparser.c" break; - case 341: /* server_outgoing_port_avoid: VAR_OUTGOING_PORT_AVOID STRING_ARG */ -#line 786 "./util/configparser.y" + case 342: /* server_outgoing_port_avoid: VAR_OUTGOING_PORT_AVOID STRING_ARG */ +#line 787 "./util/configparser.y" { OUTYY(("P(server_outgoing_port_avoid:%s)\n", (yyvsp[0].str))); if(!cfg_mark_ports((yyvsp[0].str), 0, @@ -3343,11 +3350,11 @@ yyreduce: yyerror("port number or range (\"low-high\") expected"); free((yyvsp[0].str)); } -#line 3347 "util/configparser.c" +#line 3354 "util/configparser.c" break; - case 342: /* server_outgoing_num_tcp: VAR_OUTGOING_NUM_TCP STRING_ARG */ -#line 795 "./util/configparser.y" + case 343: /* server_outgoing_num_tcp: VAR_OUTGOING_NUM_TCP STRING_ARG */ +#line 796 "./util/configparser.y" { OUTYY(("P(server_outgoing_num_tcp:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3355,11 +3362,11 @@ yyreduce: else cfg_parser->cfg->outgoing_num_tcp = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3359 "util/configparser.c" +#line 3366 "util/configparser.c" break; - case 343: /* server_incoming_num_tcp: VAR_INCOMING_NUM_TCP STRING_ARG */ -#line 804 "./util/configparser.y" + case 344: /* server_incoming_num_tcp: VAR_INCOMING_NUM_TCP STRING_ARG */ +#line 805 "./util/configparser.y" { OUTYY(("P(server_incoming_num_tcp:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3367,11 +3374,11 @@ yyreduce: else cfg_parser->cfg->incoming_num_tcp = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3371 "util/configparser.c" +#line 3378 "util/configparser.c" break; - case 344: /* server_interface_automatic: VAR_INTERFACE_AUTOMATIC STRING_ARG */ -#line 813 "./util/configparser.y" + case 345: /* server_interface_automatic: VAR_INTERFACE_AUTOMATIC STRING_ARG */ +#line 814 "./util/configparser.y" { OUTYY(("P(server_interface_automatic:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3379,21 +3386,21 @@ yyreduce: else cfg_parser->cfg->if_automatic = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3383 "util/configparser.c" +#line 3390 "util/configparser.c" break; - case 345: /* server_interface_automatic_ports: VAR_INTERFACE_AUTOMATIC_PORTS STRING_ARG */ -#line 822 "./util/configparser.y" + case 346: /* server_interface_automatic_ports: VAR_INTERFACE_AUTOMATIC_PORTS STRING_ARG */ +#line 823 "./util/configparser.y" { OUTYY(("P(server_interface_automatic_ports:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->if_automatic_ports); cfg_parser->cfg->if_automatic_ports = (yyvsp[0].str); } -#line 3393 "util/configparser.c" +#line 3400 "util/configparser.c" break; - case 346: /* server_do_ip4: VAR_DO_IP4 STRING_ARG */ -#line 829 "./util/configparser.y" + case 347: /* server_do_ip4: VAR_DO_IP4 STRING_ARG */ +#line 830 "./util/configparser.y" { OUTYY(("P(server_do_ip4:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3401,11 +3408,11 @@ yyreduce: else cfg_parser->cfg->do_ip4 = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3405 "util/configparser.c" +#line 3412 "util/configparser.c" break; - case 347: /* server_do_ip6: VAR_DO_IP6 STRING_ARG */ -#line 838 "./util/configparser.y" + case 348: /* server_do_ip6: VAR_DO_IP6 STRING_ARG */ +#line 839 "./util/configparser.y" { OUTYY(("P(server_do_ip6:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3413,11 +3420,11 @@ yyreduce: else cfg_parser->cfg->do_ip6 = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3417 "util/configparser.c" +#line 3424 "util/configparser.c" break; - case 348: /* server_do_udp: VAR_DO_UDP STRING_ARG */ -#line 847 "./util/configparser.y" + case 349: /* server_do_udp: VAR_DO_UDP STRING_ARG */ +#line 848 "./util/configparser.y" { OUTYY(("P(server_do_udp:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3425,11 +3432,11 @@ yyreduce: else cfg_parser->cfg->do_udp = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3429 "util/configparser.c" +#line 3436 "util/configparser.c" break; - case 349: /* server_do_tcp: VAR_DO_TCP STRING_ARG */ -#line 856 "./util/configparser.y" + case 350: /* server_do_tcp: VAR_DO_TCP STRING_ARG */ +#line 857 "./util/configparser.y" { OUTYY(("P(server_do_tcp:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3437,11 +3444,11 @@ yyreduce: else cfg_parser->cfg->do_tcp = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3441 "util/configparser.c" +#line 3448 "util/configparser.c" break; - case 350: /* server_prefer_ip4: VAR_PREFER_IP4 STRING_ARG */ -#line 865 "./util/configparser.y" + case 351: /* server_prefer_ip4: VAR_PREFER_IP4 STRING_ARG */ +#line 866 "./util/configparser.y" { OUTYY(("P(server_prefer_ip4:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3449,11 +3456,11 @@ yyreduce: else cfg_parser->cfg->prefer_ip4 = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3453 "util/configparser.c" +#line 3460 "util/configparser.c" break; - case 351: /* server_prefer_ip6: VAR_PREFER_IP6 STRING_ARG */ -#line 874 "./util/configparser.y" + case 352: /* server_prefer_ip6: VAR_PREFER_IP6 STRING_ARG */ +#line 875 "./util/configparser.y" { OUTYY(("P(server_prefer_ip6:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3461,11 +3468,11 @@ yyreduce: else cfg_parser->cfg->prefer_ip6 = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3465 "util/configparser.c" +#line 3472 "util/configparser.c" break; - case 352: /* server_tcp_mss: VAR_TCP_MSS STRING_ARG */ -#line 883 "./util/configparser.y" + case 353: /* server_tcp_mss: VAR_TCP_MSS STRING_ARG */ +#line 884 "./util/configparser.y" { OUTYY(("P(server_tcp_mss:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3473,11 +3480,11 @@ yyreduce: else cfg_parser->cfg->tcp_mss = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3477 "util/configparser.c" +#line 3484 "util/configparser.c" break; - case 353: /* server_outgoing_tcp_mss: VAR_OUTGOING_TCP_MSS STRING_ARG */ -#line 892 "./util/configparser.y" + case 354: /* server_outgoing_tcp_mss: VAR_OUTGOING_TCP_MSS STRING_ARG */ +#line 893 "./util/configparser.y" { OUTYY(("P(server_outgoing_tcp_mss:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3485,11 +3492,11 @@ yyreduce: else cfg_parser->cfg->outgoing_tcp_mss = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3489 "util/configparser.c" +#line 3496 "util/configparser.c" break; - case 354: /* server_tcp_idle_timeout: VAR_TCP_IDLE_TIMEOUT STRING_ARG */ -#line 901 "./util/configparser.y" + case 355: /* server_tcp_idle_timeout: VAR_TCP_IDLE_TIMEOUT STRING_ARG */ +#line 902 "./util/configparser.y" { OUTYY(("P(server_tcp_idle_timeout:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3501,11 +3508,11 @@ yyreduce: else cfg_parser->cfg->tcp_idle_timeout = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3505 "util/configparser.c" +#line 3512 "util/configparser.c" break; - case 355: /* server_max_reuse_tcp_queries: VAR_MAX_REUSE_TCP_QUERIES STRING_ARG */ -#line 914 "./util/configparser.y" + case 356: /* server_max_reuse_tcp_queries: VAR_MAX_REUSE_TCP_QUERIES STRING_ARG */ +#line 915 "./util/configparser.y" { OUTYY(("P(server_max_reuse_tcp_queries:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3515,11 +3522,11 @@ yyreduce: else cfg_parser->cfg->max_reuse_tcp_queries = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3519 "util/configparser.c" +#line 3526 "util/configparser.c" break; - case 356: /* server_tcp_reuse_timeout: VAR_TCP_REUSE_TIMEOUT STRING_ARG */ -#line 925 "./util/configparser.y" + case 357: /* server_tcp_reuse_timeout: VAR_TCP_REUSE_TIMEOUT STRING_ARG */ +#line 926 "./util/configparser.y" { OUTYY(("P(server_tcp_reuse_timeout:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3529,11 +3536,11 @@ yyreduce: else cfg_parser->cfg->tcp_reuse_timeout = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3533 "util/configparser.c" +#line 3540 "util/configparser.c" break; - case 357: /* server_tcp_auth_query_timeout: VAR_TCP_AUTH_QUERY_TIMEOUT STRING_ARG */ -#line 936 "./util/configparser.y" + case 358: /* server_tcp_auth_query_timeout: VAR_TCP_AUTH_QUERY_TIMEOUT STRING_ARG */ +#line 937 "./util/configparser.y" { OUTYY(("P(server_tcp_auth_query_timeout:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3543,11 +3550,11 @@ yyreduce: else cfg_parser->cfg->tcp_auth_query_timeout = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3547 "util/configparser.c" +#line 3554 "util/configparser.c" break; - case 358: /* server_tcp_keepalive: VAR_EDNS_TCP_KEEPALIVE STRING_ARG */ -#line 947 "./util/configparser.y" + case 359: /* server_tcp_keepalive: VAR_EDNS_TCP_KEEPALIVE STRING_ARG */ +#line 948 "./util/configparser.y" { OUTYY(("P(server_tcp_keepalive:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3555,11 +3562,11 @@ yyreduce: else cfg_parser->cfg->do_tcp_keepalive = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3559 "util/configparser.c" +#line 3566 "util/configparser.c" break; - case 359: /* server_tcp_keepalive_timeout: VAR_EDNS_TCP_KEEPALIVE_TIMEOUT STRING_ARG */ -#line 956 "./util/configparser.y" + case 360: /* server_tcp_keepalive_timeout: VAR_EDNS_TCP_KEEPALIVE_TIMEOUT STRING_ARG */ +#line 957 "./util/configparser.y" { OUTYY(("P(server_tcp_keepalive_timeout:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3571,11 +3578,11 @@ yyreduce: else cfg_parser->cfg->tcp_keepalive_timeout = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3575 "util/configparser.c" +#line 3582 "util/configparser.c" break; - case 360: /* server_tcp_upstream: VAR_TCP_UPSTREAM STRING_ARG */ -#line 969 "./util/configparser.y" + case 361: /* server_tcp_upstream: VAR_TCP_UPSTREAM STRING_ARG */ +#line 970 "./util/configparser.y" { OUTYY(("P(server_tcp_upstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3583,11 +3590,11 @@ yyreduce: else cfg_parser->cfg->tcp_upstream = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3587 "util/configparser.c" +#line 3594 "util/configparser.c" break; - case 361: /* server_udp_upstream_without_downstream: VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM STRING_ARG */ -#line 978 "./util/configparser.y" + case 362: /* server_udp_upstream_without_downstream: VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM STRING_ARG */ +#line 979 "./util/configparser.y" { OUTYY(("P(server_udp_upstream_without_downstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3595,11 +3602,11 @@ yyreduce: else cfg_parser->cfg->udp_upstream_without_downstream = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3599 "util/configparser.c" +#line 3606 "util/configparser.c" break; - case 362: /* server_ssl_upstream: VAR_SSL_UPSTREAM STRING_ARG */ -#line 987 "./util/configparser.y" + case 363: /* server_ssl_upstream: VAR_SSL_UPSTREAM STRING_ARG */ +#line 988 "./util/configparser.y" { OUTYY(("P(server_ssl_upstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3607,31 +3614,31 @@ yyreduce: else cfg_parser->cfg->ssl_upstream = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3611 "util/configparser.c" +#line 3618 "util/configparser.c" break; - case 363: /* server_ssl_service_key: VAR_SSL_SERVICE_KEY STRING_ARG */ -#line 996 "./util/configparser.y" + case 364: /* server_ssl_service_key: VAR_SSL_SERVICE_KEY STRING_ARG */ +#line 997 "./util/configparser.y" { OUTYY(("P(server_ssl_service_key:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->ssl_service_key); cfg_parser->cfg->ssl_service_key = (yyvsp[0].str); } -#line 3621 "util/configparser.c" +#line 3628 "util/configparser.c" break; - case 364: /* server_ssl_service_pem: VAR_SSL_SERVICE_PEM STRING_ARG */ -#line 1003 "./util/configparser.y" + case 365: /* server_ssl_service_pem: VAR_SSL_SERVICE_PEM STRING_ARG */ +#line 1004 "./util/configparser.y" { OUTYY(("P(server_ssl_service_pem:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->ssl_service_pem); cfg_parser->cfg->ssl_service_pem = (yyvsp[0].str); } -#line 3631 "util/configparser.c" +#line 3638 "util/configparser.c" break; - case 365: /* server_ssl_port: VAR_SSL_PORT STRING_ARG */ -#line 1010 "./util/configparser.y" + case 366: /* server_ssl_port: VAR_SSL_PORT STRING_ARG */ +#line 1011 "./util/configparser.y" { OUTYY(("P(server_ssl_port:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -3639,21 +3646,21 @@ yyreduce: else cfg_parser->cfg->ssl_port = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3643 "util/configparser.c" +#line 3650 "util/configparser.c" break; - case 366: /* server_tls_cert_bundle: VAR_TLS_CERT_BUNDLE STRING_ARG */ -#line 1019 "./util/configparser.y" + case 367: /* server_tls_cert_bundle: VAR_TLS_CERT_BUNDLE STRING_ARG */ +#line 1020 "./util/configparser.y" { OUTYY(("P(server_tls_cert_bundle:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->tls_cert_bundle); cfg_parser->cfg->tls_cert_bundle = (yyvsp[0].str); } -#line 3653 "util/configparser.c" +#line 3660 "util/configparser.c" break; - case 367: /* server_tls_win_cert: VAR_TLS_WIN_CERT STRING_ARG */ -#line 1026 "./util/configparser.y" + case 368: /* server_tls_win_cert: VAR_TLS_WIN_CERT STRING_ARG */ +#line 1027 "./util/configparser.y" { OUTYY(("P(server_tls_win_cert:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3661,53 +3668,53 @@ yyreduce: else cfg_parser->cfg->tls_win_cert = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3665 "util/configparser.c" +#line 3672 "util/configparser.c" break; - case 368: /* server_tls_additional_port: VAR_TLS_ADDITIONAL_PORT STRING_ARG */ -#line 1035 "./util/configparser.y" + case 369: /* server_tls_additional_port: VAR_TLS_ADDITIONAL_PORT STRING_ARG */ +#line 1036 "./util/configparser.y" { OUTYY(("P(server_tls_additional_port:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->tls_additional_port, (yyvsp[0].str))) yyerror("out of memory"); } -#line 3676 "util/configparser.c" +#line 3683 "util/configparser.c" break; - case 369: /* server_tls_ciphers: VAR_TLS_CIPHERS STRING_ARG */ -#line 1043 "./util/configparser.y" + case 370: /* server_tls_ciphers: VAR_TLS_CIPHERS STRING_ARG */ +#line 1044 "./util/configparser.y" { OUTYY(("P(server_tls_ciphers:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->tls_ciphers); cfg_parser->cfg->tls_ciphers = (yyvsp[0].str); } -#line 3686 "util/configparser.c" +#line 3693 "util/configparser.c" break; - case 370: /* server_tls_ciphersuites: VAR_TLS_CIPHERSUITES STRING_ARG */ -#line 1050 "./util/configparser.y" + case 371: /* server_tls_ciphersuites: VAR_TLS_CIPHERSUITES STRING_ARG */ +#line 1051 "./util/configparser.y" { OUTYY(("P(server_tls_ciphersuites:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->tls_ciphersuites); cfg_parser->cfg->tls_ciphersuites = (yyvsp[0].str); } -#line 3696 "util/configparser.c" +#line 3703 "util/configparser.c" break; - case 371: /* server_tls_session_ticket_keys: VAR_TLS_SESSION_TICKET_KEYS STRING_ARG */ -#line 1057 "./util/configparser.y" + case 372: /* server_tls_session_ticket_keys: VAR_TLS_SESSION_TICKET_KEYS STRING_ARG */ +#line 1058 "./util/configparser.y" { OUTYY(("P(server_tls_session_ticket_keys:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_append(&cfg_parser->cfg->tls_session_ticket_keys, (yyvsp[0].str))) yyerror("out of memory"); } -#line 3707 "util/configparser.c" +#line 3714 "util/configparser.c" break; - case 372: /* server_tls_use_sni: VAR_TLS_USE_SNI STRING_ARG */ -#line 1065 "./util/configparser.y" + case 373: /* server_tls_use_sni: VAR_TLS_USE_SNI STRING_ARG */ +#line 1066 "./util/configparser.y" { OUTYY(("P(server_tls_use_sni:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3715,11 +3722,11 @@ yyreduce: else cfg_parser->cfg->tls_use_sni = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3719 "util/configparser.c" +#line 3726 "util/configparser.c" break; - case 373: /* server_https_port: VAR_HTTPS_PORT STRING_ARG */ -#line 1074 "./util/configparser.y" + case 374: /* server_https_port: VAR_HTTPS_PORT STRING_ARG */ +#line 1075 "./util/configparser.y" { OUTYY(("P(server_https_port:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -3727,11 +3734,11 @@ yyreduce: else cfg_parser->cfg->https_port = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3731 "util/configparser.c" +#line 3738 "util/configparser.c" break; - case 374: /* server_http_endpoint: VAR_HTTP_ENDPOINT STRING_ARG */ -#line 1082 "./util/configparser.y" + case 375: /* server_http_endpoint: VAR_HTTP_ENDPOINT STRING_ARG */ +#line 1083 "./util/configparser.y" { OUTYY(("P(server_http_endpoint:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->http_endpoint); @@ -3747,11 +3754,11 @@ yyreduce: cfg_parser->cfg->http_endpoint = (yyvsp[0].str); } } -#line 3751 "util/configparser.c" +#line 3758 "util/configparser.c" break; - case 375: /* server_http_max_streams: VAR_HTTP_MAX_STREAMS STRING_ARG */ -#line 1098 "./util/configparser.y" + case 376: /* server_http_max_streams: VAR_HTTP_MAX_STREAMS STRING_ARG */ +#line 1099 "./util/configparser.y" { OUTYY(("P(server_http_max_streams:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3759,11 +3766,11 @@ yyreduce: else cfg_parser->cfg->http_max_streams = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3763 "util/configparser.c" +#line 3770 "util/configparser.c" break; - case 376: /* server_http_query_buffer_size: VAR_HTTP_QUERY_BUFFER_SIZE STRING_ARG */ -#line 1106 "./util/configparser.y" + case 377: /* server_http_query_buffer_size: VAR_HTTP_QUERY_BUFFER_SIZE STRING_ARG */ +#line 1107 "./util/configparser.y" { OUTYY(("P(server_http_query_buffer_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), @@ -3771,11 +3778,11 @@ yyreduce: yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 3775 "util/configparser.c" +#line 3782 "util/configparser.c" break; - case 377: /* server_http_response_buffer_size: VAR_HTTP_RESPONSE_BUFFER_SIZE STRING_ARG */ -#line 1114 "./util/configparser.y" + case 378: /* server_http_response_buffer_size: VAR_HTTP_RESPONSE_BUFFER_SIZE STRING_ARG */ +#line 1115 "./util/configparser.y" { OUTYY(("P(server_http_response_buffer_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), @@ -3783,11 +3790,11 @@ yyreduce: yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 3787 "util/configparser.c" +#line 3794 "util/configparser.c" break; - case 378: /* server_http_nodelay: VAR_HTTP_NODELAY STRING_ARG */ -#line 1122 "./util/configparser.y" + case 379: /* server_http_nodelay: VAR_HTTP_NODELAY STRING_ARG */ +#line 1123 "./util/configparser.y" { OUTYY(("P(server_http_nodelay:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3795,11 +3802,11 @@ yyreduce: else cfg_parser->cfg->http_nodelay = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3799 "util/configparser.c" +#line 3806 "util/configparser.c" break; - case 379: /* server_http_notls_downstream: VAR_HTTP_NOTLS_DOWNSTREAM STRING_ARG */ -#line 1130 "./util/configparser.y" + case 380: /* server_http_notls_downstream: VAR_HTTP_NOTLS_DOWNSTREAM STRING_ARG */ +#line 1131 "./util/configparser.y" { OUTYY(("P(server_http_notls_downstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3807,11 +3814,11 @@ yyreduce: else cfg_parser->cfg->http_notls_downstream = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3811 "util/configparser.c" +#line 3818 "util/configparser.c" break; - case 380: /* server_use_systemd: VAR_USE_SYSTEMD STRING_ARG */ -#line 1138 "./util/configparser.y" + case 381: /* server_use_systemd: VAR_USE_SYSTEMD STRING_ARG */ +#line 1139 "./util/configparser.y" { OUTYY(("P(server_use_systemd:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3819,11 +3826,11 @@ yyreduce: else cfg_parser->cfg->use_systemd = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3823 "util/configparser.c" +#line 3830 "util/configparser.c" break; - case 381: /* server_do_daemonize: VAR_DO_DAEMONIZE STRING_ARG */ -#line 1147 "./util/configparser.y" + case 382: /* server_do_daemonize: VAR_DO_DAEMONIZE STRING_ARG */ +#line 1148 "./util/configparser.y" { OUTYY(("P(server_do_daemonize:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3831,11 +3838,11 @@ yyreduce: else cfg_parser->cfg->do_daemonize = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3835 "util/configparser.c" +#line 3842 "util/configparser.c" break; - case 382: /* server_use_syslog: VAR_USE_SYSLOG STRING_ARG */ -#line 1156 "./util/configparser.y" + case 383: /* server_use_syslog: VAR_USE_SYSLOG STRING_ARG */ +#line 1157 "./util/configparser.y" { OUTYY(("P(server_use_syslog:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3848,11 +3855,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3852 "util/configparser.c" +#line 3859 "util/configparser.c" break; - case 383: /* server_log_time_ascii: VAR_LOG_TIME_ASCII STRING_ARG */ -#line 1170 "./util/configparser.y" + case 384: /* server_log_time_ascii: VAR_LOG_TIME_ASCII STRING_ARG */ +#line 1171 "./util/configparser.y" { OUTYY(("P(server_log_time_ascii:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3860,11 +3867,11 @@ yyreduce: else cfg_parser->cfg->log_time_ascii = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3864 "util/configparser.c" +#line 3871 "util/configparser.c" break; - case 384: /* server_log_queries: VAR_LOG_QUERIES STRING_ARG */ -#line 1179 "./util/configparser.y" + case 385: /* server_log_queries: VAR_LOG_QUERIES STRING_ARG */ +#line 1180 "./util/configparser.y" { OUTYY(("P(server_log_queries:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3872,11 +3879,11 @@ yyreduce: else cfg_parser->cfg->log_queries = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3876 "util/configparser.c" +#line 3883 "util/configparser.c" break; - case 385: /* server_log_replies: VAR_LOG_REPLIES STRING_ARG */ -#line 1188 "./util/configparser.y" + case 386: /* server_log_replies: VAR_LOG_REPLIES STRING_ARG */ +#line 1189 "./util/configparser.y" { OUTYY(("P(server_log_replies:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3884,11 +3891,11 @@ yyreduce: else cfg_parser->cfg->log_replies = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3888 "util/configparser.c" +#line 3895 "util/configparser.c" break; - case 386: /* server_log_tag_queryreply: VAR_LOG_TAG_QUERYREPLY STRING_ARG */ -#line 1197 "./util/configparser.y" + case 387: /* server_log_tag_queryreply: VAR_LOG_TAG_QUERYREPLY STRING_ARG */ +#line 1198 "./util/configparser.y" { OUTYY(("P(server_log_tag_queryreply:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3896,11 +3903,11 @@ yyreduce: else cfg_parser->cfg->log_tag_queryreply = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3900 "util/configparser.c" +#line 3907 "util/configparser.c" break; - case 387: /* server_log_servfail: VAR_LOG_SERVFAIL STRING_ARG */ -#line 1206 "./util/configparser.y" + case 388: /* server_log_servfail: VAR_LOG_SERVFAIL STRING_ARG */ +#line 1207 "./util/configparser.y" { OUTYY(("P(server_log_servfail:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3908,11 +3915,11 @@ yyreduce: else cfg_parser->cfg->log_servfail = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3912 "util/configparser.c" +#line 3919 "util/configparser.c" break; - case 388: /* server_log_local_actions: VAR_LOG_LOCAL_ACTIONS STRING_ARG */ -#line 1215 "./util/configparser.y" + case 389: /* server_log_local_actions: VAR_LOG_LOCAL_ACTIONS STRING_ARG */ +#line 1216 "./util/configparser.y" { OUTYY(("P(server_log_local_actions:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3920,31 +3927,31 @@ yyreduce: else cfg_parser->cfg->log_local_actions = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3924 "util/configparser.c" +#line 3931 "util/configparser.c" break; - case 389: /* server_chroot: VAR_CHROOT STRING_ARG */ -#line 1224 "./util/configparser.y" + case 390: /* server_chroot: VAR_CHROOT STRING_ARG */ +#line 1225 "./util/configparser.y" { OUTYY(("P(server_chroot:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->chrootdir); cfg_parser->cfg->chrootdir = (yyvsp[0].str); } -#line 3934 "util/configparser.c" +#line 3941 "util/configparser.c" break; - case 390: /* server_username: VAR_USERNAME STRING_ARG */ -#line 1231 "./util/configparser.y" + case 391: /* server_username: VAR_USERNAME STRING_ARG */ +#line 1232 "./util/configparser.y" { OUTYY(("P(server_username:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->username); cfg_parser->cfg->username = (yyvsp[0].str); } -#line 3944 "util/configparser.c" +#line 3951 "util/configparser.c" break; - case 391: /* server_directory: VAR_DIRECTORY STRING_ARG */ -#line 1238 "./util/configparser.y" + case 392: /* server_directory: VAR_DIRECTORY STRING_ARG */ +#line 1239 "./util/configparser.y" { OUTYY(("P(server_directory:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->directory); @@ -3969,105 +3976,105 @@ yyreduce: } } } -#line 3973 "util/configparser.c" +#line 3980 "util/configparser.c" break; - case 392: /* server_logfile: VAR_LOGFILE STRING_ARG */ -#line 1264 "./util/configparser.y" + case 393: /* server_logfile: VAR_LOGFILE STRING_ARG */ +#line 1265 "./util/configparser.y" { OUTYY(("P(server_logfile:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->logfile); cfg_parser->cfg->logfile = (yyvsp[0].str); cfg_parser->cfg->use_syslog = 0; } -#line 3984 "util/configparser.c" +#line 3991 "util/configparser.c" break; - case 393: /* server_pidfile: VAR_PIDFILE STRING_ARG */ -#line 1272 "./util/configparser.y" + case 394: /* server_pidfile: VAR_PIDFILE STRING_ARG */ +#line 1273 "./util/configparser.y" { OUTYY(("P(server_pidfile:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->pidfile); cfg_parser->cfg->pidfile = (yyvsp[0].str); } -#line 3994 "util/configparser.c" +#line 4001 "util/configparser.c" break; - case 394: /* server_root_hints: VAR_ROOT_HINTS STRING_ARG */ -#line 1279 "./util/configparser.y" + case 395: /* server_root_hints: VAR_ROOT_HINTS STRING_ARG */ +#line 1280 "./util/configparser.y" { OUTYY(("P(server_root_hints:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4004 "util/configparser.c" +#line 4011 "util/configparser.c" break; - case 395: /* server_dlv_anchor_file: VAR_DLV_ANCHOR_FILE STRING_ARG */ -#line 1286 "./util/configparser.y" + case 396: /* server_dlv_anchor_file: VAR_DLV_ANCHOR_FILE STRING_ARG */ +#line 1287 "./util/configparser.y" { OUTYY(("P(server_dlv_anchor_file:%s)\n", (yyvsp[0].str))); log_warn("option dlv-anchor-file ignored: DLV is decommissioned"); free((yyvsp[0].str)); } -#line 4014 "util/configparser.c" +#line 4021 "util/configparser.c" break; - case 396: /* server_dlv_anchor: VAR_DLV_ANCHOR STRING_ARG */ -#line 1293 "./util/configparser.y" + case 397: /* server_dlv_anchor: VAR_DLV_ANCHOR STRING_ARG */ +#line 1294 "./util/configparser.y" { OUTYY(("P(server_dlv_anchor:%s)\n", (yyvsp[0].str))); log_warn("option dlv-anchor ignored: DLV is decommissioned"); free((yyvsp[0].str)); } -#line 4024 "util/configparser.c" +#line 4031 "util/configparser.c" break; - case 397: /* server_auto_trust_anchor_file: VAR_AUTO_TRUST_ANCHOR_FILE STRING_ARG */ -#line 1300 "./util/configparser.y" + case 398: /* server_auto_trust_anchor_file: VAR_AUTO_TRUST_ANCHOR_FILE STRING_ARG */ +#line 1301 "./util/configparser.y" { OUTYY(("P(server_auto_trust_anchor_file:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg-> auto_trust_anchor_file_list, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4035 "util/configparser.c" +#line 4042 "util/configparser.c" break; - case 398: /* server_trust_anchor_file: VAR_TRUST_ANCHOR_FILE STRING_ARG */ -#line 1308 "./util/configparser.y" + case 399: /* server_trust_anchor_file: VAR_TRUST_ANCHOR_FILE STRING_ARG */ +#line 1309 "./util/configparser.y" { OUTYY(("P(server_trust_anchor_file:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg-> trust_anchor_file_list, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4046 "util/configparser.c" +#line 4053 "util/configparser.c" break; - case 399: /* server_trusted_keys_file: VAR_TRUSTED_KEYS_FILE STRING_ARG */ -#line 1316 "./util/configparser.y" + case 400: /* server_trusted_keys_file: VAR_TRUSTED_KEYS_FILE STRING_ARG */ +#line 1317 "./util/configparser.y" { OUTYY(("P(server_trusted_keys_file:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg-> trusted_keys_file_list, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4057 "util/configparser.c" +#line 4064 "util/configparser.c" break; - case 400: /* server_trust_anchor: VAR_TRUST_ANCHOR STRING_ARG */ -#line 1324 "./util/configparser.y" + case 401: /* server_trust_anchor: VAR_TRUST_ANCHOR STRING_ARG */ +#line 1325 "./util/configparser.y" { OUTYY(("P(server_trust_anchor:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4067 "util/configparser.c" +#line 4074 "util/configparser.c" break; - case 401: /* server_trust_anchor_signaling: VAR_TRUST_ANCHOR_SIGNALING STRING_ARG */ -#line 1331 "./util/configparser.y" + case 402: /* server_trust_anchor_signaling: VAR_TRUST_ANCHOR_SIGNALING STRING_ARG */ +#line 1332 "./util/configparser.y" { OUTYY(("P(server_trust_anchor_signaling:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4077,11 +4084,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4081 "util/configparser.c" +#line 4088 "util/configparser.c" break; - case 402: /* server_root_key_sentinel: VAR_ROOT_KEY_SENTINEL STRING_ARG */ -#line 1342 "./util/configparser.y" + case 403: /* server_root_key_sentinel: VAR_ROOT_KEY_SENTINEL STRING_ARG */ +#line 1343 "./util/configparser.y" { OUTYY(("P(server_root_key_sentinel:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4091,21 +4098,21 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4095 "util/configparser.c" +#line 4102 "util/configparser.c" break; - case 403: /* server_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG */ -#line 1353 "./util/configparser.y" + case 404: /* server_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG */ +#line 1354 "./util/configparser.y" { OUTYY(("P(server_domain_insecure:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4105 "util/configparser.c" +#line 4112 "util/configparser.c" break; - case 404: /* server_hide_identity: VAR_HIDE_IDENTITY STRING_ARG */ -#line 1360 "./util/configparser.y" + case 405: /* server_hide_identity: VAR_HIDE_IDENTITY STRING_ARG */ +#line 1361 "./util/configparser.y" { OUTYY(("P(server_hide_identity:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4113,11 +4120,11 @@ yyreduce: else cfg_parser->cfg->hide_identity = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4117 "util/configparser.c" +#line 4124 "util/configparser.c" break; - case 405: /* server_hide_version: VAR_HIDE_VERSION STRING_ARG */ -#line 1369 "./util/configparser.y" + case 406: /* server_hide_version: VAR_HIDE_VERSION STRING_ARG */ +#line 1370 "./util/configparser.y" { OUTYY(("P(server_hide_version:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4125,11 +4132,11 @@ yyreduce: else cfg_parser->cfg->hide_version = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4129 "util/configparser.c" +#line 4136 "util/configparser.c" break; - case 406: /* server_hide_trustanchor: VAR_HIDE_TRUSTANCHOR STRING_ARG */ -#line 1378 "./util/configparser.y" + case 407: /* server_hide_trustanchor: VAR_HIDE_TRUSTANCHOR STRING_ARG */ +#line 1379 "./util/configparser.y" { OUTYY(("P(server_hide_trustanchor:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4137,11 +4144,11 @@ yyreduce: else cfg_parser->cfg->hide_trustanchor = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4141 "util/configparser.c" +#line 4148 "util/configparser.c" break; - case 407: /* server_hide_http_user_agent: VAR_HIDE_HTTP_USER_AGENT STRING_ARG */ -#line 1387 "./util/configparser.y" + case 408: /* server_hide_http_user_agent: VAR_HIDE_HTTP_USER_AGENT STRING_ARG */ +#line 1388 "./util/configparser.y" { OUTYY(("P(server_hide_user_agent:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4149,41 +4156,41 @@ yyreduce: else cfg_parser->cfg->hide_http_user_agent = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4153 "util/configparser.c" +#line 4160 "util/configparser.c" break; - case 408: /* server_identity: VAR_IDENTITY STRING_ARG */ -#line 1396 "./util/configparser.y" + case 409: /* server_identity: VAR_IDENTITY STRING_ARG */ +#line 1397 "./util/configparser.y" { OUTYY(("P(server_identity:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->identity); cfg_parser->cfg->identity = (yyvsp[0].str); } -#line 4163 "util/configparser.c" +#line 4170 "util/configparser.c" break; - case 409: /* server_version: VAR_VERSION STRING_ARG */ -#line 1403 "./util/configparser.y" + case 410: /* server_version: VAR_VERSION STRING_ARG */ +#line 1404 "./util/configparser.y" { OUTYY(("P(server_version:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->version); cfg_parser->cfg->version = (yyvsp[0].str); } -#line 4173 "util/configparser.c" +#line 4180 "util/configparser.c" break; - case 410: /* server_http_user_agent: VAR_HTTP_USER_AGENT STRING_ARG */ -#line 1410 "./util/configparser.y" + case 411: /* server_http_user_agent: VAR_HTTP_USER_AGENT STRING_ARG */ +#line 1411 "./util/configparser.y" { OUTYY(("P(server_http_user_agent:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->http_user_agent); cfg_parser->cfg->http_user_agent = (yyvsp[0].str); } -#line 4183 "util/configparser.c" +#line 4190 "util/configparser.c" break; - case 411: /* server_nsid: VAR_NSID STRING_ARG */ -#line 1417 "./util/configparser.y" + case 412: /* server_nsid: VAR_NSID STRING_ARG */ +#line 1418 "./util/configparser.y" { OUTYY(("P(server_nsid:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->nsid_cfg_str); @@ -4198,33 +4205,33 @@ yyreduce: yyerror("the NSID must be either a hex string or an " "ascii character string prepended with ascii_."); } -#line 4202 "util/configparser.c" +#line 4209 "util/configparser.c" break; - case 412: /* server_so_rcvbuf: VAR_SO_RCVBUF STRING_ARG */ -#line 1433 "./util/configparser.y" + case 413: /* server_so_rcvbuf: VAR_SO_RCVBUF STRING_ARG */ +#line 1434 "./util/configparser.y" { OUTYY(("P(server_so_rcvbuf:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->so_rcvbuf)) yyerror("buffer size expected"); free((yyvsp[0].str)); } -#line 4213 "util/configparser.c" +#line 4220 "util/configparser.c" break; - case 413: /* server_so_sndbuf: VAR_SO_SNDBUF STRING_ARG */ -#line 1441 "./util/configparser.y" + case 414: /* server_so_sndbuf: VAR_SO_SNDBUF STRING_ARG */ +#line 1442 "./util/configparser.y" { OUTYY(("P(server_so_sndbuf:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->so_sndbuf)) yyerror("buffer size expected"); free((yyvsp[0].str)); } -#line 4224 "util/configparser.c" +#line 4231 "util/configparser.c" break; - case 414: /* server_so_reuseport: VAR_SO_REUSEPORT STRING_ARG */ -#line 1449 "./util/configparser.y" + case 415: /* server_so_reuseport: VAR_SO_REUSEPORT STRING_ARG */ +#line 1450 "./util/configparser.y" { OUTYY(("P(server_so_reuseport:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4233,11 +4240,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4237 "util/configparser.c" +#line 4244 "util/configparser.c" break; - case 415: /* server_ip_transparent: VAR_IP_TRANSPARENT STRING_ARG */ -#line 1459 "./util/configparser.y" + case 416: /* server_ip_transparent: VAR_IP_TRANSPARENT STRING_ARG */ +#line 1460 "./util/configparser.y" { OUTYY(("P(server_ip_transparent:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4246,11 +4253,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4250 "util/configparser.c" +#line 4257 "util/configparser.c" break; - case 416: /* server_ip_freebind: VAR_IP_FREEBIND STRING_ARG */ -#line 1469 "./util/configparser.y" + case 417: /* server_ip_freebind: VAR_IP_FREEBIND STRING_ARG */ +#line 1470 "./util/configparser.y" { OUTYY(("P(server_ip_freebind:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4259,11 +4266,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4263 "util/configparser.c" +#line 4270 "util/configparser.c" break; - case 417: /* server_ip_dscp: VAR_IP_DSCP STRING_ARG */ -#line 1479 "./util/configparser.y" + case 418: /* server_ip_dscp: VAR_IP_DSCP STRING_ARG */ +#line 1480 "./util/configparser.y" { OUTYY(("P(server_ip_dscp:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4276,22 +4283,22 @@ yyreduce: cfg_parser->cfg->ip_dscp = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4280 "util/configparser.c" +#line 4287 "util/configparser.c" break; - case 418: /* server_stream_wait_size: VAR_STREAM_WAIT_SIZE STRING_ARG */ -#line 1493 "./util/configparser.y" + case 419: /* server_stream_wait_size: VAR_STREAM_WAIT_SIZE STRING_ARG */ +#line 1494 "./util/configparser.y" { OUTYY(("P(server_stream_wait_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->stream_wait_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 4291 "util/configparser.c" +#line 4298 "util/configparser.c" break; - case 419: /* server_edns_buffer_size: VAR_EDNS_BUFFER_SIZE STRING_ARG */ -#line 1501 "./util/configparser.y" + case 420: /* server_edns_buffer_size: VAR_EDNS_BUFFER_SIZE STRING_ARG */ +#line 1502 "./util/configparser.y" { OUTYY(("P(server_edns_buffer_size:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4303,11 +4310,11 @@ yyreduce: else cfg_parser->cfg->edns_buffer_size = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4307 "util/configparser.c" +#line 4314 "util/configparser.c" break; - case 420: /* server_msg_buffer_size: VAR_MSG_BUFFER_SIZE STRING_ARG */ -#line 1514 "./util/configparser.y" + case 421: /* server_msg_buffer_size: VAR_MSG_BUFFER_SIZE STRING_ARG */ +#line 1515 "./util/configparser.y" { OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4317,22 +4324,22 @@ yyreduce: else cfg_parser->cfg->msg_buffer_size = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4321 "util/configparser.c" +#line 4328 "util/configparser.c" break; - case 421: /* server_msg_cache_size: VAR_MSG_CACHE_SIZE STRING_ARG */ -#line 1525 "./util/configparser.y" + case 422: /* server_msg_cache_size: VAR_MSG_CACHE_SIZE STRING_ARG */ +#line 1526 "./util/configparser.y" { OUTYY(("P(server_msg_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->msg_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 4332 "util/configparser.c" +#line 4339 "util/configparser.c" break; - case 422: /* server_msg_cache_slabs: VAR_MSG_CACHE_SLABS STRING_ARG */ -#line 1533 "./util/configparser.y" + case 423: /* server_msg_cache_slabs: VAR_MSG_CACHE_SLABS STRING_ARG */ +#line 1534 "./util/configparser.y" { OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) { @@ -4344,11 +4351,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4348 "util/configparser.c" +#line 4355 "util/configparser.c" break; - case 423: /* server_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING_ARG */ -#line 1546 "./util/configparser.y" + case 424: /* server_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING_ARG */ +#line 1547 "./util/configparser.y" { OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4356,11 +4363,11 @@ yyreduce: else cfg_parser->cfg->num_queries_per_thread = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4360 "util/configparser.c" +#line 4367 "util/configparser.c" break; - case 424: /* server_jostle_timeout: VAR_JOSTLE_TIMEOUT STRING_ARG */ -#line 1555 "./util/configparser.y" + case 425: /* server_jostle_timeout: VAR_JOSTLE_TIMEOUT STRING_ARG */ +#line 1556 "./util/configparser.y" { OUTYY(("P(server_jostle_timeout:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4368,11 +4375,11 @@ yyreduce: else cfg_parser->cfg->jostle_time = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4372 "util/configparser.c" +#line 4379 "util/configparser.c" break; - case 425: /* server_delay_close: VAR_DELAY_CLOSE STRING_ARG */ -#line 1564 "./util/configparser.y" + case 426: /* server_delay_close: VAR_DELAY_CLOSE STRING_ARG */ +#line 1565 "./util/configparser.y" { OUTYY(("P(server_delay_close:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4380,11 +4387,11 @@ yyreduce: else cfg_parser->cfg->delay_close = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4384 "util/configparser.c" +#line 4391 "util/configparser.c" break; - case 426: /* server_udp_connect: VAR_UDP_CONNECT STRING_ARG */ -#line 1573 "./util/configparser.y" + case 427: /* server_udp_connect: VAR_UDP_CONNECT STRING_ARG */ +#line 1574 "./util/configparser.y" { OUTYY(("P(server_udp_connect:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4392,11 +4399,11 @@ yyreduce: else cfg_parser->cfg->udp_connect = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4396 "util/configparser.c" +#line 4403 "util/configparser.c" break; - case 427: /* server_unblock_lan_zones: VAR_UNBLOCK_LAN_ZONES STRING_ARG */ -#line 1582 "./util/configparser.y" + case 428: /* server_unblock_lan_zones: VAR_UNBLOCK_LAN_ZONES STRING_ARG */ +#line 1583 "./util/configparser.y" { OUTYY(("P(server_unblock_lan_zones:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4405,11 +4412,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4409 "util/configparser.c" +#line 4416 "util/configparser.c" break; - case 428: /* server_insecure_lan_zones: VAR_INSECURE_LAN_ZONES STRING_ARG */ -#line 1592 "./util/configparser.y" + case 429: /* server_insecure_lan_zones: VAR_INSECURE_LAN_ZONES STRING_ARG */ +#line 1593 "./util/configparser.y" { OUTYY(("P(server_insecure_lan_zones:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4418,22 +4425,22 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4422 "util/configparser.c" +#line 4429 "util/configparser.c" break; - case 429: /* server_rrset_cache_size: VAR_RRSET_CACHE_SIZE STRING_ARG */ -#line 1602 "./util/configparser.y" + case 430: /* server_rrset_cache_size: VAR_RRSET_CACHE_SIZE STRING_ARG */ +#line 1603 "./util/configparser.y" { OUTYY(("P(server_rrset_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->rrset_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 4433 "util/configparser.c" +#line 4440 "util/configparser.c" break; - case 430: /* server_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING_ARG */ -#line 1610 "./util/configparser.y" + case 431: /* server_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING_ARG */ +#line 1611 "./util/configparser.y" { OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) { @@ -4445,11 +4452,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4449 "util/configparser.c" +#line 4456 "util/configparser.c" break; - case 431: /* server_infra_host_ttl: VAR_INFRA_HOST_TTL STRING_ARG */ -#line 1623 "./util/configparser.y" + case 432: /* server_infra_host_ttl: VAR_INFRA_HOST_TTL STRING_ARG */ +#line 1624 "./util/configparser.y" { OUTYY(("P(server_infra_host_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4457,22 +4464,22 @@ yyreduce: else cfg_parser->cfg->host_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4461 "util/configparser.c" +#line 4468 "util/configparser.c" break; - case 432: /* server_infra_lame_ttl: VAR_INFRA_LAME_TTL STRING_ARG */ -#line 1632 "./util/configparser.y" + case 433: /* server_infra_lame_ttl: VAR_INFRA_LAME_TTL STRING_ARG */ +#line 1633 "./util/configparser.y" { OUTYY(("P(server_infra_lame_ttl:%s)\n", (yyvsp[0].str))); verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option " "removed, use infra-host-ttl)", (yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4472 "util/configparser.c" +#line 4479 "util/configparser.c" break; - case 433: /* server_infra_cache_numhosts: VAR_INFRA_CACHE_NUMHOSTS STRING_ARG */ -#line 1640 "./util/configparser.y" + case 434: /* server_infra_cache_numhosts: VAR_INFRA_CACHE_NUMHOSTS STRING_ARG */ +#line 1641 "./util/configparser.y" { OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4480,22 +4487,22 @@ yyreduce: else cfg_parser->cfg->infra_cache_numhosts = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4484 "util/configparser.c" +#line 4491 "util/configparser.c" break; - case 434: /* server_infra_cache_lame_size: VAR_INFRA_CACHE_LAME_SIZE STRING_ARG */ -#line 1649 "./util/configparser.y" + case 435: /* server_infra_cache_lame_size: VAR_INFRA_CACHE_LAME_SIZE STRING_ARG */ +#line 1650 "./util/configparser.y" { OUTYY(("P(server_infra_cache_lame_size:%s)\n", (yyvsp[0].str))); verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s " "(option removed, use infra-cache-numhosts)", (yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4495 "util/configparser.c" +#line 4502 "util/configparser.c" break; - case 435: /* server_infra_cache_slabs: VAR_INFRA_CACHE_SLABS STRING_ARG */ -#line 1657 "./util/configparser.y" + case 436: /* server_infra_cache_slabs: VAR_INFRA_CACHE_SLABS STRING_ARG */ +#line 1658 "./util/configparser.y" { OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) { @@ -4507,11 +4514,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4511 "util/configparser.c" +#line 4518 "util/configparser.c" break; - case 436: /* server_infra_cache_min_rtt: VAR_INFRA_CACHE_MIN_RTT STRING_ARG */ -#line 1670 "./util/configparser.y" + case 437: /* server_infra_cache_min_rtt: VAR_INFRA_CACHE_MIN_RTT STRING_ARG */ +#line 1671 "./util/configparser.y" { OUTYY(("P(server_infra_cache_min_rtt:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4519,11 +4526,11 @@ yyreduce: else cfg_parser->cfg->infra_cache_min_rtt = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4523 "util/configparser.c" +#line 4530 "util/configparser.c" break; - case 437: /* server_infra_cache_max_rtt: VAR_INFRA_CACHE_MAX_RTT STRING_ARG */ -#line 1679 "./util/configparser.y" + case 438: /* server_infra_cache_max_rtt: VAR_INFRA_CACHE_MAX_RTT STRING_ARG */ +#line 1680 "./util/configparser.y" { OUTYY(("P(server_infra_cache_max_rtt:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4531,11 +4538,11 @@ yyreduce: else cfg_parser->cfg->infra_cache_max_rtt = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4535 "util/configparser.c" +#line 4542 "util/configparser.c" break; - case 438: /* server_infra_keep_probing: VAR_INFRA_KEEP_PROBING STRING_ARG */ -#line 1688 "./util/configparser.y" + case 439: /* server_infra_keep_probing: VAR_INFRA_KEEP_PROBING STRING_ARG */ +#line 1689 "./util/configparser.y" { OUTYY(("P(server_infra_keep_probing:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4544,21 +4551,21 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4548 "util/configparser.c" +#line 4555 "util/configparser.c" break; - case 439: /* server_target_fetch_policy: VAR_TARGET_FETCH_POLICY STRING_ARG */ -#line 1698 "./util/configparser.y" + case 440: /* server_target_fetch_policy: VAR_TARGET_FETCH_POLICY STRING_ARG */ +#line 1699 "./util/configparser.y" { OUTYY(("P(server_target_fetch_policy:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->target_fetch_policy); cfg_parser->cfg->target_fetch_policy = (yyvsp[0].str); } -#line 4558 "util/configparser.c" +#line 4565 "util/configparser.c" break; - case 440: /* server_harden_short_bufsize: VAR_HARDEN_SHORT_BUFSIZE STRING_ARG */ -#line 1705 "./util/configparser.y" + case 441: /* server_harden_short_bufsize: VAR_HARDEN_SHORT_BUFSIZE STRING_ARG */ +#line 1706 "./util/configparser.y" { OUTYY(("P(server_harden_short_bufsize:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4567,11 +4574,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4571 "util/configparser.c" +#line 4578 "util/configparser.c" break; - case 441: /* server_harden_large_queries: VAR_HARDEN_LARGE_QUERIES STRING_ARG */ -#line 1715 "./util/configparser.y" + case 442: /* server_harden_large_queries: VAR_HARDEN_LARGE_QUERIES STRING_ARG */ +#line 1716 "./util/configparser.y" { OUTYY(("P(server_harden_large_queries:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4580,11 +4587,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4584 "util/configparser.c" +#line 4591 "util/configparser.c" break; - case 442: /* server_harden_glue: VAR_HARDEN_GLUE STRING_ARG */ -#line 1725 "./util/configparser.y" + case 443: /* server_harden_glue: VAR_HARDEN_GLUE STRING_ARG */ +#line 1726 "./util/configparser.y" { OUTYY(("P(server_harden_glue:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4593,11 +4600,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4597 "util/configparser.c" +#line 4604 "util/configparser.c" break; - case 443: /* server_harden_dnssec_stripped: VAR_HARDEN_DNSSEC_STRIPPED STRING_ARG */ -#line 1735 "./util/configparser.y" + case 444: /* server_harden_dnssec_stripped: VAR_HARDEN_DNSSEC_STRIPPED STRING_ARG */ +#line 1736 "./util/configparser.y" { OUTYY(("P(server_harden_dnssec_stripped:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4606,11 +4613,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4610 "util/configparser.c" +#line 4617 "util/configparser.c" break; - case 444: /* server_harden_below_nxdomain: VAR_HARDEN_BELOW_NXDOMAIN STRING_ARG */ -#line 1745 "./util/configparser.y" + case 445: /* server_harden_below_nxdomain: VAR_HARDEN_BELOW_NXDOMAIN STRING_ARG */ +#line 1746 "./util/configparser.y" { OUTYY(("P(server_harden_below_nxdomain:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4619,11 +4626,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4623 "util/configparser.c" +#line 4630 "util/configparser.c" break; - case 445: /* server_harden_referral_path: VAR_HARDEN_REFERRAL_PATH STRING_ARG */ -#line 1755 "./util/configparser.y" + case 446: /* server_harden_referral_path: VAR_HARDEN_REFERRAL_PATH STRING_ARG */ +#line 1756 "./util/configparser.y" { OUTYY(("P(server_harden_referral_path:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4632,11 +4639,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4636 "util/configparser.c" +#line 4643 "util/configparser.c" break; - case 446: /* server_harden_algo_downgrade: VAR_HARDEN_ALGO_DOWNGRADE STRING_ARG */ -#line 1765 "./util/configparser.y" + case 447: /* server_harden_algo_downgrade: VAR_HARDEN_ALGO_DOWNGRADE STRING_ARG */ +#line 1766 "./util/configparser.y" { OUTYY(("P(server_harden_algo_downgrade:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4645,11 +4652,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4649 "util/configparser.c" +#line 4656 "util/configparser.c" break; - case 447: /* server_use_caps_for_id: VAR_USE_CAPS_FOR_ID STRING_ARG */ -#line 1775 "./util/configparser.y" + case 448: /* server_use_caps_for_id: VAR_USE_CAPS_FOR_ID STRING_ARG */ +#line 1776 "./util/configparser.y" { OUTYY(("P(server_use_caps_for_id:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4658,41 +4665,41 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4662 "util/configparser.c" +#line 4669 "util/configparser.c" break; - case 448: /* server_caps_whitelist: VAR_CAPS_WHITELIST STRING_ARG */ -#line 1785 "./util/configparser.y" + case 449: /* server_caps_whitelist: VAR_CAPS_WHITELIST STRING_ARG */ +#line 1786 "./util/configparser.y" { OUTYY(("P(server_caps_whitelist:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->caps_whitelist, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4672 "util/configparser.c" +#line 4679 "util/configparser.c" break; - case 449: /* server_private_address: VAR_PRIVATE_ADDRESS STRING_ARG */ -#line 1792 "./util/configparser.y" + case 450: /* server_private_address: VAR_PRIVATE_ADDRESS STRING_ARG */ +#line 1793 "./util/configparser.y" { OUTYY(("P(server_private_address:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4682 "util/configparser.c" +#line 4689 "util/configparser.c" break; - case 450: /* server_private_domain: VAR_PRIVATE_DOMAIN STRING_ARG */ -#line 1799 "./util/configparser.y" + case 451: /* server_private_domain: VAR_PRIVATE_DOMAIN STRING_ARG */ +#line 1800 "./util/configparser.y" { OUTYY(("P(server_private_domain:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4692 "util/configparser.c" +#line 4699 "util/configparser.c" break; - case 451: /* server_prefetch: VAR_PREFETCH STRING_ARG */ -#line 1806 "./util/configparser.y" + case 452: /* server_prefetch: VAR_PREFETCH STRING_ARG */ +#line 1807 "./util/configparser.y" { OUTYY(("P(server_prefetch:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4700,11 +4707,11 @@ yyreduce: else cfg_parser->cfg->prefetch = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4704 "util/configparser.c" +#line 4711 "util/configparser.c" break; - case 452: /* server_prefetch_key: VAR_PREFETCH_KEY STRING_ARG */ -#line 1815 "./util/configparser.y" + case 453: /* server_prefetch_key: VAR_PREFETCH_KEY STRING_ARG */ +#line 1816 "./util/configparser.y" { OUTYY(("P(server_prefetch_key:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4712,11 +4719,11 @@ yyreduce: else cfg_parser->cfg->prefetch_key = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4716 "util/configparser.c" +#line 4723 "util/configparser.c" break; - case 453: /* server_deny_any: VAR_DENY_ANY STRING_ARG */ -#line 1824 "./util/configparser.y" + case 454: /* server_deny_any: VAR_DENY_ANY STRING_ARG */ +#line 1825 "./util/configparser.y" { OUTYY(("P(server_deny_any:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4724,11 +4731,11 @@ yyreduce: else cfg_parser->cfg->deny_any = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4728 "util/configparser.c" +#line 4735 "util/configparser.c" break; - case 454: /* server_unwanted_reply_threshold: VAR_UNWANTED_REPLY_THRESHOLD STRING_ARG */ -#line 1833 "./util/configparser.y" + case 455: /* server_unwanted_reply_threshold: VAR_UNWANTED_REPLY_THRESHOLD STRING_ARG */ +#line 1834 "./util/configparser.y" { OUTYY(("P(server_unwanted_reply_threshold:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4736,21 +4743,21 @@ yyreduce: else cfg_parser->cfg->unwanted_threshold = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4740 "util/configparser.c" +#line 4747 "util/configparser.c" break; - case 455: /* server_do_not_query_address: VAR_DO_NOT_QUERY_ADDRESS STRING_ARG */ -#line 1842 "./util/configparser.y" + case 456: /* server_do_not_query_address: VAR_DO_NOT_QUERY_ADDRESS STRING_ARG */ +#line 1843 "./util/configparser.y" { OUTYY(("P(server_do_not_query_address:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4750 "util/configparser.c" +#line 4757 "util/configparser.c" break; - case 456: /* server_do_not_query_localhost: VAR_DO_NOT_QUERY_LOCALHOST STRING_ARG */ -#line 1849 "./util/configparser.y" + case 457: /* server_do_not_query_localhost: VAR_DO_NOT_QUERY_LOCALHOST STRING_ARG */ +#line 1850 "./util/configparser.y" { OUTYY(("P(server_do_not_query_localhost:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4759,22 +4766,22 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4763 "util/configparser.c" +#line 4770 "util/configparser.c" break; - case 457: /* server_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG */ -#line 1859 "./util/configparser.y" + case 458: /* server_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG */ +#line 1860 "./util/configparser.y" { OUTYY(("P(server_access_control:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); validate_acl_action((yyvsp[0].str)); if(!cfg_str2list_insert(&cfg_parser->cfg->acls, (yyvsp[-1].str), (yyvsp[0].str))) fatal_exit("out of memory adding acl"); } -#line 4774 "util/configparser.c" +#line 4781 "util/configparser.c" break; - case 458: /* server_interface_action: VAR_INTERFACE_ACTION STRING_ARG STRING_ARG */ -#line 1867 "./util/configparser.y" + case 459: /* server_interface_action: VAR_INTERFACE_ACTION STRING_ARG STRING_ARG */ +#line 1868 "./util/configparser.y" { OUTYY(("P(server_interface_action:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); validate_acl_action((yyvsp[0].str)); @@ -4782,21 +4789,21 @@ yyreduce: &cfg_parser->cfg->interface_actions, (yyvsp[-1].str), (yyvsp[0].str))) fatal_exit("out of memory adding acl"); } -#line 4786 "util/configparser.c" +#line 4793 "util/configparser.c" break; - case 459: /* server_module_conf: VAR_MODULE_CONF STRING_ARG */ -#line 1876 "./util/configparser.y" + case 460: /* server_module_conf: VAR_MODULE_CONF STRING_ARG */ +#line 1877 "./util/configparser.y" { OUTYY(("P(server_module_conf:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->module_conf); cfg_parser->cfg->module_conf = (yyvsp[0].str); } -#line 4796 "util/configparser.c" +#line 4803 "util/configparser.c" break; - case 460: /* server_val_override_date: VAR_VAL_OVERRIDE_DATE STRING_ARG */ -#line 1883 "./util/configparser.y" + case 461: /* server_val_override_date: VAR_VAL_OVERRIDE_DATE STRING_ARG */ +#line 1884 "./util/configparser.y" { OUTYY(("P(server_val_override_date:%s)\n", (yyvsp[0].str))); if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) { @@ -4813,11 +4820,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4817 "util/configparser.c" +#line 4824 "util/configparser.c" break; - case 461: /* server_val_sig_skew_min: VAR_VAL_SIG_SKEW_MIN STRING_ARG */ -#line 1901 "./util/configparser.y" + case 462: /* server_val_sig_skew_min: VAR_VAL_SIG_SKEW_MIN STRING_ARG */ +#line 1902 "./util/configparser.y" { OUTYY(("P(server_val_sig_skew_min:%s)\n", (yyvsp[0].str))); if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) { @@ -4829,11 +4836,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4833 "util/configparser.c" +#line 4840 "util/configparser.c" break; - case 462: /* server_val_sig_skew_max: VAR_VAL_SIG_SKEW_MAX STRING_ARG */ -#line 1914 "./util/configparser.y" + case 463: /* server_val_sig_skew_max: VAR_VAL_SIG_SKEW_MAX STRING_ARG */ +#line 1915 "./util/configparser.y" { OUTYY(("P(server_val_sig_skew_max:%s)\n", (yyvsp[0].str))); if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) { @@ -4845,11 +4852,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4849 "util/configparser.c" +#line 4856 "util/configparser.c" break; - case 463: /* server_val_max_restart: VAR_VAL_MAX_RESTART STRING_ARG */ -#line 1927 "./util/configparser.y" + case 464: /* server_val_max_restart: VAR_VAL_MAX_RESTART STRING_ARG */ +#line 1928 "./util/configparser.y" { OUTYY(("P(server_val_max_restart:%s)\n", (yyvsp[0].str))); if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) { @@ -4861,11 +4868,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4865 "util/configparser.c" +#line 4872 "util/configparser.c" break; - case 464: /* server_cache_max_ttl: VAR_CACHE_MAX_TTL STRING_ARG */ -#line 1940 "./util/configparser.y" + case 465: /* server_cache_max_ttl: VAR_CACHE_MAX_TTL STRING_ARG */ +#line 1941 "./util/configparser.y" { OUTYY(("P(server_cache_max_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4873,11 +4880,11 @@ yyreduce: else cfg_parser->cfg->max_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4877 "util/configparser.c" +#line 4884 "util/configparser.c" break; - case 465: /* server_cache_max_negative_ttl: VAR_CACHE_MAX_NEGATIVE_TTL STRING_ARG */ -#line 1949 "./util/configparser.y" + case 466: /* server_cache_max_negative_ttl: VAR_CACHE_MAX_NEGATIVE_TTL STRING_ARG */ +#line 1950 "./util/configparser.y" { OUTYY(("P(server_cache_max_negative_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4885,11 +4892,11 @@ yyreduce: else cfg_parser->cfg->max_negative_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4889 "util/configparser.c" +#line 4896 "util/configparser.c" break; - case 466: /* server_cache_min_ttl: VAR_CACHE_MIN_TTL STRING_ARG */ -#line 1958 "./util/configparser.y" + case 467: /* server_cache_min_ttl: VAR_CACHE_MIN_TTL STRING_ARG */ +#line 1959 "./util/configparser.y" { OUTYY(("P(server_cache_min_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4897,11 +4904,11 @@ yyreduce: else cfg_parser->cfg->min_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4901 "util/configparser.c" +#line 4908 "util/configparser.c" break; - case 467: /* server_bogus_ttl: VAR_BOGUS_TTL STRING_ARG */ -#line 1967 "./util/configparser.y" + case 468: /* server_bogus_ttl: VAR_BOGUS_TTL STRING_ARG */ +#line 1968 "./util/configparser.y" { OUTYY(("P(server_bogus_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4909,11 +4916,11 @@ yyreduce: else cfg_parser->cfg->bogus_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4913 "util/configparser.c" +#line 4920 "util/configparser.c" break; - case 468: /* server_val_clean_additional: VAR_VAL_CLEAN_ADDITIONAL STRING_ARG */ -#line 1976 "./util/configparser.y" + case 469: /* server_val_clean_additional: VAR_VAL_CLEAN_ADDITIONAL STRING_ARG */ +#line 1977 "./util/configparser.y" { OUTYY(("P(server_val_clean_additional:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4922,11 +4929,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4926 "util/configparser.c" +#line 4933 "util/configparser.c" break; - case 469: /* server_val_permissive_mode: VAR_VAL_PERMISSIVE_MODE STRING_ARG */ -#line 1986 "./util/configparser.y" + case 470: /* server_val_permissive_mode: VAR_VAL_PERMISSIVE_MODE STRING_ARG */ +#line 1987 "./util/configparser.y" { OUTYY(("P(server_val_permissive_mode:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4935,11 +4942,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4939 "util/configparser.c" +#line 4946 "util/configparser.c" break; - case 470: /* server_aggressive_nsec: VAR_AGGRESSIVE_NSEC STRING_ARG */ -#line 1996 "./util/configparser.y" + case 471: /* server_aggressive_nsec: VAR_AGGRESSIVE_NSEC STRING_ARG */ +#line 1997 "./util/configparser.y" { OUTYY(("P(server_aggressive_nsec:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4949,11 +4956,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4953 "util/configparser.c" +#line 4960 "util/configparser.c" break; - case 471: /* server_ignore_cd_flag: VAR_IGNORE_CD_FLAG STRING_ARG */ -#line 2007 "./util/configparser.y" + case 472: /* server_ignore_cd_flag: VAR_IGNORE_CD_FLAG STRING_ARG */ +#line 2008 "./util/configparser.y" { OUTYY(("P(server_ignore_cd_flag:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4961,11 +4968,11 @@ yyreduce: else cfg_parser->cfg->ignore_cd = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4965 "util/configparser.c" +#line 4972 "util/configparser.c" break; - case 472: /* server_serve_expired: VAR_SERVE_EXPIRED STRING_ARG */ -#line 2016 "./util/configparser.y" + case 473: /* server_serve_expired: VAR_SERVE_EXPIRED STRING_ARG */ +#line 2017 "./util/configparser.y" { OUTYY(("P(server_serve_expired:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4973,11 +4980,11 @@ yyreduce: else cfg_parser->cfg->serve_expired = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4977 "util/configparser.c" +#line 4984 "util/configparser.c" break; - case 473: /* server_serve_expired_ttl: VAR_SERVE_EXPIRED_TTL STRING_ARG */ -#line 2025 "./util/configparser.y" + case 474: /* server_serve_expired_ttl: VAR_SERVE_EXPIRED_TTL STRING_ARG */ +#line 2026 "./util/configparser.y" { OUTYY(("P(server_serve_expired_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4985,11 +4992,11 @@ yyreduce: else cfg_parser->cfg->serve_expired_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4989 "util/configparser.c" +#line 4996 "util/configparser.c" break; - case 474: /* server_serve_expired_ttl_reset: VAR_SERVE_EXPIRED_TTL_RESET STRING_ARG */ -#line 2034 "./util/configparser.y" + case 475: /* server_serve_expired_ttl_reset: VAR_SERVE_EXPIRED_TTL_RESET STRING_ARG */ +#line 2035 "./util/configparser.y" { OUTYY(("P(server_serve_expired_ttl_reset:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4997,11 +5004,11 @@ yyreduce: else cfg_parser->cfg->serve_expired_ttl_reset = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5001 "util/configparser.c" +#line 5008 "util/configparser.c" break; - case 475: /* server_serve_expired_reply_ttl: VAR_SERVE_EXPIRED_REPLY_TTL STRING_ARG */ -#line 2043 "./util/configparser.y" + case 476: /* server_serve_expired_reply_ttl: VAR_SERVE_EXPIRED_REPLY_TTL STRING_ARG */ +#line 2044 "./util/configparser.y" { OUTYY(("P(server_serve_expired_reply_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5009,11 +5016,11 @@ yyreduce: else cfg_parser->cfg->serve_expired_reply_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5013 "util/configparser.c" +#line 5020 "util/configparser.c" break; - case 476: /* server_serve_expired_client_timeout: VAR_SERVE_EXPIRED_CLIENT_TIMEOUT STRING_ARG */ -#line 2052 "./util/configparser.y" + case 477: /* server_serve_expired_client_timeout: VAR_SERVE_EXPIRED_CLIENT_TIMEOUT STRING_ARG */ +#line 2053 "./util/configparser.y" { OUTYY(("P(server_serve_expired_client_timeout:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5021,11 +5028,11 @@ yyreduce: else cfg_parser->cfg->serve_expired_client_timeout = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5025 "util/configparser.c" +#line 5032 "util/configparser.c" break; - case 477: /* server_ede_serve_expired: VAR_EDE_SERVE_EXPIRED STRING_ARG */ -#line 2061 "./util/configparser.y" + case 478: /* server_ede_serve_expired: VAR_EDE_SERVE_EXPIRED STRING_ARG */ +#line 2062 "./util/configparser.y" { OUTYY(("P(server_ede_serve_expired:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5033,11 +5040,11 @@ yyreduce: else cfg_parser->cfg->ede_serve_expired = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5037 "util/configparser.c" +#line 5044 "util/configparser.c" break; - case 478: /* server_serve_original_ttl: VAR_SERVE_ORIGINAL_TTL STRING_ARG */ -#line 2070 "./util/configparser.y" + case 479: /* server_serve_original_ttl: VAR_SERVE_ORIGINAL_TTL STRING_ARG */ +#line 2071 "./util/configparser.y" { OUTYY(("P(server_serve_original_ttl:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5045,11 +5052,11 @@ yyreduce: else cfg_parser->cfg->serve_original_ttl = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5049 "util/configparser.c" +#line 5056 "util/configparser.c" break; - case 479: /* server_fake_dsa: VAR_FAKE_DSA STRING_ARG */ -#line 2079 "./util/configparser.y" + case 480: /* server_fake_dsa: VAR_FAKE_DSA STRING_ARG */ +#line 2080 "./util/configparser.y" { OUTYY(("P(server_fake_dsa:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5061,11 +5068,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 5065 "util/configparser.c" +#line 5072 "util/configparser.c" break; - case 480: /* server_fake_sha1: VAR_FAKE_SHA1 STRING_ARG */ -#line 2092 "./util/configparser.y" + case 481: /* server_fake_sha1: VAR_FAKE_SHA1 STRING_ARG */ +#line 2093 "./util/configparser.y" { OUTYY(("P(server_fake_sha1:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5077,11 +5084,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 5081 "util/configparser.c" +#line 5088 "util/configparser.c" break; - case 481: /* server_val_log_level: VAR_VAL_LOG_LEVEL STRING_ARG */ -#line 2105 "./util/configparser.y" + case 482: /* server_val_log_level: VAR_VAL_LOG_LEVEL STRING_ARG */ +#line 2106 "./util/configparser.y" { OUTYY(("P(server_val_log_level:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5089,21 +5096,21 @@ yyreduce: else cfg_parser->cfg->val_log_level = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5093 "util/configparser.c" +#line 5100 "util/configparser.c" break; - case 482: /* server_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG */ -#line 2114 "./util/configparser.y" + case 483: /* server_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG */ +#line 2115 "./util/configparser.y" { OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->val_nsec3_key_iterations); cfg_parser->cfg->val_nsec3_key_iterations = (yyvsp[0].str); } -#line 5103 "util/configparser.c" +#line 5110 "util/configparser.c" break; - case 483: /* server_zonemd_permissive_mode: VAR_ZONEMD_PERMISSIVE_MODE STRING_ARG */ -#line 2121 "./util/configparser.y" + case 484: /* server_zonemd_permissive_mode: VAR_ZONEMD_PERMISSIVE_MODE STRING_ARG */ +#line 2122 "./util/configparser.y" { OUTYY(("P(server_zonemd_permissive_mode:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5111,11 +5118,11 @@ yyreduce: else cfg_parser->cfg->zonemd_permissive_mode = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5115 "util/configparser.c" +#line 5122 "util/configparser.c" break; - case 484: /* server_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG */ -#line 2130 "./util/configparser.y" + case 485: /* server_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG */ +#line 2131 "./util/configparser.y" { OUTYY(("P(server_add_holddown:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5123,11 +5130,11 @@ yyreduce: else cfg_parser->cfg->add_holddown = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5127 "util/configparser.c" +#line 5134 "util/configparser.c" break; - case 485: /* server_del_holddown: VAR_DEL_HOLDDOWN STRING_ARG */ -#line 2139 "./util/configparser.y" + case 486: /* server_del_holddown: VAR_DEL_HOLDDOWN STRING_ARG */ +#line 2140 "./util/configparser.y" { OUTYY(("P(server_del_holddown:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5135,11 +5142,11 @@ yyreduce: else cfg_parser->cfg->del_holddown = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5139 "util/configparser.c" +#line 5146 "util/configparser.c" break; - case 486: /* server_keep_missing: VAR_KEEP_MISSING STRING_ARG */ -#line 2148 "./util/configparser.y" + case 487: /* server_keep_missing: VAR_KEEP_MISSING STRING_ARG */ +#line 2149 "./util/configparser.y" { OUTYY(("P(server_keep_missing:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5147,11 +5154,11 @@ yyreduce: else cfg_parser->cfg->keep_missing = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5151 "util/configparser.c" +#line 5158 "util/configparser.c" break; - case 487: /* server_permit_small_holddown: VAR_PERMIT_SMALL_HOLDDOWN STRING_ARG */ -#line 2157 "./util/configparser.y" + case 488: /* server_permit_small_holddown: VAR_PERMIT_SMALL_HOLDDOWN STRING_ARG */ +#line 2158 "./util/configparser.y" { OUTYY(("P(server_permit_small_holddown:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5160,22 +5167,22 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5164 "util/configparser.c" +#line 5171 "util/configparser.c" break; - case 488: /* server_key_cache_size: VAR_KEY_CACHE_SIZE STRING_ARG */ -#line 2166 "./util/configparser.y" + case 489: /* server_key_cache_size: VAR_KEY_CACHE_SIZE STRING_ARG */ +#line 2167 "./util/configparser.y" { OUTYY(("P(server_key_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->key_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 5175 "util/configparser.c" +#line 5182 "util/configparser.c" break; - case 489: /* server_key_cache_slabs: VAR_KEY_CACHE_SLABS STRING_ARG */ -#line 2174 "./util/configparser.y" + case 490: /* server_key_cache_slabs: VAR_KEY_CACHE_SLABS STRING_ARG */ +#line 2175 "./util/configparser.y" { OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) { @@ -5187,22 +5194,22 @@ yyreduce: } free((yyvsp[0].str)); } -#line 5191 "util/configparser.c" +#line 5198 "util/configparser.c" break; - case 490: /* server_neg_cache_size: VAR_NEG_CACHE_SIZE STRING_ARG */ -#line 2187 "./util/configparser.y" + case 491: /* server_neg_cache_size: VAR_NEG_CACHE_SIZE STRING_ARG */ +#line 2188 "./util/configparser.y" { OUTYY(("P(server_neg_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->neg_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 5202 "util/configparser.c" +#line 5209 "util/configparser.c" break; - case 491: /* server_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG */ -#line 2195 "./util/configparser.y" + case 492: /* server_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG */ +#line 2196 "./util/configparser.y" { OUTYY(("P(server_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "static")!=0 && strcmp((yyvsp[0].str), "deny")!=0 && @@ -5256,21 +5263,21 @@ yyreduce: fatal_exit("out of memory adding local-zone"); } } -#line 5260 "util/configparser.c" +#line 5267 "util/configparser.c" break; - case 492: /* server_local_data: VAR_LOCAL_DATA STRING_ARG */ -#line 2250 "./util/configparser.y" + case 493: /* server_local_data: VAR_LOCAL_DATA STRING_ARG */ +#line 2251 "./util/configparser.y" { OUTYY(("P(server_local_data:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, (yyvsp[0].str))) fatal_exit("out of memory adding local-data"); } -#line 5270 "util/configparser.c" +#line 5277 "util/configparser.c" break; - case 493: /* server_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG */ -#line 2257 "./util/configparser.y" + case 494: /* server_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG */ +#line 2258 "./util/configparser.y" { char* ptr; OUTYY(("P(server_local_data_ptr:%s)\n", (yyvsp[0].str))); @@ -5284,11 +5291,11 @@ yyreduce: yyerror("local-data-ptr could not be reversed"); } } -#line 5288 "util/configparser.c" +#line 5295 "util/configparser.c" break; - case 494: /* server_minimal_responses: VAR_MINIMAL_RESPONSES STRING_ARG */ -#line 2272 "./util/configparser.y" + case 495: /* server_minimal_responses: VAR_MINIMAL_RESPONSES STRING_ARG */ +#line 2273 "./util/configparser.y" { OUTYY(("P(server_minimal_responses:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5297,11 +5304,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5301 "util/configparser.c" +#line 5308 "util/configparser.c" break; - case 495: /* server_rrset_roundrobin: VAR_RRSET_ROUNDROBIN STRING_ARG */ -#line 2282 "./util/configparser.y" + case 496: /* server_rrset_roundrobin: VAR_RRSET_ROUNDROBIN STRING_ARG */ +#line 2283 "./util/configparser.y" { OUTYY(("P(server_rrset_roundrobin:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5310,41 +5317,41 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5314 "util/configparser.c" +#line 5321 "util/configparser.c" break; - case 496: /* server_unknown_server_time_limit: VAR_UNKNOWN_SERVER_TIME_LIMIT STRING_ARG */ -#line 2292 "./util/configparser.y" + case 497: /* server_unknown_server_time_limit: VAR_UNKNOWN_SERVER_TIME_LIMIT STRING_ARG */ +#line 2293 "./util/configparser.y" { OUTYY(("P(server_unknown_server_time_limit:%s)\n", (yyvsp[0].str))); cfg_parser->cfg->unknown_server_time_limit = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5324 "util/configparser.c" +#line 5331 "util/configparser.c" break; - case 497: /* server_max_udp_size: VAR_MAX_UDP_SIZE STRING_ARG */ -#line 2299 "./util/configparser.y" + case 498: /* server_max_udp_size: VAR_MAX_UDP_SIZE STRING_ARG */ +#line 2300 "./util/configparser.y" { OUTYY(("P(server_max_udp_size:%s)\n", (yyvsp[0].str))); cfg_parser->cfg->max_udp_size = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5334 "util/configparser.c" +#line 5341 "util/configparser.c" break; - case 498: /* server_dns64_prefix: VAR_DNS64_PREFIX STRING_ARG */ -#line 2306 "./util/configparser.y" + case 499: /* server_dns64_prefix: VAR_DNS64_PREFIX STRING_ARG */ +#line 2307 "./util/configparser.y" { OUTYY(("P(dns64_prefix:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dns64_prefix); cfg_parser->cfg->dns64_prefix = (yyvsp[0].str); } -#line 5344 "util/configparser.c" +#line 5351 "util/configparser.c" break; - case 499: /* server_dns64_synthall: VAR_DNS64_SYNTHALL STRING_ARG */ -#line 2313 "./util/configparser.y" + case 500: /* server_dns64_synthall: VAR_DNS64_SYNTHALL STRING_ARG */ +#line 2314 "./util/configparser.y" { OUTYY(("P(server_dns64_synthall:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5352,22 +5359,22 @@ yyreduce: else cfg_parser->cfg->dns64_synthall = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5356 "util/configparser.c" +#line 5363 "util/configparser.c" break; - case 500: /* server_dns64_ignore_aaaa: VAR_DNS64_IGNORE_AAAA STRING_ARG */ -#line 2322 "./util/configparser.y" + case 501: /* server_dns64_ignore_aaaa: VAR_DNS64_IGNORE_AAAA STRING_ARG */ +#line 2323 "./util/configparser.y" { OUTYY(("P(dns64_ignore_aaaa:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->dns64_ignore_aaaa, (yyvsp[0].str))) fatal_exit("out of memory adding dns64-ignore-aaaa"); } -#line 5367 "util/configparser.c" +#line 5374 "util/configparser.c" break; - case 501: /* server_define_tag: VAR_DEFINE_TAG STRING_ARG */ -#line 2330 "./util/configparser.y" + case 502: /* server_define_tag: VAR_DEFINE_TAG STRING_ARG */ +#line 2331 "./util/configparser.y" { char* p, *s = (yyvsp[0].str); OUTYY(("P(server_define_tag:%s)\n", (yyvsp[0].str))); @@ -5380,11 +5387,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 5384 "util/configparser.c" +#line 5391 "util/configparser.c" break; - case 502: /* server_local_zone_tag: VAR_LOCAL_ZONE_TAG STRING_ARG STRING_ARG */ -#line 2344 "./util/configparser.y" + case 503: /* server_local_zone_tag: VAR_LOCAL_ZONE_TAG STRING_ARG STRING_ARG */ +#line 2345 "./util/configparser.y" { size_t len = 0; uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str), @@ -5404,11 +5411,11 @@ yyreduce: } } } -#line 5408 "util/configparser.c" +#line 5415 "util/configparser.c" break; - case 503: /* server_access_control_tag: VAR_ACCESS_CONTROL_TAG STRING_ARG STRING_ARG */ -#line 2365 "./util/configparser.y" + case 504: /* server_access_control_tag: VAR_ACCESS_CONTROL_TAG STRING_ARG STRING_ARG */ +#line 2366 "./util/configparser.y" { size_t len = 0; uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str), @@ -5428,11 +5435,11 @@ yyreduce: } } } -#line 5432 "util/configparser.c" +#line 5439 "util/configparser.c" break; - case 504: /* server_access_control_tag_action: VAR_ACCESS_CONTROL_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG */ -#line 2386 "./util/configparser.y" + case 505: /* server_access_control_tag_action: VAR_ACCESS_CONTROL_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG */ +#line 2387 "./util/configparser.y" { OUTYY(("P(server_access_control_tag_action:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str))); if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_actions, @@ -5443,11 +5450,11 @@ yyreduce: free((yyvsp[0].str)); } } -#line 5447 "util/configparser.c" +#line 5454 "util/configparser.c" break; - case 505: /* server_access_control_tag_data: VAR_ACCESS_CONTROL_TAG_DATA STRING_ARG STRING_ARG STRING_ARG */ -#line 2398 "./util/configparser.y" + case 506: /* server_access_control_tag_data: VAR_ACCESS_CONTROL_TAG_DATA STRING_ARG STRING_ARG STRING_ARG */ +#line 2399 "./util/configparser.y" { OUTYY(("P(server_access_control_tag_data:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str))); if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_datas, @@ -5458,11 +5465,11 @@ yyreduce: free((yyvsp[0].str)); } } -#line 5462 "util/configparser.c" +#line 5469 "util/configparser.c" break; - case 506: /* server_local_zone_override: VAR_LOCAL_ZONE_OVERRIDE STRING_ARG STRING_ARG STRING_ARG */ -#line 2410 "./util/configparser.y" + case 507: /* server_local_zone_override: VAR_LOCAL_ZONE_OVERRIDE STRING_ARG STRING_ARG STRING_ARG */ +#line 2411 "./util/configparser.y" { OUTYY(("P(server_local_zone_override:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str))); if(!cfg_str3list_insert(&cfg_parser->cfg->local_zone_overrides, @@ -5473,11 +5480,11 @@ yyreduce: free((yyvsp[0].str)); } } -#line 5477 "util/configparser.c" +#line 5484 "util/configparser.c" break; - case 507: /* server_access_control_view: VAR_ACCESS_CONTROL_VIEW STRING_ARG STRING_ARG */ -#line 2422 "./util/configparser.y" + case 508: /* server_access_control_view: VAR_ACCESS_CONTROL_VIEW STRING_ARG STRING_ARG */ +#line 2423 "./util/configparser.y" { OUTYY(("P(server_access_control_view:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(!cfg_str2list_insert(&cfg_parser->cfg->acl_view, @@ -5485,11 +5492,11 @@ yyreduce: yyerror("out of memory"); } } -#line 5489 "util/configparser.c" +#line 5496 "util/configparser.c" break; - case 508: /* server_interface_tag: VAR_INTERFACE_TAG STRING_ARG STRING_ARG */ -#line 2431 "./util/configparser.y" + case 509: /* server_interface_tag: VAR_INTERFACE_TAG STRING_ARG STRING_ARG */ +#line 2432 "./util/configparser.y" { size_t len = 0; uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str), @@ -5509,11 +5516,11 @@ yyreduce: } } } -#line 5513 "util/configparser.c" +#line 5520 "util/configparser.c" break; - case 509: /* server_interface_tag_action: VAR_INTERFACE_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG */ -#line 2452 "./util/configparser.y" + case 510: /* server_interface_tag_action: VAR_INTERFACE_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG */ +#line 2453 "./util/configparser.y" { OUTYY(("P(server_interface_tag_action:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str))); if(!cfg_str3list_insert(&cfg_parser->cfg->interface_tag_actions, @@ -5524,11 +5531,11 @@ yyreduce: free((yyvsp[0].str)); } } -#line 5528 "util/configparser.c" +#line 5535 "util/configparser.c" break; - case 510: /* server_interface_tag_data: VAR_INTERFACE_TAG_DATA STRING_ARG STRING_ARG STRING_ARG */ -#line 2464 "./util/configparser.y" + case 511: /* server_interface_tag_data: VAR_INTERFACE_TAG_DATA STRING_ARG STRING_ARG STRING_ARG */ +#line 2465 "./util/configparser.y" { OUTYY(("P(server_interface_tag_data:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str))); if(!cfg_str3list_insert(&cfg_parser->cfg->interface_tag_datas, @@ -5539,11 +5546,11 @@ yyreduce: free((yyvsp[0].str)); } } -#line 5543 "util/configparser.c" +#line 5550 "util/configparser.c" break; - case 511: /* server_interface_view: VAR_INTERFACE_VIEW STRING_ARG STRING_ARG */ -#line 2476 "./util/configparser.y" + case 512: /* server_interface_view: VAR_INTERFACE_VIEW STRING_ARG STRING_ARG */ +#line 2477 "./util/configparser.y" { OUTYY(("P(server_interface_view:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(!cfg_str2list_insert(&cfg_parser->cfg->interface_view, @@ -5551,11 +5558,11 @@ yyreduce: yyerror("out of memory"); } } -#line 5555 "util/configparser.c" +#line 5562 "util/configparser.c" break; - case 512: /* server_response_ip_tag: VAR_RESPONSE_IP_TAG STRING_ARG STRING_ARG */ -#line 2485 "./util/configparser.y" + case 513: /* server_response_ip_tag: VAR_RESPONSE_IP_TAG STRING_ARG STRING_ARG */ +#line 2486 "./util/configparser.y" { size_t len = 0; uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str), @@ -5575,11 +5582,11 @@ yyreduce: } } } -#line 5579 "util/configparser.c" +#line 5586 "util/configparser.c" break; - case 513: /* server_ip_ratelimit: VAR_IP_RATELIMIT STRING_ARG */ -#line 2506 "./util/configparser.y" + case 514: /* server_ip_ratelimit: VAR_IP_RATELIMIT STRING_ARG */ +#line 2507 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5587,11 +5594,11 @@ yyreduce: else cfg_parser->cfg->ip_ratelimit = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5591 "util/configparser.c" +#line 5598 "util/configparser.c" break; - case 514: /* server_ratelimit: VAR_RATELIMIT STRING_ARG */ -#line 2515 "./util/configparser.y" + case 515: /* server_ratelimit: VAR_RATELIMIT STRING_ARG */ +#line 2516 "./util/configparser.y" { OUTYY(("P(server_ratelimit:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5599,33 +5606,33 @@ yyreduce: else cfg_parser->cfg->ratelimit = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5603 "util/configparser.c" +#line 5610 "util/configparser.c" break; - case 515: /* server_ip_ratelimit_size: VAR_IP_RATELIMIT_SIZE STRING_ARG */ -#line 2524 "./util/configparser.y" + case 516: /* server_ip_ratelimit_size: VAR_IP_RATELIMIT_SIZE STRING_ARG */ +#line 2525 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ip_ratelimit_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 5614 "util/configparser.c" +#line 5621 "util/configparser.c" break; - case 516: /* server_ratelimit_size: VAR_RATELIMIT_SIZE STRING_ARG */ -#line 2532 "./util/configparser.y" + case 517: /* server_ratelimit_size: VAR_RATELIMIT_SIZE STRING_ARG */ +#line 2533 "./util/configparser.y" { OUTYY(("P(server_ratelimit_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ratelimit_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 5625 "util/configparser.c" +#line 5632 "util/configparser.c" break; - case 517: /* server_ip_ratelimit_slabs: VAR_IP_RATELIMIT_SLABS STRING_ARG */ -#line 2540 "./util/configparser.y" + case 518: /* server_ip_ratelimit_slabs: VAR_IP_RATELIMIT_SLABS STRING_ARG */ +#line 2541 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) { @@ -5637,11 +5644,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 5641 "util/configparser.c" +#line 5648 "util/configparser.c" break; - case 518: /* server_ratelimit_slabs: VAR_RATELIMIT_SLABS STRING_ARG */ -#line 2553 "./util/configparser.y" + case 519: /* server_ratelimit_slabs: VAR_RATELIMIT_SLABS STRING_ARG */ +#line 2554 "./util/configparser.y" { OUTYY(("P(server_ratelimit_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) { @@ -5653,11 +5660,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 5657 "util/configparser.c" +#line 5664 "util/configparser.c" break; - case 519: /* server_ratelimit_for_domain: VAR_RATELIMIT_FOR_DOMAIN STRING_ARG STRING_ARG */ -#line 2566 "./util/configparser.y" + case 520: /* server_ratelimit_for_domain: VAR_RATELIMIT_FOR_DOMAIN STRING_ARG STRING_ARG */ +#line 2567 "./util/configparser.y" { OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) { @@ -5671,11 +5678,11 @@ yyreduce: "ratelimit-for-domain"); } } -#line 5675 "util/configparser.c" +#line 5682 "util/configparser.c" break; - case 520: /* server_ratelimit_below_domain: VAR_RATELIMIT_BELOW_DOMAIN STRING_ARG STRING_ARG */ -#line 2581 "./util/configparser.y" + case 521: /* server_ratelimit_below_domain: VAR_RATELIMIT_BELOW_DOMAIN STRING_ARG STRING_ARG */ +#line 2582 "./util/configparser.y" { OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) { @@ -5689,11 +5696,11 @@ yyreduce: "ratelimit-below-domain"); } } -#line 5693 "util/configparser.c" +#line 5700 "util/configparser.c" break; - case 521: /* server_ip_ratelimit_factor: VAR_IP_RATELIMIT_FACTOR STRING_ARG */ -#line 2596 "./util/configparser.y" + case 522: /* server_ip_ratelimit_factor: VAR_IP_RATELIMIT_FACTOR STRING_ARG */ +#line 2597 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit_factor:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5701,11 +5708,11 @@ yyreduce: else cfg_parser->cfg->ip_ratelimit_factor = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5705 "util/configparser.c" +#line 5712 "util/configparser.c" break; - case 522: /* server_ratelimit_factor: VAR_RATELIMIT_FACTOR STRING_ARG */ -#line 2605 "./util/configparser.y" + case 523: /* server_ratelimit_factor: VAR_RATELIMIT_FACTOR STRING_ARG */ +#line 2606 "./util/configparser.y" { OUTYY(("P(server_ratelimit_factor:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5713,11 +5720,11 @@ yyreduce: else cfg_parser->cfg->ratelimit_factor = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5717 "util/configparser.c" +#line 5724 "util/configparser.c" break; - case 523: /* server_ip_ratelimit_backoff: VAR_IP_RATELIMIT_BACKOFF STRING_ARG */ -#line 2614 "./util/configparser.y" + case 524: /* server_ip_ratelimit_backoff: VAR_IP_RATELIMIT_BACKOFF STRING_ARG */ +#line 2615 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit_backoff:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5726,11 +5733,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5730 "util/configparser.c" +#line 5737 "util/configparser.c" break; - case 524: /* server_ratelimit_backoff: VAR_RATELIMIT_BACKOFF STRING_ARG */ -#line 2624 "./util/configparser.y" + case 525: /* server_ratelimit_backoff: VAR_RATELIMIT_BACKOFF STRING_ARG */ +#line 2625 "./util/configparser.y" { OUTYY(("P(server_ratelimit_backoff:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5739,11 +5746,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5743 "util/configparser.c" +#line 5750 "util/configparser.c" break; - case 525: /* server_outbound_msg_retry: VAR_OUTBOUND_MSG_RETRY STRING_ARG */ -#line 2634 "./util/configparser.y" + case 526: /* server_outbound_msg_retry: VAR_OUTBOUND_MSG_RETRY STRING_ARG */ +#line 2635 "./util/configparser.y" { OUTYY(("P(server_outbound_msg_retry:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5751,20 +5758,20 @@ yyreduce: else cfg_parser->cfg->outbound_msg_retry = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5755 "util/configparser.c" +#line 5762 "util/configparser.c" break; - case 526: /* server_low_rtt: VAR_LOW_RTT STRING_ARG */ -#line 2643 "./util/configparser.y" + case 527: /* server_low_rtt: VAR_LOW_RTT STRING_ARG */ +#line 2644 "./util/configparser.y" { OUTYY(("P(low-rtt option is deprecated, use fast-server-num instead)\n")); free((yyvsp[0].str)); } -#line 5764 "util/configparser.c" +#line 5771 "util/configparser.c" break; - case 527: /* server_fast_server_num: VAR_FAST_SERVER_NUM STRING_ARG */ -#line 2649 "./util/configparser.y" + case 528: /* server_fast_server_num: VAR_FAST_SERVER_NUM STRING_ARG */ +#line 2650 "./util/configparser.y" { OUTYY(("P(server_fast_server_num:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) <= 0) @@ -5772,11 +5779,11 @@ yyreduce: else cfg_parser->cfg->fast_server_num = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5776 "util/configparser.c" +#line 5783 "util/configparser.c" break; - case 528: /* server_fast_server_permil: VAR_FAST_SERVER_PERMIL STRING_ARG */ -#line 2658 "./util/configparser.y" + case 529: /* server_fast_server_permil: VAR_FAST_SERVER_PERMIL STRING_ARG */ +#line 2659 "./util/configparser.y" { OUTYY(("P(server_fast_server_permil:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5784,11 +5791,11 @@ yyreduce: else cfg_parser->cfg->fast_server_permil = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5788 "util/configparser.c" +#line 5795 "util/configparser.c" break; - case 529: /* server_qname_minimisation: VAR_QNAME_MINIMISATION STRING_ARG */ -#line 2667 "./util/configparser.y" + case 530: /* server_qname_minimisation: VAR_QNAME_MINIMISATION STRING_ARG */ +#line 2668 "./util/configparser.y" { OUTYY(("P(server_qname_minimisation:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5797,11 +5804,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5801 "util/configparser.c" +#line 5808 "util/configparser.c" break; - case 530: /* server_qname_minimisation_strict: VAR_QNAME_MINIMISATION_STRICT STRING_ARG */ -#line 2677 "./util/configparser.y" + case 531: /* server_qname_minimisation_strict: VAR_QNAME_MINIMISATION_STRICT STRING_ARG */ +#line 2678 "./util/configparser.y" { OUTYY(("P(server_qname_minimisation_strict:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5810,11 +5817,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5814 "util/configparser.c" +#line 5821 "util/configparser.c" break; - case 531: /* server_pad_responses: VAR_PAD_RESPONSES STRING_ARG */ -#line 2687 "./util/configparser.y" + case 532: /* server_pad_responses: VAR_PAD_RESPONSES STRING_ARG */ +#line 2688 "./util/configparser.y" { OUTYY(("P(server_pad_responses:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5823,11 +5830,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5827 "util/configparser.c" +#line 5834 "util/configparser.c" break; - case 532: /* server_pad_responses_block_size: VAR_PAD_RESPONSES_BLOCK_SIZE STRING_ARG */ -#line 2697 "./util/configparser.y" + case 533: /* server_pad_responses_block_size: VAR_PAD_RESPONSES_BLOCK_SIZE STRING_ARG */ +#line 2698 "./util/configparser.y" { OUTYY(("P(server_pad_responses_block_size:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -5835,11 +5842,11 @@ yyreduce: else cfg_parser->cfg->pad_responses_block_size = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5839 "util/configparser.c" +#line 5846 "util/configparser.c" break; - case 533: /* server_pad_queries: VAR_PAD_QUERIES STRING_ARG */ -#line 2706 "./util/configparser.y" + case 534: /* server_pad_queries: VAR_PAD_QUERIES STRING_ARG */ +#line 2707 "./util/configparser.y" { OUTYY(("P(server_pad_queries:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5848,11 +5855,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5852 "util/configparser.c" +#line 5859 "util/configparser.c" break; - case 534: /* server_pad_queries_block_size: VAR_PAD_QUERIES_BLOCK_SIZE STRING_ARG */ -#line 2716 "./util/configparser.y" + case 535: /* server_pad_queries_block_size: VAR_PAD_QUERIES_BLOCK_SIZE STRING_ARG */ +#line 2717 "./util/configparser.y" { OUTYY(("P(server_pad_queries_block_size:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -5860,11 +5867,11 @@ yyreduce: else cfg_parser->cfg->pad_queries_block_size = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5864 "util/configparser.c" +#line 5871 "util/configparser.c" break; - case 535: /* server_ipsecmod_enabled: VAR_IPSECMOD_ENABLED STRING_ARG */ -#line 2725 "./util/configparser.y" + case 536: /* server_ipsecmod_enabled: VAR_IPSECMOD_ENABLED STRING_ARG */ +#line 2726 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_enabled:%s)\n", (yyvsp[0].str))); @@ -5876,11 +5883,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 5880 "util/configparser.c" +#line 5887 "util/configparser.c" break; - case 536: /* server_ipsecmod_ignore_bogus: VAR_IPSECMOD_IGNORE_BOGUS STRING_ARG */ -#line 2738 "./util/configparser.y" + case 537: /* server_ipsecmod_ignore_bogus: VAR_IPSECMOD_IGNORE_BOGUS STRING_ARG */ +#line 2739 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_ignore_bogus:%s)\n", (yyvsp[0].str))); @@ -5892,11 +5899,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 5896 "util/configparser.c" +#line 5903 "util/configparser.c" break; - case 537: /* server_ipsecmod_hook: VAR_IPSECMOD_HOOK STRING_ARG */ -#line 2751 "./util/configparser.y" + case 538: /* server_ipsecmod_hook: VAR_IPSECMOD_HOOK STRING_ARG */ +#line 2752 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_hook:%s)\n", (yyvsp[0].str))); @@ -5907,11 +5914,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 5911 "util/configparser.c" +#line 5918 "util/configparser.c" break; - case 538: /* server_ipsecmod_max_ttl: VAR_IPSECMOD_MAX_TTL STRING_ARG */ -#line 2763 "./util/configparser.y" + case 539: /* server_ipsecmod_max_ttl: VAR_IPSECMOD_MAX_TTL STRING_ARG */ +#line 2764 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_max_ttl:%s)\n", (yyvsp[0].str))); @@ -5924,11 +5931,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 5928 "util/configparser.c" +#line 5935 "util/configparser.c" break; - case 539: /* server_ipsecmod_whitelist: VAR_IPSECMOD_WHITELIST STRING_ARG */ -#line 2777 "./util/configparser.y" + case 540: /* server_ipsecmod_whitelist: VAR_IPSECMOD_WHITELIST STRING_ARG */ +#line 2778 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_whitelist:%s)\n", (yyvsp[0].str))); @@ -5939,11 +5946,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 5943 "util/configparser.c" +#line 5950 "util/configparser.c" break; - case 540: /* server_ipsecmod_strict: VAR_IPSECMOD_STRICT STRING_ARG */ -#line 2789 "./util/configparser.y" + case 541: /* server_ipsecmod_strict: VAR_IPSECMOD_STRICT STRING_ARG */ +#line 2790 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_strict:%s)\n", (yyvsp[0].str))); @@ -5956,11 +5963,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 5960 "util/configparser.c" +#line 5967 "util/configparser.c" break; - case 541: /* server_edns_client_string: VAR_EDNS_CLIENT_STRING STRING_ARG STRING_ARG */ -#line 2803 "./util/configparser.y" + case 542: /* server_edns_client_string: VAR_EDNS_CLIENT_STRING STRING_ARG STRING_ARG */ +#line 2804 "./util/configparser.y" { OUTYY(("P(server_edns_client_string:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(!cfg_str2list_insert( @@ -5968,11 +5975,11 @@ yyreduce: fatal_exit("out of memory adding " "edns-client-string"); } -#line 5972 "util/configparser.c" +#line 5979 "util/configparser.c" break; - case 542: /* server_edns_client_string_opcode: VAR_EDNS_CLIENT_STRING_OPCODE STRING_ARG */ -#line 2812 "./util/configparser.y" + case 543: /* server_edns_client_string_opcode: VAR_EDNS_CLIENT_STRING_OPCODE STRING_ARG */ +#line 2813 "./util/configparser.y" { OUTYY(("P(edns_client_string_opcode:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5982,11 +5989,11 @@ yyreduce: else cfg_parser->cfg->edns_client_string_opcode = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5986 "util/configparser.c" +#line 5993 "util/configparser.c" break; - case 543: /* server_ede: VAR_EDE STRING_ARG */ -#line 2823 "./util/configparser.y" + case 544: /* server_ede: VAR_EDE STRING_ARG */ +#line 2824 "./util/configparser.y" { OUTYY(("P(server_ede:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5994,11 +6001,21 @@ yyreduce: else cfg_parser->cfg->ede = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5998 "util/configparser.c" +#line 6005 "util/configparser.c" break; - case 544: /* stub_name: VAR_NAME STRING_ARG */ -#line 2832 "./util/configparser.y" + case 545: /* server_proxy_protocol_port: VAR_PROXY_PROTOCOL_PORT STRING_ARG */ +#line 2833 "./util/configparser.y" + { + OUTYY(("P(server_proxy_protocol_port:%s)\n", (yyvsp[0].str))); + if(!cfg_strlist_insert(&cfg_parser->cfg->proxy_protocol_port, (yyvsp[0].str))) + yyerror("out of memory"); + } +#line 6015 "util/configparser.c" + break; + + case 546: /* stub_name: VAR_NAME STRING_ARG */ +#line 2840 "./util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->stubs->name) @@ -6007,31 +6024,31 @@ yyreduce: free(cfg_parser->cfg->stubs->name); cfg_parser->cfg->stubs->name = (yyvsp[0].str); } -#line 6011 "util/configparser.c" +#line 6028 "util/configparser.c" break; - case 545: /* stub_host: VAR_STUB_HOST STRING_ARG */ -#line 2842 "./util/configparser.y" + case 547: /* stub_host: VAR_STUB_HOST STRING_ARG */ +#line 2850 "./util/configparser.y" { OUTYY(("P(stub-host:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, (yyvsp[0].str))) yyerror("out of memory"); } -#line 6021 "util/configparser.c" +#line 6038 "util/configparser.c" break; - case 546: /* stub_addr: VAR_STUB_ADDR STRING_ARG */ -#line 2849 "./util/configparser.y" + case 548: /* stub_addr: VAR_STUB_ADDR STRING_ARG */ +#line 2857 "./util/configparser.y" { OUTYY(("P(stub-addr:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, (yyvsp[0].str))) yyerror("out of memory"); } -#line 6031 "util/configparser.c" +#line 6048 "util/configparser.c" break; - case 547: /* stub_first: VAR_STUB_FIRST STRING_ARG */ -#line 2856 "./util/configparser.y" + case 549: /* stub_first: VAR_STUB_FIRST STRING_ARG */ +#line 2864 "./util/configparser.y" { OUTYY(("P(stub-first:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6039,11 +6056,11 @@ yyreduce: else cfg_parser->cfg->stubs->isfirst=(strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6043 "util/configparser.c" +#line 6060 "util/configparser.c" break; - case 548: /* stub_no_cache: VAR_STUB_NO_CACHE STRING_ARG */ -#line 2865 "./util/configparser.y" + case 550: /* stub_no_cache: VAR_STUB_NO_CACHE STRING_ARG */ +#line 2873 "./util/configparser.y" { OUTYY(("P(stub-no-cache:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6051,11 +6068,11 @@ yyreduce: else cfg_parser->cfg->stubs->no_cache=(strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6055 "util/configparser.c" +#line 6072 "util/configparser.c" break; - case 549: /* stub_ssl_upstream: VAR_STUB_SSL_UPSTREAM STRING_ARG */ -#line 2874 "./util/configparser.y" + case 551: /* stub_ssl_upstream: VAR_STUB_SSL_UPSTREAM STRING_ARG */ +#line 2882 "./util/configparser.y" { OUTYY(("P(stub-ssl-upstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6064,11 +6081,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6068 "util/configparser.c" +#line 6085 "util/configparser.c" break; - case 550: /* stub_tcp_upstream: VAR_STUB_TCP_UPSTREAM STRING_ARG */ -#line 2884 "./util/configparser.y" + case 552: /* stub_tcp_upstream: VAR_STUB_TCP_UPSTREAM STRING_ARG */ +#line 2892 "./util/configparser.y" { OUTYY(("P(stub-tcp-upstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6077,11 +6094,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6081 "util/configparser.c" +#line 6098 "util/configparser.c" break; - case 551: /* stub_prime: VAR_STUB_PRIME STRING_ARG */ -#line 2894 "./util/configparser.y" + case 553: /* stub_prime: VAR_STUB_PRIME STRING_ARG */ +#line 2902 "./util/configparser.y" { OUTYY(("P(stub-prime:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6090,11 +6107,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6094 "util/configparser.c" +#line 6111 "util/configparser.c" break; - case 552: /* forward_name: VAR_NAME STRING_ARG */ -#line 2904 "./util/configparser.y" + case 554: /* forward_name: VAR_NAME STRING_ARG */ +#line 2912 "./util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->forwards->name) @@ -6103,31 +6120,31 @@ yyreduce: free(cfg_parser->cfg->forwards->name); cfg_parser->cfg->forwards->name = (yyvsp[0].str); } -#line 6107 "util/configparser.c" +#line 6124 "util/configparser.c" break; - case 553: /* forward_host: VAR_FORWARD_HOST STRING_ARG */ -#line 2914 "./util/configparser.y" + case 555: /* forward_host: VAR_FORWARD_HOST STRING_ARG */ +#line 2922 "./util/configparser.y" { OUTYY(("P(forward-host:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, (yyvsp[0].str))) yyerror("out of memory"); } -#line 6117 "util/configparser.c" +#line 6134 "util/configparser.c" break; - case 554: /* forward_addr: VAR_FORWARD_ADDR STRING_ARG */ -#line 2921 "./util/configparser.y" + case 556: /* forward_addr: VAR_FORWARD_ADDR STRING_ARG */ +#line 2929 "./util/configparser.y" { OUTYY(("P(forward-addr:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, (yyvsp[0].str))) yyerror("out of memory"); } -#line 6127 "util/configparser.c" +#line 6144 "util/configparser.c" break; - case 555: /* forward_first: VAR_FORWARD_FIRST STRING_ARG */ -#line 2928 "./util/configparser.y" + case 557: /* forward_first: VAR_FORWARD_FIRST STRING_ARG */ +#line 2936 "./util/configparser.y" { OUTYY(("P(forward-first:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6135,11 +6152,11 @@ yyreduce: else cfg_parser->cfg->forwards->isfirst=(strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6139 "util/configparser.c" +#line 6156 "util/configparser.c" break; - case 556: /* forward_no_cache: VAR_FORWARD_NO_CACHE STRING_ARG */ -#line 2937 "./util/configparser.y" + case 558: /* forward_no_cache: VAR_FORWARD_NO_CACHE STRING_ARG */ +#line 2945 "./util/configparser.y" { OUTYY(("P(forward-no-cache:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6147,11 +6164,11 @@ yyreduce: else cfg_parser->cfg->forwards->no_cache=(strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6151 "util/configparser.c" +#line 6168 "util/configparser.c" break; - case 557: /* forward_ssl_upstream: VAR_FORWARD_SSL_UPSTREAM STRING_ARG */ -#line 2946 "./util/configparser.y" + case 559: /* forward_ssl_upstream: VAR_FORWARD_SSL_UPSTREAM STRING_ARG */ +#line 2954 "./util/configparser.y" { OUTYY(("P(forward-ssl-upstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6160,11 +6177,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6164 "util/configparser.c" +#line 6181 "util/configparser.c" break; - case 558: /* forward_tcp_upstream: VAR_FORWARD_TCP_UPSTREAM STRING_ARG */ -#line 2956 "./util/configparser.y" + case 560: /* forward_tcp_upstream: VAR_FORWARD_TCP_UPSTREAM STRING_ARG */ +#line 2964 "./util/configparser.y" { OUTYY(("P(forward-tcp-upstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6173,11 +6190,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6177 "util/configparser.c" +#line 6194 "util/configparser.c" break; - case 559: /* auth_name: VAR_NAME STRING_ARG */ -#line 2966 "./util/configparser.y" + case 561: /* auth_name: VAR_NAME STRING_ARG */ +#line 2974 "./util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->auths->name) @@ -6186,52 +6203,52 @@ yyreduce: free(cfg_parser->cfg->auths->name); cfg_parser->cfg->auths->name = (yyvsp[0].str); } -#line 6190 "util/configparser.c" +#line 6207 "util/configparser.c" break; - case 560: /* auth_zonefile: VAR_ZONEFILE STRING_ARG */ -#line 2976 "./util/configparser.y" + case 562: /* auth_zonefile: VAR_ZONEFILE STRING_ARG */ +#line 2984 "./util/configparser.y" { OUTYY(("P(zonefile:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->auths->zonefile); cfg_parser->cfg->auths->zonefile = (yyvsp[0].str); } -#line 6200 "util/configparser.c" +#line 6217 "util/configparser.c" break; - case 561: /* auth_master: VAR_MASTER STRING_ARG */ -#line 2983 "./util/configparser.y" + case 563: /* auth_master: VAR_MASTER STRING_ARG */ +#line 2991 "./util/configparser.y" { OUTYY(("P(master:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->auths->masters, (yyvsp[0].str))) yyerror("out of memory"); } -#line 6210 "util/configparser.c" +#line 6227 "util/configparser.c" break; - case 562: /* auth_url: VAR_URL STRING_ARG */ -#line 2990 "./util/configparser.y" + case 564: /* auth_url: VAR_URL STRING_ARG */ +#line 2998 "./util/configparser.y" { OUTYY(("P(url:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->auths->urls, (yyvsp[0].str))) yyerror("out of memory"); } -#line 6220 "util/configparser.c" +#line 6237 "util/configparser.c" break; - case 563: /* auth_allow_notify: VAR_ALLOW_NOTIFY STRING_ARG */ -#line 2997 "./util/configparser.y" + case 565: /* auth_allow_notify: VAR_ALLOW_NOTIFY STRING_ARG */ +#line 3005 "./util/configparser.y" { OUTYY(("P(allow-notify:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->auths->allow_notify, (yyvsp[0].str))) yyerror("out of memory"); } -#line 6231 "util/configparser.c" +#line 6248 "util/configparser.c" break; - case 564: /* auth_zonemd_check: VAR_ZONEMD_CHECK STRING_ARG */ -#line 3005 "./util/configparser.y" + case 566: /* auth_zonemd_check: VAR_ZONEMD_CHECK STRING_ARG */ +#line 3013 "./util/configparser.y" { OUTYY(("P(zonemd-check:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6240,11 +6257,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6244 "util/configparser.c" +#line 6261 "util/configparser.c" break; - case 565: /* auth_zonemd_reject_absence: VAR_ZONEMD_REJECT_ABSENCE STRING_ARG */ -#line 3015 "./util/configparser.y" + case 567: /* auth_zonemd_reject_absence: VAR_ZONEMD_REJECT_ABSENCE STRING_ARG */ +#line 3023 "./util/configparser.y" { OUTYY(("P(zonemd-reject-absence:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6253,11 +6270,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6257 "util/configparser.c" +#line 6274 "util/configparser.c" break; - case 566: /* auth_for_downstream: VAR_FOR_DOWNSTREAM STRING_ARG */ -#line 3025 "./util/configparser.y" + case 568: /* auth_for_downstream: VAR_FOR_DOWNSTREAM STRING_ARG */ +#line 3033 "./util/configparser.y" { OUTYY(("P(for-downstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6266,11 +6283,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6270 "util/configparser.c" +#line 6287 "util/configparser.c" break; - case 567: /* auth_for_upstream: VAR_FOR_UPSTREAM STRING_ARG */ -#line 3035 "./util/configparser.y" + case 569: /* auth_for_upstream: VAR_FOR_UPSTREAM STRING_ARG */ +#line 3043 "./util/configparser.y" { OUTYY(("P(for-upstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6279,11 +6296,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6283 "util/configparser.c" +#line 6300 "util/configparser.c" break; - case 568: /* auth_fallback_enabled: VAR_FALLBACK_ENABLED STRING_ARG */ -#line 3045 "./util/configparser.y" + case 570: /* auth_fallback_enabled: VAR_FALLBACK_ENABLED STRING_ARG */ +#line 3053 "./util/configparser.y" { OUTYY(("P(fallback-enabled:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6292,11 +6309,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6296 "util/configparser.c" +#line 6313 "util/configparser.c" break; - case 569: /* view_name: VAR_NAME STRING_ARG */ -#line 3055 "./util/configparser.y" + case 571: /* view_name: VAR_NAME STRING_ARG */ +#line 3063 "./util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->views->name) @@ -6305,11 +6322,11 @@ yyreduce: free(cfg_parser->cfg->views->name); cfg_parser->cfg->views->name = (yyvsp[0].str); } -#line 6309 "util/configparser.c" +#line 6326 "util/configparser.c" break; - case 570: /* view_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG */ -#line 3065 "./util/configparser.y" + case 572: /* view_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG */ +#line 3073 "./util/configparser.y" { OUTYY(("P(view_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "static")!=0 && strcmp((yyvsp[0].str), "deny")!=0 && @@ -6364,11 +6381,11 @@ yyreduce: fatal_exit("out of memory adding local-zone"); } } -#line 6368 "util/configparser.c" +#line 6385 "util/configparser.c" break; - case 571: /* view_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG */ -#line 3121 "./util/configparser.y" + case 573: /* view_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG */ +#line 3129 "./util/configparser.y" { OUTYY(("P(view_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); validate_respip_action((yyvsp[0].str)); @@ -6377,33 +6394,33 @@ yyreduce: fatal_exit("out of memory adding per-view " "response-ip action"); } -#line 6381 "util/configparser.c" +#line 6398 "util/configparser.c" break; - case 572: /* view_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG */ -#line 3131 "./util/configparser.y" + case 574: /* view_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG */ +#line 3139 "./util/configparser.y" { OUTYY(("P(view_response_ip_data:%s)\n", (yyvsp[-1].str))); if(!cfg_str2list_insert( &cfg_parser->cfg->views->respip_data, (yyvsp[-1].str), (yyvsp[0].str))) fatal_exit("out of memory adding response-ip-data"); } -#line 6392 "util/configparser.c" +#line 6409 "util/configparser.c" break; - case 573: /* view_local_data: VAR_LOCAL_DATA STRING_ARG */ -#line 3139 "./util/configparser.y" + case 575: /* view_local_data: VAR_LOCAL_DATA STRING_ARG */ +#line 3147 "./util/configparser.y" { OUTYY(("P(view_local_data:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->views->local_data, (yyvsp[0].str))) { fatal_exit("out of memory adding local-data"); } } -#line 6403 "util/configparser.c" +#line 6420 "util/configparser.c" break; - case 574: /* view_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG */ -#line 3147 "./util/configparser.y" + case 576: /* view_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG */ +#line 3155 "./util/configparser.y" { char* ptr; OUTYY(("P(view_local_data_ptr:%s)\n", (yyvsp[0].str))); @@ -6417,11 +6434,11 @@ yyreduce: yyerror("local-data-ptr could not be reversed"); } } -#line 6421 "util/configparser.c" +#line 6438 "util/configparser.c" break; - case 575: /* view_first: VAR_VIEW_FIRST STRING_ARG */ -#line 3162 "./util/configparser.y" + case 577: /* view_first: VAR_VIEW_FIRST STRING_ARG */ +#line 3170 "./util/configparser.y" { OUTYY(("P(view-first:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6429,20 +6446,20 @@ yyreduce: else cfg_parser->cfg->views->isfirst=(strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6433 "util/configparser.c" +#line 6450 "util/configparser.c" break; - case 576: /* rcstart: VAR_REMOTE_CONTROL */ -#line 3171 "./util/configparser.y" + case 578: /* rcstart: VAR_REMOTE_CONTROL */ +#line 3179 "./util/configparser.y" { OUTYY(("\nP(remote-control:)\n")); cfg_parser->started_toplevel = 1; } -#line 6442 "util/configparser.c" +#line 6459 "util/configparser.c" break; - case 587: /* rc_control_enable: VAR_CONTROL_ENABLE STRING_ARG */ -#line 3183 "./util/configparser.y" + case 589: /* rc_control_enable: VAR_CONTROL_ENABLE STRING_ARG */ +#line 3191 "./util/configparser.y" { OUTYY(("P(control_enable:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6451,11 +6468,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6455 "util/configparser.c" +#line 6472 "util/configparser.c" break; - case 588: /* rc_control_port: VAR_CONTROL_PORT STRING_ARG */ -#line 3193 "./util/configparser.y" + case 590: /* rc_control_port: VAR_CONTROL_PORT STRING_ARG */ +#line 3201 "./util/configparser.y" { OUTYY(("P(control_port:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -6463,80 +6480,80 @@ yyreduce: else cfg_parser->cfg->control_port = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 6467 "util/configparser.c" +#line 6484 "util/configparser.c" break; - case 589: /* rc_control_interface: VAR_CONTROL_INTERFACE STRING_ARG */ -#line 3202 "./util/configparser.y" + case 591: /* rc_control_interface: VAR_CONTROL_INTERFACE STRING_ARG */ +#line 3210 "./util/configparser.y" { OUTYY(("P(control_interface:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_append(&cfg_parser->cfg->control_ifs, (yyvsp[0].str))) yyerror("out of memory"); } -#line 6477 "util/configparser.c" +#line 6494 "util/configparser.c" break; - case 590: /* rc_control_use_cert: VAR_CONTROL_USE_CERT STRING_ARG */ -#line 3209 "./util/configparser.y" + case 592: /* rc_control_use_cert: VAR_CONTROL_USE_CERT STRING_ARG */ +#line 3217 "./util/configparser.y" { OUTYY(("P(control_use_cert:%s)\n", (yyvsp[0].str))); cfg_parser->cfg->control_use_cert = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6487 "util/configparser.c" +#line 6504 "util/configparser.c" break; - case 591: /* rc_server_key_file: VAR_SERVER_KEY_FILE STRING_ARG */ -#line 3216 "./util/configparser.y" + case 593: /* rc_server_key_file: VAR_SERVER_KEY_FILE STRING_ARG */ +#line 3224 "./util/configparser.y" { OUTYY(("P(rc_server_key_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->server_key_file); cfg_parser->cfg->server_key_file = (yyvsp[0].str); } -#line 6497 "util/configparser.c" +#line 6514 "util/configparser.c" break; - case 592: /* rc_server_cert_file: VAR_SERVER_CERT_FILE STRING_ARG */ -#line 3223 "./util/configparser.y" + case 594: /* rc_server_cert_file: VAR_SERVER_CERT_FILE STRING_ARG */ +#line 3231 "./util/configparser.y" { OUTYY(("P(rc_server_cert_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->server_cert_file); cfg_parser->cfg->server_cert_file = (yyvsp[0].str); } -#line 6507 "util/configparser.c" +#line 6524 "util/configparser.c" break; - case 593: /* rc_control_key_file: VAR_CONTROL_KEY_FILE STRING_ARG */ -#line 3230 "./util/configparser.y" + case 595: /* rc_control_key_file: VAR_CONTROL_KEY_FILE STRING_ARG */ +#line 3238 "./util/configparser.y" { OUTYY(("P(rc_control_key_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->control_key_file); cfg_parser->cfg->control_key_file = (yyvsp[0].str); } -#line 6517 "util/configparser.c" +#line 6534 "util/configparser.c" break; - case 594: /* rc_control_cert_file: VAR_CONTROL_CERT_FILE STRING_ARG */ -#line 3237 "./util/configparser.y" + case 596: /* rc_control_cert_file: VAR_CONTROL_CERT_FILE STRING_ARG */ +#line 3245 "./util/configparser.y" { OUTYY(("P(rc_control_cert_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->control_cert_file); cfg_parser->cfg->control_cert_file = (yyvsp[0].str); } -#line 6527 "util/configparser.c" +#line 6544 "util/configparser.c" break; - case 595: /* dtstart: VAR_DNSTAP */ -#line 3244 "./util/configparser.y" + case 597: /* dtstart: VAR_DNSTAP */ +#line 3252 "./util/configparser.y" { OUTYY(("\nP(dnstap:)\n")); cfg_parser->started_toplevel = 1; } -#line 6536 "util/configparser.c" +#line 6553 "util/configparser.c" break; - case 617: /* dt_dnstap_enable: VAR_DNSTAP_ENABLE STRING_ARG */ -#line 3265 "./util/configparser.y" + case 619: /* dt_dnstap_enable: VAR_DNSTAP_ENABLE STRING_ARG */ +#line 3273 "./util/configparser.y" { OUTYY(("P(dt_dnstap_enable:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6544,11 +6561,11 @@ yyreduce: else cfg_parser->cfg->dnstap = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6548 "util/configparser.c" +#line 6565 "util/configparser.c" break; - case 618: /* dt_dnstap_bidirectional: VAR_DNSTAP_BIDIRECTIONAL STRING_ARG */ -#line 3274 "./util/configparser.y" + case 620: /* dt_dnstap_bidirectional: VAR_DNSTAP_BIDIRECTIONAL STRING_ARG */ +#line 3282 "./util/configparser.y" { OUTYY(("P(dt_dnstap_bidirectional:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6557,31 +6574,31 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6561 "util/configparser.c" +#line 6578 "util/configparser.c" break; - case 619: /* dt_dnstap_socket_path: VAR_DNSTAP_SOCKET_PATH STRING_ARG */ -#line 3284 "./util/configparser.y" + case 621: /* dt_dnstap_socket_path: VAR_DNSTAP_SOCKET_PATH STRING_ARG */ +#line 3292 "./util/configparser.y" { OUTYY(("P(dt_dnstap_socket_path:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_socket_path); cfg_parser->cfg->dnstap_socket_path = (yyvsp[0].str); } -#line 6571 "util/configparser.c" +#line 6588 "util/configparser.c" break; - case 620: /* dt_dnstap_ip: VAR_DNSTAP_IP STRING_ARG */ -#line 3291 "./util/configparser.y" + case 622: /* dt_dnstap_ip: VAR_DNSTAP_IP STRING_ARG */ +#line 3299 "./util/configparser.y" { OUTYY(("P(dt_dnstap_ip:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_ip); cfg_parser->cfg->dnstap_ip = (yyvsp[0].str); } -#line 6581 "util/configparser.c" +#line 6598 "util/configparser.c" break; - case 621: /* dt_dnstap_tls: VAR_DNSTAP_TLS STRING_ARG */ -#line 3298 "./util/configparser.y" + case 623: /* dt_dnstap_tls: VAR_DNSTAP_TLS STRING_ARG */ +#line 3306 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6589,51 +6606,51 @@ yyreduce: else cfg_parser->cfg->dnstap_tls = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6593 "util/configparser.c" +#line 6610 "util/configparser.c" break; - case 622: /* dt_dnstap_tls_server_name: VAR_DNSTAP_TLS_SERVER_NAME STRING_ARG */ -#line 3307 "./util/configparser.y" + case 624: /* dt_dnstap_tls_server_name: VAR_DNSTAP_TLS_SERVER_NAME STRING_ARG */ +#line 3315 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls_server_name:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_tls_server_name); cfg_parser->cfg->dnstap_tls_server_name = (yyvsp[0].str); } -#line 6603 "util/configparser.c" +#line 6620 "util/configparser.c" break; - case 623: /* dt_dnstap_tls_cert_bundle: VAR_DNSTAP_TLS_CERT_BUNDLE STRING_ARG */ -#line 3314 "./util/configparser.y" + case 625: /* dt_dnstap_tls_cert_bundle: VAR_DNSTAP_TLS_CERT_BUNDLE STRING_ARG */ +#line 3322 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls_cert_bundle:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_tls_cert_bundle); cfg_parser->cfg->dnstap_tls_cert_bundle = (yyvsp[0].str); } -#line 6613 "util/configparser.c" +#line 6630 "util/configparser.c" break; - case 624: /* dt_dnstap_tls_client_key_file: VAR_DNSTAP_TLS_CLIENT_KEY_FILE STRING_ARG */ -#line 3321 "./util/configparser.y" + case 626: /* dt_dnstap_tls_client_key_file: VAR_DNSTAP_TLS_CLIENT_KEY_FILE STRING_ARG */ +#line 3329 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls_client_key_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_tls_client_key_file); cfg_parser->cfg->dnstap_tls_client_key_file = (yyvsp[0].str); } -#line 6623 "util/configparser.c" +#line 6640 "util/configparser.c" break; - case 625: /* dt_dnstap_tls_client_cert_file: VAR_DNSTAP_TLS_CLIENT_CERT_FILE STRING_ARG */ -#line 3328 "./util/configparser.y" + case 627: /* dt_dnstap_tls_client_cert_file: VAR_DNSTAP_TLS_CLIENT_CERT_FILE STRING_ARG */ +#line 3336 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls_client_cert_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_tls_client_cert_file); cfg_parser->cfg->dnstap_tls_client_cert_file = (yyvsp[0].str); } -#line 6633 "util/configparser.c" +#line 6650 "util/configparser.c" break; - case 626: /* dt_dnstap_send_identity: VAR_DNSTAP_SEND_IDENTITY STRING_ARG */ -#line 3335 "./util/configparser.y" + case 628: /* dt_dnstap_send_identity: VAR_DNSTAP_SEND_IDENTITY STRING_ARG */ +#line 3343 "./util/configparser.y" { OUTYY(("P(dt_dnstap_send_identity:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6641,11 +6658,11 @@ yyreduce: else cfg_parser->cfg->dnstap_send_identity = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6645 "util/configparser.c" +#line 6662 "util/configparser.c" break; - case 627: /* dt_dnstap_send_version: VAR_DNSTAP_SEND_VERSION STRING_ARG */ -#line 3344 "./util/configparser.y" + case 629: /* dt_dnstap_send_version: VAR_DNSTAP_SEND_VERSION STRING_ARG */ +#line 3352 "./util/configparser.y" { OUTYY(("P(dt_dnstap_send_version:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6653,31 +6670,31 @@ yyreduce: else cfg_parser->cfg->dnstap_send_version = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6657 "util/configparser.c" +#line 6674 "util/configparser.c" break; - case 628: /* dt_dnstap_identity: VAR_DNSTAP_IDENTITY STRING_ARG */ -#line 3353 "./util/configparser.y" + case 630: /* dt_dnstap_identity: VAR_DNSTAP_IDENTITY STRING_ARG */ +#line 3361 "./util/configparser.y" { OUTYY(("P(dt_dnstap_identity:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_identity); cfg_parser->cfg->dnstap_identity = (yyvsp[0].str); } -#line 6667 "util/configparser.c" +#line 6684 "util/configparser.c" break; - case 629: /* dt_dnstap_version: VAR_DNSTAP_VERSION STRING_ARG */ -#line 3360 "./util/configparser.y" + case 631: /* dt_dnstap_version: VAR_DNSTAP_VERSION STRING_ARG */ +#line 3368 "./util/configparser.y" { OUTYY(("P(dt_dnstap_version:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_version); cfg_parser->cfg->dnstap_version = (yyvsp[0].str); } -#line 6677 "util/configparser.c" +#line 6694 "util/configparser.c" break; - case 630: /* dt_dnstap_log_resolver_query_messages: VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES STRING_ARG */ -#line 3367 "./util/configparser.y" + case 632: /* dt_dnstap_log_resolver_query_messages: VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES STRING_ARG */ +#line 3375 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6686,11 +6703,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6690 "util/configparser.c" +#line 6707 "util/configparser.c" break; - case 631: /* dt_dnstap_log_resolver_response_messages: VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES STRING_ARG */ -#line 3377 "./util/configparser.y" + case 633: /* dt_dnstap_log_resolver_response_messages: VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES STRING_ARG */ +#line 3385 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6699,11 +6716,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6703 "util/configparser.c" +#line 6720 "util/configparser.c" break; - case 632: /* dt_dnstap_log_client_query_messages: VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES STRING_ARG */ -#line 3387 "./util/configparser.y" + case 634: /* dt_dnstap_log_client_query_messages: VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES STRING_ARG */ +#line 3395 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6712,11 +6729,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6716 "util/configparser.c" +#line 6733 "util/configparser.c" break; - case 633: /* dt_dnstap_log_client_response_messages: VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES STRING_ARG */ -#line 3397 "./util/configparser.y" + case 635: /* dt_dnstap_log_client_response_messages: VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES STRING_ARG */ +#line 3405 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6725,11 +6742,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6729 "util/configparser.c" +#line 6746 "util/configparser.c" break; - case 634: /* dt_dnstap_log_forwarder_query_messages: VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES STRING_ARG */ -#line 3407 "./util/configparser.y" + case 636: /* dt_dnstap_log_forwarder_query_messages: VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES STRING_ARG */ +#line 3415 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6738,11 +6755,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6742 "util/configparser.c" +#line 6759 "util/configparser.c" break; - case 635: /* dt_dnstap_log_forwarder_response_messages: VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES STRING_ARG */ -#line 3417 "./util/configparser.y" + case 637: /* dt_dnstap_log_forwarder_response_messages: VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES STRING_ARG */ +#line 3425 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6751,49 +6768,49 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6755 "util/configparser.c" +#line 6772 "util/configparser.c" break; - case 636: /* pythonstart: VAR_PYTHON */ -#line 3427 "./util/configparser.y" + case 638: /* pythonstart: VAR_PYTHON */ +#line 3435 "./util/configparser.y" { OUTYY(("\nP(python:)\n")); cfg_parser->started_toplevel = 1; } -#line 6764 "util/configparser.c" +#line 6781 "util/configparser.c" break; - case 640: /* py_script: VAR_PYTHON_SCRIPT STRING_ARG */ -#line 3437 "./util/configparser.y" + case 642: /* py_script: VAR_PYTHON_SCRIPT STRING_ARG */ +#line 3445 "./util/configparser.y" { OUTYY(("P(python-script:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_append_ex(&cfg_parser->cfg->python_script, (yyvsp[0].str))) yyerror("out of memory"); } -#line 6774 "util/configparser.c" +#line 6791 "util/configparser.c" break; - case 641: /* dynlibstart: VAR_DYNLIB */ -#line 3443 "./util/configparser.y" + case 643: /* dynlibstart: VAR_DYNLIB */ +#line 3451 "./util/configparser.y" { OUTYY(("\nP(dynlib:)\n")); cfg_parser->started_toplevel = 1; } -#line 6783 "util/configparser.c" +#line 6800 "util/configparser.c" break; - case 645: /* dl_file: VAR_DYNLIB_FILE STRING_ARG */ -#line 3453 "./util/configparser.y" + case 647: /* dl_file: VAR_DYNLIB_FILE STRING_ARG */ +#line 3461 "./util/configparser.y" { OUTYY(("P(dynlib-file:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_append_ex(&cfg_parser->cfg->dynlib_file, (yyvsp[0].str))) yyerror("out of memory"); } -#line 6793 "util/configparser.c" +#line 6810 "util/configparser.c" break; - case 646: /* server_disable_dnssec_lame_check: VAR_DISABLE_DNSSEC_LAME_CHECK STRING_ARG */ -#line 3459 "./util/configparser.y" + case 648: /* server_disable_dnssec_lame_check: VAR_DISABLE_DNSSEC_LAME_CHECK STRING_ARG */ +#line 3467 "./util/configparser.y" { OUTYY(("P(disable_dnssec_lame_check:%s)\n", (yyvsp[0].str))); if (strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6802,21 +6819,21 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6806 "util/configparser.c" +#line 6823 "util/configparser.c" break; - case 647: /* server_log_identity: VAR_LOG_IDENTITY STRING_ARG */ -#line 3469 "./util/configparser.y" + case 649: /* server_log_identity: VAR_LOG_IDENTITY STRING_ARG */ +#line 3477 "./util/configparser.y" { OUTYY(("P(server_log_identity:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->log_identity); cfg_parser->cfg->log_identity = (yyvsp[0].str); } -#line 6816 "util/configparser.c" +#line 6833 "util/configparser.c" break; - case 648: /* server_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG */ -#line 3476 "./util/configparser.y" + case 650: /* server_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG */ +#line 3484 "./util/configparser.y" { OUTYY(("P(server_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); validate_respip_action((yyvsp[0].str)); @@ -6824,31 +6841,31 @@ yyreduce: (yyvsp[-1].str), (yyvsp[0].str))) fatal_exit("out of memory adding response-ip"); } -#line 6828 "util/configparser.c" +#line 6845 "util/configparser.c" break; - case 649: /* server_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG */ -#line 3485 "./util/configparser.y" + case 651: /* server_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG */ +#line 3493 "./util/configparser.y" { OUTYY(("P(server_response_ip_data:%s)\n", (yyvsp[-1].str))); if(!cfg_str2list_insert(&cfg_parser->cfg->respip_data, (yyvsp[-1].str), (yyvsp[0].str))) fatal_exit("out of memory adding response-ip-data"); } -#line 6839 "util/configparser.c" +#line 6856 "util/configparser.c" break; - case 650: /* dnscstart: VAR_DNSCRYPT */ -#line 3493 "./util/configparser.y" + case 652: /* dnscstart: VAR_DNSCRYPT */ +#line 3501 "./util/configparser.y" { OUTYY(("\nP(dnscrypt:)\n")); cfg_parser->started_toplevel = 1; } -#line 6848 "util/configparser.c" +#line 6865 "util/configparser.c" break; - case 663: /* dnsc_dnscrypt_enable: VAR_DNSCRYPT_ENABLE STRING_ARG */ -#line 3510 "./util/configparser.y" + case 665: /* dnsc_dnscrypt_enable: VAR_DNSCRYPT_ENABLE STRING_ARG */ +#line 3518 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_enable:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6856,11 +6873,11 @@ yyreduce: else cfg_parser->cfg->dnscrypt = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6860 "util/configparser.c" +#line 6877 "util/configparser.c" break; - case 664: /* dnsc_dnscrypt_port: VAR_DNSCRYPT_PORT STRING_ARG */ -#line 3520 "./util/configparser.y" + case 666: /* dnsc_dnscrypt_port: VAR_DNSCRYPT_PORT STRING_ARG */ +#line 3528 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_port:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -6868,21 +6885,21 @@ yyreduce: else cfg_parser->cfg->dnscrypt_port = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 6872 "util/configparser.c" +#line 6889 "util/configparser.c" break; - case 665: /* dnsc_dnscrypt_provider: VAR_DNSCRYPT_PROVIDER STRING_ARG */ -#line 3529 "./util/configparser.y" + case 667: /* dnsc_dnscrypt_provider: VAR_DNSCRYPT_PROVIDER STRING_ARG */ +#line 3537 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_provider:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnscrypt_provider); cfg_parser->cfg->dnscrypt_provider = (yyvsp[0].str); } -#line 6882 "util/configparser.c" +#line 6899 "util/configparser.c" break; - case 666: /* dnsc_dnscrypt_provider_cert: VAR_DNSCRYPT_PROVIDER_CERT STRING_ARG */ -#line 3536 "./util/configparser.y" + case 668: /* dnsc_dnscrypt_provider_cert: VAR_DNSCRYPT_PROVIDER_CERT STRING_ARG */ +#line 3544 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_provider_cert:%s)\n", (yyvsp[0].str))); if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str))) @@ -6890,21 +6907,21 @@ yyreduce: if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str))) fatal_exit("out of memory adding dnscrypt-provider-cert"); } -#line 6894 "util/configparser.c" +#line 6911 "util/configparser.c" break; - case 667: /* dnsc_dnscrypt_provider_cert_rotated: VAR_DNSCRYPT_PROVIDER_CERT_ROTATED STRING_ARG */ -#line 3545 "./util/configparser.y" + case 669: /* dnsc_dnscrypt_provider_cert_rotated: VAR_DNSCRYPT_PROVIDER_CERT_ROTATED STRING_ARG */ +#line 3553 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_provider_cert_rotated:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert_rotated, (yyvsp[0].str))) fatal_exit("out of memory adding dnscrypt-provider-cert-rotated"); } -#line 6904 "util/configparser.c" +#line 6921 "util/configparser.c" break; - case 668: /* dnsc_dnscrypt_secret_key: VAR_DNSCRYPT_SECRET_KEY STRING_ARG */ -#line 3552 "./util/configparser.y" + case 670: /* dnsc_dnscrypt_secret_key: VAR_DNSCRYPT_SECRET_KEY STRING_ARG */ +#line 3560 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_secret_key:%s)\n", (yyvsp[0].str))); if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str))) @@ -6912,22 +6929,22 @@ yyreduce: if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str))) fatal_exit("out of memory adding dnscrypt-secret-key"); } -#line 6916 "util/configparser.c" +#line 6933 "util/configparser.c" break; - case 669: /* dnsc_dnscrypt_shared_secret_cache_size: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE STRING_ARG */ -#line 3561 "./util/configparser.y" + case 671: /* dnsc_dnscrypt_shared_secret_cache_size: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE STRING_ARG */ +#line 3569 "./util/configparser.y" { OUTYY(("P(dnscrypt_shared_secret_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->dnscrypt_shared_secret_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 6927 "util/configparser.c" +#line 6944 "util/configparser.c" break; - case 670: /* dnsc_dnscrypt_shared_secret_cache_slabs: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS STRING_ARG */ -#line 3569 "./util/configparser.y" + case 672: /* dnsc_dnscrypt_shared_secret_cache_slabs: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS STRING_ARG */ +#line 3577 "./util/configparser.y" { OUTYY(("P(dnscrypt_shared_secret_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) { @@ -6939,22 +6956,22 @@ yyreduce: } free((yyvsp[0].str)); } -#line 6943 "util/configparser.c" +#line 6960 "util/configparser.c" break; - case 671: /* dnsc_dnscrypt_nonce_cache_size: VAR_DNSCRYPT_NONCE_CACHE_SIZE STRING_ARG */ -#line 3582 "./util/configparser.y" + case 673: /* dnsc_dnscrypt_nonce_cache_size: VAR_DNSCRYPT_NONCE_CACHE_SIZE STRING_ARG */ +#line 3590 "./util/configparser.y" { OUTYY(("P(dnscrypt_nonce_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->dnscrypt_nonce_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 6954 "util/configparser.c" +#line 6971 "util/configparser.c" break; - case 672: /* dnsc_dnscrypt_nonce_cache_slabs: VAR_DNSCRYPT_NONCE_CACHE_SLABS STRING_ARG */ -#line 3590 "./util/configparser.y" + case 674: /* dnsc_dnscrypt_nonce_cache_slabs: VAR_DNSCRYPT_NONCE_CACHE_SLABS STRING_ARG */ +#line 3598 "./util/configparser.y" { OUTYY(("P(dnscrypt_nonce_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) { @@ -6966,20 +6983,20 @@ yyreduce: } free((yyvsp[0].str)); } -#line 6970 "util/configparser.c" +#line 6987 "util/configparser.c" break; - case 673: /* cachedbstart: VAR_CACHEDB */ -#line 3603 "./util/configparser.y" + case 675: /* cachedbstart: VAR_CACHEDB */ +#line 3611 "./util/configparser.y" { OUTYY(("\nP(cachedb:)\n")); cfg_parser->started_toplevel = 1; } -#line 6979 "util/configparser.c" +#line 6996 "util/configparser.c" break; - case 682: /* cachedb_backend_name: VAR_CACHEDB_BACKEND STRING_ARG */ -#line 3615 "./util/configparser.y" + case 684: /* cachedb_backend_name: VAR_CACHEDB_BACKEND STRING_ARG */ +#line 3623 "./util/configparser.y" { #ifdef USE_CACHEDB OUTYY(("P(backend:%s)\n", (yyvsp[0].str))); @@ -6990,11 +7007,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 6994 "util/configparser.c" +#line 7011 "util/configparser.c" break; - case 683: /* cachedb_secret_seed: VAR_CACHEDB_SECRETSEED STRING_ARG */ -#line 3627 "./util/configparser.y" + case 685: /* cachedb_secret_seed: VAR_CACHEDB_SECRETSEED STRING_ARG */ +#line 3635 "./util/configparser.y" { #ifdef USE_CACHEDB OUTYY(("P(secret-seed:%s)\n", (yyvsp[0].str))); @@ -7005,11 +7022,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 7009 "util/configparser.c" +#line 7026 "util/configparser.c" break; - case 684: /* redis_server_host: VAR_CACHEDB_REDISHOST STRING_ARG */ -#line 3639 "./util/configparser.y" + case 686: /* redis_server_host: VAR_CACHEDB_REDISHOST STRING_ARG */ +#line 3647 "./util/configparser.y" { #if defined(USE_CACHEDB) && defined(USE_REDIS) OUTYY(("P(redis_server_host:%s)\n", (yyvsp[0].str))); @@ -7020,11 +7037,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 7024 "util/configparser.c" +#line 7041 "util/configparser.c" break; - case 685: /* redis_server_port: VAR_CACHEDB_REDISPORT STRING_ARG */ -#line 3651 "./util/configparser.y" + case 687: /* redis_server_port: VAR_CACHEDB_REDISPORT STRING_ARG */ +#line 3659 "./util/configparser.y" { #if defined(USE_CACHEDB) && defined(USE_REDIS) int port; @@ -7038,11 +7055,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 7042 "util/configparser.c" +#line 7059 "util/configparser.c" break; - case 686: /* redis_timeout: VAR_CACHEDB_REDISTIMEOUT STRING_ARG */ -#line 3666 "./util/configparser.y" + case 688: /* redis_timeout: VAR_CACHEDB_REDISTIMEOUT STRING_ARG */ +#line 3674 "./util/configparser.y" { #if defined(USE_CACHEDB) && defined(USE_REDIS) OUTYY(("P(redis_timeout:%s)\n", (yyvsp[0].str))); @@ -7054,11 +7071,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 7058 "util/configparser.c" +#line 7075 "util/configparser.c" break; - case 687: /* redis_expire_records: VAR_CACHEDB_REDISEXPIRERECORDS STRING_ARG */ -#line 3679 "./util/configparser.y" + case 689: /* redis_expire_records: VAR_CACHEDB_REDISEXPIRERECORDS STRING_ARG */ +#line 3687 "./util/configparser.y" { #if defined(USE_CACHEDB) && defined(USE_REDIS) OUTYY(("P(redis_expire_records:%s)\n", (yyvsp[0].str))); @@ -7070,11 +7087,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 7074 "util/configparser.c" +#line 7091 "util/configparser.c" break; - case 688: /* server_tcp_connection_limit: VAR_TCP_CONNECTION_LIMIT STRING_ARG STRING_ARG */ -#line 3692 "./util/configparser.y" + case 690: /* server_tcp_connection_limit: VAR_TCP_CONNECTION_LIMIT STRING_ARG STRING_ARG */ +#line 3700 "./util/configparser.y" { OUTYY(("P(server_tcp_connection_limit:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if (atoi((yyvsp[0].str)) < 0) @@ -7084,11 +7101,11 @@ yyreduce: fatal_exit("out of memory adding tcp connection limit"); } } -#line 7088 "util/configparser.c" +#line 7105 "util/configparser.c" break; - case 689: /* server_answer_cookie: VAR_ANSWER_COOKIE STRING_ARG */ -#line 3703 "./util/configparser.y" + case 691: /* server_answer_cookie: VAR_ANSWER_COOKIE STRING_ARG */ +#line 3711 "./util/configparser.y" { OUTYY(("P(server_answer_cookie:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -7096,11 +7113,11 @@ yyreduce: else cfg_parser->cfg->do_answer_cookie = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 7100 "util/configparser.c" +#line 7117 "util/configparser.c" break; - case 690: /* server_cookie_secret: VAR_COOKIE_SECRET STRING_ARG */ -#line 3712 "./util/configparser.y" + case 692: /* server_cookie_secret: VAR_COOKIE_SECRET STRING_ARG */ +#line 3720 "./util/configparser.y" { uint8_t secret[32]; size_t secret_len = sizeof(secret); @@ -7115,20 +7132,20 @@ yyreduce: } free((yyvsp[0].str)); } -#line 7119 "util/configparser.c" +#line 7136 "util/configparser.c" break; - case 691: /* ipsetstart: VAR_IPSET */ -#line 3727 "./util/configparser.y" + case 693: /* ipsetstart: VAR_IPSET */ +#line 3735 "./util/configparser.y" { OUTYY(("\nP(ipset:)\n")); cfg_parser->started_toplevel = 1; } -#line 7128 "util/configparser.c" +#line 7145 "util/configparser.c" break; - case 696: /* ipset_name_v4: VAR_IPSET_NAME_V4 STRING_ARG */ -#line 3737 "./util/configparser.y" + case 698: /* ipset_name_v4: VAR_IPSET_NAME_V4 STRING_ARG */ +#line 3745 "./util/configparser.y" { #ifdef USE_IPSET OUTYY(("P(name-v4:%s)\n", (yyvsp[0].str))); @@ -7142,11 +7159,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 7146 "util/configparser.c" +#line 7163 "util/configparser.c" break; - case 697: /* ipset_name_v6: VAR_IPSET_NAME_V6 STRING_ARG */ -#line 3752 "./util/configparser.y" + case 699: /* ipset_name_v6: VAR_IPSET_NAME_V6 STRING_ARG */ +#line 3760 "./util/configparser.y" { #ifdef USE_IPSET OUTYY(("P(name-v6:%s)\n", (yyvsp[0].str))); @@ -7160,11 +7177,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 7164 "util/configparser.c" +#line 7181 "util/configparser.c" break; -#line 7168 "util/configparser.c" +#line 7185 "util/configparser.c" default: break; } @@ -7357,7 +7374,7 @@ yyreturnlab: return yyresult; } -#line 3766 "./util/configparser.y" +#line 3774 "./util/configparser.y" /* parse helper routines could be here */ diff --git a/util/configparser.h b/util/configparser.h index 7ed947f1e..04d384aef 100644 --- a/util/configparser.h +++ b/util/configparser.h @@ -385,7 +385,8 @@ extern int yydebug; VAR_INTERFACE_VIEW = 586, /* VAR_INTERFACE_VIEW */ VAR_INTERFACE_TAG = 587, /* VAR_INTERFACE_TAG */ VAR_INTERFACE_TAG_ACTION = 588, /* VAR_INTERFACE_TAG_ACTION */ - VAR_INTERFACE_TAG_DATA = 589 /* VAR_INTERFACE_TAG_DATA */ + VAR_INTERFACE_TAG_DATA = 589, /* VAR_INTERFACE_TAG_DATA */ + VAR_PROXY_PROTOCOL_PORT = 590 /* VAR_PROXY_PROTOCOL_PORT */ }; typedef enum yytokentype yytoken_kind_t; #endif @@ -726,6 +727,7 @@ extern int yydebug; #define VAR_INTERFACE_TAG 587 #define VAR_INTERFACE_TAG_ACTION 588 #define VAR_INTERFACE_TAG_DATA 589 +#define VAR_PROXY_PROTOCOL_PORT 590 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED @@ -735,7 +737,7 @@ union YYSTYPE char* str; -#line 739 "util/configparser.h" +#line 741 "util/configparser.h" }; typedef union YYSTYPE YYSTYPE; diff --git a/util/configparser.y b/util/configparser.y index 980201460..1c36ee2a1 100644 --- a/util/configparser.y +++ b/util/configparser.y @@ -196,6 +196,7 @@ extern struct config_parser_state* cfg_parser; %token VAR_RPZ_SIGNAL_NXDOMAIN_RA VAR_INTERFACE_AUTOMATIC_PORTS VAR_EDE %token VAR_INTERFACE_ACTION VAR_INTERFACE_VIEW VAR_INTERFACE_TAG %token VAR_INTERFACE_TAG_ACTION VAR_INTERFACE_TAG_DATA +%token VAR_PROXY_PROTOCOL_PORT %% toplevelvars: /* empty */ | toplevelvars toplevelvar ; @@ -324,8 +325,8 @@ content_server: server_num_threads | server_verbosity | server_port | server_edns_client_string_opcode | server_nsid | server_zonemd_permissive_mode | server_max_reuse_tcp_queries | server_tcp_reuse_timeout | server_tcp_auth_query_timeout | - server_interface_automatic_ports | server_ede - + server_interface_automatic_ports | server_ede | + server_proxy_protocol_port ; stubstart: VAR_STUB_ZONE { @@ -2828,6 +2829,13 @@ server_ede: VAR_EDE STRING_ARG free($2); } ; +server_proxy_protocol_port: VAR_PROXY_PROTOCOL_PORT STRING_ARG + { + OUTYY(("P(server_proxy_protocol_port:%s)\n", $2)); + if(!cfg_strlist_insert(&cfg_parser->cfg->proxy_protocol_port, $2)) + yyerror("out of memory"); + } + ; stub_name: VAR_NAME STRING_ARG { OUTYY(("P(name:%s)\n", $2)); diff --git a/util/data/msgparse.c b/util/data/msgparse.c index 3059d555c..8ba005a8d 100644 --- a/util/data/msgparse.c +++ b/util/data/msgparse.c @@ -1144,7 +1144,7 @@ parse_edns_options_from_query(uint8_t* rdata_ptr, size_t rdata_len, */ else if (memcmp( cookie_hash( hash, server_cookie - , &repinfo->addr + , &repinfo->remote_addr , cfg->cookie_secret) , rdata_ptr + 16 , 8 ) == 0) { @@ -1171,8 +1171,8 @@ parse_edns_options_from_query(uint8_t* rdata_ptr, size_t rdata_len, server_cookie[10] = 0; /* Reserved */ server_cookie[11] = 0; /* Reserved */ sldns_write_uint32(server_cookie + 12, now); - cookie_hash( hash, server_cookie - , &repinfo->addr, cfg->cookie_secret); + cookie_hash( hash, server_cookie, &repinfo->remote_addr + , cfg->cookie_secret); memcpy(server_cookie + 16, hash, 8); if (!edns_opt_list_append( &edns->opt_list_out , LDNS_EDNS_COOKIE diff --git a/util/netevent.c b/util/netevent.c index 9030a792c..c67a49ff8 100644 --- a/util/netevent.c +++ b/util/netevent.c @@ -45,6 +45,7 @@ #include "util/net_help.h" #include "util/tcp_conn_limit.h" #include "util/fptr_wlist.h" +#include "util/proxy_protocol.h" #include "sldns/pkthdr.h" #include "sldns/sbuffer.h" #include "sldns/str2wire.h" @@ -755,6 +756,67 @@ static int udp_recv_needs_log(int err) return 1; } +/** Parses the PROXYv2 header from buf and updates the comm_reply struct. + * Returns 1 on success, 0 on failure. */ +static int consume_pp2_header(struct sldns_buffer* buf, struct comm_reply* rep, + int stream) { + size_t size; + struct pp2_header *header = pp2_read_header(buf); + if(header == NULL) return 0; + size = PP2_HEADER_SIZE + ntohs(header->len); + if((header->ver_cmd & 0xF) == PP2_CMD_LOCAL) { + /* A connection from the proxy itself. + * No need to do anything with addresses. */ + goto done; + } + if(header->fam_prot == 0x00) { + /* Unspecified family and protocol. This could be used for + * health checks by proxies. + * No need to do anything with addresses. */ + goto done; + } + /* Read the proxied address */ + switch(header->fam_prot) { + case 0x11: /* AF_INET|STREAM */ + case 0x12: /* AF_INET|DGRAM */ + { + struct sockaddr_in* addr = + (struct sockaddr_in*)&rep->client_addr; + addr->sin_family = AF_INET; + addr->sin_addr.s_addr = header->addr.addr4.src_addr; + addr->sin_port = header->addr.addr4.src_port; + rep->client_addrlen = (socklen_t)sizeof(struct sockaddr_in); + } + /* Ignore the destination address; it should be us. */ + break; + case 0x21: /* AF_INET6|STREAM */ + case 0x22: /* AF_INET6|DGRAM */ + { + struct sockaddr_in6* addr = + (struct sockaddr_in6*)&rep->client_addr; + memset(addr, 0, sizeof(*addr)); + addr->sin6_family = AF_INET6; + memcpy(&addr->sin6_addr, + header->addr.addr6.src_addr, 16); + addr->sin6_port = header->addr.addr6.src_port; + rep->client_addrlen = (socklen_t)sizeof(struct sockaddr_in6); + } + /* Ignore the destination address; it should be us. */ + break; + } + rep->is_proxied = 1; +done: + if(!stream) { + /* We are reading a whole packet; + * Move the rest of the data to overwrite the PROXYv2 header */ + /* XXX can we do better to avoid memmove? */ + memmove(header, ((char*)header)+size, + sldns_buffer_limit(buf)-size); + sldns_buffer_set_limit(buf, sldns_buffer_limit(buf)-size); + } + return 1; +} + void comm_point_udp_ancil_callback(int fd, short event, void* arg) { @@ -781,11 +843,11 @@ comm_point_udp_ancil_callback(int fd, short event, void* arg) ub_comm_base_now(rep.c->ev->base); for(i=0; ibuffer); - rep.addrlen = (socklen_t)sizeof(rep.addr); + rep.remote_addrlen = (socklen_t)sizeof(rep.remote_addr); log_assert(fd != -1); log_assert(sldns_buffer_remaining(rep.c->buffer) > 0); - msg.msg_name = &rep.addr; - msg.msg_namelen = (socklen_t)sizeof(rep.addr); + msg.msg_name = &rep.remote_addr; + msg.msg_namelen = (socklen_t)sizeof(rep.remote_addr); iov[0].iov_base = sldns_buffer_begin(rep.c->buffer); iov[0].iov_len = sldns_buffer_remaining(rep.c->buffer); msg.msg_iov = iov; @@ -803,10 +865,11 @@ comm_point_udp_ancil_callback(int fd, short event, void* arg) } return; } - rep.addrlen = msg.msg_namelen; + rep.remote_addrlen = msg.msg_namelen; sldns_buffer_skip(rep.c->buffer, rcv); sldns_buffer_flip(rep.c->buffer); rep.srctype = 0; + rep.is_proxied = 0; #ifndef S_SPLINT_S for(cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg)) { @@ -836,11 +899,24 @@ comm_point_udp_ancil_callback(int fd, short event, void* arg) if(verbosity >= VERB_ALGO) p_ancil("receive_udp on interface", &rep); #endif /* S_SPLINT_S */ + + if(rep.c->pp2_enabled && !consume_pp2_header(rep.c->buffer, + &rep, 0)) { + log_err("proxy_protocol: could not consume PROXYv2 header"); + return; + } + if(!rep.is_proxied) { + rep.client_addrlen = rep.remote_addrlen; + memmove(&rep.client_addr, &rep.remote_addr, + rep.remote_addrlen); + } + fptr_ok(fptr_whitelist_comm_point(rep.c->callback)); if((*rep.c->callback)(rep.c, rep.c->cb_arg, NETEVENT_NOERROR, &rep)) { /* send back immediate reply */ (void)comm_point_send_udp_msg_if(rep.c, rep.c->buffer, - (struct sockaddr*)&rep.addr, rep.addrlen, &rep); + (struct sockaddr*)&rep.remote_addr, + rep.remote_addrlen, &rep); } if(!rep.c || rep.c->fd == -1) /* commpoint closed */ break; @@ -871,12 +947,12 @@ comm_point_udp_callback(int fd, short event, void* arg) ub_comm_base_now(rep.c->ev->base); for(i=0; ibuffer); - rep.addrlen = (socklen_t)sizeof(rep.addr); + rep.remote_addrlen = (socklen_t)sizeof(rep.remote_addr); log_assert(fd != -1); log_assert(sldns_buffer_remaining(rep.c->buffer) > 0); rcv = recvfrom(fd, (void*)sldns_buffer_begin(rep.c->buffer), sldns_buffer_remaining(rep.c->buffer), MSG_DONTWAIT, - (struct sockaddr*)&rep.addr, &rep.addrlen); + (struct sockaddr*)&rep.remote_addr, &rep.remote_addrlen); if(rcv == -1) { #ifndef USE_WINSOCK if(errno != EAGAIN && errno != EINTR @@ -896,6 +972,19 @@ comm_point_udp_callback(int fd, short event, void* arg) sldns_buffer_skip(rep.c->buffer, rcv); sldns_buffer_flip(rep.c->buffer); rep.srctype = 0; + rep.is_proxied = 0; + + if(rep.c->pp2_enabled && !consume_pp2_header(rep.c->buffer, + &rep, 0)) { + log_err("proxy_protocol: could not consume PROXYv2 header"); + return; + } + if(!rep.is_proxied) { + rep.client_addrlen = rep.remote_addrlen; + memmove(&rep.client_addr, &rep.remote_addr, + rep.remote_addrlen); + } + fptr_ok(fptr_whitelist_comm_point(rep.c->callback)); if((*rep.c->callback)(rep.c, rep.c->cb_arg, NETEVENT_NOERROR, &rep)) { /* send back immediate reply */ @@ -905,7 +994,8 @@ comm_point_udp_callback(int fd, short event, void* arg) buffer = rep.c->buffer; #endif (void)comm_point_send_udp_msg(rep.c, buffer, - (struct sockaddr*)&rep.addr, rep.addrlen, 0); + (struct sockaddr*)&rep.remote_addr, + rep.remote_addrlen, 0); } if(!rep.c || rep.c->fd != fd) /* commpoint closed to -1 or reused for another UDP port. Note rep.c cannot be reused with TCP fd. */ @@ -1221,10 +1311,16 @@ comm_point_tcp_accept_callback(int fd, short event, void* arg) } log_assert(fd != -1); (void)fd; - new_fd = comm_point_perform_accept(c, &c_hdl->repinfo.addr, - &c_hdl->repinfo.addrlen); + new_fd = comm_point_perform_accept(c, &c_hdl->repinfo.remote_addr, + &c_hdl->repinfo.remote_addrlen); if(new_fd == -1) return; + /* Copy remote_address to client_address. + * Simplest way/time for streams to do that. */ + c_hdl->repinfo.client_addrlen = c_hdl->repinfo.remote_addrlen; + memmove(&c_hdl->repinfo.client_addr, + &c_hdl->repinfo.remote_addr, + c_hdl->repinfo.remote_addrlen); if(c->ssl) { c_hdl->ssl = incoming_ssl_fd(c->ssl, new_fd); if(!c_hdl->ssl) { @@ -1276,6 +1372,7 @@ reclaim_tcp_handler(struct comm_point* c) c->tcp_more_read_again = NULL; c->tcp_more_write_again = NULL; c->tcp_byte_count = 0; + c->pp2_header_state = pp2_header_none; sldns_buffer_clear(c->buffer); } @@ -1407,8 +1504,8 @@ ssl_handshake(struct comm_point* c) return 0; /* silence reset by peer */ #endif if(!tcp_connect_errno_needs_log( - (struct sockaddr*)&c->repinfo.addr, - c->repinfo.addrlen)) + (struct sockaddr*)&c->repinfo.remote_addr, + c->repinfo.remote_addrlen)) return 0; /* silence connect failures that show up because after connect this is the first system call that accesses the socket */ @@ -1420,8 +1517,9 @@ ssl_handshake(struct comm_point* c) unsigned long err = ERR_get_error(); if(!squelch_err_ssl_handshake(err)) { log_crypto_err_code("ssl handshake failed", err); - log_addr(VERB_OPS, "ssl handshake failed", &c->repinfo.addr, - c->repinfo.addrlen); + log_addr(VERB_OPS, "ssl handshake failed", + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); } return 0; } @@ -1438,7 +1536,8 @@ ssl_handshake(struct comm_point* c) if(!x) { log_addr(VERB_ALGO, "SSL connection failed: " "no certificate", - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); return 0; } log_cert(VERB_ALGO, "peer certificate", x); @@ -1448,13 +1547,13 @@ ssl_handshake(struct comm_point* c) snprintf(buf, sizeof(buf), "SSL connection " "to %s authenticated", SSL_get0_peername(c->ssl)); - log_addr(VERB_ALGO, buf, &c->repinfo.addr, - c->repinfo.addrlen); + log_addr(VERB_ALGO, buf, &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); } else { #endif log_addr(VERB_ALGO, "SSL connection " - "authenticated", &c->repinfo.addr, - c->repinfo.addrlen); + "authenticated", &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); #ifdef HAVE_SSL_GET0_PEERNAME } #endif @@ -1471,14 +1570,15 @@ ssl_handshake(struct comm_point* c) } log_addr(VERB_ALGO, "SSL connection failed: " "failed to authenticate", - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); return 0; } } else { /* unauthenticated, the verify peer flag was not set * in c->ssl when the ssl object was created from ssl_ctx */ - log_addr(VERB_ALGO, "SSL connection", &c->repinfo.addr, - c->repinfo.addrlen); + log_addr(VERB_ALGO, "SSL connection", &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); } #ifdef HAVE_SSL_GET0_ALPN_SELECTED @@ -1519,6 +1619,142 @@ ssl_handle_read(struct comm_point* c) if(c->ssl_shake_state != comm_ssl_shake_none) return 1; } + if(c->pp2_enabled && c->pp2_header_state != pp2_header_done) { + struct pp2_header* header = NULL; + size_t want_read_size = 0; + size_t current_read_size = 0; + if(c->pp2_header_state == pp2_header_none) { + want_read_size = PP2_HEADER_SIZE; + if(sldns_buffer_remaining(c->buffer)repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } + verbose(VERB_ALGO, "proxy_protocol: reading fixed " + "part of PROXYv2 header (len %lu)", + (unsigned long)want_read_size); + current_read_size = want_read_size; + if(c->tcp_byte_count < current_read_size) { + ERR_clear_error(); + if((r=SSL_read(c->ssl, (void*)sldns_buffer_at( + c->buffer, c->tcp_byte_count), + current_read_size - + c->tcp_byte_count)) <= 0) { + int want = SSL_get_error(c->ssl, r); + if(want == SSL_ERROR_ZERO_RETURN) { + if(c->tcp_req_info) + return tcp_req_info_handle_read_close(c->tcp_req_info); + return 0; /* shutdown, closed */ + } else if(want == SSL_ERROR_WANT_READ) { +#ifdef USE_WINSOCK + ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_READ); +#endif + return 1; /* read more later */ + } else if(want == SSL_ERROR_WANT_WRITE) { + c->ssl_shake_state = comm_ssl_shake_hs_write; + comm_point_listen_for_rw(c, 0, 1); + return 1; + } else if(want == SSL_ERROR_SYSCALL) { +#ifdef ECONNRESET + if(errno == ECONNRESET && verbosity < 2) + return 0; /* silence reset by peer */ +#endif + if(errno != 0) + log_err("SSL_read syscall: %s", + strerror(errno)); + return 0; + } + log_crypto_err("could not SSL_read"); + return 0; + } + c->tcp_byte_count += r; + if(c->tcp_byte_count != current_read_size) return 1; + c->pp2_header_state = pp2_header_init; + } + } + if(c->pp2_header_state == pp2_header_init) { + header = pp2_read_header(c->buffer); + if(!header) { + log_err("proxy_protocol: could not parse " + "PROXYv2 header"); + return 0; + } + want_read_size = ntohs(header->len); + if(sldns_buffer_remaining(c->buffer) < + PP2_HEADER_SIZE + want_read_size) { + log_err_addr("proxy_protocol: not enough " + "buffer size to read PROXYv2 header", "", + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } + verbose(VERB_ALGO, "proxy_protocol: reading variable " + "part of PROXYv2 header (len %lu)", + (unsigned long)want_read_size); + current_read_size = PP2_HEADER_SIZE + want_read_size; + if(want_read_size == 0) { + /* nothing more to read; header is complete */ + c->pp2_header_state = pp2_header_done; + } else if(c->tcp_byte_count < current_read_size) { + ERR_clear_error(); + if((r=SSL_read(c->ssl, (void*)sldns_buffer_at( + c->buffer, c->tcp_byte_count), + current_read_size - + c->tcp_byte_count)) <= 0) { + int want = SSL_get_error(c->ssl, r); + if(want == SSL_ERROR_ZERO_RETURN) { + if(c->tcp_req_info) + return tcp_req_info_handle_read_close(c->tcp_req_info); + return 0; /* shutdown, closed */ + } else if(want == SSL_ERROR_WANT_READ) { +#ifdef USE_WINSOCK + ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_READ); +#endif + return 1; /* read more later */ + } else if(want == SSL_ERROR_WANT_WRITE) { + c->ssl_shake_state = comm_ssl_shake_hs_write; + comm_point_listen_for_rw(c, 0, 1); + return 1; + } else if(want == SSL_ERROR_SYSCALL) { +#ifdef ECONNRESET + if(errno == ECONNRESET && verbosity < 2) + return 0; /* silence reset by peer */ +#endif + if(errno != 0) + log_err("SSL_read syscall: %s", + strerror(errno)); + return 0; + } + log_crypto_err("could not SSL_read"); + return 0; + } + c->tcp_byte_count += r; + if(c->tcp_byte_count != current_read_size) return 1; + c->pp2_header_state = pp2_header_done; + } + } + if(c->pp2_header_state != pp2_header_done || !header) { + log_err_addr("proxy_protocol: wrong state for the " + "PROXYv2 header", "", &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } + if(!consume_pp2_header(c->buffer, &c->repinfo, 1)) { + log_err_addr("proxy_protocol: could not consume " + "PROXYv2 header", "", &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } + verbose(VERB_ALGO, "proxy_protocol: successful read of " + "PROXYv2 header"); + /* Clear and reset the buffer to read the following + * DNS packet(s). */ + sldns_buffer_clear(c->buffer); + c->tcp_byte_count = 0; + return 1; + } if(c->tcp_byte_count < sizeof(uint16_t)) { /* read length bytes */ ERR_clear_error(); @@ -1778,16 +2014,18 @@ ssl_handle_it(struct comm_point* c, int is_write) return ssl_handle_write(c); } -/** Handle tcp reading callback. +/** + * Handle tcp reading callback. * @param fd: file descriptor of socket. * @param c: comm point to read from into buffer. * @param short_ok: if true, very short packets are OK (for comm_local). - * @return: 0 on error + * @return: 0 on error */ static int comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok) { ssize_t r; + int recv_initial = 0; log_assert(c->type == comm_tcp || c->type == comm_local); if(c->ssl) return ssl_handle_it(c, 0); @@ -1795,6 +2033,99 @@ comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok) return 0; log_assert(fd != -1); + if(c->pp2_enabled && c->pp2_header_state != pp2_header_done) { + struct pp2_header* header = NULL; + size_t want_read_size = 0; + size_t current_read_size = 0; + if(c->pp2_header_state == pp2_header_none) { + want_read_size = PP2_HEADER_SIZE; + if(sldns_buffer_remaining(c->buffer)repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } + verbose(VERB_ALGO, "proxy_protocol: reading fixed " + "part of PROXYv2 header (len %lu)", + (unsigned long)want_read_size); + current_read_size = want_read_size; + if(c->tcp_byte_count < current_read_size) { + r = recv(fd, (void*)sldns_buffer_at(c->buffer, + c->tcp_byte_count), + current_read_size-c->tcp_byte_count, MSG_DONTWAIT); + if(r == 0) { + if(c->tcp_req_info) + return tcp_req_info_handle_read_close(c->tcp_req_info); + return 0; + } else if(r == -1) { + goto recv_error_initial; + } + c->tcp_byte_count += r; + if(c->tcp_byte_count != current_read_size) return 1; + c->pp2_header_state = pp2_header_init; + } + } + if(c->pp2_header_state == pp2_header_init) { + header = pp2_read_header(c->buffer); + if(!header) { + log_err("proxy_protocol: could not parse " + "PROXYv2 header"); + return 0; + } + want_read_size = ntohs(header->len); + if(sldns_buffer_remaining(c->buffer) < + PP2_HEADER_SIZE + want_read_size) { + log_err_addr("proxy_protocol: not enough " + "buffer size to read PROXYv2 header", "", + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } + verbose(VERB_ALGO, "proxy_protocol: reading variable " + "part of PROXYv2 header (len %lu)", + (unsigned long)want_read_size); + current_read_size = PP2_HEADER_SIZE + want_read_size; + if(want_read_size == 0) { + /* nothing more to read; header is complete */ + c->pp2_header_state = pp2_header_done; + } else if(c->tcp_byte_count < current_read_size) { + r = recv(fd, (void*)sldns_buffer_at(c->buffer, + c->tcp_byte_count), + current_read_size-c->tcp_byte_count, MSG_DONTWAIT); + if(r == 0) { + if(c->tcp_req_info) + return tcp_req_info_handle_read_close(c->tcp_req_info); + return 0; + } else if(r == -1) { + goto recv_error; + } + c->tcp_byte_count += r; + if(c->tcp_byte_count != current_read_size) return 1; + c->pp2_header_state = pp2_header_done; + } + } + if(c->pp2_header_state != pp2_header_done || !header) { + log_err_addr("proxy_protocol: wrong state for the " + "PROXYv2 header", "", &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } + if(!consume_pp2_header(c->buffer, &c->repinfo, 1)) { + log_err_addr("proxy_protocol: could not consume " + "PROXYv2 header", "", &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } + verbose(VERB_ALGO, "proxy_protocol: successful read of " + "PROXYv2 header"); + /* Clear and reset the buffer to read the following + * DNS packet(s). */ + sldns_buffer_clear(c->buffer); + c->tcp_byte_count = 0; + return 1; + } + if(c->tcp_byte_count < sizeof(uint16_t)) { /* read length bytes */ r = recv(fd,(void*)sldns_buffer_at(c->buffer,c->tcp_byte_count), @@ -1804,69 +2135,9 @@ comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok) return tcp_req_info_handle_read_close(c->tcp_req_info); return 0; } else if(r == -1) { -#ifndef USE_WINSOCK - if(errno == EINTR || errno == EAGAIN) - return 1; -#ifdef ECONNRESET - if(errno == ECONNRESET && verbosity < 2) - return 0; /* silence reset by peer */ -#endif -#ifdef ECONNREFUSED - if(errno == ECONNREFUSED && verbosity < 2) - return 0; /* silence reset by peer */ -#endif -#ifdef ENETUNREACH - if(errno == ENETUNREACH && verbosity < 2) - return 0; /* silence it */ -#endif -#ifdef EHOSTDOWN - if(errno == EHOSTDOWN && verbosity < 2) - return 0; /* silence it */ -#endif -#ifdef EHOSTUNREACH - if(errno == EHOSTUNREACH && verbosity < 2) - return 0; /* silence it */ -#endif -#ifdef ENETDOWN - if(errno == ENETDOWN && verbosity < 2) - return 0; /* silence it */ -#endif -#ifdef EACCES - if(errno == EACCES && verbosity < 2) - return 0; /* silence it */ -#endif -#ifdef ENOTCONN - if(errno == ENOTCONN) { - log_err_addr("read (in tcp s) failed and this could be because TCP Fast Open is enabled [--disable-tfo-client --disable-tfo-server] but does not work", sock_strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); - return 0; - } -#endif -#else /* USE_WINSOCK */ - if(WSAGetLastError() == WSAECONNREFUSED && verbosity < 2) - return 0; - if(WSAGetLastError() == WSAEHOSTDOWN && verbosity < 2) - return 0; - if(WSAGetLastError() == WSAEHOSTUNREACH && verbosity < 2) - return 0; - if(WSAGetLastError() == WSAENETDOWN && verbosity < 2) - return 0; - if(WSAGetLastError() == WSAENETUNREACH && verbosity < 2) - return 0; - if(WSAGetLastError() == WSAECONNRESET) - return 0; - if(WSAGetLastError() == WSAEINPROGRESS) - return 1; - if(WSAGetLastError() == WSAEWOULDBLOCK) { - ub_winsock_tcp_wouldblock(c->ev->ev, - UB_EV_READ); - return 1; - } -#endif - log_err_addr("read (in tcp s)", sock_strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); - return 0; - } + if(c->pp2_enabled) goto recv_error; + goto recv_error_initial; + } c->tcp_byte_count += r; if(c->tcp_byte_count != sizeof(uint16_t)) return 1; @@ -1875,19 +2146,21 @@ comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok) verbose(VERB_QUERY, "tcp: dropped larger than buffer"); return 0; } - sldns_buffer_set_limit(c->buffer, + sldns_buffer_set_limit(c->buffer, sldns_buffer_read_u16_at(c->buffer, 0)); - if(!short_ok && + if(!short_ok && sldns_buffer_limit(c->buffer) < LDNS_HEADER_SIZE) { verbose(VERB_QUERY, "tcp: dropped bogus too short."); return 0; } - verbose(VERB_ALGO, "Reading tcp query of length %d", + verbose(VERB_ALGO, "Reading tcp query of length %d", (int)sldns_buffer_limit(c->buffer)); } if(sldns_buffer_remaining(c->buffer) == 0) - log_err("in comm_point_tcp_handle_read buffer_remaining is not > 0 as expected, continuing with (harmless) 0 length recv"); + log_err("in comm_point_tcp_handle_read buffer_remaining is " + "not > 0 as expected, continuing with (harmless) 0 " + "length recv"); r = recv(fd, (void*)sldns_buffer_current(c->buffer), sldns_buffer_remaining(c->buffer), MSG_DONTWAIT); if(r == 0) { @@ -1895,28 +2168,88 @@ comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok) return tcp_req_info_handle_read_close(c->tcp_req_info); return 0; } else if(r == -1) { -#ifndef USE_WINSOCK - if(errno == EINTR || errno == EAGAIN) - return 1; -#else /* USE_WINSOCK */ - if(WSAGetLastError() == WSAECONNRESET) - return 0; - if(WSAGetLastError() == WSAEINPROGRESS) - return 1; - if(WSAGetLastError() == WSAEWOULDBLOCK) { - ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_READ); - return 1; - } -#endif - log_err_addr("read (in tcp r)", sock_strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); - return 0; + goto recv_error; } sldns_buffer_skip(c->buffer, r); if(sldns_buffer_remaining(c->buffer) <= 0) { tcp_callback_reader(c); } return 1; + +recv_error_initial: + recv_initial = 1; +recv_error: +#ifndef USE_WINSOCK + if(errno == EINTR || errno == EAGAIN) + return 1; + if(recv_initial) { +#ifdef ECONNRESET + if(errno == ECONNRESET && verbosity < 2) + return 0; /* silence reset by peer */ +#endif +#ifdef ECONNREFUSED + if(errno == ECONNREFUSED && verbosity < 2) + return 0; /* silence reset by peer */ +#endif +#ifdef ENETUNREACH + if(errno == ENETUNREACH && verbosity < 2) + return 0; /* silence it */ +#endif +#ifdef EHOSTDOWN + if(errno == EHOSTDOWN && verbosity < 2) + return 0; /* silence it */ +#endif +#ifdef EHOSTUNREACH + if(errno == EHOSTUNREACH && verbosity < 2) + return 0; /* silence it */ +#endif +#ifdef ENETDOWN + if(errno == ENETDOWN && verbosity < 2) + return 0; /* silence it */ +#endif +#ifdef EACCES + if(errno == EACCES && verbosity < 2) + return 0; /* silence it */ +#endif +#ifdef ENOTCONN + if(errno == ENOTCONN) { + log_err_addr("read (in tcp s) failed and this " + "could be because TCP Fast Open is " + "enabled [--disable-tfo-client " + "--disable-tfo-server] but does not " + "work", sock_strerror(errno), + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } +#endif + } +#else /* USE_WINSOCK */ + if(recv_initial) { + if(WSAGetLastError() == WSAECONNREFUSED && verbosity < 2) + return 0; + if(WSAGetLastError() == WSAEHOSTDOWN && verbosity < 2) + return 0; + if(WSAGetLastError() == WSAEHOSTUNREACH && verbosity < 2) + return 0; + if(WSAGetLastError() == WSAENETDOWN && verbosity < 2) + return 0; + if(WSAGetLastError() == WSAENETUNREACH && verbosity < 2) + return 0; + } + if(WSAGetLastError() == WSAECONNRESET) + return 0; + if(WSAGetLastError() == WSAEINPROGRESS) + return 1; + if(WSAGetLastError() == WSAEWOULDBLOCK) { + ub_winsock_tcp_wouldblock(c->ev->ev, + UB_EV_READ); + return 1; + } +#endif + log_err_addr("read (in tcp s)", sock_strerror(errno), + &c->repinfo.remote_addr, c->repinfo.remote_addrlen); + return 0; } /** @@ -1962,7 +2295,8 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) return 0; /* silence lots of chatter in the logs */ else if(error != 0) { log_err_addr("tcp connect", strerror(error), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); #else /* USE_WINSOCK */ /* examine error */ if(error == WSAEINPROGRESS) @@ -1974,7 +2308,8 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) return 0; else if(error != 0) { log_err_addr("tcp connect", wsa_strerror(error), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); #endif /* USE_WINSOCK */ return 0; } @@ -2006,8 +2341,8 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) iov[1].iov_len = sldns_buffer_limit(buffer); } log_assert(iov[0].iov_len > 0); - msg.msg_name = &c->repinfo.addr; - msg.msg_namelen = c->repinfo.addrlen; + msg.msg_name = &c->repinfo.remote_addr; + msg.msg_namelen = c->repinfo.remote_addrlen; msg.msg_iov = iov; msg.msg_iovlen = 2; r = sendmsg(fd, &msg, MSG_FASTOPEN); @@ -2033,14 +2368,16 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) if(verbosity < 2) return 0; /* silence lots of chatter in the logs */ log_err_addr("tcp sendmsg", strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); return 0; } verbose(VERB_ALGO, "tcp sendmsg for fastopen failed (with %s), try normal connect", strerror(errno)); /* fallthrough to nonFASTOPEN * (MSG_FASTOPEN on Linux 3 produces EPIPE) * we need to perform connect() */ - if(connect(fd, (struct sockaddr *)&c->repinfo.addr, c->repinfo.addrlen) == -1) { + if(connect(fd, (struct sockaddr *)&c->repinfo.remote_addr, + c->repinfo.remote_addrlen) == -1) { #ifdef EINPROGRESS if(errno == EINPROGRESS) return 1; /* wait until connect done*/ @@ -2051,9 +2388,12 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) return 1; /* wait until connect done*/ #endif if(tcp_connect_errno_needs_log( - (struct sockaddr *)&c->repinfo.addr, c->repinfo.addrlen)) { + (struct sockaddr *)&c->repinfo.remote_addr, + c->repinfo.remote_addrlen)) { log_err_addr("outgoing tcp: connect after EPIPE for fastopen", - strerror(errno), &c->repinfo.addr, c->repinfo.addrlen); + strerror(errno), + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); } return 0; } @@ -2118,10 +2458,12 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) #endif # ifdef HAVE_WRITEV log_err_addr("tcp writev", strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); # else /* HAVE_WRITEV */ log_err_addr("tcp send s", strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); # endif /* HAVE_WRITEV */ #else if(WSAGetLastError() == WSAENOTCONN) @@ -2137,7 +2479,8 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) return 0; /* silence reset by peer */ log_err_addr("tcp send s", wsa_strerror(WSAGetLastError()), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); #endif return 0; } @@ -2185,7 +2528,8 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) return 0; /* silence reset by peer */ #endif log_err_addr("tcp send r", sock_strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); return 0; } if(c->tcp_write_and_read) { @@ -2449,7 +2793,7 @@ http_read_more(int fd, struct comm_point* c) } #endif log_err_addr("read (in http r)", sock_strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, c->repinfo.remote_addrlen); return 0; } verbose(VERB_ALGO, "http read more skip to %d + %d", @@ -2881,8 +3225,8 @@ ssize_t http2_recv_cb(nghttp2_session* ATTR_UNUSED(session), uint8_t* buf, return NGHTTP2_ERR_CALLBACK_FAILURE; #endif log_err_addr("could not http2 recv: %s", strerror(errno), - &h2_session->c->repinfo.addr, - h2_session->c->repinfo.addrlen); + &h2_session->c->repinfo.remote_addr, + h2_session->c->repinfo.remote_addrlen); #else /* USE_WINSOCK */ if(WSAGetLastError() == WSAECONNRESET) return NGHTTP2_ERR_CALLBACK_FAILURE; @@ -2895,8 +3239,8 @@ ssize_t http2_recv_cb(nghttp2_session* ATTR_UNUSED(session), uint8_t* buf, } log_err_addr("could not http2 recv: %s", wsa_strerror(WSAGetLastError()), - &h2_session->c->repinfo.addr, - h2_session->c->repinfo.addrlen); + &h2_session->c->repinfo.remote_addr, + h2_session->c->repinfo.remote_addrlen); #endif return NGHTTP2_ERR_CALLBACK_FAILURE; } @@ -2918,8 +3262,8 @@ comm_point_http2_handle_read(int ATTR_UNUSED(fd), struct comm_point* c) if(ret != NGHTTP2_ERR_EOF && ret != NGHTTP2_ERR_CALLBACK_FAILURE) { char a[256]; - addr_to_str(&c->repinfo.addr, c->repinfo.addrlen, - a, sizeof(a)); + addr_to_str(&c->repinfo.remote_addr, + c->repinfo.remote_addrlen, a, sizeof(a)); verbose(VERB_QUERY, "http2: session_recv from %s failed, " "error: %s", a, nghttp2_strerror(ret)); } @@ -3067,7 +3411,7 @@ http_check_connect(int fd, struct comm_point* c) return 0; /* silence lots of chatter in the logs */ else if(error != 0) { log_err_addr("http connect", strerror(error), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, c->repinfo.remote_addrlen); #else /* USE_WINSOCK */ /* examine error */ if(error == WSAEINPROGRESS) @@ -3079,7 +3423,7 @@ http_check_connect(int fd, struct comm_point* c) return 0; else if(error != 0) { log_err_addr("http connect", wsa_strerror(error), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, c->repinfo.remote_addrlen); #endif /* USE_WINSOCK */ return 0; } @@ -3149,7 +3493,7 @@ http_write_more(int fd, struct comm_point* c) } #endif log_err_addr("http send r", sock_strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, c->repinfo.remote_addrlen); return 0; } sldns_buffer_skip(c->buffer, r); @@ -3213,8 +3557,8 @@ ssize_t http2_send_cb(nghttp2_session* ATTR_UNUSED(session), const uint8_t* buf, return NGHTTP2_ERR_CALLBACK_FAILURE; #endif log_err_addr("could not http2 write: %s", strerror(errno), - &h2_session->c->repinfo.addr, - h2_session->c->repinfo.addrlen); + &h2_session->c->repinfo.remote_addr, + h2_session->c->repinfo.remote_addrlen); #else /* USE_WINSOCK */ if(WSAGetLastError() == WSAENOTCONN) return NGHTTP2_ERR_WOULDBLOCK; @@ -3229,8 +3573,8 @@ ssize_t http2_send_cb(nghttp2_session* ATTR_UNUSED(session), const uint8_t* buf, return NGHTTP2_ERR_CALLBACK_FAILURE; log_err_addr("could not http2 write: %s", wsa_strerror(WSAGetLastError()), - &h2_session->c->repinfo.addr, - h2_session->c->repinfo.addrlen); + &h2_session->c->repinfo.remote_addr, + h2_session->c->repinfo.remote_addrlen); #endif return NGHTTP2_ERR_CALLBACK_FAILURE; } @@ -3410,7 +3754,8 @@ void comm_point_raw_handle_callback(int ATTR_UNUSED(fd), struct comm_point* comm_point_create_udp(struct comm_base *base, int fd, sldns_buffer* buffer, - comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket) + int pp2_enabled, comm_point_callback_type* callback, + void* callback_arg, struct unbound_socket* socket) { struct comm_point* c = (struct comm_point*)calloc(1, sizeof(struct comm_point)); @@ -3450,6 +3795,8 @@ comm_point_create_udp(struct comm_base *base, int fd, sldns_buffer* buffer, c->callback = callback; c->cb_arg = callback_arg; c->socket = socket; + c->pp2_enabled = pp2_enabled; + c->pp2_header_state = pp2_header_none; evbits = UB_EV_READ | UB_EV_PERSIST; /* ub_event stuff */ c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits, @@ -3469,8 +3816,8 @@ comm_point_create_udp(struct comm_base *base, int fd, sldns_buffer* buffer, } struct comm_point* -comm_point_create_udp_ancil(struct comm_base *base, int fd, - sldns_buffer* buffer, +comm_point_create_udp_ancil(struct comm_base *base, int fd, + sldns_buffer* buffer, int pp2_enabled, comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket) { struct comm_point* c = (struct comm_point*)calloc(1, @@ -3511,6 +3858,8 @@ comm_point_create_udp_ancil(struct comm_base *base, int fd, c->callback = callback; c->cb_arg = callback_arg; c->socket = socket; + c->pp2_enabled = pp2_enabled; + c->pp2_header_state = pp2_header_none; evbits = UB_EV_READ | UB_EV_PERSIST; /* ub_event stuff */ c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits, @@ -3590,6 +3939,8 @@ comm_point_create_tcp_handler(struct comm_base *base, c->callback = callback; c->cb_arg = callback_arg; c->socket = socket; + c->pp2_enabled = parent->pp2_enabled; + c->pp2_header_state = pp2_header_none; if(spoolbuf) { c->tcp_req_info = tcp_req_info_create(spoolbuf); if(!c->tcp_req_info) { @@ -3685,6 +4036,8 @@ comm_point_create_http_handler(struct comm_base *base, c->callback = callback; c->cb_arg = callback_arg; c->socket = socket; + c->pp2_enabled = 0; + c->pp2_header_state = pp2_header_none; c->http_min_version = http_version_2; c->http2_stream_max_qbuffer_size = bufsize; @@ -3749,7 +4102,8 @@ comm_point_create_tcp(struct comm_base *base, int fd, int num, uint32_t http_max_streams, char* http_endpoint, struct tcl_list* tcp_conn_limit, size_t bufsize, struct sldns_buffer* spoolbuf, enum listen_type port_type, - comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket) + int pp2_enabled, comm_point_callback_type* callback, + void* callback_arg, struct unbound_socket* socket) { struct comm_point* c = (struct comm_point*)calloc(1, sizeof(struct comm_point)); @@ -3800,6 +4154,8 @@ comm_point_create_tcp(struct comm_base *base, int fd, int num, c->callback = NULL; c->cb_arg = NULL; c->socket = socket; + c->pp2_enabled = (port_type==listen_type_http?0:pp2_enabled); + c->pp2_header_state = pp2_header_none; evbits = UB_EV_READ | UB_EV_PERSIST; /* ub_event stuff */ c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits, @@ -3892,6 +4248,8 @@ comm_point_create_tcp_out(struct comm_base *base, size_t bufsize, c->repinfo.c = c; c->callback = callback; c->cb_arg = callback_arg; + c->pp2_enabled = 0; + c->pp2_header_state = pp2_header_none; evbits = UB_EV_PERSIST | UB_EV_WRITE; c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits, comm_point_tcp_handle_callback, c); @@ -3958,6 +4316,8 @@ comm_point_create_http_out(struct comm_base *base, size_t bufsize, c->repinfo.c = c; c->callback = callback; c->cb_arg = callback_arg; + c->pp2_enabled = 0; + c->pp2_header_state = pp2_header_none; evbits = UB_EV_PERSIST | UB_EV_WRITE; c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits, comm_point_http_handle_callback, c); @@ -4021,6 +4381,8 @@ comm_point_create_local(struct comm_base *base, int fd, size_t bufsize, #endif c->callback = callback; c->cb_arg = callback_arg; + c->pp2_enabled = 0; + c->pp2_header_state = pp2_header_none; /* ub_event stuff */ evbits = UB_EV_PERSIST | UB_EV_READ; c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits, @@ -4082,6 +4444,8 @@ comm_point_create_raw(struct comm_base* base, int fd, int writing, #endif c->callback = callback; c->cb_arg = callback_arg; + c->pp2_enabled = 0; + c->pp2_header_state = pp2_header_none; /* ub_event stuff */ if(writing) evbits = UB_EV_PERSIST | UB_EV_WRITE; @@ -4197,20 +4561,21 @@ comm_point_send_reply(struct comm_reply *repinfo) #endif if(repinfo->c->type == comm_udp) { if(repinfo->srctype) - comm_point_send_udp_msg_if(repinfo->c, - buffer, (struct sockaddr*)&repinfo->addr, - repinfo->addrlen, repinfo); + comm_point_send_udp_msg_if(repinfo->c, buffer, + (struct sockaddr*)&repinfo->remote_addr, + repinfo->remote_addrlen, repinfo); else comm_point_send_udp_msg(repinfo->c, buffer, - (struct sockaddr*)&repinfo->addr, repinfo->addrlen, 0); + (struct sockaddr*)&repinfo->remote_addr, + repinfo->remote_addrlen, 0); #ifdef USE_DNSTAP /* * sending src (client)/dst (local service) addresses over DNSTAP from udp callback */ if(repinfo->c->dtenv != NULL && repinfo->c->dtenv->log_client_response_messages) { log_addr(VERB_ALGO, "from local addr", (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->socket->addr->ai_addrlen); - log_addr(VERB_ALGO, "response to client", &repinfo->addr, repinfo->addrlen); - dt_msg_send_client_response(repinfo->c->dtenv, &repinfo->addr, (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->type, repinfo->c->buffer); + log_addr(VERB_ALGO, "response to client", &repinfo->client_addr, repinfo->client_addrlen); + dt_msg_send_client_response(repinfo->c->dtenv, &repinfo->client_addr, (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->type, repinfo->c->buffer); } #endif } else { @@ -4220,8 +4585,8 @@ comm_point_send_reply(struct comm_reply *repinfo) */ if(repinfo->c->tcp_parent->dtenv != NULL && repinfo->c->tcp_parent->dtenv->log_client_response_messages) { log_addr(VERB_ALGO, "from local addr", (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->socket->addr->ai_addrlen); - log_addr(VERB_ALGO, "response to client", &repinfo->addr, repinfo->addrlen); - dt_msg_send_client_response(repinfo->c->tcp_parent->dtenv, &repinfo->addr, (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->type, + log_addr(VERB_ALGO, "response to client", &repinfo->client_addr, repinfo->client_addrlen); + dt_msg_send_client_response(repinfo->c->tcp_parent->dtenv, &repinfo->client_addr, (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->type, ( repinfo->c->tcp_req_info? repinfo->c->tcp_req_info->spool_buffer: repinfo->c->buffer )); } #endif diff --git a/util/netevent.h b/util/netevent.h index 4e82703e0..3e7849c13 100644 --- a/util/netevent.h +++ b/util/netevent.h @@ -128,10 +128,11 @@ struct comm_reply { /** the comm_point with fd to send reply on to. */ struct comm_point* c; /** the address (for UDP based communication) */ - struct sockaddr_storage addr; + struct sockaddr_storage remote_addr; /** length of address */ - socklen_t addrlen; - /** return type 0 (none), 4(IP4), 6(IP6) */ + socklen_t remote_addrlen; + /** return type 0 (none), 4(IP4), 6(IP6) + * used only with listen_type_udp_ancil* */ int srctype; /* DnsCrypt context */ #ifdef USE_DNSCRYPT @@ -155,6 +156,13 @@ struct comm_reply { pktinfo; /** max udp size for udp packets */ size_t max_udp_size; + /* if set, the request came through a proxy */ + int is_proxied; + /** the client address + * the same as remote_addr if not proxied */ + struct sockaddr_storage client_addr; + /** the original address length */ + socklen_t client_addrlen; }; /** @@ -278,6 +286,19 @@ struct comm_point { /** variable with type of socket, UDP,TCP-accept,TCP,pipe */ type; + /* -------- PROXYv2 ------- */ + /** if set, PROXYv2 is expected on this connection */ + int pp2_enabled; + /** header state for the PROXYv2 header (for TCP) */ + enum { + /** no header encounter yet */ + pp2_header_none = 0, + /** read the static part of the header */ + pp2_header_init, + /** read the full header */ + pp2_header_done + } pp2_header_state; + /* ---------- Behaviour ----------- */ /** if set the connection is NOT closed on delete. */ int do_not_close; @@ -496,8 +517,9 @@ struct ub_event_base* comm_base_internal(struct comm_base* b); * Create an UDP comm point. Calls malloc. * setups the structure with the parameters you provide. * @param base: in which base to alloc the commpoint. - * @param fd : file descriptor of open UDP socket. + * @param fd: file descriptor of open UDP socket. * @param buffer: shared buffer by UDP sockets from this thread. + * @param pp2_enabled: if the comm point will support PROXYv2. * @param callback: callback function pointer. * @param callback_arg: will be passed to your callback function. * @param socket: and opened socket properties will be passed to your callback function. @@ -505,7 +527,7 @@ struct ub_event_base* comm_base_internal(struct comm_base* b); * Sets timeout to NULL. Turns off TCP options. */ struct comm_point* comm_point_create_udp(struct comm_base* base, - int fd, struct sldns_buffer* buffer, + int fd, struct sldns_buffer* buffer, int pp2_enabled, comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket); /** @@ -513,8 +535,9 @@ struct comm_point* comm_point_create_udp(struct comm_base* base, * Uses recvmsg instead of recv to get udp message. * setups the structure with the parameters you provide. * @param base: in which base to alloc the commpoint. - * @param fd : file descriptor of open UDP socket. + * @param fd: file descriptor of open UDP socket. * @param buffer: shared buffer by UDP sockets from this thread. + * @param pp2_enabled: if the comm point will support PROXYv2. * @param callback: callback function pointer. * @param callback_arg: will be passed to your callback function. * @param socket: and opened socket properties will be passed to your callback function. @@ -522,7 +545,7 @@ struct comm_point* comm_point_create_udp(struct comm_base* base, * Sets timeout to NULL. Turns off TCP options. */ struct comm_point* comm_point_create_udp_ancil(struct comm_base* base, - int fd, struct sldns_buffer* buffer, + int fd, struct sldns_buffer* buffer, int pp2_enabled, comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket); /** @@ -544,6 +567,7 @@ struct comm_point* comm_point_create_udp_ancil(struct comm_base* base, * or NULL to not create those structures in the tcp handlers. * @param port_type: the type of port we are creating a TCP listener for. Used * to select handler type to use. + * @param pp2_enabled: if the comm point will support PROXYv2. * @param callback: callback function pointer for TCP handlers. * @param callback_arg: will be passed to your callback function. * @param socket: and opened socket properties will be passed to your callback function. @@ -557,7 +581,7 @@ struct comm_point* comm_point_create_tcp(struct comm_base* base, uint32_t http_max_streams, char* http_endpoint, struct tcl_list* tcp_conn_limit, size_t bufsize, struct sldns_buffer* spoolbuf, - enum listen_type port_type, + enum listen_type port_type, int pp2_enabled, comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket); /** diff --git a/util/proxy_protocol.c b/util/proxy_protocol.c new file mode 100644 index 000000000..757c5141d --- /dev/null +++ b/util/proxy_protocol.c @@ -0,0 +1,139 @@ +/* + * util/proxy_protocol.c - event notification + * + * Copyright (c) 2022, NLnet Labs. All rights reserved. + * + * This software is open source. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 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. + * + * Neither the name of the NLNET LABS 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 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER 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. + */ + +/** + * \file + * + * This file contains PROXY protocol functions. + */ +#include "config.h" +#include "util/log.h" +#include "util/proxy_protocol.h" + +int +pp2_write_to_buf(struct sldns_buffer* buf, struct sockaddr_storage* src, + int stream) +{ + int af; + if(!src) return 0; + af = (int)((struct sockaddr_in*)src)->sin_family; + if(sldns_buffer_remaining(buf) < + PP2_HEADER_SIZE + (af==AF_INET?12:36)) { + return 0; + } + /* sig */ + sldns_buffer_write(buf, PP2_SIG, PP2_SIG_LEN); + /* version and command */ + sldns_buffer_write_u8(buf, (PP2_VERSION << 4) | PP2_CMD_PROXY); + if(af==AF_INET) { + /* family and protocol */ + sldns_buffer_write_u8(buf, + (PP2_AF_INET<<4) | + (stream?PP2_PROT_STREAM:PP2_PROT_DGRAM)); + /* length */ + sldns_buffer_write_u16(buf, 12); + /* src addr */ + sldns_buffer_write(buf, + &((struct sockaddr_in*)src)->sin_addr.s_addr, 4); + /* dst addr */ + sldns_buffer_write_u32(buf, 0); + /* src port */ + sldns_buffer_write(buf, + &((struct sockaddr_in*)src)->sin_port, 2); + /* dst port */ + sldns_buffer_write_u16(buf, 0); + } else { + /* family and protocol */ + sldns_buffer_write_u8(buf, + (PP2_AF_INET6<<4) | + (stream?PP2_PROT_STREAM:PP2_PROT_DGRAM)); + /* length */ + sldns_buffer_write_u16(buf, 36); + /* src addr */ + sldns_buffer_write(buf, + &((struct sockaddr_in6*)src)->sin6_addr, 16); + /* dst addr */ + sldns_buffer_set_at(buf, + sldns_buffer_position(buf), 0, 16); + sldns_buffer_skip(buf, 16); + /* src port */ + sldns_buffer_write(buf, + &((struct sockaddr_in6*)src)->sin6_port, 2); + /* dst port */ + sldns_buffer_write_u16(buf, 0); + } + return 1; +} + +struct pp2_header* +pp2_read_header(struct sldns_buffer* buf) +{ + size_t size; + struct pp2_header* header = (struct pp2_header*)sldns_buffer_begin(buf); + /* Try to fail all the unsupported cases first. */ + if(sldns_buffer_remaining(buf) < PP2_HEADER_SIZE) { + log_err("proxy_protocol: not enough space for header"); + return NULL; + } + /* Check for PROXYv2 header */ + if(memcmp(header, PP2_SIG, PP2_SIG_LEN) != 0 || + ((header->ver_cmd & 0xF0)>>4) != PP2_VERSION) { + log_err("proxy_protocol: could not match PROXYv2 header"); + return NULL; + } + /* Check the length */ + size = PP2_HEADER_SIZE + ntohs(header->len); + if(sldns_buffer_remaining(buf) < size) { + log_err("proxy_protocol: not enough space for header"); + return NULL; + } + /* Check for supported commands */ + if((header->ver_cmd & 0xF) != PP2_CMD_LOCAL && + (header->ver_cmd & 0xF) != PP2_CMD_PROXY) { + log_err("proxy_protocol: unsupported command"); + return NULL; + } + /* Check for supported family and protocol */ + if(header->fam_prot != 0x00 /* AF_UNSPEC|UNSPEC */ && + header->fam_prot != 0x11 /* AF_INET|STREAM */ && + header->fam_prot != 0x12 /* AF_INET|DGRAM */ && + header->fam_prot != 0x21 /* AF_INET6|STREAM */ && + header->fam_prot != 0x22 /* AF_INET6|DGRAM */) { + log_err("proxy_protocol: unsupported family and protocol"); + return NULL; + } + /* We have a correct header */ + return header; +} diff --git a/util/proxy_protocol.h b/util/proxy_protocol.h new file mode 100644 index 000000000..13cab9d74 --- /dev/null +++ b/util/proxy_protocol.h @@ -0,0 +1,131 @@ +/* + * util/proxy_protocol.h - PROXY protocol + * + * Copyright (c) 2022, NLnet Labs. All rights reserved. + * + * This software is open source. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 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. + * + * Neither the name of the NLNET LABS 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 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER 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. + */ + +/** + * \file + * + * This file contains PROXY protocol structs and functions. + * Only v2 is supported. TLVs are not currently supported. + */ +#ifndef PROXY_PROTOCOL_H +#define PROXY_PROTOCOL_H + +#include "sldns/sbuffer.h" + +/** PROXYv2 minimum header size */ +#define PP2_HEADER_SIZE 16 + +/** PROXYv2 header signature */ +#define PP2_SIG "\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A" +#define PP2_SIG_LEN 12 + +/** PROXYv2 version */ +#define PP2_VERSION 0x2 + +/** + * PROXYv2 command. + */ +enum pp2_command { + PP2_CMD_LOCAL = 0x0, + PP2_CMD_PROXY = 0x1 +}; + +/** + * PROXYv2 address family. + */ +enum pp2_af { + PP2_AF_UNSPEC = 0x0, + PP2_AF_INET = 0x1, + PP2_AF_INET6 = 0x2, + PP2_AF_UNIX = 0x3 +}; + +/** + * PROXYv2 protocol. + */ +enum pp2_protocol { + PP2_PROT_UNSPEC = 0x0, + PP2_PROT_STREAM = 0x1, + PP2_PROT_DGRAM = 0x2 +}; + +/** + * PROXYv2 header. + */ +struct pp2_header { + uint8_t sig[PP2_SIG_LEN]; + uint8_t ver_cmd; + uint8_t fam_prot; + uint16_t len; + union { + struct { /* for TCP/UDP over IPv4, len = 12 */ + uint32_t src_addr; + uint32_t dst_addr; + uint16_t src_port; + uint16_t dst_port; + } addr4; + struct { /* for TCP/UDP over IPv6, len = 36 */ + uint8_t src_addr[16]; + uint8_t dst_addr[16]; + uint16_t src_port; + uint16_t dst_port; + } addr6; + struct { /* for AF_UNIX sockets, len = 216 */ + uint8_t src_addr[108]; + uint8_t dst_addr[108]; + } addru; + } addr; +}; + +/** + * Write a PROXYv2 header at the current position of the buffer. + * @param buf: the buffer to write to. + * @param src: the source address. + * @param stream: if the protocol is stream or datagram. + * @return 1 on success, 0 on failure. + */ +int pp2_write_to_buf(struct sldns_buffer* buf, struct sockaddr_storage* src, + int stream); + +/** + * Read a PROXYv2 header from the current position of the buffer. + * It does initial validation and returns a pointer to the buffer position on + * success. + * @param buf: the buffer to read from. + * @return the pointer to the buffer position on success, NULL on error. + */ +struct pp2_header* pp2_read_header(struct sldns_buffer* buf); + +#endif /* PROXY_PROTOCOL_H */