From nobody@FreeBSD.org  Sat May 22 22:05:29 2010
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id A1D48106566B
	for <freebsd-gnats-submit@FreeBSD.org>; Sat, 22 May 2010 22:05:29 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21])
	by mx1.freebsd.org (Postfix) with ESMTP id 906138FC12
	for <freebsd-gnats-submit@FreeBSD.org>; Sat, 22 May 2010 22:05:29 +0000 (UTC)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.14.3/8.14.3) with ESMTP id o4MM5TVQ074886
	for <freebsd-gnats-submit@FreeBSD.org>; Sat, 22 May 2010 22:05:29 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.14.3/8.14.3/Submit) id o4MM5Trw074885;
	Sat, 22 May 2010 22:05:29 GMT
	(envelope-from nobody)
Message-Id: <201005222205.o4MM5Trw074885@www.freebsd.org>
Date: Sat, 22 May 2010 22:05:29 GMT
From: Anton Lavrentiev <lavr@ncbi.nlm.nih.gov>
To: freebsd-gnats-submit@FreeBSD.org
Subject: close() return error 54 (connection reset by peer) wrongly
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         146845
>Category:       kern
>Synopsis:       [libc] close(2) returns error 54 (connection reset by peer) wrongly
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    freebsd-net
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat May 22 22:10:01 UTC 2010
>Closed-Date:    
>Last-Modified:  Sun May 30 08:10:08 UTC 2010
>Originator:     Anton Lavrentiev
>Release:        8.0
>Organization:
NCBI/NLM/NIH
>Environment:
FreeBSD beastie3.ncbi.nlm.nih.gov 8.0-RELEASE-p2 FreeBSD 8.0-RELEASE-p2 #0: Tue Jan  5 16:02:27 UTC 2010     root@i386-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  i386
>Description:
When an INET socket is being closed from two ends almost simultaneously,
with both sides using a series of SO_LINGER, shutdown and close, and one
side being slightly behind the other, the side closing last gets -1
from close() on such a socket, and errno 54, Connection reset by peer,
even though there was no data in the socket (so it more likely seems that
the FIN that the late shutdown() was assumed to send was counted towards
the actual data, but it should not have).  No other UNIX flavor (and we
have many here at NCBI) exhibits this kind of problem.  Also, the problem
is not 100% reproducible on FreeBSD (but is pretty frequent, nonetheless).
We have seen this very same problem on both version 6 and 8 of the OS
(reporting here for 8).
>How-To-Repeat:
In the attached, there is a server-client C program that reproduces the
problem (although, the program itself has to be started a few times before
the actual error occurs).  At the bottom of the attached C program,
a ktrace of the communicating processes, and errno 54 coming out of
close().  select(0,...) is used to slowdown one process to imitate some
of its midwork before it is ready to proceed with actual socket disposal.
If either shutdown() or setsockopt(SO_LINGER) are excluded from the code,
the problem in close() seems to be gone.

while ktrace -i ./a.out; do date; done
kdump

>Fix:
There are workarounds (as to not to use either setsockopt(SO_LINGER) or
shutdown(SHUT_WR), or both) but they do not fix the problem in general.


Patch attached with submission follows:

#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#define BUG

int main(void)
{
    char buf[40];
    int a, s, len;
    struct sockaddr_in sin;
    struct linger lg;
    pid_t pid;

    if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("socket");
        return 1;
    }
    memset(&sin, 0, sizeof(sin));
    sin.sin_len = sizeof(sin);
    sin.sin_family = AF_INET;
    sin.sin_port = htons(7890);
    if (bind(s, (struct sockaddr*) &sin, sizeof(sin)) < 0) {
        perror("bind");
        return 1;
    }
    if (listen(s, 100) < 0) {
        perror("listen");
        return 1;
    }
    if (pid = fork()) {
        len = sizeof(sin);
        memset(&sin, 0, sizeof(sin));
        if ((a = accept(s, (struct sockaddr*) &sin, &len)) < 0) {
            perror("accept");
            return 1;
        }
        close(s);
        s = a;
    } else {
        close(s);
        if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
            perror("socket");
            return 1;
        } 
        if (connect(s, (struct sockaddr*) &sin, sizeof(sin)) < 0) {
            perror("connect");
            return 1;
        }
    }
    if (write(s, "Hello\n", 6) < 6) {
        perror("write");
        return 1;
    }
    if ((len = read(s, buf, sizeof(buf))) < 0) {
        perror("read");
        return 1;
    }
    lg.l_linger = 5;
    lg.l_onoff  = 1;
    if (setsockopt(s, SOL_SOCKET, SO_LINGER, &lg, sizeof(lg)) < 0) {
        perror("setsockopt");
        return 1;
    }
    if (pid) {
        struct timeval tv = {0, 350000} ;
        select(0, 0, 0, 0, &tv);
    }
#ifdef BUG
    if (shutdown(s, SHUT_WR) < 0) {
        perror("shutdown");
        return 1;
    }
#endif
    errno = 0;
    a = close(s);
    if (a < 0)
        perror("close");
    printf("%.*s %d %d\n", len, buf, a, errno);
    return a; 
}

#if 0

 68009 a.out    CALL  socket(PF_INET,SOCK_STREAM,IPPROTO_IP)
 68009 a.out    RET   socket 3
 68009 a.out    CALL  bind(0x3,0xbfbfe9dc,0x10)
 68009 a.out    STRU  struct sockaddr { AF_INET, 0.0.0.0:7890 }
 68009 a.out    RET   bind 0
 68009 a.out    CALL  listen(0x3,0x64)
 68009 a.out    RET   listen 0
 68009 a.out    CALL  fork
 68009 a.out    RET   fork 68010/0x109aa
 68010 a.out    RET   fork 0
 68009 a.out    CALL  accept(0x3,0xbfbfe9dc,0xbfbfe9ec)
 68010 a.out    CALL  close(0x3)
 68010 a.out    RET   close 0
 68010 a.out    CALL  socket(PF_INET,SOCK_STREAM,IPPROTO_IP)
 68010 a.out    RET   socket 3
 68010 a.out    CALL  connect(0x3,0xbfbfe9dc,0x10)
 68010 a.out    STRU  struct sockaddr { AF_INET, 0.0.0.0:7890 }
 68010 a.out    RET   connect 0
 68010 a.out    CALL  write(0x3,0x8048bc3,0x6)
 68010 a.out    GIO   fd 3 wrote 6 bytes
       "Hello
       "
 68009 a.out    STRU  struct sockaddr { AF_INET, 127.0.0.1:12597 }
 68010 a.out    RET   write 6
 68009 a.out    RET   accept 4
 68010 a.out    CALL  read(0x3,0xbfbfe9f0,0x28)
 68009 a.out    CALL  close(0x3)
 68009 a.out    RET   close 0
 68009 a.out    CALL  write(0x4,0x8048bc3,0x6)
 68009 a.out    GIO   fd 4 wrote 6 bytes
       "Hello
       "
 68009 a.out    RET   write 6
 68009 a.out    CALL  read(0x4,0xbfbfe9f0,0x28)
 68010 a.out    GIO   fd 3 read 6 bytes
       "Hello
       "
 68010 a.out    RET   read 6
 68009 a.out    GIO   fd 4 read 6 bytes
       "Hello
       "
 68009 a.out    RET   read 6
 68010 a.out    CALL  setsockopt(0x3,SOL_SOCKET,SO_LINGER,0xbfbfe9d4,0x8)
 68010 a.out    RET   setsockopt 0
 68009 a.out    CALL  setsockopt(0x4,SOL_SOCKET,SO_LINGER,0xbfbfe9d4,0x8)
 68009 a.out    RET   setsockopt 0
 68010 a.out    CALL  shutdown(0x3,<invalid=1>)
 68009 a.out    CALL  select(0,0,0,0,0xbfbfe9cc)
 68010 a.out    RET   shutdown 0
 68010 a.out    CALL  close(0x3)
 68010 a.out    RET   close 0
 68010 a.out    CALL  write(0x1,0x28201000,0x6)
 68010 a.out    GIO   fd 1 wrote 6 bytes
       "Hello
       "
 68010 a.out    RET   write 6
 68010 a.out    CALL  write(0x1,0x28201000,0x5)
 68010 a.out    GIO   fd 1 wrote 5 bytes
       " 0 0
       "
 68010 a.out    RET   write 5
 68010 a.out    CALL  exit(0)
 68009 a.out    RET   select 0
 68009 a.out    CALL  shutdown(0x4,<invalid=1>)
 68009 a.out    RET   shutdown 0
 68009 a.out    CALL  close(0x4)
 68009 a.out    RET   close -1 errno 54 Connection reset by peer           <<<=== BUG!!!
 68009 a.out    CALL  writev(0x2,0xbfbfe168,0x4)
 68009 a.out    GIO   fd 2 wrote 32 bytes
       "close: Connection reset by peer
       "
 68009 a.out    RET   writev 32/0x20
 68009 a.out    CALL  write(0x1,0x28201000,0x6)
 68009 a.out    GIO   fd 1 wrote 6 bytes
       "Hello
       "
 68009 a.out    RET   write 6
 68009 a.out    CALL  write(0x1,0x28201000,0x7)
 68009 a.out    GIO   fd 1 wrote 7 bytes
       " -1 54
       "
 68009 a.out    RET   write 7
 68009 a.out    CALL  exit(0xffffffff)

#endif


>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->freebsd-net 
Responsible-Changed-By: gavin 
Responsible-Changed-When: Sun May 23 14:03:41 UTC 2010 
Responsible-Changed-Why:  
Pass this over to maintainers.  Thanks for the good PR and test case! 

http://www.freebsd.org/cgi/query-pr.cgi?pr=146845 

From: Mikolaj Golub <to.my.trociny@gmail.com>
To: bug-followup@FreeBSD.org
Cc: Anton Lavrentiev <lavr@ncbi.nlm.nih.gov>, Robert Watson <rwatson@FreeBSD.org>, freebsd-net@FreeBSD.org
Subject: Re: kern/146845: [libc] close(2) returns error 54 (connection reset by peer) wrongly
Date: Fri, 28 May 2010 00:25:42 +0300

 --=-=-=
 Content-Type: text/plain; charset=koi8-r
 Content-Transfer-Encoding: 8bit
 
 Hi,
 
 We observed the same issue on our FreeBSD6 and 7 servers. I tried to reproduce
 the problem writing a simple test case but failed -- I didn't come to the idea
 of shutdown()/close() sequence (as Anton did). Although looking now at the
 code we had the issue with I see that shutdown()/close() sequence was used
 there too.
 
 It looks like SO_LINGER is not important to reproduce ECONNRESET.
 shutdown()/close() on one end and close() on the other is enough. Also,
 slowdown of one the processes (done by Anton using select()) is not important
 too. Taking this into consideration I have wrote a simplified version of a test
 to reproduce the bug (may be it worth of including to tools/regression/sockets?).
 
 I can easily reproduce the error with this test on FreeBSD7.1 and
 8-STABLE. Adding some prints to the kernel code I localized the place where
 the error appears and added panic() to get a backtrace.
 
 So, the backtrace:
 
 (kgdb) bt
 #0  doadump () at pcpu.h:246
 #1  0xc04ec829 in db_fncall (dummy1=-1064461270, dummy2=0, dummy3=-1, dummy4=0xe85e58b0 "X^")
     at /usr/src/sys/ddb/db_command.c:548
 #2  0xc04ecc5f in db_command (last_cmdp=0xc0e0af9c, cmd_table=0x0, dopager=0)
     at /usr/src/sys/ddb/db_command.c:445
 #3  0xc04ecd14 in db_command_script (command=0xc0e0bec4 "call doadump")
     at /usr/src/sys/ddb/db_command.c:516
 #4  0xc04f0e50 in db_script_exec (scriptname=0xe85e59bc "kdb.enter.panic", warnifnotfound=Variable "warnifnotfound" is not available.
 )
     at /usr/src/sys/ddb/db_script.c:302
 #5  0xc04f0f37 in db_script_kdbenter (eventname=0xc0cc78ea "panic")
     at /usr/src/sys/ddb/db_script.c:324
 #6  0xc04eec18 in db_trap (type=3, code=0) at /usr/src/sys/ddb/db_main.c:228
 #7  0xc08d9aa6 in kdb_trap (type=3, code=0, tf=0xe85e5af8) at /usr/src/sys/kern/subr_kdb.c:535
 #8  0xc0befecb in trap (frame=0xe85e5af8) at /usr/src/sys/i386/i386/trap.c:690
 #9  0xc0bd15eb in calltrap () at /usr/src/sys/i386/i386/exception.s:165
 #10 0xc08d9c2a in kdb_enter (why=0xc0cc78ea "panic", msg=0xc0cc78ea "panic") at cpufunc.h:71
 #11 0xc08a95b6 in panic (fmt=0xc0ce6585 "ECONNRESET") at /usr/src/sys/kern/kern_shutdown.c:562
 #12 0xc0a3d805 in tcp_usr_disconnect (so=0xc715c670) at /usr/src/sys/netinet/tcp_usrreq.c:552
 #13 0xc09111bd in sodisconnect (so=0xc715c670) at /usr/src/sys/kern/uipc_socket.c:810
 #14 0xc0914144 in soclose (so=0xc715c670) at /usr/src/sys/kern/uipc_socket.c:658
 #15 0xc08f6459 in soo_close (fp=0xc743e230, td=0xc7023000)
     at /usr/src/sys/kern/sys_socket.c:291
 #16 0xc086efc3 in _fdrop (fp=0xc743e230, td=0xc7023000) at file.h:293
 #17 0xc0870cf0 in closef (fp=0xc743e230, td=0xc7023000)
     at /usr/src/sys/kern/kern_descrip.c:2117
 #18 0xc0871097 in kern_close (td=0xc7023000, fd=4) at /usr/src/sys/kern/kern_descrip.c:1162
 #19 0xc087123a in close (td=0xc7023000, uap=0xe85e5cf8)
     at /usr/src/sys/kern/kern_descrip.c:1114
 #20 0xc0bef600 in syscall (frame=0xe85e5d38) at /usr/src/sys/i386/i386/trap.c:1111
 #21 0xc0bd1680 in Xint0x80_syscall () at /usr/src/sys/i386/i386/exception.s:261
 #22 0x00000033 in ?? ()
 Previous frame inner to this frame (corrupt stack?)
 (kgdb) fr 12
 #12 0xc0a3d805 in tcp_usr_disconnect (so=0xc715c670) at /usr/src/sys/netinet/tcp_usrreq.c:552
 552                     panic("ECONNRESET");
 (kgdb) list
 547             inp = sotoinpcb(so);
 548             KASSERT(inp != NULL, ("tcp_usr_disconnect: inp == NULL"));
 549             INP_WLOCK(inp);
 550             if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
 551                     error = ECONNRESET;
 552                     panic("ECONNRESET");
 553                     /* log(LOG_INFO, "ECONNRESET 3: file %s; line %d\n", __FILE__, __LINE__); */
 554                     goto out;
 555             }
 556             tp = intotcpcb(inp);
 (kgdb) p/x inp->inp_flags
 $1 = 0x4800000
 
 #define INP_DROPPED             0x04000000 /* protocol drop flag */
 
 (kgdb) fr 14
 #14 0xc0914144 in soclose (so=0xc715c670) at /usr/src/sys/kern/uipc_socket.c:658
 658                             error = sodisconnect(so);
 (kgdb) list
 653
 654             CURVNET_SET(so->so_vnet);
 655             funsetown(&so->so_sigio);
 656             if (so->so_state & SS_ISCONNECTED) {
 657                     if ((so->so_state & SS_ISDISCONNECTING) == 0) {
 658                             error = sodisconnect(so);
 659                             if (error) {
 660                                     if (error == ENOTCONN)
 661                                             error = 0;
 662                                     goto drop;
 (kgdb) p/x so->so_state  
 $2 = 0x2000
 
 #define SS_ISDISCONNECTED       0x2000  /* socket disconnected from peer */
 
 (the code differs a bit here from original 8-STABLE version as it includes
 patch from kern/144061 to deal with ENOTCONN errors but this does not
 influence).
 
 Actually, I think that the issue here is similar to kern/144061. In the code
 above so_state is checked for SS_ISCONNECTED and SS_ISDISCONNECTING without
 locking and then sodisconnect() is called. It looks like the following may
 happen:
 
 1) after shutdown() our output is closed;
 
 2) then we call close(), soclose() checks that we are still in SS_ISCONNECTED
 and calls sodisconnect();
 
 3) at this time FIN arrives from the other end, which has called close() too,
 and the kernel disconnects the socket (INP_DROPPED is set);
 
 4) sodisconnect()/tcp_usr_disconnect() checks for INP_DROPPED and returns
 ECONNRESET.
 
 I am attaching the patch, which may not be a solution but rather for
 illustration to described above. Running the test with this patch I am
 observing the following messages in error logs
 
 May 27 23:55:41 zhuzha kernel: ECONNRESET: so->state: 0x2000; file /usr/src/sys/kern/uipc_socket.c; line 664
 
 and test does not fail.
 
 -- 
 Mikolaj Golub
 
 
 --=-=-=
 Content-Type: application/octet-stream
 Content-Disposition: attachment; filename=tcp_close.c
 Content-Transfer-Encoding: base64
 
 I2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojaW5jbHVkZSA8
 c3lzL3N5c2N0bC5oPgojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojaW5jbHVkZSA8c2lnbmFsLmg+
 CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIu
 aD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8ZXJyLmg+CgojZGVmaW5lIExPT1BTICAg
 MTAwMDAwCiNkZWZpbmUgVVNMRUVQICAxMDAKCmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJn
 dikKewoJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKCWludCBsaXN0ZW5mZCwgY29ubmZkLCBwaWQ7
 Cgl1X2ludCBjb3VudGVyLCBuY3B1czsKCXNpemVfdCBsZW47Cglzb2NrbGVuX3Qgc29sZW47CgoJ
 bGVuID0gc2l6ZW9mKG5jcHVzKTsKCWlmIChzeXNjdGxieW5hbWUoImtlcm4uc21wLmNwdXMiLCAm
 bmNwdXMsICZsZW4sIE5VTEwsIDApIDwgMCkKCQllcnIoMSwgImtlcm4uc21wLmNwdXMiKTsKCWlm
 IChsZW4gIT0gc2l6ZW9mKG5jcHVzKSkKCQllcnJ4KDEsICJrZXJuLnNtcC5jcHVzOiBpbnZhbGlk
 IGxlbmd0aCIpOwoJaWYgKG5jcHVzIDwgMikKCQl3YXJueCgiU01QIG5vdCBwcmVzZW50LCB0ZXN0
 IG1heSBiZSB1bmFibGUgdG8gdHJpZ2dlciByYWNlIik7CgoJLyoKCSAqIENyZWF0ZSBhIHRjcCBz
 b2NrZXQgdGhhdCB0aGUgY2hpbGQgd2lsbCByZXBlYXRlZGx5IGFjY2VwdCgpCgkgKiBmcm9tLCBh
 bmQgdGhhdCB0aGUgcGFyZW50IHdpbGwgcmVwZWF0ZWRseSBjb25uZWN0KCkgdG8uCgkgKiBDaG9v
 c2UgdGhlIGxpc3RlbiBwb3J0IGR5bmFtaWNhbGx5IGFuZCBnZXQgaXRzIHZhbHVlIHVzaW5nCgkg
 KiBnZXRzb2NrbmFtZSgpLgoJICovCglpZiAoKGxpc3RlbmZkID0gc29ja2V0KEFGX0lORVQsIFNP
 Q0tfU1RSRUFNLCAwKSkgPCAwKQoJCWVycigxLCAicGFyZW50OiBzb2NrZXQgZXJyb3IiKTsKCW1l
 bXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7CglzaW4uc2luX2xlbiA9IHNpemVvZihzaW4pOwoJ
 c2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwoJaWYgKGJpbmQobGlzdGVuZmQsIChzdHJ1Y3Qgc29j
 a2FkZHIgKikgJnNpbiwKCQkgc2l6ZW9mKHNpbikpIDwgMCkKCQllcnIoMSwgInBhcmVudDogYmlu
 ZCBlcnJvciIpOwoJaWYgKGdldHNvY2tuYW1lKGxpc3RlbmZkLCAoc3RydWN0IHNvY2thZGRyICop
 ICZzaW4sCgkJCSZzb2xlbikgPCAwKQoJCWVycigxLCAicGFyZW50OiBnZXRzb2NrbmFtZSBlcnJv
 ciIpOwoJaWYgKGxpc3RlbihsaXN0ZW5mZCwgMTAyNCkgPCAwKQoJCWVycigxLCAicGFyZW50OiBs
 aXN0ZW4gZXJyb3IiKTsKCXBpZCA9IGZvcmsoKTsKCWlmIChwaWQgPT0gLTEpCgkJZXJyKDEsICJm
 b3JrKCkiKTsKCWlmIChwaWQgIT0gMCkgewoJCS8qCgkJICogSW4gdGhlIHBhcmVudCwgcmVwZWF0
 ZWRseSBjb25uZWN0IGFuZCBkaXNjb25uZWN0CgkJICogZnJvbSB0aGUgc29ja2V0LCBhdHRlbXB0
 aW5nIHRvIGluZHVjZSB0aGUgcmFjZS4KCQkgKi8KCQljbG9zZShsaXN0ZW5mZCk7CgkJc2xlZXAo
 MSk7CgkJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IExPT1BTOyBjb3VudGVyKyspIHsKCQkJ
 aWYgKChjb25uZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApKSA8IDApIHsKCQkJ
 CSh2b2lkKWtpbGwocGlkLCBTSUdURVJNKTsKCQkJCWVycigxLCAicGFyZW50OiBzb2NrZXQgZXJy
 b3IiKTsKCQkJfQoJCQlpZiAoY29ubmVjdChjb25uZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2lu
 LAoJCQkJICAgIHNpemVvZihzaW4pKSA8IDApIHsKCQkJCWVycigxLCAicGFyZW50OiBjb25uZWN0
 IGVycm9yIChhZnRlciAlZCBpdGVyYXRpb25zKSIsCgkJCQkgICAgY291bnRlcik7CgkJCX0KCQkJ
 aWYgKGNsb3NlKGNvbm5mZCkgPCAwKSB7CgkJCQkodm9pZClraWxsKHBpZCwgU0lHVEVSTSk7CgkJ
 CQllcnIoMSwgInBhcmVudDogY2xvc2UgZXJyb3IiKTsKCQkJfQoJCQl1c2xlZXAoVVNMRUVQKTsK
 CQl9CgkJKHZvaWQpa2lsbChwaWQsIFNJR1RFUk0pOwoJfSBlbHNlIHsKCQkvKgoJCSAqIEluIHRo
 ZSBjaGlsZCwgbG9vcCBhY2NlcHRpbmcsIHNodXRkb3duIGFuZCBjbG9zaW5nLgoJCSAqIFdlIG1h
 eSBwaWNrIHVwIHRoZSByYWNlIGhlcmUgc28gcmVwb3J0IGVycm9ycyBmcm9tCgkJICogY2xvc2Uo
 KS4KCQkgKi8KCQlmb3IgKCA7IDsgKSB7CgkJCWlmICgoY29ubmZkID0gYWNjZXB0KGxpc3RlbmZk
 LAoJCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKU5VTEwsIE5VTEwpKSA8IDApCgkJCQllcnIoMSwg
 ImNoaWxkOiBhY2NlcHQgZXJyb3IiKTsKCQkJaWYgKHNodXRkb3duKGNvbm5mZCwgU0hVVF9XUikg
 PCAwKQoJCQkJZXJyKDEsICJjaGlsZDogc2h1dGRvd24gZXJyb3IiKTsKCQkJaWYgKGNsb3NlKGNv
 bm5mZCkgPCAwKQoJCQkJZXJyKDEsICJjaGlsZDogY2xvc2UgZXJyb3IiKTsKCQl9Cgl9Cglwcmlu
 dGYoIk9LXG4iKTsKCWV4aXQoMCk7Cn0K
 --=-=-=
 Content-Type: application/octet-stream
 Content-Disposition: attachment; filename=uipc_socket.c.econnreset.patch
 Content-Transfer-Encoding: base64
 
 LS0tIHN5cy9rZXJuL3VpcGNfc29ja2V0LmMub3JpZwkyMDEwLTA0LTAyIDEzOjM2OjE5LjAwMDAw
 MDAwMCArMDMwMAorKysgc3lzL2tlcm4vdWlwY19zb2NrZXQuYwkyMDEwLTA1LTI3IDIyOjA5OjA2
 LjAwMDAwMDAwMCArMDMwMApAQCAtMTI5LDYgKzEyOSw3IEBAIF9fRkJTRElEKCIkRnJlZUJTRDog
 c3JjL3N5cy9rZXJuL3VpcGNfc28KICNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CiAjaW5jbHVkZSA8
 c3lzL3Vpby5oPgogI2luY2x1ZGUgPHN5cy9qYWlsLmg+CisjaW5jbHVkZSA8c3lzL3N5c2xvZy5o
 PgogCiAjaW5jbHVkZSA8bmV0L3ZuZXQuaD4KIApAQCAtNjU2LDggKzY1NywxNSBAQCBzb2Nsb3Nl
 KHN0cnVjdCBzb2NrZXQgKnNvKQogCWlmIChzby0+c29fc3RhdGUgJiBTU19JU0NPTk5FQ1RFRCkg
 ewogCQlpZiAoKHNvLT5zb19zdGF0ZSAmIFNTX0lTRElTQ09OTkVDVElORykgPT0gMCkgewogCQkJ
 ZXJyb3IgPSBzb2Rpc2Nvbm5lY3Qoc28pOwotCQkJaWYgKGVycm9yKQorCQkJaWYgKGVycm9yKSB7
 CisJCQkJaWYgKGVycm9yID09IEVDT05OUkVTRVQpIHsKKwkJCQkJbG9nKExPR19JTkZPLCAKKwkJ
 CQkJICAgICJFQ09OTlJFU0VUOiBzby0+c3RhdGU6IDB4JXg7IGZpbGUgJXM7IGxpbmUgJWRcbiIs
 CisJCQkJCSAgICBzby0+c29fc3RhdGUsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJCQkJCWVycm9y
 ID0gMDsKKwkJCQl9CiAJCQkJZ290byBkcm9wOworCQkJfQogCQl9CiAJCWlmIChzby0+c29fb3B0
 aW9ucyAmIFNPX0xJTkdFUikgewogCQkJaWYgKChzby0+c29fc3RhdGUgJiBTU19JU0RJU0NPTk5F
 Q1RJTkcpICYmCg==
 --=-=-=--

From: "Robert N. M. Watson" <rwatson@FreeBSD.org>
To: Mikolaj Golub <to.my.trociny@gmail.com>
Cc: bug-followup@FreeBSD.org,
 Anton Lavrentiev <lavr@ncbi.nlm.nih.gov>,
 freebsd-net@FreeBSD.org
Subject: Re: kern/146845: [libc] close(2) returns error 54 (connection reset by peer) wrongly
Date: Thu, 27 May 2010 23:21:06 +0100

 On 27 May 2010, at 22:25, Mikolaj Golub wrote:
 
 > We observed the same issue on our FreeBSD6 and 7 servers. I tried to =
 reproduce
 > the problem writing a simple test case but failed -- I didn't come to =
 the idea
 > of shutdown()/close() sequence (as Anton did). Although looking now at =
 the
 > code we had the issue with I see that shutdown()/close() sequence was =
 used
 > there too.
 
 Hi Mikolaj--
 
 Indeed, this looks very like the ENOTCONN issue in kern/144061 -- =
 another indication that a bit more refinement is required in the =
 synchronization for our socket-layer state machine. Unfortunately, not =
 an issue we'll likely address in a general sense until 9.0. However, a =
 similar workaround to kenr/144061 does sound like the solution -- I'll =
 get this new regression test in the tree, as well as the workaround, =
 tomorrow, with the hopes of making 8.1.
 
 Thanks all!
 
 Robert
 
 >=20
 > It looks like SO_LINGER is not important to reproduce ECONNRESET.
 > shutdown()/close() on one end and close() on the other is enough. =
 Also,
 > slowdown of one the processes (done by Anton using select()) is not =
 important
 > too. Taking this into consideration I have wrote a simplified version =
 of a test
 > to reproduce the bug (may be it worth of including to =
 tools/regression/sockets?).
 >=20
 > I can easily reproduce the error with this test on FreeBSD7.1 and
 > 8-STABLE. Adding some prints to the kernel code I localized the place =
 where
 > the error appears and added panic() to get a backtrace.
 >=20
 > So, the backtrace:
 >=20
 > (kgdb) bt
 > #0  doadump () at pcpu.h:246
 > #1  0xc04ec829 in db_fncall (dummy1=3D-1064461270, dummy2=3D0, =
 dummy3=3D-1, dummy4=3D0xe85e58b0 "=C4X^=E8")
 >    at /usr/src/sys/ddb/db_command.c:548
 > #2  0xc04ecc5f in db_command (last_cmdp=3D0xc0e0af9c, cmd_table=3D0x0, =
 dopager=3D0)
 >    at /usr/src/sys/ddb/db_command.c:445
 > #3  0xc04ecd14 in db_command_script (command=3D0xc0e0bec4 "call =
 doadump")
 >    at /usr/src/sys/ddb/db_command.c:516
 > #4  0xc04f0e50 in db_script_exec (scriptname=3D0xe85e59bc =
 "kdb.enter.panic", warnifnotfound=3DVariable "warnifnotfound" is not =
 available.
 > )
 >    at /usr/src/sys/ddb/db_script.c:302
 > #5  0xc04f0f37 in db_script_kdbenter (eventname=3D0xc0cc78ea "panic")
 >    at /usr/src/sys/ddb/db_script.c:324
 > #6  0xc04eec18 in db_trap (type=3D3, code=3D0) at =
 /usr/src/sys/ddb/db_main.c:228
 > #7  0xc08d9aa6 in kdb_trap (type=3D3, code=3D0, tf=3D0xe85e5af8) at =
 /usr/src/sys/kern/subr_kdb.c:535
 > #8  0xc0befecb in trap (frame=3D0xe85e5af8) at =
 /usr/src/sys/i386/i386/trap.c:690
 > #9  0xc0bd15eb in calltrap () at =
 /usr/src/sys/i386/i386/exception.s:165
 > #10 0xc08d9c2a in kdb_enter (why=3D0xc0cc78ea "panic", msg=3D0xc0cc78ea =
 "panic") at cpufunc.h:71
 > #11 0xc08a95b6 in panic (fmt=3D0xc0ce6585 "ECONNRESET") at =
 /usr/src/sys/kern/kern_shutdown.c:562
 > #12 0xc0a3d805 in tcp_usr_disconnect (so=3D0xc715c670) at =
 /usr/src/sys/netinet/tcp_usrreq.c:552
 > #13 0xc09111bd in sodisconnect (so=3D0xc715c670) at =
 /usr/src/sys/kern/uipc_socket.c:810
 > #14 0xc0914144 in soclose (so=3D0xc715c670) at =
 /usr/src/sys/kern/uipc_socket.c:658
 > #15 0xc08f6459 in soo_close (fp=3D0xc743e230, td=3D0xc7023000)
 >    at /usr/src/sys/kern/sys_socket.c:291
 > #16 0xc086efc3 in _fdrop (fp=3D0xc743e230, td=3D0xc7023000) at =
 file.h:293
 > #17 0xc0870cf0 in closef (fp=3D0xc743e230, td=3D0xc7023000)
 >    at /usr/src/sys/kern/kern_descrip.c:2117
 > #18 0xc0871097 in kern_close (td=3D0xc7023000, fd=3D4) at =
 /usr/src/sys/kern/kern_descrip.c:1162
 > #19 0xc087123a in close (td=3D0xc7023000, uap=3D0xe85e5cf8)
 >    at /usr/src/sys/kern/kern_descrip.c:1114
 > #20 0xc0bef600 in syscall (frame=3D0xe85e5d38) at =
 /usr/src/sys/i386/i386/trap.c:1111
 > #21 0xc0bd1680 in Xint0x80_syscall () at =
 /usr/src/sys/i386/i386/exception.s:261
 > #22 0x00000033 in ?? ()
 > Previous frame inner to this frame (corrupt stack?)
 > (kgdb) fr 12
 > #12 0xc0a3d805 in tcp_usr_disconnect (so=3D0xc715c670) at =
 /usr/src/sys/netinet/tcp_usrreq.c:552
 > 552                     panic("ECONNRESET");
 > (kgdb) list
 > 547             inp =3D sotoinpcb(so);
 > 548             KASSERT(inp !=3D NULL, ("tcp_usr_disconnect: inp =3D=3D =
 NULL"));
 > 549             INP_WLOCK(inp);
 > 550             if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
 > 551                     error =3D ECONNRESET;
 > 552                     panic("ECONNRESET");
 > 553                     /* log(LOG_INFO, "ECONNRESET 3: file %s; line =
 %d\n", __FILE__, __LINE__); */
 > 554                     goto out;
 > 555             }
 > 556             tp =3D intotcpcb(inp);
 > (kgdb) p/x inp->inp_flags
 > $1 =3D 0x4800000
 >=20
 > #define INP_DROPPED             0x04000000 /* protocol drop flag */
 >=20
 > (kgdb) fr 14
 > #14 0xc0914144 in soclose (so=3D0xc715c670) at =
 /usr/src/sys/kern/uipc_socket.c:658
 > 658                             error =3D sodisconnect(so);
 > (kgdb) list
 > 653
 > 654             CURVNET_SET(so->so_vnet);
 > 655             funsetown(&so->so_sigio);
 > 656             if (so->so_state & SS_ISCONNECTED) {
 > 657                     if ((so->so_state & SS_ISDISCONNECTING) =3D=3D =
 0) {
 > 658                             error =3D sodisconnect(so);
 > 659                             if (error) {
 > 660                                     if (error =3D=3D ENOTCONN)
 > 661                                             error =3D 0;
 > 662                                     goto drop;
 > (kgdb) p/x so->so_state =20
 > $2 =3D 0x2000
 >=20
 > #define SS_ISDISCONNECTED       0x2000  /* socket disconnected from =
 peer */
 >=20
 > (the code differs a bit here from original 8-STABLE version as it =
 includes
 > patch from kern/144061 to deal with ENOTCONN errors but this does not
 > influence).
 >=20
 > Actually, I think that the issue here is similar to kern/144061. In =
 the code
 > above so_state is checked for SS_ISCONNECTED and SS_ISDISCONNECTING =
 without
 > locking and then sodisconnect() is called. It looks like the following =
 may
 > happen:
 >=20
 > 1) after shutdown() our output is closed;
 >=20
 > 2) then we call close(), soclose() checks that we are still in =
 SS_ISCONNECTED
 > and calls sodisconnect();
 >=20
 > 3) at this time FIN arrives from the other end, which has called =
 close() too,
 > and the kernel disconnects the socket (INP_DROPPED is set);
 >=20
 > 4) sodisconnect()/tcp_usr_disconnect() checks for INP_DROPPED and =
 returns
 > ECONNRESET.
 >=20
 > I am attaching the patch, which may not be a solution but rather for
 > illustration to described above. Running the test with this patch I am
 > observing the following messages in error logs
 >=20
 > May 27 23:55:41 zhuzha kernel: ECONNRESET: so->state: 0x2000; file =
 /usr/src/sys/kern/uipc_socket.c; line 664
 >=20
 > and test does not fail.
 >=20
 > --=20
 > Mikolaj Golub
 >=20
 > <tcp_close.c><uipc_socket.c.econnreset.patch>
 

From: "Lavrentiev, Anton (NIH/NLM/NCBI) [C]" <lavr@ncbi.nlm.nih.gov>
To: "bug-followup@FreeBSD.org" <bug-followup@FreeBSD.org>
Cc:  
Subject: Re: kern/146845: [libc] close(2) returns error 54 (connection reset
 by peer) wrongly
Date: Fri, 28 May 2010 00:07:16 -0400

 Hi Mikolaj and Robert,
 
 Thanks for following up on this issue!
 
 > It looks like SO_LINGER is not important to reproduce ECONNRESET.
 
 Indeed, it is not.
 
 > I am attaching the patch, which may not be a solution
 
 IMHO, it is not, unfortunately, a solution:  it seems to clear ECONNRESET
 blindly and w/o distinguishing the situation when the remote end closes the
 connection prematurely (i.e. before acknowledging all data written from the
 local end) -- and that qualifies for the true "connection reset by peer"
 from close()...
 
 Anton Lavrentiev
 Contractor NIH/NLM/NCBI
 

From: Mikolaj Golub <to.my.trociny@gmail.com>
To: "Lavrentiev\, Anton \(NIH\/NLM\/NCBI\) \[C\]" <lavr@ncbi.nlm.nih.gov>
Cc: "Robert N. M. Watson" <rwatson@FreeBSD.org>, freebsd-net@FreeBSD.org, bug-followup@FreeBSD.org
Subject: Re: kern/146845: [libc] close(2) returns error 54 (connection reset by peer) wrongly
Date: Fri, 28 May 2010 12:26:33 +0300

 On Fri, 28 May 2010 04:40:03 GMT Lavrentiev, Anton (NIH/NLM/NCBI) [C] wrote:
 
  LA>  IMHO, it is not, unfortunately, a solution:  it seems to clear ECONNRESET
  LA>  blindly and w/o distinguishing the situation when the remote end closes the
  LA>  connection prematurely (i.e. before acknowledging all data written from the
  LA>  local end) -- and that qualifies for the true "connection reset by peer"
  LA>  from close()...
 
 I am not very familiar with the socket/tcp code but it looks for me that it
 might not make any difference.
 
 I can be wrong here but the situation you have described as true "connection
 reset by peer" seems to have the following path in the code:
 
 soclose() -> sodisconnect() -> tcp_usr_disconnect() -> tcp_disconnect()
 
 But tcp_disconnect() does not return error, so we will not have ECONNRESET
 error in any case.
 
 May be you have a good test suite to reproduce this situation? :-) 
 
 -- 
 Mikolaj Golub

From: Mikolaj Golub <to.my.trociny@gmail.com>
To: freebsd-net@FreeBSD.org
Cc: "Lavrentiev\, Anton \(NIH\/NLM\/NCBI\) \[C\]" <lavr@ncbi.nlm.nih.gov>,  "Robert N. M. Watson" <rwatson@FreeBSD.org>, bug-followup@FreeBSD.org
Subject: Re: kern/146845: [libc] close(2) returns error 54 (connection reset by peer) wrongly
Date: Sun, 30 May 2010 11:05:45 +0300

 --=-=-=
 
 On Fri, 28 May 2010 04:40:03 GMT Lavrentiev, Anton (NIH/NLM/NCBI) [C] wrote:
 
  >  IMHO, it is not, unfortunately, a solution:  it seems to clear ECONNRESET
  >  blindly and w/o distinguishing the situation when the remote end closes the
  >  connection prematurely (i.e. before acknowledging all data written from the
  >  local end) -- and that qualifies for the true "connection reset by peer"
  >  from close()...
 
 I did some experiments the results I would like to share here. The idea is
 following: the client sends data in one write() more then a win, while the
 server closes the connection without reading (sending RST on close). I also
 played with LINGER option. I have managed to get ECONNRESET only on write(),
 if the server sends RST before the client calls write(). In all other cases
 write()/close() returned without error. See the attachment for details. 
 
 So I think that with the workaround (ignore ECONNRESET returned by
 sodisconnect() in soclose()) we would not make the situation worse (while it
 fixed the issue with applications getting unexpectedly ECONNRESET after
 shutdown()/close() sequence).
 
 -- 
 Mikolaj Golub
 
 
 --=-=-=
 Content-Type: application/octet-stream
 Content-Disposition: attachment; filename=test_tcp_close.c
 Content-Transfer-Encoding: base64
 
 I2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojaW5jbHVkZSA8
 bmV0aW5ldC9pbi5oPgojaW5jbHVkZSA8c2lnbmFsLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5j
 bHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoj
 aW5jbHVkZSA8ZXJyLmg+CgojZGVmaW5lIEJVRlNJWkUJNDA5NjAwCiNkZWZpbmUgUE9SVAkyMzQ4
 MQojZGVmaW5lIFNMRUVQMQkwCiNkZWZpbmUgU0xFRVAyCTEKI3VuZGVmIExJTkdFUl9JTl9DTElF
 TlQKI3VuZGVmIExJTkdFUl9JTl9TRVJWRVIKCmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJn
 dikKewoJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKCWludCBsaXN0ZW5mZCwgY29ubmZkLCBwaWQ7
 CgljaGFyIGJ1ZltCVUZTSVpFXTsKI2lmZGVmIExJTkdFUl9JTl9DTElFTlQKCXN0cnVjdCBsaW5n
 ZXIgbGluZzsKI2Vsc2UKI2lmZGVmIExJTkdFUl9JTl9TRVJWRVIKCXN0cnVjdCBsaW5nZXIgbGlu
 ZzsKI2VuZGlmCiNlbmRpZiAvKiBMSU5HRVJfSU5fQ0xJRU5UIHx8IExJTkdFUl9JTl9TRVJWRVIg
 Ki8KCQoJaWYgKChsaXN0ZW5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpIDwg
 MCkKCQllcnIoMSwgInNvY2tldCBlcnJvciIpOwoJbWVtc2V0KCZzaW4sIDAsIHNpemVvZihzaW4p
 KTsKCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKCXNpbi5zaW5fcG9ydCA9IGh0b25zKFBPUlQp
 OwoJaWYgKGJpbmQobGlzdGVuZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNpbiwKCQkgc2l6ZW9m
 KHNpbikpIDwgMCkKCQllcnIoMSwgImJpbmQgZXJyb3IiKTsKCWlmIChsaXN0ZW4obGlzdGVuZmQs
 IDEwMjQpIDwgMCkKCQllcnIoMSwgImxpc3RlbiBlcnJvciIpOwoJcGlkID0gZm9yaygpOwoJaWYg
 KHBpZCA9PSAtMSkKCQllcnIoMSwgImZvcmsgZXJyb3IiKTsKCWlmIChwaWQgIT0gMCkgewoJCWNs
 b3NlKGxpc3RlbmZkKTsKCQlzbGVlcCgxKTsKCQlpZiAoKGNvbm5mZCA9IHNvY2tldChBRl9JTkVU
 LCBTT0NLX1NUUkVBTSwgMCkpIDwgMCkgewoJCQkodm9pZClraWxsKHBpZCwgU0lHVEVSTSk7CgkJ
 CWVycigxLCAicGFyZW50OiBzb2NrZXQgZXJyb3IiKTsKCQl9CgkJaWYgKGNvbm5lY3QoY29ubmZk
 LCAoc3RydWN0IHNvY2thZGRyICopJnNpbiwKCQkJICAgIHNpemVvZihzaW4pKSA8IDApIHsKCQkJ
 KHZvaWQpa2lsbChwaWQsIFNJR1RFUk0pOwoJCQllcnIoMSwgInBhcmVudDogY29ubmVjdCBlcnJv
 ciIpOwoJCX0KI2lmZGVmIExJTkdFUl9JTl9DTElFTlQKCQlsaW5nLmxfb25vZmYgPSAxOwoJCWxp
 bmcubF9saW5nZXIgPSAxMDsKCQlpZiAoc2V0c29ja29wdChjb25uZmQsIFNPTF9TT0NLRVQsIFNP
 X0xJTkdFUiwKCQkJICAgICAgICZsaW5nLCBzaXplb2YobGluZykpIDwgMCkKCQkJZXJyKDEsICJw
 YXJlbnQ6IHNldHNvY2tvcHQgZXJyb3IiKTsKI2VuZGlmIC8qIExJTkdFUl9JTl9DTElFTlQgKi8K
 CQlzbGVlcChTTEVFUDEpOwoJCWlmICh3cml0ZShjb25uZmQsIGJ1ZiwgQlVGU0laRSkgPCAwKSB7
 CgkJCSh2b2lkKWtpbGwocGlkLCBTSUdURVJNKTsKCQkJZXJyKDEsICJwYXJlbnQ6IHdyaXRlIGVy
 cm9yIik7CgkJfQoJCWlmIChjbG9zZShjb25uZmQpIDwgMCkgewoJCQkodm9pZClraWxsKHBpZCwg
 U0lHVEVSTSk7CgkJCWVycigxLCAicGFyZW50OiBjbG9zZSBlcnJvciIpOwoJCX0KCX0gZWxzZSB7
 CgkJaWYgKChjb25uZmQgPSBhY2NlcHQobGlzdGVuZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKilOVUxM
 LAoJCQkJICAgICBOVUxMKSkgPCAwKQoJCQllcnIoMSwgImNoaWxkOiBhY2NlcHQgZXJyb3IiKTsK
 I2lmZGVmIExJTkdFUl9JTl9TRVJWRVIJCQoJCS8qCgkJICogU2VuZCBSU1Qgb24gY2xvc2UuCgkJ
 ICovCgkJbGluZy5sX29ub2ZmID0gMTsKCQlsaW5nLmxfbGluZ2VyID0gMDsJCQoJCWlmIChzZXRz
 b2Nrb3B0KGNvbm5mZCwgU09MX1NPQ0tFVCwgU09fTElOR0VSLAoJCQkgICAgICAgJmxpbmcsIHNp
 emVvZihsaW5nKSkgPCAwKQoJCQllcnIoMSwgImNoaWxkOiBzZXRzb2Nrb3B0IGVycm9yIik7CiNl
 bmRpZiAvKiBMSU5HRVJfSU5fU0VSVkVSICovCgkJc2xlZXAoU0xFRVAyKTsKCQlpZiAoY2xvc2Uo
 Y29ubmZkKSA8IDApCgkJCWVycigxLCAiY2hpbGQ6IGNsb3NlIGVycm9yIik7Cgl9CglleGl0KDAp
 Owp9CgojaWYgMAoKU0xFRVAxID0gMDsgU0xFRVAyID0gMDogTElOR0VSX0lOX1NFUlZFUjogcGFy
 ZW50OiB3cml0ZSBlcnJvcjogQ29ubmVjdGlvbiByZXNldCBieSBwZWVyCjAwOjAwOjAwLjAwMDAw
 MCBJUCAxMjcuMC4wLjEuMjM4NTEgPiAxMjcuMC4wLjEuMjM0ODE6IEZsYWdzIFtTXSwgc2VxIDMy
 MzM3NjU5OTMsIHdpbiA2NTUzNSwgb3B0aW9ucyBbbXNzIDE2MzQ0LG5vcCx3c2NhbGUgMyxzYWNr
 T0ssVFMgdmFsIDI4NjA1OCBlY3IgMF0sIGxlbmd0aCAwCjAwOjAwOjAwLjAwMDA0NCBJUCAxMjcu
 MC4wLjEuMjM0ODEgPiAxMjcuMC4wLjEuMjM4NTE6IEZsYWdzIFtTLl0sIHNlcSA5MTcwNDkwODcs
 IGFjayAzMjMzNzY1OTk0LCB3aW4gNjU1MzUsIG9wdGlvbnMgW21zcyAxNjM0NCxub3Asd3NjYWxl
 IDMsc2Fja09LLFRTIHZhbCAzNDkwMDg1MDA0IGVjciAyODYwNThdLCBsZW5ndGggMAowMDowMDow
 MC4wMDAwMzQgSVAgMTI3LjAuMC4xLjIzODUxID4gMTI3LjAuMC4xLjIzNDgxOiBGbGFncyBbLl0s
 IGFjayAxLCB3aW4gODk2MCwgb3B0aW9ucyBbbm9wLG5vcCxUUyB2YWwgMjg2MDU4IGVjciAzNDkw
 MDg1MDA0XSwgbGVuZ3RoIDAKMDA6MDA6MDAuMDAwMTkxIElQIDEyNy4wLjAuMS4yMzQ4MSA+IDEy
 Ny4wLjAuMS4yMzg1MTogRmxhZ3MgW1IuXSwgc2VxIDEsIGFjayAxLCB3aW4gODk2MCwgb3B0aW9u
 cyBbbm9wLG5vcCxUUyB2YWwgMzQ5MDA4NTAwNCBlY3IgMjg2MDU4XSwgbGVuZ3RoIDAKClNMRUVQ
 MSA9IDE7IFNMRUVQMiA9IDA6IExJTkdFUl9JTl9TRVJWRVI6IG5vIGVycm9yCjAwOjAwOjAwLjAw
 MDAwMCBJUCAxMjcuMC4wLjEuMjc1NTggPiAxMjcuMC4wLjEuMjM0ODE6IEZsYWdzIFtTXSwgc2Vx
 IDQwNDIwNjA4MjEsIHdpbiA2NTUzNSwgb3B0aW9ucyBbbXNzIDE2MzQ0LG5vcCx3c2NhbGUgMyxz
 YWNrT0ssVFMgdmFsIDI5MTQ2NSBlY3IgMF0sIGxlbmd0aCAwCjAwOjAwOjAwLjAwMDA0MiBJUCAx
 MjcuMC4wLjEuMjM0ODEgPiAxMjcuMC4wLjEuMjc1NTg6IEZsYWdzIFtTLl0sIHNlcSAyNzg5MzQy
 NTc3LCBhY2sgNDA0MjA2MDgyMiwgd2luIDY1NTM1LCBvcHRpb25zIFttc3MgMTYzNDQsbm9wLHdz
 Y2FsZSAzLHNhY2tPSyxUUyB2YWwgMTk1OTQxNzYxMSBlY3IgMjkxNDY1XSwgbGVuZ3RoIDAKMDA6
 MDA6MDAuMDAwMDM0IElQIDEyNy4wLjAuMS4yNzU1OCA+IDEyNy4wLjAuMS4yMzQ4MTogRmxhZ3Mg
 Wy5dLCBhY2sgMSwgd2luIDg5NjAsIG9wdGlvbnMgW25vcCxub3AsVFMgdmFsIDI5MTQ2NSBlY3Ig
 MTk1OTQxNzYxMV0sIGxlbmd0aCAwCjAwOjAwOjAwLjAwMDE3MyBJUCAxMjcuMC4wLjEuMjM0ODEg
 PiAxMjcuMC4wLjEuMjc1NTg6IEZsYWdzIFtSLl0sIHNlcSAxLCBhY2sgMSwgd2luIDg5NjAsIG9w
 dGlvbnMgW25vcCxub3AsVFMgdmFsIDE5NTk0MTc2MTEgZWNyIDI5MTQ2NV0sIGxlbmd0aCAwCgpT
 TEVFUDEgPSAwOyBTTEVFUDIgPSAxOiBMSU5HRVJfSU5fU0VSVkVSOiBubyBlcnJvcgowMDowMDow
 MC4wMDAwMDAgSVAgMTI3LjAuMC4xLjY0MTg0ID4gMTI3LjAuMC4xLjIzNDgxOiBGbGFncyBbU10s
 IHNlcSA3MzU3NjE0MTEsIHdpbiA2NTUzNSwgb3B0aW9ucyBbbXNzIDE2MzQ0LG5vcCx3c2NhbGUg
 MyxzYWNrT0ssVFMgdmFsIDI5OTc5MiBlY3IgMF0sIGxlbmd0aCAwCjAwOjAwOjAwLjAwMDA0OSBJ
 UCAxMjcuMC4wLjEuMjM0ODEgPiAxMjcuMC4wLjEuNjQxODQ6IEZsYWdzIFtTLl0sIHNlcSAxNzYx
 NzY4MDU1LCBhY2sgNzM1NzYxNDEyLCB3aW4gNjU1MzUsIG9wdGlvbnMgW21zcyAxNjM0NCxub3As
 d3NjYWxlIDMsc2Fja09LLFRTIHZhbCAxMTgyMDg5NjY3IGVjciAyOTk3OTJdLCBsZW5ndGggMAow
 MDowMDowMC4wMDAwMzUgSVAgMTI3LjAuMC4xLjY0MTg0ID4gMTI3LjAuMC4xLjIzNDgxOiBGbGFn
 cyBbLl0sIGFjayAxLCB3aW4gODk2MCwgb3B0aW9ucyBbbm9wLG5vcCxUUyB2YWwgMjk5NzkyIGVj
 ciAxMTgyMDg5NjY3XSwgbGVuZ3RoIDAKMDA6MDA6MDAuMDAwMjIyIElQIDEyNy4wLjAuMS42NDE4
 NCA+IDEyNy4wLjAuMS4yMzQ4MTogRmxhZ3MgWy5dLCBhY2sgMSwgd2luIDg5NjAsIG9wdGlvbnMg
 W25vcCxub3AsVFMgdmFsIDI5OTc5MiBlY3IgMTE4MjA4OTY2N10sIGxlbmd0aCAxNDMzNgowMDow
 MDowMC4wOTkzOTYgSVAgMTI3LjAuMC4xLjIzNDgxID4gMTI3LjAuMC4xLjY0MTg0OiBGbGFncyBb
 Ll0sIGFjayAxNDMzNywgd2luIDcxNjgsIG9wdGlvbnMgW25vcCxub3AsVFMgdmFsIDExODIwODk2
 NzcgZWNyIDI5OTc5Ml0sIGxlbmd0aCAwCjAwOjAwOjAwLjAwMDA0NyBJUCAxMjcuMC4wLjEuNjQx
 ODQgPiAxMjcuMC4wLjEuMjM0ODE6IEZsYWdzIFsuXSwgYWNrIDEsIHdpbiA4OTYwLCBvcHRpb25z
 IFtub3Asbm9wLFRTIHZhbCAyOTk4MDIgZWNyIDExODIwODk2NzddLCBsZW5ndGggMTQzMzYKMDA6
 MDA6MDAuMDAwMDE0IElQIDEyNy4wLjAuMS42NDE4NCA+IDEyNy4wLjAuMS4yMzQ4MTogRmxhZ3Mg
 W1AuXSwgYWNrIDEsIHdpbiA4OTYwLCBvcHRpb25zIFtub3Asbm9wLFRTIHZhbCAyOTk4MDIgZWNy
 IDExODIwODk2NzddLCBsZW5ndGggMTQzMzYKMDA6MDA6MDAuMDAwMDQ3IElQIDEyNy4wLjAuMS4y
 MzQ4MSA+IDEyNy4wLjAuMS42NDE4NDogRmxhZ3MgWy5dLCBhY2sgNDMwMDksIHdpbiAzNTg0LCBv
 cHRpb25zIFtub3Asbm9wLFRTIHZhbCAxMTgyMDg5Njc3IGVjciAyOTk4MDJdLCBsZW5ndGggMAow
 MDowMDowMC4wMDAxMTUgSVAgMTI3LjAuMC4xLjY0MTg0ID4gMTI3LjAuMC4xLjIzNDgxOiBGbGFn
 cyBbUC5dLCBhY2sgMSwgd2luIDg5NjAsIG9wdGlvbnMgW25vcCxub3AsVFMgdmFsIDI5OTgwMiBl
 Y3IgMTE4MjA4OTY3N10sIGxlbmd0aCAxNDMzNgowMDowMDowMC4wMDAxNTUgSVAgMTI3LjAuMC4x
 LjY0MTg0ID4gMTI3LjAuMC4xLjIzNDgxOiBGbGFncyBbLl0sIGFjayAxLCB3aW4gODk2MCwgb3B0
 aW9ucyBbbm9wLG5vcCxUUyB2YWwgMjk5ODAyIGVjciAxMTgyMDg5Njc3XSwgbGVuZ3RoIDE0MzM2
 CjAwOjAwOjAwLjAwMDAxOSBJUCAxMjcuMC4wLjEuMjM0ODEgPiAxMjcuMC4wLjEuNjQxODQ6IEZs
 YWdzIFsuXSwgYWNrIDcxNjgxLCB3aW4gMCwgb3B0aW9ucyBbbm9wLG5vcCxUUyB2YWwgMTE4MjA4
 OTY3NyBlY3IgMjk5ODAyXSwgbGVuZ3RoIDAKMDA6MDA6MDAuOTA5NjQ4IElQIDEyNy4wLjAuMS4y
 MzQ4MSA+IDEyNy4wLjAuMS42NDE4NDogRmxhZ3MgW1IuXSwgc2VxIDEsIGFjayA3MTY4MSwgd2lu
 IDAsIG9wdGlvbnMgW25vcCxub3AsVFMgdmFsIDExODIwODk3NjggZWNyIDI5OTgwMl0sIGxlbmd0
 aCAwCgpTTEVFUDEgPSAwOyBTTEVFUDIgPSAxOiBMSU5HRVJfSU5fU0VSVkVSOiBMSU5HRVJfSU5f
 Q0xJRU5UOiBubyBlcnJvcgowMDowMDowMC4wMDAwMDAgSVAgMTI3LjAuMC4xLjYyNTM1ID4gMTI3
 LjAuMC4xLjIzNDgxOiBGbGFncyBbU10sIHNlcSAyNDE2MzExNjU4LCB3aW4gNjU1MzUsIG9wdGlv
 bnMgW21zcyAxNjM0NCxub3Asd3NjYWxlIDMsc2Fja09LLFRTIHZhbCAzMDU1NjcgZWNyIDBdLCBs
 ZW5ndGggMAowMDowMDowMC4wMDAwNjMgSVAgMTI3LjAuMC4xLjIzNDgxID4gMTI3LjAuMC4xLjYy
 NTM1OiBGbGFncyBbUy5dLCBzZXEgNzIzMjQxMDczLCBhY2sgMjQxNjMxMTY1OSwgd2luIDY1NTM1
 LCBvcHRpb25zIFttc3MgMTYzNDQsbm9wLHdzY2FsZSAzLHNhY2tPSyxUUyB2YWwgOTUzNDY0Mjkg
 ZWNyIDMwNTU2N10sIGxlbmd0aCAwCjAwOjAwOjAwLjAwMDAzMyBJUCAxMjcuMC4wLjEuNjI1MzUg
 PiAxMjcuMC4wLjEuMjM0ODE6IEZsYWdzIFsuXSwgYWNrIDEsIHdpbiA4OTYwLCBvcHRpb25zIFtu
 b3Asbm9wLFRTIHZhbCAzMDU1NjcgZWNyIDk1MzQ2NDI5XSwgbGVuZ3RoIDAKMDA6MDA6MDAuMDAw
 MjY2IElQIDEyNy4wLjAuMS42MjUzNSA+IDEyNy4wLjAuMS4yMzQ4MTogRmxhZ3MgWy5dLCBhY2sg
 MSwgd2luIDg5NjAsIG9wdGlvbnMgW25vcCxub3AsVFMgdmFsIDMwNTU2NyBlY3IgOTUzNDY0Mjld
 LCBsZW5ndGggMTQzMzYKMDA6MDA6MDAuMDAwMDE5IElQIDEyNy4wLjAuMS42MjUzNSA+IDEyNy4w
 LjAuMS4yMzQ4MTogRmxhZ3MgWy5dLCBhY2sgMSwgd2luIDg5NjAsIG9wdGlvbnMgW25vcCxub3As
 VFMgdmFsIDMwNTU2NyBlY3IgOTUzNDY0MjldLCBsZW5ndGggMTQzMzYKMDA6MDA6MDAuMDAwMDE1
 IElQIDEyNy4wLjAuMS42MjUzNSA+IDEyNy4wLjAuMS4yMzQ4MTogRmxhZ3MgW1AuXSwgYWNrIDEs
 IHdpbiA4OTYwLCBvcHRpb25zIFtub3Asbm9wLFRTIHZhbCAzMDU1NjcgZWNyIDk1MzQ2NDI5XSwg
 bGVuZ3RoIDE0MzM2CjAwOjAwOjAwLjAwMDAwNCBJUCAxMjcuMC4wLjEuMjM0ODEgPiAxMjcuMC4w
 LjEuNjI1MzU6IEZsYWdzIFsuXSwgYWNrIDI4NjczLCB3aW4gNTM3Niwgb3B0aW9ucyBbbm9wLG5v
 cCxUUyB2YWwgOTUzNDY0MjkgZWNyIDMwNTU2N10sIGxlbmd0aCAwCjAwOjAwOjAwLjAwMDE3OSBJ
 UCAxMjcuMC4wLjEuNjI1MzUgPiAxMjcuMC4wLjEuMjM0ODE6IEZsYWdzIFsuXSwgYWNrIDEsIHdp
 biA4OTYwLCBvcHRpb25zIFtub3Asbm9wLFRTIHZhbCAzMDU1NjcgZWNyIDk1MzQ2NDI5XSwgbGVu
 Z3RoIDE0MzM2CjAwOjAwOjAwLjAwMDAxNSBJUCAxMjcuMC4wLjEuNjI1MzUgPiAxMjcuMC4wLjEu
 MjM0ODE6IEZsYWdzIFsuXSwgYWNrIDEsIHdpbiA4OTYwLCBvcHRpb25zIFtub3Asbm9wLFRTIHZh
 bCAzMDU1NjcgZWNyIDk1MzQ2NDI5XSwgbGVuZ3RoIDE0MzM2CjAwOjAwOjAwLjAwMDAwOCBJUCAx
 MjcuMC4wLjEuMjM0ODEgPiAxMjcuMC4wLjEuNjI1MzU6IEZsYWdzIFsuXSwgYWNrIDU3MzQ1LCB3
 aW4gMTc5Miwgb3B0aW9ucyBbbm9wLG5vcCxUUyB2YWwgOTUzNDY0MjkgZWNyIDMwNTU2N10sIGxl
 bmd0aCAwCjAwOjAwOjAwLjA5OTMxNyBJUCAxMjcuMC4wLjEuMjM0ODEgPiAxMjcuMC4wLjEuNjI1
 MzU6IEZsYWdzIFsuXSwgYWNrIDcxNjgxLCB3aW4gMCwgb3B0aW9ucyBbbm9wLG5vcCxUUyB2YWwg
 OTUzNDY0MzkgZWNyIDMwNTU2N10sIGxlbmd0aCAwCjAwOjAwOjAwLjkxMDAzOSBJUCAxMjcuMC4w
 LjEuMjM0ODEgPiAxMjcuMC4wLjEuNjI1MzU6IEZsYWdzIFtSLl0sIHNlcSAxLCBhY2sgNzE2ODEs
 IHdpbiAwLCBvcHRpb25zIFtub3Asbm9wLFRTIHZhbCA5NTM0NjUzMCBlY3IgMzA1NTY3XSwgbGVu
 Z3RoIDAKClNMRUVQMSA9IDA7IFNMRUVQMiA9IDE6IExJTkdFUl9JTl9DTElFTlQ6IG5vIGVycm9y
 CjAwOjAwOjAwLjAwMDAwMCBJUCAxMjcuMC4wLjEuNTIyMzIgPiAxMjcuMC4wLjEuMjM0ODE6IEZs
 YWdzIFtTXSwgc2VxIDgzNzc0ODQyOSwgd2luIDY1NTM1LCBvcHRpb25zIFttc3MgMTYzNDQsbm9w
 LHdzY2FsZSAzLHNhY2tPSyxUUyB2YWwgMzA5NjM5IGVjciAwXSwgbGVuZ3RoIDAKMDA6MDA6MDAu
 MDAwMDQ0IElQIDEyNy4wLjAuMS4yMzQ4MSA+IDEyNy4wLjAuMS41MjIzMjogRmxhZ3MgW1MuXSwg
 c2VxIDEyNjE2MTQ3MDcsIGFjayA4Mzc3NDg0MzAsIHdpbiA2NTUzNSwgb3B0aW9ucyBbbXNzIDE2
 MzQ0LG5vcCx3c2NhbGUgMyxzYWNrT0ssVFMgdmFsIDMxMjYxMDY5NTcgZWNyIDMwOTYzOV0sIGxl
 bmd0aCAwCjAwOjAwOjAwLjAwMDAzNCBJUCAxMjcuMC4wLjEuNTIyMzIgPiAxMjcuMC4wLjEuMjM0
 ODE6IEZsYWdzIFsuXSwgYWNrIDEsIHdpbiA4OTYwLCBvcHRpb25zIFtub3Asbm9wLFRTIHZhbCAz
 MDk2MzkgZWNyIDMxMjYxMDY5NTddLCBsZW5ndGggMAowMDowMDowMC4wMDAyNDkgSVAgMTI3LjAu
 MC4xLjUyMjMyID4gMTI3LjAuMC4xLjIzNDgxOiBGbGFncyBbLl0sIGFjayAxLCB3aW4gODk2MCwg
 b3B0aW9ucyBbbm9wLG5vcCxUUyB2YWwgMzA5NjM5IGVjciAzMTI2MTA2OTU3XSwgbGVuZ3RoIDE0
 MzM2CjAwOjAwOjAwLjAwMDAxOCBJUCAxMjcuMC4wLjEuNTIyMzIgPiAxMjcuMC4wLjEuMjM0ODE6
 IEZsYWdzIFsuXSwgYWNrIDEsIHdpbiA4OTYwLCBvcHRpb25zIFtub3Asbm9wLFRTIHZhbCAzMDk2
 MzkgZWNyIDMxMjYxMDY5NTddLCBsZW5ndGggMTQzMzYKMDA6MDA6MDAuMDAwMDE5IElQIDEyNy4w
 LjAuMS4yMzQ4MSA+IDEyNy4wLjAuMS41MjIzMjogRmxhZ3MgWy5dLCBhY2sgMjg2NzMsIHdpbiA1
 Mzc2LCBvcHRpb25zIFtub3Asbm9wLFRTIHZhbCAzMTI2MTA2OTU3IGVjciAzMDk2MzldLCBsZW5n
 dGggMAowMDowMDowMC4wMDAwMjggSVAgMTI3LjAuMC4xLjUyMjMyID4gMTI3LjAuMC4xLjIzNDgx
 OiBGbGFncyBbUC5dLCBhY2sgMSwgd2luIDg5NjAsIG9wdGlvbnMgW25vcCxub3AsVFMgdmFsIDMw
 OTYzOSBlY3IgMzEyNjEwNjk1N10sIGxlbmd0aCAxNDMzNgowMDowMDowMC4wMDAxNDMgSVAgMTI3
 LjAuMC4xLjUyMjMyID4gMTI3LjAuMC4xLjIzNDgxOiBGbGFncyBbLl0sIGFjayAxLCB3aW4gODk2
 MCwgb3B0aW9ucyBbbm9wLG5vcCxUUyB2YWwgMzA5NjM5IGVjciAzMTI2MTA2OTU3XSwgbGVuZ3Ro
 IDE0MzM2CjAwOjAwOjAwLjAwMDAxNSBJUCAxMjcuMC4wLjEuNTIyMzIgPiAxMjcuMC4wLjEuMjM0
 ODE6IEZsYWdzIFsuXSwgYWNrIDEsIHdpbiA4OTYwLCBvcHRpb25zIFtub3Asbm9wLFRTIHZhbCAz
 MDk2MzkgZWNyIDMxMjYxMDY5NTddLCBsZW5ndGggMTQzMzYKMDA6MDA6MDAuMDAwMDA3IElQIDEy
 Ny4wLjAuMS4yMzQ4MSA+IDEyNy4wLjAuMS41MjIzMjogRmxhZ3MgWy5dLCBhY2sgNTczNDUsIHdp
 biAxNzkyLCBvcHRpb25zIFtub3Asbm9wLFRTIHZhbCAzMTI2MTA2OTU3IGVjciAzMDk2MzldLCBs
 ZW5ndGggMAowMDowMDowMC4wOTkzNzEgSVAgMTI3LjAuMC4xLjIzNDgxID4gMTI3LjAuMC4xLjUy
 MjMyOiBGbGFncyBbLl0sIGFjayA3MTY4MSwgd2luIDAsIG9wdGlvbnMgW25vcCxub3AsVFMgdmFs
 IDMxMjYxMDY5NjcgZWNyIDMwOTYzOV0sIGxlbmd0aCAwCjAwOjAwOjAwLjkxMDExNCBJUCAxMjcu
 MC4wLjEuMjM0ODEgPiAxMjcuMC4wLjEuNTIyMzI6IEZsYWdzIFtGLl0sIHNlcSAxLCBhY2sgNzE2
 ODEsIHdpbiA4OTYwLCBvcHRpb25zIFtub3Asbm9wLFRTIHZhbCAzMTI2MTA3MDU4IGVjciAzMDk2
 MzldLCBsZW5ndGggMAowMDowMDowMC4wMDAwNDQgSVAgMTI3LjAuMC4xLjUyMjMyID4gMTI3LjAu
 MC4xLjIzNDgxOiBGbGFncyBbLl0sIGFjayAyLCB3aW4gODk2MCwgb3B0aW9ucyBbbm9wLG5vcCxU
 UyB2YWwgMzA5NzQwIGVjciAzMTI2MTA3MDU4XSwgbGVuZ3RoIDE0MzM2CjAwOjAwOjAwLjAwMDAx
 NCBJUCAxMjcuMC4wLjEuNTIyMzIgPiAxMjcuMC4wLjEuMjM0ODE6IEZsYWdzIFsuXSwgYWNrIDIs
 IHdpbiA4OTYwLCBvcHRpb25zIFtub3Asbm9wLFRTIHZhbCAzMDk3NDAgZWNyIDMxMjYxMDcwNThd
 LCBsZW5ndGggMTQzMzYKMDA6MDA6MDAuMDAwMDM1IElQIDEyNy4wLjAuMS4yMzQ4MSA+IDEyNy4w
 LjAuMS41MjIzMjogRmxhZ3MgW1JdLCBzZXEgMTI2MTYxNDcwOSwgd2luIDAsIGxlbmd0aCAwCjAw
 OjAwOjAwLjAwMDAxOSBJUCAxMjcuMC4wLjEuMjM0ODEgPiAxMjcuMC4wLjEuNTIyMzI6IEZsYWdz
 IFtSXSwgc2VxIDEyNjE2MTQ3MDksIHdpbiAwLCBsZW5ndGggMAoKU0xFRVAxID0gMDsgU0xFRVAy
 ID0gMTogbm8gZXJyb3IKMDA6MDA6MDAuMDAwMDAwIElQIDEyNy4wLjAuMS4yNTg2NSA+IDEyNy4w
 LjAuMS4yMzQ4MTogRmxhZ3MgW1NdLCBzZXEgMzg2MzE4NzEwLCB3aW4gNjU1MzUsIG9wdGlvbnMg
 W21zcyAxNjM0NCxub3Asd3NjYWxlIDMsc2Fja09LLFRTIHZhbCAzMTM4MjggZWNyIDBdLCBsZW5n
 dGggMAowMDowMDowMC4wMDAwNDggSVAgMTI3LjAuMC4xLjIzNDgxID4gMTI3LjAuMC4xLjI1ODY1
 OiBGbGFncyBbUy5dLCBzZXEgMzAxMjQ5NTk5OSwgYWNrIDM4NjMxODcxMSwgd2luIDY1NTM1LCBv
 cHRpb25zIFttc3MgMTYzNDQsbm9wLHdzY2FsZSAzLHNhY2tPSyxUUyB2YWwgNjI5MTQ1NDkwIGVj
 ciAzMTM4MjhdLCBsZW5ndGggMAowMDowMDowMC4wMDAwMzQgSVAgMTI3LjAuMC4xLjI1ODY1ID4g
 MTI3LjAuMC4xLjIzNDgxOiBGbGFncyBbLl0sIGFjayAxLCB3aW4gODk2MCwgb3B0aW9ucyBbbm9w
 LG5vcCxUUyB2YWwgMzEzODI4IGVjciA2MjkxNDU0OTBdLCBsZW5ndGggMAowMDowMDowMC4wMDAy
 MTkgSVAgMTI3LjAuMC4xLjI1ODY1ID4gMTI3LjAuMC4xLjIzNDgxOiBGbGFncyBbLl0sIGFjayAx
 LCB3aW4gODk2MCwgb3B0aW9ucyBbbm9wLG5vcCxUUyB2YWwgMzEzODI4IGVjciA2MjkxNDU0OTBd
 LCBsZW5ndGggMTQzMzYKMDA6MDA6MDAuMDAwMDE3IElQIDEyNy4wLjAuMS4yNTg2NSA+IDEyNy4w
 LjAuMS4yMzQ4MTogRmxhZ3MgWy5dLCBhY2sgMSwgd2luIDg5NjAsIG9wdGlvbnMgW25vcCxub3As
 VFMgdmFsIDMxMzgyOCBlY3IgNjI5MTQ1NDkwXSwgbGVuZ3RoIDE0MzM2CjAwOjAwOjAwLjAwMDAx
 NSBJUCAxMjcuMC4wLjEuMjU4NjUgPiAxMjcuMC4wLjEuMjM0ODE6IEZsYWdzIFtQLl0sIGFjayAx
 LCB3aW4gODk2MCwgb3B0aW9ucyBbbm9wLG5vcCxUUyB2YWwgMzEzODI4IGVjciA2MjkxNDU0OTBd
 LCBsZW5ndGggMTQzMzYKMDA6MDA6MDAuMDAwMDA1IElQIDEyNy4wLjAuMS4yMzQ4MSA+IDEyNy4w
 LjAuMS4yNTg2NTogRmxhZ3MgWy5dLCBhY2sgMjg2NzMsIHdpbiA1Mzc2LCBvcHRpb25zIFtub3As
 bm9wLFRTIHZhbCA2MjkxNDU0OTAgZWNyIDMxMzgyOF0sIGxlbmd0aCAwCjAwOjAwOjAwLjAwMDE3
 NSBJUCAxMjcuMC4wLjEuMjU4NjUgPiAxMjcuMC4wLjEuMjM0ODE6IEZsYWdzIFsuXSwgYWNrIDEs
 IHdpbiA4OTYwLCBvcHRpb25zIFtub3Asbm9wLFRTIHZhbCAzMTM4MjggZWNyIDYyOTE0NTQ5MF0s
 IGxlbmd0aCAxNDMzNgowMDowMDowMC4wMDAwMTYgSVAgMTI3LjAuMC4xLjI1ODY1ID4gMTI3LjAu
 MC4xLjIzNDgxOiBGbGFncyBbLl0sIGFjayAxLCB3aW4gODk2MCwgb3B0aW9ucyBbbm9wLG5vcCxU
 UyB2YWwgMzEzODI4IGVjciA2MjkxNDU0OTBdLCBsZW5ndGggMTQzMzYKMDA6MDA6MDAuMDAwMDA3
 IElQIDEyNy4wLjAuMS4yMzQ4MSA+IDEyNy4wLjAuMS4yNTg2NTogRmxhZ3MgWy5dLCBhY2sgNTcz
 NDUsIHdpbiAxNzkyLCBvcHRpb25zIFtub3Asbm9wLFRTIHZhbCA2MjkxNDU0OTAgZWNyIDMxMzgy
 OF0sIGxlbmd0aCAwCjAwOjAwOjAwLjA5OTM5NCBJUCAxMjcuMC4wLjEuMjM0ODEgPiAxMjcuMC4w
 LjEuMjU4NjU6IEZsYWdzIFsuXSwgYWNrIDcxNjgxLCB3aW4gMCwgb3B0aW9ucyBbbm9wLG5vcCxU
 UyB2YWwgNjI5MTQ1NTAwIGVjciAzMTM4MjhdLCBsZW5ndGggMAowMDowMDowMC45MTAxMzUgSVAg
 MTI3LjAuMC4xLjIzNDgxID4gMTI3LjAuMC4xLjI1ODY1OiBGbGFncyBbRi5dLCBzZXEgMSwgYWNr
 IDcxNjgxLCB3aW4gODk2MCwgb3B0aW9ucyBbbm9wLG5vcCxUUyB2YWwgNjI5MTQ1NTkxIGVjciAz
 MTM4MjhdLCBsZW5ndGggMAowMDowMDowMC4wMDAwNjkgSVAgMTI3LjAuMC4xLjI1ODY1ID4gMTI3
 LjAuMC4xLjIzNDgxOiBGbGFncyBbLl0sIGFjayAyLCB3aW4gODk2MCwgb3B0aW9ucyBbbm9wLG5v
 cCxUUyB2YWwgMzEzOTI5IGVjciA2MjkxNDU1OTFdLCBsZW5ndGggMTQzMzYKMDA6MDA6MDAuMDAw
 MDE0IElQIDEyNy4wLjAuMS4yNTg2NSA+IDEyNy4wLjAuMS4yMzQ4MTogRmxhZ3MgWy5dLCBhY2sg
 Miwgd2luIDg5NjAsIG9wdGlvbnMgW25vcCxub3AsVFMgdmFsIDMxMzkyOSBlY3IgNjI5MTQ1NTkx
 XSwgbGVuZ3RoIDE0MzM2CjAwOjAwOjAwLjAwMDAzNSBJUCAxMjcuMC4wLjEuMjM0ODEgPiAxMjcu
 MC4wLjEuMjU4NjU6IEZsYWdzIFtSXSwgc2VxIDMwMTI0OTYwMDEsIHdpbiAwLCBsZW5ndGggMAow
 MDowMDowMC4wMDAwMTkgSVAgMTI3LjAuMC4xLjIzNDgxID4gMTI3LjAuMC4xLjI1ODY1OiBGbGFn
 cyBbUl0sIHNlcSAzMDEyNDk2MDAxLCB3aW4gMCwgbGVuZ3RoIDAKCQkgICAgCiNlbmRpZiAvKiAw
 ICovCg==
 --=-=-=--
>Unformatted:
