kqueue

Started by Thomas Munroalmost 10 years ago82 messages
#1Thomas Munro
thomas.munro@enterprisedb.com
1 attachment(s)

Hi,

On the WaitEventSet thread I posted a small patch to add kqueue
support[1]/messages/by-id/CAEepm=1dZ_mC+V3YtB79zf27280nign8MKOLxy2FKhvc1RzN=g@mail.gmail.com. Since then I peeked at how some other software[2]https://github.com/libevent/libevent/commit/5602e451ce872d7d60c640590113c5a81c3fc389
interacts with kqueue and discovered that there are platforms
including NetBSD where kevent.udata is an intptr_t instead of a void
*. Here's a version which should compile there. Would any NetBSD
user be interested in testing this? (An alternative would be to make
configure to test for this with some kind of AC_COMPILE_IFELSE
incantation but the steamroller cast is simpler.)

[1]: /messages/by-id/CAEepm=1dZ_mC+V3YtB79zf27280nign8MKOLxy2FKhvc1RzN=g@mail.gmail.com
[2]: https://github.com/libevent/libevent/commit/5602e451ce872d7d60c640590113c5a81c3fc389

--
Thomas Munro
http://www.enterprisedb.com

Attachments:

kqueue-v2.patchapplication/octet-stream; name=kqueue-v2.patchDownload
diff --git a/configure b/configure
index 24655dc..e239641 100755
--- a/configure
+++ b/configure
@@ -10193,7 +10193,7 @@ fi
 ## Header files
 ##
 
-for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
+for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/event.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -12425,7 +12425,7 @@ fi
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-for ac_func in cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l
+for ac_func in cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
diff --git a/configure.in b/configure.in
index c564a76..ef9d450 100644
--- a/configure.in
+++ b/configure.in
@@ -1183,7 +1183,7 @@ AC_SUBST(UUID_LIBS)
 ##
 
 dnl sys/socket.h is required by AC_FUNC_ACCEPT_ARGTYPES
-AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
+AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/event.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
 
 # On BSD, test for net/if.h will fail unless sys/socket.h
 # is included first.
@@ -1432,7 +1432,7 @@ PGAC_FUNC_WCSTOMBS_L
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-AC_CHECK_FUNCS([cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l])
+AC_CHECK_FUNCS([cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l])
 
 AC_REPLACE_FUNCS(fseeko)
 case $host_os in
diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c
index 5641bd5..5ffbf15 100644
--- a/src/backend/storage/ipc/latch.c
+++ b/src/backend/storage/ipc/latch.c
@@ -44,6 +44,9 @@
 #ifdef HAVE_SYS_EPOLL_H
 #include <sys/epoll.h>
 #endif
+#ifdef HAVE_SYS_EVENT_H
+#include <sys/event.h>
+#endif
 #ifdef HAVE_POLL_H
 #include <poll.h>
 #endif
@@ -68,11 +71,14 @@
  * useful to manually specify the used primitive.  If desired, just add a
  * define somewhere before this block.
  */
-#if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_POLL) || \
-	defined(WAIT_USE_SELECT) || defined(WAIT_USE_WIN32)
+#if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_KQUEUE) || \
+	defined(WAIT_USE_POLL) || defined(WAIT_USE_SELECT) || \
+	defined(WAIT_USE_WIN32)
 /* don't overwrite manual choice */
 #elif defined(HAVE_SYS_EPOLL_H)
 #define WAIT_USE_EPOLL
+#elif defined(HAVE_KQUEUE)
+#define WAIT_USE_KQUEUE
 #elif defined(HAVE_POLL)
 #define WAIT_USE_POLL
 #elif HAVE_SYS_SELECT_H
@@ -108,6 +114,10 @@ struct WaitEventSet
 	int			epoll_fd;
 	/* epoll_wait returns events in a user provided arrays, allocate once */
 	struct epoll_event *epoll_ret_events;
+#elif defined(WAIT_USE_KQUEUE)
+	int			kqueue_fd;
+	/* kevent returns events in a user provided arrays, allocate once */
+	struct kevent *kqueue_ret_events;
 #elif defined(WAIT_USE_POLL)
 	/* poll expects events to be waited on every poll() call, prepare once */
 	struct pollfd *pollfds;
@@ -137,6 +147,8 @@ static void drainSelfPipe(void);
 
 #if defined(WAIT_USE_EPOLL)
 static void WaitEventAdjustEpoll(WaitEventSet *set, WaitEvent *event, int action);
+#elif defined(WAIT_USE_KQUEUE)
+static void WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int action);
 #elif defined(WAIT_USE_POLL)
 static void WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event);
 #elif defined(WAIT_USE_WIN32)
@@ -490,6 +502,8 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 
 #if defined(WAIT_USE_EPOLL)
 	sz += sizeof(struct epoll_event) * nevents;
+#elif defined(WAIT_USE_KQUEUE)
+	sz += sizeof(struct kevent) * nevents;
 #elif defined(WAIT_USE_POLL)
 	sz += sizeof(struct pollfd) * nevents;
 #elif defined(WAIT_USE_WIN32)
@@ -508,6 +522,9 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 #if defined(WAIT_USE_EPOLL)
 	set->epoll_ret_events = (struct epoll_event *) data;
 	data += sizeof(struct epoll_event) * nevents;
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_ret_events = (struct kevent *) data;
+	data += sizeof(struct kevent) * nevents;
 #elif defined(WAIT_USE_POLL)
 	set->pollfds = (struct pollfd *) data;
 	data += sizeof(struct pollfd) * nevents;
@@ -523,6 +540,10 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 	set->epoll_fd = epoll_create(nevents);
 	if (set->epoll_fd < 0)
 		elog(ERROR, "epoll_create failed: %m");
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_fd = kqueue();
+	if (set->kqueue_fd < 0)
+		elog(ERROR, "kqueue failed: %m");
 #elif defined(WAIT_USE_WIN32)
 
 	/*
@@ -549,6 +570,8 @@ FreeWaitEventSet(WaitEventSet *set)
 {
 #if defined(WAIT_USE_EPOLL)
 	close(set->epoll_fd);
+#elif defined(WAIT_USE_KQUEUE)
+	close(set->kqueue_fd);
 #elif defined(WAIT_USE_WIN32)
 	WaitEvent  *cur_event;
 
@@ -653,6 +676,8 @@ AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch,
 	/* perform wait primitive specific initialization, if needed */
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_ADD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, EV_ADD);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_SELECT)
@@ -711,6 +736,8 @@ ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_MOD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, EV_ADD);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_SELECT)
@@ -803,6 +830,77 @@ WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event)
 }
 #endif
 
+#if defined(WAIT_USE_KQUEUE)
+
+/*
+ * action can be EV_ADD or EV_DELETE.  EV_ADD is used for both adding and
+ * modifying, and EV_DELETE is not used yet.
+ */
+static void
+WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int action)
+{
+	int rc;
+	struct kevent k_ev[2];
+	int count = 1;
+
+	k_ev[0].ident = event->fd;
+	k_ev[0].filter = 0;
+	k_ev[0].flags = action | EV_CLEAR;
+	k_ev[0].fflags = 0;
+	k_ev[0].data = 0;
+	/*
+	 * On most BSD family systems, udata is a void * so we could simply assign
+	 * event to it without casting, but NetBSD and possibly others use
+	 * intptr_t.
+	 */
+	*(WaitEvent **)(&k_ev[0].udata) = event;
+	Assert(k_ev[0].udata == event);
+
+	Assert(event->fd >= 0);
+	if (event->events == WL_LATCH_SET)
+	{
+		Assert(set->latch != NULL);
+		k_ev[0].filter = EVFILT_READ;
+	}
+	else if (event->events == WL_POSTMASTER_DEATH)
+	{
+		k_ev[0].filter = EVFILT_READ;
+	}
+	else
+	{
+		Assert(event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE));
+
+		/*
+		 * If only one of read and write is request, we need only one kevent
+		 * object.
+		 */
+		if (event->events & WL_SOCKET_READABLE)
+			k_ev[0].filter = EVFILT_READ;
+		else
+			k_ev[0].filter = EVFILT_WRITE;
+
+		/*
+		 * We need to create a second kevent object if we need both.  The read
+		 * and write notifications will arrive separately.
+		 */
+		if ((event->events & WL_SOCKET_READABLE) &&
+			(event->events & WL_SOCKET_WRITEABLE))
+		{
+			++count;
+			k_ev[1] = k_ev[0];
+			k_ev[1].filter = EVFILT_WRITE;
+		}
+	}
+
+	rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+	if (rc < 0)
+		ereport(ERROR,
+				(errcode_for_socket_access(),
+				 errmsg("kevent() failed: %m")));
+}
+
+#endif
+
 #if defined(WAIT_USE_WIN32)
 static void
 WaitEventAdjustWin32(WaitEventSet *set, WaitEvent *event)
@@ -1081,6 +1179,145 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
 	return returned_events;
 }
 
+#elif defined(WAIT_USE_KQUEUE)
+
+/*
+ * Wait using FreeBSD kqueue(2)/kevent(2).  Also available on other BSD-family
+ * systems including MacOSX.
+ *
+ * This is the preferrable wait method for systems that have it, as several
+ * readiness notifications are delivered, without having to iterate through
+ * all of set->events.
+ *
+ * For now this mirrors the epoll code, but in future it could modify the fd
+ * set in the same call to kevent as it uses for waiting instead of doing that
+ * with separate system calls.
+ */
+static int
+WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
+					  WaitEvent *occurred_events, int nevents)
+{
+	int			returned_events = 0;
+	int			rc;
+	WaitEvent  *cur_event;
+	struct kevent *cur_kqueue_event;
+	struct timespec timeout;
+	struct timespec *timeout_p;
+
+	if (cur_timeout < 0)
+		timeout_p = NULL;
+	else
+	{
+		timeout.tv_sec = cur_timeout / 1000;
+		timeout.tv_nsec = (cur_timeout % 1000) * 1000000;
+		timeout_p = &timeout;
+	}
+
+	/* Sleep */
+	rc = kevent(set->kqueue_fd, NULL, 0,
+				set->kqueue_ret_events, nevents,
+				timeout_p);
+
+	/* Check return code */
+	if (rc < 0)
+	{
+		/* EINTR is okay, otherwise complain */
+		if (errno != EINTR)
+		{
+			waiting = false;
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed while trying to wait: %m")));
+		}
+		return 0;
+	}
+	else if (rc == 0)
+	{
+		/* timeout exceeded */
+		return -1;
+	}
+
+	/*
+	 * At least one event occurred, iterate over the returned kqueue events
+	 * until they're either all processed, or we've returned all the events
+	 * the caller desired.
+	 */
+	for (cur_kqueue_event = set->kqueue_ret_events;
+		 cur_kqueue_event < (set->kqueue_ret_events + rc) &&
+		 returned_events < nevents;
+		 cur_kqueue_event++)
+	{
+		/* kevent's data pointer is set to the associated WaitEvent */
+		cur_event = (WaitEvent *) cur_kqueue_event->udata;
+
+		occurred_events->pos = cur_event->pos;
+		occurred_events->user_data = cur_event->user_data;
+		occurred_events->events = 0;
+
+		if (cur_event->events == WL_LATCH_SET &&
+			cur_kqueue_event->flags & (EV_EOF | EVFILT_READ))
+		{
+			/* There's data in the self-pipe, clear it. */
+			drainSelfPipe();
+
+			if (set->latch->is_set)
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_LATCH_SET;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events == WL_POSTMASTER_DEATH &&
+				 cur_kqueue_event->flags & (EV_EOF | EVFILT_READ))
+		{
+			/*
+			 * We expect an EV_EOF when the remote end is closed, but
+			 * because we don't expect the pipe to become readable or to have
+			 * any errors either, treat those cases as postmaster death, too.
+			 *
+			 * As explained in the WAIT_USE_SELECT implementation, select(2)
+			 * may spuriously return. Be paranoid about that here too, a
+			 * spurious WL_POSTMASTER_DEATH would be painful.
+			 */
+			if (!PostmasterIsAlive())
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_POSTMASTER_DEATH;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE))
+		{
+			Assert(cur_event->fd >= 0);
+
+			if ((cur_event->events & WL_SOCKET_READABLE) &&
+				(cur_kqueue_event->flags & (EV_EOF | EVFILT_READ)))
+			{
+				/* readable, or EOF */
+				occurred_events->events |= WL_SOCKET_READABLE;
+			}
+
+			if ((cur_event->events & WL_SOCKET_WRITEABLE) &&
+				(cur_kqueue_event->flags & (EV_EOF | EVFILT_WRITE)))
+			{
+				/* writable, or EOF */
+				occurred_events->events |= WL_SOCKET_WRITEABLE;
+			}
+
+			if (occurred_events->events != 0)
+			{
+				occurred_events->fd = cur_event->fd;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+	}
+
+	return returned_events;
+}
+
 #elif defined(WAIT_USE_POLL)
 
 /*
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index c72635c..e319f1d 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -279,6 +279,9 @@
 /* Define to 1 if you have isinf(). */
 #undef HAVE_ISINF
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 #undef HAVE_LANGINFO_H
 
@@ -533,6 +536,9 @@
 /* Define to 1 if you have the <sys/epoll.h> header file. */
 #undef HAVE_SYS_EPOLL_H
 
+/* Define to 1 if you have the <sys/event.h> header file. */
+#undef HAVE_SYS_EVENT_H
+
 /* Define to 1 if you have the <sys/ioctl.h> header file. */
 #undef HAVE_SYS_IOCTL_H
 
#2Robert Haas
robertmhaas@gmail.com
In reply to: Thomas Munro (#1)
Re: kqueue

On Tue, Mar 29, 2016 at 7:53 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On the WaitEventSet thread I posted a small patch to add kqueue
support[1]. Since then I peeked at how some other software[2]
interacts with kqueue and discovered that there are platforms
including NetBSD where kevent.udata is an intptr_t instead of a void
*. Here's a version which should compile there. Would any NetBSD
user be interested in testing this? (An alternative would be to make
configure to test for this with some kind of AC_COMPILE_IFELSE
incantation but the steamroller cast is simpler.)

Did you code this up blind or do you have a NetBSD machine yourself?

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#2)
Re: kqueue

On 2016-04-21 14:15:53 -0400, Robert Haas wrote:

On Tue, Mar 29, 2016 at 7:53 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On the WaitEventSet thread I posted a small patch to add kqueue
support[1]. Since then I peeked at how some other software[2]
interacts with kqueue and discovered that there are platforms
including NetBSD where kevent.udata is an intptr_t instead of a void
*. Here's a version which should compile there. Would any NetBSD
user be interested in testing this? (An alternative would be to make
configure to test for this with some kind of AC_COMPILE_IFELSE
incantation but the steamroller cast is simpler.)

Did you code this up blind or do you have a NetBSD machine yourself?

RMT, what do you think, should we try to get this into 9.6? It's
feasible that the performance problem 98a64d0bd713c addressed is also
present on free/netbsd.

- Andres

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#4Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#3)
Re: kqueue

On Thu, Apr 21, 2016 at 2:22 PM, Andres Freund <andres@anarazel.de> wrote:

On 2016-04-21 14:15:53 -0400, Robert Haas wrote:

On Tue, Mar 29, 2016 at 7:53 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On the WaitEventSet thread I posted a small patch to add kqueue
support[1]. Since then I peeked at how some other software[2]
interacts with kqueue and discovered that there are platforms
including NetBSD where kevent.udata is an intptr_t instead of a void
*. Here's a version which should compile there. Would any NetBSD
user be interested in testing this? (An alternative would be to make
configure to test for this with some kind of AC_COMPILE_IFELSE
incantation but the steamroller cast is simpler.)

Did you code this up blind or do you have a NetBSD machine yourself?

RMT, what do you think, should we try to get this into 9.6? It's
feasible that the performance problem 98a64d0bd713c addressed is also
present on free/netbsd.

My personal opinion is that it would be a reasonable thing to do if
somebody can demonstrate that it actually solves a real problem.
Absent that, I don't think we should rush it in.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#5Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Robert Haas (#4)
Re: kqueue

Robert Haas wrote:

On Thu, Apr 21, 2016 at 2:22 PM, Andres Freund <andres@anarazel.de> wrote:

On 2016-04-21 14:15:53 -0400, Robert Haas wrote:

On Tue, Mar 29, 2016 at 7:53 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On the WaitEventSet thread I posted a small patch to add kqueue
support[1]. Since then I peeked at how some other software[2]
interacts with kqueue and discovered that there are platforms
including NetBSD where kevent.udata is an intptr_t instead of a void
*. Here's a version which should compile there. Would any NetBSD
user be interested in testing this? (An alternative would be to make
configure to test for this with some kind of AC_COMPILE_IFELSE
incantation but the steamroller cast is simpler.)

Did you code this up blind or do you have a NetBSD machine yourself?

RMT, what do you think, should we try to get this into 9.6? It's
feasible that the performance problem 98a64d0bd713c addressed is also
present on free/netbsd.

My personal opinion is that it would be a reasonable thing to do if
somebody can demonstrate that it actually solves a real problem.
Absent that, I don't think we should rush it in.

My first question is whether there are platforms that use kqueue on
which the WaitEventSet stuff proves to be a bottleneck. I vaguely
recall that MacOS X in particular doesn't scale terribly well for other
reasons, and I don't know if anybody runs *BSD in large machines.

On the other hand, there's plenty of hackers running their laptops on
MacOS X these days, so presumably any platform dependent problem would
be discovered quickly enough. As for NetBSD, it seems mostly a fringe
platform, doesn't it? We would discover serious dependency problems
quickly enough on the buildfarm ... except that the only netbsd
buildfarm member hasn't reported in over two weeks.

Am I mistaken in any of these points?

(Our coverage of the BSD platforms leaves much to be desired FWIW.)

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#6Robert Haas
robertmhaas@gmail.com
In reply to: Alvaro Herrera (#5)
Re: kqueue

On Thu, Apr 21, 2016 at 3:31 PM, Alvaro Herrera
<alvherre@2ndquadrant.com> wrote:

Robert Haas wrote:

On Thu, Apr 21, 2016 at 2:22 PM, Andres Freund <andres@anarazel.de> wrote:

On 2016-04-21 14:15:53 -0400, Robert Haas wrote:

On Tue, Mar 29, 2016 at 7:53 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On the WaitEventSet thread I posted a small patch to add kqueue
support[1]. Since then I peeked at how some other software[2]
interacts with kqueue and discovered that there are platforms
including NetBSD where kevent.udata is an intptr_t instead of a void
*. Here's a version which should compile there. Would any NetBSD
user be interested in testing this? (An alternative would be to make
configure to test for this with some kind of AC_COMPILE_IFELSE
incantation but the steamroller cast is simpler.)

Did you code this up blind or do you have a NetBSD machine yourself?

RMT, what do you think, should we try to get this into 9.6? It's
feasible that the performance problem 98a64d0bd713c addressed is also
present on free/netbsd.

My personal opinion is that it would be a reasonable thing to do if
somebody can demonstrate that it actually solves a real problem.
Absent that, I don't think we should rush it in.

My first question is whether there are platforms that use kqueue on
which the WaitEventSet stuff proves to be a bottleneck. I vaguely
recall that MacOS X in particular doesn't scale terribly well for other
reasons, and I don't know if anybody runs *BSD in large machines.

On the other hand, there's plenty of hackers running their laptops on
MacOS X these days, so presumably any platform dependent problem would
be discovered quickly enough. As for NetBSD, it seems mostly a fringe
platform, doesn't it? We would discover serious dependency problems
quickly enough on the buildfarm ... except that the only netbsd
buildfarm member hasn't reported in over two weeks.

Am I mistaken in any of these points?

(Our coverage of the BSD platforms leaves much to be desired FWIW.)

My impression is that the Linux problem only manifested itself on
large machines. I might be wrong about that. But if that's true,
then we might not see regressions on other platforms just because
people aren't running those operating systems on big enough hardware.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#7Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#4)
Re: kqueue

On 2016-04-21 14:25:06 -0400, Robert Haas wrote:

On Thu, Apr 21, 2016 at 2:22 PM, Andres Freund <andres@anarazel.de> wrote:

On 2016-04-21 14:15:53 -0400, Robert Haas wrote:

On Tue, Mar 29, 2016 at 7:53 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On the WaitEventSet thread I posted a small patch to add kqueue
support[1]. Since then I peeked at how some other software[2]
interacts with kqueue and discovered that there are platforms
including NetBSD where kevent.udata is an intptr_t instead of a void
*. Here's a version which should compile there. Would any NetBSD
user be interested in testing this? (An alternative would be to make
configure to test for this with some kind of AC_COMPILE_IFELSE
incantation but the steamroller cast is simpler.)

Did you code this up blind or do you have a NetBSD machine yourself?

RMT, what do you think, should we try to get this into 9.6? It's
feasible that the performance problem 98a64d0bd713c addressed is also
present on free/netbsd.

My personal opinion is that it would be a reasonable thing to do if
somebody can demonstrate that it actually solves a real problem.
Absent that, I don't think we should rush it in.

On linux you needed a 2 socket machine to demonstrate the problem, but
both old ones (my 2009 workstation) and new ones were sufficient. I'd be
surprised if the situation on freebsd is any better, except that you
might hit another scalability bottleneck earlier.

I doubt there's many real postgres instances operating on bigger
hardware on freebsd, with sufficient throughput to show the problem. So
I think the argument for including is more along trying to be "nice" to
more niche-y OSs.

I really don't have any opinion either way.

- Andres

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#8Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#7)
2 attachment(s)
Re: kqueue

On Fri, Apr 22, 2016 at 12:21 PM, Andres Freund <andres@anarazel.de> wrote:

On 2016-04-21 14:25:06 -0400, Robert Haas wrote:

On Thu, Apr 21, 2016 at 2:22 PM, Andres Freund <andres@anarazel.de> wrote:

On 2016-04-21 14:15:53 -0400, Robert Haas wrote:

On Tue, Mar 29, 2016 at 7:53 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On the WaitEventSet thread I posted a small patch to add kqueue
support[1]. Since then I peeked at how some other software[2]
interacts with kqueue and discovered that there are platforms
including NetBSD where kevent.udata is an intptr_t instead of a void
*. Here's a version which should compile there. Would any NetBSD
user be interested in testing this? (An alternative would be to make
configure to test for this with some kind of AC_COMPILE_IFELSE
incantation but the steamroller cast is simpler.)

Did you code this up blind or do you have a NetBSD machine yourself?

RMT, what do you think, should we try to get this into 9.6? It's
feasible that the performance problem 98a64d0bd713c addressed is also
present on free/netbsd.

My personal opinion is that it would be a reasonable thing to do if
somebody can demonstrate that it actually solves a real problem.
Absent that, I don't think we should rush it in.

On linux you needed a 2 socket machine to demonstrate the problem, but
both old ones (my 2009 workstation) and new ones were sufficient. I'd be
surprised if the situation on freebsd is any better, except that you
might hit another scalability bottleneck earlier.

I doubt there's many real postgres instances operating on bigger
hardware on freebsd, with sufficient throughput to show the problem. So
I think the argument for including is more along trying to be "nice" to
more niche-y OSs.

What has BSD ever done for us?! (Joke...)

I vote to leave this patch in the next commitfest where it is, and
reconsider if someone shows up with a relevant problem report on large
systems. I can't see any measurable performance difference on a 4
core laptop running FreeBSD 10.3. Maybe kqueue will make more
difference even on smaller systems in future releases if we start
using big wait sets for distributed/asynchronous work, in-core
pooling/admission control etc.

Here's a new version of the patch that fixes some stupid bugs. I have
run regression tests and some basic sanity checks on OSX 10.11.4,
FreeBSD 10.3, NetBSD 7.0 and OpenBSD 5.8. There is still room to make
an improvement that would drop the syscall from AddWaitEventToSet and
ModifyWaitEvent, compressing wait set modifications and waiting into a
single syscall (kqueue's claimed advantage over the competition).

While doing that I discovered that unpatched master doesn't actually
build on recent NetBSD systems because our static function strtoi
clashes with a non-standard libc function of the same name[1]http://netbsd.gw.com/cgi-bin/man-cgi?strtoi++NetBSD-current declared
in inttypes.h. Maybe we should rename it, like in the attached?

[1]: http://netbsd.gw.com/cgi-bin/man-cgi?strtoi++NetBSD-current

--
Thomas Munro
http://www.enterprisedb.com

Attachments:

rename-strtoi.patchapplication/octet-stream; name=rename-strtoi.patchDownload
diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c
index 46660cf..5946488 100644
--- a/src/backend/utils/adt/datetime.c
+++ b/src/backend/utils/adt/datetime.c
@@ -256,10 +256,10 @@ static const datetkn *abbrevcache[MAXDATEFIELDS] = {NULL};
 
 
 /*
- * strtoi --- just like strtol, but returns int not long
+ * pg_strtoi --- just like strtol, but returns int not long
  */
 static int
-strtoi(const char *nptr, char **endptr, int base)
+pg_strtoi(const char *nptr, char **endptr, int base)
 {
 	long		val;
 
@@ -898,7 +898,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
 						return DTERR_BAD_FORMAT;
 
 					errno = 0;
-					val = strtoi(field[i], &cp, 10);
+					val = pg_strtoi(field[i], &cp, 10);
 					if (errno == ERANGE || val < 0)
 						return DTERR_FIELD_OVERFLOW;
 
@@ -1062,7 +1062,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
 					int			val;
 
 					errno = 0;
-					val = strtoi(field[i], &cp, 10);
+					val = pg_strtoi(field[i], &cp, 10);
 					if (errno == ERANGE)
 						return DTERR_FIELD_OVERFLOW;
 
@@ -1929,7 +1929,7 @@ DecodeTimeOnly(char **field, int *ftype, int nf,
 					}
 
 					errno = 0;
-					val = strtoi(field[i], &cp, 10);
+					val = pg_strtoi(field[i], &cp, 10);
 					if (errno == ERANGE)
 						return DTERR_FIELD_OVERFLOW;
 
@@ -2600,13 +2600,13 @@ DecodeTime(char *str, int fmask, int range,
 	*tmask = DTK_TIME_M;
 
 	errno = 0;
-	tm->tm_hour = strtoi(str, &cp, 10);
+	tm->tm_hour = pg_strtoi(str, &cp, 10);
 	if (errno == ERANGE)
 		return DTERR_FIELD_OVERFLOW;
 	if (*cp != ':')
 		return DTERR_BAD_FORMAT;
 	errno = 0;
-	tm->tm_min = strtoi(cp + 1, &cp, 10);
+	tm->tm_min = pg_strtoi(cp + 1, &cp, 10);
 	if (errno == ERANGE)
 		return DTERR_FIELD_OVERFLOW;
 	if (*cp == '\0')
@@ -2634,7 +2634,7 @@ DecodeTime(char *str, int fmask, int range,
 	else if (*cp == ':')
 	{
 		errno = 0;
-		tm->tm_sec = strtoi(cp + 1, &cp, 10);
+		tm->tm_sec = pg_strtoi(cp + 1, &cp, 10);
 		if (errno == ERANGE)
 			return DTERR_FIELD_OVERFLOW;
 		if (*cp == '\0')
@@ -2684,7 +2684,7 @@ DecodeNumber(int flen, char *str, bool haveTextMonth, int fmask,
 	*tmask = 0;
 
 	errno = 0;
-	val = strtoi(str, &cp, 10);
+	val = pg_strtoi(str, &cp, 10);
 	if (errno == ERANGE)
 		return DTERR_FIELD_OVERFLOW;
 	if (cp == str)
@@ -2963,7 +2963,7 @@ DecodeTimezone(char *str, int *tzp)
 		return DTERR_BAD_FORMAT;
 
 	errno = 0;
-	hr = strtoi(str + 1, &cp, 10);
+	hr = pg_strtoi(str + 1, &cp, 10);
 	if (errno == ERANGE)
 		return DTERR_TZDISP_OVERFLOW;
 
@@ -2971,13 +2971,13 @@ DecodeTimezone(char *str, int *tzp)
 	if (*cp == ':')
 	{
 		errno = 0;
-		min = strtoi(cp + 1, &cp, 10);
+		min = pg_strtoi(cp + 1, &cp, 10);
 		if (errno == ERANGE)
 			return DTERR_TZDISP_OVERFLOW;
 		if (*cp == ':')
 		{
 			errno = 0;
-			sec = strtoi(cp + 1, &cp, 10);
+			sec = pg_strtoi(cp + 1, &cp, 10);
 			if (errno == ERANGE)
 				return DTERR_TZDISP_OVERFLOW;
 		}
@@ -3250,7 +3250,7 @@ DecodeInterval(char **field, int *ftype, int nf, int range,
 				}
 
 				errno = 0;
-				val = strtoi(field[i], &cp, 10);
+				val = pg_strtoi(field[i], &cp, 10);
 				if (errno == ERANGE)
 					return DTERR_FIELD_OVERFLOW;
 
@@ -3259,7 +3259,7 @@ DecodeInterval(char **field, int *ftype, int nf, int range,
 					/* SQL "years-months" syntax */
 					int			val2;
 
-					val2 = strtoi(cp + 1, &cp, 10);
+					val2 = pg_strtoi(cp + 1, &cp, 10);
 					if (errno == ERANGE || val2 < 0 || val2 >= MONTHS_PER_YEAR)
 						return DTERR_FIELD_OVERFLOW;
 					if (*cp != '\0')
diff --git a/src/interfaces/ecpg/pgtypeslib/interval.c b/src/interfaces/ecpg/pgtypeslib/interval.c
index 01825bd..4a407f9 100644
--- a/src/interfaces/ecpg/pgtypeslib/interval.c
+++ b/src/interfaces/ecpg/pgtypeslib/interval.c
@@ -16,7 +16,7 @@
 
 /* copy&pasted from .../src/backend/utils/adt/datetime.c */
 static int
-strtoi(const char *nptr, char **endptr, int base)
+pg_strtoi(const char *nptr, char **endptr, int base)
 {
 	long		val;
 
@@ -448,7 +448,7 @@ DecodeInterval(char **field, int *ftype, int nf,		/* int range, */
 				}
 
 				errno = 0;
-				val = strtoi(field[i], &cp, 10);
+				val = pg_strtoi(field[i], &cp, 10);
 				if (errno == ERANGE)
 					return DTERR_FIELD_OVERFLOW;
 
@@ -457,7 +457,7 @@ DecodeInterval(char **field, int *ftype, int nf,		/* int range, */
 					/* SQL "years-months" syntax */
 					int			val2;
 
-					val2 = strtoi(cp + 1, &cp, 10);
+					val2 = pg_strtoi(cp + 1, &cp, 10);
 					if (errno == ERANGE || val2 < 0 || val2 >= MONTHS_PER_YEAR)
 						return DTERR_FIELD_OVERFLOW;
 					if (*cp != '\0')
kqueue-v3.patchapplication/octet-stream; name=kqueue-v3.patchDownload
diff --git a/configure b/configure
index e09eb5f..b7e9209 100755
--- a/configure
+++ b/configure
@@ -10230,7 +10230,7 @@ fi
 ## Header files
 ##
 
-for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
+for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/event.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -12473,7 +12473,7 @@ fi
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-for ac_func in cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l
+for ac_func in cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
diff --git a/configure.in b/configure.in
index bc925d0..7d1c0b5 100644
--- a/configure.in
+++ b/configure.in
@@ -1193,7 +1193,7 @@ AC_SUBST(UUID_LIBS)
 ##
 
 dnl sys/socket.h is required by AC_FUNC_ACCEPT_ARGTYPES
-AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
+AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/event.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
 
 # On BSD, test for net/if.h will fail unless sys/socket.h
 # is included first.
@@ -1446,7 +1446,7 @@ PGAC_FUNC_WCSTOMBS_L
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-AC_CHECK_FUNCS([cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l])
+AC_CHECK_FUNCS([cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l])
 
 AC_REPLACE_FUNCS(fseeko)
 case $host_os in
diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c
index 3fbe0e5..4cad5c5 100644
--- a/src/backend/storage/ipc/latch.c
+++ b/src/backend/storage/ipc/latch.c
@@ -44,6 +44,9 @@
 #ifdef HAVE_SYS_EPOLL_H
 #include <sys/epoll.h>
 #endif
+#ifdef HAVE_SYS_EVENT_H
+#include <sys/event.h>
+#endif
 #ifdef HAVE_POLL_H
 #include <poll.h>
 #endif
@@ -68,11 +71,14 @@
  * useful to manually specify the used primitive.  If desired, just add a
  * define somewhere before this block.
  */
-#if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_POLL) || \
-	defined(WAIT_USE_SELECT) || defined(WAIT_USE_WIN32)
+#if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_KQUEUE) || \
+	defined(WAIT_USE_POLL) || defined(WAIT_USE_SELECT) || \
+	defined(WAIT_USE_WIN32)
 /* don't overwrite manual choice */
 #elif defined(HAVE_SYS_EPOLL_H)
 #define WAIT_USE_EPOLL
+#elif defined(HAVE_KQUEUE)
+#define WAIT_USE_KQUEUE
 #elif defined(HAVE_POLL)
 #define WAIT_USE_POLL
 #elif HAVE_SYS_SELECT_H
@@ -108,6 +114,10 @@ struct WaitEventSet
 	int			epoll_fd;
 	/* epoll_wait returns events in a user provided arrays, allocate once */
 	struct epoll_event *epoll_ret_events;
+#elif defined(WAIT_USE_KQUEUE)
+	int			kqueue_fd;
+	/* kevent returns events in a user provided arrays, allocate once */
+	struct kevent *kqueue_ret_events;
 #elif defined(WAIT_USE_POLL)
 	/* poll expects events to be waited on every poll() call, prepare once */
 	struct pollfd *pollfds;
@@ -137,6 +147,8 @@ static void drainSelfPipe(void);
 
 #if defined(WAIT_USE_EPOLL)
 static void WaitEventAdjustEpoll(WaitEventSet *set, WaitEvent *event, int action);
+#elif defined(WAIT_USE_KQUEUE)
+static void WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events);
 #elif defined(WAIT_USE_POLL)
 static void WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event);
 #elif defined(WAIT_USE_WIN32)
@@ -490,6 +502,8 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 
 #if defined(WAIT_USE_EPOLL)
 	sz += sizeof(struct epoll_event) * nevents;
+#elif defined(WAIT_USE_KQUEUE)
+	sz += sizeof(struct kevent) * nevents;
 #elif defined(WAIT_USE_POLL)
 	sz += sizeof(struct pollfd) * nevents;
 #elif defined(WAIT_USE_WIN32)
@@ -508,6 +522,9 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 #if defined(WAIT_USE_EPOLL)
 	set->epoll_ret_events = (struct epoll_event *) data;
 	data += sizeof(struct epoll_event) * nevents;
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_ret_events = (struct kevent *) data;
+	data += sizeof(struct kevent) * nevents;
 #elif defined(WAIT_USE_POLL)
 	set->pollfds = (struct pollfd *) data;
 	data += sizeof(struct pollfd) * nevents;
@@ -523,6 +540,10 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 	set->epoll_fd = epoll_create(nevents);
 	if (set->epoll_fd < 0)
 		elog(ERROR, "epoll_create failed: %m");
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_fd = kqueue();
+	if (set->kqueue_fd < 0)
+		elog(ERROR, "kqueue failed: %m");
 #elif defined(WAIT_USE_WIN32)
 
 	/*
@@ -549,6 +570,8 @@ FreeWaitEventSet(WaitEventSet *set)
 {
 #if defined(WAIT_USE_EPOLL)
 	close(set->epoll_fd);
+#elif defined(WAIT_USE_KQUEUE)
+	close(set->kqueue_fd);
 #elif defined(WAIT_USE_WIN32)
 	WaitEvent  *cur_event;
 
@@ -653,6 +676,8 @@ AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch,
 	/* perform wait primitive specific initialization, if needed */
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_ADD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, 0);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_SELECT)
@@ -674,10 +699,16 @@ void
 ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 {
 	WaitEvent  *event;
+#if defined(WAIT_USE_KQUEUE)
+	int old_events;
+#endif
 
 	Assert(pos < set->nevents);
 
 	event = &set->events[pos];
+#if defined(WAIT_USE_KQUEUE)
+	old_events = event->events;
+#endif
 
 	/*
 	 * If neither the event mask nor the associated latch changes, return
@@ -711,6 +742,8 @@ ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_MOD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, old_events);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_SELECT)
@@ -803,6 +836,94 @@ WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event)
 }
 #endif
 
+#if defined(WAIT_USE_KQUEUE)
+
+static inline void
+WaitEventAdjustKqueueAdd(struct kevent *k_ev, int filter, int action,
+						 WaitEvent *event)
+{
+	k_ev->ident = event->fd;
+	k_ev->filter = filter;
+	k_ev->flags = action | EV_CLEAR;
+	k_ev->fflags = 0;
+	k_ev->data = 0;
+
+	/*
+	 * On most BSD family systems, udata is a void * so we could simply assign
+	 * event to it without casting, or use the EV_SET macro instead of this
+	 * function, but NetBSD and possibly others have it as intptr_t, so we
+	 * wallpaper over this difference with an unsightly lvalue cast.
+	 */
+	*((WaitEvent **)(&k_ev->udata)) = event;
+}
+
+/*
+ * old_events is the previous event mask, used to compute what has changed.
+ */
+static void
+WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events)
+{
+	int rc;
+	struct kevent k_ev[2];
+	int count = 0;
+	bool new_filt_read = false;
+	bool old_filt_read = false;
+	bool new_filt_write = false;
+	bool old_filt_write = false;
+
+	if (old_events == event->events)
+		return;
+
+	Assert(event->fd >= 0);
+	Assert(event->events != WL_LATCH_SET || set->latch != NULL);
+	Assert(event->events == WL_LATCH_SET ||
+		   event->events == WL_POSTMASTER_DEATH ||
+		   (event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)));
+
+	/*
+	 * We need to compute the adds and deletes required to get from the old
+	 * event mask to the new event mask, since kevent treats readable and
+	 * writable as separate events.
+	 */
+	if (old_events == WL_LATCH_SET ||
+		old_events == WL_POSTMASTER_DEATH ||
+		(old_events & WL_SOCKET_READABLE))
+		old_filt_read = true;
+	if (event->events == WL_LATCH_SET ||
+		event->events == WL_POSTMASTER_DEATH ||
+		(event->events & WL_SOCKET_READABLE))
+		new_filt_read = true;
+	if (old_events & WL_SOCKET_WRITEABLE)
+		old_filt_write = true;
+	if (event->events & WL_SOCKET_WRITEABLE)
+		new_filt_write = true;
+	if (old_filt_read && !new_filt_read)
+		WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_DELETE, event);
+	if (!old_filt_read && new_filt_read)
+		WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_ADD, event);
+	if (old_filt_write && !new_filt_write)
+		WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_DELETE, event);
+	if (!old_filt_write && new_filt_write)
+		WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_ADD, event);
+
+	Assert(count > 0);
+	Assert(count <= 2);
+
+	rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+
+	/*
+	 * kevent guarantees that the change list has been processed in the EINTR
+	 * case.  Here we are only applying a change list so EINTR counts as
+	 * success.
+	 */
+	if (rc < 0 && errno != EINTR)
+		ereport(ERROR,
+				(errcode_for_socket_access(),
+				 errmsg("kevent() failed: %m")));
+}
+
+#endif
+
 #if defined(WAIT_USE_WIN32)
 static void
 WaitEventAdjustWin32(WaitEventSet *set, WaitEvent *event)
@@ -1081,6 +1202,145 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
 	return returned_events;
 }
 
+#elif defined(WAIT_USE_KQUEUE)
+
+/*
+ * Wait using FreeBSD kqueue(2)/kevent(2).  Also available on other BSD-family
+ * systems including MacOSX.
+ *
+ * This is the preferrable wait method for systems that have it, as several
+ * readiness notifications are delivered, without having to iterate through
+ * all of set->events.
+ *
+ * For now this mirrors the epoll code, but in future it could modify the fd
+ * set in the same call to kevent as it uses for waiting instead of doing that
+ * with separate system calls.
+ */
+static int
+WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
+					  WaitEvent *occurred_events, int nevents)
+{
+	int			returned_events = 0;
+	int			rc;
+	WaitEvent  *cur_event;
+	struct kevent *cur_kqueue_event;
+	struct timespec timeout;
+	struct timespec *timeout_p;
+
+	if (cur_timeout < 0)
+		timeout_p = NULL;
+	else
+	{
+		timeout.tv_sec = cur_timeout / 1000;
+		timeout.tv_nsec = (cur_timeout % 1000) * 1000000;
+		timeout_p = &timeout;
+	}
+
+	/* Sleep */
+	rc = kevent(set->kqueue_fd, NULL, 0,
+				set->kqueue_ret_events, nevents,
+				timeout_p);
+
+	/* Check return code */
+	if (rc < 0)
+	{
+		/* EINTR is okay, otherwise complain */
+		if (errno != EINTR)
+		{
+			waiting = false;
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed while trying to wait: %m")));
+		}
+		return 0;
+	}
+	else if (rc == 0)
+	{
+		/* timeout exceeded */
+		return -1;
+	}
+
+	/*
+	 * At least one event occurred, iterate over the returned kqueue events
+	 * until they're either all processed, or we've returned all the events
+	 * the caller desired.
+	 */
+	for (cur_kqueue_event = set->kqueue_ret_events;
+		 cur_kqueue_event < (set->kqueue_ret_events + rc) &&
+		 returned_events < nevents;
+		 cur_kqueue_event++)
+	{
+		/* kevent's data pointer is set to the associated WaitEvent */
+		cur_event = (WaitEvent *) cur_kqueue_event->udata;
+
+		occurred_events->pos = cur_event->pos;
+		occurred_events->user_data = cur_event->user_data;
+		occurred_events->events = 0;
+
+		if (cur_event->events == WL_LATCH_SET &&
+			cur_kqueue_event->filter == EVFILT_READ)
+		{
+			/* There's data in the self-pipe, clear it. */
+			drainSelfPipe();
+
+			if (set->latch->is_set)
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_LATCH_SET;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events == WL_POSTMASTER_DEATH &&
+				 cur_kqueue_event->filter == EVFILT_READ)
+		{
+			/*
+			 * We expect an EV_EOF when the remote end is closed, but
+			 * because we don't expect the pipe to become readable or to have
+			 * any errors either, treat those cases as postmaster death, too.
+			 *
+			 * As explained in the WAIT_USE_SELECT implementation, select(2)
+			 * may spuriously return. Be paranoid about that here too, a
+			 * spurious WL_POSTMASTER_DEATH would be painful.
+			 */
+			if (!PostmasterIsAlive())
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_POSTMASTER_DEATH;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE))
+		{
+			Assert(cur_event->fd >= 0);
+
+			if ((cur_event->events & WL_SOCKET_READABLE) &&
+				(cur_kqueue_event->filter == EVFILT_READ))
+			{
+				/* readable, or EOF */
+				occurred_events->events |= WL_SOCKET_READABLE;
+			}
+
+			if ((cur_event->events & WL_SOCKET_WRITEABLE) &&
+				(cur_kqueue_event->filter == EVFILT_WRITE))
+			{
+				/* writable, or EOF */
+				occurred_events->events |= WL_SOCKET_WRITEABLE;
+			}
+
+			if (occurred_events->events != 0)
+			{
+				occurred_events->fd = cur_event->fd;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+	}
+
+	return returned_events;
+}
+
 #elif defined(WAIT_USE_POLL)
 
 /*
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index b621ff2..db33d04 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -279,6 +279,9 @@
 /* Define to 1 if you have isinf(). */
 #undef HAVE_ISINF
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 #undef HAVE_LANGINFO_H
 
@@ -533,6 +536,9 @@
 /* Define to 1 if you have the <sys/epoll.h> header file. */
 #undef HAVE_SYS_EPOLL_H
 
+/* Define to 1 if you have the <sys/event.h> header file. */
+#undef HAVE_SYS_EVENT_H
+
 /* Define to 1 if you have the <sys/ioctl.h> header file. */
 #undef HAVE_SYS_IOCTL_H
 
#9Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#8)
Re: kqueue

On 2016-04-22 20:39:27 +1200, Thomas Munro wrote:

I vote to leave this patch in the next commitfest where it is, and
reconsider if someone shows up with a relevant problem report on large
systems.

Sounds good!

Here's a new version of the patch that fixes some stupid bugs. I have
run regression tests and some basic sanity checks on OSX 10.11.4,
FreeBSD 10.3, NetBSD 7.0 and OpenBSD 5.8. There is still room to make
an improvement that would drop the syscall from AddWaitEventToSet and
ModifyWaitEvent, compressing wait set modifications and waiting into a
single syscall (kqueue's claimed advantage over the competition).

I find that not to be particularly interesting, and would rather want to
avoid adding complexity for it.

While doing that I discovered that unpatched master doesn't actually
build on recent NetBSD systems because our static function strtoi
clashes with a non-standard libc function of the same name[1] declared
in inttypes.h. Maybe we should rename it, like in the attached?

Yuck. That's a new function they introduced? That code hasn't changed in
a while....

Andres

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#10Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#9)
Re: kqueue

On Sat, Apr 23, 2016 at 4:36 AM, Andres Freund <andres@anarazel.de> wrote:

On 2016-04-22 20:39:27 +1200, Thomas Munro wrote:

While doing that I discovered that unpatched master doesn't actually
build on recent NetBSD systems because our static function strtoi
clashes with a non-standard libc function of the same name[1] declared
in inttypes.h. Maybe we should rename it, like in the attached?

Yuck. That's a new function they introduced? That code hasn't changed in
a while....

Yes, according to the man page it appeared in NetBSD 7.0. That was
released in September 2015, and our buildfarm has only NetBSD 5.x
systems. I see that the maintainers of the NetBSD pg package deal
with this with a preprocessor kludge:

http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/databases/postgresql95/patches/patch-src_backend_utils_adt_datetime.c?rev=1.1

What is the policy for that kind of thing -- do nothing until someone
cares enough about the platform to supply a buildfarm animal?

--
Thomas Munro
http://www.enterprisedb.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#11Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Thomas Munro (#10)
Re: kqueue

Thomas Munro wrote:

On Sat, Apr 23, 2016 at 4:36 AM, Andres Freund <andres@anarazel.de> wrote:

On 2016-04-22 20:39:27 +1200, Thomas Munro wrote:

While doing that I discovered that unpatched master doesn't actually
build on recent NetBSD systems because our static function strtoi
clashes with a non-standard libc function of the same name[1] declared
in inttypes.h. Maybe we should rename it, like in the attached?

Yuck. That's a new function they introduced? That code hasn't changed in
a while....

Yes, according to the man page it appeared in NetBSD 7.0. That was
released in September 2015, and our buildfarm has only NetBSD 5.x
systems. I see that the maintainers of the NetBSD pg package deal
with this with a preprocessor kludge:

http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/databases/postgresql95/patches/patch-src_backend_utils_adt_datetime.c?rev=1.1

What is the policy for that kind of thing -- do nothing until someone
cares enough about the platform to supply a buildfarm animal?

Well, if the platform is truly alive, we would have gotten complaints
already. Since we haven't, maybe nobody cares, so why should we? I
would rename our function nonetheless FWIW; the name seems far too
generic to me. pg_strtoi?

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#12Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#10)
Re: kqueue

On 2016-04-23 10:12:12 +1200, Thomas Munro wrote:

What is the policy for that kind of thing -- do nothing until someone
cares enough about the platform to supply a buildfarm animal?

I think we should fix it, I just want to make sure we understand why the
error is appearing now. Since we now do...

- Andres

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#13Andres Freund
andres@anarazel.de
In reply to: Alvaro Herrera (#11)
Re: kqueue

On 2016-04-22 19:25:06 -0300, Alvaro Herrera wrote:

Since we haven't, maybe nobody cares, so why should we?

I guess it's to a good degree because netbsd has pg packages, and it's
fixed there?

would rename our function nonetheless FWIW; the name seems far too
generic to me.

Yea.

pg_strtoi?

I think that's what Thomas did upthread. Are you taking this one then?

Greetings,

Andres Freund

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#14Tom Lane
tgl@sss.pgh.pa.us
In reply to: Thomas Munro (#10)
Re: kqueue

Thomas Munro <thomas.munro@enterprisedb.com> writes:

On Sat, Apr 23, 2016 at 4:36 AM, Andres Freund <andres@anarazel.de> wrote:

On 2016-04-22 20:39:27 +1200, Thomas Munro wrote:

While doing that I discovered that unpatched master doesn't actually
build on recent NetBSD systems because our static function strtoi
clashes with a non-standard libc function of the same name[1] declared
in inttypes.h. Maybe we should rename it, like in the attached?

Yuck. That's a new function they introduced? That code hasn't changed in
a while....

Yes, according to the man page it appeared in NetBSD 7.0. That was
released in September 2015, and our buildfarm has only NetBSD 5.x
systems. I see that the maintainers of the NetBSD pg package deal
with this with a preprocessor kludge:

http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/databases/postgresql95/patches/patch-src_backend_utils_adt_datetime.c?rev=1.1

What is the policy for that kind of thing -- do nothing until someone
cares enough about the platform to supply a buildfarm animal?

There's no set policy, but certainly a promise to put up a buildfarm
animal would establish that somebody actually cares about keeping
Postgres running on the platform. Without one, we might fix a specific
problem when reported, but we'd have no way to know about new problems.

Rooting through that patches directory reveals quite a number of
random-looking patches, most of which we certainly wouldn't take
without a lot more than zero explanation. It's hard to tell which
are actually needed, but at least some don't seem to have anything
to do with building for NetBSD.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#15Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#13)
Re: kqueue

Andres Freund <andres@anarazel.de> writes:

pg_strtoi?

I think that's what Thomas did upthread. Are you taking this one then?

I'd go with just "strtoint". We have "strtoint64" elsewhere.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#16Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tom Lane (#15)
Re: kqueue

Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

pg_strtoi?

I think that's what Thomas did upthread. Are you taking this one then?

I'd go with just "strtoint". We have "strtoint64" elsewhere.

For closure of this subthread: this rename was committed by Tom as
0ab3595e5bb5.

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#17Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Alvaro Herrera (#16)
1 attachment(s)
Re: kqueue

On Fri, Jun 3, 2016 at 4:02 AM, Alvaro Herrera <alvherre@2ndquadrant.com> wrote:

Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

pg_strtoi?

I think that's what Thomas did upthread. Are you taking this one then?

I'd go with just "strtoint". We have "strtoint64" elsewhere.

For closure of this subthread: this rename was committed by Tom as
0ab3595e5bb5.

Thanks. And here is a new version of the kqueue patch. The previous
version doesn't apply on top of recent commit
a3b30763cc8686f5b4cd121ef0bf510c1533ac22, which sprinkled some
MAXALIGN macros nearby. I've now done the same thing with the kevent
struct because it's cheap, uniform with the other cases and could
matter on some platforms for the same reason.

It's in the September commitfest here: https://commitfest.postgresql.org/10/597/

--
Thomas Munro
http://www.enterprisedb.com

Attachments:

kqueue-v4.patchapplication/octet-stream; name=kqueue-v4.patchDownload
diff --git a/configure b/configure
index 3703529..40975d3 100755
--- a/configure
+++ b/configure
@@ -10230,7 +10230,7 @@ fi
 ## Header files
 ##
 
-for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
+for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/event.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -12473,7 +12473,7 @@ fi
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-for ac_func in cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l
+for ac_func in cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
diff --git a/configure.in b/configure.in
index 97b57d7..e59eed5 100644
--- a/configure.in
+++ b/configure.in
@@ -1193,7 +1193,7 @@ AC_SUBST(UUID_LIBS)
 ##
 
 dnl sys/socket.h is required by AC_FUNC_ACCEPT_ARGTYPES
-AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
+AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/event.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
 
 # On BSD, test for net/if.h will fail unless sys/socket.h
 # is included first.
@@ -1446,7 +1446,7 @@ PGAC_FUNC_WCSTOMBS_L
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-AC_CHECK_FUNCS([cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l])
+AC_CHECK_FUNCS([cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l])
 
 AC_REPLACE_FUNCS(fseeko)
 case $host_os in
diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c
index 7d8ad63..31cb2ba 100644
--- a/src/backend/storage/ipc/latch.c
+++ b/src/backend/storage/ipc/latch.c
@@ -44,6 +44,9 @@
 #ifdef HAVE_SYS_EPOLL_H
 #include <sys/epoll.h>
 #endif
+#ifdef HAVE_SYS_EVENT_H
+#include <sys/event.h>
+#endif
 #ifdef HAVE_POLL_H
 #include <poll.h>
 #endif
@@ -68,11 +71,14 @@
  * useful to manually specify the used primitive.  If desired, just add a
  * define somewhere before this block.
  */
-#if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_POLL) || \
-	defined(WAIT_USE_SELECT) || defined(WAIT_USE_WIN32)
+#if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_KQUEUE) || \
+	defined(WAIT_USE_POLL) || defined(WAIT_USE_SELECT) || \
+	defined(WAIT_USE_WIN32)
 /* don't overwrite manual choice */
 #elif defined(HAVE_SYS_EPOLL_H)
 #define WAIT_USE_EPOLL
+#elif defined(HAVE_KQUEUE)
+#define WAIT_USE_KQUEUE
 #elif defined(HAVE_POLL)
 #define WAIT_USE_POLL
 #elif HAVE_SYS_SELECT_H
@@ -108,6 +114,10 @@ struct WaitEventSet
 	int			epoll_fd;
 	/* epoll_wait returns events in a user provided arrays, allocate once */
 	struct epoll_event *epoll_ret_events;
+#elif defined(WAIT_USE_KQUEUE)
+	int			kqueue_fd;
+	/* kevent returns events in a user provided arrays, allocate once */
+	struct kevent *kqueue_ret_events;
 #elif defined(WAIT_USE_POLL)
 	/* poll expects events to be waited on every poll() call, prepare once */
 	struct pollfd *pollfds;
@@ -137,6 +147,8 @@ static void drainSelfPipe(void);
 
 #if defined(WAIT_USE_EPOLL)
 static void WaitEventAdjustEpoll(WaitEventSet *set, WaitEvent *event, int action);
+#elif defined(WAIT_USE_KQUEUE)
+static void WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events);
 #elif defined(WAIT_USE_POLL)
 static void WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event);
 #elif defined(WAIT_USE_WIN32)
@@ -496,6 +508,8 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 
 #if defined(WAIT_USE_EPOLL)
 	sz += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	sz += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	sz += MAXALIGN(sizeof(struct pollfd) * nevents);
 #elif defined(WAIT_USE_WIN32)
@@ -514,6 +528,9 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 #if defined(WAIT_USE_EPOLL)
 	set->epoll_ret_events = (struct epoll_event *) data;
 	data += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_ret_events = (struct kevent *) data;
+	data += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	set->pollfds = (struct pollfd *) data;
 	data += MAXALIGN(sizeof(struct pollfd) * nevents);
@@ -529,6 +546,10 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 	set->epoll_fd = epoll_create(nevents);
 	if (set->epoll_fd < 0)
 		elog(ERROR, "epoll_create failed: %m");
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_fd = kqueue();
+	if (set->kqueue_fd < 0)
+		elog(ERROR, "kqueue failed: %m");
 #elif defined(WAIT_USE_WIN32)
 
 	/*
@@ -555,6 +576,8 @@ FreeWaitEventSet(WaitEventSet *set)
 {
 #if defined(WAIT_USE_EPOLL)
 	close(set->epoll_fd);
+#elif defined(WAIT_USE_KQUEUE)
+	close(set->kqueue_fd);
 #elif defined(WAIT_USE_WIN32)
 	WaitEvent  *cur_event;
 
@@ -659,6 +682,8 @@ AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch,
 	/* perform wait primitive specific initialization, if needed */
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_ADD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, 0);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_SELECT)
@@ -680,10 +705,16 @@ void
 ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 {
 	WaitEvent  *event;
+#if defined(WAIT_USE_KQUEUE)
+	int old_events;
+#endif
 
 	Assert(pos < set->nevents);
 
 	event = &set->events[pos];
+#if defined(WAIT_USE_KQUEUE)
+	old_events = event->events;
+#endif
 
 	/*
 	 * If neither the event mask nor the associated latch changes, return
@@ -717,6 +748,8 @@ ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_MOD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, old_events);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_SELECT)
@@ -809,6 +842,95 @@ WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event)
 }
 #endif
 
+#if defined(WAIT_USE_KQUEUE)
+
+static inline void
+WaitEventAdjustKqueueAdd(struct kevent *k_ev, int filter, int action,
+						 WaitEvent *event)
+{
+	k_ev->ident = event->fd;
+	k_ev->filter = filter;
+	k_ev->flags = action | EV_CLEAR;
+	k_ev->fflags = 0;
+	k_ev->data = 0;
+
+	/*
+	 * On most BSD family systems, udata is of type void * so we could simply
+	 * assign event to it without casting, or use the EV_SET macro instead of
+	 * filling in the struct manually.  Unfortunately, NetBSD and possibly
+	 * others have it as intptr_t, so here we wallpaper over that difference
+	 * with an unsightly lvalue cast.
+	 */
+	*((WaitEvent **)(&k_ev->udata)) = event;
+}
+
+/*
+ * old_events is the previous event mask, used to compute what has changed.
+ */
+static void
+WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events)
+{
+	int rc;
+	struct kevent k_ev[2];
+	int count = 0;
+	bool new_filt_read = false;
+	bool old_filt_read = false;
+	bool new_filt_write = false;
+	bool old_filt_write = false;
+
+	if (old_events == event->events)
+		return;
+
+	Assert(event->fd >= 0);
+	Assert(event->events != WL_LATCH_SET || set->latch != NULL);
+	Assert(event->events == WL_LATCH_SET ||
+		   event->events == WL_POSTMASTER_DEATH ||
+		   (event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)));
+
+	/*
+	 * We need to compute the adds and deletes required to get from the old
+	 * event mask to the new event mask, since kevent treats readable and
+	 * writable as separate events.
+	 */
+	if (old_events == WL_LATCH_SET ||
+		old_events == WL_POSTMASTER_DEATH ||
+		(old_events & WL_SOCKET_READABLE))
+		old_filt_read = true;
+	if (event->events == WL_LATCH_SET ||
+		event->events == WL_POSTMASTER_DEATH ||
+		(event->events & WL_SOCKET_READABLE))
+		new_filt_read = true;
+	if (old_events & WL_SOCKET_WRITEABLE)
+		old_filt_write = true;
+	if (event->events & WL_SOCKET_WRITEABLE)
+		new_filt_write = true;
+	if (old_filt_read && !new_filt_read)
+		WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_DELETE, event);
+	else if (!old_filt_read && new_filt_read)
+		WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_ADD, event);
+	if (old_filt_write && !new_filt_write)
+		WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_DELETE, event);
+	else if (!old_filt_write && new_filt_write)
+		WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_ADD, event);
+
+	Assert(count > 0);
+	Assert(count <= 2);
+
+	rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+
+	/*
+	 * kevent guarantees that the change list has been processed in the EINTR
+	 * case.  Here we are only applying a change list so EINTR counts as
+	 * success.
+	 */
+	if (rc < 0 && errno != EINTR)
+		ereport(ERROR,
+				(errcode_for_socket_access(),
+				 errmsg("kevent() failed: %m")));
+}
+
+#endif
+
 #if defined(WAIT_USE_WIN32)
 static void
 WaitEventAdjustWin32(WaitEventSet *set, WaitEvent *event)
@@ -1087,6 +1209,145 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
 	return returned_events;
 }
 
+#elif defined(WAIT_USE_KQUEUE)
+
+/*
+ * Wait using FreeBSD kqueue(2)/kevent(2).  Also available on other BSD-family
+ * systems including MacOSX.
+ *
+ * This is the preferrable wait method for systems that have it, as several
+ * readiness notifications are delivered, without having to iterate through
+ * all of set->events.
+ *
+ * For now this mirrors the epoll code, but in future it could modify the fd
+ * set in the same call to kevent as it uses for waiting instead of doing that
+ * with separate system calls.
+ */
+static int
+WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
+					  WaitEvent *occurred_events, int nevents)
+{
+	int			returned_events = 0;
+	int			rc;
+	WaitEvent  *cur_event;
+	struct kevent *cur_kqueue_event;
+	struct timespec timeout;
+	struct timespec *timeout_p;
+
+	if (cur_timeout < 0)
+		timeout_p = NULL;
+	else
+	{
+		timeout.tv_sec = cur_timeout / 1000;
+		timeout.tv_nsec = (cur_timeout % 1000) * 1000000;
+		timeout_p = &timeout;
+	}
+
+	/* Sleep */
+	rc = kevent(set->kqueue_fd, NULL, 0,
+				set->kqueue_ret_events, nevents,
+				timeout_p);
+
+	/* Check return code */
+	if (rc < 0)
+	{
+		/* EINTR is okay, otherwise complain */
+		if (errno != EINTR)
+		{
+			waiting = false;
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed while trying to wait: %m")));
+		}
+		return 0;
+	}
+	else if (rc == 0)
+	{
+		/* timeout exceeded */
+		return -1;
+	}
+
+	/*
+	 * At least one event occurred, iterate over the returned kqueue events
+	 * until they're either all processed, or we've returned all the events
+	 * the caller desired.
+	 */
+	for (cur_kqueue_event = set->kqueue_ret_events;
+		 cur_kqueue_event < (set->kqueue_ret_events + rc) &&
+		 returned_events < nevents;
+		 cur_kqueue_event++)
+	{
+		/* kevent's data pointer is set to the associated WaitEvent */
+		cur_event = (WaitEvent *) cur_kqueue_event->udata;
+
+		occurred_events->pos = cur_event->pos;
+		occurred_events->user_data = cur_event->user_data;
+		occurred_events->events = 0;
+
+		if (cur_event->events == WL_LATCH_SET &&
+			cur_kqueue_event->filter == EVFILT_READ)
+		{
+			/* There's data in the self-pipe, clear it. */
+			drainSelfPipe();
+
+			if (set->latch->is_set)
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_LATCH_SET;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events == WL_POSTMASTER_DEATH &&
+				 cur_kqueue_event->filter == EVFILT_READ)
+		{
+			/*
+			 * We expect an EV_EOF when the remote end is closed, but
+			 * because we don't expect the pipe to become readable or to have
+			 * any errors either, treat those cases as postmaster death, too.
+			 *
+			 * As explained in the WAIT_USE_SELECT implementation, select(2)
+			 * may spuriously return. Be paranoid about that here too, a
+			 * spurious WL_POSTMASTER_DEATH would be painful.
+			 */
+			if (!PostmasterIsAlive())
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_POSTMASTER_DEATH;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE))
+		{
+			Assert(cur_event->fd >= 0);
+
+			if ((cur_event->events & WL_SOCKET_READABLE) &&
+				(cur_kqueue_event->filter == EVFILT_READ))
+			{
+				/* readable, or EOF */
+				occurred_events->events |= WL_SOCKET_READABLE;
+			}
+
+			if ((cur_event->events & WL_SOCKET_WRITEABLE) &&
+				(cur_kqueue_event->filter == EVFILT_WRITE))
+			{
+				/* writable, or EOF */
+				occurred_events->events |= WL_SOCKET_WRITEABLE;
+			}
+
+			if (occurred_events->events != 0)
+			{
+				occurred_events->fd = cur_event->fd;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+	}
+
+	return returned_events;
+}
+
 #elif defined(WAIT_USE_POLL)
 
 /*
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index b621ff2..db33d04 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -279,6 +279,9 @@
 /* Define to 1 if you have isinf(). */
 #undef HAVE_ISINF
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 #undef HAVE_LANGINFO_H
 
@@ -533,6 +536,9 @@
 /* Define to 1 if you have the <sys/epoll.h> header file. */
 #undef HAVE_SYS_EPOLL_H
 
+/* Define to 1 if you have the <sys/event.h> header file. */
+#undef HAVE_SYS_EVENT_H
+
 /* Define to 1 if you have the <sys/ioctl.h> header file. */
 #undef HAVE_SYS_IOCTL_H
 
#18Marko Tiikkaja
marko@joh.to
In reply to: Thomas Munro (#17)
Re: kqueue

On 2016-06-03 01:45, Thomas Munro wrote:

On Fri, Jun 3, 2016 at 4:02 AM, Alvaro Herrera <alvherre@2ndquadrant.com> wrote:

Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

pg_strtoi?

I think that's what Thomas did upthread. Are you taking this one then?

I'd go with just "strtoint". We have "strtoint64" elsewhere.

For closure of this subthread: this rename was committed by Tom as
0ab3595e5bb5.

Thanks. And here is a new version of the kqueue patch. The previous
version doesn't apply on top of recent commit
a3b30763cc8686f5b4cd121ef0bf510c1533ac22, which sprinkled some
MAXALIGN macros nearby. I've now done the same thing with the kevent
struct because it's cheap, uniform with the other cases and could
matter on some platforms for the same reason.

I've tested and reviewed this, and it looks good to me, other than this
part:

+   /*
+    * kevent guarantees that the change list has been processed in the 
EINTR
+    * case.  Here we are only applying a change list so EINTR counts as
+    * success.
+    */

this doesn't seem to be guaranteed on old versions of FreeBSD or any
other BSD flavors, so I don't think it's a good idea to bake the
assumption into this code. Or what do you think?

.m

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#19Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Marko Tiikkaja (#18)
1 attachment(s)
Re: kqueue

On Wed, Sep 7, 2016 at 12:32 AM, Marko Tiikkaja <marko@joh.to> wrote:

I've tested and reviewed this, and it looks good to me, other than this
part:

+   /*
+    * kevent guarantees that the change list has been processed in the
EINTR
+    * case.  Here we are only applying a change list so EINTR counts as
+    * success.
+    */

this doesn't seem to be guaranteed on old versions of FreeBSD or any other
BSD flavors, so I don't think it's a good idea to bake the assumption into
this code. Or what do you think?

Thanks for the testing and review!

Hmm. Well spotted. I wrote that because the man page from FreeBSD 10.3 says:

When kevent() call fails with EINTR error, all changes in the changelist
have been applied.

This sentence is indeed missing from the OpenBSD, NetBSD and OSX man
pages. It was introduced by FreeBSD commit r280818[1]https://svnweb.freebsd.org/base?view=revision&amp;revision=280818 which made
kevent a Pthread cancellation point. I investigated whether it is
also true in older FreeBSD and the rest of the BSD family. I believe
the answer is yes.

1. That commit doesn't do anything that would change the situation:
it just adds thread cancellation wrapper code to libc and libthr which
exits under certain conditions but otherwise lets EINTR through to the
caller. So I think the new sentence is documentation of the existing
behaviour of the syscall.

2. I looked at the code in FreeBSD 4.1[2]https://github.com/freebsd/freebsd/blob/release/4.1.0/sys/kern/kern_event.c (the original kqueue
implementation from which all others derive) and the four modern
OSes[3]https://github.com/freebsd/freebsd/blob/master/sys/kern/kern_event.c[4]https://github.com/IIJ-NetBSD/netbsd-src/blob/master/sys/kern/kern_event.c[5]https://github.com/openbsd/src/blob/master/sys/kern/kern_event.c[6]https://github.com/opensource-apple/xnu/blob/master/bsd/kern/kern_event.c. They vary a bit but in all cases, the first place
that can produce EINTR appears to be in kqueue_scan when the
(variously named) kernel sleep routine is invoked, which can return
EINTR or ERESTART (later translated to EINTR because kevent doesn't
support restarting). That comes after all changes have been applied.
In fact it's unreachable if nevents is 0: OSX doesn't call kqueue_scan
in that case, and the others return early from kqueue_scan in that
case.

3. An old email[7]http://marc.info/?l=freebsd-arch&amp;m=98147346707952&amp;w=2 from Jonathan Lemon (creator of kqueue) seems to
support that at least in respect of ancient FreeBSD. He wrote:
"Technically, an EINTR is returned when a signal interrupts the
process after it goes to sleep (that is, after it calls tsleep). So
if (as an example) you call kevent() with a zero valued timespec,
you'll never get EINTR, since there's no possibility of it sleeping."

So if I've understood correctly, what I wrote in the v4 patch is
universally true, but it's also moot in this case: kevent cannot fail
with errno == EINTR because nevents == 0. On that basis, here is a
new version with the comment and special case for EINTR removed.

[1]: https://svnweb.freebsd.org/base?view=revision&amp;revision=280818
[2]: https://github.com/freebsd/freebsd/blob/release/4.1.0/sys/kern/kern_event.c
[3]: https://github.com/freebsd/freebsd/blob/master/sys/kern/kern_event.c
[4]: https://github.com/IIJ-NetBSD/netbsd-src/blob/master/sys/kern/kern_event.c
[5]: https://github.com/openbsd/src/blob/master/sys/kern/kern_event.c
[6]: https://github.com/opensource-apple/xnu/blob/master/bsd/kern/kern_event.c
[7]: http://marc.info/?l=freebsd-arch&amp;m=98147346707952&amp;w=2

--
Thomas Munro
http://www.enterprisedb.com

Attachments:

kqueue-v5.patchapplication/octet-stream; name=kqueue-v5.patchDownload
diff --git a/configure b/configure
index 45c8eef..2bb298d 100755
--- a/configure
+++ b/configure
@@ -10230,7 +10230,7 @@ fi
 ## Header files
 ##
 
-for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
+for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/event.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -12473,7 +12473,7 @@ fi
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-for ac_func in cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l
+for ac_func in cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
diff --git a/configure.in b/configure.in
index c878b4e..81e85c4 100644
--- a/configure.in
+++ b/configure.in
@@ -1193,7 +1193,7 @@ AC_SUBST(UUID_LIBS)
 ##
 
 dnl sys/socket.h is required by AC_FUNC_ACCEPT_ARGTYPES
-AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
+AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/event.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
 
 # On BSD, test for net/if.h will fail unless sys/socket.h
 # is included first.
@@ -1446,7 +1446,7 @@ PGAC_FUNC_WCSTOMBS_L
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-AC_CHECK_FUNCS([cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l])
+AC_CHECK_FUNCS([cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l])
 
 AC_REPLACE_FUNCS(fseeko)
 case $host_os in
diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c
index 9def8a1..4c6e09a 100644
--- a/src/backend/storage/ipc/latch.c
+++ b/src/backend/storage/ipc/latch.c
@@ -44,6 +44,9 @@
 #ifdef HAVE_SYS_EPOLL_H
 #include <sys/epoll.h>
 #endif
+#ifdef HAVE_SYS_EVENT_H
+#include <sys/event.h>
+#endif
 #ifdef HAVE_POLL_H
 #include <poll.h>
 #endif
@@ -68,11 +71,14 @@
  * useful to manually specify the used primitive.  If desired, just add a
  * define somewhere before this block.
  */
-#if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_POLL) || \
-	defined(WAIT_USE_SELECT) || defined(WAIT_USE_WIN32)
+#if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_KQUEUE) || \
+	defined(WAIT_USE_POLL) || defined(WAIT_USE_SELECT) || \
+	defined(WAIT_USE_WIN32)
 /* don't overwrite manual choice */
 #elif defined(HAVE_SYS_EPOLL_H)
 #define WAIT_USE_EPOLL
+#elif defined(HAVE_KQUEUE)
+#define WAIT_USE_KQUEUE
 #elif defined(HAVE_POLL)
 #define WAIT_USE_POLL
 #elif HAVE_SYS_SELECT_H
@@ -108,6 +114,10 @@ struct WaitEventSet
 	int			epoll_fd;
 	/* epoll_wait returns events in a user provided arrays, allocate once */
 	struct epoll_event *epoll_ret_events;
+#elif defined(WAIT_USE_KQUEUE)
+	int			kqueue_fd;
+	/* kevent returns events in a user provided arrays, allocate once */
+	struct kevent *kqueue_ret_events;
 #elif defined(WAIT_USE_POLL)
 	/* poll expects events to be waited on every poll() call, prepare once */
 	struct pollfd *pollfds;
@@ -137,6 +147,8 @@ static void drainSelfPipe(void);
 
 #if defined(WAIT_USE_EPOLL)
 static void WaitEventAdjustEpoll(WaitEventSet *set, WaitEvent *event, int action);
+#elif defined(WAIT_USE_KQUEUE)
+static void WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events);
 #elif defined(WAIT_USE_POLL)
 static void WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event);
 #elif defined(WAIT_USE_WIN32)
@@ -496,6 +508,8 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 
 #if defined(WAIT_USE_EPOLL)
 	sz += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	sz += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	sz += MAXALIGN(sizeof(struct pollfd) * nevents);
 #elif defined(WAIT_USE_WIN32)
@@ -514,6 +528,9 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 #if defined(WAIT_USE_EPOLL)
 	set->epoll_ret_events = (struct epoll_event *) data;
 	data += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_ret_events = (struct kevent *) data;
+	data += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	set->pollfds = (struct pollfd *) data;
 	data += MAXALIGN(sizeof(struct pollfd) * nevents);
@@ -529,6 +546,10 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 	set->epoll_fd = epoll_create(nevents);
 	if (set->epoll_fd < 0)
 		elog(ERROR, "epoll_create failed: %m");
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_fd = kqueue();
+	if (set->kqueue_fd < 0)
+		elog(ERROR, "kqueue failed: %m");
 #elif defined(WAIT_USE_WIN32)
 
 	/*
@@ -555,6 +576,8 @@ FreeWaitEventSet(WaitEventSet *set)
 {
 #if defined(WAIT_USE_EPOLL)
 	close(set->epoll_fd);
+#elif defined(WAIT_USE_KQUEUE)
+	close(set->kqueue_fd);
 #elif defined(WAIT_USE_WIN32)
 	WaitEvent  *cur_event;
 
@@ -659,6 +682,8 @@ AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch,
 	/* perform wait primitive specific initialization, if needed */
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_ADD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, 0);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_SELECT)
@@ -680,10 +705,16 @@ void
 ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 {
 	WaitEvent  *event;
+#if defined(WAIT_USE_KQUEUE)
+	int old_events;
+#endif
 
 	Assert(pos < set->nevents);
 
 	event = &set->events[pos];
+#if defined(WAIT_USE_KQUEUE)
+	old_events = event->events;
+#endif
 
 	/*
 	 * If neither the event mask nor the associated latch changes, return
@@ -717,6 +748,8 @@ ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_MOD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, old_events);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_SELECT)
@@ -809,6 +842,90 @@ WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event)
 }
 #endif
 
+#if defined(WAIT_USE_KQUEUE)
+
+static inline void
+WaitEventAdjustKqueueAdd(struct kevent *k_ev, int filter, int action,
+						 WaitEvent *event)
+{
+	k_ev->ident = event->fd;
+	k_ev->filter = filter;
+	k_ev->flags = action | EV_CLEAR;
+	k_ev->fflags = 0;
+	k_ev->data = 0;
+
+	/*
+	 * On most BSD family systems, udata is of type void * so we could simply
+	 * assign event to it without casting, or use the EV_SET macro instead of
+	 * filling in the struct manually.  Unfortunately, NetBSD and possibly
+	 * others have it as intptr_t, so here we wallpaper over that difference
+	 * with an unsightly lvalue cast.
+	 */
+	*((WaitEvent **)(&k_ev->udata)) = event;
+}
+
+/*
+ * old_events is the previous event mask, used to compute what has changed.
+ */
+static void
+WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events)
+{
+	int rc;
+	struct kevent k_ev[2];
+	int count = 0;
+	bool new_filt_read = false;
+	bool old_filt_read = false;
+	bool new_filt_write = false;
+	bool old_filt_write = false;
+
+	if (old_events == event->events)
+		return;
+
+	Assert(event->fd >= 0);
+	Assert(event->events != WL_LATCH_SET || set->latch != NULL);
+	Assert(event->events == WL_LATCH_SET ||
+		   event->events == WL_POSTMASTER_DEATH ||
+		   (event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)));
+
+	/*
+	 * We need to compute the adds and deletes required to get from the old
+	 * event mask to the new event mask, since kevent treats readable and
+	 * writable as separate events.
+	 */
+	if (old_events == WL_LATCH_SET ||
+		old_events == WL_POSTMASTER_DEATH ||
+		(old_events & WL_SOCKET_READABLE))
+		old_filt_read = true;
+	if (event->events == WL_LATCH_SET ||
+		event->events == WL_POSTMASTER_DEATH ||
+		(event->events & WL_SOCKET_READABLE))
+		new_filt_read = true;
+	if (old_events & WL_SOCKET_WRITEABLE)
+		old_filt_write = true;
+	if (event->events & WL_SOCKET_WRITEABLE)
+		new_filt_write = true;
+	if (old_filt_read && !new_filt_read)
+		WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_DELETE, event);
+	else if (!old_filt_read && new_filt_read)
+		WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_ADD, event);
+	if (old_filt_write && !new_filt_write)
+		WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_DELETE, event);
+	else if (!old_filt_write && new_filt_write)
+		WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_ADD, event);
+
+	Assert(count > 0);
+	Assert(count <= 2);
+
+	rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+
+	if (rc < 0)
+		ereport(ERROR,
+				(errcode_for_socket_access(),
+				 errmsg("kevent() failed: %m")));
+}
+
+#endif
+
 #if defined(WAIT_USE_WIN32)
 static void
 WaitEventAdjustWin32(WaitEventSet *set, WaitEvent *event)
@@ -1087,6 +1204,145 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
 	return returned_events;
 }
 
+#elif defined(WAIT_USE_KQUEUE)
+
+/*
+ * Wait using FreeBSD kqueue(2)/kevent(2).  Also available on other BSD-family
+ * systems including MacOSX.
+ *
+ * This is the preferrable wait method for systems that have it, as several
+ * readiness notifications are delivered, without having to iterate through
+ * all of set->events.
+ *
+ * For now this mirrors the epoll code, but in future it could modify the fd
+ * set in the same call to kevent as it uses for waiting instead of doing that
+ * with separate system calls.
+ */
+static int
+WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
+					  WaitEvent *occurred_events, int nevents)
+{
+	int			returned_events = 0;
+	int			rc;
+	WaitEvent  *cur_event;
+	struct kevent *cur_kqueue_event;
+	struct timespec timeout;
+	struct timespec *timeout_p;
+
+	if (cur_timeout < 0)
+		timeout_p = NULL;
+	else
+	{
+		timeout.tv_sec = cur_timeout / 1000;
+		timeout.tv_nsec = (cur_timeout % 1000) * 1000000;
+		timeout_p = &timeout;
+	}
+
+	/* Sleep */
+	rc = kevent(set->kqueue_fd, NULL, 0,
+				set->kqueue_ret_events, nevents,
+				timeout_p);
+
+	/* Check return code */
+	if (rc < 0)
+	{
+		/* EINTR is okay, otherwise complain */
+		if (errno != EINTR)
+		{
+			waiting = false;
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed while trying to wait: %m")));
+		}
+		return 0;
+	}
+	else if (rc == 0)
+	{
+		/* timeout exceeded */
+		return -1;
+	}
+
+	/*
+	 * At least one event occurred, iterate over the returned kqueue events
+	 * until they're either all processed, or we've returned all the events
+	 * the caller desired.
+	 */
+	for (cur_kqueue_event = set->kqueue_ret_events;
+		 cur_kqueue_event < (set->kqueue_ret_events + rc) &&
+		 returned_events < nevents;
+		 cur_kqueue_event++)
+	{
+		/* kevent's data pointer is set to the associated WaitEvent */
+		cur_event = (WaitEvent *) cur_kqueue_event->udata;
+
+		occurred_events->pos = cur_event->pos;
+		occurred_events->user_data = cur_event->user_data;
+		occurred_events->events = 0;
+
+		if (cur_event->events == WL_LATCH_SET &&
+			cur_kqueue_event->filter == EVFILT_READ)
+		{
+			/* There's data in the self-pipe, clear it. */
+			drainSelfPipe();
+
+			if (set->latch->is_set)
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_LATCH_SET;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events == WL_POSTMASTER_DEATH &&
+				 cur_kqueue_event->filter == EVFILT_READ)
+		{
+			/*
+			 * We expect an EV_EOF when the remote end is closed, but
+			 * because we don't expect the pipe to become readable or to have
+			 * any errors either, treat those cases as postmaster death, too.
+			 *
+			 * As explained in the WAIT_USE_SELECT implementation, select(2)
+			 * may spuriously return. Be paranoid about that here too, a
+			 * spurious WL_POSTMASTER_DEATH would be painful.
+			 */
+			if (!PostmasterIsAlive())
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_POSTMASTER_DEATH;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE))
+		{
+			Assert(cur_event->fd >= 0);
+
+			if ((cur_event->events & WL_SOCKET_READABLE) &&
+				(cur_kqueue_event->filter == EVFILT_READ))
+			{
+				/* readable, or EOF */
+				occurred_events->events |= WL_SOCKET_READABLE;
+			}
+
+			if ((cur_event->events & WL_SOCKET_WRITEABLE) &&
+				(cur_kqueue_event->filter == EVFILT_WRITE))
+			{
+				/* writable, or EOF */
+				occurred_events->events |= WL_SOCKET_WRITEABLE;
+			}
+
+			if (occurred_events->events != 0)
+			{
+				occurred_events->fd = cur_event->fd;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+	}
+
+	return returned_events;
+}
+
 #elif defined(WAIT_USE_POLL)
 
 /*
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index b621ff2..db33d04 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -279,6 +279,9 @@
 /* Define to 1 if you have isinf(). */
 #undef HAVE_ISINF
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 #undef HAVE_LANGINFO_H
 
@@ -533,6 +536,9 @@
 /* Define to 1 if you have the <sys/epoll.h> header file. */
 #undef HAVE_SYS_EPOLL_H
 
+/* Define to 1 if you have the <sys/event.h> header file. */
+#undef HAVE_SYS_EVENT_H
+
 /* Define to 1 if you have the <sys/ioctl.h> header file. */
 #undef HAVE_SYS_IOCTL_H
 
#20Heikki Linnakangas
hlinnaka@iki.fi
In reply to: Thomas Munro (#19)
Re: kqueue

So, if I've understood correctly, the purpose of this patch is to
improve performance on a multi-CPU system, which has the kqueue()
function. Most notably, FreeBSD?

I launched a FreeBSD 10.3 instance on Amazon EC2 (ami-e0682b80), on a
m4.10xlarge instance. That's a 40 core system, biggest available, I
believe. I built PostgreSQL master on it, and ran pgbench to benchmark:

pgbench -i -s 200 postgres
pgbench -M prepared -j 36 -c 36 -S postgres -T20 -P1

I set shared_buffers to 10 GB, so that the whole database fits in cache.
I tested that with and without kqueue-v5.patch

Result: I don't see any difference in performance. pgbench reports
between 80,000 and 97,000 TPS, with or without the patch:

[ec2-user@ip-172-31-17-174 ~/postgresql]$ ~/pgsql-install/bin/pgbench -M
prepared -j 36 -c 36 -S postgres -T20 -P1
starting vacuum...end.
progress: 1.0 s, 94537.1 tps, lat 0.368 ms stddev 0.145
progress: 2.0 s, 96745.9 tps, lat 0.368 ms stddev 0.143
progress: 3.0 s, 93870.1 tps, lat 0.380 ms stddev 0.146
progress: 4.0 s, 89482.9 tps, lat 0.399 ms stddev 0.146
progress: 5.0 s, 87815.0 tps, lat 0.406 ms stddev 0.148
progress: 6.0 s, 86415.5 tps, lat 0.413 ms stddev 0.145
progress: 7.0 s, 86011.0 tps, lat 0.415 ms stddev 0.147
progress: 8.0 s, 84923.0 tps, lat 0.420 ms stddev 0.147
progress: 9.0 s, 84596.6 tps, lat 0.422 ms stddev 0.146
progress: 10.0 s, 84537.7 tps, lat 0.422 ms stddev 0.146
progress: 11.0 s, 83910.5 tps, lat 0.425 ms stddev 0.150
progress: 12.0 s, 83738.2 tps, lat 0.426 ms stddev 0.150
progress: 13.0 s, 83837.5 tps, lat 0.426 ms stddev 0.147
progress: 14.0 s, 83578.4 tps, lat 0.427 ms stddev 0.147
progress: 15.0 s, 83609.5 tps, lat 0.427 ms stddev 0.148
progress: 16.0 s, 83423.5 tps, lat 0.428 ms stddev 0.151
progress: 17.0 s, 83318.2 tps, lat 0.428 ms stddev 0.149
progress: 18.0 s, 82992.7 tps, lat 0.430 ms stddev 0.149
progress: 19.0 s, 83155.9 tps, lat 0.429 ms stddev 0.151
progress: 20.0 s, 83209.0 tps, lat 0.429 ms stddev 0.152
transaction type: <builtin: select only>
scaling factor: 200
query mode: prepared
number of clients: 36
number of threads: 36
duration: 20 s
number of transactions actually processed: 1723759
latency average = 0.413 ms
latency stddev = 0.149 ms
tps = 86124.484867 (including connections establishing)
tps = 86208.458034 (excluding connections establishing)

Is this test setup reasonable? I know very little about FreeBSD, I'm
afraid, so I don't know how to profile or test that further than that.

If there's no measurable difference in performance, between kqueue() and
poll(), I think we should forget about this. If there's a FreeBSD hacker
out there that can demonstrate better results, I'm all for committing
this, but I'm reluctant to add code if no-one can show the benefit.

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#21Tom Lane
tgl@sss.pgh.pa.us
In reply to: Heikki Linnakangas (#20)
Re: kqueue

Heikki Linnakangas <hlinnaka@iki.fi> writes:

So, if I've understood correctly, the purpose of this patch is to
improve performance on a multi-CPU system, which has the kqueue()
function. Most notably, FreeBSD?

OS X also has this, so it might be worth trying on a multi-CPU Mac.

If there's no measurable difference in performance, between kqueue() and
poll(), I think we should forget about this.

I agree that we shouldn't add this unless it's demonstrably a win.
No opinion on whether your test is adequate.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#22Heikki Linnakangas
hlinnaka@iki.fi
In reply to: Tom Lane (#21)
Re: kqueue

On 09/13/2016 04:33 PM, Tom Lane wrote:

Heikki Linnakangas <hlinnaka@iki.fi> writes:

So, if I've understood correctly, the purpose of this patch is to
improve performance on a multi-CPU system, which has the kqueue()
function. Most notably, FreeBSD?

OS X also has this, so it might be worth trying on a multi-CPU Mac.

If there's no measurable difference in performance, between kqueue() and
poll(), I think we should forget about this.

I agree that we shouldn't add this unless it's demonstrably a win.
No opinion on whether your test is adequate.

I'm marking this as "Returned with Feedback", waiting for someone to
post test results that show a positive performance benefit from this.

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#23Andres Freund
andres@anarazel.de
In reply to: Heikki Linnakangas (#20)
Re: kqueue

Hi,

On 2016-09-13 16:08:39 +0300, Heikki Linnakangas wrote:

So, if I've understood correctly, the purpose of this patch is to improve
performance on a multi-CPU system, which has the kqueue() function. Most
notably, FreeBSD?

I think it's not necessarily about the current system, but more about
future uses of the WaitEventSet stuff. Some of that is going to use a
lot more sockets. E.g. doing a parallel append over FDWs.

I launched a FreeBSD 10.3 instance on Amazon EC2 (ami-e0682b80), on a
m4.10xlarge instance. That's a 40 core system, biggest available, I believe.
I built PostgreSQL master on it, and ran pgbench to benchmark:

pgbench -i -s 200 postgres
pgbench -M prepared -j 36 -c 36 -S postgres -T20 -P1

This seems likely to actually seldomly exercise the relevant code
path. We only do the poll()/epoll_wait()/... when a read() doesn't
return anything, but that seems likely to seldomly occur here. Using a
lower thread count and a lot higher client count might change that.

Note that the case where poll vs. epoll made a large difference (after
the regression due to ac1d7945f86) on linux was only on fairly large
machines, with high clients counts.

Greetings,

Andres Freund

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#24Simon Riggs
simon@2ndquadrant.com
In reply to: Heikki Linnakangas (#20)
Re: kqueue

On 13 September 2016 at 08:08, Heikki Linnakangas <hlinnaka@iki.fi> wrote:

So, if I've understood correctly, the purpose of this patch is to improve
performance on a multi-CPU system, which has the kqueue() function. Most
notably, FreeBSD?

I'm getting a little fried from "self-documenting" patches, from
multiple sources.

I think we should make it a firm requirement to explain what a patch
is actually about, with extra points for including with it a test that
allows us to validate that. We don't have enough committer time to
waste on such things.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#25Robert Haas
robertmhaas@gmail.com
In reply to: Simon Riggs (#24)
Re: kqueue

On Tue, Sep 13, 2016 at 11:36 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

On 13 September 2016 at 08:08, Heikki Linnakangas <hlinnaka@iki.fi> wrote:

So, if I've understood correctly, the purpose of this patch is to improve
performance on a multi-CPU system, which has the kqueue() function. Most
notably, FreeBSD?

I'm getting a little fried from "self-documenting" patches, from
multiple sources.

I think we should make it a firm requirement to explain what a patch
is actually about, with extra points for including with it a test that
allows us to validate that. We don't have enough committer time to
waste on such things.

You've complained about this a whole bunch of times recently, but in
most of those cases I didn't think there was any real unclarity. I
agree that it's a good idea for a patch to be submitted with suitable
submission notes, but it also isn't reasonable to expect those
submission notes to be reposted with every single version of every
patch. Indeed, I'd find that pretty annoying. Thomas linked back to
the previous thread where this was discussed, which seems more or less
sufficient. If committers are too busy to click on links in the patch
submission emails, they have no business committing anything.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#26Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#23)
Re: kqueue

Andres Freund <andres@anarazel.de> writes:

On 2016-09-13 16:08:39 +0300, Heikki Linnakangas wrote:

So, if I've understood correctly, the purpose of this patch is to improve
performance on a multi-CPU system, which has the kqueue() function. Most
notably, FreeBSD?

I think it's not necessarily about the current system, but more about
future uses of the WaitEventSet stuff. Some of that is going to use a
lot more sockets. E.g. doing a parallel append over FDWs.

All fine, but the burden of proof has to be on the patch to show that
it does something significant. We don't want to be carrying around
platform-specific code, which necessarily has higher maintenance cost
than other code, without a darn good reason.

Also, if it's only a win on machines with dozens of CPUs, how many
people are running *BSD on that kind of iron? I think Linux is by
far the dominant kernel for such hardware. For sure Apple isn't
selling any machines like that.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#27Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#26)
Re: kqueue

On 2016-09-13 12:43:36 -0400, Tom Lane wrote:

I think it's not necessarily about the current system, but more about
future uses of the WaitEventSet stuff. Some of that is going to use a
lot more sockets. E.g. doing a parallel append over FDWs.

(note that I'm talking about network sockets not cpu sockets here)

All fine, but the burden of proof has to be on the patch to show that
it does something significant. We don't want to be carrying around
platform-specific code, which necessarily has higher maintenance cost
than other code, without a darn good reason.

No argument there.

Also, if it's only a win on machines with dozens of CPUs, how many
people are running *BSD on that kind of iron? I think Linux is by
far the dominant kernel for such hardware. For sure Apple isn't
selling any machines like that.

I'm not sure you need quite that big a machine, if you test a workload
that currently reaches the poll().

Regards,

Andres

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#28Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#27)
Re: kqueue

Andres Freund <andres@anarazel.de> writes:

On 2016-09-13 12:43:36 -0400, Tom Lane wrote:

Also, if it's only a win on machines with dozens of CPUs, how many
people are running *BSD on that kind of iron? I think Linux is by
far the dominant kernel for such hardware. For sure Apple isn't
selling any machines like that.

I'm not sure you need quite that big a machine, if you test a workload
that currently reaches the poll().

Well, Thomas stated in
/messages/by-id/CAEepm=1CwuAq35FtVBTZO-mnGFH1xEFtDpKQOf_b6WoEmdZZHA@mail.gmail.com
that he hadn't been able to measure any performance difference, and
I assume he was trying test cases from the WaitEventSet thread.

Also I notice that the WaitEventSet thread started with a simple
pgbench test, so I don't really buy the claim that that's not a
way that will reach the problem.

I'd be happy to see this go in if it can be shown to provide a measurable
performance improvement, but so far we have only guesses that someday
it *might* make a difference. That's not good enough to add to our
maintenance burden IMO.

Anyway, the patch is in the archives now, so it won't be hard to resurrect
if the situation changes.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#29Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#28)
Re: kqueue

On 2016-09-13 14:47:08 -0400, Tom Lane wrote:

Also I notice that the WaitEventSet thread started with a simple
pgbench test, so I don't really buy the claim that that's not a
way that will reach the problem.

You can reach it, but not when using 1 core:one pgbench thread:one
client connection, there need to be more connections than that. At least
that was my observation on x86 / linux.

Andres

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#30Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#29)
Re: kqueue

Andres Freund <andres@anarazel.de> writes:

On 2016-09-13 14:47:08 -0400, Tom Lane wrote:

Also I notice that the WaitEventSet thread started with a simple
pgbench test, so I don't really buy the claim that that's not a
way that will reach the problem.

You can reach it, but not when using 1 core:one pgbench thread:one
client connection, there need to be more connections than that. At least
that was my observation on x86 / linux.

Well, that original test was

I tried to run pgbench -s 1000 -j 48 -c 48 -S -M prepared on 70 CPU-core
machine:

so no, not 1 client ;-)

Anyway, I decided to put my money where my mouth was and run my own
benchmark. On my couple-year-old Macbook Pro running OS X 10.11.6,
using a straight build of today's HEAD, asserts disabled, fsync off
but no other parameters changed, I did "pgbench -i -s 100" and then
did this a few times:
pgbench -T 60 -j 4 -c 4 -M prepared -S bench
(It's a 4-core CPU so I saw little point in pressing harder than
that.) Median of 3 runs was 56028 TPS. Repeating the runs with
kqueue-v5.patch applied, I got a median of 58975 TPS, or 5% better.
Run-to-run variation was only around 1% in each case.

So that's not a huge improvement, but it's clearly above the noise
floor, and this laptop is not what anyone would use for production
work eh? Presumably you could show even better results on something
closer to server-grade hardware with more active clients.

So at this point I'm wondering why Thomas and Heikki could not measure
any win. Based on my results it should be easy. Is it possible that
OS X is better tuned for multi-CPU hardware than FreeBSD?

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#31Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#30)
Re: kqueue

On 2016-09-13 15:37:22 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

On 2016-09-13 14:47:08 -0400, Tom Lane wrote:

Also I notice that the WaitEventSet thread started with a simple
pgbench test, so I don't really buy the claim that that's not a
way that will reach the problem.

You can reach it, but not when using 1 core:one pgbench thread:one
client connection, there need to be more connections than that. At least
that was my observation on x86 / linux.

Well, that original test was

I tried to run pgbench -s 1000 -j 48 -c 48 -S -M prepared on 70 CPU-core
machine:

so no, not 1 client ;-)

What I meant wasn't one client, but less than one client per cpu, and
using a pgbench thread per backend. That way usually, at least on linux,
there'll be a relatively small amount of poll/epoll/whatever, because
the recvmsg()s will always have data available.

Anyway, I decided to put my money where my mouth was and run my own
benchmark.

Cool.

(It's a 4-core CPU so I saw little point in pressing harder than
that.)

I think in reality most busy machines, were performance and scalability
matter, are overcommitted in the number of connections vs. cores. And
if you look at throughput graphs that makes sense; they tend to increase
considerably after reaching #hardware-threads, even if all connections
are full throttle busy. It might not make sense if you just run large
analytics queries, or if you want the lowest latency possible, but in
everything else, the reality is that machines are often overcommitted
for good reason.

So at this point I'm wondering why Thomas and Heikki could not measure
any win. Based on my results it should be easy. Is it possible that
OS X is better tuned for multi-CPU hardware than FreeBSD?

Hah!

Greetings,

Andres Freund

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#32Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#31)
Re: kqueue

Andres Freund <andres@anarazel.de> writes:

On 2016-09-13 15:37:22 -0400, Tom Lane wrote:

(It's a 4-core CPU so I saw little point in pressing harder than
that.)

I think in reality most busy machines, were performance and scalability
matter, are overcommitted in the number of connections vs. cores. And
if you look at throughput graphs that makes sense; they tend to increase
considerably after reaching #hardware-threads, even if all connections
are full throttle busy.

At -j 10 -c 10, all else the same, I get 84928 TPS on HEAD and 90357
with the patch, so about 6% better.

So at this point I'm wondering why Thomas and Heikki could not measure
any win. Based on my results it should be easy. Is it possible that
OS X is better tuned for multi-CPU hardware than FreeBSD?

Hah!

Well, there must be some reason why this patch improves matters on OS X
and not FreeBSD ...

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#33Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#32)
Re: kqueue

I wrote:

At -j 10 -c 10, all else the same, I get 84928 TPS on HEAD and 90357
with the patch, so about 6% better.

And at -j 1 -c 1, I get 22390 and 24040 TPS, or about 7% better with
the patch. So what I am seeing on OS X isn't contention of any sort,
but just a straight speedup that's independent of the number of clients
(at least up to 10). Probably this represents less setup/teardown cost
for kqueue() waits than poll() waits.

So you could spin this as "FreeBSD's poll() implementation is better than
OS X's", or as "FreeBSD's kqueue() implementation is worse than OS X's",
but either way I do not think we're seeing the same issue that was
originally reported against Linux, where there was no visible problem at
all till you got to a couple dozen clients, cf

/messages/by-id/CAB-SwXbPmfpgL6N4Ro4BbGyqXEqqzx56intHHBCfvpbFUx1DNA@mail.gmail.com

I'm inclined to think the kqueue patch is worth applying just on the
grounds that it makes things better on OS X and doesn't seem to hurt
on FreeBSD. Whether anyone would ever get to the point of seeing
intra-kernel contention on these platforms is hard to predict, but
we'd be ahead of the curve if so.

It would be good for someone else to reproduce my results though.
For one thing, 5%-ish is not that far above the noise level; maybe
what I'm measuring here is just good luck from relocation of critical
loops into more cache-line-friendly locations.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#34Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Tom Lane (#33)
Re: kqueue

On Wed, Sep 14, 2016 at 12:06 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

I wrote:

At -j 10 -c 10, all else the same, I get 84928 TPS on HEAD and 90357
with the patch, so about 6% better.

And at -j 1 -c 1, I get 22390 and 24040 TPS, or about 7% better with
the patch. So what I am seeing on OS X isn't contention of any sort,
but just a straight speedup that's independent of the number of clients
(at least up to 10). Probably this represents less setup/teardown cost
for kqueue() waits than poll() waits.

Thanks for running all these tests. I hadn't considered OS X performance.

So you could spin this as "FreeBSD's poll() implementation is better than
OS X's", or as "FreeBSD's kqueue() implementation is worse than OS X's",
but either way I do not think we're seeing the same issue that was
originally reported against Linux, where there was no visible problem at
all till you got to a couple dozen clients, cf

/messages/by-id/CAB-SwXbPmfpgL6N4Ro4BbGyqXEqqzx56intHHBCfvpbFUx1DNA@mail.gmail.com

I'm inclined to think the kqueue patch is worth applying just on the
grounds that it makes things better on OS X and doesn't seem to hurt
on FreeBSD. Whether anyone would ever get to the point of seeing
intra-kernel contention on these platforms is hard to predict, but
we'd be ahead of the curve if so.

I was originally thinking of this as simply the obvious missing
implementation of Andres's WaitEventSet API which would surely pay off
later as we do more with that API (asynchronous execution with many
remote nodes for sharding, built-in connection pooling/admission
control for large numbers of sockets?, ...). I wasn't really
expecting it to show performance increases in simple one or two
pipe/socket cases on small core count machines, and it's interesting
that it clearly does on OS X.

It would be good for someone else to reproduce my results though.
For one thing, 5%-ish is not that far above the noise level; maybe
what I'm measuring here is just good luck from relocation of critical
loops into more cache-line-friendly locations.

Similar results here on a 4 core 2.2GHz Core i7 MacBook Pro running OS
X 10.11.5. With default settings except fsync = off, I ran pgbench -i
-s 100, then took the median result of three runs of pgbench -T 60 -j
4 -c 4 -M prepared -S. I used two different compilers in case it
helps to see results with different random instruction cache effects,
and got the following numbers:

Apple clang 703.0.31: 51654 TPS -> 55739 TPS = 7.9% improvement
GCC 6.1.0 from MacPorts: 52552 TPS -> 55143 TPS = 4.9% improvement

I reran the tests under FreeBSD 10.3 on a 4 core laptop and again saw
absolutely no measurable difference at 1, 4 or 24 clients. Maybe a
big enough server could be made to contend on the postmaster pipe's
selinfo->si_mtx, in selrecord(), in pipe_poll() -- maybe that'd be
directly equivalent to what happened on multi-socket Linux with
poll(), but I don't know.

--
Thomas Munro
http://www.enterprisedb.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#35Michael Paquier
michael.paquier@gmail.com
In reply to: Tom Lane (#33)
Re: kqueue

On Wed, Sep 14, 2016 at 7:06 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

It would be good for someone else to reproduce my results though.
For one thing, 5%-ish is not that far above the noise level; maybe
what I'm measuring here is just good luck from relocation of critical
loops into more cache-line-friendly locations.

From an OSX laptop with -S, -c 1 and -M prepared (9 runs, removed the
three best and three worst):
- HEAD: 9356/9343/9369
- HEAD + patch: 9433/9413/9461.071168
This laptop has a lot of I/O overhead... Still there is a slight
improvement here as well. Looking at the progress report, per-second
TPS gets easier more frequently into 9500~9600 TPS with the patch. So
at least I am seeing something.
--
Michael

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#36Tom Lane
tgl@sss.pgh.pa.us
In reply to: Michael Paquier (#35)
Re: kqueue

Michael Paquier <michael.paquier@gmail.com> writes:

From an OSX laptop with -S, -c 1 and -M prepared (9 runs, removed the
three best and three worst):
- HEAD: 9356/9343/9369
- HEAD + patch: 9433/9413/9461.071168
This laptop has a lot of I/O overhead... Still there is a slight
improvement here as well. Looking at the progress report, per-second
TPS gets easier more frequently into 9500~9600 TPS with the patch. So
at least I am seeing something.

Which OSX version exactly?

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#37Michael Paquier
michael.paquier@gmail.com
In reply to: Tom Lane (#36)
Re: kqueue

On Wed, Sep 14, 2016 at 3:32 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Michael Paquier <michael.paquier@gmail.com> writes:

From an OSX laptop with -S, -c 1 and -M prepared (9 runs, removed the
three best and three worst):
- HEAD: 9356/9343/9369
- HEAD + patch: 9433/9413/9461.071168
This laptop has a lot of I/O overhead... Still there is a slight
improvement here as well. Looking at the progress report, per-second
TPS gets easier more frequently into 9500~9600 TPS with the patch. So
at least I am seeing something.

Which OSX version exactly?

El Capitan 10.11.6. With -s 20 (300MB) and 1GB of shared_buffers so as
everything is on memory. Actually re-running the tests now with no VMs
around and no apps, I am getting close to 9650~9700TPS with patch, and
9300~9400TPS on HEAD, so that's unlikely only noise.
--
Michael

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#38Matteo Beccati
php@beccati.com
In reply to: Tom Lane (#33)
Re: kqueue

Hi,

On 14/09/2016 00:06, Tom Lane wrote:

I'm inclined to think the kqueue patch is worth applying just on the
grounds that it makes things better on OS X and doesn't seem to hurt
on FreeBSD. Whether anyone would ever get to the point of seeing
intra-kernel contention on these platforms is hard to predict, but
we'd be ahead of the curve if so.

It would be good for someone else to reproduce my results though.
For one thing, 5%-ish is not that far above the noise level; maybe
what I'm measuring here is just good luck from relocation of critical
loops into more cache-line-friendly locations.

FWIW, I've tested HEAD vs patch on a 2-cpu low end NetBSD 7.0 i386 machine.

HEAD: 1890/1935/1889 tps
kqueue: 1905/1957/1932 tps

no weird surprises, and basically no differences either.

Cheers
--
Matteo Beccati

Development & Consulting - http://www.beccati.com/

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#39Keith Fiske
keith@omniti.com
In reply to: Matteo Beccati (#38)
Re: kqueue

On Wed, Sep 14, 2016 at 9:09 AM, Matteo Beccati <php@beccati.com> wrote:

Hi,

On 14/09/2016 00:06, Tom Lane wrote:

I'm inclined to think the kqueue patch is worth applying just on the
grounds that it makes things better on OS X and doesn't seem to hurt
on FreeBSD. Whether anyone would ever get to the point of seeing
intra-kernel contention on these platforms is hard to predict, but
we'd be ahead of the curve if so.

It would be good for someone else to reproduce my results though.
For one thing, 5%-ish is not that far above the noise level; maybe
what I'm measuring here is just good luck from relocation of critical
loops into more cache-line-friendly locations.

FWIW, I've tested HEAD vs patch on a 2-cpu low end NetBSD 7.0 i386 machine.

HEAD: 1890/1935/1889 tps
kqueue: 1905/1957/1932 tps

no weird surprises, and basically no differences either.

Cheers
--
Matteo Beccati

Development & Consulting - http://www.beccati.com/

Thomas Munro brought up in #postgresql on freenode needing someone to test
a patch on a larger FreeBSD server. I've got a pretty decent machine
(3.1Ghz Quad Core Xeon E3-1220V3, 16GB ECC RAM, ZFS mirror on WD Red HDD)
so offered to give it a try.

Bench setup was:
pgbench -i -s 100 -d postgres

I ran this against 96rc1 instead of HEAD like most of the others in this
thread seem to have done. Not sure if that makes a difference and can
re-run if needed.
With higher concurrency, this seems to cause decreased performance. You can
tell which of the runs is the kqueue patch by looking at the path to
pgbench.

SINGLE PROCESS
[keith@corpus /tank/pgdata]$ /home/keith/pgsql96rc1_kqueue/bin/pgbench -T
60 -j 1 -c 1 -M prepared -S postgres -p
5496
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 1
number of threads: 1
duration: 60 s
number of transactions actually processed: 1547387
latency average: 0.039 ms
tps = 25789.750236 (including connections establishing)
tps = 25791.018293 (excluding connections establishing)
[keith@corpus /tank/pgdata]$ /home/keith/pgsql96rc1_kqueue/bin/pgbench -T
60 -j 1 -c 1 -M prepared -S postgres -p 5496
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 1
number of threads: 1
duration: 60 s
number of transactions actually processed: 1549442
latency average: 0.039 ms
tps = 25823.981255 (including connections establishing)
tps = 25825.189871 (excluding connections establishing)
[keith@corpus /tank/pgdata]$ /home/keith/pgsql96rc1_kqueue/bin/pgbench -T
60 -j 1 -c 1 -M prepared -S postgres -p 5496
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 1
number of threads: 1
duration: 60 s
number of transactions actually processed: 1547936
latency average: 0.039 ms
tps = 25798.572583 (including connections establishing)
tps = 25799.917170 (excluding connections establishing)

[keith@corpus /tank/pgdata]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 1
-c 1 -M prepared -S postgres -p
5496
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 1
number of threads: 1
duration: 60 s
number of transactions actually processed: 1520722
latency average: 0.039 ms
tps = 25343.122533 (including connections establishing)
tps = 25344.357116 (excluding connections establishing)
[keith@corpus /tank/pgdata]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 1
-c 1 -M prepared -S postgres -p 5496~
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 1
number of threads: 1
duration: 60 s
number of transactions actually processed: 1549282
latency average: 0.039 ms
tps = 25821.107595 (including connections establishing)
tps = 25822.407310 (excluding connections establishing)
[keith@corpus /tank/pgdata]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 1
-c 1 -M prepared -S postgres -p 5496~
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 1
number of threads: 1
duration: 60 s
number of transactions actually processed: 1541907
latency average: 0.039 ms
tps = 25698.025983 (including connections establishing)
tps = 25699.270663 (excluding connections establishing)

FOUR
/home/keith/pgsql96rc1_kqueue/bin/pgbench -T 60 -j 4 -c 4 -M prepared -S
postgres -p 5496
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 4
number of threads: 4
duration: 60 s
number of transactions actually processed: 4282185
latency average: 0.056 ms
tps = 71369.146931 (including connections establishing)
tps = 71372.646243 (excluding connections establishing)
[keith@corpus ~/postgresql-9.6rc1_kqueue]$
/home/keith/pgsql96rc1_kqueue/bin/pgbench -T 60 -j 4 -c 4 -M prepared -S
postgres -p 5496
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 4
number of threads: 4
duration: 60 s
number of transactions actually processed: 4777596
latency average: 0.050 ms
tps = 79625.214521 (including connections establishing)
tps = 79629.800123 (excluding connections establishing)
[keith@corpus ~/postgresql-9.6rc1_kqueue]$
/home/keith/pgsql96rc1_kqueue/bin/pgbench -T 60 -j 4 -c 4 -M prepared -S
postgres -p 5496
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 4
number of threads: 4
duration: 60 s
number of transactions actually processed: 4809132
latency average: 0.050 ms
tps = 80151.803249 (including connections establishing)
tps = 80155.903203 (excluding connections establishing)

/home/keith/pgsql96rc1/bin/pgbench -T 60 -j 4 -c 4 -M prepared -S postgres
-p 5496
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 4
number of threads: 4
duration: 60 s
number of transactions actually processed: 5114286
latency average: 0.047 ms
tps = 85236.858383 (including connections establishing)
tps = 85241.847800 (excluding connections establishing)
/home/keith/pgsql96rc1/bin/pgbench -T 60 -j 4 -c 4 -M prepared -S postgres
-p 5496
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 4
number of threads: 4
duration: 60 s
number of transactions actually processed: 5600194
latency average: 0.043 ms
tps = 93335.508864 (including connections establishing)
tps = 93340.970416 (excluding connections establishing)
/home/keith/pgsql96rc1/bin/pgbench -T 60 -j 4 -c 4 -M prepared -S postgres
-p 5496
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 4
number of threads: 4
duration: 60 s
number of transactions actually processed: 5606962
latency average: 0.043 ms
tps = 93447.905764 (including connections establishing)
tps = 93454.077142 (excluding connections establishing)

SIXTY-FOUR
[keith@corpus /tank/pgdata]$ /home/keith/pgsql96rc1_kqueue/bin/pgbench -T
60 -j 64 -c 64 -M prepared -S postgres -p
5496
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 64
number of threads: 64
duration: 60 s
number of transactions actually processed: 4084213
latency average: 0.940 ms
tps = 67633.476871 (including connections establishing)
tps = 67751.865998 (excluding connections establishing)
[keith@corpus /tank/pgdata]$ /home/keith/pgsql96rc1_kqueue/bin/pgbench -T
60 -j 64 -c 64 -M prepared -S postgres -p 5496
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 64
number of threads: 64
duration: 60 s
number of transactions actually processed: 4119994
latency average: 0.932 ms
tps = 68474.847365 (including connections establishing)
tps = 68540.221835 (excluding connections establishing)
[keith@corpus /tank/pgdata]$ /home/keith/pgsql96rc1_kqueue/bin/pgbench -T
60 -j 64 -c 64 -M prepared -S postgres -p 5496
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 64
number of threads: 64
duration: 60 s
number of transactions actually processed: 4068071
latency average: 0.944 ms
tps = 67192.603129 (including connections establishing)
tps = 67254.760177 (excluding connections establishing)

[keith@corpus /tank/pgdata]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 64
-c 64 -M prepared -S postgres -p
5496
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 64
number of threads: 64
duration: 60 s
number of transactions actually processed: 4281302
latency average: 0.897 ms
tps = 70147.847337 (including connections establishing)
tps = 70389.283564 (excluding connections establishing)
[keith@corpus /tank/pgdata]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 64
-c 64 -M prepared -S postgres -p 5496
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 64
number of threads: 64
duration: 60 s
number of transactions actually processed: 4573114
latency average: 0.840 ms
tps = 74848.884475 (including connections establishing)
tps = 75102.862539 (excluding connections establishing)
[keith@corpus /tank/pgdata]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 64
-c 64 -M prepared -S postgres -p 5496
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 64
number of threads: 64
duration: 60 s
number of transactions actually processed: 4341447
latency average: 0.884 ms
tps = 72350.152281 (including connections establishing)
tps = 72421.831179 (excluding connections establishing)

--
Keith Fiske
Database Administrator
OmniTI Computer Consulting, Inc.
http://www.keithf4.com

#40Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Keith Fiske (#39)
Re: kqueue

On Thu, Sep 15, 2016 at 10:48 AM, Keith Fiske <keith@omniti.com> wrote:

Thomas Munro brought up in #postgresql on freenode needing someone to test a
patch on a larger FreeBSD server. I've got a pretty decent machine (3.1Ghz
Quad Core Xeon E3-1220V3, 16GB ECC RAM, ZFS mirror on WD Red HDD) so offered
to give it a try.

Bench setup was:
pgbench -i -s 100 -d postgres

I ran this against 96rc1 instead of HEAD like most of the others in this
thread seem to have done. Not sure if that makes a difference and can re-run
if needed.
With higher concurrency, this seems to cause decreased performance. You can
tell which of the runs is the kqueue patch by looking at the path to
pgbench.

Thanks Keith. So to summarise, you saw no change with 1 client, but
with 4 clients you saw a significant drop in performance (~93K TPS ->
~80K TPS), and a smaller drop for 64 clients (~72 TPS -> ~68K TPS).
These results seem to be a nail in the coffin for this patch for now.

Thanks to everyone who tested. I might be back in a later commitfest
if I can figure out why and how to fix it.

--
Thomas Munro
http://www.enterprisedb.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#41Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Thomas Munro (#40)
1 attachment(s)
Re: kqueue

On Thu, Sep 15, 2016 at 11:04 AM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On Thu, Sep 15, 2016 at 10:48 AM, Keith Fiske <keith@omniti.com> wrote:

Thomas Munro brought up in #postgresql on freenode needing someone to test a
patch on a larger FreeBSD server. I've got a pretty decent machine (3.1Ghz
Quad Core Xeon E3-1220V3, 16GB ECC RAM, ZFS mirror on WD Red HDD) so offered
to give it a try.

Bench setup was:
pgbench -i -s 100 -d postgres

I ran this against 96rc1 instead of HEAD like most of the others in this
thread seem to have done. Not sure if that makes a difference and can re-run
if needed.
With higher concurrency, this seems to cause decreased performance. You can
tell which of the runs is the kqueue patch by looking at the path to
pgbench.

Thanks Keith. So to summarise, you saw no change with 1 client, but
with 4 clients you saw a significant drop in performance (~93K TPS ->
~80K TPS), and a smaller drop for 64 clients (~72 TPS -> ~68K TPS).
These results seem to be a nail in the coffin for this patch for now.

Thanks to everyone who tested. I might be back in a later commitfest
if I can figure out why and how to fix it.

Ok, here's a version tweaked to use EVFILT_PROC for postmaster death
detection instead of the pipe, as Tom Lane suggested in another
thread[1]/messages/by-id/13774.1473972000@sss.pgh.pa.us.

The pipe still exists and is used for PostmasterIsAlive(), and also
for the race case where kevent discovers that the PID doesn't exist
when you try to add it (presumably it died already, but we want to
defer the report of that until you call EventSetWait, so in that case
we stick the traditional pipe into the kqueue set as before so that
it'll fire a readable-because-EOF event then).

Still no change measurable on my laptop. Keith, would you be able to
test this on your rig and see if it sucks any less than the last one?

[1]: /messages/by-id/13774.1473972000@sss.pgh.pa.us

--
Thomas Munro
http://www.enterprisedb.com

Attachments:

kqueue-v6.patchapplication/octet-stream; name=kqueue-v6.patchDownload
diff --git a/configure b/configure
index 45c8eef..2bb298d 100755
--- a/configure
+++ b/configure
@@ -10230,7 +10230,7 @@ fi
 ## Header files
 ##
 
-for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
+for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/event.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -12473,7 +12473,7 @@ fi
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-for ac_func in cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l
+for ac_func in cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
diff --git a/configure.in b/configure.in
index c878b4e..81e85c4 100644
--- a/configure.in
+++ b/configure.in
@@ -1193,7 +1193,7 @@ AC_SUBST(UUID_LIBS)
 ##
 
 dnl sys/socket.h is required by AC_FUNC_ACCEPT_ARGTYPES
-AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
+AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h pwd.h sys/epoll.h sys/event.h sys/ioctl.h sys/ipc.h sys/poll.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/socket.h sys/sockio.h sys/tas.h sys/time.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
 
 # On BSD, test for net/if.h will fail unless sys/socket.h
 # is included first.
@@ -1446,7 +1446,7 @@ PGAC_FUNC_WCSTOMBS_L
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-AC_CHECK_FUNCS([cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l])
+AC_CHECK_FUNCS([cbrt dlopen fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l])
 
 AC_REPLACE_FUNCS(fseeko)
 case $host_os in
diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c
index 9def8a1..afceca8 100644
--- a/src/backend/storage/ipc/latch.c
+++ b/src/backend/storage/ipc/latch.c
@@ -44,6 +44,9 @@
 #ifdef HAVE_SYS_EPOLL_H
 #include <sys/epoll.h>
 #endif
+#ifdef HAVE_SYS_EVENT_H
+#include <sys/event.h>
+#endif
 #ifdef HAVE_POLL_H
 #include <poll.h>
 #endif
@@ -68,11 +71,14 @@
  * useful to manually specify the used primitive.  If desired, just add a
  * define somewhere before this block.
  */
-#if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_POLL) || \
-	defined(WAIT_USE_SELECT) || defined(WAIT_USE_WIN32)
+#if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_KQUEUE) || \
+	defined(WAIT_USE_POLL) || defined(WAIT_USE_SELECT) || \
+	defined(WAIT_USE_WIN32)
 /* don't overwrite manual choice */
 #elif defined(HAVE_SYS_EPOLL_H)
 #define WAIT_USE_EPOLL
+#elif defined(HAVE_KQUEUE)
+#define WAIT_USE_KQUEUE
 #elif defined(HAVE_POLL)
 #define WAIT_USE_POLL
 #elif HAVE_SYS_SELECT_H
@@ -108,6 +114,10 @@ struct WaitEventSet
 	int			epoll_fd;
 	/* epoll_wait returns events in a user provided arrays, allocate once */
 	struct epoll_event *epoll_ret_events;
+#elif defined(WAIT_USE_KQUEUE)
+	int			kqueue_fd;
+	/* kevent returns events in a user provided arrays, allocate once */
+	struct kevent *kqueue_ret_events;
 #elif defined(WAIT_USE_POLL)
 	/* poll expects events to be waited on every poll() call, prepare once */
 	struct pollfd *pollfds;
@@ -137,6 +147,8 @@ static void drainSelfPipe(void);
 
 #if defined(WAIT_USE_EPOLL)
 static void WaitEventAdjustEpoll(WaitEventSet *set, WaitEvent *event, int action);
+#elif defined(WAIT_USE_KQUEUE)
+static void WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events);
 #elif defined(WAIT_USE_POLL)
 static void WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event);
 #elif defined(WAIT_USE_WIN32)
@@ -496,6 +508,8 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 
 #if defined(WAIT_USE_EPOLL)
 	sz += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	sz += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	sz += MAXALIGN(sizeof(struct pollfd) * nevents);
 #elif defined(WAIT_USE_WIN32)
@@ -514,6 +528,9 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 #if defined(WAIT_USE_EPOLL)
 	set->epoll_ret_events = (struct epoll_event *) data;
 	data += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_ret_events = (struct kevent *) data;
+	data += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	set->pollfds = (struct pollfd *) data;
 	data += MAXALIGN(sizeof(struct pollfd) * nevents);
@@ -529,6 +546,10 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 	set->epoll_fd = epoll_create(nevents);
 	if (set->epoll_fd < 0)
 		elog(ERROR, "epoll_create failed: %m");
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_fd = kqueue();
+	if (set->kqueue_fd < 0)
+		elog(ERROR, "kqueue failed: %m");
 #elif defined(WAIT_USE_WIN32)
 
 	/*
@@ -555,6 +576,8 @@ FreeWaitEventSet(WaitEventSet *set)
 {
 #if defined(WAIT_USE_EPOLL)
 	close(set->epoll_fd);
+#elif defined(WAIT_USE_KQUEUE)
+	close(set->kqueue_fd);
 #elif defined(WAIT_USE_WIN32)
 	WaitEvent  *cur_event;
 
@@ -659,6 +682,8 @@ AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch,
 	/* perform wait primitive specific initialization, if needed */
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_ADD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, 0);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_SELECT)
@@ -680,10 +705,16 @@ void
 ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 {
 	WaitEvent  *event;
+#if defined(WAIT_USE_KQUEUE)
+	int old_events;
+#endif
 
 	Assert(pos < set->nevents);
 
 	event = &set->events[pos];
+#if defined(WAIT_USE_KQUEUE)
+	old_events = event->events;
+#endif
 
 	/*
 	 * If neither the event mask nor the associated latch changes, return
@@ -717,6 +748,8 @@ ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_MOD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, old_events);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_SELECT)
@@ -809,6 +842,127 @@ WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event)
 }
 #endif
 
+#if defined(WAIT_USE_KQUEUE)
+
+static inline void
+WaitEventAdjustKqueueAdd(struct kevent *k_ev, int filter, int action,
+						 WaitEvent *event)
+{
+	k_ev->ident = event->fd;
+	k_ev->filter = filter;
+	k_ev->flags = action | EV_CLEAR;
+	k_ev->fflags = 0;
+	k_ev->data = 0;
+
+	/*
+	 * On most BSD family systems, udata is of type void * so we could simply
+	 * assign event to it without casting, or use the EV_SET macro instead of
+	 * filling in the struct manually.  Unfortunately, NetBSD and possibly
+	 * others have it as intptr_t, so here we wallpaper over that difference
+	 * with an unsightly lvalue cast.
+	 */
+	*((WaitEvent **)(&k_ev->udata)) = event;
+}
+
+static inline void
+WaitEventAdjustKqueueAddPostmaster(struct kevent *k_ev, WaitEvent *event)
+{
+	/* For now postmaster death can only be added, not removed. */
+	k_ev->ident = PostmasterPid;
+	k_ev->filter = EVFILT_PROC;
+	k_ev->flags = EV_ADD | EV_CLEAR;
+	k_ev->fflags = NOTE_EXIT;
+	k_ev->data = 0;
+	*((WaitEvent **)(&k_ev->udata)) = event;
+}
+
+/*
+ * old_events is the previous event mask, used to compute what has changed.
+ */
+static void
+WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events)
+{
+	int rc;
+	struct kevent k_ev[2];
+	int count = 0;
+	bool new_filt_read = false;
+	bool old_filt_read = false;
+	bool new_filt_write = false;
+	bool old_filt_write = false;
+
+	if (old_events == event->events)
+		return;
+
+	Assert(event->events != WL_LATCH_SET || set->latch != NULL);
+	Assert(event->events == WL_LATCH_SET ||
+		   event->events == WL_POSTMASTER_DEATH ||
+		   (event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)));
+
+	if (event->events == WL_POSTMASTER_DEATH)
+	{
+		/*
+		 * Unlike all the other implementations, we detect postmaster death
+		 * using process notification instead of waiting on the postmaster
+		 * alive pipe.
+		 */
+		WaitEventAdjustKqueueAddPostmaster(&k_ev[count++], event);
+	}
+	else
+	{
+		/*
+		 * We need to compute the adds and deletes required to get from the
+		 * old event mask to the new event mask, since kevent treats readable
+		 * and writable as separate events.
+		 */
+		if (old_events == WL_LATCH_SET ||
+			(old_events & WL_SOCKET_READABLE))
+				old_filt_read = true;
+		if (event->events == WL_LATCH_SET ||
+			event->events == WL_POSTMASTER_DEATH ||
+			(event->events & WL_SOCKET_READABLE))
+			new_filt_read = true;
+		if (old_events & WL_SOCKET_WRITEABLE)
+			old_filt_write = true;
+		if (event->events & WL_SOCKET_WRITEABLE)
+			new_filt_write = true;
+		if (old_filt_read && !new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_DELETE,
+									 event);
+		else if (!old_filt_read && new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_ADD,
+									 event);
+		if (old_filt_write && !new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_DELETE,
+									 event);
+		else if (!old_filt_write && new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_ADD,
+									 event);
+	}
+
+	Assert(count > 0);
+	Assert(count <= 2);
+
+	rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+
+	if (rc < 0 && event->events == WL_POSTMASTER_DEATH && errno == ESRCH)
+	{
+		/*
+		 * The postmaster is already dead.  Defer reporting this to the caller
+		 * until wait time, for compatibility with the other implementations.
+		 * To do that we will now add the regular alive pipe.
+		 */
+		WaitEventAdjustKqueueAdd(&k_ev[0], EVFILT_READ, EV_ADD, event);
+		rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+	}
+
+	if (rc < 0)
+		ereport(ERROR,
+				(errcode_for_socket_access(),
+				 errmsg("kevent() failed: %m")));
+}
+
+#endif
+
 #if defined(WAIT_USE_WIN32)
 static void
 WaitEventAdjustWin32(WaitEventSet *set, WaitEvent *event)
@@ -1087,6 +1241,142 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
 	return returned_events;
 }
 
+#elif defined(WAIT_USE_KQUEUE)
+
+/*
+ * Wait using FreeBSD kqueue(2)/kevent(2).  Also available on other BSD-family
+ * systems including MacOSX.
+ *
+ * This is the preferrable wait method for systems that have it, as several
+ * readiness notifications are delivered, without having to iterate through
+ * all of set->events.
+ *
+ * For now this mirrors the epoll code, but in future it could modify the fd
+ * set in the same call to kevent as it uses for waiting instead of doing that
+ * with separate system calls.
+ */
+static int
+WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
+					  WaitEvent *occurred_events, int nevents)
+{
+	int			returned_events = 0;
+	int			rc;
+	WaitEvent  *cur_event;
+	struct kevent *cur_kqueue_event;
+	struct timespec timeout;
+	struct timespec *timeout_p;
+
+	if (cur_timeout < 0)
+		timeout_p = NULL;
+	else
+	{
+		timeout.tv_sec = cur_timeout / 1000;
+		timeout.tv_nsec = (cur_timeout % 1000) * 1000000;
+		timeout_p = &timeout;
+	}
+
+	/* Sleep */
+	rc = kevent(set->kqueue_fd, NULL, 0,
+				set->kqueue_ret_events, nevents,
+				timeout_p);
+
+	/* Check return code */
+	if (rc < 0)
+	{
+		/* EINTR is okay, otherwise complain */
+		if (errno != EINTR)
+		{
+			waiting = false;
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed while trying to wait: %m")));
+		}
+		return 0;
+	}
+	else if (rc == 0)
+	{
+		/* timeout exceeded */
+		return -1;
+	}
+
+	/*
+	 * At least one event occurred, iterate over the returned kqueue events
+	 * until they're either all processed, or we've returned all the events
+	 * the caller desired.
+	 */
+	for (cur_kqueue_event = set->kqueue_ret_events;
+		 cur_kqueue_event < (set->kqueue_ret_events + rc) &&
+		 returned_events < nevents;
+		 cur_kqueue_event++)
+	{
+		/* kevent's data pointer is set to the associated WaitEvent */
+		cur_event = (WaitEvent *) cur_kqueue_event->udata;
+
+		occurred_events->pos = cur_event->pos;
+		occurred_events->user_data = cur_event->user_data;
+		occurred_events->events = 0;
+
+		if (cur_event->events == WL_LATCH_SET &&
+			cur_kqueue_event->filter == EVFILT_READ)
+		{
+			/* There's data in the self-pipe, clear it. */
+			drainSelfPipe();
+
+			if (set->latch->is_set)
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_LATCH_SET;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events == WL_POSTMASTER_DEATH &&
+				 ((cur_kqueue_event->filter == EVFILT_PROC &&
+				   (cur_kqueue_event->fflags & NOTE_EXIT) != 0) ||
+				  cur_kqueue_event->filter == EVFILT_READ))
+		{
+			/*
+			 * Postmaster death notification usually triggers filter
+			 * EVFILT_PROC.  But if the postmaster process was aready dead
+			 * when we tried to add it to the kqueue, then
+			 * WaitEventAdjustKqueue adds the alive pipe instead, which
+			 * triggers EVFILT_READ here when we try to wait.
+			 */
+			occurred_events->fd = PGINVALID_SOCKET;
+			occurred_events->events = WL_POSTMASTER_DEATH;
+			occurred_events++;
+			returned_events++;
+		}
+		else if (cur_event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE))
+		{
+			Assert(cur_event->fd >= 0);
+
+			if ((cur_event->events & WL_SOCKET_READABLE) &&
+				(cur_kqueue_event->filter == EVFILT_READ))
+			{
+				/* readable, or EOF */
+				occurred_events->events |= WL_SOCKET_READABLE;
+			}
+
+			if ((cur_event->events & WL_SOCKET_WRITEABLE) &&
+				(cur_kqueue_event->filter == EVFILT_WRITE))
+			{
+				/* writable, or EOF */
+				occurred_events->events |= WL_SOCKET_WRITEABLE;
+			}
+
+			if (occurred_events->events != 0)
+			{
+				occurred_events->fd = cur_event->fd;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+	}
+
+	return returned_events;
+}
+
 #elif defined(WAIT_USE_POLL)
 
 /*
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index b621ff2..db33d04 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -279,6 +279,9 @@
 /* Define to 1 if you have isinf(). */
 #undef HAVE_ISINF
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 #undef HAVE_LANGINFO_H
 
@@ -533,6 +536,9 @@
 /* Define to 1 if you have the <sys/epoll.h> header file. */
 #undef HAVE_SYS_EPOLL_H
 
+/* Define to 1 if you have the <sys/event.h> header file. */
+#undef HAVE_SYS_EVENT_H
+
 /* Define to 1 if you have the <sys/ioctl.h> header file. */
 #undef HAVE_SYS_IOCTL_H
 
#42Matteo Beccati
php@beccati.com
In reply to: Thomas Munro (#41)
Re: kqueue

Hi,

On 16/09/2016 05:11, Thomas Munro wrote:

Still no change measurable on my laptop. Keith, would you be able to
test this on your rig and see if it sucks any less than the last one?

I've tested kqueue-v6.patch on the Celeron NetBSD machine and numbers
were constantly lower by about 5-10% vs fairly recent HEAD (same as my
last pgbench runs).

Cheers
--
Matteo Beccati

Development & Consulting - http://www.beccati.com/

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#43Keith Fiske
keith@omniti.com
In reply to: Thomas Munro (#41)
Re: kqueue

On Thu, Sep 15, 2016 at 11:11 PM, Thomas Munro <
thomas.munro@enterprisedb.com> wrote:

On Thu, Sep 15, 2016 at 11:04 AM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On Thu, Sep 15, 2016 at 10:48 AM, Keith Fiske <keith@omniti.com> wrote:

Thomas Munro brought up in #postgresql on freenode needing someone to

test a

patch on a larger FreeBSD server. I've got a pretty decent machine

(3.1Ghz

Quad Core Xeon E3-1220V3, 16GB ECC RAM, ZFS mirror on WD Red HDD) so

offered

to give it a try.

Bench setup was:
pgbench -i -s 100 -d postgres

I ran this against 96rc1 instead of HEAD like most of the others in this
thread seem to have done. Not sure if that makes a difference and can

re-run

if needed.
With higher concurrency, this seems to cause decreased performance. You

can

tell which of the runs is the kqueue patch by looking at the path to
pgbench.

Thanks Keith. So to summarise, you saw no change with 1 client, but
with 4 clients you saw a significant drop in performance (~93K TPS ->
~80K TPS), and a smaller drop for 64 clients (~72 TPS -> ~68K TPS).
These results seem to be a nail in the coffin for this patch for now.

Thanks to everyone who tested. I might be back in a later commitfest
if I can figure out why and how to fix it.

Ok, here's a version tweaked to use EVFILT_PROC for postmaster death
detection instead of the pipe, as Tom Lane suggested in another
thread[1].

The pipe still exists and is used for PostmasterIsAlive(), and also
for the race case where kevent discovers that the PID doesn't exist
when you try to add it (presumably it died already, but we want to
defer the report of that until you call EventSetWait, so in that case
we stick the traditional pipe into the kqueue set as before so that
it'll fire a readable-because-EOF event then).

Still no change measurable on my laptop. Keith, would you be able to
test this on your rig and see if it sucks any less than the last one?

[1] /messages/by-id/13774.1473972000@sss.pgh.pa.us

--
Thomas Munro
http://www.enterprisedb.com

Ran benchmarks on unaltered 96rc1 again just to be safe. Those are first.
Decided to throw a 32 process test in there as well to see if there's
anything going on between 4 and 64

~/pgsql96rc1/bin/pgbench -i -s 100 -d pgbench -p 5496

[keith@corpus ~]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 1 -c 1 -M
prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 1
number of threads: 1
duration: 60 s
number of transactions actually processed: 1543809
latency average: 0.039 ms
tps = 25729.749474 (including connections establishing)
tps = 25731.006414 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 1 -c 1 -M
prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 1
number of threads: 1
duration: 60 s
number of transactions actually processed: 1548340
latency average: 0.039 ms
tps = 25796.928387 (including connections establishing)
tps = 25798.275891 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 1 -c 1 -M
prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 1
number of threads: 1
duration: 60 s
number of transactions actually processed: 1535072
latency average: 0.039 ms
tps = 25584.182830 (including connections establishing)
tps = 25585.487246 (excluding connections establishing)

[keith@corpus ~]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 4 -c 4 -M
prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 4
number of threads: 4
duration: 60 s
number of transactions actually processed: 5621013
latency average: 0.043 ms
tps = 93668.594248 (including connections establishing)
tps = 93674.730914 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 4 -c 4 -M
prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 4
number of threads: 4
duration: 60 s
number of transactions actually processed: 5659929
latency average: 0.042 ms
tps = 94293.572928 (including connections establishing)
tps = 94300.500395 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 4 -c 4 -M
prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 4
number of threads: 4
duration: 60 s
number of transactions actually processed: 5649572
latency average: 0.042 ms
tps = 94115.854165 (including connections establishing)
tps = 94123.436211 (excluding connections establishing)

[keith@corpus ~]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 32 -c 32 -M
prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 32
number of threads: 32
duration: 60 s
number of transactions actually processed: 5196336
latency average: 0.369 ms
tps = 86570.696138 (including connections establishing)
tps = 86608.648579 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 32 -c 32 -M
prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 32
number of threads: 32
duration: 60 s
number of transactions actually processed: 5202443
latency average: 0.369 ms
tps = 86624.724577 (including connections establishing)
tps = 86664.848857 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 32 -c 32 -M
prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 32
number of threads: 32
duration: 60 s
number of transactions actually processed: 5198412
latency average: 0.369 ms
tps = 86637.730825 (including connections establishing)
tps = 86668.706105 (excluding connections establishing)

[keith@corpus ~]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 64 -c 64 -M
prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 64
number of threads: 64
duration: 60 s
number of transactions actually processed: 4790285
latency average: 0.802 ms
tps = 79800.369679 (including connections establishing)
tps = 79941.243428 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 64 -c 64 -M
prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 64
number of threads: 64
duration: 60 s
number of transactions actually processed: 4852921
latency average: 0.791 ms
tps = 79924.873678 (including connections establishing)
tps = 80179.182200 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1/bin/pgbench -T 60 -j 64 -c 64 -M
prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 64
number of threads: 64
duration: 60 s
number of transactions actually processed: 4672965
latency average: 0.822 ms
tps = 77871.911528 (including connections establishing)
tps = 77961.614345 (excluding connections establishing)

~/pgsql96rc1_kqueue_v6/bin/pgbench -i -s 100 -d pgbench -p 5496

Ran more than 3 times on occasion since results were coming out differently
by larger than expected values sometimes. Probably just something else
running on the server at the time.

Again, no real noticeable difference for single process
For 4 processes, things are mostly the same and only very, very slightly
lower, which is better than before.
For thirty-two processes, I saw a slight increase in performance for v6.
But, again, for 64 the results were slightly worse. Although the last run
did almost match, most runs were lower. They're better than they were last
time, but still not as good as the unchanged 96rc1

I can try running against HEAD if you'd like.

SINGLE
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 1
-c 1 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 1
number of threads: 1
duration: 60 s
number of transactions actually processed: 1508745
latency average: 0.040 ms
tps = 25145.524948 (including connections establishing)
tps = 25146.433564 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 1
-c 1 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 1
number of threads: 1
duration: 60 s
number of transactions actually processed: 1346454
latency average: 0.045 ms
tps = 22440.692798 (including connections establishing)
tps = 22441.527989 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 1
-c 1 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 1
number of threads: 1
duration: 60 s
number of transactions actually processed: 1426906
latency average: 0.042 ms
tps = 23781.710780 (including connections establishing)
tps = 23782.523744 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 1
-c 1 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 1
number of threads: 1
duration: 60 s
number of transactions actually processed: 1546252
latency average: 0.039 ms
tps = 25770.468513 (including connections establishing)
tps = 25771.352027 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 1
-c 1 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 1
number of threads: 1
duration: 60 s
number of transactions actually processed: 1542366
latency average: 0.039 ms
tps = 25705.706274 (including connections establishing)
tps = 25706.577285 (excluding connections establishing)

FOUR
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 4
-c 4 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 4
number of threads: 4
duration: 60 s
number of transactions actually processed: 5606159
latency average: 0.043 ms
tps = 93435.464767 (including connections establishing)
tps = 93442.716270 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 4
-c 4 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 4
number of threads: 4
duration: 60 s
number of transactions actually processed: 5602564
latency average: 0.043 ms
tps = 93375.528201 (including connections establishing)
tps = 93381.999147 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 4
-c 4 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 4
number of threads: 4
duration: 60 s
number of transactions actually processed: 5608675
latency average: 0.043 ms
tps = 93474.081114 (including connections establishing)
tps = 93481.634509 (excluding connections establishing)

THIRTY-TWO
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 32
-c 32 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 32
number of threads: 32
duration: 60 s
number of transactions actually processed: 5273952
latency average: 0.364 ms
tps = 87855.483112 (including connections establishing)
tps = 87880.762662 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 32
-c 32 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 32
number of threads: 32
duration: 60 s
number of transactions actually processed: 5294039
latency average: 0.363 ms
tps = 88126.254862 (including connections establishing)
tps = 88151.282371 (excluding connections establishing)
[keith@corpus ~]$
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 32
-c 32 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 32
number of threads: 32
duration: 60 s
number of transactions actually processed: 5279444
latency average: 0.364 ms
tps = 87867.500628 (including connections establishing)
tps = 87891.856414 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 32
-c 32 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 32
number of threads: 32
duration: 60 s
number of transactions actually processed: 5286405
latency average: 0.363 ms
tps = 88049.742194 (including connections establishing)
tps = 88077.409809 (excluding connections establishing)

SIXTY-FOUR
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 64
-c 64 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 64
number of threads: 64
duration: 60 s
number of transactions actually processed: 4426565
latency average: 0.867 ms
tps = 72142.306576 (including connections establishing)
tps = 72305.201516 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 64
-c 64 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 64
number of threads: 64
duration: 60 s
number of transactions actually processed: 4070048
latency average: 0.943 ms
tps = 66587.264608 (including connections establishing)
tps = 66711.820878 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 64
-c 64 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 64
number of threads: 64
duration: 60 s
number of transactions actually processed: 4478535
latency average: 0.857 ms
tps = 72768.961061 (including connections establishing)
tps = 72930.488922 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 64
-c 64 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 64
number of threads: 64
duration: 60 s
number of transactions actually processed: 4051086
latency average: 0.948 ms
tps = 66540.741821 (including connections establishing)
tps = 66601.943062 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 64
-c 64 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 64
number of threads: 64
duration: 60 s
number of transactions actually processed: 4374049
latency average: 0.878 ms
tps = 72093.025134 (including connections establishing)
tps = 72271.145559 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v6/bin/pgbench -T 60 -j 64
-c 64 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 64
number of threads: 64
duration: 60 s
number of transactions actually processed: 4762663
latency average: 0.806 ms
tps = 79372.610362 (including connections establishing)
tps = 79535.601194 (excluding connections establishing)

As a sanity check I went back and ran the pgbench from the v5 patch to see
if it was still lower. It is. So v6 seems to have a slight improvement in
some cases.

[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v5/bin/pgbench -T 60 -j 32
-c 32 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 32
number of threads: 32
duration: 60 s
number of transactions actually processed: 4618814
latency average: 0.416 ms
tps = 76960.608378 (including connections establishing)
tps = 76981.609781 (excluding connections establishing)
[keith@corpus ~]$ /home/keith/pgsql96rc1_kqueue_v5/bin/pgbench -T 60 -j 32
-c 32 -M prepared -S -p 5496 pgbench
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: prepared
number of clients: 32
number of threads: 32
duration: 60 s
number of transactions actually processed: 4649745
latency average: 0.413 ms
tps = 77491.094077 (including connections establishing)
tps = 77525.443941 (excluding connections establishing)

#44Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Keith Fiske (#43)
Re: kqueue

On Thu, Sep 29, 2016 at 9:09 AM, Keith Fiske <keith@omniti.com> wrote:

On Thu, Sep 15, 2016 at 11:11 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

Ok, here's a version tweaked to use EVFILT_PROC for postmaster death
detection instead of the pipe, as Tom Lane suggested in another
thread[1].

[...]

Ran benchmarks on unaltered 96rc1 again just to be safe. Those are first.
Decided to throw a 32 process test in there as well to see if there's
anything going on between 4 and 64

Thanks! A summary:

┌──────────────────┬─────────┬───────────┬────────────────────┬───────────┐
│ code │ clients │ average │ standard_deviation │ median │
├──────────────────┼─────────┼───────────┼────────────────────┼───────────┤
│ 9.6rc1 │ 1 │ 25704.923 │ 108.766 │ 25731.006 │
│ 9.6rc1 │ 4 │ 94032.889 │ 322.562 │ 94123.436 │
│ 9.6rc1 │ 32 │ 86647.401 │ 33.616 │ 86664.849 │
│ 9.6rc1 │ 64 │ 79360.680 │ 1217.453 │ 79941.243 │
│ 9.6rc1/kqueue-v6 │ 1 │ 24569.683 │ 1433.339 │ 25146.434 │
│ 9.6rc1/kqueue-v6 │ 4 │ 93435.450 │ 50.214 │ 93442.716 │
│ 9.6rc1/kqueue-v6 │ 32 │ 88000.328 │ 135.143 │ 87891.856 │
│ 9.6rc1/kqueue-v6 │ 64 │ 71726.034 │ 4784.794 │ 72271.146 │
└──────────────────┴─────────┴───────────┴────────────────────┴───────────┘

┌─────────┬───────────┬───────────┬──────────────────────────┐
│ clients │ unpatched │ patched │ percent_change │
├─────────┼───────────┼───────────┼──────────────────────────┤
│ 1 │ 25731.006 │ 25146.434 │ -2.271858317548874692000 │
│ 4 │ 94123.436 │ 93442.716 │ -0.723220516514080510000 │
│ 32 │ 86664.849 │ 87891.856 │ 1.415807001521458833000 │
│ 64 │ 79941.243 │ 72271.146 │ -9.594668173973727179000 │
└─────────┴───────────┴───────────┴──────────────────────────┘

The variation in the patched 64 client numbers is quite large, ranging
from ~66.5k to ~79.5k. The highest number matched the unpatched
numbers which ranged 77.9k to 80k. I wonder if that is noise and we
need to run longer (in which case the best outcome might be 'this
patch is neutral on FreeBSD'), or if something the patch does is doing
is causing that (for example maybe EVFILT_PROC proc filters causes
contention on the process table lock).

Matteo's results with the v6 patch on a low end NetBSD machine were
not good. But the report at [1]/messages/by-id/20160915135755.GC19008@genua.de implies that larger NetBSD and
OpenBSD systems have terrible problems with the
poll-postmaster-alive-pipe approach, which this EVFILT_PROC approach
would seem to address pretty well.

It's difficult to draw any conclusions at this point.

[1]: /messages/by-id/20160915135755.GC19008@genua.de

--
Thomas Munro
http://www.enterprisedb.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#45Torsten Zuehlsdorff
mailinglists@toco-domains.de
In reply to: Thomas Munro (#44)
Re: kqueue

On 28.09.2016 23:39, Thomas Munro wrote:

On Thu, Sep 29, 2016 at 9:09 AM, Keith Fiske <keith@omniti.com> wrote:

On Thu, Sep 15, 2016 at 11:11 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

Ok, here's a version tweaked to use EVFILT_PROC for postmaster death
detection instead of the pipe, as Tom Lane suggested in another
thread[1].

[...]

Ran benchmarks on unaltered 96rc1 again just to be safe. Those are first.
Decided to throw a 32 process test in there as well to see if there's
anything going on between 4 and 64

Thanks! A summary:

[summary]

The variation in the patched 64 client numbers is quite large, ranging
from ~66.5k to ~79.5k. The highest number matched the unpatched
numbers which ranged 77.9k to 80k. I wonder if that is noise and we
need to run longer (in which case the best outcome might be 'this
patch is neutral on FreeBSD'), or if something the patch does is doing
is causing that (for example maybe EVFILT_PROC proc filters causes
contention on the process table lock).

[..]

It's difficult to draw any conclusions at this point.

I'm currently setting up a new FreeBSD machine. Its a FreeBSD 11 with
ZFS, 64 GB RAM and Quad Core. If you're interested in i can give you
access for more tests this week. Maybe this will help to draw any
conclusion.

Greetings,
Torsten

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#46Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Torsten Zuehlsdorff (#45)
1 attachment(s)
Re: kqueue

On Tue, Oct 11, 2016 at 8:08 PM, Torsten Zuehlsdorff
<mailinglists@toco-domains.de> wrote:

On 28.09.2016 23:39, Thomas Munro wrote:

It's difficult to draw any conclusions at this point.

I'm currently setting up a new FreeBSD machine. Its a FreeBSD 11 with ZFS,
64 GB RAM and Quad Core. If you're interested in i can give you access for
more tests this week. Maybe this will help to draw any conclusion.

I don't plan to resubmit this patch myself, but I was doing some
spring cleaning and rebasing today and I figured it might be worth
quietly leaving a working patch here just in case anyone from the
various BSD communities is interested in taking the idea further.

Some thoughts: We could decide to make it the default on FooBSD but
not BarBSD according to experimental results... for example several
people reported that macOS developer machines run pgbench a bit
faster. Also, we didn't ever get to the bottom of the complaint that
NetBSD and OpenBSD systems wake up every waiting backend when anyone
calls PostmasterIsAlive[1]/messages/by-id/CAEepm=27K-2AP1th97kiVvKpTuria9ocbjT0cXCJqnt4if5rJQ@mail.gmail.com, which this patch should in theory fix (by
using EVFILT_PROC instead of waiting on that pipe). On the other
hand, the fix for that may be to stop calling PostmasterIsAlive in
loops[2]/messages/by-id/CAEepm=3FW33PeRxt0jE4N0truJqOepp72R6W-zyM5mu1bxnZRw@mail.gmail.com!

[1]: /messages/by-id/CAEepm=27K-2AP1th97kiVvKpTuria9ocbjT0cXCJqnt4if5rJQ@mail.gmail.com
[2]: /messages/by-id/CAEepm=3FW33PeRxt0jE4N0truJqOepp72R6W-zyM5mu1bxnZRw@mail.gmail.com

--
Thomas Munro
http://www.enterprisedb.com

Attachments:

kqueue-v7.patchapplication/octet-stream; name=kqueue-v7.patchDownload
diff --git a/configure b/configure
index 8315dec23a8..342b97777e2 100755
--- a/configure
+++ b/configure
@@ -10600,7 +10600,7 @@ fi
 ## Header files
 ##
 
-for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/ipc.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
+for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -12892,7 +12892,7 @@ fi
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-for ac_func in cbrt clock_gettime dlopen fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l
+for ac_func in cbrt clock_gettime dlopen fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
diff --git a/configure.in b/configure.in
index 11eb9c8acfc..48a25110459 100644
--- a/configure.in
+++ b/configure.in
@@ -1179,7 +1179,7 @@ AC_SUBST(UUID_LIBS)
 ## Header files
 ##
 
-AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/ipc.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
+AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
 
 # On BSD, test for net/if.h will fail unless sys/socket.h
 # is included first.
@@ -1429,7 +1429,7 @@ PGAC_FUNC_WCSTOMBS_L
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-AC_CHECK_FUNCS([cbrt clock_gettime dlopen fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l])
+AC_CHECK_FUNCS([cbrt clock_gettime dlopen fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range towlower utime utimes wcstombs wcstombs_l])
 
 AC_REPLACE_FUNCS(fseeko)
 case $host_os in
diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c
index 07b1364de8f..766ccfa6f82 100644
--- a/src/backend/storage/ipc/latch.c
+++ b/src/backend/storage/ipc/latch.c
@@ -39,6 +39,9 @@
 #ifdef HAVE_SYS_EPOLL_H
 #include <sys/epoll.h>
 #endif
+#ifdef HAVE_SYS_EVENT_H
+#include <sys/event.h>
+#endif
 #ifdef HAVE_POLL_H
 #include <poll.h>
 #endif
@@ -59,10 +62,12 @@
  * define somewhere before this block.
  */
 #if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_POLL) || \
-	defined(WAIT_USE_WIN32)
+	defined(WAIT_USE_KQUEUE) || defined(WAIT_USE_WIN32)
 /* don't overwrite manual choice */
 #elif defined(HAVE_SYS_EPOLL_H)
 #define WAIT_USE_EPOLL
+#elif defined(HAVE_KQUEUE)
+#define WAIT_USE_KQUEUE
 #elif defined(HAVE_POLL)
 #define WAIT_USE_POLL
 #elif WIN32
@@ -96,6 +101,10 @@ struct WaitEventSet
 	int			epoll_fd;
 	/* epoll_wait returns events in a user provided arrays, allocate once */
 	struct epoll_event *epoll_ret_events;
+#elif defined(WAIT_USE_KQUEUE)
+	int			kqueue_fd;
+	/* kevent returns events in a user provided arrays, allocate once */
+	struct kevent *kqueue_ret_events;
 #elif defined(WAIT_USE_POLL)
 	/* poll expects events to be waited on every poll() call, prepare once */
 	struct pollfd *pollfds;
@@ -128,6 +137,8 @@ static void drainSelfPipe(void);
 
 #if defined(WAIT_USE_EPOLL)
 static void WaitEventAdjustEpoll(WaitEventSet *set, WaitEvent *event, int action);
+#elif defined(WAIT_USE_KQUEUE)
+static void WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events);
 #elif defined(WAIT_USE_POLL)
 static void WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event);
 #elif defined(WAIT_USE_WIN32)
@@ -535,6 +546,8 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 
 #if defined(WAIT_USE_EPOLL)
 	sz += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	sz += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	sz += MAXALIGN(sizeof(struct pollfd) * nevents);
 #elif defined(WAIT_USE_WIN32)
@@ -553,6 +566,9 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 #if defined(WAIT_USE_EPOLL)
 	set->epoll_ret_events = (struct epoll_event *) data;
 	data += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_ret_events = (struct kevent *) data;
+	data += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	set->pollfds = (struct pollfd *) data;
 	data += MAXALIGN(sizeof(struct pollfd) * nevents);
@@ -577,6 +593,10 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 	if (fcntl(set->epoll_fd, F_SETFD, FD_CLOEXEC) == -1)
 		elog(ERROR, "fcntl(F_SETFD) failed on epoll descriptor: %m");
 #endif							/* EPOLL_CLOEXEC */
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_fd = kqueue();
+	if (set->kqueue_fd < 0)
+		elog(ERROR, "kqueue failed: %m");
 #elif defined(WAIT_USE_WIN32)
 
 	/*
@@ -609,6 +629,8 @@ FreeWaitEventSet(WaitEventSet *set)
 {
 #if defined(WAIT_USE_EPOLL)
 	close(set->epoll_fd);
+#elif defined(WAIT_USE_KQUEUE)
+	close(set->kqueue_fd);
 #elif defined(WAIT_USE_WIN32)
 	WaitEvent  *cur_event;
 
@@ -716,6 +738,8 @@ AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch,
 	/* perform wait primitive specific initialization, if needed */
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_ADD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, 0);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -735,10 +759,16 @@ void
 ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 {
 	WaitEvent  *event;
+#if defined(WAIT_USE_KQUEUE)
+	int old_events;
+#endif
 
 	Assert(pos < set->nevents);
 
 	event = &set->events[pos];
+#if defined(WAIT_USE_KQUEUE)
+	old_events = event->events;
+#endif
 
 	/*
 	 * If neither the event mask nor the associated latch changes, return
@@ -772,6 +802,8 @@ ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_MOD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, old_events);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -862,6 +894,127 @@ WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event)
 }
 #endif
 
+#if defined(WAIT_USE_KQUEUE)
+
+static inline void
+WaitEventAdjustKqueueAdd(struct kevent *k_ev, int filter, int action,
+						 WaitEvent *event)
+{
+	k_ev->ident = event->fd;
+	k_ev->filter = filter;
+	k_ev->flags = action | EV_CLEAR;
+	k_ev->fflags = 0;
+	k_ev->data = 0;
+
+	/*
+	 * On most BSD family systems, udata is of type void * so we could simply
+	 * assign event to it without casting, or use the EV_SET macro instead of
+	 * filling in the struct manually.  Unfortunately, NetBSD and possibly
+	 * others have it as intptr_t, so here we wallpaper over that difference
+	 * with an unsightly lvalue cast.
+	 */
+	*((WaitEvent **)(&k_ev->udata)) = event;
+}
+
+static inline void
+WaitEventAdjustKqueueAddPostmaster(struct kevent *k_ev, WaitEvent *event)
+{
+	/* For now postmaster death can only be added, not removed. */
+	k_ev->ident = PostmasterPid;
+	k_ev->filter = EVFILT_PROC;
+	k_ev->flags = EV_ADD | EV_CLEAR;
+	k_ev->fflags = NOTE_EXIT;
+	k_ev->data = 0;
+	*((WaitEvent **)(&k_ev->udata)) = event;
+}
+
+/*
+ * old_events is the previous event mask, used to compute what has changed.
+ */
+static void
+WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events)
+{
+	int rc;
+	struct kevent k_ev[2];
+	int count = 0;
+	bool new_filt_read = false;
+	bool old_filt_read = false;
+	bool new_filt_write = false;
+	bool old_filt_write = false;
+
+	if (old_events == event->events)
+		return;
+
+	Assert(event->events != WL_LATCH_SET || set->latch != NULL);
+	Assert(event->events == WL_LATCH_SET ||
+		   event->events == WL_POSTMASTER_DEATH ||
+		   (event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)));
+
+	if (event->events == WL_POSTMASTER_DEATH)
+	{
+		/*
+		 * Unlike all the other implementations, we detect postmaster death
+		 * using process notification instead of waiting on the postmaster
+		 * alive pipe.
+		 */
+		WaitEventAdjustKqueueAddPostmaster(&k_ev[count++], event);
+	}
+	else
+	{
+		/*
+		 * We need to compute the adds and deletes required to get from the
+		 * old event mask to the new event mask, since kevent treats readable
+		 * and writable as separate events.
+		 */
+		if (old_events == WL_LATCH_SET ||
+			(old_events & WL_SOCKET_READABLE))
+				old_filt_read = true;
+		if (event->events == WL_LATCH_SET ||
+			event->events == WL_POSTMASTER_DEATH ||
+			(event->events & WL_SOCKET_READABLE))
+			new_filt_read = true;
+		if (old_events & WL_SOCKET_WRITEABLE)
+			old_filt_write = true;
+		if (event->events & WL_SOCKET_WRITEABLE)
+			new_filt_write = true;
+		if (old_filt_read && !new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_DELETE,
+									 event);
+		else if (!old_filt_read && new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_ADD,
+									 event);
+		if (old_filt_write && !new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_DELETE,
+									 event);
+		else if (!old_filt_write && new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_ADD,
+									 event);
+	}
+
+	Assert(count > 0);
+	Assert(count <= 2);
+
+	rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+
+	if (rc < 0 && event->events == WL_POSTMASTER_DEATH && errno == ESRCH)
+	{
+		/*
+		 * The postmaster is already dead.  Defer reporting this to the caller
+		 * until wait time, for compatibility with the other implementations.
+		 * To do that we will now add the regular alive pipe.
+		 */
+		WaitEventAdjustKqueueAdd(&k_ev[0], EVFILT_READ, EV_ADD, event);
+		rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+	}
+
+	if (rc < 0)
+		ereport(ERROR,
+				(errcode_for_socket_access(),
+				 errmsg("kevent() failed: %m")));
+}
+
+#endif
+
 #if defined(WAIT_USE_WIN32)
 static void
 WaitEventAdjustWin32(WaitEventSet *set, WaitEvent *event)
@@ -1147,6 +1300,142 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
 	return returned_events;
 }
 
+#elif defined(WAIT_USE_KQUEUE)
+
+/*
+ * Wait using FreeBSD kqueue(2)/kevent(2).  Also available on other BSD-family
+ * systems including MacOSX.
+ *
+ * This is the preferrable wait method for systems that have it, as several
+ * readiness notifications are delivered, without having to iterate through
+ * all of set->events.
+ *
+ * For now this mirrors the epoll code, but in future it could modify the fd
+ * set in the same call to kevent as it uses for waiting instead of doing that
+ * with separate system calls.
+ */
+static int
+WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
+					  WaitEvent *occurred_events, int nevents)
+{
+	int			returned_events = 0;
+	int			rc;
+	WaitEvent  *cur_event;
+	struct kevent *cur_kqueue_event;
+	struct timespec timeout;
+	struct timespec *timeout_p;
+
+	if (cur_timeout < 0)
+		timeout_p = NULL;
+	else
+	{
+		timeout.tv_sec = cur_timeout / 1000;
+		timeout.tv_nsec = (cur_timeout % 1000) * 1000000;
+		timeout_p = &timeout;
+	}
+
+	/* Sleep */
+	rc = kevent(set->kqueue_fd, NULL, 0,
+				set->kqueue_ret_events, nevents,
+				timeout_p);
+
+	/* Check return code */
+	if (rc < 0)
+	{
+		/* EINTR is okay, otherwise complain */
+		if (errno != EINTR)
+		{
+			waiting = false;
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed while trying to wait: %m")));
+		}
+		return 0;
+	}
+	else if (rc == 0)
+	{
+		/* timeout exceeded */
+		return -1;
+	}
+
+	/*
+	 * At least one event occurred, iterate over the returned kqueue events
+	 * until they're either all processed, or we've returned all the events
+	 * the caller desired.
+	 */
+	for (cur_kqueue_event = set->kqueue_ret_events;
+		 cur_kqueue_event < (set->kqueue_ret_events + rc) &&
+		 returned_events < nevents;
+		 cur_kqueue_event++)
+	{
+		/* kevent's data pointer is set to the associated WaitEvent */
+		cur_event = (WaitEvent *) cur_kqueue_event->udata;
+
+		occurred_events->pos = cur_event->pos;
+		occurred_events->user_data = cur_event->user_data;
+		occurred_events->events = 0;
+
+		if (cur_event->events == WL_LATCH_SET &&
+			cur_kqueue_event->filter == EVFILT_READ)
+		{
+			/* There's data in the self-pipe, clear it. */
+			drainSelfPipe();
+
+			if (set->latch->is_set)
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_LATCH_SET;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events == WL_POSTMASTER_DEATH &&
+				 ((cur_kqueue_event->filter == EVFILT_PROC &&
+				   (cur_kqueue_event->fflags & NOTE_EXIT) != 0) ||
+				  cur_kqueue_event->filter == EVFILT_READ))
+		{
+			/*
+			 * Postmaster death notification usually triggers filter
+			 * EVFILT_PROC.  But if the postmaster process was aready dead
+			 * when we tried to add it to the kqueue, then
+			 * WaitEventAdjustKqueue adds the alive pipe instead, which
+			 * triggers EVFILT_READ here when we try to wait.
+			 */
+			occurred_events->fd = PGINVALID_SOCKET;
+			occurred_events->events = WL_POSTMASTER_DEATH;
+			occurred_events++;
+			returned_events++;
+		}
+		else if (cur_event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE))
+		{
+			Assert(cur_event->fd >= 0);
+
+			if ((cur_event->events & WL_SOCKET_READABLE) &&
+				(cur_kqueue_event->filter == EVFILT_READ))
+			{
+				/* readable, or EOF */
+				occurred_events->events |= WL_SOCKET_READABLE;
+			}
+
+			if ((cur_event->events & WL_SOCKET_WRITEABLE) &&
+				(cur_kqueue_event->filter == EVFILT_WRITE))
+			{
+				/* writable, or EOF */
+				occurred_events->events |= WL_SOCKET_WRITEABLE;
+			}
+
+			if (occurred_events->events != 0)
+			{
+				occurred_events->fd = cur_event->fd;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+	}
+
+	return returned_events;
+}
+
 #elif defined(WAIT_USE_POLL)
 
 /*
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 7a05c7e5b85..cf492a29e81 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -297,6 +297,9 @@
 /* Define to 1 if you have isinf(). */
 #undef HAVE_ISINF
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 #undef HAVE_LANGINFO_H
 
@@ -554,6 +557,9 @@
 /* Define to 1 if you have the <sys/epoll.h> header file. */
 #undef HAVE_SYS_EPOLL_H
 
+/* Define to 1 if you have the <sys/event.h> header file. */
+#undef HAVE_SYS_EVENT_H
+
 /* Define to 1 if you have the <sys/ipc.h> header file. */
 #undef HAVE_SYS_IPC_H
 
#47Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Thomas Munro (#46)
1 attachment(s)
Re: [HACKERS] kqueue

On Thu, Jun 22, 2017 at 7:19 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

I don't plan to resubmit this patch myself, but I was doing some
spring cleaning and rebasing today and I figured it might be worth
quietly leaving a working patch here just in case anyone from the
various BSD communities is interested in taking the idea further.

Since there was a mention of kqueue on -hackers today, here's another
rebase. I got curious just now and ran a very quick test on an AWS 64
vCPU m4.16xlarge instance running image "FreeBSD
11.1-STABLE-amd64-2017-08-08 - ami-00608178". I set shared_buffers =
10GB and ran pgbench approximately the same way Heikki and Keith did
upthread:

pgbench -i -s 200 postgres
pgbench -M prepared -j 6 -c 6 -S postgres -T60 -P1
pgbench -M prepared -j 12 -c 12 -S postgres -T60 -P1
pgbench -M prepared -j 24 -c 24 -S postgres -T60 -P1
pgbench -M prepared -j 36 -c 36 -S postgres -T60 -P1
pgbench -M prepared -j 48 -c 48 -S postgres -T60 -P1

The TPS numbers I got (including connections establishing) were:

clients master patched
6 146,215 147,535 (+0.9%)
12 273,056 280,505 (+2.7%)
24 360,751 369,965 (+2.5%)
36 413,147 420,769 (+1.8%)
48 416,189 444,537 (+6.8%)

The patch appears to be doing something positive on this particular
system and that effect was stable over a few runs.

--
Thomas Munro
http://www.enterprisedb.com

Attachments:

kqueue-v8.patchapplication/octet-stream; name=kqueue-v8.patchDownload
From d655a1d6e7e8596660f4f3bf46f0afa21c561d2a Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@enterprisedb.com>
Date: Thu, 22 Jun 2017 18:40:27 +1200
Subject: [PATCH] Add kqueue support to WaitEventSet.

Add a kqueue based implementation of WaitEventSet for use on BSD-family
operating systems including FreeBSD, NetBSD, OpenBSD and macOS.  This is
similar to the epoll implementation for Linux systems in that the set of
kernel objects to monitor can be set up once and then reused, allowing for
more efficient IO multiplexing than poll().

Author: Thomas Munro
Reviewed-By: Marko Tiikkaja
Tested-By: Matteo Beccati, Keith Fiske, Heikki Linnakangas
Discussion: https://postgr.es/m/CAEepm%3D37oF84-iXDTQ9MrGjENwVGds%2B5zTr38ca73kWR7ez_tA%40mail.gmail.com
---
 configure                       |   4 +-
 configure.in                    |   4 +-
 src/backend/storage/ipc/latch.c | 291 +++++++++++++++++++++++++++++++++++++++-
 src/include/pg_config.h.in      |   6 +
 4 files changed, 300 insertions(+), 5 deletions(-)

diff --git a/configure b/configure
index 6c4d743b35e..62ba03198e8 100755
--- a/configure
+++ b/configure
@@ -10683,7 +10683,7 @@ fi
 ## Header files
 ##
 
-for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/ipc.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
+for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -13064,7 +13064,7 @@ fi
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-for ac_func in cbrt clock_gettime dlopen fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll posix_fallocate pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range utime utimes wcstombs_l
+for ac_func in cbrt clock_gettime dlopen fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll posix_fallocate pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range utime utimes wcstombs_l
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
diff --git a/configure.in b/configure.in
index d9c4a50b4b6..4cb86aace7c 100644
--- a/configure.in
+++ b/configure.in
@@ -1149,7 +1149,7 @@ AC_SUBST(UUID_LIBS)
 ## Header files
 ##
 
-AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/ipc.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
+AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
 
 # On BSD, test for net/if.h will fail unless sys/socket.h
 # is included first.
@@ -1424,7 +1424,7 @@ PGAC_FUNC_WCSTOMBS_L
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-AC_CHECK_FUNCS([cbrt clock_gettime dlopen fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll posix_fallocate pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range utime utimes wcstombs_l])
+AC_CHECK_FUNCS([cbrt clock_gettime dlopen fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll posix_fallocate pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range utime utimes wcstombs_l])
 
 AC_REPLACE_FUNCS(fseeko)
 case $host_os in
diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c
index 4eb6e83682e..6c5c9682a0a 100644
--- a/src/backend/storage/ipc/latch.c
+++ b/src/backend/storage/ipc/latch.c
@@ -39,6 +39,9 @@
 #ifdef HAVE_SYS_EPOLL_H
 #include <sys/epoll.h>
 #endif
+#ifdef HAVE_SYS_EVENT_H
+#include <sys/event.h>
+#endif
 #ifdef HAVE_POLL_H
 #include <poll.h>
 #endif
@@ -59,10 +62,12 @@
  * define somewhere before this block.
  */
 #if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_POLL) || \
-	defined(WAIT_USE_WIN32)
+	defined(WAIT_USE_KQUEUE) || defined(WAIT_USE_WIN32)
 /* don't overwrite manual choice */
 #elif defined(HAVE_SYS_EPOLL_H)
 #define WAIT_USE_EPOLL
+#elif defined(HAVE_KQUEUE)
+#define WAIT_USE_KQUEUE
 #elif defined(HAVE_POLL)
 #define WAIT_USE_POLL
 #elif WIN32
@@ -96,6 +101,10 @@ struct WaitEventSet
 	int			epoll_fd;
 	/* epoll_wait returns events in a user provided arrays, allocate once */
 	struct epoll_event *epoll_ret_events;
+#elif defined(WAIT_USE_KQUEUE)
+	int			kqueue_fd;
+	/* kevent returns events in a user provided arrays, allocate once */
+	struct kevent *kqueue_ret_events;
 #elif defined(WAIT_USE_POLL)
 	/* poll expects events to be waited on every poll() call, prepare once */
 	struct pollfd *pollfds;
@@ -128,6 +137,8 @@ static void drainSelfPipe(void);
 
 #if defined(WAIT_USE_EPOLL)
 static void WaitEventAdjustEpoll(WaitEventSet *set, WaitEvent *event, int action);
+#elif defined(WAIT_USE_KQUEUE)
+static void WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events);
 #elif defined(WAIT_USE_POLL)
 static void WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event);
 #elif defined(WAIT_USE_WIN32)
@@ -534,6 +545,8 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 
 #if defined(WAIT_USE_EPOLL)
 	sz += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	sz += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	sz += MAXALIGN(sizeof(struct pollfd) * nevents);
 #elif defined(WAIT_USE_WIN32)
@@ -552,6 +565,9 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 #if defined(WAIT_USE_EPOLL)
 	set->epoll_ret_events = (struct epoll_event *) data;
 	data += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_ret_events = (struct kevent *) data;
+	data += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	set->pollfds = (struct pollfd *) data;
 	data += MAXALIGN(sizeof(struct pollfd) * nevents);
@@ -576,6 +592,10 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 	if (fcntl(set->epoll_fd, F_SETFD, FD_CLOEXEC) == -1)
 		elog(ERROR, "fcntl(F_SETFD) failed on epoll descriptor: %m");
 #endif							/* EPOLL_CLOEXEC */
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_fd = kqueue();
+	if (set->kqueue_fd < 0)
+		elog(ERROR, "kqueue failed: %m");
 #elif defined(WAIT_USE_WIN32)
 
 	/*
@@ -608,6 +628,8 @@ FreeWaitEventSet(WaitEventSet *set)
 {
 #if defined(WAIT_USE_EPOLL)
 	close(set->epoll_fd);
+#elif defined(WAIT_USE_KQUEUE)
+	close(set->kqueue_fd);
 #elif defined(WAIT_USE_WIN32)
 	WaitEvent  *cur_event;
 
@@ -717,6 +739,8 @@ AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch,
 	/* perform wait primitive specific initialization, if needed */
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_ADD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, 0);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -736,10 +760,16 @@ void
 ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 {
 	WaitEvent  *event;
+#if defined(WAIT_USE_KQUEUE)
+	int old_events;
+#endif
 
 	Assert(pos < set->nevents);
 
 	event = &set->events[pos];
+#if defined(WAIT_USE_KQUEUE)
+	old_events = event->events;
+#endif
 
 	/*
 	 * If neither the event mask nor the associated latch changes, return
@@ -773,6 +803,8 @@ ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_MOD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, old_events);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -863,6 +895,127 @@ WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event)
 }
 #endif
 
+#if defined(WAIT_USE_KQUEUE)
+
+static inline void
+WaitEventAdjustKqueueAdd(struct kevent *k_ev, int filter, int action,
+						 WaitEvent *event)
+{
+	k_ev->ident = event->fd;
+	k_ev->filter = filter;
+	k_ev->flags = action | EV_CLEAR;
+	k_ev->fflags = 0;
+	k_ev->data = 0;
+
+	/*
+	 * On most BSD family systems, udata is of type void * so we could simply
+	 * assign event to it without casting, or use the EV_SET macro instead of
+	 * filling in the struct manually.  Unfortunately, NetBSD and possibly
+	 * others have it as intptr_t, so here we wallpaper over that difference
+	 * with an unsightly lvalue cast.
+	 */
+	*((WaitEvent **)(&k_ev->udata)) = event;
+}
+
+static inline void
+WaitEventAdjustKqueueAddPostmaster(struct kevent *k_ev, WaitEvent *event)
+{
+	/* For now postmaster death can only be added, not removed. */
+	k_ev->ident = PostmasterPid;
+	k_ev->filter = EVFILT_PROC;
+	k_ev->flags = EV_ADD | EV_CLEAR;
+	k_ev->fflags = NOTE_EXIT;
+	k_ev->data = 0;
+	*((WaitEvent **)(&k_ev->udata)) = event;
+}
+
+/*
+ * old_events is the previous event mask, used to compute what has changed.
+ */
+static void
+WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events)
+{
+	int rc;
+	struct kevent k_ev[2];
+	int count = 0;
+	bool new_filt_read = false;
+	bool old_filt_read = false;
+	bool new_filt_write = false;
+	bool old_filt_write = false;
+
+	if (old_events == event->events)
+		return;
+
+	Assert(event->events != WL_LATCH_SET || set->latch != NULL);
+	Assert(event->events == WL_LATCH_SET ||
+		   event->events == WL_POSTMASTER_DEATH ||
+		   (event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)));
+
+	if (event->events == WL_POSTMASTER_DEATH)
+	{
+		/*
+		 * Unlike all the other implementations, we detect postmaster death
+		 * using process notification instead of waiting on the postmaster
+		 * alive pipe.
+		 */
+		WaitEventAdjustKqueueAddPostmaster(&k_ev[count++], event);
+	}
+	else
+	{
+		/*
+		 * We need to compute the adds and deletes required to get from the
+		 * old event mask to the new event mask, since kevent treats readable
+		 * and writable as separate events.
+		 */
+		if (old_events == WL_LATCH_SET ||
+			(old_events & WL_SOCKET_READABLE))
+				old_filt_read = true;
+		if (event->events == WL_LATCH_SET ||
+			event->events == WL_POSTMASTER_DEATH ||
+			(event->events & WL_SOCKET_READABLE))
+			new_filt_read = true;
+		if (old_events & WL_SOCKET_WRITEABLE)
+			old_filt_write = true;
+		if (event->events & WL_SOCKET_WRITEABLE)
+			new_filt_write = true;
+		if (old_filt_read && !new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_DELETE,
+									 event);
+		else if (!old_filt_read && new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_ADD,
+									 event);
+		if (old_filt_write && !new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_DELETE,
+									 event);
+		else if (!old_filt_write && new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_ADD,
+									 event);
+	}
+
+	Assert(count > 0);
+	Assert(count <= 2);
+
+	rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+
+	if (rc < 0 && event->events == WL_POSTMASTER_DEATH && errno == ESRCH)
+	{
+		/*
+		 * The postmaster is already dead.  Defer reporting this to the caller
+		 * until wait time, for compatibility with the other implementations.
+		 * To do that we will now add the regular alive pipe.
+		 */
+		WaitEventAdjustKqueueAdd(&k_ev[0], EVFILT_READ, EV_ADD, event);
+		rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+	}
+
+	if (rc < 0)
+		ereport(ERROR,
+				(errcode_for_socket_access(),
+				 errmsg("kevent() failed: %m")));
+}
+
+#endif
+
 #if defined(WAIT_USE_WIN32)
 static void
 WaitEventAdjustWin32(WaitEventSet *set, WaitEvent *event)
@@ -1150,6 +1303,142 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
 	return returned_events;
 }
 
+#elif defined(WAIT_USE_KQUEUE)
+
+/*
+ * Wait using FreeBSD kqueue(2)/kevent(2).  Also available on other BSD-family
+ * systems including macOS.
+ *
+ * This is the preferrable wait method for systems that have it, as several
+ * readiness notifications are delivered, without having to iterate through
+ * all of set->events.
+ *
+ * For now this mirrors the epoll code, but in future it could modify the fd
+ * set in the same call to kevent as it uses for waiting instead of doing that
+ * with separate system calls.
+ */
+static int
+WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
+					  WaitEvent *occurred_events, int nevents)
+{
+	int			returned_events = 0;
+	int			rc;
+	WaitEvent  *cur_event;
+	struct kevent *cur_kqueue_event;
+	struct timespec timeout;
+	struct timespec *timeout_p;
+
+	if (cur_timeout < 0)
+		timeout_p = NULL;
+	else
+	{
+		timeout.tv_sec = cur_timeout / 1000;
+		timeout.tv_nsec = (cur_timeout % 1000) * 1000000;
+		timeout_p = &timeout;
+	}
+
+	/* Sleep */
+	rc = kevent(set->kqueue_fd, NULL, 0,
+				set->kqueue_ret_events, nevents,
+				timeout_p);
+
+	/* Check return code */
+	if (rc < 0)
+	{
+		/* EINTR is okay, otherwise complain */
+		if (errno != EINTR)
+		{
+			waiting = false;
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed while trying to wait: %m")));
+		}
+		return 0;
+	}
+	else if (rc == 0)
+	{
+		/* timeout exceeded */
+		return -1;
+	}
+
+	/*
+	 * At least one event occurred, iterate over the returned kqueue events
+	 * until they're either all processed, or we've returned all the events
+	 * the caller desired.
+	 */
+	for (cur_kqueue_event = set->kqueue_ret_events;
+		 cur_kqueue_event < (set->kqueue_ret_events + rc) &&
+		 returned_events < nevents;
+		 cur_kqueue_event++)
+	{
+		/* kevent's data pointer is set to the associated WaitEvent */
+		cur_event = (WaitEvent *) cur_kqueue_event->udata;
+
+		occurred_events->pos = cur_event->pos;
+		occurred_events->user_data = cur_event->user_data;
+		occurred_events->events = 0;
+
+		if (cur_event->events == WL_LATCH_SET &&
+			cur_kqueue_event->filter == EVFILT_READ)
+		{
+			/* There's data in the self-pipe, clear it. */
+			drainSelfPipe();
+
+			if (set->latch->is_set)
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_LATCH_SET;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events == WL_POSTMASTER_DEATH &&
+				 ((cur_kqueue_event->filter == EVFILT_PROC &&
+				   (cur_kqueue_event->fflags & NOTE_EXIT) != 0) ||
+				  cur_kqueue_event->filter == EVFILT_READ))
+		{
+			/*
+			 * Postmaster death notification usually triggers filter
+			 * EVFILT_PROC.  But if the postmaster process was aready dead
+			 * when we tried to add it to the kqueue, then
+			 * WaitEventAdjustKqueue adds the alive pipe instead, which
+			 * triggers EVFILT_READ here when we try to wait.
+			 */
+			occurred_events->fd = PGINVALID_SOCKET;
+			occurred_events->events = WL_POSTMASTER_DEATH;
+			occurred_events++;
+			returned_events++;
+		}
+		else if (cur_event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE))
+		{
+			Assert(cur_event->fd >= 0);
+
+			if ((cur_event->events & WL_SOCKET_READABLE) &&
+				(cur_kqueue_event->filter == EVFILT_READ))
+			{
+				/* readable, or EOF */
+				occurred_events->events |= WL_SOCKET_READABLE;
+			}
+
+			if ((cur_event->events & WL_SOCKET_WRITEABLE) &&
+				(cur_kqueue_event->filter == EVFILT_WRITE))
+			{
+				/* writable, or EOF */
+				occurred_events->events |= WL_SOCKET_WRITEABLE;
+			}
+
+			if (occurred_events->events != 0)
+			{
+				occurred_events->fd = cur_event->fd;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+	}
+
+	return returned_events;
+}
+
 #elif defined(WAIT_USE_POLL)
 
 /*
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 84d59f12b23..11a365a54f6 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -304,6 +304,9 @@
 /* Define to 1 if you have isinf(). */
 #undef HAVE_ISINF
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 #undef HAVE_LANGINFO_H
 
@@ -563,6 +566,9 @@
 /* Define to 1 if you have the <sys/epoll.h> header file. */
 #undef HAVE_SYS_EPOLL_H
 
+/* Define to 1 if you have the <sys/event.h> header file. */
+#undef HAVE_SYS_EVENT_H
+
 /* Define to 1 if you have the <sys/ipc.h> header file. */
 #undef HAVE_SYS_IPC_H
 
-- 
2.15.0

#48Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Thomas Munro (#47)
1 attachment(s)
Re: [HACKERS] kqueue

On Wed, Dec 6, 2017 at 12:53 AM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On Thu, Jun 22, 2017 at 7:19 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

I don't plan to resubmit this patch myself, but I was doing some
spring cleaning and rebasing today and I figured it might be worth
quietly leaving a working patch here just in case anyone from the
various BSD communities is interested in taking the idea further.

I heard through the grapevine of some people currently investigating
performance problems on busy FreeBSD systems, possibly related to the
postmaster pipe. I suspect this patch might be a part of the solution
(other patches probably needed to get maximum value out of this patch:
reuse WaitEventSet objects in some key places, and get rid of high
frequency PostmasterIsAlive() read() calls). The autoconf-fu in the
last version bit-rotted so it seemed like a good time to post a
rebased patch.

--
Thomas Munro
http://www.enterprisedb.com

Attachments:

kqueue-v9.patchapplication/octet-stream; name=kqueue-v9.patchDownload
From 267fc92a177f4fbf79603f8b9c63d21fab4e244a Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@enterprisedb.com>
Date: Thu, 22 Jun 2017 18:40:27 +1200
Subject: [PATCH] Add kqueue support to WaitEventSet.

Add a kqueue based implementation of WaitEventSet for use on BSD-family
operating systems including FreeBSD, NetBSD, OpenBSD and macOS.  This is
similar to the epoll implementation for Linux systems in that the set of
kernel objects to monitor can be set up once and then reused, allowing for
more efficient IO multiplexing than poll().

Author: Thomas Munro
Reviewed-By: Marko Tiikkaja
Tested-By: Matteo Beccati, Keith Fiske, Heikki Linnakangas
Discussion: https://postgr.es/m/CAEepm%3D37oF84-iXDTQ9MrGjENwVGds%2B5zTr38ca73kWR7ez_tA%40mail.gmail.com
---
 configure                       |   4 +-
 configure.in                    |   4 +-
 src/backend/storage/ipc/latch.c | 291 +++++++++++++++++++++++++++++++++++++++-
 src/include/pg_config.h.in      |   6 +
 4 files changed, 300 insertions(+), 5 deletions(-)

diff --git a/configure b/configure
index 56f18dfbc26..3c21d26cff6 100755
--- a/configure
+++ b/configure
@@ -12406,7 +12406,7 @@ $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h
 fi
 
 
-for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/ipc.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
+for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -14827,7 +14827,7 @@ fi
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-for ac_func in cbrt clock_gettime dlopen fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll posix_fallocate pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range utime utimes wcstombs_l
+for ac_func in cbrt clock_gettime dlopen fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll posix_fallocate pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range utime utimes wcstombs_l
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
diff --git a/configure.in b/configure.in
index da02a56ec66..11893e980d8 100644
--- a/configure.in
+++ b/configure.in
@@ -1248,7 +1248,7 @@ AC_SUBST(UUID_LIBS)
 
 AC_HEADER_STDBOOL
 
-AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/ipc.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
+AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
 
 # On BSD, test for net/if.h will fail unless sys/socket.h
 # is included first.
@@ -1528,7 +1528,7 @@ PGAC_FUNC_WCSTOMBS_L
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-AC_CHECK_FUNCS([cbrt clock_gettime dlopen fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll posix_fallocate pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range utime utimes wcstombs_l])
+AC_CHECK_FUNCS([cbrt clock_gettime dlopen fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll posix_fallocate pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range utime utimes wcstombs_l])
 
 AC_REPLACE_FUNCS(fseeko)
 case $host_os in
diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c
index e6706f7fb80..e5c63ac1ec7 100644
--- a/src/backend/storage/ipc/latch.c
+++ b/src/backend/storage/ipc/latch.c
@@ -39,6 +39,9 @@
 #ifdef HAVE_SYS_EPOLL_H
 #include <sys/epoll.h>
 #endif
+#ifdef HAVE_SYS_EVENT_H
+#include <sys/event.h>
+#endif
 #ifdef HAVE_POLL_H
 #include <poll.h>
 #endif
@@ -59,10 +62,12 @@
  * define somewhere before this block.
  */
 #if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_POLL) || \
-	defined(WAIT_USE_WIN32)
+	defined(WAIT_USE_KQUEUE) || defined(WAIT_USE_WIN32)
 /* don't overwrite manual choice */
 #elif defined(HAVE_SYS_EPOLL_H)
 #define WAIT_USE_EPOLL
+#elif defined(HAVE_KQUEUE)
+#define WAIT_USE_KQUEUE
 #elif defined(HAVE_POLL)
 #define WAIT_USE_POLL
 #elif WIN32
@@ -96,6 +101,10 @@ struct WaitEventSet
 	int			epoll_fd;
 	/* epoll_wait returns events in a user provided arrays, allocate once */
 	struct epoll_event *epoll_ret_events;
+#elif defined(WAIT_USE_KQUEUE)
+	int			kqueue_fd;
+	/* kevent returns events in a user provided arrays, allocate once */
+	struct kevent *kqueue_ret_events;
 #elif defined(WAIT_USE_POLL)
 	/* poll expects events to be waited on every poll() call, prepare once */
 	struct pollfd *pollfds;
@@ -128,6 +137,8 @@ static void drainSelfPipe(void);
 
 #if defined(WAIT_USE_EPOLL)
 static void WaitEventAdjustEpoll(WaitEventSet *set, WaitEvent *event, int action);
+#elif defined(WAIT_USE_KQUEUE)
+static void WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events);
 #elif defined(WAIT_USE_POLL)
 static void WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event);
 #elif defined(WAIT_USE_WIN32)
@@ -534,6 +545,8 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 
 #if defined(WAIT_USE_EPOLL)
 	sz += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	sz += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	sz += MAXALIGN(sizeof(struct pollfd) * nevents);
 #elif defined(WAIT_USE_WIN32)
@@ -552,6 +565,9 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 #if defined(WAIT_USE_EPOLL)
 	set->epoll_ret_events = (struct epoll_event *) data;
 	data += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_ret_events = (struct kevent *) data;
+	data += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	set->pollfds = (struct pollfd *) data;
 	data += MAXALIGN(sizeof(struct pollfd) * nevents);
@@ -576,6 +592,10 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 	if (fcntl(set->epoll_fd, F_SETFD, FD_CLOEXEC) == -1)
 		elog(ERROR, "fcntl(F_SETFD) failed on epoll descriptor: %m");
 #endif							/* EPOLL_CLOEXEC */
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_fd = kqueue();
+	if (set->kqueue_fd < 0)
+		elog(ERROR, "kqueue failed: %m");
 #elif defined(WAIT_USE_WIN32)
 
 	/*
@@ -608,6 +628,8 @@ FreeWaitEventSet(WaitEventSet *set)
 {
 #if defined(WAIT_USE_EPOLL)
 	close(set->epoll_fd);
+#elif defined(WAIT_USE_KQUEUE)
+	close(set->kqueue_fd);
 #elif defined(WAIT_USE_WIN32)
 	WaitEvent  *cur_event;
 
@@ -717,6 +739,8 @@ AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch,
 	/* perform wait primitive specific initialization, if needed */
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_ADD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, 0);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -736,10 +760,16 @@ void
 ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 {
 	WaitEvent  *event;
+#if defined(WAIT_USE_KQUEUE)
+	int old_events;
+#endif
 
 	Assert(pos < set->nevents);
 
 	event = &set->events[pos];
+#if defined(WAIT_USE_KQUEUE)
+	old_events = event->events;
+#endif
 
 	/*
 	 * If neither the event mask nor the associated latch changes, return
@@ -773,6 +803,8 @@ ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_MOD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, old_events);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -863,6 +895,127 @@ WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event)
 }
 #endif
 
+#if defined(WAIT_USE_KQUEUE)
+
+static inline void
+WaitEventAdjustKqueueAdd(struct kevent *k_ev, int filter, int action,
+						 WaitEvent *event)
+{
+	k_ev->ident = event->fd;
+	k_ev->filter = filter;
+	k_ev->flags = action | EV_CLEAR;
+	k_ev->fflags = 0;
+	k_ev->data = 0;
+
+	/*
+	 * On most BSD family systems, udata is of type void * so we could simply
+	 * assign event to it without casting, or use the EV_SET macro instead of
+	 * filling in the struct manually.  Unfortunately, NetBSD and possibly
+	 * others have it as intptr_t, so here we wallpaper over that difference
+	 * with an unsightly lvalue cast.
+	 */
+	*((WaitEvent **)(&k_ev->udata)) = event;
+}
+
+static inline void
+WaitEventAdjustKqueueAddPostmaster(struct kevent *k_ev, WaitEvent *event)
+{
+	/* For now postmaster death can only be added, not removed. */
+	k_ev->ident = PostmasterPid;
+	k_ev->filter = EVFILT_PROC;
+	k_ev->flags = EV_ADD | EV_CLEAR;
+	k_ev->fflags = NOTE_EXIT;
+	k_ev->data = 0;
+	*((WaitEvent **)(&k_ev->udata)) = event;
+}
+
+/*
+ * old_events is the previous event mask, used to compute what has changed.
+ */
+static void
+WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events)
+{
+	int rc;
+	struct kevent k_ev[2];
+	int count = 0;
+	bool new_filt_read = false;
+	bool old_filt_read = false;
+	bool new_filt_write = false;
+	bool old_filt_write = false;
+
+	if (old_events == event->events)
+		return;
+
+	Assert(event->events != WL_LATCH_SET || set->latch != NULL);
+	Assert(event->events == WL_LATCH_SET ||
+		   event->events == WL_POSTMASTER_DEATH ||
+		   (event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)));
+
+	if (event->events == WL_POSTMASTER_DEATH)
+	{
+		/*
+		 * Unlike all the other implementations, we detect postmaster death
+		 * using process notification instead of waiting on the postmaster
+		 * alive pipe.
+		 */
+		WaitEventAdjustKqueueAddPostmaster(&k_ev[count++], event);
+	}
+	else
+	{
+		/*
+		 * We need to compute the adds and deletes required to get from the
+		 * old event mask to the new event mask, since kevent treats readable
+		 * and writable as separate events.
+		 */
+		if (old_events == WL_LATCH_SET ||
+			(old_events & WL_SOCKET_READABLE))
+				old_filt_read = true;
+		if (event->events == WL_LATCH_SET ||
+			event->events == WL_POSTMASTER_DEATH ||
+			(event->events & WL_SOCKET_READABLE))
+			new_filt_read = true;
+		if (old_events & WL_SOCKET_WRITEABLE)
+			old_filt_write = true;
+		if (event->events & WL_SOCKET_WRITEABLE)
+			new_filt_write = true;
+		if (old_filt_read && !new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_DELETE,
+									 event);
+		else if (!old_filt_read && new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_ADD,
+									 event);
+		if (old_filt_write && !new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_DELETE,
+									 event);
+		else if (!old_filt_write && new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_ADD,
+									 event);
+	}
+
+	Assert(count > 0);
+	Assert(count <= 2);
+
+	rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+
+	if (rc < 0 && event->events == WL_POSTMASTER_DEATH && errno == ESRCH)
+	{
+		/*
+		 * The postmaster is already dead.  Defer reporting this to the caller
+		 * until wait time, for compatibility with the other implementations.
+		 * To do that we will now add the regular alive pipe.
+		 */
+		WaitEventAdjustKqueueAdd(&k_ev[0], EVFILT_READ, EV_ADD, event);
+		rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+	}
+
+	if (rc < 0)
+		ereport(ERROR,
+				(errcode_for_socket_access(),
+				 errmsg("kevent() failed: %m")));
+}
+
+#endif
+
 #if defined(WAIT_USE_WIN32)
 static void
 WaitEventAdjustWin32(WaitEventSet *set, WaitEvent *event)
@@ -1150,6 +1303,142 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
 	return returned_events;
 }
 
+#elif defined(WAIT_USE_KQUEUE)
+
+/*
+ * Wait using FreeBSD kqueue(2)/kevent(2).  Also available on other BSD-family
+ * systems including macOS.
+ *
+ * This is the preferrable wait method for systems that have it, as several
+ * readiness notifications are delivered, without having to iterate through
+ * all of set->events.
+ *
+ * For now this mirrors the epoll code, but in future it could modify the fd
+ * set in the same call to kevent as it uses for waiting instead of doing that
+ * with separate system calls.
+ */
+static int
+WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
+					  WaitEvent *occurred_events, int nevents)
+{
+	int			returned_events = 0;
+	int			rc;
+	WaitEvent  *cur_event;
+	struct kevent *cur_kqueue_event;
+	struct timespec timeout;
+	struct timespec *timeout_p;
+
+	if (cur_timeout < 0)
+		timeout_p = NULL;
+	else
+	{
+		timeout.tv_sec = cur_timeout / 1000;
+		timeout.tv_nsec = (cur_timeout % 1000) * 1000000;
+		timeout_p = &timeout;
+	}
+
+	/* Sleep */
+	rc = kevent(set->kqueue_fd, NULL, 0,
+				set->kqueue_ret_events, nevents,
+				timeout_p);
+
+	/* Check return code */
+	if (rc < 0)
+	{
+		/* EINTR is okay, otherwise complain */
+		if (errno != EINTR)
+		{
+			waiting = false;
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed while trying to wait: %m")));
+		}
+		return 0;
+	}
+	else if (rc == 0)
+	{
+		/* timeout exceeded */
+		return -1;
+	}
+
+	/*
+	 * At least one event occurred, iterate over the returned kqueue events
+	 * until they're either all processed, or we've returned all the events
+	 * the caller desired.
+	 */
+	for (cur_kqueue_event = set->kqueue_ret_events;
+		 cur_kqueue_event < (set->kqueue_ret_events + rc) &&
+		 returned_events < nevents;
+		 cur_kqueue_event++)
+	{
+		/* kevent's data pointer is set to the associated WaitEvent */
+		cur_event = (WaitEvent *) cur_kqueue_event->udata;
+
+		occurred_events->pos = cur_event->pos;
+		occurred_events->user_data = cur_event->user_data;
+		occurred_events->events = 0;
+
+		if (cur_event->events == WL_LATCH_SET &&
+			cur_kqueue_event->filter == EVFILT_READ)
+		{
+			/* There's data in the self-pipe, clear it. */
+			drainSelfPipe();
+
+			if (set->latch->is_set)
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_LATCH_SET;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events == WL_POSTMASTER_DEATH &&
+				 ((cur_kqueue_event->filter == EVFILT_PROC &&
+				   (cur_kqueue_event->fflags & NOTE_EXIT) != 0) ||
+				  cur_kqueue_event->filter == EVFILT_READ))
+		{
+			/*
+			 * Postmaster death notification usually triggers filter
+			 * EVFILT_PROC.  But if the postmaster process was aready dead
+			 * when we tried to add it to the kqueue, then
+			 * WaitEventAdjustKqueue adds the alive pipe instead, which
+			 * triggers EVFILT_READ here when we try to wait.
+			 */
+			occurred_events->fd = PGINVALID_SOCKET;
+			occurred_events->events = WL_POSTMASTER_DEATH;
+			occurred_events++;
+			returned_events++;
+		}
+		else if (cur_event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE))
+		{
+			Assert(cur_event->fd >= 0);
+
+			if ((cur_event->events & WL_SOCKET_READABLE) &&
+				(cur_kqueue_event->filter == EVFILT_READ))
+			{
+				/* readable, or EOF */
+				occurred_events->events |= WL_SOCKET_READABLE;
+			}
+
+			if ((cur_event->events & WL_SOCKET_WRITEABLE) &&
+				(cur_kqueue_event->filter == EVFILT_WRITE))
+			{
+				/* writable, or EOF */
+				occurred_events->events |= WL_SOCKET_WRITEABLE;
+			}
+
+			if (occurred_events->events != 0)
+			{
+				occurred_events->fd = cur_event->fd;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+	}
+
+	return returned_events;
+}
+
 #elif defined(WAIT_USE_POLL)
 
 /*
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index f3620231a71..16a95cf24dc 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -323,6 +323,9 @@
 /* Define to 1 if you have isinf(). */
 #undef HAVE_ISINF
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 #undef HAVE_LANGINFO_H
 
@@ -591,6 +594,9 @@
 /* Define to 1 if you have the <sys/epoll.h> header file. */
 #undef HAVE_SYS_EPOLL_H
 
+/* Define to 1 if you have the <sys/event.h> header file. */
+#undef HAVE_SYS_EVENT_H
+
 /* Define to 1 if you have the <sys/ipc.h> header file. */
 #undef HAVE_SYS_IPC_H
 
-- 
2.16.2

#49Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Thomas Munro (#48)
Re: [HACKERS] kqueue

On Wed, Apr 11, 2018 at 1:05 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

I heard through the grapevine of some people currently investigating
performance problems on busy FreeBSD systems, possibly related to the
postmaster pipe. I suspect this patch might be a part of the solution
(other patches probably needed to get maximum value out of this patch:
reuse WaitEventSet objects in some key places, and get rid of high
frequency PostmasterIsAlive() read() calls). The autoconf-fu in the
last version bit-rotted so it seemed like a good time to post a
rebased patch.

Once I knew how to get a message resent to someone who wasn't
subscribed to our mailing list at the time it was sent[1]/messages/by-id/CAEepm=0-KsV4Sj-0Qd4rMCg7UYdOQA=TUjLkEZOX7h_qiQQaCA@mail.gmail.com so they
could join an existing thread. I don't know how to do that with the
new mailing list software, so I'm CC'ing Mateusz so he can share his
results on-thread. Sorry for the noise.

[1]: /messages/by-id/CAEepm=0-KsV4Sj-0Qd4rMCg7UYdOQA=TUjLkEZOX7h_qiQQaCA@mail.gmail.com

--
Thomas Munro
http://www.enterprisedb.com

#50Mateusz Guzik
mjguzik@gmail.com
In reply to: Thomas Munro (#49)
Re: [HACKERS] kqueue

On Mon, May 21, 2018 at 9:03 AM, Thomas Munro <thomas.munro@enterprisedb.com

wrote:

On Wed, Apr 11, 2018 at 1:05 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

I heard through the grapevine of some people currently investigating
performance problems on busy FreeBSD systems, possibly related to the
postmaster pipe. I suspect this patch might be a part of the solution
(other patches probably needed to get maximum value out of this patch:
reuse WaitEventSet objects in some key places, and get rid of high
frequency PostmasterIsAlive() read() calls). The autoconf-fu in the
last version bit-rotted so it seemed like a good time to post a
rebased patch.

Hi everyone,

I have benchmarked the change on a FreeBSD box and found an big
performance win once the number of clients goes beyond the number of
hardware threads on the target machine. For smaller number of clients
the win was very modest.

The test was performed few weeks ago.

For convenience PostgreSQL 10.3 as found in the ports tree was used.

3 variants were tested:
- stock 10.3
- stock 10.3 + pdeathsig
- stock 10.3 + pdeathsig + kqueue

Appropriate patches were provided by Thomas.

In order to keep this message PG-13 I'm not going to show the actual
script, but a mere outline:

for i in $(seq 1 10): do
for t in vanilla pdeathsig pdeathsig_kqueue; do
start up the relevant version
for c in 32 64 96; do
pgbench -j 96 -c $c -T 120 -M prepared -S -U bench
-h 172.16.0.2 -P1 bench > ${t}-${c}-out-warmup 2>&1
pgbench -j 96 -c $c -T 120 -M prepared -S -U bench
-h 172.16.0.2 -P1 bench > ${t}-${c}-out 2>&1
done
shutdown the relevant version
done

Data from the warmup is not used. All the data was pre-read prior to the
test.

PostgreSQL was configured with 32GB of shared buffers and 200 max
connections, otherwise it was the default.

The server is:
Intel(R) Xeon(R) Gold 6134 CPU @ 3.20GHz
2 package(s) x 8 core(s) x 2 hardware threads

i.e. 32 threads in total.

running FreeBSD -head with 'options NUMA' in kernel config and
sysctl net.inet.tcp.per_cpu_timers=1 on top of zfs.

The load was generated from a different box over a 100Gbit ethernet link.

x cumulative-tps-vanilla-32
+ cumulative-tps-pdeathsig-32
* cumulative-tps-pdeathsig_kqueue-32
+------------------------------------------------------------------------+
|+   + x+*     x+  *  x       *        + * *       * * **  *  **        *|
|   |_____|__M_A___M_A_____|____|             |________MA________|       |
+------------------------------------------------------------------------+
    N           Min           Max        Median           Avg        Stddev
x  10     442898.77     448476.81     444805.17     445062.08     1679.7169
+  10      442057.2     447835.46     443840.28     444235.01     1771.2254
No difference proven at 95.0% confidence
*  10     448138.07     452786.41     450274.56     450311.51     1387.2927
Difference at 95.0% confidence
        5249.43 +/- 1447.41
        1.17948% +/- 0.327501%
        (Student's t, pooled s = 1540.46)
x cumulative-tps-vanilla-64
+ cumulative-tps-pdeathsig-64
* cumulative-tps-pdeathsig_kqueue-64
+------------------------------------------------------------------------+
|                                                                     ** |
|                                                                     ** |
|  xx  x +                                                            ***|
|++**x *+*++                                                          ***|
|  ||_A|M_|                                                           |A |
+------------------------------------------------------------------------+
    N           Min           Max        Median           Avg        Stddev
x  10     411849.26      422145.5     416043.77      416061.9     3763.2545
+  10     407123.74     425727.84     419908.73      417480.7     6817.5549
No difference proven at 95.0% confidence
*  10     542032.71     546106.93     543948.05     543874.06     1234.1788
Difference at 95.0% confidence
        127812 +/- 2631.31
        30.7195% +/- 0.809892%
        (Student's t, pooled s = 2800.47)
x cumulative-tps-vanilla-96
+ cumulative-tps-pdeathsig-96
* cumulative-tps-pdeathsig_kqueue-96
+------------------------------------------------------------------------+
|                                                                      * |
|                                                                      * |
|                                                                      * |
|                                                                      * |
|  + x                                                                 * |
|  *xxx+                                                               **|
|+ *****+                                                            * **|
|  |MA||                                                              |A||
+------------------------------------------------------------------------+
    N           Min           Max        Median           Avg        Stddev
x  10      325263.7        336338     332399.16     331321.82     3571.2478
+  10     321213.33     338669.66     329553.78     330903.58      5652.008
No difference proven at 95.0% confidence
*  10     503877.22     511449.96     508708.41     508808.51     2016.9483
Difference at 95.0% confidence
        177487 +/- 2724.98
        53.5693% +/- 1.17178%
        (Student's t, pooled s = 2900.16)

--
Mateusz Guzik <mjguzik gmail.com>

#51Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Mateusz Guzik (#50)
Re: [HACKERS] kqueue

On Mon, May 21, 2018 at 7:27 PM, Mateusz Guzik <mjguzik@gmail.com> wrote:

I have benchmarked the change on a FreeBSD box and found an big
performance win once the number of clients goes beyond the number of
hardware threads on the target machine. For smaller number of clients
the win was very modest.

Thanks for the report! This is good news for the patch, if we can
explain a few mysteries.

3 variants were tested:
- stock 10.3
- stock 10.3 + pdeathsig
- stock 10.3 + pdeathsig + kqueue

For the record, "pdeathsig" refers to another patch of mine[1]/messages/by-id/CAEepm=0w9AAHAH73-tkZ8VS2Lg6JzY4ii3TG7t-R+_MWyUAk9g@mail.gmail.com that is
not relevant to this test (it's a small change in the recovery loop,
important for replication but not even reached here).

[a bunch of neat output from ministat]

So to summarise your results:

32 connections: ~445k -> ~450k = +1.2%
64 connections: ~416k -> ~544k = +30.7%
96 connections: ~331k -> ~508k = +53.6%

As you added more connections above your thread count, stock 10.3's
TPS number went down, but with the patch it went up. So now we have
to explain why you see a huge performance boost but others reported a
modest gain or in some cases loss. The main things that jump out:

1. You used TCP sockets and ran pgbench on another machine, while
others used Unix domain sockets.
2. You're running a newer/bleeding edge kernel.
3. You used more CPUs than most reporters.

For the record, Mateusz and others discovered some fixable global lock
contention in the Unix domain socket layer that is now being hacked
on[2]https://reviews.freebsd.org/D15430, though it's not clear if that'd affect the results reported
earlier or not.

[1]: /messages/by-id/CAEepm=0w9AAHAH73-tkZ8VS2Lg6JzY4ii3TG7t-R+_MWyUAk9g@mail.gmail.com
[2]: https://reviews.freebsd.org/D15430

--
Thomas Munro
http://www.enterprisedb.com

#52Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Thomas Munro (#51)
1 attachment(s)
Re: [HACKERS] kqueue

On Tue, May 22, 2018 at 12:07 PM Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On Mon, May 21, 2018 at 7:27 PM, Mateusz Guzik <mjguzik@gmail.com> wrote:

I have benchmarked the change on a FreeBSD box and found an big
performance win once the number of clients goes beyond the number of
hardware threads on the target machine. For smaller number of clients
the win was very modest.

So to summarise your results:

32 connections: ~445k -> ~450k = +1.2%
64 connections: ~416k -> ~544k = +30.7%
96 connections: ~331k -> ~508k = +53.6%

I would like to commit this patch for PostgreSQL 12, based on this
report. We know it helps performance on macOS developer machines and
big FreeBSD servers, and it is the right kernel interface for the job
on principle. Matteo Beccati reported a 5-10% performance drop on a
low-end Celeron NetBSD box which we have no explanation for, and we
have no reports from server-class machines on that OS -- so perhaps we
(or the NetBSD port?) should consider building with WAIT_USE_POLL on
NetBSD until someone can figure out what needs to be fixed there
(possibly on the NetBSD side)?

Here's a rebased patch, which I'm adding to the to November CF to give
people time to retest, object, etc if they want to.

--
Thomas Munro
http://www.enterprisedb.com

Attachments:

0001-Add-kqueue-support-to-WaitEventSet-v10.patchapplication/octet-stream; name=0001-Add-kqueue-support-to-WaitEventSet-v10.patchDownload
From b1ed3c11c5457a37b2e1de7fba0f50b6b5d7b8e9 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@enterprisedb.com>
Date: Thu, 22 Jun 2017 18:40:27 +1200
Subject: [PATCH] Add kqueue support to WaitEventSet.

Add a kqueue based implementation of WaitEventSet for use on BSD-family
operating systems including FreeBSD, NetBSD, OpenBSD and macOS.  This is
similar to the epoll implementation for Linux systems in that the set of
kernel objects to monitor can be set up once and then reused, allowing for
more efficient IO multiplexing than poll().

Author: Thomas Munro
Reviewed-By: Marko Tiikkaja
Tested-By: Mateusz Guzik, Matteo Beccati, Keith Fiske, Heikki Linnakangas
Discussion: https://postgr.es/m/CAEepm%3D37oF84-iXDTQ9MrGjENwVGds%2B5zTr38ca73kWR7ez_tA%40mail.gmail.com
---
 configure                       |   4 +-
 configure.in                    |   4 +-
 src/backend/storage/ipc/latch.c | 291 +++++++++++++++++++++++++++++++-
 src/include/pg_config.h.in      |   6 +
 4 files changed, 300 insertions(+), 5 deletions(-)

diff --git a/configure b/configure
index 6414ec1ea6d..ec9db016017 100755
--- a/configure
+++ b/configure
@@ -12711,7 +12711,7 @@ $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h
 fi
 
 
-for ac_header in atomic.h crypt.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/ipc.h sys/prctl.h sys/procctl.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
+for ac_header in atomic.h crypt.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/prctl.h sys/procctl.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -15100,7 +15100,7 @@ fi
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-for ac_func in cbrt clock_gettime fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink setproctitle setproctitle_fast setsid shm_open symlink sync_file_range utime utimes wcstombs_l
+for ac_func in cbrt clock_gettime fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l kqueue memmove poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink setproctitle setproctitle_fast setsid shm_open symlink sync_file_range utime utimes wcstombs_l
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
diff --git a/configure.in b/configure.in
index 158d5a1ac82..bfb78124d72 100644
--- a/configure.in
+++ b/configure.in
@@ -1292,7 +1292,7 @@ AC_SUBST(UUID_LIBS)
 
 AC_HEADER_STDBOOL
 
-AC_CHECK_HEADERS([atomic.h crypt.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/ipc.h sys/prctl.h sys/procctl.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
+AC_CHECK_HEADERS([atomic.h crypt.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/prctl.h sys/procctl.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
 
 # On BSD, test for net/if.h will fail unless sys/socket.h
 # is included first.
@@ -1571,7 +1571,7 @@ PGAC_FUNC_WCSTOMBS_L
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-AC_CHECK_FUNCS([cbrt clock_gettime fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink setproctitle setproctitle_fast setsid shm_open symlink sync_file_range utime utimes wcstombs_l])
+AC_CHECK_FUNCS([cbrt clock_gettime fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l kqueue memmove poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink setproctitle setproctitle_fast setsid shm_open symlink sync_file_range utime utimes wcstombs_l])
 
 AC_REPLACE_FUNCS(fseeko)
 case $host_os in
diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c
index f6dda9cc9ac..14af4fbd598 100644
--- a/src/backend/storage/ipc/latch.c
+++ b/src/backend/storage/ipc/latch.c
@@ -39,6 +39,9 @@
 #ifdef HAVE_SYS_EPOLL_H
 #include <sys/epoll.h>
 #endif
+#ifdef HAVE_SYS_EVENT_H
+#include <sys/event.h>
+#endif
 #ifdef HAVE_POLL_H
 #include <poll.h>
 #endif
@@ -59,10 +62,12 @@
  * define somewhere before this block.
  */
 #if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_POLL) || \
-	defined(WAIT_USE_WIN32)
+	defined(WAIT_USE_KQUEUE) || defined(WAIT_USE_WIN32)
 /* don't overwrite manual choice */
 #elif defined(HAVE_SYS_EPOLL_H)
 #define WAIT_USE_EPOLL
+#elif defined(HAVE_KQUEUE)
+#define WAIT_USE_KQUEUE
 #elif defined(HAVE_POLL)
 #define WAIT_USE_POLL
 #elif WIN32
@@ -96,6 +101,10 @@ struct WaitEventSet
 	int			epoll_fd;
 	/* epoll_wait returns events in a user provided arrays, allocate once */
 	struct epoll_event *epoll_ret_events;
+#elif defined(WAIT_USE_KQUEUE)
+	int			kqueue_fd;
+	/* kevent returns events in a user provided arrays, allocate once */
+	struct kevent *kqueue_ret_events;
 #elif defined(WAIT_USE_POLL)
 	/* poll expects events to be waited on every poll() call, prepare once */
 	struct pollfd *pollfds;
@@ -128,6 +137,8 @@ static void drainSelfPipe(void);
 
 #if defined(WAIT_USE_EPOLL)
 static void WaitEventAdjustEpoll(WaitEventSet *set, WaitEvent *event, int action);
+#elif defined(WAIT_USE_KQUEUE)
+static void WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events);
 #elif defined(WAIT_USE_POLL)
 static void WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event);
 #elif defined(WAIT_USE_WIN32)
@@ -534,6 +545,8 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 
 #if defined(WAIT_USE_EPOLL)
 	sz += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	sz += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	sz += MAXALIGN(sizeof(struct pollfd) * nevents);
 #elif defined(WAIT_USE_WIN32)
@@ -552,6 +565,9 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 #if defined(WAIT_USE_EPOLL)
 	set->epoll_ret_events = (struct epoll_event *) data;
 	data += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_ret_events = (struct kevent *) data;
+	data += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	set->pollfds = (struct pollfd *) data;
 	data += MAXALIGN(sizeof(struct pollfd) * nevents);
@@ -576,6 +592,10 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 	if (fcntl(set->epoll_fd, F_SETFD, FD_CLOEXEC) == -1)
 		elog(ERROR, "fcntl(F_SETFD) failed on epoll descriptor: %m");
 #endif							/* EPOLL_CLOEXEC */
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_fd = kqueue();
+	if (set->kqueue_fd < 0)
+		elog(ERROR, "kqueue failed: %m");
 #elif defined(WAIT_USE_WIN32)
 
 	/*
@@ -608,6 +628,8 @@ FreeWaitEventSet(WaitEventSet *set)
 {
 #if defined(WAIT_USE_EPOLL)
 	close(set->epoll_fd);
+#elif defined(WAIT_USE_KQUEUE)
+	close(set->kqueue_fd);
 #elif defined(WAIT_USE_WIN32)
 	WaitEvent  *cur_event;
 
@@ -717,6 +739,8 @@ AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch,
 	/* perform wait primitive specific initialization, if needed */
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_ADD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, 0);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -736,10 +760,16 @@ void
 ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 {
 	WaitEvent  *event;
+#if defined(WAIT_USE_KQUEUE)
+	int old_events;
+#endif
 
 	Assert(pos < set->nevents);
 
 	event = &set->events[pos];
+#if defined(WAIT_USE_KQUEUE)
+	old_events = event->events;
+#endif
 
 	/*
 	 * If neither the event mask nor the associated latch changes, return
@@ -773,6 +803,8 @@ ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_MOD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, old_events);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -863,6 +895,127 @@ WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event)
 }
 #endif
 
+#if defined(WAIT_USE_KQUEUE)
+
+static inline void
+WaitEventAdjustKqueueAdd(struct kevent *k_ev, int filter, int action,
+						 WaitEvent *event)
+{
+	k_ev->ident = event->fd;
+	k_ev->filter = filter;
+	k_ev->flags = action | EV_CLEAR;
+	k_ev->fflags = 0;
+	k_ev->data = 0;
+
+	/*
+	 * On most BSD family systems, udata is of type void * so we could simply
+	 * assign event to it without casting, or use the EV_SET macro instead of
+	 * filling in the struct manually.  Unfortunately, NetBSD and possibly
+	 * others have it as intptr_t, so here we wallpaper over that difference
+	 * with an unsightly lvalue cast.
+	 */
+	*((WaitEvent **)(&k_ev->udata)) = event;
+}
+
+static inline void
+WaitEventAdjustKqueueAddPostmaster(struct kevent *k_ev, WaitEvent *event)
+{
+	/* For now postmaster death can only be added, not removed. */
+	k_ev->ident = PostmasterPid;
+	k_ev->filter = EVFILT_PROC;
+	k_ev->flags = EV_ADD | EV_CLEAR;
+	k_ev->fflags = NOTE_EXIT;
+	k_ev->data = 0;
+	*((WaitEvent **)(&k_ev->udata)) = event;
+}
+
+/*
+ * old_events is the previous event mask, used to compute what has changed.
+ */
+static void
+WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events)
+{
+	int rc;
+	struct kevent k_ev[2];
+	int count = 0;
+	bool new_filt_read = false;
+	bool old_filt_read = false;
+	bool new_filt_write = false;
+	bool old_filt_write = false;
+
+	if (old_events == event->events)
+		return;
+
+	Assert(event->events != WL_LATCH_SET || set->latch != NULL);
+	Assert(event->events == WL_LATCH_SET ||
+		   event->events == WL_POSTMASTER_DEATH ||
+		   (event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)));
+
+	if (event->events == WL_POSTMASTER_DEATH)
+	{
+		/*
+		 * Unlike all the other implementations, we detect postmaster death
+		 * using process notification instead of waiting on the postmaster
+		 * alive pipe.
+		 */
+		WaitEventAdjustKqueueAddPostmaster(&k_ev[count++], event);
+	}
+	else
+	{
+		/*
+		 * We need to compute the adds and deletes required to get from the
+		 * old event mask to the new event mask, since kevent treats readable
+		 * and writable as separate events.
+		 */
+		if (old_events == WL_LATCH_SET ||
+			(old_events & WL_SOCKET_READABLE))
+				old_filt_read = true;
+		if (event->events == WL_LATCH_SET ||
+			event->events == WL_POSTMASTER_DEATH ||
+			(event->events & WL_SOCKET_READABLE))
+			new_filt_read = true;
+		if (old_events & WL_SOCKET_WRITEABLE)
+			old_filt_write = true;
+		if (event->events & WL_SOCKET_WRITEABLE)
+			new_filt_write = true;
+		if (old_filt_read && !new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_DELETE,
+									 event);
+		else if (!old_filt_read && new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_ADD,
+									 event);
+		if (old_filt_write && !new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_DELETE,
+									 event);
+		else if (!old_filt_write && new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_ADD,
+									 event);
+	}
+
+	Assert(count > 0);
+	Assert(count <= 2);
+
+	rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+
+	if (rc < 0 && event->events == WL_POSTMASTER_DEATH && errno == ESRCH)
+	{
+		/*
+		 * The postmaster is already dead.  Defer reporting this to the caller
+		 * until wait time, for compatibility with the other implementations.
+		 * To do that we will now add the regular alive pipe.
+		 */
+		WaitEventAdjustKqueueAdd(&k_ev[0], EVFILT_READ, EV_ADD, event);
+		rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+	}
+
+	if (rc < 0)
+		ereport(ERROR,
+				(errcode_for_socket_access(),
+				 errmsg("kevent() failed: %m")));
+}
+
+#endif
+
 #if defined(WAIT_USE_WIN32)
 static void
 WaitEventAdjustWin32(WaitEventSet *set, WaitEvent *event)
@@ -1150,6 +1303,142 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
 	return returned_events;
 }
 
+#elif defined(WAIT_USE_KQUEUE)
+
+/*
+ * Wait using FreeBSD kqueue(2)/kevent(2).  Also available on other BSD-family
+ * systems including macOS.
+ *
+ * This is the preferrable wait method for systems that have it, as several
+ * readiness notifications are delivered, without having to iterate through
+ * all of set->events.
+ *
+ * For now this mirrors the epoll code, but in future it could modify the fd
+ * set in the same call to kevent as it uses for waiting instead of doing that
+ * with separate system calls.
+ */
+static int
+WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
+					  WaitEvent *occurred_events, int nevents)
+{
+	int			returned_events = 0;
+	int			rc;
+	WaitEvent  *cur_event;
+	struct kevent *cur_kqueue_event;
+	struct timespec timeout;
+	struct timespec *timeout_p;
+
+	if (cur_timeout < 0)
+		timeout_p = NULL;
+	else
+	{
+		timeout.tv_sec = cur_timeout / 1000;
+		timeout.tv_nsec = (cur_timeout % 1000) * 1000000;
+		timeout_p = &timeout;
+	}
+
+	/* Sleep */
+	rc = kevent(set->kqueue_fd, NULL, 0,
+				set->kqueue_ret_events, nevents,
+				timeout_p);
+
+	/* Check return code */
+	if (rc < 0)
+	{
+		/* EINTR is okay, otherwise complain */
+		if (errno != EINTR)
+		{
+			waiting = false;
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed while trying to wait: %m")));
+		}
+		return 0;
+	}
+	else if (rc == 0)
+	{
+		/* timeout exceeded */
+		return -1;
+	}
+
+	/*
+	 * At least one event occurred, iterate over the returned kqueue events
+	 * until they're either all processed, or we've returned all the events
+	 * the caller desired.
+	 */
+	for (cur_kqueue_event = set->kqueue_ret_events;
+		 cur_kqueue_event < (set->kqueue_ret_events + rc) &&
+		 returned_events < nevents;
+		 cur_kqueue_event++)
+	{
+		/* kevent's data pointer is set to the associated WaitEvent */
+		cur_event = (WaitEvent *) cur_kqueue_event->udata;
+
+		occurred_events->pos = cur_event->pos;
+		occurred_events->user_data = cur_event->user_data;
+		occurred_events->events = 0;
+
+		if (cur_event->events == WL_LATCH_SET &&
+			cur_kqueue_event->filter == EVFILT_READ)
+		{
+			/* There's data in the self-pipe, clear it. */
+			drainSelfPipe();
+
+			if (set->latch->is_set)
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_LATCH_SET;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events == WL_POSTMASTER_DEATH &&
+				 ((cur_kqueue_event->filter == EVFILT_PROC &&
+				   (cur_kqueue_event->fflags & NOTE_EXIT) != 0) ||
+				  cur_kqueue_event->filter == EVFILT_READ))
+		{
+			/*
+			 * Postmaster death notification usually triggers filter
+			 * EVFILT_PROC.  But if the postmaster process was aready dead
+			 * when we tried to add it to the kqueue, then
+			 * WaitEventAdjustKqueue adds the alive pipe instead, which
+			 * triggers EVFILT_READ here when we try to wait.
+			 */
+			occurred_events->fd = PGINVALID_SOCKET;
+			occurred_events->events = WL_POSTMASTER_DEATH;
+			occurred_events++;
+			returned_events++;
+		}
+		else if (cur_event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE))
+		{
+			Assert(cur_event->fd >= 0);
+
+			if ((cur_event->events & WL_SOCKET_READABLE) &&
+				(cur_kqueue_event->filter == EVFILT_READ))
+			{
+				/* readable, or EOF */
+				occurred_events->events |= WL_SOCKET_READABLE;
+			}
+
+			if ((cur_event->events & WL_SOCKET_WRITEABLE) &&
+				(cur_kqueue_event->filter == EVFILT_WRITE))
+			{
+				/* writable, or EOF */
+				occurred_events->events |= WL_SOCKET_WRITEABLE;
+			}
+
+			if (occurred_events->events != 0)
+			{
+				occurred_events->fd = cur_event->fd;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+	}
+
+	return returned_events;
+}
+
 #elif defined(WAIT_USE_POLL)
 
 /*
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 90dda8ea050..4bcabc3b381 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -330,6 +330,9 @@
 /* Define to 1 if you have isinf(). */
 #undef HAVE_ISINF
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 #undef HAVE_LANGINFO_H
 
@@ -598,6 +601,9 @@
 /* Define to 1 if you have the <sys/epoll.h> header file. */
 #undef HAVE_SYS_EPOLL_H
 
+/* Define to 1 if you have the <sys/event.h> header file. */
+#undef HAVE_SYS_EVENT_H
+
 /* Define to 1 if you have the <sys/ipc.h> header file. */
 #undef HAVE_SYS_IPC_H
 
-- 
2.17.1 (Apple Git-112)

#53Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#52)
Re: [HACKERS] kqueue

Hi,

On 2018-09-28 10:55:13 +1200, Thomas Munro wrote:

On Tue, May 22, 2018 at 12:07 PM Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On Mon, May 21, 2018 at 7:27 PM, Mateusz Guzik <mjguzik@gmail.com> wrote:

I have benchmarked the change on a FreeBSD box and found an big
performance win once the number of clients goes beyond the number of
hardware threads on the target machine. For smaller number of clients
the win was very modest.

So to summarise your results:

32 connections: ~445k -> ~450k = +1.2%
64 connections: ~416k -> ~544k = +30.7%
96 connections: ~331k -> ~508k = +53.6%

I would like to commit this patch for PostgreSQL 12, based on this
report. We know it helps performance on macOS developer machines and
big FreeBSD servers, and it is the right kernel interface for the job
on principle.

Seems reasonable.

Matteo Beccati reported a 5-10% performance drop on a
low-end Celeron NetBSD box which we have no explanation for, and we
have no reports from server-class machines on that OS -- so perhaps we
(or the NetBSD port?) should consider building with WAIT_USE_POLL on
NetBSD until someone can figure out what needs to be fixed there
(possibly on the NetBSD side)?

Yea, I'm not too worried about that. It'd be great to test that, but
otherwise I'm also ok to just plonk that into the template.

@@ -576,6 +592,10 @@ CreateWaitEventSet(MemoryContext context, int nevents)
if (fcntl(set->epoll_fd, F_SETFD, FD_CLOEXEC) == -1)
elog(ERROR, "fcntl(F_SETFD) failed on epoll descriptor: %m");
#endif							/* EPOLL_CLOEXEC */
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_fd = kqueue();
+	if (set->kqueue_fd < 0)
+		elog(ERROR, "kqueue failed: %m");
#elif defined(WAIT_USE_WIN32)

Is this automatically opened with some FD_CLOEXEC equivalent?

+static inline void
+WaitEventAdjustKqueueAdd(struct kevent *k_ev, int filter, int action,
+						 WaitEvent *event)
+{
+	k_ev->ident = event->fd;
+	k_ev->filter = filter;
+	k_ev->flags = action | EV_CLEAR;
+	k_ev->fflags = 0;
+	k_ev->data = 0;
+
+	/*
+	 * On most BSD family systems, udata is of type void * so we could simply
+	 * assign event to it without casting, or use the EV_SET macro instead of
+	 * filling in the struct manually.  Unfortunately, NetBSD and possibly
+	 * others have it as intptr_t, so here we wallpaper over that difference
+	 * with an unsightly lvalue cast.
+	 */
+	*((WaitEvent **)(&k_ev->udata)) = event;

I'm mildly inclined to hide that behind a macro, so the other places
have a reference, via the macro definition, to this too.

+	if (rc < 0 && event->events == WL_POSTMASTER_DEATH && errno == ESRCH)
+	{
+		/*
+		 * The postmaster is already dead.  Defer reporting this to the caller
+		 * until wait time, for compatibility with the other implementations.
+		 * To do that we will now add the regular alive pipe.
+		 */
+		WaitEventAdjustKqueueAdd(&k_ev[0], EVFILT_READ, EV_ADD, event);
+		rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+	}

That's, ... not particulary pretty. Kinda wonder if we shouldn't instead
just add a 'pending_events' field, that we can check at wait time.

diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 90dda8ea050..4bcabc3b381 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -330,6 +330,9 @@
/* Define to 1 if you have isinf(). */
#undef HAVE_ISINF
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
/* Define to 1 if you have the <langinfo.h> header file. */
#undef HAVE_LANGINFO_H

@@ -598,6 +601,9 @@
/* Define to 1 if you have the <sys/epoll.h> header file. */
#undef HAVE_SYS_EPOLL_H

+/* Define to 1 if you have the <sys/event.h> header file. */
+#undef HAVE_SYS_EVENT_H
+
/* Define to 1 if you have the <sys/ipc.h> header file. */
#undef HAVE_SYS_IPC_H

Should adjust pg_config.win32.h too.

Greetings,

Andres Freund

#54Matteo Beccati
php@beccati.com
In reply to: Thomas Munro (#52)
Re: [HACKERS] kqueue

Hi Thomas,

On 28/09/2018 00:55, Thomas Munro wrote:

I would like to commit this patch for PostgreSQL 12, based on this
report. We know it helps performance on macOS developer machines and
big FreeBSD servers, and it is the right kernel interface for the job
on principle. Matteo Beccati reported a 5-10% performance drop on a
low-end Celeron NetBSD box which we have no explanation for, and we
have no reports from server-class machines on that OS -- so perhaps we
(or the NetBSD port?) should consider building with WAIT_USE_POLL on
NetBSD until someone can figure out what needs to be fixed there
(possibly on the NetBSD side)?

Thanks for keeping me in the loop.

Out of curiosity (and time permitting) I'll try to spin up a NetBSD 8 VM
and run some benchmarks, but I guess we should leave it up to the pkgsrc
people to eventually change the build flags.

Cheers
--
Matteo Beccati

Development & Consulting - http://www.beccati.com/

#55Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#53)
1 attachment(s)
Re: [HACKERS] kqueue

On Fri, Sep 28, 2018 at 11:09 AM Andres Freund <andres@anarazel.de> wrote:

On 2018-09-28 10:55:13 +1200, Thomas Munro wrote:

Matteo Beccati reported a 5-10% performance drop on a
low-end Celeron NetBSD box which we have no explanation for, and we
have no reports from server-class machines on that OS -- so perhaps we
(or the NetBSD port?) should consider building with WAIT_USE_POLL on
NetBSD until someone can figure out what needs to be fixed there
(possibly on the NetBSD side)?

Yea, I'm not too worried about that. It'd be great to test that, but
otherwise I'm also ok to just plonk that into the template.

Thanks for the review! Ok, if we don't get a better idea I'll put
this in src/template/netbsd:

CPPFLAGS="$CPPFLAGS -DWAIT_USE_POLL"

@@ -576,6 +592,10 @@ CreateWaitEventSet(MemoryContext context, int nevents)
if (fcntl(set->epoll_fd, F_SETFD, FD_CLOEXEC) == -1)
elog(ERROR, "fcntl(F_SETFD) failed on epoll descriptor: %m");
#endif                                                       /* EPOLL_CLOEXEC */
+#elif defined(WAIT_USE_KQUEUE)
+     set->kqueue_fd = kqueue();
+     if (set->kqueue_fd < 0)
+             elog(ERROR, "kqueue failed: %m");
#elif defined(WAIT_USE_WIN32)

Is this automatically opened with some FD_CLOEXEC equivalent?

No. Hmm, I thought it wasn't necessary because kqueue descriptors are
not inherited and backends don't execve() directly without forking,
but I guess it can't hurt to add a fcntl() call. Done.

+ *((WaitEvent **)(&k_ev->udata)) = event;

I'm mildly inclined to hide that behind a macro, so the other places
have a reference, via the macro definition, to this too.

Done.

+     if (rc < 0 && event->events == WL_POSTMASTER_DEATH && errno == ESRCH)
+     {
+             /*
+              * The postmaster is already dead.  Defer reporting this to the caller
+              * until wait time, for compatibility with the other implementations.
+              * To do that we will now add the regular alive pipe.
+              */
+             WaitEventAdjustKqueueAdd(&k_ev[0], EVFILT_READ, EV_ADD, event);
+             rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+     }

That's, ... not particulary pretty. Kinda wonder if we shouldn't instead
just add a 'pending_events' field, that we can check at wait time.

Done.

+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+

Should adjust pg_config.win32.h too.

Done.

--
Thomas Munro
http://www.enterprisedb.com

Attachments:

0001-Add-kqueue-2-support-for-WaitEventSet-v11.patchapplication/octet-stream; name=0001-Add-kqueue-2-support-for-WaitEventSet-v11.patchDownload
From f19ced36e0cd8cf7c885999ec469eb0f33806699 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@enterprisedb.com>
Date: Thu, 22 Jun 2017 18:40:27 +1200
Subject: [PATCH] Add kqueue(2) support for WaitEventSet.

Add a kqueue(2) based implementation of WaitEventSet for use on BSD
family systems including FreeBSD, NetBSD, OpenBSD and macOS.  This
is similar to the epoll(2) implementation for Linux.

Unlike the epoll(2) implementation, the kqueue(2) implementation
doesn't need to use the postmaster_alive_fds pipe.  Instead, it
requests notification of process exit.

Author: Thomas Munro
Reviewed-By: Andres Freund, Marko Tiikkaja
Tested-By: Mateusz Guzik, Matteo Beccati, Keith Fiske, Heikki Linnakangas
Discussion: https://postgr.es/m/CAEepm%3D37oF84-iXDTQ9MrGjENwVGds%2B5zTr38ca73kWR7ez_tA%40mail.gmail.com
---
 configure                       |   4 +-
 configure.in                    |   4 +-
 src/backend/storage/ipc/latch.c | 298 +++++++++++++++++++++++++++++++-
 src/include/pg_config.h.in      |   6 +
 src/include/pg_config.h.win32   |   9 +
 5 files changed, 316 insertions(+), 5 deletions(-)

diff --git a/configure b/configure
index 6414ec1ea6d..ec9db016017 100755
--- a/configure
+++ b/configure
@@ -12711,7 +12711,7 @@ $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h
 fi
 
 
-for ac_header in atomic.h crypt.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/ipc.h sys/prctl.h sys/procctl.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
+for ac_header in atomic.h crypt.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/prctl.h sys/procctl.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -15100,7 +15100,7 @@ fi
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-for ac_func in cbrt clock_gettime fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink setproctitle setproctitle_fast setsid shm_open symlink sync_file_range utime utimes wcstombs_l
+for ac_func in cbrt clock_gettime fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l kqueue memmove poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink setproctitle setproctitle_fast setsid shm_open symlink sync_file_range utime utimes wcstombs_l
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
diff --git a/configure.in b/configure.in
index 158d5a1ac82..bfb78124d72 100644
--- a/configure.in
+++ b/configure.in
@@ -1292,7 +1292,7 @@ AC_SUBST(UUID_LIBS)
 
 AC_HEADER_STDBOOL
 
-AC_CHECK_HEADERS([atomic.h crypt.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/ipc.h sys/prctl.h sys/procctl.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
+AC_CHECK_HEADERS([atomic.h crypt.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/prctl.h sys/procctl.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
 
 # On BSD, test for net/if.h will fail unless sys/socket.h
 # is included first.
@@ -1571,7 +1571,7 @@ PGAC_FUNC_WCSTOMBS_L
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-AC_CHECK_FUNCS([cbrt clock_gettime fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink setproctitle setproctitle_fast setsid shm_open symlink sync_file_range utime utimes wcstombs_l])
+AC_CHECK_FUNCS([cbrt clock_gettime fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l kqueue memmove poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink setproctitle setproctitle_fast setsid shm_open symlink sync_file_range utime utimes wcstombs_l])
 
 AC_REPLACE_FUNCS(fseeko)
 case $host_os in
diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c
index f6dda9cc9ac..5b1afda1d80 100644
--- a/src/backend/storage/ipc/latch.c
+++ b/src/backend/storage/ipc/latch.c
@@ -39,6 +39,9 @@
 #ifdef HAVE_SYS_EPOLL_H
 #include <sys/epoll.h>
 #endif
+#ifdef HAVE_SYS_EVENT_H
+#include <sys/event.h>
+#endif
 #ifdef HAVE_POLL_H
 #include <poll.h>
 #endif
@@ -59,10 +62,12 @@
  * define somewhere before this block.
  */
 #if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_POLL) || \
-	defined(WAIT_USE_WIN32)
+	defined(WAIT_USE_KQUEUE) || defined(WAIT_USE_WIN32)
 /* don't overwrite manual choice */
 #elif defined(HAVE_SYS_EPOLL_H)
 #define WAIT_USE_EPOLL
+#elif defined(HAVE_KQUEUE)
+#define WAIT_USE_KQUEUE
 #elif defined(HAVE_POLL)
 #define WAIT_USE_POLL
 #elif WIN32
@@ -92,10 +97,17 @@ struct WaitEventSet
 	Latch	   *latch;
 	int			latch_pos;
 
+	/* A pointer to an event deferred until the next wait. */
+	WaitEvent  *pending_event;
+
 #if defined(WAIT_USE_EPOLL)
 	int			epoll_fd;
 	/* epoll_wait returns events in a user provided arrays, allocate once */
 	struct epoll_event *epoll_ret_events;
+#elif defined(WAIT_USE_KQUEUE)
+	int			kqueue_fd;
+	/* kevent returns events in a user provided arrays, allocate once */
+	struct kevent *kqueue_ret_events;
 #elif defined(WAIT_USE_POLL)
 	/* poll expects events to be waited on every poll() call, prepare once */
 	struct pollfd *pollfds;
@@ -128,6 +140,8 @@ static void drainSelfPipe(void);
 
 #if defined(WAIT_USE_EPOLL)
 static void WaitEventAdjustEpoll(WaitEventSet *set, WaitEvent *event, int action);
+#elif defined(WAIT_USE_KQUEUE)
+static void WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events);
 #elif defined(WAIT_USE_POLL)
 static void WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event);
 #elif defined(WAIT_USE_WIN32)
@@ -534,6 +548,8 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 
 #if defined(WAIT_USE_EPOLL)
 	sz += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	sz += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	sz += MAXALIGN(sizeof(struct pollfd) * nevents);
 #elif defined(WAIT_USE_WIN32)
@@ -552,6 +568,9 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 #if defined(WAIT_USE_EPOLL)
 	set->epoll_ret_events = (struct epoll_event *) data;
 	data += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_ret_events = (struct kevent *) data;
+	data += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	set->pollfds = (struct pollfd *) data;
 	data += MAXALIGN(sizeof(struct pollfd) * nevents);
@@ -576,6 +595,12 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 	if (fcntl(set->epoll_fd, F_SETFD, FD_CLOEXEC) == -1)
 		elog(ERROR, "fcntl(F_SETFD) failed on epoll descriptor: %m");
 #endif							/* EPOLL_CLOEXEC */
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_fd = kqueue();
+	if (set->kqueue_fd < 0)
+		elog(ERROR, "kqueue failed: %m");
+	if (fcntl(set->kqueue_fd, F_SETFD, FD_CLOEXEC) == -1)
+		elog(ERROR, "fcntl(F_SETFD) failed on kqueue descriptor: %m");
 #elif defined(WAIT_USE_WIN32)
 
 	/*
@@ -608,6 +633,8 @@ FreeWaitEventSet(WaitEventSet *set)
 {
 #if defined(WAIT_USE_EPOLL)
 	close(set->epoll_fd);
+#elif defined(WAIT_USE_KQUEUE)
+	close(set->kqueue_fd);
 #elif defined(WAIT_USE_WIN32)
 	WaitEvent  *cur_event;
 
@@ -717,6 +744,8 @@ AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch,
 	/* perform wait primitive specific initialization, if needed */
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_ADD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, 0);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -736,10 +765,16 @@ void
 ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 {
 	WaitEvent  *event;
+#if defined(WAIT_USE_KQUEUE)
+	int old_events;
+#endif
 
 	Assert(pos < set->nevents);
 
 	event = &set->events[pos];
+#if defined(WAIT_USE_KQUEUE)
+	old_events = event->events;
+#endif
 
 	/*
 	 * If neither the event mask nor the associated latch changes, return
@@ -773,6 +808,8 @@ ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_MOD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, old_events);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -863,6 +900,129 @@ WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event)
 }
 #endif
 
+#if defined(WAIT_USE_KQUEUE)
+
+/*
+ * On most BSD family systems, the udata member of struct kevent is of type
+ * void *, so we could directly convert to/from WaitEvent *.  Unfortunately,
+ * NetBSD has it as intptr_t, so here we wallpaper over that difference with
+ * an lvalue cast.
+ */
+#define AccessWaitEvent(k_ev) (*((WaitEvent **)(&(k_ev)->udata)))
+
+static inline void
+WaitEventAdjustKqueueAdd(struct kevent *k_ev, int filter, int action,
+						 WaitEvent *event)
+{
+	k_ev->ident = event->fd;
+	k_ev->filter = filter;
+	k_ev->flags = action | EV_CLEAR;
+	k_ev->fflags = 0;
+	k_ev->data = 0;
+	AccessWaitEvent(k_ev) = event;
+}
+
+static inline void
+WaitEventAdjustKqueueAddPostmaster(struct kevent *k_ev, WaitEvent *event)
+{
+	/* For now postmaster death can only be added, not removed. */
+	k_ev->ident = PostmasterPid;
+	k_ev->filter = EVFILT_PROC;
+	k_ev->flags = EV_ADD | EV_CLEAR;
+	k_ev->fflags = NOTE_EXIT;
+	k_ev->data = 0;
+	AccessWaitEvent(k_ev) = event;
+}
+
+/*
+ * old_events is the previous event mask, used to compute what has changed.
+ */
+static void
+WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events)
+{
+	int rc;
+	struct kevent k_ev[2];
+	int count = 0;
+	bool new_filt_read = false;
+	bool old_filt_read = false;
+	bool new_filt_write = false;
+	bool old_filt_write = false;
+
+	if (old_events == event->events)
+		return;
+
+	Assert(event->events != WL_LATCH_SET || set->latch != NULL);
+	Assert(event->events == WL_LATCH_SET ||
+		   event->events == WL_POSTMASTER_DEATH ||
+		   (event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)));
+
+	if (event->events == WL_POSTMASTER_DEATH)
+	{
+		/*
+		 * Unlike all the other implementations, we detect postmaster death
+		 * using process notification instead of waiting on the postmaster
+		 * alive pipe.
+		 */
+		WaitEventAdjustKqueueAddPostmaster(&k_ev[count++], event);
+	}
+	else
+	{
+		/*
+		 * We need to compute the adds and deletes required to get from the
+		 * old event mask to the new event mask, since kevent treats readable
+		 * and writable as separate events.
+		 */
+		if (old_events == WL_LATCH_SET ||
+			(old_events & WL_SOCKET_READABLE))
+				old_filt_read = true;
+		if (event->events == WL_LATCH_SET ||
+			(event->events & WL_SOCKET_READABLE))
+			new_filt_read = true;
+		if (old_events & WL_SOCKET_WRITEABLE)
+			old_filt_write = true;
+		if (event->events & WL_SOCKET_WRITEABLE)
+			new_filt_write = true;
+		if (old_filt_read && !new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_DELETE,
+									 event);
+		else if (!old_filt_read && new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_ADD,
+									 event);
+		if (old_filt_write && !new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_DELETE,
+									 event);
+		else if (!old_filt_write && new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_ADD,
+									 event);
+	}
+
+	Assert(count > 0);
+	Assert(count <= 2);
+
+	rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+
+	if (rc < 0)
+	{
+		if (event->events == WL_POSTMASTER_DEATH && errno == ESRCH)
+		{
+			/*
+			 * The postmaster is already dead.  Defer reporting this to the
+			 * caller until wait time, for compatibility with the other
+			 * implementations.
+			 */
+			set->pending_event = event;
+		}
+		else
+		{
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed: %m")));
+		}
+	}
+}
+
+#endif
+
 #if defined(WAIT_USE_WIN32)
 static void
 WaitEventAdjustWin32(WaitEventSet *set, WaitEvent *event)
@@ -929,6 +1089,14 @@ WaitEventSetWait(WaitEventSet *set, long timeout,
 
 	Assert(nevents > 0);
 
+	/* Return an event that was deferred until the next wait. */
+	if (unlikely(set->pending_event))
+	{
+		occurred_events[0] = *set->pending_event;
+		set->pending_event = NULL;
+		return 1;
+	}
+
 	/*
 	 * Initialize timeout if requested.  We must record the current time so
 	 * that we can determine the remaining timeout if interrupted.
@@ -1150,6 +1318,134 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
 	return returned_events;
 }
 
+#elif defined(WAIT_USE_KQUEUE)
+
+/*
+ * Wait using FreeBSD kqueue(2)/kevent(2).  Also available on other BSD-family
+ * systems including macOS.
+ *
+ * This is the preferrable wait method for systems that have it, as several
+ * readiness notifications are delivered, without having to iterate through
+ * all of set->events.
+ *
+ * For now this mirrors the epoll code, but in future it could modify the fd
+ * set in the same call to kevent as it uses for waiting instead of doing that
+ * with separate system calls.
+ */
+static int
+WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
+					  WaitEvent *occurred_events, int nevents)
+{
+	int			returned_events = 0;
+	int			rc;
+	WaitEvent  *cur_event;
+	struct kevent *cur_kqueue_event;
+	struct timespec timeout;
+	struct timespec *timeout_p;
+
+	if (cur_timeout < 0)
+		timeout_p = NULL;
+	else
+	{
+		timeout.tv_sec = cur_timeout / 1000;
+		timeout.tv_nsec = (cur_timeout % 1000) * 1000000;
+		timeout_p = &timeout;
+	}
+
+	/* Sleep */
+	rc = kevent(set->kqueue_fd, NULL, 0,
+				set->kqueue_ret_events, nevents,
+				timeout_p);
+
+	/* Check return code */
+	if (rc < 0)
+	{
+		/* EINTR is okay, otherwise complain */
+		if (errno != EINTR)
+		{
+			waiting = false;
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed while trying to wait: %m")));
+		}
+		return 0;
+	}
+	else if (rc == 0)
+	{
+		/* timeout exceeded */
+		return -1;
+	}
+
+	/*
+	 * At least one event occurred, iterate over the returned kqueue events
+	 * until they're either all processed, or we've returned all the events
+	 * the caller desired.
+	 */
+	for (cur_kqueue_event = set->kqueue_ret_events;
+		 cur_kqueue_event < (set->kqueue_ret_events + rc) &&
+		 returned_events < nevents;
+		 cur_kqueue_event++)
+	{
+		/* kevent's udata points to the associated WaitEvent */
+		cur_event = AccessWaitEvent(cur_kqueue_event);
+
+		occurred_events->pos = cur_event->pos;
+		occurred_events->user_data = cur_event->user_data;
+		occurred_events->events = 0;
+
+		if (cur_event->events == WL_LATCH_SET &&
+			cur_kqueue_event->filter == EVFILT_READ)
+		{
+			/* There's data in the self-pipe, clear it. */
+			drainSelfPipe();
+
+			if (set->latch->is_set)
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_LATCH_SET;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events == WL_POSTMASTER_DEATH &&
+				 cur_kqueue_event->filter == EVFILT_PROC &&
+				 (cur_kqueue_event->fflags & NOTE_EXIT) != 0)
+		{
+			occurred_events->fd = PGINVALID_SOCKET;
+			occurred_events->events = WL_POSTMASTER_DEATH;
+			occurred_events++;
+			returned_events++;
+		}
+		else if (cur_event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE))
+		{
+			Assert(cur_event->fd >= 0);
+
+			if ((cur_event->events & WL_SOCKET_READABLE) &&
+				(cur_kqueue_event->filter == EVFILT_READ))
+			{
+				/* readable, or EOF */
+				occurred_events->events |= WL_SOCKET_READABLE;
+			}
+
+			if ((cur_event->events & WL_SOCKET_WRITEABLE) &&
+				(cur_kqueue_event->filter == EVFILT_WRITE))
+			{
+				/* writable, or EOF */
+				occurred_events->events |= WL_SOCKET_WRITEABLE;
+			}
+
+			if (occurred_events->events != 0)
+			{
+				occurred_events->fd = cur_event->fd;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+	}
+
+	return returned_events;
+}
+
 #elif defined(WAIT_USE_POLL)
 
 /*
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 90dda8ea050..4bcabc3b381 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -330,6 +330,9 @@
 /* Define to 1 if you have isinf(). */
 #undef HAVE_ISINF
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 #undef HAVE_LANGINFO_H
 
@@ -598,6 +601,9 @@
 /* Define to 1 if you have the <sys/epoll.h> header file. */
 #undef HAVE_SYS_EPOLL_H
 
+/* Define to 1 if you have the <sys/event.h> header file. */
+#undef HAVE_SYS_EVENT_H
+
 /* Define to 1 if you have the <sys/ipc.h> header file. */
 #undef HAVE_SYS_IPC_H
 
diff --git a/src/include/pg_config.h.win32 b/src/include/pg_config.h.win32
index 93bb77349e0..0df54fc05c9 100644
--- a/src/include/pg_config.h.win32
+++ b/src/include/pg_config.h.win32
@@ -237,6 +237,9 @@
 /* Define to 1 if you have isinf(). */
 #define HAVE_ISINF 1
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 /* #undef HAVE_LANGINFO_H */
 
@@ -475,6 +478,12 @@
 /* Define to 1 if you have the syslog interface. */
 /* #undef HAVE_SYSLOG */
 
+/* Define to 1 if you have the <sys/epoll.h> header file. */
+/* #undef HAVE_SYS_EPOLL_H */
+
+/* Define to 1 if you have the <sys/event.h> header file. */
+/* #undef HAVE_SYS_EVENT_H */
+
 /* Define to 1 if you have the <sys/ipc.h> header file. */
 /* #undef HAVE_SYS_IPC_H */
 
-- 
2.17.1 (Apple Git-112)

#56Matteo Beccati
php@beccati.com
In reply to: Thomas Munro (#55)
Re: [HACKERS] kqueue

On 28/09/2018 14:19, Thomas Munro wrote:

On Fri, Sep 28, 2018 at 11:09 AM Andres Freund <andres@anarazel.de> wrote:

On 2018-09-28 10:55:13 +1200, Thomas Munro wrote:

Matteo Beccati reported a 5-10% performance drop on a
low-end Celeron NetBSD box which we have no explanation for, and we
have no reports from server-class machines on that OS -- so perhaps we
(or the NetBSD port?) should consider building with WAIT_USE_POLL on
NetBSD until someone can figure out what needs to be fixed there
(possibly on the NetBSD side)?

Yea, I'm not too worried about that. It'd be great to test that, but
otherwise I'm also ok to just plonk that into the template.

Thanks for the review! Ok, if we don't get a better idea I'll put
this in src/template/netbsd:

CPPFLAGS="$CPPFLAGS -DWAIT_USE_POLL"

A quick test on a 8 vCPU / 4GB RAM virtual machine running a fresh
install of NetBSD 8.0 again shows that kqueue is consistently slower
running pgbench vs unpatched master on tcp-b like pgbench workloads:

~1200tps vs ~1400tps w/ 96 clients and threads, scale factor 10

while on select only benchmarks the difference is below the noise floor,
with both doing roughly the same ~30k tps.

Out of curiosity, I've installed FreBSD on an identically specced VM,
and the select benchmark was ~75k tps for kqueue vs ~90k tps on
unpatched master, so maybe there's something wrong I'm doing when
benchmarking. Could you please provide proper instructions?

Cheers
--
Matteo Beccati

Development & Consulting - http://www.beccati.com/

#57Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Matteo Beccati (#56)
Re: [HACKERS] kqueue

On Sat, Sep 29, 2018 at 7:51 PM Matteo Beccati <php@beccati.com> wrote:

On 28/09/2018 14:19, Thomas Munro wrote:

On Fri, Sep 28, 2018 at 11:09 AM Andres Freund <andres@anarazel.de> wrote:

On 2018-09-28 10:55:13 +1200, Thomas Munro wrote:

Matteo Beccati reported a 5-10% performance drop on a
low-end Celeron NetBSD box which we have no explanation for, and we
have no reports from server-class machines on that OS -- so perhaps we
(or the NetBSD port?) should consider building with WAIT_USE_POLL on
NetBSD until someone can figure out what needs to be fixed there
(possibly on the NetBSD side)?

Yea, I'm not too worried about that. It'd be great to test that, but
otherwise I'm also ok to just plonk that into the template.

Thanks for the review! Ok, if we don't get a better idea I'll put
this in src/template/netbsd:

CPPFLAGS="$CPPFLAGS -DWAIT_USE_POLL"

A quick test on a 8 vCPU / 4GB RAM virtual machine running a fresh
install of NetBSD 8.0 again shows that kqueue is consistently slower
running pgbench vs unpatched master on tcp-b like pgbench workloads:

~1200tps vs ~1400tps w/ 96 clients and threads, scale factor 10

while on select only benchmarks the difference is below the noise floor,
with both doing roughly the same ~30k tps.

Out of curiosity, I've installed FreBSD on an identically specced VM,
and the select benchmark was ~75k tps for kqueue vs ~90k tps on
unpatched master, so maybe there's something wrong I'm doing when
benchmarking. Could you please provide proper instructions?

Ouch. What kind of virtualisation is this? Which version of FreeBSD?
Not sure if it's relevant, but do you happen to see gettimeofday()
showing up as a syscall, if you truss a backend running pgbench?

--
Thomas Munro
http://www.enterprisedb.com

#58Matteo Beccati
php@beccati.com
In reply to: Thomas Munro (#57)
Re: [HACKERS] kqueue

Hi Thomas,

On 30/09/2018 04:36, Thomas Munro wrote:

On Sat, Sep 29, 2018 at 7:51 PM Matteo Beccati <php@beccati.com> wrote:

Out of curiosity, I've installed FreBSD on an identically specced VM,
and the select benchmark was ~75k tps for kqueue vs ~90k tps on
unpatched master, so maybe there's something wrong I'm doing when
benchmarking. Could you please provide proper instructions?

Ouch. What kind of virtualisation is this? Which version of FreeBSD?
Not sure if it's relevant, but do you happen to see gettimeofday()
showing up as a syscall, if you truss a backend running pgbench?

I downloaded 11.2 as VHD file in order to run on MS Hyper-V / Win10 Pro.

Yes, I saw plenty of gettimeofday calls when running truss:

gettimeofday({ 1538297117.071344 },0x0) = 0 (0x0)
gettimeofday({ 1538297117.071743 },0x0) = 0 (0x0)
gettimeofday({ 1538297117.072021 },0x0) = 0 (0x0)
getpid() = 766 (0x2fe)
__sysctl(0x7fffffffce90,0x4,0x0,0x0,0x801891000,0x2b) = 0 (0x0)
gettimeofday({ 1538297117.072944 },0x0) = 0 (0x0)
getpid() = 766 (0x2fe)
__sysctl(0x7fffffffce90,0x4,0x0,0x0,0x801891000,0x29) = 0 (0x0)
gettimeofday({ 1538297117.073682 },0x0) = 0 (0x0)
sendto(9,"2\0\0\0\^DT\0\0\0!\0\^Aabalance"...,71,0,NULL,0) = 71 (0x47)
recvfrom(9,"B\0\0\0\^\\0P0_1\0\0\0\0\^A\0\0"...,8192,0,NULL,0x0) = 51 (0x33)
gettimeofday({ 1538297117.074955 },0x0) = 0 (0x0)
gettimeofday({ 1538297117.075308 },0x0) = 0 (0x0)
getpid() = 766 (0x2fe)
__sysctl(0x7fffffffce90,0x4,0x0,0x0,0x801891000,0x29) = 0 (0x0)
gettimeofday({ 1538297117.076252 },0x0) = 0 (0x0)
gettimeofday({ 1538297117.076431 },0x0) = 0 (0x0)
gettimeofday({ 1538297117.076678 },0x0^C) = 0 (0x0)

Cheers
--
Matteo Beccati

Development & Consulting - http://www.beccati.com/

#59Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Matteo Beccati (#58)
Re: [HACKERS] kqueue

On Sun, Sep 30, 2018 at 9:49 PM Matteo Beccati <php@beccati.com> wrote:

On 30/09/2018 04:36, Thomas Munro wrote:

On Sat, Sep 29, 2018 at 7:51 PM Matteo Beccati <php@beccati.com> wrote:

Out of curiosity, I've installed FreBSD on an identically specced VM,
and the select benchmark was ~75k tps for kqueue vs ~90k tps on
unpatched master, so maybe there's something wrong I'm doing when
benchmarking. Could you please provide proper instructions?

Ouch. What kind of virtualisation is this? Which version of FreeBSD?
Not sure if it's relevant, but do you happen to see gettimeofday()
showing up as a syscall, if you truss a backend running pgbench?

I downloaded 11.2 as VHD file in order to run on MS Hyper-V / Win10 Pro.

Yes, I saw plenty of gettimeofday calls when running truss:

gettimeofday({ 1538297117.071344 },0x0) = 0 (0x0)
gettimeofday({ 1538297117.071743 },0x0) = 0 (0x0)
gettimeofday({ 1538297117.072021 },0x0) = 0 (0x0)

Ok. Those syscalls show up depending on your
kern.timecounter.hardware setting and virtualised hardware: just like
on Linux, gettimeofday() can be a cheap userspace operation (vDSO)
that avoids the syscall path, or not. I'm not seeing any reason to
think that's relevant here.

getpid() = 766 (0x2fe)
__sysctl(0x7fffffffce90,0x4,0x0,0x0,0x801891000,0x2b) = 0 (0x0)
gettimeofday({ 1538297117.072944 },0x0) = 0 (0x0)
getpid() = 766 (0x2fe)
__sysctl(0x7fffffffce90,0x4,0x0,0x0,0x801891000,0x29) = 0 (0x0)

That's setproctitle(). Those syscalls go away if you use FreeBSD 12
(which has setproctitle_fast()). If you fix both of those problems,
you are left with just:

sendto(9,"2\0\0\0\^DT\0\0\0!\0\^Aabalance"...,71,0,NULL,0) = 71 (0x47)
recvfrom(9,"B\0\0\0\^\\0P0_1\0\0\0\0\^A\0\0"...,8192,0,NULL,0x0) = 51 (0x33)

These are the only syscalls I see for each pgbench -S transaction on
my bare metal machine: just the network round trip. The funny thing
is ... there are almost no kevent() calls.

I managed to reproduce the regression (~70k -> ~50k) using a prewarmed
scale 10 select-only pgbench with 2GB of shared_buffers (so it all
fits), with -j 96 -c 96 on an 8 vCPU AWS t2.2xlarge running FreeBSD 12
ALPHA8. Here is what truss -c says, capturing data from one backend
for about 10 seconds:

syscall seconds calls errors
sendto 0.396840146 3452 0
recvfrom 0.415802029 3443 6
kevent 0.000626393 6 0
gettimeofday 2.723923249 24053 0
------------- ------- -------
3.537191817 30954 6

(There's no regression with -j 8 -c 8, the problem is when
significantly overloaded, the same circumstances under which Matheusz
reported a great improvement). So... it's very rarely accessing the
kqueue directly... but its existence somehow slows things down.
Curiously, when using poll() it's actually calling poll() ~90/sec for
me:

syscall seconds calls errors
sendto 0.352784808 3226 0
recvfrom 0.614855254 4125 916
poll 0.319396480 916 0
gettimeofday 2.659035352 22456 0
------------- ------- -------
3.946071894 30723 916

I don't know what's going on here. Based on the reports so far, we
know that kqueue gives a speedup when using bare metal with pgbench
running on a different machine, but a slowdown when using
virtualisation and pgbench running on the same machine (and I just
checked that that's observable with both Unix sockets and TCP
sockets). That gave me the idea of looking at pgbench itself:

Unpatched:

syscall seconds calls errors
ppoll 0.004869268 1 0
sendto 16.489416911 7033 0
recvfrom 21.137606238 7049 0
------------- ------- -------
37.631892417 14083 0

Patched:

syscall seconds calls errors
ppoll 0.002773195 1 0
sendto 16.597880468 7217 0
recvfrom 25.646406008 7238 0
------------- ------- -------
42.247059671 14456 0

I don't know why the existence of the kqueue should make recvfrom()
slower on the pgbench side. That's probably something to look into
off-line with some FreeBSD guru help. Degraded performance for
clients on the same machine does seem to be a show stopper for this
patch for now. Thanks for testing!

--
Thomas Munro
http://www.enterprisedb.com

#60Matteo Beccati
php@beccati.com
In reply to: Thomas Munro (#59)
Re: [HACKERS] kqueue

Hi Thomas,

On 01/10/2018 01:09, Thomas Munro wrote:

I don't know why the existence of the kqueue should make recvfrom()
slower on the pgbench side. That's probably something to look into
off-line with some FreeBSD guru help. Degraded performance for
clients on the same machine does seem to be a show stopper for this
patch for now. Thanks for testing!

Glad to be helpful!

I've tried running pgbench from a separate VM and in fact kqueue
consistently takes the lead with 5-10% more tps on select/prepared
pgbench on NetBSD too.

What I have observed is that sys cpu usage is ~65% (35% idle) with
kqueue, while unpatched master averages at 55% (45% idle): relatively
speaking that's almost 25% less idle cpu available for a local pgbench
to do its own stuff.

Running pgbench locally shows an average 47% usr / 53% sys cpu
distribution w/ kqueue vs more like 50-50 w/ vanilla, so I'm inclined to
think that's the reason why we see a performance drop instead. Thoguhts?

Cheers
--
Matteo Beccati

Development & Consulting - http://www.beccati.com/

#61Andres Freund
andres@anarazel.de
In reply to: Matteo Beccati (#60)
Re: [HACKERS] kqueue

On 2018-10-01 19:25:45 +0200, Matteo Beccati wrote:

On 01/10/2018 01:09, Thomas Munro wrote:

I don't know why the existence of the kqueue should make recvfrom()
slower on the pgbench side. That's probably something to look into
off-line with some FreeBSD guru help. Degraded performance for
clients on the same machine does seem to be a show stopper for this
patch for now. Thanks for testing!

Glad to be helpful!

I've tried running pgbench from a separate VM and in fact kqueue
consistently takes the lead with 5-10% more tps on select/prepared pgbench
on NetBSD too.

What I have observed is that sys cpu usage is ~65% (35% idle) with kqueue,
while unpatched master averages at 55% (45% idle): relatively speaking
that's almost 25% less idle cpu available for a local pgbench to do its own
stuff.

This suggest that either the the wakeup logic between kqueue and poll,
or the internal locking could be at issue. Is it possible that poll
triggers a directed wakeup path, but kqueue doesn't?

Greetings,

Andres Freund

#62Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#61)
1 attachment(s)
Re: [HACKERS] kqueue

On Tue, Oct 2, 2018 at 6:28 AM Andres Freund <andres@anarazel.de> wrote:

On 2018-10-01 19:25:45 +0200, Matteo Beccati wrote:

On 01/10/2018 01:09, Thomas Munro wrote:

I don't know why the existence of the kqueue should make recvfrom()
slower on the pgbench side. That's probably something to look into
off-line with some FreeBSD guru help. Degraded performance for
clients on the same machine does seem to be a show stopper for this
patch for now. Thanks for testing!

Glad to be helpful!

I've tried running pgbench from a separate VM and in fact kqueue
consistently takes the lead with 5-10% more tps on select/prepared pgbench
on NetBSD too.

What I have observed is that sys cpu usage is ~65% (35% idle) with kqueue,
while unpatched master averages at 55% (45% idle): relatively speaking
that's almost 25% less idle cpu available for a local pgbench to do its own
stuff.

This suggest that either the the wakeup logic between kqueue and poll,
or the internal locking could be at issue. Is it possible that poll
triggers a directed wakeup path, but kqueue doesn't?

I am following up with some kernel hackers. In the meantime, here is
a rebase for the new split-line configure.in, to turn cfbot green.

--
Thomas Munro
http://www.enterprisedb.com

Attachments:

0001-Add-kqueue-2-support-for-WaitEventSet-v12.patchapplication/octet-stream; name=0001-Add-kqueue-2-support-for-WaitEventSet-v12.patchDownload
From 719dc83102121c897a0b71f3b13349065b8b5e48 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@enterprisedb.com>
Date: Thu, 22 Jun 2017 18:40:27 +1200
Subject: [PATCH] Add kqueue(2) support for WaitEventSet.

Add a kqueue(2) based implementation of WaitEventSet for use on BSD
family systems including FreeBSD, NetBSD, OpenBSD and macOS.  This
is similar to the epoll(2) implementation for Linux.

Unlike the epoll(2) implementation, the kqueue(2) implementation
doesn't need to use the postmaster_alive_fds pipe.  Instead, it
requests notification of process exit.

Author: Thomas Munro
Reviewed-By: Andres Freund, Marko Tiikkaja
Tested-By: Mateusz Guzik, Matteo Beccati, Keith Fiske, Heikki Linnakangas
Discussion: https://postgr.es/m/CAEepm%3D37oF84-iXDTQ9MrGjENwVGds%2B5zTr38ca73kWR7ez_tA%40mail.gmail.com
---
 configure                       |   4 +-
 configure.in                    |   2 +
 src/backend/storage/ipc/latch.c | 298 +++++++++++++++++++++++++++++++-
 src/include/pg_config.h.in      |   6 +
 src/include/pg_config.h.win32   |   9 +
 5 files changed, 316 insertions(+), 3 deletions(-)

diff --git a/configure b/configure
index b7250d7f5b8..fe52946eb10 100755
--- a/configure
+++ b/configure
@@ -12711,7 +12711,7 @@ $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h
 fi
 
 
-for ac_header in atomic.h crypt.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/ipc.h sys/prctl.h sys/procctl.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
+for ac_header in atomic.h crypt.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/prctl.h sys/procctl.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -15129,7 +15129,7 @@ fi
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-for ac_func in cbrt clock_gettime fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink setproctitle setproctitle_fast setsid shm_open strchrnul symlink sync_file_range utime utimes wcstombs_l
+for ac_func in cbrt clock_gettime fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink setproctitle setproctitle_fast setsid shm_open strchrnul symlink sync_file_range utime utimes wcstombs_l
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
diff --git a/configure.in b/configure.in
index de5f777333b..f792a0cb4f7 100644
--- a/configure.in
+++ b/configure.in
@@ -1303,6 +1303,7 @@ AC_CHECK_HEADERS(m4_normalize([
 	mbarrier.h
 	poll.h
 	sys/epoll.h
+	sys/event.h
 	sys/ipc.h
 	sys/prctl.h
 	sys/procctl.h
@@ -1605,6 +1606,7 @@ AC_CHECK_FUNCS(m4_normalize([
 	getifaddrs
 	getpeerucred
 	getrlimit
+	kqueue
 	mbstowcs_l
 	memmove
 	poll
diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c
index f6dda9cc9ac..5b1afda1d80 100644
--- a/src/backend/storage/ipc/latch.c
+++ b/src/backend/storage/ipc/latch.c
@@ -39,6 +39,9 @@
 #ifdef HAVE_SYS_EPOLL_H
 #include <sys/epoll.h>
 #endif
+#ifdef HAVE_SYS_EVENT_H
+#include <sys/event.h>
+#endif
 #ifdef HAVE_POLL_H
 #include <poll.h>
 #endif
@@ -59,10 +62,12 @@
  * define somewhere before this block.
  */
 #if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_POLL) || \
-	defined(WAIT_USE_WIN32)
+	defined(WAIT_USE_KQUEUE) || defined(WAIT_USE_WIN32)
 /* don't overwrite manual choice */
 #elif defined(HAVE_SYS_EPOLL_H)
 #define WAIT_USE_EPOLL
+#elif defined(HAVE_KQUEUE)
+#define WAIT_USE_KQUEUE
 #elif defined(HAVE_POLL)
 #define WAIT_USE_POLL
 #elif WIN32
@@ -92,10 +97,17 @@ struct WaitEventSet
 	Latch	   *latch;
 	int			latch_pos;
 
+	/* A pointer to an event deferred until the next wait. */
+	WaitEvent  *pending_event;
+
 #if defined(WAIT_USE_EPOLL)
 	int			epoll_fd;
 	/* epoll_wait returns events in a user provided arrays, allocate once */
 	struct epoll_event *epoll_ret_events;
+#elif defined(WAIT_USE_KQUEUE)
+	int			kqueue_fd;
+	/* kevent returns events in a user provided arrays, allocate once */
+	struct kevent *kqueue_ret_events;
 #elif defined(WAIT_USE_POLL)
 	/* poll expects events to be waited on every poll() call, prepare once */
 	struct pollfd *pollfds;
@@ -128,6 +140,8 @@ static void drainSelfPipe(void);
 
 #if defined(WAIT_USE_EPOLL)
 static void WaitEventAdjustEpoll(WaitEventSet *set, WaitEvent *event, int action);
+#elif defined(WAIT_USE_KQUEUE)
+static void WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events);
 #elif defined(WAIT_USE_POLL)
 static void WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event);
 #elif defined(WAIT_USE_WIN32)
@@ -534,6 +548,8 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 
 #if defined(WAIT_USE_EPOLL)
 	sz += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	sz += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	sz += MAXALIGN(sizeof(struct pollfd) * nevents);
 #elif defined(WAIT_USE_WIN32)
@@ -552,6 +568,9 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 #if defined(WAIT_USE_EPOLL)
 	set->epoll_ret_events = (struct epoll_event *) data;
 	data += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_ret_events = (struct kevent *) data;
+	data += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	set->pollfds = (struct pollfd *) data;
 	data += MAXALIGN(sizeof(struct pollfd) * nevents);
@@ -576,6 +595,12 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 	if (fcntl(set->epoll_fd, F_SETFD, FD_CLOEXEC) == -1)
 		elog(ERROR, "fcntl(F_SETFD) failed on epoll descriptor: %m");
 #endif							/* EPOLL_CLOEXEC */
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_fd = kqueue();
+	if (set->kqueue_fd < 0)
+		elog(ERROR, "kqueue failed: %m");
+	if (fcntl(set->kqueue_fd, F_SETFD, FD_CLOEXEC) == -1)
+		elog(ERROR, "fcntl(F_SETFD) failed on kqueue descriptor: %m");
 #elif defined(WAIT_USE_WIN32)
 
 	/*
@@ -608,6 +633,8 @@ FreeWaitEventSet(WaitEventSet *set)
 {
 #if defined(WAIT_USE_EPOLL)
 	close(set->epoll_fd);
+#elif defined(WAIT_USE_KQUEUE)
+	close(set->kqueue_fd);
 #elif defined(WAIT_USE_WIN32)
 	WaitEvent  *cur_event;
 
@@ -717,6 +744,8 @@ AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch,
 	/* perform wait primitive specific initialization, if needed */
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_ADD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, 0);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -736,10 +765,16 @@ void
 ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 {
 	WaitEvent  *event;
+#if defined(WAIT_USE_KQUEUE)
+	int old_events;
+#endif
 
 	Assert(pos < set->nevents);
 
 	event = &set->events[pos];
+#if defined(WAIT_USE_KQUEUE)
+	old_events = event->events;
+#endif
 
 	/*
 	 * If neither the event mask nor the associated latch changes, return
@@ -773,6 +808,8 @@ ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_MOD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, old_events);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -863,6 +900,129 @@ WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event)
 }
 #endif
 
+#if defined(WAIT_USE_KQUEUE)
+
+/*
+ * On most BSD family systems, the udata member of struct kevent is of type
+ * void *, so we could directly convert to/from WaitEvent *.  Unfortunately,
+ * NetBSD has it as intptr_t, so here we wallpaper over that difference with
+ * an lvalue cast.
+ */
+#define AccessWaitEvent(k_ev) (*((WaitEvent **)(&(k_ev)->udata)))
+
+static inline void
+WaitEventAdjustKqueueAdd(struct kevent *k_ev, int filter, int action,
+						 WaitEvent *event)
+{
+	k_ev->ident = event->fd;
+	k_ev->filter = filter;
+	k_ev->flags = action | EV_CLEAR;
+	k_ev->fflags = 0;
+	k_ev->data = 0;
+	AccessWaitEvent(k_ev) = event;
+}
+
+static inline void
+WaitEventAdjustKqueueAddPostmaster(struct kevent *k_ev, WaitEvent *event)
+{
+	/* For now postmaster death can only be added, not removed. */
+	k_ev->ident = PostmasterPid;
+	k_ev->filter = EVFILT_PROC;
+	k_ev->flags = EV_ADD | EV_CLEAR;
+	k_ev->fflags = NOTE_EXIT;
+	k_ev->data = 0;
+	AccessWaitEvent(k_ev) = event;
+}
+
+/*
+ * old_events is the previous event mask, used to compute what has changed.
+ */
+static void
+WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events)
+{
+	int rc;
+	struct kevent k_ev[2];
+	int count = 0;
+	bool new_filt_read = false;
+	bool old_filt_read = false;
+	bool new_filt_write = false;
+	bool old_filt_write = false;
+
+	if (old_events == event->events)
+		return;
+
+	Assert(event->events != WL_LATCH_SET || set->latch != NULL);
+	Assert(event->events == WL_LATCH_SET ||
+		   event->events == WL_POSTMASTER_DEATH ||
+		   (event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)));
+
+	if (event->events == WL_POSTMASTER_DEATH)
+	{
+		/*
+		 * Unlike all the other implementations, we detect postmaster death
+		 * using process notification instead of waiting on the postmaster
+		 * alive pipe.
+		 */
+		WaitEventAdjustKqueueAddPostmaster(&k_ev[count++], event);
+	}
+	else
+	{
+		/*
+		 * We need to compute the adds and deletes required to get from the
+		 * old event mask to the new event mask, since kevent treats readable
+		 * and writable as separate events.
+		 */
+		if (old_events == WL_LATCH_SET ||
+			(old_events & WL_SOCKET_READABLE))
+				old_filt_read = true;
+		if (event->events == WL_LATCH_SET ||
+			(event->events & WL_SOCKET_READABLE))
+			new_filt_read = true;
+		if (old_events & WL_SOCKET_WRITEABLE)
+			old_filt_write = true;
+		if (event->events & WL_SOCKET_WRITEABLE)
+			new_filt_write = true;
+		if (old_filt_read && !new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_DELETE,
+									 event);
+		else if (!old_filt_read && new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_ADD,
+									 event);
+		if (old_filt_write && !new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_DELETE,
+									 event);
+		else if (!old_filt_write && new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_ADD,
+									 event);
+	}
+
+	Assert(count > 0);
+	Assert(count <= 2);
+
+	rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+
+	if (rc < 0)
+	{
+		if (event->events == WL_POSTMASTER_DEATH && errno == ESRCH)
+		{
+			/*
+			 * The postmaster is already dead.  Defer reporting this to the
+			 * caller until wait time, for compatibility with the other
+			 * implementations.
+			 */
+			set->pending_event = event;
+		}
+		else
+		{
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed: %m")));
+		}
+	}
+}
+
+#endif
+
 #if defined(WAIT_USE_WIN32)
 static void
 WaitEventAdjustWin32(WaitEventSet *set, WaitEvent *event)
@@ -929,6 +1089,14 @@ WaitEventSetWait(WaitEventSet *set, long timeout,
 
 	Assert(nevents > 0);
 
+	/* Return an event that was deferred until the next wait. */
+	if (unlikely(set->pending_event))
+	{
+		occurred_events[0] = *set->pending_event;
+		set->pending_event = NULL;
+		return 1;
+	}
+
 	/*
 	 * Initialize timeout if requested.  We must record the current time so
 	 * that we can determine the remaining timeout if interrupted.
@@ -1150,6 +1318,134 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
 	return returned_events;
 }
 
+#elif defined(WAIT_USE_KQUEUE)
+
+/*
+ * Wait using FreeBSD kqueue(2)/kevent(2).  Also available on other BSD-family
+ * systems including macOS.
+ *
+ * This is the preferrable wait method for systems that have it, as several
+ * readiness notifications are delivered, without having to iterate through
+ * all of set->events.
+ *
+ * For now this mirrors the epoll code, but in future it could modify the fd
+ * set in the same call to kevent as it uses for waiting instead of doing that
+ * with separate system calls.
+ */
+static int
+WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
+					  WaitEvent *occurred_events, int nevents)
+{
+	int			returned_events = 0;
+	int			rc;
+	WaitEvent  *cur_event;
+	struct kevent *cur_kqueue_event;
+	struct timespec timeout;
+	struct timespec *timeout_p;
+
+	if (cur_timeout < 0)
+		timeout_p = NULL;
+	else
+	{
+		timeout.tv_sec = cur_timeout / 1000;
+		timeout.tv_nsec = (cur_timeout % 1000) * 1000000;
+		timeout_p = &timeout;
+	}
+
+	/* Sleep */
+	rc = kevent(set->kqueue_fd, NULL, 0,
+				set->kqueue_ret_events, nevents,
+				timeout_p);
+
+	/* Check return code */
+	if (rc < 0)
+	{
+		/* EINTR is okay, otherwise complain */
+		if (errno != EINTR)
+		{
+			waiting = false;
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed while trying to wait: %m")));
+		}
+		return 0;
+	}
+	else if (rc == 0)
+	{
+		/* timeout exceeded */
+		return -1;
+	}
+
+	/*
+	 * At least one event occurred, iterate over the returned kqueue events
+	 * until they're either all processed, or we've returned all the events
+	 * the caller desired.
+	 */
+	for (cur_kqueue_event = set->kqueue_ret_events;
+		 cur_kqueue_event < (set->kqueue_ret_events + rc) &&
+		 returned_events < nevents;
+		 cur_kqueue_event++)
+	{
+		/* kevent's udata points to the associated WaitEvent */
+		cur_event = AccessWaitEvent(cur_kqueue_event);
+
+		occurred_events->pos = cur_event->pos;
+		occurred_events->user_data = cur_event->user_data;
+		occurred_events->events = 0;
+
+		if (cur_event->events == WL_LATCH_SET &&
+			cur_kqueue_event->filter == EVFILT_READ)
+		{
+			/* There's data in the self-pipe, clear it. */
+			drainSelfPipe();
+
+			if (set->latch->is_set)
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_LATCH_SET;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events == WL_POSTMASTER_DEATH &&
+				 cur_kqueue_event->filter == EVFILT_PROC &&
+				 (cur_kqueue_event->fflags & NOTE_EXIT) != 0)
+		{
+			occurred_events->fd = PGINVALID_SOCKET;
+			occurred_events->events = WL_POSTMASTER_DEATH;
+			occurred_events++;
+			returned_events++;
+		}
+		else if (cur_event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE))
+		{
+			Assert(cur_event->fd >= 0);
+
+			if ((cur_event->events & WL_SOCKET_READABLE) &&
+				(cur_kqueue_event->filter == EVFILT_READ))
+			{
+				/* readable, or EOF */
+				occurred_events->events |= WL_SOCKET_READABLE;
+			}
+
+			if ((cur_event->events & WL_SOCKET_WRITEABLE) &&
+				(cur_kqueue_event->filter == EVFILT_WRITE))
+			{
+				/* writable, or EOF */
+				occurred_events->events |= WL_SOCKET_WRITEABLE;
+			}
+
+			if (occurred_events->events != 0)
+			{
+				occurred_events->fd = cur_event->fd;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+	}
+
+	return returned_events;
+}
+
 #elif defined(WAIT_USE_POLL)
 
 /*
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 9798bd24b44..bb997d73977 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -330,6 +330,9 @@
 /* Define to 1 if you have isinf(). */
 #undef HAVE_ISINF
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 #undef HAVE_LANGINFO_H
 
@@ -601,6 +604,9 @@
 /* Define to 1 if you have the <sys/epoll.h> header file. */
 #undef HAVE_SYS_EPOLL_H
 
+/* Define to 1 if you have the <sys/event.h> header file. */
+#undef HAVE_SYS_EVENT_H
+
 /* Define to 1 if you have the <sys/ipc.h> header file. */
 #undef HAVE_SYS_IPC_H
 
diff --git a/src/include/pg_config.h.win32 b/src/include/pg_config.h.win32
index f7a051d1127..77d758bcdde 100644
--- a/src/include/pg_config.h.win32
+++ b/src/include/pg_config.h.win32
@@ -237,6 +237,9 @@
 /* Define to 1 if you have isinf(). */
 #define HAVE_ISINF 1
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 /* #undef HAVE_LANGINFO_H */
 
@@ -478,6 +481,12 @@
 /* Define to 1 if you have the syslog interface. */
 /* #undef HAVE_SYSLOG */
 
+/* Define to 1 if you have the <sys/epoll.h> header file. */
+/* #undef HAVE_SYS_EPOLL_H */
+
+/* Define to 1 if you have the <sys/event.h> header file. */
+/* #undef HAVE_SYS_EVENT_H */
+
 /* Define to 1 if you have the <sys/ipc.h> header file. */
 /* #undef HAVE_SYS_IPC_H */
 
-- 
2.17.1 (Apple Git-112)

#63Rui DeSousa
rui@crazybean.net
In reply to: Thomas Munro (#48)
Re: [HACKERS] kqueue

On Apr 10, 2018, at 9:05 PM, Thomas Munro <thomas.munro@enterprisedb.com> wrote:

On Wed, Dec 6, 2017 at 12:53 AM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On Thu, Jun 22, 2017 at 7:19 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

I don't plan to resubmit this patch myself, but I was doing some
spring cleaning and rebasing today and I figured it might be worth
quietly leaving a working patch here just in case anyone from the
various BSD communities is interested in taking the idea further.

I heard through the grapevine of some people currently investigating
performance problems on busy FreeBSD systems, possibly related to the
postmaster pipe. I suspect this patch might be a part of the solution
(other patches probably needed to get maximum value out of this patch:
reuse WaitEventSet objects in some key places, and get rid of high
frequency PostmasterIsAlive() read() calls). The autoconf-fu in the
last version bit-rotted so it seemed like a good time to post a
rebased patch.

--
Thomas Munro
http://www.enterprisedb.com
<kqueue-v9.patch>

Hi,

I’m instrested in the kqueue patch and would like to know its current state and possible timeline for inclusion in the base code. I have several large FreeBSD systems running PostgreSQL 11 that I believe currently displays this issue. The system has 88 vCPUs, 512GB Ram, and very active application with over 1000 connections to the database. The system exhibits high kernel CPU usage servicing poll() for connections that are idle.

I’ve being testing pg_bouncer to reduce the number of connections and thus system CPU usage; however, not all connections can go through pg_bouncer.

Thanks,
Rui.

#64Thomas Munro
thomas.munro@gmail.com
In reply to: Rui DeSousa (#63)
2 attachment(s)
Re: [HACKERS] kqueue

On Fri, Dec 20, 2019 at 12:41 PM Rui DeSousa <rui@crazybean.net> wrote:

I’m instrested in the kqueue patch and would like to know its current state and possible timeline for inclusion in the base code. I have several large FreeBSD systems running PostgreSQL 11 that I believe currently displays this issue. The system has 88 vCPUs, 512GB Ram, and very active application with over 1000 connections to the database. The system exhibits high kernel CPU usage servicing poll() for connections that are idle.

Hi Rui,

It's still my intention to get this committed eventually, but I got a
bit frazzled by conflicting reports on several operating systems. For
FreeBSD, performance was improved in many cases, but there were also
some regressions that seemed to be related to ongoing work in the
kernel that seemed worth waiting for. I don't have the details
swapped into my brain right now, but there was something about a big
kernel lock for Unix domain sockets which possibly explained some
local pgbench problems, and there was also a problem relating to
wakeup priority with some test parameters, which I'd need to go and
dig up. If you want to test this and let us know how you get on,
that'd be great! Here's a rebase against PostgreSQL's master branch,
and since you mentioned PostgreSQL 11, here's a rebased version for
REL_11_STABLE in case that's easier for you to test/build via ports or
whatever and test with your production workload (eg on a throwaway
copy of your production system). You can see it's working by looking
in top: instead of state "select" (which is how poll() is reported)
you see "kqread", which on its own isn't exciting enough to get this
committed :-)

PS Here's a list of slow burner PostgreSQL/FreeBSD projects:
https://wiki.postgresql.org/wiki/FreeBSD

Attachments:

0001-Add-kqueue-2-support-for-WaitEventSet-v13.patchapplication/octet-stream; name=0001-Add-kqueue-2-support-for-WaitEventSet-v13.patchDownload
From 4bfc80ac0a43131d3c8923a16a69ac7b46ddc6f7 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@enterprisedb.com>
Date: Thu, 22 Jun 2017 18:40:27 +1200
Subject: [PATCH] Add kqueue(2) support for WaitEventSet.

Add a kqueue(2) based implementation of WaitEventSet for use on BSD
family systems including FreeBSD, NetBSD, OpenBSD and macOS.  This
is similar to the epoll(2) implementation for Linux.

Unlike the epoll(2) implementation, the kqueue(2) implementation
doesn't need to use the postmaster_alive_fds pipe.  Instead, it
requests notification of process exit.

Author: Thomas Munro
Reviewed-By: Andres Freund, Marko Tiikkaja
Tested-By: Mateusz Guzik, Matteo Beccati, Keith Fiske, Heikki Linnakangas
Discussion: https://postgr.es/m/CAEepm%3D37oF84-iXDTQ9MrGjENwVGds%2B5zTr38ca73kWR7ez_tA%40mail.gmail.com
---
 configure                       |   4 +-
 configure.in                    |   2 +
 src/backend/storage/ipc/latch.c | 298 +++++++++++++++++++++++++++++++-
 src/include/pg_config.h.in      |   6 +
 src/include/pg_config.h.win32   |   9 +
 5 files changed, 316 insertions(+), 3 deletions(-)

diff --git a/configure b/configure
index 9de50377ff..e3dd9b8191 100755
--- a/configure
+++ b/configure
@@ -12758,7 +12758,7 @@ $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h
 fi
 
 
-for ac_header in atomic.h copyfile.h execinfo.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/ipc.h sys/prctl.h sys/procctl.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
+for ac_header in atomic.h copyfile.h execinfo.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/prctl.h sys/procctl.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -14994,7 +14994,7 @@ fi
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-for ac_func in backtrace_symbols cbrt clock_gettime copyfile fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memset_s memmove poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink setproctitle setproctitle_fast setsid shm_open strchrnul strsignal symlink sync_file_range uselocale utime utimes wcstombs_l
+for ac_func in backtrace_symbols cbrt clock_gettime copyfile fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memset_s memmove poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink setproctitle setproctitle_fast setsid shm_open strchrnul strsignal symlink sync_file_range uselocale utime utimes wcstombs_l
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
diff --git a/configure.in b/configure.in
index 9c5e5e7f8c..afd069f321 100644
--- a/configure.in
+++ b/configure.in
@@ -1287,6 +1287,7 @@ AC_CHECK_HEADERS(m4_normalize([
 	mbarrier.h
 	poll.h
 	sys/epoll.h
+	sys/event.h
 	sys/ipc.h
 	sys/prctl.h
 	sys/procctl.h
@@ -1627,6 +1628,7 @@ AC_CHECK_FUNCS(m4_normalize([
 	getifaddrs
 	getpeerucred
 	getrlimit
+	kqueue
 	mbstowcs_l
 	memset_s
 	memmove
diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c
index 2426cbcf8e..3e79525a3c 100644
--- a/src/backend/storage/ipc/latch.c
+++ b/src/backend/storage/ipc/latch.c
@@ -39,6 +39,9 @@
 #ifdef HAVE_SYS_EPOLL_H
 #include <sys/epoll.h>
 #endif
+#ifdef HAVE_SYS_EVENT_H
+#include <sys/event.h>
+#endif
 #ifdef HAVE_POLL_H
 #include <poll.h>
 #endif
@@ -60,10 +63,12 @@
  * define somewhere before this block.
  */
 #if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_POLL) || \
-	defined(WAIT_USE_WIN32)
+	defined(WAIT_USE_KQUEUE) || defined(WAIT_USE_WIN32)
 /* don't overwrite manual choice */
 #elif defined(HAVE_SYS_EPOLL_H)
 #define WAIT_USE_EPOLL
+#elif defined(HAVE_KQUEUE)
+#define WAIT_USE_KQUEUE
 #elif defined(HAVE_POLL)
 #define WAIT_USE_POLL
 #elif WIN32
@@ -93,6 +98,9 @@ struct WaitEventSet
 	Latch	   *latch;
 	int			latch_pos;
 
+	/* A pointer to an event deferred until the next wait. */
+	WaitEvent  *pending_event;
+
 	/*
 	 * WL_EXIT_ON_PM_DEATH is converted to WL_POSTMASTER_DEATH, but this flag
 	 * is set so that we'll exit immediately if postmaster death is detected,
@@ -104,6 +112,10 @@ struct WaitEventSet
 	int			epoll_fd;
 	/* epoll_wait returns events in a user provided arrays, allocate once */
 	struct epoll_event *epoll_ret_events;
+#elif defined(WAIT_USE_KQUEUE)
+	int			kqueue_fd;
+	/* kevent returns events in a user provided arrays, allocate once */
+	struct kevent *kqueue_ret_events;
 #elif defined(WAIT_USE_POLL)
 	/* poll expects events to be waited on every poll() call, prepare once */
 	struct pollfd *pollfds;
@@ -136,6 +148,8 @@ static void drainSelfPipe(void);
 
 #if defined(WAIT_USE_EPOLL)
 static void WaitEventAdjustEpoll(WaitEventSet *set, WaitEvent *event, int action);
+#elif defined(WAIT_USE_KQUEUE)
+static void WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events);
 #elif defined(WAIT_USE_POLL)
 static void WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event);
 #elif defined(WAIT_USE_WIN32)
@@ -556,6 +570,8 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 
 #if defined(WAIT_USE_EPOLL)
 	sz += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	sz += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	sz += MAXALIGN(sizeof(struct pollfd) * nevents);
 #elif defined(WAIT_USE_WIN32)
@@ -574,6 +590,9 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 #if defined(WAIT_USE_EPOLL)
 	set->epoll_ret_events = (struct epoll_event *) data;
 	data += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_ret_events = (struct kevent *) data;
+	data += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	set->pollfds = (struct pollfd *) data;
 	data += MAXALIGN(sizeof(struct pollfd) * nevents);
@@ -599,6 +618,12 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 	if (fcntl(set->epoll_fd, F_SETFD, FD_CLOEXEC) == -1)
 		elog(ERROR, "fcntl(F_SETFD) failed on epoll descriptor: %m");
 #endif							/* EPOLL_CLOEXEC */
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_fd = kqueue();
+	if (set->kqueue_fd < 0)
+		elog(ERROR, "kqueue failed: %m");
+	if (fcntl(set->kqueue_fd, F_SETFD, FD_CLOEXEC) == -1)
+		elog(ERROR, "fcntl(F_SETFD) failed on kqueue descriptor: %m");
 #elif defined(WAIT_USE_WIN32)
 
 	/*
@@ -631,6 +656,8 @@ FreeWaitEventSet(WaitEventSet *set)
 {
 #if defined(WAIT_USE_EPOLL)
 	close(set->epoll_fd);
+#elif defined(WAIT_USE_KQUEUE)
+	close(set->kqueue_fd);
 #elif defined(WAIT_USE_WIN32)
 	WaitEvent  *cur_event;
 
@@ -747,6 +774,8 @@ AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch,
 	/* perform wait primitive specific initialization, if needed */
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_ADD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, 0);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -766,10 +795,16 @@ void
 ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 {
 	WaitEvent  *event;
+#if defined(WAIT_USE_KQUEUE)
+	int old_events;
+#endif
 
 	Assert(pos < set->nevents);
 
 	event = &set->events[pos];
+#if defined(WAIT_USE_KQUEUE)
+	old_events = event->events;
+#endif
 
 	/*
 	 * If neither the event mask nor the associated latch changes, return
@@ -803,6 +838,8 @@ ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_MOD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, old_events);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -895,6 +932,129 @@ WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event)
 }
 #endif
 
+#if defined(WAIT_USE_KQUEUE)
+
+/*
+ * On most BSD family systems, the udata member of struct kevent is of type
+ * void *, so we could directly convert to/from WaitEvent *.  Unfortunately,
+ * NetBSD has it as intptr_t, so here we wallpaper over that difference with
+ * an lvalue cast.
+ */
+#define AccessWaitEvent(k_ev) (*((WaitEvent **)(&(k_ev)->udata)))
+
+static inline void
+WaitEventAdjustKqueueAdd(struct kevent *k_ev, int filter, int action,
+						 WaitEvent *event)
+{
+	k_ev->ident = event->fd;
+	k_ev->filter = filter;
+	k_ev->flags = action | EV_CLEAR;
+	k_ev->fflags = 0;
+	k_ev->data = 0;
+	AccessWaitEvent(k_ev) = event;
+}
+
+static inline void
+WaitEventAdjustKqueueAddPostmaster(struct kevent *k_ev, WaitEvent *event)
+{
+	/* For now postmaster death can only be added, not removed. */
+	k_ev->ident = PostmasterPid;
+	k_ev->filter = EVFILT_PROC;
+	k_ev->flags = EV_ADD | EV_CLEAR;
+	k_ev->fflags = NOTE_EXIT;
+	k_ev->data = 0;
+	AccessWaitEvent(k_ev) = event;
+}
+
+/*
+ * old_events is the previous event mask, used to compute what has changed.
+ */
+static void
+WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events)
+{
+	int rc;
+	struct kevent k_ev[2];
+	int count = 0;
+	bool new_filt_read = false;
+	bool old_filt_read = false;
+	bool new_filt_write = false;
+	bool old_filt_write = false;
+
+	if (old_events == event->events)
+		return;
+
+	Assert(event->events != WL_LATCH_SET || set->latch != NULL);
+	Assert(event->events == WL_LATCH_SET ||
+		   event->events == WL_POSTMASTER_DEATH ||
+		   (event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)));
+
+	if (event->events == WL_POSTMASTER_DEATH)
+	{
+		/*
+		 * Unlike all the other implementations, we detect postmaster death
+		 * using process notification instead of waiting on the postmaster
+		 * alive pipe.
+		 */
+		WaitEventAdjustKqueueAddPostmaster(&k_ev[count++], event);
+	}
+	else
+	{
+		/*
+		 * We need to compute the adds and deletes required to get from the
+		 * old event mask to the new event mask, since kevent treats readable
+		 * and writable as separate events.
+		 */
+		if (old_events == WL_LATCH_SET ||
+			(old_events & WL_SOCKET_READABLE))
+				old_filt_read = true;
+		if (event->events == WL_LATCH_SET ||
+			(event->events & WL_SOCKET_READABLE))
+			new_filt_read = true;
+		if (old_events & WL_SOCKET_WRITEABLE)
+			old_filt_write = true;
+		if (event->events & WL_SOCKET_WRITEABLE)
+			new_filt_write = true;
+		if (old_filt_read && !new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_DELETE,
+									 event);
+		else if (!old_filt_read && new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_ADD,
+									 event);
+		if (old_filt_write && !new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_DELETE,
+									 event);
+		else if (!old_filt_write && new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_ADD,
+									 event);
+	}
+
+	Assert(count > 0);
+	Assert(count <= 2);
+
+	rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+
+	if (rc < 0)
+	{
+		if (event->events == WL_POSTMASTER_DEATH && errno == ESRCH)
+		{
+			/*
+			 * The postmaster is already dead.  Defer reporting this to the
+			 * caller until wait time, for compatibility with the other
+			 * implementations.
+			 */
+			set->pending_event = event;
+		}
+		else
+		{
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed: %m")));
+		}
+	}
+}
+
+#endif
+
 #if defined(WAIT_USE_WIN32)
 static void
 WaitEventAdjustWin32(WaitEventSet *set, WaitEvent *event)
@@ -961,6 +1121,14 @@ WaitEventSetWait(WaitEventSet *set, long timeout,
 
 	Assert(nevents > 0);
 
+	/* Return an event that was deferred until the next wait. */
+	if (unlikely(set->pending_event))
+	{
+		occurred_events[0] = *set->pending_event;
+		set->pending_event = NULL;
+		return 1;
+	}
+
 	/*
 	 * Initialize timeout if requested.  We must record the current time so
 	 * that we can determine the remaining timeout if interrupted.
@@ -1186,6 +1354,134 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
 	return returned_events;
 }
 
+#elif defined(WAIT_USE_KQUEUE)
+
+/*
+ * Wait using FreeBSD kqueue(2)/kevent(2).  Also available on other BSD-family
+ * systems including macOS.
+ *
+ * This is the preferrable wait method for systems that have it, as several
+ * readiness notifications are delivered, without having to iterate through
+ * all of set->events.
+ *
+ * For now this mirrors the epoll code, but in future it could modify the fd
+ * set in the same call to kevent as it uses for waiting instead of doing that
+ * with separate system calls.
+ */
+static int
+WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
+					  WaitEvent *occurred_events, int nevents)
+{
+	int			returned_events = 0;
+	int			rc;
+	WaitEvent  *cur_event;
+	struct kevent *cur_kqueue_event;
+	struct timespec timeout;
+	struct timespec *timeout_p;
+
+	if (cur_timeout < 0)
+		timeout_p = NULL;
+	else
+	{
+		timeout.tv_sec = cur_timeout / 1000;
+		timeout.tv_nsec = (cur_timeout % 1000) * 1000000;
+		timeout_p = &timeout;
+	}
+
+	/* Sleep */
+	rc = kevent(set->kqueue_fd, NULL, 0,
+				set->kqueue_ret_events, nevents,
+				timeout_p);
+
+	/* Check return code */
+	if (rc < 0)
+	{
+		/* EINTR is okay, otherwise complain */
+		if (errno != EINTR)
+		{
+			waiting = false;
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed while trying to wait: %m")));
+		}
+		return 0;
+	}
+	else if (rc == 0)
+	{
+		/* timeout exceeded */
+		return -1;
+	}
+
+	/*
+	 * At least one event occurred, iterate over the returned kqueue events
+	 * until they're either all processed, or we've returned all the events
+	 * the caller desired.
+	 */
+	for (cur_kqueue_event = set->kqueue_ret_events;
+		 cur_kqueue_event < (set->kqueue_ret_events + rc) &&
+		 returned_events < nevents;
+		 cur_kqueue_event++)
+	{
+		/* kevent's udata points to the associated WaitEvent */
+		cur_event = AccessWaitEvent(cur_kqueue_event);
+
+		occurred_events->pos = cur_event->pos;
+		occurred_events->user_data = cur_event->user_data;
+		occurred_events->events = 0;
+
+		if (cur_event->events == WL_LATCH_SET &&
+			cur_kqueue_event->filter == EVFILT_READ)
+		{
+			/* There's data in the self-pipe, clear it. */
+			drainSelfPipe();
+
+			if (set->latch->is_set)
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_LATCH_SET;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events == WL_POSTMASTER_DEATH &&
+				 cur_kqueue_event->filter == EVFILT_PROC &&
+				 (cur_kqueue_event->fflags & NOTE_EXIT) != 0)
+		{
+			occurred_events->fd = PGINVALID_SOCKET;
+			occurred_events->events = WL_POSTMASTER_DEATH;
+			occurred_events++;
+			returned_events++;
+		}
+		else if (cur_event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE))
+		{
+			Assert(cur_event->fd >= 0);
+
+			if ((cur_event->events & WL_SOCKET_READABLE) &&
+				(cur_kqueue_event->filter == EVFILT_READ))
+			{
+				/* readable, or EOF */
+				occurred_events->events |= WL_SOCKET_READABLE;
+			}
+
+			if ((cur_event->events & WL_SOCKET_WRITEABLE) &&
+				(cur_kqueue_event->filter == EVFILT_WRITE))
+			{
+				/* writable, or EOF */
+				occurred_events->events |= WL_SOCKET_WRITEABLE;
+			}
+
+			if (occurred_events->events != 0)
+			{
+				occurred_events->fd = cur_event->fd;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+	}
+
+	return returned_events;
+}
+
 #elif defined(WAIT_USE_POLL)
 
 /*
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 050c48b108..54ac286e9b 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -331,6 +331,9 @@
 /* Define to 1 if __builtin_constant_p(x) implies "i"(x) acceptance. */
 #undef HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 #undef HAVE_LANGINFO_H
 
@@ -602,6 +605,9 @@
 /* Define to 1 if you have the <sys/epoll.h> header file. */
 #undef HAVE_SYS_EPOLL_H
 
+/* Define to 1 if you have the <sys/event.h> header file. */
+#undef HAVE_SYS_EVENT_H
+
 /* Define to 1 if you have the <sys/ipc.h> header file. */
 #undef HAVE_SYS_IPC_H
 
diff --git a/src/include/pg_config.h.win32 b/src/include/pg_config.h.win32
index 808f5abcdb..dd261fc65a 100644
--- a/src/include/pg_config.h.win32
+++ b/src/include/pg_config.h.win32
@@ -231,6 +231,9 @@
 /* Define to 1 if you have isinf(). */
 #define HAVE_ISINF 1
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 /* #undef HAVE_LANGINFO_H */
 
@@ -443,6 +446,12 @@
 /* Define to 1 if you have the syslog interface. */
 /* #undef HAVE_SYSLOG */
 
+/* Define to 1 if you have the <sys/epoll.h> header file. */
+/* #undef HAVE_SYS_EPOLL_H */
+
+/* Define to 1 if you have the <sys/event.h> header file. */
+/* #undef HAVE_SYS_EVENT_H */
+
 /* Define to 1 if you have the <sys/ipc.h> header file. */
 /* #undef HAVE_SYS_IPC_H */
 
-- 
2.23.0

0001-Add-kqueue-2-support-for-WaitEvent-v13-REL_11_STABLE.patchapplication/octet-stream; name=0001-Add-kqueue-2-support-for-WaitEvent-v13-REL_11_STABLE.patchDownload
From 32df498d89f8eb71046e6c50f2a013a1c7fbe5d4 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@enterprisedb.com>
Date: Thu, 22 Jun 2017 18:40:27 +1200
Subject: [PATCH] Add kqueue(2) support for WaitEventSet.

Add a kqueue(2) based implementation of WaitEventSet for use on BSD
family systems including FreeBSD, NetBSD, OpenBSD and macOS.  This
is similar to the epoll(2) implementation for Linux.

Unlike the epoll(2) implementation, the kqueue(2) implementation
doesn't need to use the postmaster_alive_fds pipe.  Instead, it
requests notification of process exit.

Author: Thomas Munro
Reviewed-By: Andres Freund, Marko Tiikkaja
Tested-By: Mateusz Guzik, Matteo Beccati, Keith Fiske, Heikki Linnakangas
Discussion: https://postgr.es/m/CAEepm%3D37oF84-iXDTQ9MrGjENwVGds%2B5zTr38ca73kWR7ez_tA%40mail.gmail.com
---
 configure                       |   4 +-
 configure.in                    |   3 +-
 src/backend/storage/ipc/latch.c | 298 +++++++++++++++++++++++++++++++-
 src/include/pg_config.h.in      |   6 +
 src/include/pg_config.h.win32   |   9 +
 5 files changed, 316 insertions(+), 4 deletions(-)

diff --git a/configure b/configure
index 81aa86af8e..d934048f92 100755
--- a/configure
+++ b/configure
@@ -12487,7 +12487,7 @@ $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h
 fi
 
 
-for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/ipc.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
+for ac_header in atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -14908,7 +14908,7 @@ fi
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-for ac_func in cbrt clock_gettime dlopen fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memmove poll posix_fallocate pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range uselocale utime utimes wcstombs_l
+for ac_func in cbrt clock_gettime dlopen fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memmove poll posix_fallocate pstat pthread_is_threaded_np readlink setproctitle setsid shm_open symlink sync_file_range uselocale utime utimes wcstombs_l
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
diff --git a/configure.in b/configure.in
index 6a0c1758b5..6570f22a62 100644
--- a/configure.in
+++ b/configure.in
@@ -1305,7 +1305,7 @@ AC_SUBST(UUID_LIBS)
 
 AC_HEADER_STDBOOL
 
-AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/ipc.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
+AC_CHECK_HEADERS([atomic.h crypt.h dld.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h])
 
 # On BSD, test for net/if.h will fail unless sys/socket.h
 # is included first.
@@ -1593,6 +1593,7 @@ AC_CHECK_FUNCS(m4_normalize([
 	getifaddrs
 	getpeerucred
 	getrlimit
+	kqueue
 	mbstowcs_l
 	memmove
 	poll
diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c
index e6706f7fb8..73ed6bc337 100644
--- a/src/backend/storage/ipc/latch.c
+++ b/src/backend/storage/ipc/latch.c
@@ -39,6 +39,9 @@
 #ifdef HAVE_SYS_EPOLL_H
 #include <sys/epoll.h>
 #endif
+#ifdef HAVE_SYS_EVENT_H
+#include <sys/event.h>
+#endif
 #ifdef HAVE_POLL_H
 #include <poll.h>
 #endif
@@ -59,10 +62,12 @@
  * define somewhere before this block.
  */
 #if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_POLL) || \
-	defined(WAIT_USE_WIN32)
+	defined(WAIT_USE_KQUEUE) || defined(WAIT_USE_WIN32)
 /* don't overwrite manual choice */
 #elif defined(HAVE_SYS_EPOLL_H)
 #define WAIT_USE_EPOLL
+#elif defined(HAVE_KQUEUE)
+#define WAIT_USE_KQUEUE
 #elif defined(HAVE_POLL)
 #define WAIT_USE_POLL
 #elif WIN32
@@ -92,10 +97,17 @@ struct WaitEventSet
 	Latch	   *latch;
 	int			latch_pos;
 
+	/* A pointer to an event deferred until the next wait. */
+	WaitEvent  *pending_event;
+
 #if defined(WAIT_USE_EPOLL)
 	int			epoll_fd;
 	/* epoll_wait returns events in a user provided arrays, allocate once */
 	struct epoll_event *epoll_ret_events;
+#elif defined(WAIT_USE_KQUEUE)
+	int			kqueue_fd;
+	/* kevent returns events in a user provided arrays, allocate once */
+	struct kevent *kqueue_ret_events;
 #elif defined(WAIT_USE_POLL)
 	/* poll expects events to be waited on every poll() call, prepare once */
 	struct pollfd *pollfds;
@@ -128,6 +140,8 @@ static void drainSelfPipe(void);
 
 #if defined(WAIT_USE_EPOLL)
 static void WaitEventAdjustEpoll(WaitEventSet *set, WaitEvent *event, int action);
+#elif defined(WAIT_USE_KQUEUE)
+static void WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events);
 #elif defined(WAIT_USE_POLL)
 static void WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event);
 #elif defined(WAIT_USE_WIN32)
@@ -534,6 +548,8 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 
 #if defined(WAIT_USE_EPOLL)
 	sz += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	sz += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	sz += MAXALIGN(sizeof(struct pollfd) * nevents);
 #elif defined(WAIT_USE_WIN32)
@@ -552,6 +568,9 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 #if defined(WAIT_USE_EPOLL)
 	set->epoll_ret_events = (struct epoll_event *) data;
 	data += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_ret_events = (struct kevent *) data;
+	data += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	set->pollfds = (struct pollfd *) data;
 	data += MAXALIGN(sizeof(struct pollfd) * nevents);
@@ -576,6 +595,12 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 	if (fcntl(set->epoll_fd, F_SETFD, FD_CLOEXEC) == -1)
 		elog(ERROR, "fcntl(F_SETFD) failed on epoll descriptor: %m");
 #endif							/* EPOLL_CLOEXEC */
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_fd = kqueue();
+	if (set->kqueue_fd < 0)
+		elog(ERROR, "kqueue failed: %m");
+	if (fcntl(set->kqueue_fd, F_SETFD, FD_CLOEXEC) == -1)
+		elog(ERROR, "fcntl(F_SETFD) failed on kqueue descriptor: %m");
 #elif defined(WAIT_USE_WIN32)
 
 	/*
@@ -608,6 +633,8 @@ FreeWaitEventSet(WaitEventSet *set)
 {
 #if defined(WAIT_USE_EPOLL)
 	close(set->epoll_fd);
+#elif defined(WAIT_USE_KQUEUE)
+	close(set->kqueue_fd);
 #elif defined(WAIT_USE_WIN32)
 	WaitEvent  *cur_event;
 
@@ -717,6 +744,8 @@ AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch,
 	/* perform wait primitive specific initialization, if needed */
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_ADD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, 0);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -736,10 +765,16 @@ void
 ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 {
 	WaitEvent  *event;
+#if defined(WAIT_USE_KQUEUE)
+	int old_events;
+#endif
 
 	Assert(pos < set->nevents);
 
 	event = &set->events[pos];
+#if defined(WAIT_USE_KQUEUE)
+	old_events = event->events;
+#endif
 
 	/*
 	 * If neither the event mask nor the associated latch changes, return
@@ -773,6 +808,8 @@ ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_MOD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, old_events);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -863,6 +900,129 @@ WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event)
 }
 #endif
 
+#if defined(WAIT_USE_KQUEUE)
+
+/*
+ * On most BSD family systems, the udata member of struct kevent is of type
+ * void *, so we could directly convert to/from WaitEvent *.  Unfortunately,
+ * NetBSD has it as intptr_t, so here we wallpaper over that difference with
+ * an lvalue cast.
+ */
+#define AccessWaitEvent(k_ev) (*((WaitEvent **)(&(k_ev)->udata)))
+
+static inline void
+WaitEventAdjustKqueueAdd(struct kevent *k_ev, int filter, int action,
+						 WaitEvent *event)
+{
+	k_ev->ident = event->fd;
+	k_ev->filter = filter;
+	k_ev->flags = action | EV_CLEAR;
+	k_ev->fflags = 0;
+	k_ev->data = 0;
+	AccessWaitEvent(k_ev) = event;
+}
+
+static inline void
+WaitEventAdjustKqueueAddPostmaster(struct kevent *k_ev, WaitEvent *event)
+{
+	/* For now postmaster death can only be added, not removed. */
+	k_ev->ident = PostmasterPid;
+	k_ev->filter = EVFILT_PROC;
+	k_ev->flags = EV_ADD | EV_CLEAR;
+	k_ev->fflags = NOTE_EXIT;
+	k_ev->data = 0;
+	AccessWaitEvent(k_ev) = event;
+}
+
+/*
+ * old_events is the previous event mask, used to compute what has changed.
+ */
+static void
+WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events)
+{
+	int rc;
+	struct kevent k_ev[2];
+	int count = 0;
+	bool new_filt_read = false;
+	bool old_filt_read = false;
+	bool new_filt_write = false;
+	bool old_filt_write = false;
+
+	if (old_events == event->events)
+		return;
+
+	Assert(event->events != WL_LATCH_SET || set->latch != NULL);
+	Assert(event->events == WL_LATCH_SET ||
+		   event->events == WL_POSTMASTER_DEATH ||
+		   (event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)));
+
+	if (event->events == WL_POSTMASTER_DEATH)
+	{
+		/*
+		 * Unlike all the other implementations, we detect postmaster death
+		 * using process notification instead of waiting on the postmaster
+		 * alive pipe.
+		 */
+		WaitEventAdjustKqueueAddPostmaster(&k_ev[count++], event);
+	}
+	else
+	{
+		/*
+		 * We need to compute the adds and deletes required to get from the
+		 * old event mask to the new event mask, since kevent treats readable
+		 * and writable as separate events.
+		 */
+		if (old_events == WL_LATCH_SET ||
+			(old_events & WL_SOCKET_READABLE))
+				old_filt_read = true;
+		if (event->events == WL_LATCH_SET ||
+			(event->events & WL_SOCKET_READABLE))
+			new_filt_read = true;
+		if (old_events & WL_SOCKET_WRITEABLE)
+			old_filt_write = true;
+		if (event->events & WL_SOCKET_WRITEABLE)
+			new_filt_write = true;
+		if (old_filt_read && !new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_DELETE,
+									 event);
+		else if (!old_filt_read && new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_ADD,
+									 event);
+		if (old_filt_write && !new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_DELETE,
+									 event);
+		else if (!old_filt_write && new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_ADD,
+									 event);
+	}
+
+	Assert(count > 0);
+	Assert(count <= 2);
+
+	rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+
+	if (rc < 0)
+	{
+		if (event->events == WL_POSTMASTER_DEATH && errno == ESRCH)
+		{
+			/*
+			 * The postmaster is already dead.  Defer reporting this to the
+			 * caller until wait time, for compatibility with the other
+			 * implementations.
+			 */
+			set->pending_event = event;
+		}
+		else
+		{
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed: %m")));
+		}
+	}
+}
+
+#endif
+
 #if defined(WAIT_USE_WIN32)
 static void
 WaitEventAdjustWin32(WaitEventSet *set, WaitEvent *event)
@@ -929,6 +1089,14 @@ WaitEventSetWait(WaitEventSet *set, long timeout,
 
 	Assert(nevents > 0);
 
+	/* Return an event that was deferred until the next wait. */
+	if (unlikely(set->pending_event))
+	{
+		occurred_events[0] = *set->pending_event;
+		set->pending_event = NULL;
+		return 1;
+	}
+
 	/*
 	 * Initialize timeout if requested.  We must record the current time so
 	 * that we can determine the remaining timeout if interrupted.
@@ -1150,6 +1318,134 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
 	return returned_events;
 }
 
+#elif defined(WAIT_USE_KQUEUE)
+
+/*
+ * Wait using FreeBSD kqueue(2)/kevent(2).  Also available on other BSD-family
+ * systems including macOS.
+ *
+ * This is the preferrable wait method for systems that have it, as several
+ * readiness notifications are delivered, without having to iterate through
+ * all of set->events.
+ *
+ * For now this mirrors the epoll code, but in future it could modify the fd
+ * set in the same call to kevent as it uses for waiting instead of doing that
+ * with separate system calls.
+ */
+static int
+WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
+					  WaitEvent *occurred_events, int nevents)
+{
+	int			returned_events = 0;
+	int			rc;
+	WaitEvent  *cur_event;
+	struct kevent *cur_kqueue_event;
+	struct timespec timeout;
+	struct timespec *timeout_p;
+
+	if (cur_timeout < 0)
+		timeout_p = NULL;
+	else
+	{
+		timeout.tv_sec = cur_timeout / 1000;
+		timeout.tv_nsec = (cur_timeout % 1000) * 1000000;
+		timeout_p = &timeout;
+	}
+
+	/* Sleep */
+	rc = kevent(set->kqueue_fd, NULL, 0,
+				set->kqueue_ret_events, nevents,
+				timeout_p);
+
+	/* Check return code */
+	if (rc < 0)
+	{
+		/* EINTR is okay, otherwise complain */
+		if (errno != EINTR)
+		{
+			waiting = false;
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed while trying to wait: %m")));
+		}
+		return 0;
+	}
+	else if (rc == 0)
+	{
+		/* timeout exceeded */
+		return -1;
+	}
+
+	/*
+	 * At least one event occurred, iterate over the returned kqueue events
+	 * until they're either all processed, or we've returned all the events
+	 * the caller desired.
+	 */
+	for (cur_kqueue_event = set->kqueue_ret_events;
+		 cur_kqueue_event < (set->kqueue_ret_events + rc) &&
+		 returned_events < nevents;
+		 cur_kqueue_event++)
+	{
+		/* kevent's udata points to the associated WaitEvent */
+		cur_event = AccessWaitEvent(cur_kqueue_event);
+
+		occurred_events->pos = cur_event->pos;
+		occurred_events->user_data = cur_event->user_data;
+		occurred_events->events = 0;
+
+		if (cur_event->events == WL_LATCH_SET &&
+			cur_kqueue_event->filter == EVFILT_READ)
+		{
+			/* There's data in the self-pipe, clear it. */
+			drainSelfPipe();
+
+			if (set->latch->is_set)
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_LATCH_SET;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events == WL_POSTMASTER_DEATH &&
+				 cur_kqueue_event->filter == EVFILT_PROC &&
+				 (cur_kqueue_event->fflags & NOTE_EXIT) != 0)
+		{
+			occurred_events->fd = PGINVALID_SOCKET;
+			occurred_events->events = WL_POSTMASTER_DEATH;
+			occurred_events++;
+			returned_events++;
+		}
+		else if (cur_event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE))
+		{
+			Assert(cur_event->fd >= 0);
+
+			if ((cur_event->events & WL_SOCKET_READABLE) &&
+				(cur_kqueue_event->filter == EVFILT_READ))
+			{
+				/* readable, or EOF */
+				occurred_events->events |= WL_SOCKET_READABLE;
+			}
+
+			if ((cur_event->events & WL_SOCKET_WRITEABLE) &&
+				(cur_kqueue_event->filter == EVFILT_WRITE))
+			{
+				/* writable, or EOF */
+				occurred_events->events |= WL_SOCKET_WRITEABLE;
+			}
+
+			if (occurred_events->events != 0)
+			{
+				occurred_events->fd = cur_event->fd;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+	}
+
+	return returned_events;
+}
+
 #elif defined(WAIT_USE_POLL)
 
 /*
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 287bd0d80d..985a25d896 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -333,6 +333,9 @@
 /* Define to 1 if you have isinf(). */
 #undef HAVE_ISINF
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 #undef HAVE_LANGINFO_H
 
@@ -601,6 +604,9 @@
 /* Define to 1 if you have the <sys/epoll.h> header file. */
 #undef HAVE_SYS_EPOLL_H
 
+/* Define to 1 if you have the <sys/event.h> header file. */
+#undef HAVE_SYS_EVENT_H
+
 /* Define to 1 if you have the <sys/ipc.h> header file. */
 #undef HAVE_SYS_IPC_H
 
diff --git a/src/include/pg_config.h.win32 b/src/include/pg_config.h.win32
index 67b3715ad0..3b8a2730bd 100644
--- a/src/include/pg_config.h.win32
+++ b/src/include/pg_config.h.win32
@@ -240,6 +240,9 @@
 /* Define to 1 if you have isinf(). */
 #define HAVE_ISINF 1
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 /* #undef HAVE_LANGINFO_H */
 
@@ -483,6 +486,12 @@
 /* Define to 1 if you have the syslog interface. */
 /* #undef HAVE_SYSLOG */
 
+/* Define to 1 if you have the <sys/epoll.h> header file. */
+/* #undef HAVE_SYS_EPOLL_H */
+
+/* Define to 1 if you have the <sys/event.h> header file. */
+/* #undef HAVE_SYS_EVENT_H */
+
 /* Define to 1 if you have the <sys/ipc.h> header file. */
 /* #undef HAVE_SYS_IPC_H */
 
-- 
2.23.0

#65Thomas Munro
thomas.munro@gmail.com
In reply to: Thomas Munro (#64)
Re: [HACKERS] kqueue

On Fri, Dec 20, 2019 at 1:26 PM Thomas Munro <thomas.munro@gmail.com> wrote:

On Fri, Dec 20, 2019 at 12:41 PM Rui DeSousa <rui@crazybean.net> wrote:

PostgreSQL 11

BTW, PostgreSQL 12 has an improvement that may be relevant for your
case: it suppresses a bunch of high frequency reads on the "postmaster
death" pipe in some scenarios, mainly the streaming replica replay
loop (if you build on a system new enough to have PROC_PDEATHSIG_CTL,
namely FreeBSD 11.2+, it doesn't bother reading the pipe unless it's
received a signal). That pipe is inherited by every process and
included in every poll() set. The kqueue patch doesn't even bother to
add it to the wait event set, preferring to use an EVFILT_PROC event,
so in theory we could get rid of the death pipe completely on FreeBSD
and rely on EVFILT_PROC (sleeping) and PDEATHSIG (while awake), but I
wouldn't want to make the code diverge from the Linux code too much,
so I figured we should leave the pipe in place but just avoid
accessing it when possible, if that makes sense.

#66Rui DeSousa
rui@crazybean.net
In reply to: Thomas Munro (#64)
Re: [HACKERS] kqueue

Thanks Thomas,

Just a quick update.

I just deployed this patch into a lower environment yesterday running FreeBSD 12.1 and PostgreSQL 11.6. I see a significant reduction is CPU/system load from load highs of 500+ down to the low 20’s. System CPU time has been reduced to practically nothing.

I’m working with our support vendor in testing the patch and will continue to let it burn in. Hopefully, we can get the patched committed. Thanks.

Show quoted text

On Dec 19, 2019, at 7:26 PM, Thomas Munro <thomas.munro@gmail.com> wrote:

It's still my intention to get this committed eventually, but I got a
bit frazzled by conflicting reports on several operating systems. For
FreeBSD, performance was improved in many cases, but there were also
some regressions that seemed to be related to ongoing work in the
kernel that seemed worth waiting for. I don't have the details
swapped into my brain right now, but there was something about a big
kernel lock for Unix domain sockets which possibly explained some
local pgbench problems, and there was also a problem relating to
wakeup priority with some test parameters, which I'd need to go and
dig up. If you want to test this and let us know how you get on,
that'd be great! Here's a rebase against PostgreSQL's master branch,
and since you mentioned PostgreSQL 11, here's a rebased version for
REL_11_STABLE in case that's easier for you to test/build via ports or
whatever and test with your production workload (eg on a throwaway
copy of your production system). You can see it's working by looking
in top: instead of state "select" (which is how poll() is reported)
you see "kqread", which on its own isn't exciting enough to get this
committed :-)

#67Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Thomas Munro (#64)
Re: [HACKERS] kqueue

On 2019-12-20 01:26, Thomas Munro wrote:

It's still my intention to get this committed eventually, but I got a
bit frazzled by conflicting reports on several operating systems. For
FreeBSD, performance was improved in many cases, but there were also
some regressions that seemed to be related to ongoing work in the
kernel that seemed worth waiting for. I don't have the details
swapped into my brain right now, but there was something about a big
kernel lock for Unix domain sockets which possibly explained some
local pgbench problems, and there was also a problem relating to
wakeup priority with some test parameters, which I'd need to go and
dig up. If you want to test this and let us know how you get on,
that'd be great! Here's a rebase against PostgreSQL's master branch,

I took this patch for a quick spin on macOS. The result was that the
test suite hangs in the test src/test/recovery/t/017_shm.pl. I didn't
see any mentions of this anywhere in the thread, but that test is newer
than the beginning of this thread. Can anyone confirm or deny this
issue? Is it specific to macOS perhaps?

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#68Tom Lane
tgl@sss.pgh.pa.us
In reply to: Peter Eisentraut (#67)
Re: [HACKERS] kqueue

Peter Eisentraut <peter.eisentraut@2ndquadrant.com> writes:

I took this patch for a quick spin on macOS. The result was that the
test suite hangs in the test src/test/recovery/t/017_shm.pl. I didn't
see any mentions of this anywhere in the thread, but that test is newer
than the beginning of this thread. Can anyone confirm or deny this
issue? Is it specific to macOS perhaps?

Yeah, I duplicated the problem in macOS Catalina (10.15.2), using today's
HEAD. The core regression tests pass, as do the earlier recovery tests
(I didn't try a full check-world though). Somewhere early in 017_shm.pl,
things freeze up with four postmaster-child processes stuck in 100%-
CPU-consuming loops. I captured stack traces:

(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
* frame #0: 0x00007fff6554dbb6 libsystem_kernel.dylib`kqueue + 10
frame #1: 0x0000000105511533 postgres`CreateWaitEventSet(context=<unavailable>, nevents=<unavailable>) at latch.c:622:19 [opt]
frame #2: 0x0000000105511305 postgres`WaitLatchOrSocket(latch=0x0000000112e02da4, wakeEvents=41, sock=-1, timeout=237000, wait_event_info=83886084) at latch.c:389:22 [opt]
frame #3: 0x00000001054a7073 postgres`CheckpointerMain at checkpointer.c:514:10 [opt]
frame #4: 0x00000001052da390 postgres`AuxiliaryProcessMain(argc=2, argv=0x00007ffeea9dded0) at bootstrap.c:461:4 [opt]

(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
* frame #0: 0x00007fff6554dbce libsystem_kernel.dylib`kevent + 10
frame #1: 0x0000000105511ddc postgres`WaitEventAdjustKqueue(set=0x00007fc8e8805920, event=0x00007fc8e8805958, old_events=<unavailable>) at latch.c:1034:7 [opt]
frame #2: 0x0000000105511638 postgres`AddWaitEventToSet(set=<unavailable>, events=<unavailable>, fd=<unavailable>, latch=<unavailable>, user_data=<unavailable>) at latch.c:778:2 [opt]
frame #3: 0x0000000105511342 postgres`WaitLatchOrSocket(latch=0x0000000112e030f4, wakeEvents=41, sock=-1, timeout=200, wait_event_info=83886083) at latch.c:397:3 [opt]
frame #4: 0x00000001054a6d69 postgres`BackgroundWriterMain at bgwriter.c:304:8 [opt]
frame #5: 0x00000001052da38b postgres`AuxiliaryProcessMain(argc=2, argv=0x00007ffeea9dded0) at bootstrap.c:456:4 [opt]

(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
* frame #0: 0x00007fff65549c66 libsystem_kernel.dylib`close + 10
frame #1: 0x0000000105511466 postgres`WaitLatchOrSocket [inlined] FreeWaitEventSet(set=<unavailable>) at latch.c:660:2 [opt]
frame #2: 0x000000010551145d postgres`WaitLatchOrSocket(latch=0x0000000112e03444, wakeEvents=<unavailable>, sock=-1, timeout=5000, wait_event_info=83886093) at latch.c:432 [opt]
frame #3: 0x00000001054b8685 postgres`WalWriterMain at walwriter.c:256:10 [opt]
frame #4: 0x00000001052da39a postgres`AuxiliaryProcessMain(argc=2, argv=0x00007ffeea9dded0) at bootstrap.c:467:4 [opt]

(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
* frame #0: 0x00007fff655515be libsystem_kernel.dylib`__select + 10
frame #1: 0x00000001056a6191 postgres`pg_usleep(microsec=<unavailable>) at pgsleep.c:56:10 [opt]
frame #2: 0x00000001054abe12 postgres`backend_read_statsfile at pgstat.c:5720:3 [opt]
frame #3: 0x00000001054adcc0 postgres`pgstat_fetch_stat_dbentry(dbid=<unavailable>) at pgstat.c:2431:2 [opt]
frame #4: 0x00000001054a320c postgres`do_start_worker at autovacuum.c:1248:20 [opt]
frame #5: 0x00000001054a2639 postgres`AutoVacLauncherMain [inlined] launch_worker(now=632853327674576) at autovacuum.c:1357:9 [opt]
frame #6: 0x00000001054a2634 postgres`AutoVacLauncherMain(argc=<unavailable>, argv=<unavailable>) at autovacuum.c:769 [opt]
frame #7: 0x00000001054a1ea7 postgres`StartAutoVacLauncher at autovacuum.c:415:4 [opt]

I'm not sure how much faith to put in the last couple of those, as
stopping the earlier processes could perhaps have had side-effects.
But evidently 017_shm.pl is doing something that interferes with
our ability to create kqueue-based WaitEventSets.

regards, tom lane

#69Tom Lane
tgl@sss.pgh.pa.us
In reply to: Thomas Munro (#64)
Re: [HACKERS] kqueue

Thomas Munro <thomas.munro@gmail.com> writes:

[ 0001-Add-kqueue-2-support-for-WaitEventSet-v13.patch ]

I haven't read this patch in any detail, but a couple quick notes:

* It needs to be rebased over the removal of pg_config.h.win32
--- it should be touching Solution.pm instead, I believe.

* I'm disturbed by the addition of a hunk to the supposedly
system-API-independent WaitEventSetWait() function. Is that
a generic bug fix? If not, can we either get rid of it, or
at least wrap it in "#ifdef WAIT_USE_KQUEUE" so that this
patch isn't inflicting a performance penalty on everyone else?

regards, tom lane

#70Thomas Munro
thomas.munro@gmail.com
In reply to: Peter Eisentraut (#67)
Re: [HACKERS] kqueue

On Tue, Jan 21, 2020 at 2:34 AM Peter Eisentraut
<peter.eisentraut@2ndquadrant.com> wrote:

I took this patch for a quick spin on macOS. The result was that the
test suite hangs in the test src/test/recovery/t/017_shm.pl. I didn't
see any mentions of this anywhere in the thread, but that test is newer
than the beginning of this thread. Can anyone confirm or deny this
issue? Is it specific to macOS perhaps?

Thanks for testing, and sorry I didn't run a full check-world after
that rebase. What happened here is that after commit cfdf4dc4 landed
on master, every implementation now needs to check for
exit_on_postmaster_death, and this patch didn't get the message.
Those processes are stuck in their main loops having detected
postmaster death, but not having any handling for it. Will fix.

#71Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#68)
Re: [HACKERS] kqueue

I wrote:

Peter Eisentraut <peter.eisentraut@2ndquadrant.com> writes:

I took this patch for a quick spin on macOS. The result was that the
test suite hangs in the test src/test/recovery/t/017_shm.pl. I didn't
see any mentions of this anywhere in the thread, but that test is newer
than the beginning of this thread. Can anyone confirm or deny this
issue? Is it specific to macOS perhaps?

Yeah, I duplicated the problem in macOS Catalina (10.15.2), using today's
HEAD. The core regression tests pass, as do the earlier recovery tests
(I didn't try a full check-world though). Somewhere early in 017_shm.pl,
things freeze up with four postmaster-child processes stuck in 100%-
CPU-consuming loops.

I observe very similar behavior on FreeBSD/amd64 12.0-RELEASE-p12,
so it's not just macOS.

I now think that the autovac launcher isn't actually stuck in the way
that the other processes are. The ones that are actually consuming
CPU are the checkpointer, bgwriter, and walwriter. On the FreeBSD
box their stack traces are

(gdb) bt
#0 _close () at _close.S:3
#1 0x00000000007b4dd1 in FreeWaitEventSet (set=<optimized out>) at latch.c:660
#2 WaitLatchOrSocket (latch=0x80a1477a8, wakeEvents=<optimized out>, sock=-1,
timeout=<optimized out>, wait_event_info=83886084) at latch.c:432
#3 0x000000000074a1b0 in CheckpointerMain () at checkpointer.c:514
#4 0x00000000005691e2 in AuxiliaryProcessMain (argc=2, argv=0x7fffffffce90)
at bootstrap.c:461

(gdb) bt
#0 _fcntl () at _fcntl.S:3
#1 0x0000000800a6cd84 in fcntl (fd=4, cmd=2)
at /usr/src/lib/libc/sys/fcntl.c:56
#2 0x00000000007b4eb5 in CreateWaitEventSet (context=<optimized out>,
nevents=<optimized out>) at latch.c:625
#3 0x00000000007b4c82 in WaitLatchOrSocket (latch=0x80a147b00, wakeEvents=41,
sock=-1, timeout=200, wait_event_info=83886083) at latch.c:389
#4 0x0000000000749ecd in BackgroundWriterMain () at bgwriter.c:304
#5 0x00000000005691dd in AuxiliaryProcessMain (argc=2, argv=0x7fffffffce90)
at bootstrap.c:456

(gdb) bt
#0 _kevent () at _kevent.S:3
#1 0x00000000007b58a1 in WaitEventAdjustKqueue (set=0x800e6a120,
event=0x800e6a170, old_events=<optimized out>) at latch.c:1034
#2 0x00000000007b4d87 in AddWaitEventToSet (set=<optimized out>,
events=<error reading variable: Cannot access memory at address 0x10>,
fd=-1, latch=<optimized out>, user_data=<optimized out>) at latch.c:778
#3 WaitLatchOrSocket (latch=0x80a147e58, wakeEvents=41, sock=-1,
timeout=5000, wait_event_info=83886093) at latch.c:410
#4 0x000000000075b349 in WalWriterMain () at walwriter.c:256
#5 0x00000000005691ec in AuxiliaryProcessMain (argc=2, argv=0x7fffffffce90)
at bootstrap.c:467

Note that these are just snapshots --- it looks like these processes
are repeatedly creating and destroying WaitEventSets, they're not
stuck inside the kernel.

regards, tom lane

#72Thomas Munro
thomas.munro@gmail.com
In reply to: Tom Lane (#71)
1 attachment(s)
Re: [HACKERS] kqueue

On Tue, Jan 21, 2020 at 8:03 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

I observe very similar behavior on FreeBSD/amd64 12.0-RELEASE-p12,
so it's not just macOS.

Thanks for testing. Fixed by handling the new
exit_on_postmaster_death flag from commit cfdf4dc4.

On Tue, Jan 21, 2020 at 5:55 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

Thomas Munro <thomas.munro@gmail.com> writes:

[ 0001-Add-kqueue-2-support-for-WaitEventSet-v13.patch ]

I haven't read this patch in any detail, but a couple quick notes:

* It needs to be rebased over the removal of pg_config.h.win32
--- it should be touching Solution.pm instead, I believe.

Done.

* I'm disturbed by the addition of a hunk to the supposedly
system-API-independent WaitEventSetWait() function. Is that
a generic bug fix? If not, can we either get rid of it, or
at least wrap it in "#ifdef WAIT_USE_KQUEUE" so that this
patch isn't inflicting a performance penalty on everyone else?

Here's a version that adds no new code to non-WAIT_USE_KQUEUE paths.
That code deals with the fact that we sometimes discover the
postmaster is gone before we're in a position to report an event, so
we need an inter-function memory of some kind. The new coding also
handles a race case where someone reuses the postmaster's pid before
we notice it went away. In theory, the need for that could be
entirely removed by collapsing the 'adjust' call into the 'wait' call
(a single kevent() invocation can do both things), but I'm not sure if
it's worth the complexity. As for generally reducing syscalls noise,
for both kqueue and epoll, I think that should be addressed separately
by better reuse of WaitEventSet objects[1]/messages/by-id/CA+hUKGJAC4Oqao=qforhNey20J8CiG2R=oBPqvfR0vOJrFysGw@mail.gmail.com.

[1]: /messages/by-id/CA+hUKGJAC4Oqao=qforhNey20J8CiG2R=oBPqvfR0vOJrFysGw@mail.gmail.com

Attachments:

0001-Add-kqueue-2-support-for-WaitEventSet-v14.patchapplication/octet-stream; name=0001-Add-kqueue-2-support-for-WaitEventSet-v14.patchDownload
From 600ed5e568a1c22b7db02630267f4f4c41fb2f66 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
Date: Tue, 21 Jan 2020 11:32:09 +1300
Subject: [PATCH] Add kqueue(2) support for WaitEventSet.

Add a kqueue(2) based implementation of WaitEventSet for use on BSD
family systems including FreeBSD, NetBSD, OpenBSD and macOS.  This
is similar to the epoll(2) implementation for Linux.

Unlike the epoll(2) implementation, the kqueue(2) implementation
doesn't need to use the postmaster_alive_fds pipe.  Instead, it
requests notification of process exit.

Author: Thomas Munro
Reviewed-By: Andres Freund, Marko Tiikkaja, Tom Lane
Tested-By: Mateusz Guzik, Matteo Beccati, Keith Fiske, Heikki Linnakangas, Peter Eisentraut
Discussion: https://postgr.es/m/CAEepm%3D37oF84-iXDTQ9MrGjENwVGds%2B5zTr38ca73kWR7ez_tA%40mail.gmail.com
---
 configure                       |   4 +-
 configure.in                    |   2 +
 src/backend/storage/ipc/latch.c | 301 +++++++++++++++++++++++++++++++-
 src/include/pg_config.h.in      |   6 +
 src/tools/msvc/Solution.pm      |   2 +
 5 files changed, 312 insertions(+), 3 deletions(-)

diff --git a/configure b/configure
index 25cfbcb2cd..263c461e5c 100755
--- a/configure
+++ b/configure
@@ -12760,7 +12760,7 @@ $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h
 fi
 
 
-for ac_header in atomic.h copyfile.h execinfo.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/ipc.h sys/prctl.h sys/procctl.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
+for ac_header in atomic.h copyfile.h execinfo.h fp_class.h getopt.h ieeefp.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/prctl.h sys/procctl.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/sockio.h sys/tas.h sys/un.h termios.h ucred.h utime.h wchar.h wctype.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -14996,7 +14996,7 @@ fi
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-for ac_func in backtrace_symbols cbrt clock_gettime copyfile fdatasync getifaddrs getpeerucred getrlimit mbstowcs_l memset_s memmove poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink setproctitle setproctitle_fast setsid shm_open strchrnul strsignal symlink sync_file_range uselocale utime utimes wcstombs_l
+for ac_func in backtrace_symbols cbrt clock_gettime copyfile fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memset_s memmove poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink setproctitle setproctitle_fast setsid shm_open strchrnul strsignal symlink sync_file_range uselocale utime utimes wcstombs_l
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
diff --git a/configure.in b/configure.in
index 1599fc514d..e319256a8a 100644
--- a/configure.in
+++ b/configure.in
@@ -1288,6 +1288,7 @@ AC_CHECK_HEADERS(m4_normalize([
 	mbarrier.h
 	poll.h
 	sys/epoll.h
+	sys/event.h
 	sys/ipc.h
 	sys/prctl.h
 	sys/procctl.h
@@ -1628,6 +1629,7 @@ AC_CHECK_FUNCS(m4_normalize([
 	getifaddrs
 	getpeerucred
 	getrlimit
+	kqueue
 	mbstowcs_l
 	memset_s
 	memmove
diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c
index d677ffbda7..52587541f7 100644
--- a/src/backend/storage/ipc/latch.c
+++ b/src/backend/storage/ipc/latch.c
@@ -39,6 +39,9 @@
 #ifdef HAVE_SYS_EPOLL_H
 #include <sys/epoll.h>
 #endif
+#ifdef HAVE_SYS_EVENT_H
+#include <sys/event.h>
+#endif
 #ifdef HAVE_POLL_H
 #include <poll.h>
 #endif
@@ -60,10 +63,12 @@
  * define somewhere before this block.
  */
 #if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_POLL) || \
-	defined(WAIT_USE_WIN32)
+	defined(WAIT_USE_KQUEUE) || defined(WAIT_USE_WIN32)
 /* don't overwrite manual choice */
 #elif defined(HAVE_SYS_EPOLL_H)
 #define WAIT_USE_EPOLL
+#elif defined(HAVE_KQUEUE)
+#define WAIT_USE_KQUEUE
 #elif defined(HAVE_POLL)
 #define WAIT_USE_POLL
 #elif WIN32
@@ -104,6 +109,11 @@ struct WaitEventSet
 	int			epoll_fd;
 	/* epoll_wait returns events in a user provided arrays, allocate once */
 	struct epoll_event *epoll_ret_events;
+#elif defined(WAIT_USE_KQUEUE)
+	int			kqueue_fd;
+	/* kevent returns events in a user provided arrays, allocate once */
+	struct kevent *kqueue_ret_events;
+	bool		report_postmaster_not_running;
 #elif defined(WAIT_USE_POLL)
 	/* poll expects events to be waited on every poll() call, prepare once */
 	struct pollfd *pollfds;
@@ -136,6 +146,8 @@ static void drainSelfPipe(void);
 
 #if defined(WAIT_USE_EPOLL)
 static void WaitEventAdjustEpoll(WaitEventSet *set, WaitEvent *event, int action);
+#elif defined(WAIT_USE_KQUEUE)
+static void WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events);
 #elif defined(WAIT_USE_POLL)
 static void WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event);
 #elif defined(WAIT_USE_WIN32)
@@ -556,6 +568,8 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 
 #if defined(WAIT_USE_EPOLL)
 	sz += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	sz += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	sz += MAXALIGN(sizeof(struct pollfd) * nevents);
 #elif defined(WAIT_USE_WIN32)
@@ -574,6 +588,9 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 #if defined(WAIT_USE_EPOLL)
 	set->epoll_ret_events = (struct epoll_event *) data;
 	data += MAXALIGN(sizeof(struct epoll_event) * nevents);
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_ret_events = (struct kevent *) data;
+	data += MAXALIGN(sizeof(struct kevent) * nevents);
 #elif defined(WAIT_USE_POLL)
 	set->pollfds = (struct pollfd *) data;
 	data += MAXALIGN(sizeof(struct pollfd) * nevents);
@@ -599,6 +616,13 @@ CreateWaitEventSet(MemoryContext context, int nevents)
 	if (fcntl(set->epoll_fd, F_SETFD, FD_CLOEXEC) == -1)
 		elog(ERROR, "fcntl(F_SETFD) failed on epoll descriptor: %m");
 #endif							/* EPOLL_CLOEXEC */
+#elif defined(WAIT_USE_KQUEUE)
+	set->kqueue_fd = kqueue();
+	if (set->kqueue_fd < 0)
+		elog(ERROR, "kqueue failed: %m");
+	if (fcntl(set->kqueue_fd, F_SETFD, FD_CLOEXEC) == -1)
+		elog(ERROR, "fcntl(F_SETFD) failed on kqueue descriptor: %m");
+	set->report_postmaster_not_running = false;
 #elif defined(WAIT_USE_WIN32)
 
 	/*
@@ -631,6 +655,8 @@ FreeWaitEventSet(WaitEventSet *set)
 {
 #if defined(WAIT_USE_EPOLL)
 	close(set->epoll_fd);
+#elif defined(WAIT_USE_KQUEUE)
+	close(set->kqueue_fd);
 #elif defined(WAIT_USE_WIN32)
 	WaitEvent  *cur_event;
 
@@ -747,6 +773,8 @@ AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch,
 	/* perform wait primitive specific initialization, if needed */
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_ADD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, 0);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -766,10 +794,16 @@ void
 ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 {
 	WaitEvent  *event;
+#if defined(WAIT_USE_KQUEUE)
+	int			old_events;
+#endif
 
 	Assert(pos < set->nevents);
 
 	event = &set->events[pos];
+#if defined(WAIT_USE_KQUEUE)
+	old_events = event->events;
+#endif
 
 	/*
 	 * If neither the event mask nor the associated latch changes, return
@@ -803,6 +837,8 @@ ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
 
 #if defined(WAIT_USE_EPOLL)
 	WaitEventAdjustEpoll(set, event, EPOLL_CTL_MOD);
+#elif defined(WAIT_USE_KQUEUE)
+	WaitEventAdjustKqueue(set, event, old_events);
 #elif defined(WAIT_USE_POLL)
 	WaitEventAdjustPoll(set, event);
 #elif defined(WAIT_USE_WIN32)
@@ -895,6 +931,129 @@ WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event)
 }
 #endif
 
+#if defined(WAIT_USE_KQUEUE)
+
+/*
+ * On most BSD family systems, the udata member of struct kevent is of type
+ * void *, so we could directly convert to/from WaitEvent *.  Unfortunately,
+ * NetBSD has it as intptr_t, so here we wallpaper over that difference with
+ * an lvalue cast.
+ */
+#define AccessWaitEvent(k_ev) (*((WaitEvent **)(&(k_ev)->udata)))
+
+static inline void
+WaitEventAdjustKqueueAdd(struct kevent *k_ev, int filter, int action,
+						 WaitEvent *event)
+{
+	k_ev->ident = event->fd;
+	k_ev->filter = filter;
+	k_ev->flags = action | EV_CLEAR;
+	k_ev->fflags = 0;
+	k_ev->data = 0;
+	AccessWaitEvent(k_ev) = event;
+}
+
+static inline void
+WaitEventAdjustKqueueAddPostmaster(struct kevent *k_ev, WaitEvent *event)
+{
+	/* For now postmaster death can only be added, not removed. */
+	k_ev->ident = PostmasterPid;
+	k_ev->filter = EVFILT_PROC;
+	k_ev->flags = EV_ADD | EV_CLEAR;
+	k_ev->fflags = NOTE_EXIT;
+	k_ev->data = 0;
+	AccessWaitEvent(k_ev) = event;
+}
+
+/*
+ * old_events is the previous event mask, used to compute what has changed.
+ */
+static void
+WaitEventAdjustKqueue(WaitEventSet *set, WaitEvent *event, int old_events)
+{
+	int			rc;
+	struct kevent k_ev[2];
+	int			count = 0;
+	bool		new_filt_read = false;
+	bool		old_filt_read = false;
+	bool		new_filt_write = false;
+	bool		old_filt_write = false;
+
+	if (old_events == event->events)
+		return;
+
+	Assert(event->events != WL_LATCH_SET || set->latch != NULL);
+	Assert(event->events == WL_LATCH_SET ||
+		   event->events == WL_POSTMASTER_DEATH ||
+		   (event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)));
+
+	if (event->events == WL_POSTMASTER_DEATH)
+	{
+		/*
+		 * Unlike all the other implementations, we detect postmaster death
+		 * using process notification instead of waiting on the postmaster
+		 * alive pipe.
+		 */
+		WaitEventAdjustKqueueAddPostmaster(&k_ev[count++], event);
+	}
+	else
+	{
+		/*
+		 * We need to compute the adds and deletes required to get from the
+		 * old event mask to the new event mask, since kevent treats readable
+		 * and writable as separate events.
+		 */
+		if (old_events == WL_LATCH_SET ||
+			(old_events & WL_SOCKET_READABLE))
+			old_filt_read = true;
+		if (event->events == WL_LATCH_SET ||
+			(event->events & WL_SOCKET_READABLE))
+			new_filt_read = true;
+		if (old_events & WL_SOCKET_WRITEABLE)
+			old_filt_write = true;
+		if (event->events & WL_SOCKET_WRITEABLE)
+			new_filt_write = true;
+		if (old_filt_read && !new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_DELETE,
+									 event);
+		else if (!old_filt_read && new_filt_read)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_READ, EV_ADD,
+									 event);
+		if (old_filt_write && !new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_DELETE,
+									 event);
+		else if (!old_filt_write && new_filt_write)
+			WaitEventAdjustKqueueAdd(&k_ev[count++], EVFILT_WRITE, EV_ADD,
+									 event);
+	}
+
+	Assert(count > 0);
+	Assert(count <= 2);
+
+	rc = kevent(set->kqueue_fd, &k_ev[0], count, NULL, 0, NULL);
+
+	/*
+	 * When adding the postmaster's pid, we have to consider that it might
+	 * already have exited and perhaps even been replaced by another process
+	 * with the same pid.  If so, we have to defer reporting this as an event
+	 * until the next call to WaitEventSetWaitBlock().
+	 */
+
+	if (rc < 0)
+	{
+		if (event->events == WL_POSTMASTER_DEATH && errno == ESRCH)
+			set->report_postmaster_not_running = true;
+		else
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed: %m")));
+	}
+	else if (event->events == WL_POSTMASTER_DEATH && PostmasterPid != getppid())
+		set->report_postmaster_not_running = true;
+}
+
+#endif
+
 #if defined(WAIT_USE_WIN32)
 static void
 WaitEventAdjustWin32(WaitEventSet *set, WaitEvent *event)
@@ -1186,6 +1345,146 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
 	return returned_events;
 }
 
+#elif defined(WAIT_USE_KQUEUE)
+
+/*
+ * Wait using FreeBSD kqueue(2)/kevent(2).  Also available on other BSD-family
+ * systems including macOS.
+ *
+ * This is the preferrable wait method for systems that have it, as several
+ * readiness notifications are delivered, without having to iterate through
+ * all of set->events.
+ *
+ * For now this mirrors the epoll code, but in future it could modify the fd
+ * set in the same call to kevent as it uses for waiting instead of doing that
+ * with separate system calls.
+ */
+static int
+WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout,
+					  WaitEvent *occurred_events, int nevents)
+{
+	int			returned_events = 0;
+	int			rc;
+	WaitEvent  *cur_event;
+	struct kevent *cur_kqueue_event;
+	struct timespec timeout;
+	struct timespec *timeout_p;
+
+	if (cur_timeout < 0)
+		timeout_p = NULL;
+	else
+	{
+		timeout.tv_sec = cur_timeout / 1000;
+		timeout.tv_nsec = (cur_timeout % 1000) * 1000000;
+		timeout_p = &timeout;
+	}
+
+	/* Report events discovered by WaitEventAdjustKqueue(). */
+	if (unlikely(set->report_postmaster_not_running))
+	{
+		if (set->exit_on_postmaster_death)
+			proc_exit(1);
+		occurred_events->fd = PGINVALID_SOCKET;
+		occurred_events->events = WL_POSTMASTER_DEATH;
+		return 1;
+	}
+
+	/* Sleep */
+	rc = kevent(set->kqueue_fd, NULL, 0,
+				set->kqueue_ret_events, nevents,
+				timeout_p);
+
+	/* Check return code */
+	if (rc < 0)
+	{
+		/* EINTR is okay, otherwise complain */
+		if (errno != EINTR)
+		{
+			waiting = false;
+			ereport(ERROR,
+					(errcode_for_socket_access(),
+					 errmsg("kevent() failed while trying to wait: %m")));
+		}
+		return 0;
+	}
+	else if (rc == 0)
+	{
+		/* timeout exceeded */
+		return -1;
+	}
+
+	/*
+	 * At least one event occurred, iterate over the returned kqueue events
+	 * until they're either all processed, or we've returned all the events
+	 * the caller desired.
+	 */
+	for (cur_kqueue_event = set->kqueue_ret_events;
+		 cur_kqueue_event < (set->kqueue_ret_events + rc) &&
+		 returned_events < nevents;
+		 cur_kqueue_event++)
+	{
+		/* kevent's udata points to the associated WaitEvent */
+		cur_event = AccessWaitEvent(cur_kqueue_event);
+
+		occurred_events->pos = cur_event->pos;
+		occurred_events->user_data = cur_event->user_data;
+		occurred_events->events = 0;
+
+		if (cur_event->events == WL_LATCH_SET &&
+			cur_kqueue_event->filter == EVFILT_READ)
+		{
+			/* There's data in the self-pipe, clear it. */
+			drainSelfPipe();
+
+			if (set->latch->is_set)
+			{
+				occurred_events->fd = PGINVALID_SOCKET;
+				occurred_events->events = WL_LATCH_SET;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+		else if (cur_event->events == WL_POSTMASTER_DEATH &&
+				 cur_kqueue_event->filter == EVFILT_PROC &&
+				 (cur_kqueue_event->fflags & NOTE_EXIT) != 0)
+		{
+			if (set->exit_on_postmaster_death)
+				proc_exit(1);
+			occurred_events->fd = PGINVALID_SOCKET;
+			occurred_events->events = WL_POSTMASTER_DEATH;
+			occurred_events++;
+			returned_events++;
+		}
+		else if (cur_event->events & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE))
+		{
+			Assert(cur_event->fd >= 0);
+
+			if ((cur_event->events & WL_SOCKET_READABLE) &&
+				(cur_kqueue_event->filter == EVFILT_READ))
+			{
+				/* readable, or EOF */
+				occurred_events->events |= WL_SOCKET_READABLE;
+			}
+
+			if ((cur_event->events & WL_SOCKET_WRITEABLE) &&
+				(cur_kqueue_event->filter == EVFILT_WRITE))
+			{
+				/* writable, or EOF */
+				occurred_events->events |= WL_SOCKET_WRITEABLE;
+			}
+
+			if (occurred_events->events != 0)
+			{
+				occurred_events->fd = cur_event->fd;
+				occurred_events++;
+				returned_events++;
+			}
+		}
+	}
+
+	return returned_events;
+}
+
 #elif defined(WAIT_USE_POLL)
 
 /*
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 050c48b108..54ac286e9b 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -331,6 +331,9 @@
 /* Define to 1 if __builtin_constant_p(x) implies "i"(x) acceptance. */
 #undef HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P
 
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
 /* Define to 1 if you have the <langinfo.h> header file. */
 #undef HAVE_LANGINFO_H
 
@@ -602,6 +605,9 @@
 /* Define to 1 if you have the <sys/epoll.h> header file. */
 #undef HAVE_SYS_EPOLL_H
 
+/* Define to 1 if you have the <sys/event.h> header file. */
+#undef HAVE_SYS_EVENT_H
+
 /* Define to 1 if you have the <sys/ipc.h> header file. */
 #undef HAVE_SYS_IPC_H
 
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index be02bd4524..cc191ee7d7 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -281,6 +281,7 @@ sub GenerateFiles
 		HAVE_IPV6                                   => 1,
 		HAVE_ISINF                                  => 1,
 		HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P       => undef,
+		HAVE_KQUEUE                                 => undef,
 		HAVE_LANGINFO_H                             => undef,
 		HAVE_LDAP_H                                 => undef,
 		HAVE_LDAP_INITIALIZE                        => undef,
@@ -371,6 +372,7 @@ sub GenerateFiles
 		HAVE_SYMLINK                             => 1,
 		HAVE_SYSLOG                              => undef,
 		HAVE_SYS_EPOLL_H                         => undef,
+		HAVE_SYS_EVENT_H                         => undef,
 		HAVE_SYS_IPC_H                           => undef,
 		HAVE_SYS_PRCTL_H                         => undef,
 		HAVE_SYS_PROCCTL_H                       => undef,
-- 
2.23.0

#73Matteo Beccati
php@beccati.com
In reply to: Thomas Munro (#72)
Re: [HACKERS] kqueue

Hi,

On 21/01/2020 02:06, Thomas Munro wrote:

[1] /messages/by-id/CA+hUKGJAC4Oqao=qforhNey20J8CiG2R=oBPqvfR0vOJrFysGw@mail.gmail.com

I had a NetBSD 8.0 VM lying around and I gave the patch a spin on latest
master.

With the kqueue patch, a pgbench -c basically hangs the whole postgres
instance. Not sure if it's a kernel issue, HyperVM issue o what, but
when it hangs, I can't even kill -9 the postgres processes or get the VM
to properly shutdown. The same doesn't happen, of course, with vanilla
postgres.

If the patch gets merged, I'd say it's safer not to enable it on NetBSD
and eventually leave it up to the pkgsrc team.

Cheers
--
Matteo Beccati

Development & Consulting - http://www.beccati.com/

#74Tom Lane
tgl@sss.pgh.pa.us
In reply to: Matteo Beccati (#73)
Re: [HACKERS] kqueue

Matteo Beccati <php@beccati.com> writes:

On 21/01/2020 02:06, Thomas Munro wrote:

[1] /messages/by-id/CA+hUKGJAC4Oqao=qforhNey20J8CiG2R=oBPqvfR0vOJrFysGw@mail.gmail.com

I had a NetBSD 8.0 VM lying around and I gave the patch a spin on latest
master.
With the kqueue patch, a pgbench -c basically hangs the whole postgres
instance. Not sure if it's a kernel issue, HyperVM issue o what, but
when it hangs, I can't even kill -9 the postgres processes or get the VM
to properly shutdown. The same doesn't happen, of course, with vanilla
postgres.

I'm a bit confused about what you are testing --- the kqueue patch
as per this thread, or that plus the WaitLatch refactorizations in
the other thread you point to above?

I've gotten through check-world successfully with the v14 kqueue patch
atop yesterday's HEAD on:

* macOS Catalina 10.15.2 (current release)
* FreeBSD/amd64 12.0-RELEASE-p12
* NetBSD/amd64 8.1
* NetBSD/arm 8.99.41
* OpenBSD/amd64 6.5

(These OSes are all on bare metal, no VMs involved)

This just says it doesn't lock up, of course. I've not attempted
any performance-oriented tests.

regards, tom lane

#75Matteo Beccati
php@beccati.com
In reply to: Tom Lane (#74)
Re: [HACKERS] kqueue

On 22/01/2020 17:06, Tom Lane wrote:

Matteo Beccati <php@beccati.com> writes:

On 21/01/2020 02:06, Thomas Munro wrote:

[1] /messages/by-id/CA+hUKGJAC4Oqao=qforhNey20J8CiG2R=oBPqvfR0vOJrFysGw@mail.gmail.com

I had a NetBSD 8.0 VM lying around and I gave the patch a spin on latest
master.
With the kqueue patch, a pgbench -c basically hangs the whole postgres
instance. Not sure if it's a kernel issue, HyperVM issue o what, but
when it hangs, I can't even kill -9 the postgres processes or get the VM
to properly shutdown. The same doesn't happen, of course, with vanilla
postgres.

I'm a bit confused about what you are testing --- the kqueue patch
as per this thread, or that plus the WaitLatch refactorizations in
the other thread you point to above?

my bad, I tested the v14 patch attached to the email.

The quoted url was just above the patch name in the email client and
somehow my brain thought I was quoting the v14 patch name.

Cheers
--
Matteo Beccati

Development & Consulting - http://www.beccati.com/

#76Tom Lane
tgl@sss.pgh.pa.us
In reply to: Matteo Beccati (#75)
Re: [HACKERS] kqueue

Matteo Beccati <php@beccati.com> writes:

On 22/01/2020 17:06, Tom Lane wrote:

Matteo Beccati <php@beccati.com> writes:

I had a NetBSD 8.0 VM lying around and I gave the patch a spin on latest
master.
With the kqueue patch, a pgbench -c basically hangs the whole postgres
instance. Not sure if it's a kernel issue, HyperVM issue o what, but
when it hangs, I can't even kill -9 the postgres processes or get the VM
to properly shutdown. The same doesn't happen, of course, with vanilla
postgres.

I'm a bit confused about what you are testing --- the kqueue patch
as per this thread, or that plus the WaitLatch refactorizations in
the other thread you point to above?

my bad, I tested the v14 patch attached to the email.

Thanks for clarifying.

FWIW, I can't replicate the problem here using NetBSD 8.1 amd64
on bare metal. I tried various pgbench parameters up to "-c 20 -j 20"
(on a 4-cores-plus-hyperthreading CPU), and it seems fine.

One theory is that NetBSD fixed something since 8.0, but I trawled
their 8.1 release notes [1]https://cdn.netbsd.org/pub/NetBSD/NetBSD-8.1/CHANGES-8.1, and the only items mentioning kqueue
or kevent are for fixes in the pty and tun drivers, neither of which
seem relevant. (But wait ... could your VM setup be dependent on
a tunnel network interface for outside-the-VM connectivity? Still
hard to see the connection though.)

My guess is that what you're seeing is a VM bug.

regards, tom lane

[1]: https://cdn.netbsd.org/pub/NetBSD/NetBSD-8.1/CHANGES-8.1

#77Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#74)
Re: [HACKERS] kqueue

I wrote:

This just says it doesn't lock up, of course. I've not attempted
any performance-oriented tests.

I've now done some light performance testing -- just stuff like
pgbench -S -M prepared -c 20 -j 20 -T 60 bench

I cannot see any improvement on either FreeBSD 12 or NetBSD 8.1,
either as to net TPS or as to CPU load. If anything, the TPS
rate is a bit lower with the patch, though I'm not sure that
that effect is above the noise level.

It's certainly possible that to see any benefit you need stress
levels above what I can manage on the small box I've got these
OSes on. Still, it'd be nice if a performance patch could show
some improved performance, before we take any portability risks
for it.

regards, tom lane

#78Rui DeSousa
rui@crazybean.net
In reply to: Tom Lane (#77)
2 attachment(s)
Re: [HACKERS] kqueue

On Jan 22, 2020, at 2:19 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

I cannot see any improvement on either FreeBSD 12 or NetBSD 8.1,
either as to net TPS or as to CPU load. If anything, the TPS
rate is a bit lower with the patch, though I'm not sure that
that effect is above the noise level.

It's certainly possible that to see any benefit you need stress
levels above what I can manage on the small box I've got these
OSes on. Still, it'd be nice if a performance patch could show
some improved performance, before we take any portability risks
for it.

Tom,

Here is two charts comparing a patched and unpatched system. These systems are very large and have just shy of thousand connections each with averages of 20 to 30 active queries concurrently running at times including hundreds if not thousand of queries hitting the database in rapid succession. The effect is the unpatched system generates a lot of system load just handling idle connections where as the patched version is not impacted by idle sessions or sessions that have already received data.

Attachments:

unpatched.pngimage/png; name=unpatched.png; x-unix-mode=0644Download
�PNG


IHDR�&�B
�iCCPICC ProfileX���P����lf�%��s�Ar�9#���A�"| Y@�*D%��$I� ����b@A����}�n�z]5;��=��3=�t��0D		�Qf���a����~ @�% #���h����U�>#�&��_���q�W���w2'��G�{ ���Q�����D=����_|��4aD��������_��//�cm�E�/`pB�7�_���r�&��q��
��
�J����>������_\Id��f���t;�I x����[0���!�S�����-����E�p>a���=����q�������=�7�D���a�p-�?�A�6����6���\��?lyd�3\���������G���k��c|���p������2�;F�Hiy��W���=��������k���������s��9�yd3$��h�g���><������������=`t�6�Z�O�#m�Q8��S����9�r*���'�C�8�<9���D8�$�$�5�
�g�������@���^�����6C�-u<���t^t���W����X@h#`�@�) ��:�{C`��p����8	N�$�
��\PJ@�j�
p��N��0���V��_�����!v��� H���!K�r��� (:
���A�P	T�A��]��&���2�}��`pFc����a
0
��v�
���R`��bX5�:���M��`�8������pQ�\nw�{�����x���������������E(#�6wD("��(A�"Z�'�e�6�'�dA
#��H{�7�$2Y��A�  ��+��(����G��P~�XT&����AM�^�v�h4#Z��6C��T�E�u�}�z��!��c�0�GL&S���tc�0��$$�$J$f$$�HrH��t�������Rb��*Xk�6	[�m�>��c?���r�*�Z���&���$"]&����	��p��H\6������������|6���_���Q����y�%�����M��''!�%� w!�!/"�M>N�IAB�G�EA���(��K1C�CIM)IiFH�IYO9L�F��������J��L�O��N�M�E�N}��
��
?���9�4c4��T�2�������]�Ktp:>:���[t����Y�5�=�������103�3x2d041L3�1r0�0�3�1�1.0!���,�N2�3=`�d�aVfvg�`��<�cb�d�e��2��������z���u���M�������m���]������>�;Z
��b��mNN}�H�*�1�\�\6\�\M\�Xnn/��>�mv��<
<s�$�
�>�xy������������3����7����B��
���'�`B�B>B�B��0a9a_�2�I���H�H���(NTC4J�AtY�N�X,Y�M��8���x����O	Y��+/$�$
%�%;$?I	I�K�J=��K�J'H�K����)�����5�M���=����k�[���w��$?�@�`���0��T�TLP�T��$��tK������r���1�c���{���BP�RYR�PuU�T]R�T#�U��R�V�P�Q_�������^SB3L�E����V�V�6\[O;C{L�J�F�DgQ�K�[�Aw[OV/V�G�o���?c�j�nPg�m(og8`�3�2*1ze,df�a3149o2o�kd�f����-�������@Y�[�Z����<m9hEmu�������u���H�>[r[g�:�ov�v�vK���q�#L���hG[��'�B�gY�T�g���Gvar	p�:A~�p��+�����u�`F�&���]r�v�r������Q�����������������}�{�G���g�W�������_��73�k��vM��@���ATA�A�l����!�!�!K�J����aFa5�P����b�3)y6r9J5�4j��������A����N��Z������u��;�y:��r�F\U<�����������X��M�Oz�,��������������g��6�������)�U�������t����?3<2��8Wtn?�=�Q�dVq�a�W�X�\Ny.*7(�Y�Z^m>e~L���&�[8
2
��(.�)����ya�����"�����%>%����M�X.�_�V�Q6U�^�X�Zq�b���r�J�������2�r���Wl�^U�ZW�Ts���Z���Z���:���z���XCd��u��7�o�7�6V5�5��	nF�|����������
������B���
��j�n�i[jwh��kx��C������k����]�]9�������1�wzBz6{�{_���{�o��t�b`��������5��u+
�}���mDn�uTv������1���q���	����c��SjS�O��<|j�td�tz��������Y�����?�E��x�8���X�X(ZdY�~)��iIn�kY{y������_o�	������h�}�nMj�s]w}����������[�[�����A������������2?3~��E�K��������?�e�2��~W�>�g�����>z��@�����������B�w)'n0//>]#�	PO�%��^������������08-�
���
D[`���bH�p<�MNIAK�F%B�JcJ�MC��P���t��!����d���\��<e�M|��L�
-
/�����}�,�C
!����e����STQU=&�"�������������M�C���=����e��p�h���������������U�u�M�m�]�}���x�h����.^'�]=	~n���=�<s����|�|��Z���>�
Y������"���.8��;wz;���(�$��~F/���E�M��?������d�d�d��x����g��)�.|V�U���T"Q�s��,��LEI�����WH����^��M����l���������R��-��w\Z�Z�������vD�������������{��Z�������������GtG������M�MM]xR�4w:�Y�L�l���9�.��&�:/�-�.��~���g��-�*��:�;�
�M�|����[��?v}*��Eo�u����oU�����x��L�����>:<$�_@���S���p�%�C��B�;B:���o%k'o��G9@5B����Wz##3��<�)�G"��:�V�>�a�1�q�I�Ib�{,2":(�/�+�#�#�+�+�+{_�S�C�U�Y�A����|�t��
MW-km]E]a=V}���������q�I�i�Y�y���������������=��#��i�y������a�B��C�a���S^������.���_
X|��.�sN�)ep�9:�T|Lvl��q����$�HZN^9���vv=�]�����2��[�|������:w=o�<���P�H��q��������K�e��}������Y�(^��	��U[W�_����y#_��M�f�[�����D���%���=��s�|gQWIw�������������i����m��$�<��<�brej����/�������A/����"�%z	�L���5������k����B7b7�n��/�P�}�c�����_2w�����K�n�g�Cu_���'�!�(�!01��a��@n���1A$fXRv��B6K>L��������������~�a���OvV�(�j�a�un8�0�
�����	!��(�X�$�4�L�|����2�d�������������z���M�j5�U%��Zi��:a��z���*��Fl�x�}�
�9��.�f�Z�
�6Y�g�N�9�9�:�;+qa?A��% ���0�'����A������X �t|�
#g��T��;iM8s*����������������g*SJ��f�����p�=�!�<[?G3W-O#_��E��B���	����\*�z�FYk�����gU������r��\��u��Oh��^u����i�����[s�������>m�j��������������}=��}�[�����U�8��>>9vf<{�h�d�����������f=O�;�"y>~!v1�e�R�r��s������y��:�����nw�E�������G�O���������m�������������/����&�%@
=6�����ub�����"��s���c��D�9I`�@�p��'��z�f�G�����}aT	�Ao�]���K�5����,�^�"�a�&�R�lC�D���P���*=�a��c���$�,b������9�.���/&���%;$�#?�H�DRfQ1P]����q��@�B�Hw����
C2#7�C�fZ�^�`V�)��������&\W;w��&o#_(��$0*X,�),!�'�/zN�F�S���}�<)/i:�O��r����C�<�������:��P���L�������;����k�6�1f71U236?ae�cUo=d�n���p�q�q*w�;�z��U�������������'���?>�*�2�k�uh{8{DF������c�b����������T���t���L������|����E-��gK����*c��.��:t����A�e����[�w�[#��w�v�v��?����0>�`�s��q�x�d�������9�2:���z���Z�����m�O�;��{�������S���0RA)hC`��� i�
�r�[�3h�3���]�M��"pgx6����F#n �#%���Ne�*Gm�U���7%L>f����K�
�>!=FZ���������o�\�������������SP��)[����t�t��>$
����L���Y�mV_6.��{NZ�)�ln#,�#�,>+~f��wS���ED�"s��b���b��y�V�|�PYK99y��G�%�)��c*��j���5�j~�������Y����1�6�1�21��p���*���Y�C�����t����	�8�
�2O
���M>�~|�^��[�r!��O�E"2#?�<=�{;N8�&�;������i����2���sts����?(4(�(v��ZY�./�����A\������^��1�T��s[���������m�����?��v0q�iD�1����������5�����-^Xjx����U�u���[��R�r�k�w������p��3���$g�u0�1���5	C��2����au�)�>�n
?o��#���|�8�i��G���P>��h�6CW�?at1���I�������������5�~���l�\���B�b���r�*�P���������+��2�0�32�2�1��$���n�]g����X�������������O�o�X�
z����7������+}Q��,A�@^Z�S�R	�������*\�\�]CJS_�����t���1���g+�9�K-+_b�z�v�����1����W�����uwW�2�6_w�z����A9���ra9��#��z�eN��>�/�����<��tv+-)�>�1S;k&�3w;�T�0�{qs�n�bYt]ek�����ku��o��lL�iyK��e���n���.��V�*�<���<*������~�;�43���E�B������~+f�b��w���_�����������>�O����{IK�NN����g>�����><<�Ll6��	��[��\C@�,��?m�'������bqi�30��iTXtXML:com.adobe.xmp<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:exif="http://ns.adobe.com/exif/1.0/">
         <exif:PixelXDimension>1693</exif:PixelXDimension>
         <exif:PixelYDimension>550</exif:PixelYDimension>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
��G@IDATx��y�]����{[n�EJm	)�)�$6�E6X�����dcS�.��Q�tG��L�?3����8�Q�����c��#�+.Ww]�VT1��E6X`�
��c	H���R.o����w����}[��)�R�.g��s���|�����
�&'" " " " " " " " " " " " K _BXG@����������������������������	HtZ2BE " " " " " " " " " " " " �Im@D@D@D@D@D@D@D@D@D@D@D@D`�$:-�"���6 " " " " " " " " " " " "�d���P������������������������HtRX2�NKF�D@D@D@D@D@D@D@D@D@D@D@D@$:�
������������������������,��D�%#T" " " " " " " " " " " " ��D@D@D@D@D@D@D@D@D@D@D@D@�L@���*�Nj" " " " " " " " " " " " K& �i��������������������������D'��%���d��@D@D@D@D@D@D@D@D@D@D@D@D@�����������������������������	HtZ2BE " " " " " " " " " " " " �Im@D@D@D@D@D@D@D@D@D@D@D@D`��K��m#�Y��=V(A�9�<��b�����y>k�\�����o����q���b�N������K!�S��=��\,�����x)|��`�)2
9h�Vt������h�
��C�'�)�[6�v���d,	A��d<�(c�8$�|�Q�2����!J�p.��T2i�����i�f��a?1�axhW��� 91=���f����3�JA|�D�<D�����9���������������������������������Y�\bO 5!Y�O	�$!e!8D��,�!*���,�T"�@q�����`��M�")�01K�!D�![!L<A����A����/"�%h����[����=����e V�:��i!/�b���d1�<5�Xu��[���5$�nE'N���<|�pJ<�?�N�Z�{�fOv������Y7,�(��!N�{g�N��s{������UR2&V�W�g������s'�����n��M�-7[?,� F����o����������%:��0D%����|W�}��{��3g�<���o"��-���2Hl�����wd��1{����?" " " " " " " " " " " "�&���T�p
KOP~8�]<������>��;�wC�Oi�e3�}74t����A;��[��w�4�����ds���d<cg��g�Z�������}�r�����:1e^K��r���g��x�G������/��L��-���Dr�6e��?�{� UH�?��T��~D@D@D@D@D@D@D@D@D@D@D@D��c�����hADK"��x1�Gq���������+c��w��7��_<��%a������8h=[m`G��	a�����f�R6�5�b�/��m����bW�[��W��N���_���Mv���l��]�	����?j?���g�{}k8�c�(��Q	"s�s�,�\.��T�,�������������������������@�X���3�9"7���u`��.����Y2g�����G�����k�^L�7��I{����{����=iW_��.�m���w-�5�`�d���y��6��k�����Mg�v9�5�f�����m{�>v�5����{o�e��o�E`�?L��E���������T�AKND@D@D@D@D@D@D@D@D@D@D@Z�
|���A
�hI��QWn��w��-�X,���_���~s�.gr�:�S,
Qh�F����O�����6��� $�$��������������x�&��fr1�Y	K#|>1k�=�#{a|��`��30l��<�,+��3g��bQ�s����u��D@D@D@D@D@D@D@D@D@D@D@D���[K'��D�r��tv1����������
�����{�&�-���:���[>���_y���7O[w�
'���O��%r]��\��������-���%��R��o"o]3��7����]�u g�H��e_�����N��?�OXm
�xG��x
H�_�V!���JnV5T��r~�xJ��6�`��S��X����5��mf*o(T9��hf�p����^�BQ�q����"o���!A��	UA+*�k6]?o1XP�#�������q
�r�q1Pp�\[" " " " " " " " " " " "�j���)	j%�86���N��`D'����e{{&iY��A��}3\��D�Y>a.>N����T'��z�������
�;{%�����&�+�,
C������i����hM��'V���S���!��E'�A�	���%�����c�����e���@��eR��X6�,�����y��p�j\�JY�e�vS�3��,�}N��(�G+���t������BT.��?<����Z>�mXc�Zt��$���?���H��(cX=�:S��IB�I:��<���B-��iJ��Ct
�����8D��Tg2��
��@pr�@���S���bn���\�1�����o���?��	����Jg�%" " " " " " " " " " " kM ��X��af�D!��D���wm���!���p�=��cb;X'��k-ea�4�a�>��}6��7�C;��o�?��dY��4��*��x��2i�K5	�Qr���t��;� ���O���&�i��������R�T�zzz�"N����-�)c���oS��D@D@D@D@D@D@D@D@D@D@D@D��cK�`��`�$�������lw[<�cW�����uVH\c��9Q�Qr�K�Zg2kC�I�B	�����'���(:�:;,���i�1Q���[&���vl�T~s�M��(LT)�f.�p�SP>m
_qXa1��w�0�GD@D@D@D@D@D@D@D@D@D@D@Z��:���D�yX����l�egl������6��`����n���,�n��4���������>����wm>>a/�j�4��	���d������w_k)�Q1E��lS��@0��~�3����%{�������|���������N����-?|�]�i�!���v	��]��Y������Vh>������������������������[�
�_�g���Lq���`��$v����������%���Q��u�.�s��u�����>v�a���X6]z��=��%��� F]�����2Xw�g�����M�>��]�Z��}v�A0��y�.������M,� V%m����65x��l����c����������3���z��������Yrn���I�1�~�Y;=�kQeh��p�!�
���m���Vk�����GN�5��[��k���Q�����w];mg��'����s��s��~�}����r�t�o���]���.��������>uPD@D@D@D@D@D@D@D@D@D@D@V�
e�"��������6z� ��m�#��T{'^��x��&��Bd�����?e��v�n�?d�M.k���W�;e�`�T5��o�����iF�l���}��O?g�N�����]_HJ?" " " " " " " " " " " "��d��l5Pa�4~����h��*"��&o��)w" " " " " " " " " " " " �@@�S;���(" " " " " " " " " " " -N@�S�W��'" " " " " " " " " " " �@@�S;���(" " " " " " " " " " " -N@���UP�R}��X�����������������������������
���]�TD@D@D@D@D@D@D@D@D@D@D@D�	���kEy�6# ���*L��V$ ��kEy�6# ���*L��V$ ��kEy�6# ���*L��V$ ��kEy�6# ���*L��V$ ��kEy�6# ���*L��V$ ��kEy�6# ���*L��V$ ��kEy�6# ���*L��V$ ��kEy�6# ���*L��V$ ��kEy�6# ���*L��V$ ��kEy�6# ���*L��V$ ��kEy�6# ���*L��V$ ��kEy�6# ���*L��V$ ��kEy�6# ���*L��V$ ��kEy�6# ���*L��V$ ��kEy�6# ���*L��V$ ��kEy�6# ���*L��V$ ��kEy�6# ���*L��V$ �)T+#���G��=`w�</��{���S
4x�v��;�v��V��^)Ea6Ry��=�o��|���[������vyy��3x�=�Y���EY�|��j�[�I��jW���j���
�$�����+oD�r���Oe�A;,^_���^��F�J?U��
�l��+��e�VIe����vy{F�Z�_/8��~����~1��}����.��]/����b�.l����}�U��H��Ax�V��_t]��8���J;W�F���]��������
��~�G����(���o��P^��~��}�~�G����6]�2������>l)����oW��T�m�����J�~�S�K*�W�7b*��������=�~}�
�_?�x��e,����2���
qr��e\
��������V%D��U�E�'H������H7:���-wo(�]��j\Q�����������D����~����Y����v��'l�[�_����Jy�����l=��=�35=� ���{��=R*�
�}����XTO�C�'�<7~�jz�GQ�'�����cE����������;�A���[|CEpmk��l��;x�F{}��9�����g��#6:
�1=�t��7a�/^*���������A������ ���{�X���yLA�5���J�?��#G��C��8�t�5��=`��f����[�������2�O<��82j����BA�
�>[Q�W&�J��
?o�i����}�=N���?��?e_�I�9n{�|���_���vW)l��6�Y�>�M��~6W�yC���U�l�~�n�u�;��v�D�o~�����#�-�m�i��J�[?�)�r������o�}C$�����C�������������B�o���������faW��Z��(a�uG@�SSU^����s�G~�r��pp��Q8y����@�Q�("�,���_
~>t�/3' F�'j�M<������0�:���P<�meB��� ���b0�;XQ�S[!��s�AZ��R;2lg)�
RP�r2=v�(>p���5��1'�-��0���Z��.�gm�w������G��������� ���G�m��T��|�.�a;k��������(�t<� �Z���);ppl
3�o1��6>���P�E^C�������lm�	��������C�����28`��qw�"j}8h�wm����jn��Q��V����.bd����F�`�,����,#���]<y�����������}����@t�~��/��8Vl�����w�/;������l� �0��J�xR��<]�k��E�-^��ty�H�����
�[�*����7`g�zm�t���w�u��������N?r��B,=���5��������g������a�?-^�"���\��k�Q�W���5�V�k�;PlG����vv�P����s�D1��_M�5���/�6^���B��X���p�</E��o�����0���v�X��p?<j���}���
�������!���{hef���x�����i�w?
��L�E���58���P��w�<�������Hy����y^���Y��q��G��*��s�������]����{��5���v��9U�Q%>Q���]��������|�J�����<\������+��_�}���`��o��@p���x��mb�=������2Xq����������x��
�U���~_��[�p��V���~<�
�uK}�?�����h;�O�{|E����seY[t�����������0o��fjS�������D<k�T�U���R?[���w�����7q�Z�~*������������Ge��t�
mV��z��B��n8�}.
e���Y��h��9�!�������88h������������0!1�V3_�����)�/g��^���Sr}���t�����);�������
^
i���e���W�G��o�o������v��sv��BY,|>��j��d�_;g{�A���P����
"�O#(b)��_��=���sw�n��.qd���}����a|���������k;���x�.T?���K����v���_����4:�����1;���'���2����<��m�c�^
�}yW�wV����J�_����xF�����I�q�	,]'�+�������;�������,�N
�-<<TXk`�27@#�`��[!�t�������C
X���` 	p~�>����BEEy��sYe�+�B�
���Y����O3g���ic���^���U`��}X����Y�0;C�Nt���	
,Vfw� � ���;�\B]�G�|AT+�1����pP�~zG)��o!_�1����#��;6��<re��\�&l����2������E�<�|��C���A�F1����vq����:�Q	���!.������ =����{���c
[��2e�(�������o���k�hi��B�>��S�[�-�/p<`�u����#G����(�`AQ,����7de����2�0�\^�uX�z���':nP�m������-D��Bq/?E�����/�5�ie&J��C�����g��0"������A>W��e:b������J�C6:P+�����8�L�J���mt-��XD�#�cE���Q�7�!rd��:���G��Kx�X�	x��
��mU��
5>"8h#O�C����v�}�PGU-�+�����X*C3�O���aXe���~��Tv�y�i"��m���,Y�F���������L��@%�BRp?�?�\��D�������*]��/Z����W�/[wP�j}Ft��s����&���vk�5|�ra������c+������zuR����g�W�z�������2��R�����_���+4pY
��-v���dY�?a-�b�����_�|���~k���>��ou���=)|]�v����t��5�?|e��uw�J����������;z��y�x?m�>P��U�����Z���]���<���=d��=��{Fu����B�������[5���zm�^��k�g�R���a��h��%�N��=�������m{�_���l����a�&�:�-�������?>�~+!^:n%+�]G�{���r"��h��������t�9��
���K_����>��H���x��G0�,~`�%��g~���R�n�V��� �PY��T}_�Ei3��O�{���������>��7_og~@�J�S�|��;1�`5��<��|E�K%|�����[��A���baD���n{�
��l+s�p��p/�@����zi!_?��
��eSe��;�����������Or��O5��K}��0���������� ��
�}eEM!�_��B��~�C��z�����J_���������m+�/6;R��*����e���(E�R[x�	��
�_�|<�Ex �4�����D6^\N����>|at*�r"��@�����AW���]��8���Y����=��?W��:�����P������C��<e��2�[�M�3�1����BP?���i+o�����[2��@Z*8ga�k��&�E>�>@t(������?�Y�N�V����B�-^�h��k�����-^0M�-d��~�Z�x�����`~(,[�@\�u�����3-��z_�����/B���.$��m�d�
�z#��U��*���9�v�j��fx�����>\����&�d�����;Q�^'a�W��b|Qj�d����7���P��Bl�-�����
�QT�j�B���a�D����vYhwM�uCm�Z�x�B�;V��-��h��F���a|�O�7�~��N�}L����s�Z��+_)lyW��~���\������p�@K?�AAC}o�g�Z�
�B}�
�������*����|�������L�:)<��,���Sn��x�����O�������@1�Q���)��.V\���_b��3�U
hh��+�������z�����S�{^�
DE���pu�I����=�N[�Q�>�G�2�{t��N����O
5t?kU&�X[��p�c�w��+�������=�}���bLe
�3���|���nRy��p[�S���Q��fcuX/��������KC�}�OB����S����!?�����yB�8�
�@�r�&����[g~���cgp�YL�E�A?v�z�|��R?qeoA�tye����3D����}�Sg�Sj����yA���(���cP�\]���O��~�+��s�����P_�[v�b�����oc��3�����cc6i[l�o8������������~���6����ZS��c5�9������X����A�o�Q���kn���:}����[���Zi�p���K�����������rH.WDWz<�q�"!���C"6_�&����`D���08v�(��2�)f�|���	���Hi ����+��%Mqp��a��``fSQ7��m`��F0�H�o�u��B�"�������e���SzT�>�<���Q�9���W�a����v���l���'Ji����������@s�w�-�v�C%�����HS��(jlG�!�o4?����c���v#����@��L�cD�{9���jl��\0=��BX8x�Z�"�E�H��T��"��v0�]q
�� R-h�������7_G�����R<.�p��E����x13�fn���7��5���t����GWO���`��N����X>���/
>���h3��"XCo�������U8E���T�e
����6�y�v�,��r��P	#6��ae
� x��#�G1@�W���S�������g������8�\ej$��u���~���r>.�O�����j�����k�#�\��x&]�=�2���r��&x	�w�2%v��7����q�|]��}���{�X���#+�-���^��Y_�^�y�@���O��m����-����Dga�Rt/�� �� ������(Z�p���Sv�h�������� ?�f�W��sWC����R���������P��#���'�����sv�O����{�������%��G����������o�a��P���O6���}�~����f��q��{&�����8n������+" " �% �i����	���q��^8���Bd�Y�~rQq���@�W����4CB�������'�97 =z��y,��F�]�+�Mu��xZP�q����M.B���b���������C+��Oq
$���i�?-T�>^��Ya�i���Ue|K�����@<����[P����2�Y��E�+R���Y8����V��4ST�:q5�^K�D�r.pntA����\,%l�u����a���������4�������f�^�13h�?t����u+U��"�h��q�DgVdm�w������ex����J���1;7�i����J���ks��\��_�>���~�����)��~�q~��C�V���Vhk��r���}��~��r�����^����~s�����q��]�g�\y�}�k�����c��]��Gq����F+��f��Pf`t��0-!�t7���p��!�e��5��F����D*���������k����
�� ����~h�OWp�0}Z�T�M7�Q�i�8Xwk�4��VH'�z#��
���X�����m�������l��Bp�-4�� ���Q��w_��.+�vk���x�,�.��D���!�\�28���i8�TV��cJ��(>S5�����o0P_���ba7�[1��9�������s �#��/H������d[��|�	������`M!�D��\�E��j�G��w0��k���3k�8��;�)��>� k�E��}-Q0UY��hd����X��a��_y�p��/t�J>��D�?��
�u	�����q�Q���r	�o$hT=�����7�j�1�[>�;�"�g��A��]�6Sq*X ���d����o-N���e�L`9�Zg������<S�N�����%���h�iI0e�����Q��:�2y	��4�(b����C���

]����n<����,Ww�5��o�,|�����t��o��V#$NE�%�7�
�������@T
�����Mc������%��l?��g,�v�#��E���I�D#uX+|3���[a}9��t#�������rz��i��n����S��t�}O�����������u�k�a��Se�>����������s����S��a5�N/[����g�a1���/|�Y(�,r��;����Wy���S]d�P?��p���4�5y��$:UESq�f�X+�Pq���n����-!�k��8�",W�����\���o���Kk94���=\��T�����*�S�0?T�
�7�b_n�M�Ct��`zxp��ml8�M��58��R�L�����d)���!�
�ZM�e(���8��9j ��\�e8m��0��.��/2��k���.�~15�����:�_�c����5��y�kPa>�g��������j{�{�_Sl�~��@�/V��B���X]����2�&��OI�c�e`�i4R���U���q�)��2�~gA�����~+~�����T\������|#�(Z�&S/����t(G*��������"�;cv����p�G������o�����eu�bA�������E�q�y�/p�dn�n����z��G��6Z�
u\-�Bs �I���|�s��`����[���ky��P�#Xl����Bf��^�/�[���~��RZ���������B���(��+��5�gj�	r�����b�g�z������E�6���1b���~�7e��Pp��S]����*:���������O|�o��]���WA\�x)�����uG�j�kj��gZ;��G�x�g��>\�^Z��T���mm���>/�2�5a��D���et�Ia��E��^�-W�o|\��{��B�����L�wa�Y��Ix����|	��������~IM��sw�����~"�l��s�O��S`�����z�X�F��*8�;������)ZgA��������,�>�
L�5��kN����~�2�/����|F����|U�U�_X�����
����+�U����i���������FQ��N_����s}�k*��W�9�j^uBD@D@��@r
�n���p��q�����)�v���?d�0
�0��{��6���L����;2���`�Po�~53��HaM���n�It\�r/����PPZSp��h��bu��#~-������Yp��=���	�����BGm#X���VO'��
������G1.��� ^N�������<��G���� ������<�5��C��,����h�\��@��,M3Q��p.lD�,�08���������A;�5�^�VK���~��m��v��q8�B�uT|�^(����i���������>�H����6��D�8X;?��8R���IX�8b����.���r�6���m`�s�|G�O�)��c7�]���u�>��
�a���jl���Vh��N�e��i�i���]�wW4e���;�j*��<�,1Km����R\%�T\����B�1|�P�����d��o����k�<�f���k�������qM�aW��u'��R��k�fa�T|���o�������~��H�X�����
�lz�$>T9Tu�0�����R?���E�����(�*�������:m���D]����Y����]��}�-�g���&����Z�p��q���T�����)ke>\?4|��\2~��!���fA�b_;Q��I��L�:AO��=���P��/Xo�����0�z���"S��R�2�j��/p_I��>�����k?A�*z�:-�--J����>������yN[���������"�@y��[��#\s�$0���V��� e�*�0=6�6yw)������R��;w�"���_������
����W�"�����.������&|�\������3T�y���\�Y�+���Q���Ce����o�y����n��s���PX�����@@����1��e���c�>8�gX��|��0�4�/�����Q�����)����>��[�n
��m���y��y���w`}u��v�f
__�o>6f�����M�~�S�X���Adg��[m��`n�4�O.��]oV�+�/%_�q�n}���}3���=x�BD�^V?M��W�Fi��G���C��3O=m�wl._��{��{q����#j������c]��x@�xR�5�p�j<���U�]�3p�HuXD@D@����p _��N��:#@�#6��1[�>t��`��x�� q�T�W�..���RT��=����{e��+��|u���T������5|��&����z��{�5^�u�����D�(!���4:fuW��y����e����kv���)�2"" " kO@���}(-G_=b�����-���g�l��G�D@D@Z�����0�L/yv���u���J����J�I�C�������C�`9|�����_+��,�"�,��������@m���uV�)����wN,z���%�i��qz�DI��k�LD@D�9��������{�T'��`" �N@���#U�mI�+v�wn��8��'����4u_["Q�E@D@D`hz�e��(D@D@D@D@D@D@D@D@D@D@D@D`���z����" " " " " " " " " " " "�$:-DE!" " " " " " " " " " " ���D���T~X������N@��zo*�����������������������,�N�QQ������������������������z' �i���_D@D@D@D@D@D@D@D@D@D@D@���D�e��(D@D@D@D@D@D@D@D@D@D@D@D`�H�w��wvt���������O~�{��������?lO>��MOMU���/����}t����w�>�������-�;x�A����9n�����S��������S?;����@?�}�����f].Czn�q`^��FnG��^",����\�?���ZOwwSy�o_��w�}��g��ZO��W;�x����;����J_���T~����������������������I@�S�^)*?~���s�������*$����r R�����z��[^D�0��
@>/���������������2�9P��.|�k��ez�����g^qA|�
_�������7���ym�<'�c��(tNLL��}������a������������������������,����������x�MgDA	:o��1g::�r4���g���?�����Y�s�?N���t&m��8���������QX5�{�1<\o#�yc���t,  �����8�"�UCCE+�O|��k�6�����p�����(�P,�e����������F��A�M����K�U�U��b/���ig���w��ZV��?��Q���N>oE�����eQX��hF�#l-�r�Z���w;�����8��[:E��W�������:�k��!w������#��/�u��>;!:oy�������2c����}�����G��;���;h�'l�����z��Wm��yn'����x���;A��t�\����v�N���P�:d6o��:^����4���k��!�������c+9�����(vq�zvv���?����3�.�G�e'��{��w/���y��17��s��^z�>|�=.�;�h���,8J1��IX��B�S�y�(<�������NxY)�:;��2�f�:����\�*�P�
���-�T�\8Lq���x���:@IDATx�VF�@�����v��BN<���h�����w��>��	�����(�q
B
.^���J��zJ�����}�u���^z�^|���0�p}�}�������c���1��l�8��q�ecg�i
}�J�\����']9�l���q�E�>�y��p��m.�<���!����-����-��(D��������������������@��3d����x4�9��qO��r<�/��?��c����[o�X�r8��������(����[7��F�1��lY4�Hg2viz�8[���,�����3������(61^�1G����k'/gC���F�.��TbQsk�u�9K?}Y����!S�����h����:^�|���hxaRM�8���O?����j������B-���jl�����%\�Q���8E&/��i�cwISLbxj��t�u
�X�������/�6�������y���~�x��0=�Ow�N��N^�9�"����)'T���~�o]�^x��������`AU��N�����
�s" " " " " " " " " W6�%�o�p�c��#��A;���n�|L�1K�qs��~��E)?�U���z{�K�x�%���R){��g���������t�>��O>�D��"�-���V����a��p��O%���C�����5��p[��B&K:���V+o����t�scV��VE�(�]�QJo�8y����,��Jk�B������q
?*��ZmG+��4^L�q�udd�uh^�bgB��y������e��0����z��"��_h%�L��������?�6\����q<����?���)E?�������T��|����+r���c�4
����Q�c������G-Z�����LQ��KK'~�OW��+�7~�<���@\ #@��V.������-U�1����
��i���+�y��j�b�/������W�B��_��-\�6��4�.Ro�<z� h�������B>��SN��1vX�K��o5�����=�����k0qJ?N�G+$��;N�%�����>�g0�|����������;�SN�G�����t*���p�����7����O���y����/�d��z��>��y"�x��v�M7�qF�I�������n'
K�>���p��=���_
f�b\n�;���l�[Gc�=��=9���xm�4^[�b��������2��i�����Z����1T?���^�j4�J�c�����e�/��FY:������=���(p�!�Fl����8b'�c������<�Cs�j��O�����1%_#
;��?����:z��K�b��<r
�P5f���pz9�*���W���E�$<��L��S
�)�7��h�I�.ZUZuUc�������c���*NG�|y����*:��������Q� H���x�??
;�f�_/���<�X8._�~z@v���Y���#c:uxa*��8�����pJ�g���������c�����>7��1����$
:��c�L��s&0�s�K�p���}ONN�q�T
���P��Vx�?n���8N�g��8--�8m���+�RE��(���x0�_9��Y������W��K��1a@�D���p yFE��P-�n����A�e�VE� _=��y��[�����3w������f������������������������,�������r��b�/g���+��������ZM��h
�z^x�E�).6W�Q�**������qv�T������j�2(�" " " " " " " " " �E��g�m	���8#���h?�tj�zP.D@D@D@D@D@D@D@D@D@D@D@D��	���N��������_��9�f���[o��R����9n�=�����n��������y���9"��Z��m������������������������4G�-D�m��a�[����t�D�	P^T��D?�=���N�
�T<W-��o���Z�����
�6 ����5[l���(" " " "������5�|���S���uZr����D�����~���9�����e�Y�t��c�+������
����e]�p%���V�����Rq3���T��"�X:WB}\	e`m��������X-���Q]�g��>T�I�vZ���|V���c��WOOuQ��Z�Q}���i^	�q%��5�rTo�kq�J��+��6���+Mh=-�i8��^{�.��
�I� Xuv-8>.|^�" " " " " " K#���-g��_��-���X����e�9����w���,A����'����--q��5$����:�8���X����e���q}`<�n�g!d�gLX������k������@�hyK�F�N����i�4;7>�`;*�O: " " " " " "�xh��k�qV�D"eWO�a�z�Z����������m���tW�%�������%��x��s����2����{�1��� ���tl�y��db{�S��ec	���[D@j�����������N��/�\����a��^���G����S�}������0?��O\����=k���7Q.������w��7�wA^��v��SQ�u�M�����d�VL`�499i��m7N�G�m���s�C���
���WD@D@D@D@D@D`�	��~��8T)0esi;������e�b:r|���X~���3nC�N;��Ct���r���[;�������r����Y��(��!�Kk�B@���K�9N�	�t%���%`���Z�9O�DZ;�2_�����S*�����r������3�.E���n��v����(�H�.M;A����c���������]����{���������������t�wi���x�M����@{�N�r���=c��z��RIs�	M�O���P\���=����zN7�x��(FU�~U������������@�(|�_�.����S��M��� �w2 B�-�]Y?�3gw���k�����v)��)u	��0���`���g�^���TZ{�n��%������m]{>�aONAL���/�2�Y��������2������������@���S�������u�����r�L������]�8����y�u659e���w�)4]54d�6nrc���8�OQJ���������D��_���"d�������s�?g���~�pa��X>1N%���<���+��Oa�u 1o�v�vu�����0E:��K`��ks}�=;i��a�\h4/�u�7�_�Z�@"��7�kO�H��l������M�������j"���z�?1�����_N�G��=�Kv����;�����[��0�:O]���������i3�9g���PD@�(��������8k$_0Z0�~����W����f�����H����-�8
��h��>���������!�6�����TD@D@D@D@D@�\qX2�����6�1m��L�����,��k��ls|���o/�v����)��ty�`�����L�^��}$�V?H9�����l���Z=�K�E'���������i�}�����%����H�R;��@_��JAV��H�]���X���~�ICy�h{3v-��t��SsY��(�z9X:Z��VMa�i��~��g���p�T��L�J���x�S�v�}�9��{�U7%��q�(:�Q��vr��K�O�}�PXc�������`M`�5�M���,�=�����:1�����!=m�]��RY�������]�~+]�������m���i��s������@V1(��2�^,���&�o*��X�;y��������d�:a�������Q)�%@�F�Q=���Hb-�������9�������`u�b���/������)ii�����^AE@ @+�����z������8�����}V�?���[������������Q�����Tzr���,��o���" " " " " "�Jbd�R��1��R7�/�NX&Y��������M�z0�X.f�1�Tf����
�?^?���s����P�����<"e�q�!�v��|.z�=}S��L��f��
s���l<g7�����^sc��]��b�,�\U$���e��z1o��2`U����MO/�)}6�>vBX
�N�,w����
o�I��c������i���w��f�g��y��yTx��%
�X����KF��M�w��-
���D'�F�����3��.�	�k��)"pe��������5�z�n������L���3�����N\��;�{�]���m�~��S�M^������E��-���M�����K�.^oI���������@�'��,�r-" " "��b��o��X�X�F6N��}���*��	�q��0+���b|w��x�vf�02!)����%{��18���8H�	�B6l~�����)o����p�)�9�A����[��S�FSs������(���^p�-����{&�k�mQ
�P�,CNeH9��\��x]b�~�n�����������knJ<�b#���i��d�M�Ajj�&����
�J`�K���Jl(�<5A O�	�p�wg-����S}a2�i�Bt�����$,~(7e]���v1�^���V�+V�B�@�x�2���	�SO�rk>}�cw9~��Y�1:Z6Ew'��R*��k?MOM����^6�&��~�YS��j����S\{�Tn�����i�
�8�����������@r�]eU��@_G�6a���MnX��������[�i{��NM~���YW�-B��Kt\�$�u��fjWG/���	&���[��0�^����@�'f��*�Lq]?��GX�@���9ko������71m�a~�����4e�ls^�0����)�a,,����d�0m������/�Y����:G�>�'3���A��_��/nDSXA&�6����&�l��
��o1n8u���r������f��3����W+����z�����)�k�����m��h��P[+��pY2�iCa���B
"<%u�|�����D?�?{�:�QSh�����c=����@�����v9
�M�%�B'�������9A���E��5����8*�U;^��+/`���m_O��[�\�!��k���M�t6y����r.�,'" ���i��z�t^�T�B>�^W���7M��2�Ta
��F��c@���,�)Q&�)��)<�
�)<��1�c���!X���Y�(�p������<���nS<c��1�o��|�7Q��P0�����n�\w'�UA���O�����}��D�+�}dD�-]���en�wV9�k��5�������y��bK
�^������#
A^D��(��T��\������
�l��=u��!��; ���K���1x
]/>v��wr
s�X���Y�G��5�@��	!�;5�6��d6i)
Q�jbG�����n�-X���Oz1OcYo�������k�Z�x�;<xe<w��@99��I �y{}�h�R�����ci�-Z�5��V|A���K��8^"�^�-�&,�[�+�F��?�+��,�D@E o}X���]�%�V�"�zr�3v���	,�#�E%d=Y|Y�r8�\_�� <%�q�_F��M,6��on�l0���v6�&����)�0Qh����yk��n�@�%�u�*�
x���
P��D�E�3L�Gk�2��I�����7��v�(#X��?���� �m/�Pn�,1��=������hG����0�Ok�6B�� :�� �-|(F{��w8��-�qGK'��j.��Z����p�(��y�b��(��?x����w�������qC����_�_'>���������Qj���PZ>r
���B��!B�;+��,��fA+6\�[�%U-;�:�	y�jK��L�������]�U������i����{.�s��wXS-t[S-�x_r��n���s�8�zC���mxY���8����n��T�E@V�_2��p�l�D8��������1x���fZ5�
��
��~��I�` }'�>��h}�s6�<�b ��f'� ��SND�S*��f���4����<�X��3���s���#���0
���e�`b�������A�j�g�������H�VR0�W����G��q��Y��b�a�0J{�v�o��L&����%Xu���\D�;1�aOH$�&R�(��.f�(v;���u��2��zXC-�%!�����U�""a;�������r9�c)L��c��4(��*n�XYO��
S8�E��9��e�e����5������C�^�r��q
�dW�A\���F��C��3���	�P����
�B�G ����m��\kC��&������>e�����o�,����k�Bm��g�3�Z�E��@�X��W�[���k�<,���Z�,\�����Z~e��.��E�,R<�B�W�%��M��Q�E@��^z]��Q**X*��.��&.a���������|������.����^��M�u��0���� x�h�n������
�B�����9����A�k<@�2���@?@��`9D�����i����h�������dK�wbq�����
=�t��~T[h���Av���w�/���b���Py?����.8(��`�1��y�����jM?+������oGIh��i�G�����������D�R��@T��r,U������st-�J7��`�)Z��f����6�������3n��k����=�������F�w����q��5Xul�#�j�n���T���	�Q�u�M����[(��*M�B��)8��B������Y���o���d�����@{��Za)�������@j�zY����\�a��r�s�8�A���7��j�a)��G�B���D;_Jz�9,�}?��+a	��h7�~Fo��
����)?" ��=;W���2����/6������v��&�����{�������^<�.��A������b��0" �
�\H���#p
���eB;LY���9h���+a���>M���(`���U>����r :�����!�taV�?��xE|��(���K��5����[J��/�u�� =��������N|8�U�����YA��s�F��s� ��K`z��a
��=y�z�vJ����mWE��U��g�����*��q����Y�S@9a���8��Z�����f?��R+�Ny[X�%�%����-���f���	{pn�����!�A��k�������w"����Pd���#��(���b��sCMX�8���a7����o�>�H"�;BVB� �Jk�n@�u��N~��]����R��������D��smn�6�:���{�Rl/1�{9�6�(4�A�����w}$���P�j$�m��FT�	��6�\	KA�ocg��.�����P�E`m4��69�S�yt�����ow:��h|��_�����
d92����:��&���E�m�_*�uXe� ��W��k��ex��� �����v��&X�������������jQ�9��Pn����n��[����
 ��l�s��nX�p�V�.�y<w����I�[>�{�K��&-����i����]��H��Es]�X�
�C����]?[�~������@�(B��������P�b�t<�� 2T��~7���W���
��`���8���r���t3�r�r�N:��n������j�bK��(�P\�$`��c!�}��{�s�3\�J��g���D�����b�	�~���/N����}bb��:�w��+����ye>�9��}5�LB\�ZS�1���*��m�Cb�0�i�>k����r��y7���{�R[J�����O'������������+�I!��������<�'���G+���D����L�R��A�_���H�W�~�w]�<o������m.:����k����J��_����f�Oq
����$�9�����t�A��^-v���x�[�KK#q���|	5���|��yP^��(��$��/�����{Xk�D��r�e�]�d�lU���A<��+��_Z�Mp`��E���TLq����Br��u�z�����@����#�pO�6p�<C��c�6�aM����G�Nj�Xh����������m{/�?��G���
-������B�i��b�{6n�{��f8X��,���"	��`9h��[�6�/�n\�P��<��E�D&j���XE�$8�^v�6wv[,����{�)���,����4a�O"���|���9G�n*+���/��0%\bF��c���F�s�2�?��T�]��dX���9��	�����v�<��*�t����t�o��r�]U<x�u~;p~)�=�3w�����r�6���u3�(���6�/���"=���;p�����J�+�k
�j�L��k��}�'��R�.wvL �$��[�\~���W��,w��	��kP�]�K6�)X�
}Jf�<v_�:d�|���N��K����#����N�	�,�c^���hU�V��s���hW��~��a"6��KfNS�
 �a}�)K���.��[����C��|KL�>���ep
v�� ~b�B|���=�	�C��c���Y���-~�q<O"�*S���O���J[��6����]�U�n����&�;��c�K�-k�����7Y���\�����6�5�h!�n@�"_�sy��M�Av�g���J!�]#����'��W�n����6�/Xk}�p6���9p�����xLk����=�����s���.��!�|N`+�\�=#������3k������D`M	���}��]�<,&���z��6���j����rsWS|j��V�V�R��8��G����!zY��7gN���ss��A����-������A�v��_+�W�6O���"�%uo�9�������������_��i�R�+�1�\����R�9vo����p`�b{1[�������@*�
8P�v��
���]vS�b������6��9F@���(#b?�=a���8��8��������u@��J�7����	2���b���0F���s��
�0�.�.Ipd�+�PO��
�S#z��G6�wL�7<�:���
����%�`�d��l�3��^�FK3�!-7HU#��N�N�rZ��Q�b���?{� �[!��7`ic��8��aJ��2~������q9�F�'��5��
�:�Q1�eo
����*����A��
��~��6�.C���\�k&\fF�H�g������|1c���OB�������"�a �2�1��"���g
C�����x.�e{��� ,��$�����Y��;a�7k]�;�d\�+�9h��D���,�^�cc������f��c>r�w�s=XK.m3)a(���Li����:��D��������������R�=�x��nE���`��z��x�(C���;�j������+c�W*%5�-��~���n��.������k(j����h�q�$�v+>������H6S�%����Q�E?��5��tb	Y�����sv	144����/�������B�A[��T����vb
F:^E���� ?,���w7��}��+�9�Gj��8P�l��J�n�����c��s�,��;~�8�[�&�o8OV������C_��>����_%��_?0mo]���X��m�g�|��h����b_9����]_*>�2<���WD@"p��j7p���v�9#
�CmI��<l����U1��*�{y^������"���[�4�M��R�3�v<����]^�2pz�}��y6����+}���������`�t�c?��A_fg���4AkaH�_e;�
<C?���waa����aZ�D:���C���u�uX���e�60���@��l�q��J�+4�9�����y���X��G'p�����/9|�d�%���� m���YO�#����H:a$�����o+�~�1� �������^����qm�/~	�P�W���N�^��Na-�<��]���h"�6�u�����~:a��Y�
(��w�v�����[��5�R��O ����0=?o�����R�
B���9\/�����cP;h���4�����@����s3�^�flT�@)v�Y ��-�|��sz|�X'2�$a�z�H'����7o���#����E�X��R�������W��FN���c���� q@5�N�_���\[��L4.��<�C+H�@�z�������~�G!7��0��i�w����a���?&��v!
���:�h���
Vj�������\�zD ����v�>�����s��������������TCD5#`}_�����g��N���f���<�Q�h���nG���y����M��q���%�4��~L�8?+[����\�x�,�#����>�m�W_@�v�ZL�O�~�{%�F��
��<^�a�~��(�C���X
����5����5�5�����R�$�{�n��o�����c�v�����>����Y��G�o����~��}��G����>�������w�:d��������'��7�������>|�)��?�����������w�x����_�������9��������<�L&��'�p�E���W��*�[E�Y��|�����;�_�:S��XTV�a��t�:s�4=z��rnm�WGW����v����*��/��?^��/�5	�AX���J�U2" mJ�|��,r"�R�.[*C��qy+<3�;Z��x��6r�{���P��E7�t���^�f��Dk�����o��@V_����������$�����?{o+kv��5�y���}o�e7�&E�!(��e;��6<%L� �K� /	��)�y`��?DNt,G� Q&-�qE�b7�fw��L5������_u��SUg�{����S�k����k����/�x/,��{���S���T����,HWz�/
�]
��s��:`�}K�������5�|�]C���;�[l�����W��yPEvS���l�]�s�glh��L�b��U0u�++k�!�����"�*J���&��WI(>�chl}����]��pz�C]Bc�]��p���-,�:7���Q���b�Tz����e���h�����m�"�\��n|+�=�~!�����j��SC�h�gWiT��F�����M������y�r�r��E���c��\�R��w�w 4�v�����7������A�Z��8��2	d������~S��D��E���S>S���sV������s���UR�:|�~=Yh�|c��H���<�2�����6��.����Bk5�S��$���*��	�J����.g�6��KXm4P�������N��}+��O�����#�b�v�����P��@���4kf}E�s�I���������un���O�n��S�,e�����^�2t�#��Qe�����V|\���.�X^�����G�I�f��w�q[T�nb]������L�H�j�=P�
1'^H���T�����=������m�t��5\���l�����L ���\�)`�����J�o}�[���{/p���"S�s����3~yi)�LPo4���v�~�W��D�|����}��?J��~�O�������}�;�}����t����{_��J&�Z~���o�bKe�i���C��si'.�u����~���S��5����g���e^n` )�V��q��������n�Pg��������$���o������O���7Q�w���k�l���x��������{��7�;�n&�x�E
iW�{3�_{�n0�k����sX�x0��0�s�����y�D�����b[�['�r
��/���c���S�����Wg�fDD(���Nt&l5������`��)|����@)��YQj�UP
,�G�7��
�
<�e��vv�����*�t/�k0���J����5�u��V���|�r�J��<�<R�~VV��heWqC%<��*F�8MX�N���<����J1��m��q�Z_�
#/e�o���9���IP���D�"�5\��

��u�������"h�a�b_�?7`����3�jP~�|�O��
���F(�*(����R�	��������v[D�������o��_�Nlt1�FZ*�|�s���^P��n���k�R��:J'�d* CJ�S����uTN�Q�5�Niu[z8)��e��������tZ�KoI��Xt.���(��^���%��P��^Qt*��(A���Y���������q+Xc�x�[�Z�i���Z�O��4���Pr�'�����������{ob��e��*nAU:UQ�W���N��a�����,�����U1�P��+��e�G�K����n*�1���B�:��V^5~K��g���C����v(�1�AxA_x��&��u������[����>G���;�
fK������jr\:#��Q �����C����+��l�wT:A��
��t��d����\Z�<��G2����w��X��gx���'���A E&^m�|��[�-3�,, >�[f��\�H�eM�+�����
������(��#>�=�NX_��M��
{�p���Gm!���gZ
����������nks+�G�o���������������0�y����W�W����P��?���/|�a-e����������;/�_h�������<~���������W�j��h4B	����7��v�%��I����_`�hg���)�	4*F/w�%���a5����;.��<�y�����������/�k,�nT�9��
��E{�s	�d�z�����[{��!�������g������I�p]���<���`a!w��������f7�������S���������h�����1�e?��a��9�`�I���5l��9.�;RX����KO������-C�
�/��4{�0���n����cF����Q��$K�b����
&�uT��0�[O�*Vl^����!��R�ta�v��[(���"��@C�����E�Pb���x�5����!�����f�������vi1��FQ2U
����>Sx�����xX	�:�2l��F&���R���U,��ke�k�!�'������=V��>�>�7m
�O�C�O��p�d=��
�%�0�u�*@�S��
�����n#����)n
k�~?��uZH�S�D�!:�����g���h���}R;�^D�o���I'�Yl��W���#22����-���P��*)�I��=2���=q���+�a����j�X���P�(�+��;�tT������D��hSm��j�(jQ$��Zg�1W�12�|i�r����eDb�o�x7*z�q[�-]Vy�]��W��_��i-} .�����;x/�d����PZu�[o��\�!L���U6�6I�ht���]�~�Wg�V���:��1��7��?����9��pE�A+�������6B�8�,��X.s�8oRh���?�t��Jo��	���>.���&[U�e�`/[i�e;l����Wh��}�����G����p-F�GY���&d.�|���?��>b^(u<����*�F�mN�5n[��0��)vTu3��#���|�����+��R���g0w����������o`U�Ik�1(wM��}9:V<���6�*�~���~�;��+x/����gs�Y��>�
? -�>��p�%���.BN$"��,��m���(�8=��#�U��If��,�J���;�Uq@����m�,�6����r�h�Ep<d�x��xwP.ZLsf��������3�a^�s����^@��MT��_��P�������\���>�i��rIw~'�2XO�s��f>H>ex:S���<�x������V}�`~��'Z���(u�W��A�JF�<;W��W`�e��O`��B���&�����h�L\��	{8�Sqa����1�h�Z���Q���+�#�~�M����f���,��14�>6m^�s<GpQ2<g>G �A�b`�M,��w?�^Br�vY�������jv�[Z���y��q)~a��A����k;����U\����
8�`SY�A��)pUVf1nw���Lio=;+���7_+�����e�n���������E���&���\��������F�?,�|�_�,��M.R�
�h-�����m�� h����)}�4�(������z�ov�?�}���_wr��y����%��G����>�B�B�\��)�G�Y����s!>Z�~*�TJ���)�"�H����k���.��hy��i�;s��2j�j����8!�NI��<m?F��m3GY)�����4�x��	>g�	����m���ZX�0/�O
�`��~H?���a0m�(���?�ew�u�N��\��Z:]\����V=\�O+������i��~BlN\u���3�N���(�n�p]�l�@e�����������PGa�gA|�"U���1�4�n(��Aj(����(���M���.!��o���zg%{j���D-*��5�"�q�VX09%;G)�_dl]�"���I�A��I?�����B�l:��>�Ue��u�����:���C�,�"�I������.1�J��v�����t��^*��g�g_��1��C�����-�1�%�:�".�����-�yI�g��1��������t��'q/�����%�t��O�oI�L���!����%������k�}��t^A��2��.
�;�yvVA�W��*pL9LKL
(���]
D�D��1y��W7��9���7DB���XgL���w�l:7���Zv�d�A���"��e�������]�1M���
�sx�	k���}�J!]�i�����W�n&��:����`Z��Fe�_��=���Lz�C�Er����0���L����k����;��r����M;)��=�p>��YC�3T�63���Yl��Y{kr��,�<�aK,i�����)�n+.L��\��;
M~U�}���"�:��N�g�?G��*���Y��k�|�:�������������3���J�2�z�H��u����U��v�F^��	�Nv5t>m��:���'n�����R�K�OH�P}P0��u�4�z�v��;#��N
��o�b5��nc����LP�
��(X��������tg���m��F��;-���t�D����"�7��]�Qq��
Ml��[d���D��=��
�=����]���o3�!:���X(�m>Qt���e�`&a��6�������R8��zc����.B�
x����B=E�$!�0;�~�wE���b�y�SZ�%`]$�����J����A�`q���z�O�j�`���N�{�����"��A������8� ^;�M���7�!X��n.�������iAO�����SX�%n9�q)(
dpzT��N�~�1��}|�R�����E���`W��D7`)�������
��[Q��,[j�`����Ya�
]m�����2:f5����oDg����}|i)�W:���^E�s��EZ�Bic{�]nI)�'��2\���'��N��v�.L��N��_^���aW��v�*v�����������������^�n�E�aG4`���aN�c9L#�>
[�<:��s��k�i:�y��|�F����b.�N�r*�����{�3��f>?	#��XF`��pk��p>���V�i�Q0�a�i}���3�s����ua�CJG�����!��4r�q�KX��;+Xn
��0�4Aa�x�K�ij�5�4u��A�#�Z:y	ZhWw7�jd���2��w��v��O��=��Xg�{{B�u��@�������C�����K{�5���k���Gs|��u���D���������t%��K:b���������p8h9V
y�w8e�+�����/:�����tC6/����r�8O�����/�=��o������o��E��V@IDAT73]��^���n�����1$�;�h��o����-�������+_	�z�^~)������������[7o��J��E����d�=�VVV.���k������oXG�}������)m�w,����<Y9j���dC.�P�Yd��i6�W7n*?����1�wRt�WqNkR�6%6>�����9�m���8��q?��.'��5.�y�My���)�����[Fo<i��J��[�\
��>AxD�
������2A���g_{[o��0��s$�������Z[�x�c`Z�
>d��`��p��q�]D��
��AP[<�Z,���?>�4���(�F�
��&}V ���I��~<D [
�/�
?�Z}?�m���;�A�(�m��G�s��>U\�����.�������.z?���*�9~���K�&t�G��8s��V�6�8����s<��m���:��}�J��B�����"[���;R�TNa5����a�e���3�S:�go��)��@�;JIa�+����;����}����h3p0c����\M�gEe��E��A��~�3s�D����|��UN��0$��
�(�4�9j�Z�����W����g��8Q���G��
L��Y
�����{��}����~l�� MK���F���N����w�|��|���~�����;������v!���8[ns�Y���)��)���c��"V\�
��or�A�"�C��ZrH?�b�]�d����h����]Lt-^��j��
k�
����*Ag����Z���u�7-�Tvh��Z�R��X;%@V�8!xGY��Z����?���2�r�y���b���&����s���]�M���G�9R{y��LX��B��� 7����Y�E�����lW�4�Q�9��<��q@��wP3]���L)��u�8R��&�y0Z���������JC#*�#��`��y���? M���
�i>w���R5���W�!���d�����I.p	
���edZK�Kl2Y��m���6�AS�����
��7���kU�+�B����|G��
��6}�aY��g-���h�I��
N�D�Q��E�u�{�C����(�8���3�����P8�[����T���N��e����X��G���q�a��6�M��X���x�����
�6��DqQ���9s��_��_p�g%*��M���~�W`�'_���o����0���������)�,Bad�k��<O�_��O��F��q:@8�?O��iu8�Z��'��1~�p!	s�����,��$�n��&=�n��i=-v^��� ��$������K�8�f�y���r�W�b��;�A�m����~	&V�� m\n�g�A���_�O\��r���P.
L%/o(���s|P0��|������e;�9�ro}��YVpQeA�G+�l��\�(y�6�8%�h��3�X��35�h

/X�i�.d(�CN����T�x�I
�@C#3�!�I���.��9U��1
%���x*�'��i���R�
���:[�K7���2a
���pg���f[X&-�Q��(Gw@���*,W���~��8Y�Xn-Z��;����
'���o{!�:n�[���"�-iB���gT 	����ra�
�TVx��,��!?����,n���;� M�V�J��T�=
�:�$���K�;X]8��$AD�� H�u�!�!��uk�5O���r��e�����~N��($��d]�h�����#a����]�����K���k��q}0���w�Br��,I���*<?���
'�/���/f��:{����(L���}�=��O�/��c3I
���3��oi$��`|����z_���a����FY��c��4��]������&J�^<���^v�q�i.g����_Y�d7���>�.�n!4�2���� �Je���8�B6�;j��H^gO|XA������x�c�E
������xJw�u�C-��s�8j���#����������}���P������z�O��i�J,gam������������I'V�n��_��)�6=�N������������I~�.\����U�Wa�����F��#�z�]��v	����a��d��k�.����=:K���d�&�d�U����2�9����N���]W���l�tN�e��K9Oq�����L�$i����=�:p�:�=8�u�;W�|�I����(�8m3��H��|�cF5|Ze��B{3[�wc�����������ns��pA;���(s<z �Y��
��y�c�y��n����/�'��R	�~���i}}={��Oe
N����_�j����h�0T���|9{�h��zT��������2��Y�GY�c���W�pGH+T�F�����\O��lw�W��������)��Q�=�F~����/��8�d���~�X(u��:��/
��r3x�E=gN��icvT�`�.��:����?�10��	iT`�����V�#c����}G�W�MS�
����[�.��S������$���0����F�_��� �BC��\8��.&\S���n����'��l�
���gD���u��O�(�R����GyX<4����k4~�mr������5:{������_�q+��o���j��h�%�����X� l�����B��6,�g;H�X��"VN5�$H����\����1n��e
7��H��w���{���Q|:�k���E��,A>]^v�=#���7/�2��6�R[y�^v��W;�����{tP6U�D���[
W���P��.e����,����o���sh��;)����%G��.C��Hb��s��j� @��R�]��E�O�5��u����!�3�(��,���\R��e�wd�"��8*���}*���Q)���LX`X��B���X���mcB��\���M����'��S$�W�g������ER�PD����:���p��`�����
�=;�gk�f��z�}%��
y���;�l���\<;�����QU:=���Zy�"�FA���U���E�I����+�/kX$uq��O�S��nj�Umf?�����f;����0�t��q���x���
]hYE����n{��{(���:�(�m�N���J��e��]+�
,8�Q��V�}���zs��W�������B��������\�U���%~���DR��5�P����l<�X�9x��!����B8���,8�r��@�*o�+��,Byg_:�6i���!�;Gr��mal�;'������f��jg����)��OX_<L�����7��e�Y���+w�"&�3�h����@�sfH�h�>�"������X���`j�"��f����F�t��	������[h<�f��Iy9������N8!=g�f���������������i^^H������/��J*��\��o�1]S�d�����b��&�Q�~�����P������'���`5��5|0�&'���������X�,Y��2dN����E��~���S������-(�M����~���K���f�fZ�f�]������.�_b0��.�dq�R�SF���`�C����.��J��AS�	�a��bm���h������_��������l��tU�7�P�������/ \D�_@3.�~����'��\|;��"6N��<���2���)�wk�������+�k������c%��\��X%L�f5���@6�%�Vkp
]m�+y,��_�3� "P����!�[�	b��Z�
<`M�m�+���a{��������Wk(��$\[���n���>�H��<E1�i����p���B���+����u��Vv{�)��F�cyT�

��Fi��R%������Hw{�����v�K�!��,r�p�,CB���.�#f��T�.f�����r��B|-X/-$p5.�$A��R�?-�Vu��V_��g�G��������*���< ,���WB�y�Y��upC����Z	�kNC���a	V}�- �E�Y��T������E�Wu�f��X�'��K�J
�Ga���H�
C���q�U��-��I}�G�1&��
���:��d���|�u�N�7;1���	G�k�QU����~��nA�o�.�(K{��{�Z��28b�f���j�Q��O�(T��W��W-X�����
rT^�?-���Pv0P��O	~�5=ZN�J��������v��3��U�g��&c����z��������~���T�l/�����y%Y4I|(�q��`}����Q�9z�����lc�����.?�V����Jo�a~1��<Z$���Rq�\V��Q�_�s(���d(Ji�M���C5���V�3�\��:�0�]�A����Y}���~W���� �L��������|����)��(K`.w��-�X8����u���b����)S�Ik������E����6�~��[���wc,��)��Z507�c��]U�Z��LY8���6����3e����(�%���_Eq����n��M���*����j�Y�_�v��uh����e��1iM��[�^z�����P��?��
w�i��@�����/>���4��|�5s�5�*�����b��<(>c
G��PN
�>��wO�@��ed����H�v�:@Y�\��>�r(g��&�z��>�����R�-��M��
�L��CCE��Fm��^��p�|�������1t���"�g������~�H{{G�^�
���^��s){�G�����O��!'Y8�J'������^��e�J�s��L���/�qW���k0�8�w�]&�Qa�
���0X�{��i�.z������
�
�q�C�9L0��\���&��}����f��u�r�Y��:����[���m}yZ������:�����u�v���;�&���
�������>������P�������oK����Wp�������lq��[0�o(�&�Nvy�~c�q���0�={i�_�y;�?���<��2�����"t�������?�0��Y�~N�dA��^�yw	��V$��2\
%A��x��>���r�t�dob�R�X�-��]yO&S�;���V�Z~H}�������b���L��EI�,P!��eV��t����a������vlsB�XO�C> ����!�3����+�i�
ob�l��DNA���GK������d���8P��2�B��R��&�V�_��]+]<"@:��
��D�<��J��@�+��+D��#i��#��K��]�n���w�2���3���B�p[�a��[\��(��~~T�����p��i�{G��b5����7�I�	O�@��g���n��/�����8��0���mT��jL�n��7i	�i�p�|�H�kJ�Q,t�G�Y�8|�0�w���w~�[Q��q[!���@��
�����}��"n������{?�^���d�Ta;]p�&�_]�y����G�O����7�b������=z�q�2������1���[���J������� ��������<P�:"��#����*�s��������m�m�'�B��sr�
��WQV�;.�b?��<���0�+��>���k�)�u`��c����6��O�7	�b_��O,'s.4��:�zH�=��"�y?Z�M�3{L�^u�l������e�������
j#���K�GzR�l�~��<d|]��&
��\���|�=n^vTP�;~�s��l��v���V�>��5�g�U��39��xg3����v�ij����v��m,��O��|�,������)N����{R�������%������ih�=�!�pN��}.�y���v����n��3�_��}>3lc�?�
�`�+�Ez	t��z�P��4]n3fTJ%w{Rk���w��.��/V�9U���{�p�O�����W�@+����\@uB���WZ^Q��=x�}���K�����������+�d���W�s�9�O�U����j,&�(������dBs
n���o�t��n\n�${rx�3q���
k�e����H{���f���-����T/!�5:��|o/u��������l3�s��o|�����_��_��~��cn����������VW�.0������{��V��^�Q(
i\����v�7L�Z9��[�nvi������/���F���j�Xx��k��tg�2�����d�?���.]>���*��g�a�F�4��(S��2~�����k��N��A*�p;h��
*K�Z�+f�?�10��
�9�)�$a�
1/pc�i��3�A�=z�L�J����P��`o8��{�/y=�|�o�+�9�ye�:�q&G�OzJBt*:� �@�gy��A�ti��@�������N*�9�������{R����2��w��wL4Ca�EHfhr:YK��BL��;�h��-y�a>}WTeh�������x�*\�d�B�:����+��������E������p$_�<Zt6X���K%N��=K�t�M�|d���7�10*�l�E���B�Rh���#�o�J�]��F���$�6m|"����ZzE�LL����0?���u��3����5n4rF��.���W����� =��%�����w/,����j�|e�Ow	�V����Q����cnsl�WVZ��l�8.���SV�:��F�kn��~�R���",�VB���p��zq6[;2V������V6uP��>u�A}�w��Q�9'(`�+���:1����m��8��p��:q5�=Jp&�i��b�4��cV���R-�����!�������PBX��z4�r�'�+u=�,���X��E�l�����f>�����4,|7q(�;0;���u��������O��������m�����	h����:�zZ�U��g�����a��\�7{[r���x��pp>7�/�7�����g���%vx!4h�%�%N�G����0bV�u�r��-�3M��<�j{;AE�J�#k�55���c���=JO��,�
��*�f������\��#;�F��]�aK�<�@p�_%�U�h��"�#m�r7Q�����1��������gL����^��5�]�i��\�����!h�q��t�v��>�j���1�����;Rp��hr*��O��}��_e������ Z5���_X����s��/����X%�aT����)�5^F�w�-"cQ��Ko�&c���I~Dq3E��Z���*.#���VZ���g(���Y2�@�
�
����cz��`�����w
n�F}L�9�X����y����h�6%g���G��M.��2����y�c`��<d�_A�� M�x���~�g`~�&����k���i�%6���yEJ6����K����xo�q=:��,d�y����E���cm�1�-�y�`�k�K��P�>������|A�X	k�JJ��O��O�NgGQ(|�����KL��JWVNI��
�����%,������k��]P���[)F�J��2�A���#��`��;��o��i�J�Vc-�d�Q���~��������E����K���r��J����k�?�������ir�h�u��,�K�O�?|���B���"�G����?_����da�,{���^�^zX���r��i���-u����(�~�o�w�>��@[>J��"��4�QdB��o���,p�S}����xx��%jS�d�=!$�0��2��zc������;��D���l?��K���HJ�B�~��,�*1�=M���CY�I�;�����o��eB�:e�k�b�y)��a���_T���nw-��d�{��I��&4hR���V%���������e�g�9h�\��$H��������P�z��!�����������Mt�r��������K��@��Bg0�
�]��%�@�Z9D��\���\Y�M�<=#��~*�#������@@�
��rX��bs7�5�h^���~�DX�3B�+{�Egn/r����be�{�?R��?�}��5�B�>���������������&�x���$H���������r�����2���:
'o��-,�8�{�����<��J�O����[��
����eg�������
��T�m�/	�%(��!��L��A�6����o�pm������c����[���v��)���.���0\�bG������x9���"�2�SU/|���x;����}��������������<x���?������c`�'�>�����o^����<��<"f]�����{=�R�8z��Iv���(g&-���#������`Z�\Tp�H�nX=J�mM�]��f�aF��� ��-J����������]����*\�c��Z"�Sl>b�J�'����|!-Mp������~�q0���,��s�7���ENj��w��/��a�9�����%^����
E���s�1p��M-����i^�L�;Z*f*�}�kv�B�����Mk�6�=�g�]V��w�����O�4E4���{�E���A������X
����C�'��p5�*))s\��/�>j����FEk&a���j�#�?��Z��	Y�WU,q���"L�:��Cl��?^��5��~��S��,��w	���k�;�\nq��w�����R�H�Vip�$;� ��<�m�6R��p;���I����6��^Ke�B�$���	~�{F�P0��������%�~��������G9+F|���&�KubD!&7���;|Z|�b���C\^"��P*\�1HrA���L���}*HB�O�u�R����:Xzu�f��u����Q��Z
���MO(;���t5��������$�$����~Gaz/XO�Y0�&��U�&s��������Zb��%��G������Q��b�y��}%j=��%���gT�7P��@\�Q��CgS�h�8�I���i��t�6��]!^f���o��.s��2s�bg�{��O��+
�Q(4��������;hHz�g�6����?{�&�BC���+�mts�!�2u5}-/.�}3ex�ncf����B!���d;��q���2<Y�e�����IC]��R�3�{���rLo~:������V���a�w����T�������~�jM�[0�=E�tqYk/q���h��,��8���
6Q8y���!���Oq�c���W���]��������)�s��(5��7'�h�Y�:���K��[����#hcN�tp#���q�
������e�MUh���E�����s����(�{9GV�x�'�G5��s}_F��&.��m��puP,3�!�@��$2r�|1B�o��Gu��E� ���m$�(����]������|#����
�������b�\���
V5��f�����%}�������\�tA���o����w������{������G����2������qT�p���G���_�������}�+_���T$�r���E��#NK(�o���~�}�����x�S����7�f�]��\�^aI�We�:��4y�>mF`��|�8�V`��p�{�J�l���I������)��&t&v�[7�3�����������l4�lA�/.0�Ca�9d�����^�2�U�������������W!��Wb&��
��m���:���t���.����{l<�,��>5����4��n�#S]g)���d����=���6��G����4�=���O����������Z�������<�10��s��\���3�%�s����8���L�b��3��y�
����B��e������j�=�1D@�2������w������C��
"�*�c��p�/.
�<~)�Sp�OT�����U��2���D$��N���V�����L��<C>���=~c����-|����`�W����\�V
g!r
���c��<����UN��6�r�{�@���)�&w�S�������g���@�d�o�9����e���<�����((����9���x�p�g��#�YWz�"#�CA:�����gu������%��#�[���W����.g��pS�>B	|�[�7���@s��z��_���e�mV	�	�y��f�����<y'{����L�@o�b�Q�}�m��7i�!Z������8kuN��b%����
Z��zR<�PHn�
� jk�0�mhQz1�^���+&�b��������e����)2t��#���z�F��v��h�����\_��lrzS(�@P��(���������� Y1��"���?N������G�,d�{c���Bm`����0����W��;X5�����}i����z�}����1.�6����������=<����'l�����u���@�;����(�
1~)�C������Z�%�*���������^�}�$�X��!����@���q��W���C�G��O���*w������0J��un��]^:-�������_
�������:�N��O��hj]�t�z��S��$���2�jA����R�<!��8&�t�]WU������]?"�s�u����<R��^3��{?�������a�Z#��_�2���bv��]������������7���1��%T�y���l,��?�=�n���q��������4�+���U�
�J��E��USe����@ ���i]I�h�����Qyf�����'�V�}��x�|���1/7��'�w�>�I,g�����x�Q$����?f��/s����z}�~B�b3�x8��� ��a��^��Z�I�v���������y"T@�M�����)OE�"}��\��x��g�>�HG��K��m��'A��;�f
[�{9������)D9� ��D���PC�j�Hp����,��	�Sk�>$�����^�w��������G��A��k��wQ\^���p�{���w���
��zs��}��������|�u!M8�JTX�������=G�,lr��aK�����Z��������M1�<��Y.��k�f{?EV����P�|�{��Y�7{�>j#�������K�R�$�T }��_�#1������)���G�e����z���=3S��3�����qA���u�(�h4�T��r� �f����������[w9!��Z7�W6�'�1����MXzy2��bp��m+0]�CeS|;�stw ���c���,B��`���:�E{A���ol�I���<��s����;�^Cq�b��W=�
l��}�Y�Sd�Q������<�"SV��w���D�u�6~��*��;��3c@�G�-g��x���y���u������@pM+��I����I���2ei��8���${���=�-@X�I���b�qLZ���B�<8P�[*<#�
(���S��w,V47� ��2��X�����+l�n��B��;�4�?�Rkm��I�p����������N��
-l<���8��6_Lh�\��N�=�	/��v������u7P�#����zH��l�xv�H���.x�zS�����^����<��l��x���.x��W�_����&"B��*9�|��{Q�_�]��'	h���y]��=V��u����[F.��&p_�,e_��Q!����C���yV�4`�a�Hv)���57(����Y���t�]c(D��������lwWWs=�����q/����u1�x�RO�k����7:��4��W����*|��-`����N�#Qbol�6��+�����I�%��]�w�i������vl��JDTH�0d�K��j�� ��#�Y�xT���*a��������fMf���Z�#���[��a��z�
Z�c�����8���Ml�J�}�i��D����%hUG�_��6���O7����f}*�����:s�Jx:.�����A�����
�R������~����V[!M;/5C�o��;e�"��\��D�M�3�j��+?�pe�
�q���*&i^�u���&m�R�<l0K���,Ns�y�5�mH9�q�W����c��Z%�J��V����}�jS-U�7��2O�YNd6��^t�����
����r�#����{������O��3O��9F������_�md�-�f���M� ����N��:��c����:���^��M�(�G�7�Sg�(Kt�A�c%��r����'� 	�$*����h��%������	#c�{��&��@��2|���qN����X��4�m��h�����s�c��]�����S��]}���O�w�3u������<��X���w�|��@K��/TT�1����������7�%�E�|�J�.����T�A������h�m�	���^��'Y<�ZS�����j,a<A�BO��h�e�od)�Zo�4W�'l���,z������CN��@�6tx#@�n�o���I�-����0�����������O����|v�5~���)-(��#���:���;�Vv���5.�l�"@�#���A/=�J/H�^�l)g���_�������������c���@Le�'��!�{����*�4]�*hGgNkTZ��'`45Tk\��(����������nq�p���"������o�4�
Z�Qx]�U����^!/Gir���U 3���3?���I�$Q�@�����c���\%K�t$,5�N�CS1�x����<,P�*\�b��V3�5�U�
<p7�_�\�C�a5�cP�����B���9{��F��g�\��(3\v�#u6�Z���<�)���@�wJp���(@T0-/i�����~@���,-jX��KL��q�;9�n�_"n�<
��>���F?����`L�<����8��Zx`he���TD��(��kUm���WKX��`(�y��i��)a1��z����~���5���<�\���`��_O�����v ��?���O��R*��b��*TU��Q���e�V=D���A*u�D��&�Y>:E�	j���<��sl�Y�����)�6�W���9���X��o�S����6	Cj����l�t��v��Eb���h4P�V��X(lO��te�:�km�M����?Z�"���tR�
>V���4w��}�C^J���l?,-<������[�LX�s��������a,$Hx/D�G����b`��/����D����h��#���>o���B>�
���OiJ�Q�q���v��r����1C��������q��N��q��6�r���2���7Ip�NeR6tSio�av^�����%�X����7NR��4'S�����3?�`�c?�
G�p�K��V����E����r�����Y"U��c`���o�b�s��:a)����,����\K�����`�������G9��'P�_��nO����3�V��4�s������=����{��9M���cyf��.i�l�����N�7+\����O��i?eu�����}�'�4+	K���V8Z��vO�{Z�,�����/~?>>�v~�0�K��Z�\���*�;=�\n�ON�e����X��L^�I�'v���:��I���f#����,�N��s��	������=6<���2�(<�F���(�Zbq����tP:��J������o����7L�&nDL�M�!�~��q���D��"`XY@]�Lx�<��'=;�v�tx8h�Wd����0�n�.*x���:2��z���10��`.8ZJ.pb��y��0���?!_LiN�	��hu��Y(q�� k���px&�B�_VDQ��@8^����=���o��������..�kX
?�rA�>n��(G���l2c�{,���Wt�����Z{�#�_��3�k{r^Z*s����%�2���y��L���a�"��4���6���|/a������������;��������[<�7���|�@���vz&V�*�"N��g���lb�j34qWU�l��.1��R
>`�TH�����.���H7�y���2HC
��P'�O��-�^�N����QzA�90�eV���C,l�y���/��Yi)�A*C7c���8tD*��uUA����U�]�L�;�i
Su����QY@��~+���d	���P���<\V�=&���(?&�,���	��A(qRL  �Y(�j�����y-�R�Gi���
8P��O�A�i�Q&t �,������A>����A�vJ.����"������=��QfcQvW�-��ey���
�*�����`�-'�=tp�a��&W����D�����O/f��#HkP�����������(G��w���a��g_k7����r��t��E�a���O���c�C��&��p>�0@�<����n�v�������o�z0
���QR��[(�F�oY�d������zm7��1����Q����$�y�5����=W���T	<-(�DSX/�6zd\�;��4�$��C���>�]}
�%x����Vv!
��!�0vW!����K�5��E��DW��w� wq�,�F�=M���hk�
b�G��P��?A��mXhs����.�<B�9<O���B����8
�tpn0�4��A�;�d�!�"�;����U��.M{h�����/�b���9}y?��_1���n�<�)^�Ze]�2j0x��c<���wg�+��n9+ju>�T�G�g��T�>.m�y%�+��{����:G�dy��f�@>�,1A#>��	���D
s�{r��Ip�_���Y�C59E���|'�a�����&]&����������DM��i����f���	Z�K�N)���(�����f�����_��RU�O�T�t�9�#�} ��S��p{��2J��k�MN��TQ:�gh�~,D�G�o���r�����I��:���
y�����yx�1�����O]6��������,�1u�������S�kh/(rZg}|�B����nHuyA:WN��	n�*���y���tT����-����;���������r!�QkT�h���Y���s�z����E,T&D�^�Ge���<>6�d�b�TJb�Y&f7�p�W�x�S�YL�_��VV9���E�N�=��X�8�����P�gtj���T:�E|�}������KR��T����;4���*�,��N���^����3�����"YIK�l#x�TO���3�B�m,�ByFQm���B�>�<�	,S~q(������c�3�i�4�����'i\��I����{>5�pI�n#��~���p�����Cw��<l�EX���w�{���p�AX�&�-�Z��|�hsr�i{�N����T{���Rk&$IYp��b
�������`��`X;�z������G
r���I�����V8�XGI�F�J��_kQ5h.����*�f	�����$j�`���6W4}M�N�E�����U�+���A(�'�b0���f%P�y-�+�(��S�����KO�M���:��'<����p���>R���a+Q�$��2;~��g��'�5
�:K� ^y���5�U�����x���Q,Aq�*f;�g)T�~'�up&����1�<�+T����x��VIO�FyLkT^���gS�]�N�� C���`�dx����y�:~�):���TPH;����Qe�p��qG��8�m~����x�Ob,���?�/����I�d0O1����S>����bL�<f�_^��XK���*�!�G��IN*�<��B����hq5��d���Y�y��e�<�r#����G��~0�pY�p��2Vl�������S{S���J����l���lqk?����p�����M�=��P��o~��v�y��E�C\�8.���C�*~�]Z5<P�o?>w��a.
����
|^����XN
�KW8���n�����C������L2a����g��7�D�
 �`��`�{+�n���6�eY�{
u�`� tK�T�v�����.|�@HgZ}C�*]z((���E�������\>,��G�����q�/}m{r��u�A�{�C.M�������r�;�Z^�}��Rt��M5@3��w6�-���?��IY]j>��=�����O��R'�����6�|���c������H�]�X}����o\_@�@v-��m*�����c�M|@\.ON���Cl��_��J�Dy��P��
�FW�<����C��z� ����a��B��w�U�����9�F��@9��-#�}��Jv�����:�N�}g���'7�6���J��$��3���O�li���k������E@IDAT�|j�/UL
4_Z|~��2-�l�)��R���t9$�x%n����N���y�Mp��sC�H�Q�#���h�0u�9Z�K�I-|9�"�z�O��>�����rG~����"���#��\>��\�g_@	)��bQ7�������&��/���-,@��f�.����p��#n��
p��$���BI|�7+� $FV�l(fig��,�~�5q����$,�Z^��]��.�
-���#�����#���=�0I���`�^������8�N��=b��Kz�6��G8�%�����
!�����\ 4��o�
I����:�Aw���e��]Fh|���Q>e��Z�����z�'� Z�!�u)�S[���-q
_�]VTfb�F#��^�M��"�	`C��3�F��r��`��=:���g��Z�=�_+^��+��^1�J�H��W@�_h>����w8���=Oh�*N��6�$c��UQ����,��~����
��u����s���|�z&L�Z
�!��q��O��2�	l�a|VYg$����H>v��	9�6���J*���1� 3���������XS���b�����L}�`.$(�(~���{�")"��V<���wR���
K��a�����:O���'e�P�c���A��D9L
�����6x��!�Ki������}�����e���|Z+Xa����
�s���dg��5�����K�����bl�nS���8$<�tC7�?[�;����J����;�F���K�q��{��������4����o9�o}���w��1�1]�N|�����������'Oxr�����e(����n�
���_�D��;/`��Sle�e�]��B�]8��;������,�~fs�0{�d�>�oI|������|^��<�sf�7��1�q�K�g��,2�w)+�Xwt7���1r���T��w0}"Y�����O.S9�gq�9J ����z|�d�0����[+Yma/�<@��v�
c	E�U�����E�u6���d��s�O���O9�e���W�_@�����x���#�������7�B ��2W=} z��n���=�P��78���)��U��D�U���@�k�<�������@"h�d�Wi�!d%<$�������������>�q�)�*'(��,.�=*9�Vk��^��E�G��z�#�x�_��Q�>����=�!�![�0���	�'m�q��+�zI'��g��E?��^����2����|��F~L�
�2����q)�M7J�wqi��)�\BA�E�ta N��OV�E��x:����%d�i�^��
�!����,T�������&wy=��E(Ym��^zL����9���Oo����P�	�E7�Q�K&:V���]qq�J�&p%��m�D�T�}�
�6uE��4��4*���F�]��z����q�"����;�S�����B���������khH����S��8��A��t!M��Xp�l�_�B��+L�Z�g��y4�f|�?�O$�-`��J�5��U:��K���9���S1�r����(�N��q��hQ��p��\���*��v������h�|��������J;v����o�����v����-D������d��C.*�;	*��$d�_]dl���������u7U�_��B���<f��0�t���|��
,���*���s��M�K��~���VW�� &YW��M�;�m�eyU,�@�_F�c�l���{U�N���������Kc]�f�w��g//s��Toq�Q��p�i..W��(c�7��p����\xr+G`��U��F���M�J�I�X��q��������p��
����s-���3�M���/��Q�i'yN�:XG1��o;�Ee�&,it��zfy��c�2�'���
7`����G���K��D������<�VZuh,y�bF�az��d�z��i;�_�d�SO�7Y��T���~��d��Zf���i����F?��<���������g�Q����&���
�����<������D�a���A��}4Q�g��"���@~q������	�h�J�Q�:IHy��&����}7��,[���`����Fq���53U��t��L�dq�(+3���4�q��tc������4���>�=/�Q����$�h�����h()�Z]plD������}��{���eS�I��������u���;���s����_���K���nv�����~��
O@�S2E��LD�?}qA��:��;�����M�&����w�Mz����������|�����9���3c�)������^K����5d�u�3k����f~�T��P2u)�b
R,�82����v�(p�������X������wYp��&C}�p�T�E]�1��bXh�����g����
��������Nw�-����*|�>eh9U
APDGq������� 'GE����	.R����O��,�%��	�?�V��6��U�V��)gy�<�X���u��y<	�WY�6��F�	D�Z`X��#<O���S��p�;6l�2�Y�\�Y,O<��D� �1ITf��������p9)j�V���6�*~���l
8� E-�r�B��������Z���O����8o��/;i_HN*�>i�	����Wl"��]�i��O^�41��KV�?�u~�m��}��
G����Qj�K-�T89�"�-�C���l���<���~����
�uu��N��S��/�c8�o��tC��C����-��I���6���&�W�����k�
�F����� \&���>YM�Ke����<�����l ��3�u�Y�w��n�����WX ��f�C���n��IY��qnJ���O�s?���&0u;k�U��=<a�P�]�?��1�
dH����%�5h�:g
�����&%�(l����b<K�����k���S$��K�/�?���O:=)�V� tkR(8���1������w(���"S���B������&&�i�y��;T]�Z��6�{\1w]��dmJJ�<���6]�]p#R����tk�0,�^p��'j�G���$,�{��!��0�8�d���w��`c�����J�d��[k�N��3*w~?���#�R[$�cbd�Y^���{�/�taE](t�A��}J�o�bg|�f�~�4o�k�^�6y�
����OL������!����^$^q�G�i?2!�����"��|����o�x�00��x���@����n7��J�>����3�M}mhe��(��"���Sg��5����P:q��k7�i������"D��`��P����/�p���uq���|34�����$�E�\nf^)qVHc�qz�>��~\"��Z��I�K0�w���&�8�����{��"�s�f��
����t��Y�8��C�����nR@=�SC�#o�:+����R��O��/��l�,��\��!h_#C&�D��}�O���~b���&�!�i"s���i��/zC��t	�4����B�9���ZQ��iu�EH�S:�&q%U������Iq�@hR�"�1nSS�zO`JL�x�T~E�WgY�
8�j#Dh(D`�iY"?�������k���O�_�����|(����/����Q��G?{O
{_Vy3*�<j�>����oc���Qb�QjQ'�
@�Xc��(��[��I��\������`�-���*'������
.pQ�������yX�B�R��� ������[�5�@�#}�+��,9�k{�1N�[H!�p�w
���sy"�������>f����"��P���}��
\l�����T��<�"
�}G���t�[
\hR�	\�t��[�#I�T7���t*f���i�@��9���e���z�+����x������=�<�����A��!dM���R�������U����V/�oc�#�)�}(��v���4N]AO���{����^�bY��^��wg�M�N��=,)p8-9�U����o~��<j3���M�W��m�*{)��JngO:n5���^p	�|a8��$�~�%
�N���96���@|/5����V��ke����J�]`Kc9�7��$2SHc!��3�/�sL�����b���=�)FO�l�������y��O�iK~�*�{���1���v�d�YK���t\I�����7���@�7-tqV0&�Y�G��X-T+����p�9OZW1��a��Vxn��_1F�~�+����Op������1���l��h>�����0Hk��q��)&��b\J[����=f�v�J�M�`=�p�>��?J���)D�d���:F���3:��7�5�������=@2M��x%��u"��<W�����wn������+�������0x��,����{�q�C�������rk��^���?=�;���Q���(f����K�g�a��K�?�1�bb@�����@�P���chq�	yx�)��I(������n�!�M`��1�{���0&a��R�[g3�2����nL��W1���7����^���N�}y����,6�+VPHv��#�������T�H��:.26��}zE�%0��l��|���2'�}�bQ��^_�a4���W9���h][�aD/��T��Rd�A!9a������i`~��-'*��+�����E>���\u�"��8�� �8�L7��������<<������Q�3����s ��@l�{������M�t�xYY�^.XW��V�K��	�m7�d���E`a�<_�`�1oW�-�p�a����<}��^�dd�f=���k�>VN[��^l���w�������2J,��t��&m0<Bso5���K���v��#�!���d���"C=}.�G��*W���bw�WOw%~R=]���k������_�:�'
zPj� T���&�:��b� !���f��T�{@9��K��2���.��_nmP,�<�<s��IL��c���T���A�f����@}9mx�S�s�e
J1x�%��
���nM��Z��=\���T���n&
1�{�/Ak�*���Y��G������m��S�-���:��w:L�����*e���w�wV�.VR-x���u��hB[�1\�S�e������I�������OaRttP��2Q�*��\�_�O�xS@d�6���<"�������O�,*��I�V�
}��D�-�<�BR^�V�
�za)�]n�S�wt����r�;�{������J��f��+����r���D�p'�Zg���8����5���}�
)KI����(���,�S{�����2q����K�K��G �p:JI�Q��N��<��X���=Q�C�~�^�4���bu��������9�p	X&B������?����*����%�p�I�{�Z��F������A�?�B�f(�v���JR��z5,�z�����IX�7<V��i��� ��a�q���V)y������
���Co�wI3k�P�8�]8dc�b�F�iL���C�_�����@�A���.�=��������)�����=g��e��1��|=���eZ�k�[<<��U

_��Wz�q��:���!�I\���n�O�t��:Upn<<"��������
�C����rKL9�{J�O��GPZ��^gT�*�N��.i���
'o�f���������=����3����d>����b�s1�BWy����
I:���U�)����M�I��y���2�>-J���L��A#��	jL">
Q-�Th��7�F�CN-�[ej�a�q��K�gT�w�w7�9�NU6D���w��F\�`�e^)��g�<���v��I�z�sY�&�s���N��m�����V�mN����t�p���}��K��/����h��,���������kN\���`�i�<0)��������������7=Gm�*���C9l�)4Xqi(�8~�)���Vw=�N�
�U=�W�e�
WW�;r�X��� �c�;�<7
���i�����	�P]�#���4���A����	O�!�>�R����q��]�,�]v�5������G�
�H3��X�{@+��=��t���!�&n�<�����^�P�����n�Q:%q�*3�=t ����z0�@
6�e�(��A�W�^"2���>H	w��6�����y���%���8�|�����a�\(.(�2|^��p�=-��U��&N�������*���i��B�br�=XDU� 4p����O�6�H�
s�����W�������ck@�oR�N��lW���^xM�3�#��(��X��>zz�E�����B	'��[.b�E%�-s������o�g;����q}4
)�/q<�������t1��8����^�f��/���e=���u�X�=G{�~�P��g�{��'7_�Na����i�"=��@HrT�W��R�
���qp���i���6[�����j�K��T�c�s�~�I���r���'���r@��<��X������Ls��YF��Bq�����b�Xs#:A0�d)'(�4��2A�1����~���K��U���w��j��t
+$�?G�!&O+�I����wD�F�ym,����sJ�22��/�a���u�2����x>���������.V5@K����NW����K��+���H�g4/mm�@�v��Ui��w8�Q9�����~�%���+��~��#�h='|����aT��xqO������~:���gC�>�,���/_�IQ.c]����I�vJ:�_k�3�i��]���:�����hx��������{�($R5P
���E�0j^,�Y�p�iT�>����x�10���=���0�hRZn0�{	�������B��NT���{��<Ob�R�����]R����r�
�$���:�z�/&s*����i&���
�c^W^���l�`��kPx�Q��������M)S}n�<����/���dj����]/a���jF�~��x��WP,G�|�_��p]�TH����W�`
��5��~k���o���IE�,�8�w�7m����F�����2nm��?z]l�Q����0�\���v^M\3����{k�We�{a�.��qw�i�~����\S�Y���D�g^ByS���3��8�r�FuN[#�e���;��E���t��u6CM��|���-�Laps����Xk�i���8{��h�Zd���b��?G�e�V=�#�A8��	��G�J�����M��A���N���EXW�i�!��D�TCiW�����������>B�2!�x�J�x9��O��Z�����1�e�����x?3�2�*���jw��[��{d	#�d#1B�4H�?HB~�4 ��B��4H��h����1��`��c��gWuu�322����}����8�����������s�����~���Z{ox�\�g�Y�Jri�[��]��D��tY�%�:Y��rX�Y�s�Ab[����[e
�os�x�,��{�x���Y�.����V��y��,�hc����5wK3A����G��[MwJ�-9y�<.��q��>;;���G�����z(K���
�M�D�����jr�BX���6A�Jw(��Mx�q���c����>���{�����b���b�U[��}����io����	�Sa�}��R��'y���{l�x���\��=k��q�f>�9�RJl]���B�xj��'���}����sG���K���A#���b�y@N����L�*I��f�V@-,�mHc�upn��(��,V��l�����2�4�Z���J�Cv����������:�?W<����?��u{�3=w����bU��:���X�MU�����o��|\����]6Z������
x)w�4,�\�h��1����a(���atbc[3�����i��U���V� ������x�jT
_^&�&_�����0t�}��a���Vb��H�|�i]���5�EN��c9��jS/���p�t��%���R2`P�6@�����b����l�<�+��la��"��iNfx�V�v�s�K�����*1}�4�����p7]��5�e��;w�y����S��6�2��k=�	�;�r������H�������������J'^oe�Mv
~<v������4�}�1�����1��U��Z� s������EP
3y�T�W��C���R��a!cf�j1���v��E��=��(�,3�(l|��������>�2���4��~��dpw���te��sA����c�M,xT|�E6.�;���J+�&��Q��P:���i���:K���T}c�JX��1}&������v��%�����l8��-��2�r��F0�g�������?N���2��v�����:8F�k�|` ,a�P���[l#�r"_�d����������3��0x��B����yv�+cz��6��$O�N(I���%L������ny���[����nC��P�+cP���U$Y1S�B�LX$�'t?�6pRcW2���86Y���N	��k7�x����L'@%�A���hi���S�x�8�YwXM}oc`9�!�������8�F���U0��v!��'�B�dp����F�w��w�rU��)0��s��y�9
����
��\��k�C�z�����\��)����H���7=�`�\/��L���}�=��|�W[|�����,��]y�����R�.�BX)�@�2M�Jv*�(�n�>$+)<S���I)'��yw%�EW���_���#V��=���8W�����=��6K
��)��9���
����|��7�Y6x�@7��f���z��������U������2b&�R��\;��x!�k�Z(�����������<�P��|r5��4O�g�ea�}�xi�Vi���T���H��K5�x6O���H����OJ�T�S������n�~�$iY���J�����������?���S��������17�/uP�6h��y[n�&L���^��.g���.J'���2������I�zJ�+C���I$���v
�c��E�z�L:���u���w������QR�����-��Q��Ij��m�c$���u=�5Q:����<�^>�k���:?������!���WS<o�����i���3��F��k{���n�0�i��\�cQ�s��g*Tjk�Q�����&��f;���:�z6+���W�O�8�k��.�j��.nS��t��L>d93�f*���-*?���[�WY��Qj���8�2�FTQ�-uKhy��e4��,/�$����]}:���s��i�9�w
���d6���<����g.5���>�2;9�&wOcb���%X�Y��>����������TR�N�y�������~�3-���9�����iJ]�����{�|���F�l����?�
��������.;��	���H����\P'����������F"���|��Q�v��iY�C�LNy�O��]v2�N���|�f��O/�K�_g���$<+������	���[��8or6��B�X�����lR�M�!PM\���h���{�u���Q�i!pbR���r#
�s?�-�X����V~�I=%&��y���5��6-r9�$�E���])��������?���O���W*�Z��V������K��'���B�<��s�
�
��1���LV�^���Cy����������I{���	��Aq�A��m�����6�9}$&��R�$	��_?���B�������3����r	x[}'��	A��3�bL�Uq9���e������b[3�D�<_�"���B,W"5�����67w�d2����H���~(Y���O^e���y�/d��K�O����xW]��;.�z�V���7�BI�Z��=����O�*���'�K�T���%����������-_�%�`bS��}�B�;*�rb���-kI��T�Y`�-tT�D+#����x�2��r�;�����:�T8�Av���n�*��AEb(�yn�-�6�M��RJ�d�ma���TUXS�^a9�
<�������K�e��:�H|����5��.9�����������=���K�0���'
��r2k�~q�s���<qe"�#�3��>�������
n��th���Z�n�4�B�-�vPJ
��4��
(mo��b
����&��<�s��XH&d����r8���*��\YN������&��u��9��}c�6��4�(E�Q0���D��a����f����\	5E��3��"�8��H�uY�v���*^n���_Z�*�y�E��*��s4��6�kg
!����we�
��
H�I+S�><��3pL�G��r�H����_&9I��#W��`@�I���EV(�X���q����mn����
���O-0���������!O�01N��rb���O��8SX���M��S�`�L�Y'�^q�����<����J#�9��z�e�Sk����|��n���v�(<��l�&o�K*<_T��E������z��\eT�6	u�SV��r~
I��zl	��
V?���%���5o���r���~T�u���e@�^�.��d��!u�9�_b���g�D�}d�iD�Es���������]
*����a�Wn�����o�>:���p�?^y���oF��A3���p_�&�4�Z�G$�,b�)�:����>����d
ki�KC���=���>B��8{=qw>�	��e�q0���.Y�J���8���_��EK.�e\+a��d6����)��H�����i)B�����9�e�>�q�d��hd�$HZf���S��� a'j>��3S{�X�0�m���0�k������{���	��������U��	�%�rm�����p\��-�$���c���d�C���^���L\���0��e�I�������Q����w�F�3��_�7Z4X)���c<�M�U&���x(<m#�5����{�m`L�+��hQm�������OJ:���O�E|�^���q��VXk��B�p4y����������jW�����+	�)D�����j(\�����*���{�U\@Z�
or��v'N	�����[�q��F27������V����P��Byg:e�$�?���KL:�u���0��������P:u�N���M��X��^��G�����N���g��U,����rm6��D��v��b���a]5��7�Y
�(�����e��G�������U8�;��N��U�x����
�m�(k����6����KM����'<s�������, �R�9?+�3}H�����r>}|j������s������WA��:H+	�T����}b�'�W���?.rfi5�w�~���e����sFaSi�w�����;(�T:5T:���������:�����qL/�7��p��t�F
��A�H��t��]�QA��!��u,�H%/kNE�
���c��nMp��o����/�N����`���0\��R�T����Hn*f��>����9.�^��O�-I�m��Tr���t����_<�<b����C�~�q����?�x�6Y�-�@w���+�O�Q�������}����~\���w*�1 K>��X�]-���K7�9���������5��W���2��+���GV��/����Vq36�1�M����(��{�6�h���!Glws�p^4C�,&k��d#\�k���G��i�0�^�JO�qX��bO�����/�6�U%�����Z\Q����e���l�Q�h���l���st�V���*L;Y���E�.;�GX��LE���]c&W���3����+lg��Z��������B	��>��0�wW?f��~�����x�p9]WA�?Y�A�o:�V�����i����=G??�:,~k�+�C�_�P�q�������[G�G�I�����v��xp����[� W�����~���*��2f�[qYr|q�t	K��k�stt�j��xK���c���s~��^t;����u��� ?�X���|$Q�y�������X:o�?Z�N*Zl�oFw�+���5�2��D!�-	���:g���[�5�>��>�IFPs<�Y|���h����z �� ��K)���G9�GdYf��@",�u��j����W�EI�c���(��b{
�S���&�c����c�9�q��~x�l<8T���s�%���Y��q���0��'�/��u�K``��=����.��u��A���G��x��G7>)vV��zI��b���xf'���/���-�����v�d���be��f���#�n�H��LPZts�	��L�����abr��we���[�!��#D�:�#�����}�Q�@u��v�	��`�\������VO���C�K��10A(���%
�S��@�g]�q������m�I�1���8q�?��(D�]�5x%���)�H)f�tW�e�u.��X$_�s��N���	�� ��A���X�w�&�+�Q�x{�����l�2J�K�N����9��U�QG)���|I�6�
�Mh^A�v��0c��x=���&�F
`���P�u[@6:���i,�nR��o
]3`���CV�9�hS�����9O/'��CV+����QPv����L�1��3����u<�p�����F�ZYQW*��G[J�]������O[O��T��f���$����+�+W;:V�����LEX��x�B�����P�	KKx�&7��6]I@��������#��lk��BC��,T�yF�q��H��y�����7�c�S�����/x��m��q������;17].C��tC�����)}��
��o[���s��Z�3�P[�	��[=���?0�����u�/��^zN$��2�uu!pf�E���%� �Q�it����-*���0�.?��A��M\�7�����6m^#M��[������lY4���.�;8��8���v5�A�c@@�u�|W"���F���t�+�=�wI0�phR��d���w�
}�L�����Xpi��x0�A�:�_�S��E����j��7�	�����+6U��-j�Y��	\z����{Y�������%�|���/3�X���NyN�:�\"#3C	����Y�_�=���fx�x���_V�R�p���0���B�_��<���9��>��j9����CE(�(�}V#p��t���EA�~3�2����G��(�V� �����#D�'�*{]�=+.r�����t����r���6*��~-�*9TL}������S���{P�w���O<�I�,2�_�����?������� ���P*����&����H��I�o>���0]��p8R����t���|h��\
/1�g7�C�3��	r�
��f8��a����&���a0������*d^�LV����P��p�`��X�ZW+�S�a��E'[(d!�L�"���'��2c�:���I���B��0����5&��'X�2yuK�4�K�)*:������;J68W�i){)����2���<���,���I�`&����L#T��JPR~4����#�����m+'�m ��E:a�X���
�m�~LxTx���3hd�������uD^�f���r*���/��e�H+S�Q��Gl��6���H�W|�8n�"����vI?�����DZ�07N`!a�OW�/��J>����m�h��py	�9��^��u�L�N��#����W���q����K4�[�� x��p^V�2�.��y��d�P�a.���h�V�����E�@�>>�_���<B���	�EF�g��K��%�]U�]I����b��?�x�8p���2J-��O�;<��I��O��<���I^��<�E�laz��}j��.4��:����������z�sR2�&�D]y��q�+
m��.��.���L�
�,C9�5c�$Ai�B�0$��g@���G��KB,9<-���xW��	�'����j�����)��W��2����B�g���������
)e��$J��:���y��OX��%��K���3n{P�:F-?��y��Q���x����Sh�	�`R"y:����8����=��&�
���#�ey�V}�����?J��|
a!��_pSfj�l���q�^�j�8��V�q��|�gx�������:lk
������EneC}�F��,�z�������c�L�O1w;�5D.\�[�-`Q(g}�lO������"&�w���C��![�()8h�<�t����n�}�����������M��Gpx��Feu��lU��
�����{���

4��S�gH�y���g����|�.��`��K][�|9m�v�����/�����z��������<�k�8DQwbC�M��~�QPN��+�!��c�-�����yX�yJ���x�]U�@X����f]yE�-/��������3j����J�v���x�'�g(��g�Ge6���������p���+��{�M���T
l���(RXW�c��Tn��&\��i�pR�v|����9�V�(�Y�Bt��
�������Y}���'q{I'\�l���aiAE�K�^��y���q�)���S��W���x���?��������������J��*�l�����Z�1�F,1-��}�t[m�6r[Z� )�cOe��u��������ba������
���C�����������<2���AOH��Xe+,�����>E+7P����4���1fX�>}�����,����X�?�n{�"�/����r7��8�+l^G!�eH��I���,~'dK��=�;x��; �������X���g��w�S�����{l��;�������;�uk�3�%�����=�|J���8n��N��1�z�l4�.��0�Ya,j�(K�����OiS��
���F�?�e�(���H����X�{��c���eW���[�R��OzT���@P�D�)��/���2�)�|����[��Q�v��������yfjK!���P��/��<����K������|}�#���(�]#�K���a�,�)�T
��e�y����M��f{9����3/��;g\������������_o�
�h*�^�O�O�q��Y�!e�S����{X������<]�&���q��a�|6����_�������i����^��h�_?|�z{�z�|>|�c�-��n�&��;�2�t������'����dh�i9Y������v�8!�pr3d��@�����Q9����*�
&����i����!F�<���G��������N�����sC�Vb|����% 4�C&�1���u��,�=cI|2���7�g<r7'�^k�<B�>V*��`�J�n��+-�Oj�m@ �
|��&���e�Z�^�$b�&�R� �O�����j������`�),g��0SM�
MG�Z�5���8�*��Gm�,��3l�:��DA����N�/�!�rN���_���v��6�>��@���D~�N����������D����!���-�o�C��]����}S��a��g�!��
V����!"��p��>-�.���?�
94h�����e���{(E���9���'P�U	6�=%T�Q�>@��y�^'�m�Y�-�
�:��X�&�bi��j!<�����6�����Ea�V��.����l��#��p�K�(p��
.
���//��*d�~t���6�p�K
JG(�Y���+sv����[�=L47�%:�-�G�0��G-�\���F�t}�h�����3
�?��L�2��c����z�i�:E�onQ�(HOU�\�8~���w���Z����o��\T�
�W���f}��p�%�p���
b��<�����Q�d����K9�_|%����,:>�4���~s�4'�j�s��pR>�F�w�����P�%PK���	���&��e��C1bl��]����pO�?d��I:im>���)�p����*6�StQ`�F��&!�\q����?@�|�	�E��^/�Z�6�]�����	}R�v�eL��.p*�}NJ�<��9���g��z�1Iw�"�v���g�:�6d{���c��9�����<�g�z����f�.������i�p�J�Wik5I��g��h�1���BW�z��:��_&�0�������<�s��?�;�(@IDAT�z��p�gc��1�9��j�#����B)���Y_�n�'�������B{W���#��Z�2
�����dG�;w�!H$N�7A`:�`�`e��L�6B�m�Z�|4�q�"�k �DQ�����_�Kg�a�[z
����|C�gX�g���i^���5��i�	���U �������\�+?����6eY������h�DH���mUw��]���cDL"��W�@��U��b5�C&��*%����{�5�S,�Q���v�1�
����M��r�hb����,�}+_9�����%��q�rF���0�rG�i3�����v�c��M��-�L\�G�3Na�~�G}���^���<o�S5��gw�Uw`�!�c|�-��o�i���3��!��}������2/�)���.pBA��B���W�\�#�'���bQ�zT�d�c�T_����hH����O�����y�%�-�����hs���-���$�L�P���[��(����UI�we��Y�`��Q�u�zr���?���>�O�YI�6|n�WU�=V��D����s��������[
��C��2�� ��{�L����%e�j�������!���]l�E�"�e�]�����������C��q�����g��}8N��N~N|�k�k��"-�sq2�ep.nH`$���e�"�jR?Z��D�E(a�K�U8y��F��U��v�����$����*��7aNW"��CF�Mx�u����mE;	����i��Zu�������������p�e&M��"|rC���&B�R�����=���lQ���mo���?yp{�mR3e\�z &����d?�Nn�a_��o1QA����"��^>.�����a ���j�2/�����P��"G%�5��$ASA�_>;��xa����(T�3�g�{!���(����i��.m�����Uw�>�'yMA��8�W���\��
�b�v����/�+��m�*�����BZV��`Mq$&��3>���ld�� �>2�"�����:I���T\#�}r
��#�_�)�*b�w��v
-E?�p��&��90������^����[���[�
X��,��3��{,!��<l'!<�H+e
J'WB��e����t��e�M4,�	r�I�QSLb���4��-�Gg6)g��	�D���Wv<{��G�X��
�v�������=mG>R��#����T��z4G��D���b%z��_5�E�l/��#%�]U����N�N����vl�,��������	��JOOQ���@��D�x���sO�Y/8�Yn��kl{�WB�T�2"Y���<��U��-Z(�(�\e�z�����xh�No��<�N�wnhX�0�I���Fh9�,��\�b.�S�!�p��/��=v;@�� ���i�:k�jV��sf�;P����#e6�����f����&��:�+��Vm���=���r��X�{(�\I��Ra�5�U��u�|���=�x���#����.���������������>���D�}���
���)Jm�<_a����s-#?���A����~�����}���o4BP4y����t_�����v1����f(M�������1��r��%>�����8x#��k(��c`���~�&��GA�85`�j"�p�����c��NUt�PV��n����%�P���L�U��{'~��:�������B�
��������77�*��uF�=��/t	���6�-����`������<oq�Z��\z����u�%bb�fAY�4���.J�r�|�x��|�S�����T�e����F��e<0�
g�:�N�0��Y������JsFlc��r�Q�<��w|sX>�]��)�h�3��T��6B1�����v+-�r�8-vp��;�����w���o�s��%PF��it�nc�p��h"��Tp��E�����{���=���~W�[�S8����x���)G�Upf�T7O%�k��U��n
f^^����g1yv��p�
"E�yn��o�<�UO�~�g2�J{Q���U9N���ru�g�]�y�����q��2W�U�n�u$�g=���H�.���p��7O��l�
�SF�)�k�G^0�}�c�n
��B'O�'� ���/�CE2�Zj������m.���Q	2j��8a����3E��r$�`~1,$�������}�2<������w)�[������(d}����@�SS���x��F�������5���(�dd��E������w�	��+�AHu�P%��������P����dl+Z�g~��=����G��l	3e�3�:l6��e�p2�������E��}�m|(������-�a:��%��v3��6�Kx���#n]�f��5/#+<����(�\m�,,��Gx�/����~QW3i_�>=����|z�^�T�����E.�U�������_P��	�8��g\�
M���9��*wU~wv�`o]]c��d+�����=�&N?C�D��M���g��\o1���'HC�[�d��D:�G#���k�l��@���o!��E���TN��&)���1��M+���.�@+y+vkb���d��V�s(�bH�a[�aK��`w�BIS�a�]�m��nj+��c�(X���VT��	�����1=W��]��I���5Xi���K�����[ABy�kbB�/��1���$��.�0e`����dVHs�:PH8�.��K��`��N(u���)\q�P�u
�>M�����`�i���k��b%���A\]�@�� ��^�xH,#<ko``5���V�~����S�w�A��c^��D���g_Q���P*�DrJ����`�,��\7��Pk�Tk�����x����<sgc�F������G;��������;�1����C�@���:�:��N�W�m*���}GK�9��s�[ta��js��-�	Bv�����y�[��fh�b����rz6�]���3������.c��nun{X�v�{������h����_�q�U`b����Q\<+���`�)h��bp�-���-�o6������%3���i�/��V�A94@N�Y10��A���R$�'������:�E���#V>�0�d�y����:�v{�6c�[�:��w��M��/=�15��YPTnY
���$��#VM/j���;�@H#�*����x0�X�������K��y�q���$N����M���a���w�[�&T�G
{6�h�(�\�������sh�6|�>�������v{�l�O{����!�|��:Nf=E�������g�B��s�����6�
��#V]U���ZKBf��� �[�,����a���~�����=Q�i���b�A�����~���V�"����8��O\�~�A�q����/���+W�=�'U�3u�+;}�	�[e�D�K/��/.��ze���.��R�6���E�� �����O�%N/��I>U�YL���Z�?o�{f������������(����s�[�}�M�7�Vy*����������|T��g�Y|W�+�����W�-t��{�����iH�>��}��������?a���c��9���xetT��hK����u��n?�x'b�����c��L��!H	�5���J'�t1�C���t��)�����ipHqdNx���4�g\�*9��
��>��`����00!"�po�ux�#�@��w�Ev��L���t�����0���w:�6�
�Z�Pj�M�m���@����QL
�E����t���'��t`	I��6a�T��|*,�UnxV��<�f����kV��6����B��1S��L��=��yj�
|�N��G�
L���������0+�@��>xpb-�������d��F�q����|�Z�E;!��a;T�s��U��O���+�����v�&���!�>���a@��X3�9�)\��iX�����OQ��������R��a�s������z~�L�i�,�������L��������/�t"���8��������D�b�i����������T� ��\��n !	�g/�oITF��%-����S�q@�s���H��z�0J���cB�,'�g�)f���v�#	K���	W�g.�����tz!4s�U��)mS3^X��t������M7Z��j��y�X��
=��=V�i�b.�#Z:�<=��:
���~
�_� �����������[�!��<,�����UR�5�X���G��
~�[����S���?6���u��DR��|2�X?�_
�G��O���|�uB�H���0��!=��V��	d��������o��1�RG�5��jy�ge��u������O����[����@�9��3p��]�"�|���W�D[���He�J�������S�a�	���������o��w�������'��!��}��"��g�sU�j���#a0����vs�*�u��_Zi�=+������=g�~������;W�Y��-%zRB��y�3�b[��	���t7����k���E�Yq(�����4�>�����"O�2��|7�t&Q�^�E��|wJ>�F�g\�W���d�p�UX��a	�Hy1w���g�Fp���/aTA����1B�5��V-6�#�&���
��ilOO�YiV��3biZv1n����7Y!�u+{���O���PE�1��4~|�7�����2����c����IB�z�Z'�vD.�E��Jg����Y4n�e�&��xL`�.����1�m�C1�)�"�t	�O��w�w���K�o������J�F�_��)y\����_���\�������r���b� �u���>+VF�G�u�"������� �1D�i��U�`��t�"����Q�k�����1R���9���W�z�E>+��5����w����YG�����2s����v�����/�v�=�t��b�vn;�2�y�����D[g,�(�EC�K���7*J��'������i��'>�K�=�|9.��c��1{����>�"2G�K�/H��n�]����*��$���K�~N-;�����&����S�V������X�fT�o�k9����j���VE$�Oj%���6�Sp�������m�m}�����l���q������KW%�?���8j��]<������/�o��k/�x~Z���V���|$������<�������*bc��R��p� #���k�����D���k���z��6�.x��9��$b\�i.F|�8=�M"X��o2VB*��1�ax�j��R�L�����[,�L6��:C_���}���e�
�ob��&KA������n�&O�t{�v��V���R�q ���$<x�0GX�zf�1�M�+sB��B��������>�	Sw#����p5�W�,���)�����If�
?�,I�]aj�b��Y��{:��z�d�
_&���EKP-��Y�y��������1UI�G`+��%&���T!���0^b����v��=s�J����8��w��
u��O�����v����U�B���la��	�[�:0��R��y�ca�������L�w�����0]���1>	���B�$�a'�.��t9�)C���<u�=�N��h ��h����2z�wD���;��&������������ �1�>��(��Y�����1L�	>g�[�����^k+�]���n���:q�;SY�y���K��rn/�.~�1���yT��j1��h���<�4��m���Z;����gr�(G|�B�����(+Y��x�����I�_����<o�)�a=V��9n=m�l#n�����l��k���<(��sd�Xl%�E%M��R����A42��r��7�~����E�����,��6S��k����6��^����A�$� ��k�m[��aS?��)���_z��+�T����;A�����lK�E1$�!������Y�����5fs����s��+�Cw��
?���{�V��U�9gh"�:D��O�7����������'[�����:�%��o������h��i�A���@�`���|u�c a�����
����g8a[Km��"����8Hz.3�q����z 9�.�z��bM�g�����%�!�o+��\��t%��i�Z���4'QR�+������E��2D"e�h�*d��\@�m��G^y��q��pz�]��c��]z�#��f���c�������>�^)��o�g�e��h�r��1�%���U� ������K=y�`t��&����Q���=�{��4��������\q��8�3�����
������f�k���e���Z�`Y���K�%��g@��k�-n��<�KEj�#=�b�>��(D�W��M�I�4#����u��DY�0��� c
'��y��j����V�����H���P9�����	n��
�+��xX�`J\���N)5��2�x����
3���Kj�6}�x�,����J�Mc����'��Vv����S
#h�>\��������J�%v]���jO��6�"�6�B\�W�����.�@�th!�7�% ���O�|G]���/o���z�����<���}�1������o�Y|��(����<���?������;�E	lmm_���2�cE�����o���P��W��}�vq������V���X�U\5����[����v���>:X9�8����]�/-{$V���.6tb{����Q�K�(+��"
XcDU �%M�,2��]�#�<����P��0T������1���..
%qV��y�����r�I:��:��^]����������g� k�������v�b�B�,��Z��$�	��q\~�N���������&K�D�T���u~������.�k"J��B&`����G��b�6X���������0��)?��Se-ia�$���Nf}�sR�{�����?���S1W���f~�?b7TM4�`:����4��g/��X���#��Z���e��:H=����{���1@eD{��^'wq���G�1����$�17����V����{�1`=�1w��Ms�X</���	s�-k6&���G��d����n������*4��cQPr���S��?�}�o�
����g(*��BReg���8G����[���e����Oh��V)@�����T��;���]��x $����o��(�s�Ww�&7�9�w��B�V�O���������~c���)FJ������O�<�B�v�7X��t,����J#-1�V�ab�n���<	�<M�K���	���r7���Rx����M$R-�r�s�I��Fz��rn��r�>)B5�w��6H����%�-����wk!�y�L#��H�/������~�rO�.�O��^�>p����2 WQ����[�q�UL*0�9�M5`�������wW�o{��i��b
��f�L�[��]@l�
�J'��)WZ����*���7�+�QI����D�>D!s��L�0�	�<I��d/��Q	Zj��/����:�c|p�h���>[S~_Q:A]p���7���q����m��.f����6�=�"��+`��ox��N�K�TY\���Fb'���:N��8��d�p��ei_����,�0]>�:��].�z�na�YqMV�^��o#n�����#l�M���l��R����l�{����U;e�9���j]���x�����_��������{���;��e��*5��N'g�q�KLp���B"h�c�"��MV8A���Y=�O�����1n%g&�9�'�E����d�}��&�F:��x�UV���1Q�
K��+������QQ?Q��e��+kO��a���q��Q�z���Q�^�8�����`�wX��jq�Q�@n�%a����
�0�9�r>�����l���*,:�)����
p���e�����;�u��d�02a0������zl��VS���pe�����o2���>/�U��WmS�#h�K�������!�MX�z7xV�A��
��48�ouy��]�W�?`�
^��L�>�%q�wr�8��1�9O{�#���8���+eZ&~����<�������F��f��c��/�2�������j�R�Ow��@��
CK8y������Bw�4��� �q�l��r�e�'M�.uS��h6�Ex�q���y.����b ��K���Y|��_.���ow_�[|�[o?�S?U�������X~����_��r����7������W_+������/�R�r���_+~��~;�Q~4�~Y�����[�{��7��C����r�	M��=.��&�z� �L��(`�()0F�_F��`r�g�bM��k�����>���)Cp $y�
"��>U������ML/��^]�8�3�z
~!��i��D�a�)[�����7���fF�e�
�=U�%�],o_a��A�������5I�3�M.�XF.�.�^]����Z\'�N���0a�)\-vC������}��;e�?Y���+�tZi���n�����#TJ0f��T+h)��Q>�2M4���R=�qD����l_M�����M]����e�����a�$����H=��soC8�-�����}������"3�����l��@�Hh���N8o����������vq��!d����2���5{�Utx�Kz<q�\����4�}XqU�����T���eNx�����^���%*n����Y�`]��gs�\�`���.������~>�?"����f���Kc�J���������uW;�����`{��S�81�;�T���%�dE0Q���T�	�"�t��t�X�@8�b�����F�~ztbR�1t�I�	+�W���SWDRuNDR����aAk�1|���]��L
��Q�N���m�<����7���)4S�C&)
a#�H/��_z�U����X~{��0>E�Q�Z}X|4�,^[���A��8x�UG�aX���
!��K��2��LX�$H�~��F:�%c�!�k��p�o��'.Ig��K��e�r,���H!�[�)J|�\_��2gQPfw����!��YL���
�-�4�t�P��r1��f���E���T���|�������F��-��mI��#
�����p+�h|�bK����x�x-�U�R������t���58Bd�U����hC���������i{����/��;m�w��4
�a�i�7��m����1%�~>�h�q���q���9������p��c�ja��@h�i��j�@�������S���/oI1�s��w��K���0�<�m7���I�L}�e��%�����k�NN�V�
m�s���Y�(�%z�0�|g�4�*������>[�����\���m����]��r+A06�|p;���O�5(3�rQ^p��~m43t��n��/�4\���}�@�W��3^�V</�����O���_}�����^��a|hiv=)��U*�-�x�y�l*���}�W�W	�C��}��

w.�
�u��J&�@R*�84f�C�U�dE�����>�4�+��>��r�O9�.r7V����_��n~��E���!�*/�����m��u��P
�j\x�;������b�2�`jL�)|Rt�/�0t-�Jq��|h\�h�[����������04�>�>I_������A�����u��3l��8p�l���aq��l4�^:j?�kQ�K����]�����P�������q���|h���o�C�&��)�4�^��s��g��r����
-o@���HY������{�a�{�66o�6	e��N��@�����i\8������9���������>����h�R3�Js�/��3��:���8_?f|A���
>z��&l���I��6��s�8�1yr�m�����zQg��M�k��%.��M�{^��� ��O]�E0������
g%K�
�����������P����J�?��?.�����{���>d)5���K�
(����Mg��u��i���t��V[ui44�a�q��r�V�}�c6��GH���<d�G>s�@���7�k�)W�8	�����DR�`
1���R���o����p�NB*3!��O��6�?�`m4�
�<]>���V"���e8F(b�n#��et��&(Kd3�3Za���g=�SA��8�;�w��U��*v��
��v'�ta���D�[���e�yh���n|\<`��8d�,'�*�5���K�d[{l��!��/�W��1�q�L	UR�����=�u)".��J�!����h.��*-�������9�B0?���x�"Dn�hb��u���R��X�*T#���t����[&����?��e��F�Z�5���'������}u�i�;+�����N �L6�=�(�:hy�*-�r�1G7e�jp
Oh?Z�>!'����	%�L�y*�������V>����?��>�r<Y�kS{�p,��r�w���3n�8�������"m�i�a�+y}Z���~X|p�+��T^���#�����-#��c��'���������
QL)�C;�A����a,�����VI$�NU�	�@,%>��}V��w�r�!�q[���0@}xU����w{l����e&������Gii�A�i�t"/a��
��|���|H<�a�+��� h���108��F�dD���HA^���kS���s�AX�L
�HG|	����ej�^q��,#V�����������K�* �!@�oi��FYv�v����� ,�����k�Si�����1���8� �!O��W���MqE�Vd����O�OH���������"�#h��wpA�����I���x'3��L���/�o���_�� Q�X)��(��\�"�f�f �h)%�b�:�zJqL?E�:�����)�)��f���8����/��+g�5F��3�*(��(Y���lMq���[�E�����&�o)}q���8����Ar+�8W(��K�5�����*F��h����yi�o{����h�
n�t\��p���-�������������]A_��i�� DR��D��u�����cT����"�
m��������h�m�>D��ru;�='�y��=ZC�����_\-�3����y:�$�[��?"@�F�s����3�q�cSGU�
y������#-�����33T�������nWu`�B�A[�����9���8��d�Z��c��N�{�`���y�G�a�s�>"�'��������g�>)~���bj���Q�h�Y��T:P������6KQq�0���02�9�"#p��6�����!�mK��+��[����]H�����N�;�%�K�����M�i���2�~e�,i���������.0��"��!�G�t����P%�4s��{$���P_�~0FmG{W��>�w����(�`����[�t���E�?~~�TP�����N���\�!ud���v���#*`��\��F�����n����?"�[�=*�y�_��wx��M50Vp'��nE���eS!��ZC�*�_~b���;�9��e���f��d�hg#V�z^�f�Ju0���
�z������l�c�L�H�U����R����4T��^�X�q%N)����r���Y�T^�L�v�V	���Q����a���|�'�q�E�-��ve����������sy"��Xgo��_�
��!��1�� R�](������zT�,a���y���E���B�(�G*/�H]���GM,sr]��5��!Fv�}�,[w���_c���@W3}�;����^}���~�����V9eP�w������+\������)��6�������n�T`�q�/�U���d�s;�cV�l�,kG��u���	�.��PL.y��<��A�����_�+�)<����W&�H��,�[�cA\B,$SW���g'��T~���`���a5{C���x�.x<��&oC*�a�E�g��}7I�*�}��	�1Q�l0w{!\��D@�V0�	�\�T��xK
�����Z8��qf�h~3 �"6Q$�NP����K0 �� �C������
�������F1/3�> �]��0G��P4d��za�
�.-wXb/�O5�[l�!#���2/
���;a�SO;
�%e�oU����>LW�	Y�I�����w5{�'
�����m���|�v�N���l����4�c�}i&����c`�Im3f����{�m�r�s8�I���ky�;����8�94��.����x#������4������n�����U����+9�	�_�����
h�#,@�4k0�47�:I������"H
�*��g�J�[��lv��*����0yH�8=�i����s�sRR��

DB�fcq�Y���NWC}��Rhd�Vp���^�����O8�acW6��B��9(k(t���b�.`��"$`0h<SZ����v��o��w���db�V4��m�-y��z���O��i�Gq7�������!6\�e����=�C��"��
��9b-�Y~W���<���K��� �
-`��Sm,Y��d)q�"����5Qqg��=�w������oe�?
_��&��Z�&�`Xg�E�W_��ck�(�i�m�|���n)�����7l�|��6��uM��������MX��)�[��>�������
�S���uR���)a�q�����J�v56�WxG���
�(�v��C��E�s�����eq���_m����<��"	�Q	�2�l��aWo*'��l�.�
E��E�#�X7�����H��u���I���d���W�,#LN+�&���������Nc.�<��16��G��X�����'�O�����I�I�4��������m�x�^c�>z��m�`!������o���_J�Gh��?bd��4G���J!�0�f?sP��0�#��3%/�v��}�<��W�JX���liLO~��Z=�+�V0�x�z=��1����g:�='���80�S�m����R�s�x��&E�c���H�l8����Y����&�l�W��*��V�q�F��8�f0\G��~�4�pMu��7yk�t0���l�T'����vD��J+k#]������i����F9Y���+��0b�����k[�/0����8����\'�rKDp�;�T!1O������m�]�
(�2��E�5��7���
|��x�TK���	���<�0�������i�����x^�O��F���Z����:�
��w��j/P?�/�>���s���N��V��B_�_c����Kw�jQ=�����U��d��h��5=|xP�)�\�tt��~�;(W=�q�/(�����1��aEk�.
�������VsN�cD��V��_���=8v9����s�'��^-�Jk�>���kG(�90�I���k'(��r%h+�L��$0IA&��9D������,�WdH��`qv6Y���Ay��&�0�H��o�Xx�a
�S&N9-�����+��]�s%!D�3�����V5C�b������u������X�X�\�Tf"qw?��Y�KR�!��������\����KD���Sp��77�%#���R�"�d;A}�5�dV�pZ��X75����
�w�2
�I��&<�>3�y���!��A>Ule�T��/O
N���
��_���p_��s��Wv��1(��a���0��=&���4F?�)��'�����v����S������������0W9�{�`�=k���
���-����N9�4?��A��m�]�>�!��l�^��r�C���mh���c��t2
M�si�.��H@��
���_���hj���9��QX$+�6����5:W���2�6���,�H�GN�U���Q�*��e�)E
���<�S�\wW��
C
h�*���#���!K�8��Ec�m���|����[�,:m��bdD�������{,�9&�.|�6J�As
�+���N�����pn��������sq)/u�4���r<"��3�%M	%~���/����N�u'J����8Q�r0#<	����;�{=�����B��t�t�o�P�B
?6���G��
6���w�4iO�Gt�w����U*��jy+g���'���t�H��Be�.�iF_����V��aj�\i%��&�������,@!S�
��)Gc>�[����6K����������C)��I��s����y����}��VX�)�-\��c�sD��N�,��c��"��O6K�T�_��tNm����e~m3%��o�0V���K�G����Sq �6�g���<���q���o?q��q,=�'zT���]a��f��x����7At��G�:�V�Z�pY����1�U�m���+����6yP�|W�+
tr�tL"m�-R���-�����f��^If�X�!��=�#���+1:V�����*���i�,�*q��&�
��[�C��,���]������b�x��]�h	e�	!����C�k"xuiR��&�*y3n�@=V�����ZG���2�&�Bn�>��4�(�z���B^�;N���`��nB�n����^��.�[�p�bG�O�/�j�-�Q���y��1���qk�T#|����k�a��lF�]�)�[�Erg���D9�(��zF��B��,���k��9T%���7kp6j(���5�"�����f���CJ��5x������c`���;�&V��-5����>~�Iz�����a�#oF�3�*��o�_~����g�]{\c�����?����Wk���7��i9����<��g�g����Kb=��*Pn�����s�T<�p��B���'�=��-�\�4`�Iv>���/o���<��k��\�PP��mb0��P�e�!�29!��"�idt�������
��e 3@�d���J8W�81��'1���*�2�(�*����l�Y�c_����P��^-�Q�(gZ�>��p��,3��
U�[`2�hN�E����H'(a� ��yX����S����k"��*��������b�w�7�J�3'��2��D=�%H�z����*tz�������M�4N���9��O$Dz�A�N&�9�Xpk�c@���Y�'�a���s�vbe���D�|��q6����CXrA�I�A�lo�%�V���5����`�*�R���-'~�fT��������	F�n��${���0U`��[�u)@���0����f���*{����9���o�uUB07����0��@y�I�����.���}}��\"�O���8v{��C,7Z(1T3I�t��p���&1�sAN1�I�%cU/S���&����%}�c�����F����<�+��������{��6]������
�<�2��y�<����<����1?�0�w��$;��=J�[�\B�r��*����vk)|Z|�z�H�C%�r
\��[��3�*0MVE�����D�Yd�����!�Q�?"^���N���V8���0e��[��0-���P��8�����B����!J���[���%�i�u`�M������'�F����.��:��U�
�M�l�O�)���:����eGY��n�*@���^���R&��E;y���x���flS�����'�b���F�zhW����2�N���x���r^%������w�Ga�m3��b�chx~�.A��*e�B�lK��+�T���Z�([������:;�����:=Vl�_���"]���jPJ����!��-�������
��T��v@t�H�R� F��q+VVJS��g[W�����q�Rn���S�p����QS���s�� �9��������c�U������7���-�,����M�*"U����0��\=���RO�v&;�@��;����Yq\-g��6+���4O���c�:s����m�0��2c����e���<����v�e��8�#n��&�U�x�#T��#����e<oA_�����x�����*��g;�{+����[_
����>�^�������3�(��[cK��o�XW��8����e��.���-�T�(��$�i�>��m��Q����S�YLJ�m����M�����~����5�A
{�o�{�O�C�eR�����S��p��h���K?_Hh�C�WSi�%������(cF�-1��I���G�c�@�=�������ee�����Q@��|��=�;[�``y~E��]������;�t��y@IDAT�=���mH�M�VN%����X���MVL
g�	������]1��d"��H`:o��M������%��N������H�o�ll69�o*�V��7�7gu7�a���c+�N�g��?,����Z��z*�~�����~;��{��w��I�M�X|��?Zt ��q���|;�nR��3?�3�)��o��������H���2���w�
���-�Z0P�d���.��	���A*�<A4�K���|O��D�L:�g,q2N
�\	���2d�eB���}������ �G+1�9�K�C9X��������A��c):�r�T�W��_&�A�&I��2Q��i����Us,#�%p5�������C	����P,$��D�$�*���+h�����:�r�I�)�27�0�F�a�8d�Y!������X���pL[c��h���5�
.�g�q�rz6��t��L[���K���������0hz�R
�(�E���L��h1�U��oo�<o��@����S�^c���l2�����N�4����v��P�����6�g��;S�!��u%��R�^�[]�~k��/�8�?6�17�6�i��9v��E���I[��
b���7������O{����x�����c]"4��
����(�J9���H�c�tL�r��x�.M3l.�M�,�	���7hC	C
�0'V���4��#M�&�<&�v"��I����+E��4�
����'NRd+.N�{�3�+a��L@�
������^i���RBxw��,nww�s$9��/��Rj�P$v(��(u��Mf���0)����������� ���f�f��?�X������bP"�F��B~��C���n	!~�L��6mB,Y|�w�EC8-���m������`��J#�a���,�u����L���M�Gn�g&n������+�mXO���>Y�"�����V�#���F�^R)��tw*��_���G�]]�C"����*-�i�RF�,��s
����|�;V������y�qAz���nq��wI���3�E;6�p�����h[S(H3M`d�N�� fLrkL������[�}2d�t�������(�VP\�RI���]W~q�x{��"v�[*@=������I6n�B��t�m�m��*���q\.�"�Si�^������r��
�B�n��r�*j�!�^�~&Xj�n<-�CPP�`�B~q�2q��(�%pX�����q�U([���KDb����9~�p�q�?�y��Me���~3`��3U��
������J��pc��S�4��mO�A��i���udi���m����
2W(I�b�7G��2q���9w��H��YW
�����I�!��n��X�`�����>)��&��L����/����(�wE��x'l�
���JF�*�S1��v��l{�R�$�(�N��#[���TGuov���x��z	�M%���
:F��I����i]�����	��&*��t��;+��S����9��c�G0f]����j>��������`?�:��R�\���m�d�)�6m���~7K#�]e�e�C���A��&�;3�#�o^?=��9id�g���J�TB0�~��S���O�_f�������6F�K�70��N�4�������j���>�Fr#1x�8uT��L���p'�1�+��A4�Q����1+9�������b�+�fdy���)J��b�k�h������������^<w^�+E�������zq���W��F��������|�v���9�.�_��W!+�F����W����X��C�;����nw��ceXFv��/���q&�����.����>/^5�c=��&�U&��hX�)b����`1�:�0��d���y��`B�>�BGb��N6�������0O�A��Pfg�$�f�7��U���3��1XZ$p�U���V�\{�>K�� �I9�_�K�J�3�
�En����@2uN�`BJ�}��I����b��c������x!�7��8l��Lr2<.�-��P`$401���$�9�>e+�u������u�TJAf$�
�_��B�|�Rf�N�Yf-�sVS������G�wK��N��x
�����B�[��17�%>��Z-��yb�(5au�-��EEz���:���A�������5L8N�%�������@�����F�l@�B��J_J���N1��U��<[YhqUJ'��?��������w].���m\�K��s1q��y^���n���k�C����
�m��y�"��6k�`D�����*1��Px=��Gl�e��A��B�}V�}�h+���)���uI�A7�O��������qvP|QT����U����*t�}
���s$M~i�`�O���D��|9[a4���\��\N��A��-Ic�q��v�.&����H�0ac�^2!�� ,�u�����7b'�0g�L���y*��m��������D�	k�+r1����eg����������
k_�[���/�"�����/>����O~�A���z:%}�B��s�+v�&	�yF�m��O���@E����q��L�'����p�+�M�������Ta�
/����r_�Hy�S�������:�"y�K���Q���L�p�S���������%x(�el����ZEFI
�h){\F�"����l��E�%�N<#u�z�n���iFiSF�%����m����������Cj����:���1r�"/��{��4��nc(��6\���^����dwu�&��'C����Y+�X����Jx����*�xg��j��N�A��d��Ufy�]�-���
��o�8�����u�B;=�i�:��b|�����*�\���G�D��dL�(��#P�
c���V������)��Y�7L��yg�[�������[��Rs}�=�O9>N����*(h�r��(�Xl��D��&H��f���!F
����4� ���[�!<��w��
Z�w{� {,A�c?e�Y������Fmy#i
 ���"[p�p�?���\}�c��I��fk[e�P&�L�`���b[�ag�����Ii�$U}��<��4��m�@����P9�An�U���Og^�k�-l�s�G

�O��Nz��-&.?S7�m��@��)����q�:��/��K����G�)&x�O%E� ���a���2����N[����^������w��K6���6R�q�������E�F��f��
n��v��#��|($Pl{-�����Gz�Ot�D~��)_E�=���7��w��T����kz�����n<����}5�5n*=��	����6���\8��o����tn�$�ek��?����W����(N���Ek��x>��;�Q1�j�������o����<�Mc@��x\y��O�����E���0V;U������N�n��w�S�����X����W�Z�����'���O��y�Vcs��pe\�*����G��Vl�d����b��vM��A��8X�QsA8:(�f��H�Z�1���}�2Q�16�
�g�
��N��}�s9�x�������/%7�D:!�?x.?
���q�>�����QRX����T�����wr��{R�;�*��]����S�[����'�����?{o+[�%f����w��o��2����v5�i[�1t!����-$[�h	~�Q��BF��1	�a���%Zm�����j���*WwUueeVN��;F�
�o��#N�87��o�Wo���q���^k��'.�|4�^�����EYh
vh�#�46�B���*�V
�@{���10'
-�}l?��>�&<ug-��%����PjJ�#,�5�^�M<1���'�L*W��,ns	��g���E����T��(���9t�N��}��m���:d��9
qk������u�9a������ic���T�{��;^gB��������>����l��R�4tjI�8��mi����OK��x�|���<�xrNs^x�w��@���L�&dO=3"���P^*���/iVo~�
����-���&��e��
�V��e���*p�@��`>�?	+�&��<b�o��^���}���R��Q�	�z�� #�F�y�%��B9�B�$��+q��+��X7�G48IpDBgi>���V"�"�l�9H]���,�q2n�|\��DC�0�j��.
�i_�T������
�:�)�,�`���ZqR��7�[\T�N��.�T�mV�^cE:���(���A��,3��$��,�Jm0$�7�?�4��I+�5n&����Y��|�[����a���8*W�"����q��������c����C0�.�N�����`�&;�\�:�d��oTv���o����c�q�!|�����
m���c�^�Ql�q�G&z�a���}
������N���!-�����!�<D�ce�E�������Y%��������v�����m�1sWH�n�S��#�`;L:E�5���,����,wl8�(1	{��e1e+@��7�&����Bc�+��C;��cvZ�=�|R�v�I�`��E�������}��f�C�u:����D�t�����UMSW�Kw�+DY��'g�Ed&���a��	Zw\e9��#0F�+����G�#e�;������K��$
^C|��5\$1ra	�����b�-p<^�F��\�=���}�;���:��Q.%���:��"O��*}{��n��V���H�6q�zQ�hgt����#�)�YM�g���/H���y��)���Ag|b�����S:��l�@���t���l��MNM;Z�����m��x4_�|.�s�s�a��G"����WDJ�����d�,5��8���8�e�����y7O
�9P�5t���?fb�p���O�[|H:B��>%S5��gU��t�l�~&�q�'J����XQ��d*��j�����L:1K��ev��;^�����k���������,.�&}�2f�ay��
���$�A��$�^�]�w]�2�6����]�Q)<d]��[b��~y��r�G�zjE9��n?�F�\*N?.:��x�~��}\vk����S�|�zX
�
���������8������
�D�����S�m���T�t�/X�[������t2����m�	����2�+�p��.�q\�,x��=��F	E��z�2�)Y�F	�������X��%x����
cu����I!�H���)`NR2��=�,��*�Q�LAU�m/�v��}�WV�o���I��m���TT����(��e�]�Zn��_�Q#�B_J��F��4�������^v��w��Q����m�?�������7����������X�|��r����a�X1IC}�L2m}��
�\H��*gW�������3n�l�*���R�U�+�]
]�(�cyW�y,6�������<|��*qG�G�l�Q?A�v��1p�Y�&C�����D
�
����f��G�A�6�2�rdC��gN��
T��b��[\B���D��~%��E��W�O
*�^|������S���4���f��Bl.�����'&��K����������W4�����E�)��%k^a���u�ea��}�o"${TR���4��&e_�@�S�����Z���]�������������xP��pX���<�0 �x�c�]g���u���
:����Tj�&
�~����1|?=�#x����w������Q?��"���G�a\&lH�� ���?G���Y���h�S�_����'���m�]����^B��0i���U�|��Y��C����$\`(k@gL���W`����(�<����>)�������1��r��5�t���^��Rl����ZCg:��=��h���bg�=�`�ZxW)�7w��O��a���1|���*0#�����lekbQ�L[)��#ot�8�%b�,bX�����7�� ���n�'8�O���p����Wu^@j�0��0���-��c|�����5����S�ck�:5�;R���2.�L�: 'V�;�������ZDl{>��E�ct�
��	1����-��M�
�uN�;��q�m��p,���{hu����0�.��2�>�8���n��*fK���Uo��c�6��?�r��:2���nqd����:/�gj��z��t���������v|�B_���h��a�Y�wB\Z����8���;�{�a����E���bg��]8���������_��+\4��Nz{���e���������S�ML����(���M���������u,p�]�������
�	:�n�$�lu��cg���8��?�����`�=��S��Z/]0S{�e�\�5���7���oa#�s �@M���8P��k���aN�+�>b������6O����GE��k�"�4F<Z�~C�����Qq���n�YC�G�O��D;u
>%��	>{�+N����#&�NY���O�U��N�(��qoN���Uu"�_S�y������&��Hy	��$�i�<���}��uA��o��A��#�Y�S�Adk��i�n^E���
���|B�,4]1@/Z�7���������T^�
o�]���r	i{Ku
}x�E$F���4�&��#����x�����Nf�P��a��A���3{���S�G�������8��O����`��&���x���oA��>�(qqdO�����yBp��J�������_q��r��P��-�%�t���L��k�Jm�)o���j���L/�%]�E�����C��][-�o|X~�Y��iM�,�Q�k�������ZE��	�� ��K^�q���/o���
y0����q��/��q�^{���k(&��������7�jLBe�=��{y1 �x�.���22�,J�lS������LT(�Q��!Q�p''}�Z`��@^��X��3�=��#����i�#��&s&b|d�6y�4��p[#H���l��Jp�������B����be�syOCv�6��AR)KYB2�EN�X�S�{��A&�b	Xz�+�:,���f.��+�5�����5���M]�4���tTR�T�����j�U�g��~�Q������v�����!�C�����,�w����^����
��`
���Z0*`�i�;���U���8 ��j5,�%w����p���B��m
�dV�9`8�������j�d;�r��#�/]dD�M+������\����&7�{�~U��D���6���E�g�.>{kQ�=�����v�,'�6��+��Z���;t���|�8�L�=���)<��F�i����z�z��+��`�z�v�l��w
���e][��v�>�.b.�+a	�i����g�a7�IM��YB����`�qi<zz�F;�&�{w%D�^y�T�M�d!l0����4��X�����=�$�2e��2��%�Ki�w����Uvk�ju��x��3���0�f o
Ao��SJSg�7��S�%9)����'�W;"wo�`�%��*e#z���(������C���{7��8;��.jH*@�G��[��<�,&��c\����Vf�}ifS;R�����0������hk\E��!;���)��\����_G�����h����������.��_���D&�zt0��#U
C9*L�f��L ���1*���8-M'L6��Vx��wRH���`�{3�;�~�leu�3v���1m�P�y�D�;�p��F�+}<�����,����uYJ��s�l�l�n#P�c���	�����c>=
e�0�o�;>�G��2�x?��s7�G ��y1��i�O�q�����$���P<h5_hc�k�+��q��xA�d�a�&q�H7���	�<��D&��<C�����W�zz�R�����vN�+�z_��*�4��X�$-��3���a��\z ����V����m�����,���7�!J8��}�\42�������t#h�����5�y_��f�m�'N���O3�)��>�WY\�x�1l_�'��<X�v4���!���[��������>���-���}R�jm`H~y8z?hL�]���y�tx��$�+W�6I��4�"���-����8��\���t�'z��Y�����b��h������%�9��\�^��`��L�c����-y+�C��=HTzg����E�
��~�s�:}{xv
�N&N�h��z\eg�	�������^��;��<�G`�F���M�o�%�nq��:</��N����<���x������7�P��!7��O��}&�n%q��e0�){�Ui+������/��_g��������1�:b��}�q���Xa1�pU�:,<B_�n��c�������r����,"�������&��rwynm�f'+���v��+�;��C�u��_�����|�4fqf�?x?v�lJ�.D=]����z�q����6�<,~|�1 ��I{�x�E'�wJ�K�M���|��L���|�	Y�������I|��%._���b�I���>���Q�#�����8�#���6�>Pm��{�uZe������������G~�=����@��s���p:����������1�����nm�=x��������jA�3���0�K��;����4�r�N�������������6-�!��,c5������4,��wKM6���z��z����N��S/h
V������:������!y�-6�5�},�:�,X������V�:�p:�
4�4�y8�W�57�����-����[x*��=��}"��8����5���^+�S��>/��p�(|��~3*��r��G�m��_)�~���#���|�����c��q�����w��hu����d�8~�����_\�����\��wo����Q���|��;Z�
��n��h���LT�����8��I��CQQ�%6�O�HF<�X%�8���k�de}a< n���#�)�
���.����'(�^�K`�>���s��gY��\e����W���<�<E=RhJ����t2��JV��l-+������II������d�e<�`�hb�A�|`����9���&�v8`���b�R+��R��9��
c\y3�#�?+�s�qx��5&���B�$)��P�c��#�0YOTP�c�%�mL������g]�W�����%�����-]^��h�� 'E�����R�ac&K���s�\X�����(���
G�!N����`n2�y���}&��P/�"U&���5��������V
d}��_��kz]%����d��z���L�J�����W>f���1������t�i�~@�A(��`�<6=fbn,�n���)C#Ra��5��g�G/�f��0�|�o�����S�@D��}�3qP~6�8)dp6�FX�<*��H���]�_�&4�n����8�u��;X�=�I�.2JT��Ut����������&:A"lC�� t�����]�Q�y�r}"oW�'�@�Y�qFna!���d�����'���Q��h
���E���=t a'��E�^�Z��{�����!�t�[�u���+/e^�M\D��.�4��I�j�J{�H�$��W����G��XG'��c����X����Ju�<;�����W���7�8�qRO�BD��~$������D��U��}2����Q��^�_u��l�~�w%�4�a`��*�
wL_�w�;���dh��Lo]��O������5��I,3��!a���m���Y
1�"^��1����9��/��q�_�%`����niq�_d�c��`2w�KT�b����Kq�/��E�z���_��|�eR���>�7�o�����V�h������1��S����4����(�b�M��'�F�]�\����D��+x,�A��U/	O:��=d"�_�p��)�~��H\OO����=]�6�y��c�*����yN�+!����2������M�z�h�XZ�^�N������i�kD;C�
����������G���kn�F���v�������xk=���D������b�&h��x������|3���p�����6�~�_X�w��|��L��BkaG0�xd�����N�/t��cN�$c�^E}�)r��.�4�Df�?3}L�����C���A_�r���� Z��m���/]�0jx���{��-�N�������BP��6��l�f��#&�t�t�j�)���c?��bw��Y0�N;������~����h�s�}f���+��S�������:&�r���E���|�^��_-����y�G���Y�W;�/���'����Y��^����|����~�7�y���r�I*P�{������R�@b�r"��T'`��$�]��a,����?+2�o�_M�2R�T�xi?QD�Wib��l�����F�f�Y���l�p�T�_&�O����~RZ$	f(D�Q������i]�1qJ������0�2�4���j����|������]|h0���52� #�S�Z�C���9NDQ�0�	P��BE���U����q�Ev
��h�m��/�7������g�)A�A���#.t�JJG����5�45�$
O%�S~)�z�<�k��R��h��*��>�t�si%ck ���K����.&�Y���"�X��P��2�I'h����1�'��]�UA����U|_=>�r��4����SR�;B�<ex�X��N����dz��������D�J��*Y����L��9�����F�H���9ra*���T�9P,(�l5�~��A����<��S�3jg%2�w�U�]v�����r�E5�!�W�r�i�E&��[49�!?C,���,?�"!���*0r������-
���<bu��/�NBO��A�
�.�����]V-�p��hx��)�����n�j|t:�92�5�a������Y'�:�����t�g]��DXT�|�1��K�7pP�*�����;�m�kh����/�o�Y����=p�v��$43��M2���J�����c���c~]i���)M�&�����0�6YkCQw��'�,��;��c���#����Ph�h E������"&nJ�j�Y���
���X��j�R��2V���:>������:��
�Y'k��x^D/�\��q�k���o���
C�P���k�}:9pu"�^s3.��~~��=�GnI��<r6��}&+~(��X��N�,���wC�{^.:z*�s��>c�������c����w�������?g�0�uG��:���Zm�]$["��W�1�<�@D-���q^�3n��'��0���<�G��&TW��|������9%��{�I��+=9F�S^�<�g	���W�[�I��REt0���]=��J���P&�Ka��8I$f&����$���I-����p�F���f����R�s��Z����������a��-`�-��������r7���+/�=U�4%Y3��XZ���DO�_�����F^Ql�o����G;��d���3�f�.PVEZ�4�68�od��{E�>�����	������bt6��e��W���M�~9�EAV��l}}&hn���Cwr1�A'���z?x�/v�^��Z|��P}l_�p'R�3l��+�[a�i������vQo ;�S����9�J�Sp����^)���?��>�Gn��0#����jB'����^�z�|	���rr���w�����W�-��{b|�y���onr^�v~}�~��[|�d������)6��������-�}�6��O���;y?��A�2�d�'��QB:CLT�g6�0X���<�8�U��H���<* ������,���+9�U�z�]��tT������7���G>2�������W,)J���m�,@*��M�F�)G��I�8�*�cF&
y1/�b��F��{lF����Kn0�ew�g���}�"p�=�$����j�q�&���9Xo�P-���Y3 O�����S���
�K���,���W��S�j:W3yx��5�A����<����w�Y��>�1t��1������(�Z���'���N��;���O��OaN?���1?�
��}�^L��u��n�s������A9����Pe`W��)�U��'m�-����d4��$%���
ac/"m�1^��4<L��b���+c��@8B�*`C'�����M��u0<D\�#����DH��B2�4�)�D����^���alfp��]���@�����4>��0����2<u��x%����&g[�OS�~B��|:���<G0Z����!�#�\�]��u2���D��\%�d�R��G��&��a��E�$��7�>�!$06�l�����z#�H���9��\�5�,$�Kc'K�f�����nF����R�^�i���rCl^/-�Tf���~e^���\�v�C��"=��?�W5�����]<��9�����>��_�H��>�=������]y��d����8+��d�n�����{�E.�)�%,h�D3���:�!R�M'�0|b�Rg�cS�s���*"���62���%��o���U�4��!���j��|:��y�������G�Q�q�ZT�I���L�"2c�7����}�[]eB��}]�J�rD�&�[L��������Iw�/�hO������.�r������x����������$D�v�����A���������R�.Y��h~�C2��r�MG])��N��#+�{�����((b-W
Q�$���:;*�q�\k�����y���W����������C�@��
E
��=�?Y`�"�x��'��{F���{���� J���0�����Qfu���M�|�z�~H_v1:��z.������s�{��p��/����*'LP"�ZE�WI�M}��>&HE��%��q���:����=s�Qb�2;���g�u��������6�����$�v������
������Z�[���y��q�(]gS���v`�
�wQ^�W�^a��b��:��G��w��n���������?�3?5���s
*���2c?��jL�c���-���a1��73�`������U�:�������H;�d��(/X��(0x�>��6=���!���|����2@u�<�� jR�G3�����A@�����*7�&�>%�/��JAo�JD�%%�����UW`�:SY��nC ��w���CY���{�"���-Q0SV�[���Z�6�h�v���9��5`u���)�=���������}^q������O-�e��$�W}.�,
�w82������m�������������[q��:+�����X��i���Vq��IL:�����ea���
x����*
���
����lt��������?'_=�I\0x"���[�k��h|+�"�4G�&?���e��.�0��9p\��'�p�*�(��*�?��u�����td2/����F0n��9C��.��t���1d%�����'Q8����3RO+>�OY;`1��U��bC��g5W�2%��$��d�A*��'���O���B"y���]����k]���I�d�����~�I'�1���r�bW�Q�U���e�����J=�~��Y�����5�P��X��N��s1� ���0����yW+�_��EDS��#j�K8\nUKX�0�[�ck��XC{���n��m�}L�
K|�@"������(|l��i�k� ��Y�D�#�+��T�k���/�_��O		����q
���12�N�Ae�}�S<=a�I'��r��@]��T��.�����SL��Dz�]�������������71R:z[���C�C��4Fv�}n3�q,��I�rd��7��xl�y.�@p�.��k	J(�:��e��7������=�����L��]�	q.3�OI���%�gnT(z��?���>O
�A�������P����	�h������$�0���a��k���S��4j��e����������:���W�WtZ���Fr��/��+|�2<�������g>�7��X�i��5�g�J7hX�H��	��#���l�DOwY�7���U��k���!���&q�����<w�������|��8`�;f��t��7�H~'�*]4�
9���a�"�V���g4�I��DI�L�9������/NY�x����Ay�+]��\9���$���n�s��@��?Z�����I�K]Y�k�I'��� ��t�7��g�T�|���������|�~���������w����ptw���ko�������{��Y��|n>Dl�K���D���cB#�A-��3�c���M'�z������<�K;�l��K>�W^a�Yc������������>�=_���LX�1
Txd�,'\:�����Ti�	�\y�.���]u�G0/��C���[��O��\�c2I%���4`/+\w&���H����
�\�L�L1����kj4�M9M�����(�b��V��R� v 9�������vCp�m��P��40�.L�r��f
����T�!�7w����t����aj�b��m����Y�����j��e��K����*0�J�
]'�P>X��Sp�+�!$eCS u3�+�:T�O[��t%-�|'~�����6���2R���g�����\=��m&k��S� ���D��v��WyQ~{�6;�������qa��8Fr���'��)i��,g��r�W���Fi�����Gk��;$���O��?�7�~���P����i5C�~�D��d9.���e������S.��|��
����>�X�� ,��:��~�4����/d1r�*u�������G�P{�h���w��Y1=RQ�B�;���I�� ze�������r������|W�Hr�o���@�������=�h�����[��$z+C���(g�> ,�~B��5bp������N��Y~��u%D�TP���<wi�{��[(@6B�KG�Uk=A�G~p�������=��E�y�{?\��Q��j���1�g���$�:72s8���������<���$b���O6H�NX���]�M���������V`
_%�y|"�f^��t�'�����]���c�1k0r���KKT]�P����,9�HT	{�yk5��)�+.pD��@���7�b+,B;mms�/��������C���;|�8�U�B
����dV��C?�_;����7�k]���I�6��{<`�V���Iq��hk	8�
u���|W���E�F~��E^��w��W�\^���)*���T�')��+C��a�R����~��x
���K��z�����
/��y`e���@|���7!��zB�%L
b2I�JU�b��k�
nU�i����&�����_��X��8D%Y�O��-'�)�#��1� �.�/j�/���o�|�����\��Vq

����oz�}����
���L.�2h_C�h]v�|���z�q�ML��d���
�����������>j�M�+TC,?���)��������'�x�j�����*|2����!�X(���?��"�N��b���Z�Q=@*�����w�wzGLF`�P�MR���~������qP���j����@����q:�7�?eJw��&�pr:H���E�!���M.�2��~l�m��\?�{�l�R�\��u���8e�����/������b1q =���k�J������)_�����|��n�q�>��.x��l#���x�����MV��{��O!r?�4����_�r��A���/��z��A�:Ra<������k0�>�;���K�r��E�������0��b;M:yh���T����><b��sA���vV��^k�6P�s�;��>�,������aa��8f���\�,B�9�Uxt�(�u��:L:iQ��0���D���5GN:'��j�n3Y���U��W[�&��[�`i��30�{X��-s�����9�������/�r���)����u0*��}RKL���5��&B�)��~�{�"�1��������:y�*�����v.=�j��gW�i��<�����!~/�u�4�^"�P~/[�T�%_��������&���/�^���IMF��.���Hgv���8������\l�c���������T��>/���y$���W3y�a��S��1�����a�l$�r}Q������������D-,%%���y����$V�~�<JBS�
.,������4PO���Cv�������i�!����@IDATH_����RqV�`8�UI�r��O�	M.&L�j�)��Z�S\t��H.+
8x����P?����3����E0��n%���2VY���&'�o�S�4J�]����?��<i�M%����'��[��
%H��X���S>,����&�����Ow�������)u�����z��K<��|
>��;bBM`��n��6��b��It]� ��x4���D2Q��j��>d���	�����]`���v�j��G�A�U��{�g*�	���E��(��`l ����V�7�)�1���!�aN:�����I�������~>�~�p �f�������0-�lG'|�$������b-N8-��v�
m��b�r�M�q����e�[���5��H':y�E�k$�~Y�jy��"~Y������7�>>%�`�l��Y�I�0R����O�~r��2����]�R�b����5G��N�!�N����1B��Yy����+�KG-3�=�*���I��C�d�X��l{Yk��M�g������05�	�5@L�*?oJ?�//bJ}zRz�H�y�KV�S�^K�B��GO������%�YCY�EL�r��I@70<�����|t�$i~���Q5��G�v����G��;5�-����-qq%8�,��p�?�l�;�LX��.4
�^����z������-#�1��,�!<�E�m�&�hpv������*��]��"���e=r]\�����������B�O]��3/���m���u/x���N��=�h^��lOn��^y�\�w�/��7��.����{��B.}-=��4�����C��	6T|k���W?�p����W�tb�J;��\��^��/���4���~X��%�������I&9B���T�P�af�`t������UDLo��\:e.o�w�d��~]�1@(x�r��o�J����]]��	����
N��k+Hj�\��G!�e�����g��i��"�W���y2��j!�����8���|I�YQ���	�a����U�����R�����o���3/���2ON	��Z�:������1#W�Q*~����V8R>�����w��~Q66E�
�Y�p�����w��n1��\��U4`4	uhD�2qS/�%��$���}~)�]X�N��������F�Q�8?������r����,�2G��;A�
�&JG-��z�
�L����O�X��!�v�x�����i^z����w>���9�5�|N�&���<Pi��"���o.�(x������i2'��4Qu���i�h\V�P��j��D<U�mT���v��E����
y� ��Z���P@$y5|�������A���~��@�Z��r���DEn�����(����d�A8T��T
���:�i���2 a��e�v2���4@	�O��^����4�D=��s�\���$���H2aV��������vqP<Bw�=��MN����u��`�C.��A�5�z������55;���3u�����5_�G��-�(>sd�]���0����l��E���Q�]�/o�`h�����1����
^�/��rTq�0���hS��Y��[<�v����_4@����h�rm}@��)��J�)��U��T@�R���<�loa�#�UW���gc�0�+m ��=�6`�&H���H�:X���tb44���'w��8�h���X6o[u��[������_4��4>j`��������5(��8�Y<�<.���z��N���wi��Mvt�������/�g��E]�U�t��VVw���q���A���F�FH�$��1lz]2�l>��I}<�z��
<���&f�Y�����G��O�8������`��:t��z�_G��C��!;19-l
�$'q��E���B�������Ky	�3q�=��J�nj{1�8&	�YL��Y�>>y{�OM0�K���4/N���zC����\�!��2�'�4�����E$Yw��9L\���iW��������c�$A���YF��-�=^g���+�I	B��B+����X'�E1NgnA���N���,��bK�3����"��_�C��x�����dO����5���t<�u��b}�j{��(���J�4�Cq�.�D�������y����Gd�u���%�X����N�vf����o?��5s�>BT,�F���W�s��=q��$n1����mo
W�r���N��E)GK�Q�K�� ��6N���m�����-��kY�4��S����V&L���37��v�\g9n�W�>��������_�M?�S?U����'��wA|�q�������"I��!��<�����u2�4S�%^Waxl�������v��;����B6	�4�pB�(�gg�������\\���<`�P��=4����%���?�Zw)�rd��p}�:��gg��\������n������0g��W��I�	J�+�%�i����1i�q���n��jVBc�D�E������7�W��i�2Xg���L��'���J����j��B��<'%R���6tX�{��A9�����PI#�s�;eA9���/�������6*��`:�~�[sn���e�|��&G��23��M�:�o��q��A��Jb�3�Y5�%�����e�rMo>�����2 �@���u\?�>b��O��������M����������uZ9;i�y�����L��4��S�s�b�:
��������u��]�'K]O$5�!�A�����4��X����T%����nT|.����=7��1���s�0z��<'��u�lhJ�A d'��	�mW+-�H�Mxzh6�n��X%&�I�n���I����{F��lY�^�D���*��L[T�$�{��N�t�N���.�@o�����#��F�N�7���3.c�	��lu���x�I~<�-�f� �r�(�R�s=������MG+^�.������h%��!�g�T�����$K�����"|���q���C�����&�_>d��)���);LB��n�c�;�i���y����e�=�������(3��������2$�j&��������H+il�ZTu��k4��h��t�
T����3���
�O�>�1���E�2^�5a��?t��1���v�����vCV|�0e����JN����1vl��f�)qd��p�eU�+M���8��U�T��>z�qWjX��}�bp
�4�5���/����#��zj����<o��&������a�����m��}�I<�'y}�,V�����]�����y8�c���f~(��Us[������~�TO6��LH|���N�����
��^�#���.��,p`�������+5I<GC~��6q��z,|v��v���^L�j�W�	�*o����'e���?IO��g��'��gf[��q"�4O��!o������u����lO����M�.��e����&ff���\��2B�)��eW������I���,�=�1v
	+����TFC���-�������Q�0�t]�xt�u��wY#_��6�e���kN�t�2w2���1��0c_�O��.$�<���.����n��b�I{�2!�Ke&M��Y�@���S�:e
��+i��3�L��0!
��b+,���9(~�����Ye�uv'�����A�,<�?p�������S�	t���kt���m�k��a�8n	����|)hw�6�}S��/A������q}�����(z�q���N�#����dS�4�\�v�m�(�7�Uu9����X�f�"��T���yk��������������>�[X��r����Gk��[��%��_��g�]��?��0�������*��G�������k��/>x7�����S����y&�X��.W��G0[\u����Q���|��a���)���Lp�o>_^��H#Ix�;������������L�,gN�����G�|
�d���`�(��	�<]�B�!�<�6��TP�Iw<#|0���"��M����w2,��f��8D>^�-�M��<VVX�08����+��pZC.t������w����9���!>�I=��rm���5&����**
���	�I~���Z�'�#�DeC���vY���@�L��2;a{��
AM(��S���a%3�b���j?.>A	OK����`�Wp3��|^16��'6V�u]�v��i�(��]M�TjJ�����{�
:A���,����Q�\��
#�����Z���;i���^�P���������{��]��'�J���4�>}���?��
�r�l�Y�1?<1O	���������>*��1���Nz�j�m�nJ�m���]��=e�����z�^����%������=���u]�d����s!��<�$��:Xt@��x�=���;��$��2a��=C?�����!�G�
���J� ?���b�G�
���k��<�$�G/�?��������'��u�c�	��J�d���vT�H��F/	�C�8v�|��8�O,&"W���-\Q{��������m3(=�(�w���x���	�'1w~�PQi�e���2�4���o����-�Y�6i����������%y�G��O|^�2�M�Bo�Q�PIe�B��K�����$=�j"��m��:b���I=K���-*�wZ��Y/��5��5�N�N��S���Lw	��'����$�g���d���x�5�o�����Z��@e�<;� ���*v�;��.d���{���v	R���=L��o��m&A�U��e����
�gE����=�,�c�~N����2A�K!����F�==)��U����,�Z�9�� ��������5,�bR����h���/0��3�o��G�������_��{���*��T���n��T����"~����J#/��S%���aQV�
:��y��S����G�?���	�<��8�I��2�I�&���X.y��M8�U��-�.����Fy��2D8J��!n�5�K#�������������3A��1zG���*��������N������9��l\c�.��F���{�:=l�w��b�qb���M����=��E��'a#���8�8�$)><|zI��qe�lG�!��b��K��K���ew�L�eV]�Y"H�la~�~���|N�-�^m��C2n�b����+��������9`��r�(����}��X]d#�)����SL�������$7���o��tQ]<�c�(a�l��t����t.��\��f���q
���R}8>9�+�&�����w}���Q�_��W���2�VC9�.b���z-n�0&,��S!7���	��+�Dcs���.uw����D#�FM��q
0Y����c�,��4��Er_?�,��_��sArr�_z����:7�S��3�����S�����O�\|i�Q�s_}+~�����hcj�-��R�������v|����N�����^�/���|�L5�������5���Tw�drU
���[�!�xM>�U�[Re�+��e�E?6�g$��I��db�.�n1�4��,�#�S�C�{r���JBN�������&��K�W}�sE1h%�.0�[ICR�����K��c;�uVT�6N������ F�9����"7H�V�J�4Y��i�\�P=*0�Z�1��A� ��W��5n����%J��"s�� H���f��J��*�MN������~R�g�;��x�h��������k�u��3*�\��j���y������������>�J���%ER
����PA������H��>J�.����0��D:��ji�H+h�hk��Jk.�>�
�f?O��d�|�?��b����E�������	���;3��S�m��!�4���������E���U]t��L�H��?��0�^(���_1k~j.p �~J��ZaW��	���dc��0s�G-��W���1�nl�E�G�f�3:7r��/�t�]��F����j��0�0��S!�0���;���iv5��N�ep�,#�Ik��.�g �1B�D�6,\(q_�y�0@��_��U�8F}���T!�]�,���6���?�U������l��Z?�:������"c���A<R�f��G,r�`SQU�1:w��&L�/�L�x�m�A��y$�5���)���N0�~���S�����9M��~���v��$��$'�����)�J�m^Ul�j�/]8'��{�������X��N�����"H���PX��n��h�8��c�;lp�4�^|�>����%�#�����~l�xwR�)����^�h��`H�)�d�1F;���x��i�^�Q����IjSV^f���g� j�)���������q�?&�71~s]���Q��+i�?(<V|����_
I�K	h*o:N.=���D	o���_�����L��W��;�Z����wy�*?�0'��l~y0EY�4���\z�Dx��kT��UL�dQ����X�&��8������9�$�,�����-��<K�mN1����O&����1Zg�L>���'�+ph!�f�i�1��Q�w�Xh�}���v��
~������6�e''p�I+��:��������=��O�1��.2��\5]���*~.R�j�K<7���Mw�#T���FpMuGX�m����-��]f�>���o���x���w����q�#VK8Ig���=e��V��F{
}yI�N����8-�H�jo
��Q�G����`��b�����W6<�V��Oyg��+��a���cq������H�1�E�Q_��u����o'�P�J�3AS�OJ\���<(����S���v�������<"3�i���Z�8���Uh�IOlr��=E��F��2�WYX������
"��u���_|��4�����PR��'�`_���I��'�����Lp�G��<}Q�������N}n1q�>7b5(z[��^DW�����n�zr#��q'��}o�����V��T?�o�������[�z0h��?[|�]P���npt���C��������x�V��q\���xP������h��/~���];Nf��y��?�����<��w��������,&Y�u{�i&���x���w���4�����ca'�t>��,���x%��M�l�apv��_�n`0Qt	<L���C� ���G�\���3���L�j|Q@ec��i
���Ie�����#&C�T/�|��D�J�����_'Nr��cu��������'E
�82�q<���[BCH@i<;)t��i�C^�j~^X+�/.���y���\�~��m��W�����>�G!'.��W�������Y{���V�*�C+��a��W;�M������zFA"{������^i$�����I�R��G#[���h����<4X����f����^���<��#� ��@��m�����5�pV�����6W
�r�B9��u\�"������q5�b)��o
���/�0�s3�3_���&������� hN�i�Oz����Wry��3��>��j/���|�
�_��^�-�P��!���,�(����9�q����~*��5^t�f0C	t��"�d����U�eG��Rf�����p�	�Rw�l0^�
�a����=V����������:�C��RHK<�98�"#��d��?&E�A~�-a�����H=�G�M����^w�<��-��j��M�a4�>��bP��8���s�����U�&u��l��&�������]?@?��N#X^|��k�#�<�L�^��c��b�K����{����c�	c�����M(c��J�>�����2���e"]���t�0��X������&��*���g�1t�����+��.����1��u!X"��	}.�=u'������q�j��������Y��QK�Q���+b��a���_uXr��tc�����t�3t��[�T�����"���T��	���qv�z<���U��	���u���X\�1�q*+�����,�^nN�����l������W�Cxr�c��F�L�����	=�W�,e����� t�w�?��������Y}T|��{a%�c�M��y��L�s<���W]��V�y�?l;��Z����+�s����7d �.
y�/��:�*��Q�m�*�d��v zw�v�',<��n�M�#��5�����g�'�����w�!��NYg%�y'�b�����'�oz	����c{$��Mx6�on!O��p�D���MD3��u���.t�����{,\�%���:�NTd6(����
��l]UW�,<�,V0��E����M����[�N���2�Z�w����"-M:�����������.���$O����]�0�E���1�q�|�c���N��u[����3fb��Vh�f�s"D{��	�������������Mp$i������V��&�N�~I�6*�9	���)u
� ��;�]�1�+	������������,jYz��B��h���*��"fK���fX�����?�$r�����4�����^���I�z����o�����;,��#��\|����8��b5�X�������Zt�Fs���/������q<�����AL:���{s|�?fR�������8���#'����}.r������N��q���?�+����S�c�q��<g���n�������.a��e>^�<�<��	�_�.���������q/��z2��6a��0n���6	/��L&�R������y�/���Y��"N�89��������
��b�3�(�\�q���6��^c����iS�e���4j��v�o���``�<&��^��2w�}�Ja��c,O*nf%�-��0���b9u�a�m%G���Q�s�"W�B��[���������\�8Hm"����8���0�R�l
������z�r�����y�*<]VH�������(?��N.2����s���hn����	��b�U����q��RO%]$�qns����49���ZGN*�������������x'SWi���
3���5fz������J�z�3w�?&�YUoZn��^���zvB�]��d�\��7v!S�0C��Jfr�}��T��B!�����=�K`��?���`�����T�&�]��ZO2h�G���k�q�������n��e���t	�z��/�>�sN
����9Q����l����$~s�fI0�+�������GW
��I��L:��~�0�H�����yq'"�(iG����n!5�dH }$������7p{b5��Y�w�g~������M\
�$�@�b���!�v�0��_�/��8��w�Kt	�0���EhN>���-��4�l� .��`�8d�y���&���o=��Qf�Z����:p�nv��ob���Z3�Ss�i�}���w)7��k�C��;��Q����=�U���>������2!)�u����a����r���"���q�i�Z���k�Aq���`�U������l�X��B_�������[�I�}�r������Gq��GWj����3�R��������k���b%�+1<���DIX��N�����Du�n�	��x'
��jK�4m�gn�I�����9���I�������Xj8�
D���=��.����c�wi��I�N:�c���Fv�������L�X�����{��W�nYj��&�H?����Nw(���������+U:������
4�_�*��]���Y����B�E�n���{�y�C��] @��#���R�'�({BN��N��x����y����'�����U+���yZT��M���F��ir�f������$���A�2��~�b�t1��]��Lx� ������~G������DVM.�����(�$�F����zY�v���^n�h���������I��xk�]2����>�0�����~:��b"��}s!��h,�J�Q7�JX��.�W�0M�X�����.��Y�3��lI1��S6�Y-2��O��->��i�b�U�$G���O�������<#�m�k���trb9���^�$8G�����Wx}�>
McKj���F������ZS�8���	SA�r{������l@�����X�7�[�>~����l#n��@n��ju��i^\�w�IA��O
g�D~���z_��������������~\���w�w ��i���\Q|p�+�*���g^��j���r��+��1p�8F�m���o���
���`�X�������\&vv�u����0��;���#sWb$\%!���JN%�����������5:�2���8�TY�����Y��G�f����~25�dl��?SN���8������C2 �Q�n�%���J�U���(B����X�X��W/��R�X]	SVHX�+��(���NX������k�br�)~����C���RH�� �n=�#�p�g���<�{*����>��1��1,;��{��d��rg)���&N��'gP�m���z�U�y�k��%R���)@�E�����HN��lh���i�4��&����*�8k�#B��4�
�4(*i���d���x�u��������.���Jw�"��	"���8��,��b�R.%�<&��7��������>�8��u��.Ol�+N�T��z;�2)�<�!:�P�R����i���i���G"����l+������|�K�V��4�Tt�3xd�AO���G�k��yy���_��~���$|�6��'cgr���B�K�r������x4_�M�a����X����x�f�	��Qf�'���������i�]�x!0�kz�'����Nc�����c�Qt�,���@��S�CJ��X��t�)��:C�#+\J��!2#���@m�i�E�6VC�������n\�7F�Q�0��U�q��M~��u&_8j�;q���],���K�����w\�
�t���~,^��Ws3m~��RC4t���Q����:�1�/v�l2���4��v��h���O#TcLD0Uv�x�����(��7�&�9p
��������(d�~��\\�����$���s��=��k�a�o��d�-��v9��T�?a��u��r�����6��(!�Q�8+3�&�b(�5h���VX�|�d�I�9.;��;�F��4�_��6���zy��B1U[�B���[��i����r��Z��� �s38�P&��l[��vhqA�^��2c9�WZ����D��zj��%B��5(�sy�\PY���c���������OA���W�-Ax�u�����g�B�����O�t�i�����X`[�X�8�!O*����gT���q HU�����(��&�N���*�|S�~�5�����L�(lA�J�tT�_x�t4X�(��k)X\0=����H�3����H���\;*[��4AH����AX9pV2�d�{�����a_�?�,��i�f�3�^�O,K�9��e�+qT��T���g��%�5�k+����%)�����UwI���2i6�]N��nl0�,�@�z����.�J����U3C~ywU��S�a����j�.�����w��7l������}�k9��9W���>F�u��Ib�v?��J�O����e���B����s'��W�[C�4V�V�]O�e�D�/y�K��74��E�,����R|{������q]l�W�����������5�(8�ck��3�����.�3�mV��u����d5yp��Pd;h�;�����r������r�s�H�I�6�K�f��;��0^g�I�o��:��]gy��\e��?��s��;U���i`�-V������fL�t�c�S*�H7���Q(�"4��a`��
��;����]����V������h�3AC���8���t=�V�L
���S��~�����M�j��U{R��g5���(�a�����[*�����|ACQ�����[/��s{RW|'�!D���B���� ��[S����z���#.^���kLO�,}r����<Igv���t'��a���t�m��[q7�i_onPIO��r����
�o�!Z���r_.�(���LOiH&������%�����i�6T��{��p�3�y���vo}^d����9���_���&it� Bs����t�ts,|��W�Q0�l7�2i��<@ 8\����������Z��19��
IFS�2Q�N��/�b�s�fY�&��������o����Xd�������u�u�Rw�yf���X��0
W��H��%d3����m�3�M�I������_�n��+�m&�\�
xs�T{'�X=��Yg���N;8c��B�&�*��i/U���mj���S��	aT��T<��e�����c�����W"Z���+���D�u�)#������Kh�z�������A�},��R��'�a_���3<k�H/�s�AH���J�]sSC��^�`L�L4ittG�
��}�kJ�'���j7����I��>���}e<���8�^��t,���Er�{w������%C����1��8�9������G=Rz�aq���/��8�y��e��x��Q�������V*�n�ch�������,'��3dql��t�,����:�j��g��Y�z��0�;�D.d8J�}S��R�v=v��q�c����jm:�W�t1�5�g�E&��8��|��k���?�����<hb��4�����e�mr�>]�,�[�F�
K�D>N���&���z���C��?u�dgKq�i�r����-y��0I���JHy��6-'�:����p �t����G.����(�'�]N���T:q}�A��N��0��N�;��7���$������tp����_����dns������G>9(�N�s���)2��=�.3�������p&������#l�������^���"���~�:V8F�C�I'�+v��$Mx��~�1�T��z�B����qde������D���J��H���s�~1�P�0_�F?����������Q�T�O��wy���.!'�<��?�����yur�;��c?7�vL��w�{�{���E�x/��;��A�N���MQ�?����k�����M���������p��������[�����?��/�������������p�OY]�K��Xdno��s��An��p��=+�g�!���U�|�v�|���"��	���s]Q^��������>��s�g��sHg���W9.U�&{k���<����K���^����
���.�z�#t�����t�nQ8�8^�3+������0Y�q�������z�d*��q�I������v�w�?*rs��H)l��(LY��l�S���0^$���GT;�Y� 9�,�tY��JF�16�����w��qG��#L��(������9_e�S�.�|*]��s7�T�
V�\D���W��/Mp������0rJ5�=x����a��w�{�/�_�����s�����m�sc�/By"�����$���pYg|g�����P�����G��=�2g���.Gf<G'��fi1�#s='O\a��Q�$]��\���$�������i"V"���+�?����_��>�>W��n~Trz6��HiQX@g]y8��jbZ��M7�T�b(4PD��M�4�?�S��� f�:��s���U�#�n��0�?-~���-�d�i��!?G�"n=������c����/�ta���

��J'�mv�/rQ{

X���b�D�s�'Z��������;�����b1����g��q��������L����oH��b�j���J�'1�\C>L��)t>rs����k��|�x��saor�?%��2/@�W���x��������m;�>��+~W�|z4z�x���s���-`�c�U��>�=���:{7����#]�yT�f��o~�	=�J���~q�7m�+n7�8�}��~�����@>,'��h�^Z���g�C(Z������8>��<NG��;�z����r����F�%l��\��/�e<�g� u��^�[���wq�d��;�Sw���A�W������V=���@}���L�����v�92	_2vR�
p��.c�|r�R<J�
�[[����P�8b���*q��o�V1�s4/���5Mk������iZ��a%�e[:��b�z�l�hu����[v��@;����pC`�]~�<��>��7�;���2�
,�^�D|?��w�5����2c�8��r�g��<����]�B�7�|4�C��i�"x��fC��2���4��}�DU�.���HY������i�jv����+Y�����E:�\�3����O�b1���b������2Ze�������WH#���]qj�����4!mH����?���1�}���r����B�}�ljC���z���1���RA��y~\���������0��{U�w��I]V[�:�<����8>.g2�W���1�L)����|�C�����L`��g��:��OR�������L���~q<�(��H�
W_����(hR���=�o�n��s�ct�7��h��,�Go|P��m�s�Nm&�����/�D�W���\�-veu�y����*�]����SgZ��N&U���|��n����x�y
�vM��!0������i�8������*~��������1A�?������G�������P������b��)�wUyt����'���������/Mi>�~����H���>U�j��~�Y�����`[����p���������������������F����?S|��w�����U����zT�o��I���[����,�=<c��e���`��I��I�o?2�`~�
�a ����3]�6<��W��g���4�	%O��^G`������H�����Exbv
&�g�T�����69y��+�=fD_�-�V����82y��c�G�)�S5y����x��F2	����t����'����,�:la�`V1����nq
��k�%Eu�w=���8���{
���f+%@
�����~����m�#&�]T	f3I������[�Th ��HC�*N�,�{�2����P!X��m�BC�t�[���@
� �8��F������L)��TW�8����:}qp�:�N�����	8��
�&'��n��
�G���������������\��Lj�i�RK�"�B��W(��Rh�,�����cp��a�1SS?��]�MP�C� ��u1s��#��?O�����S���+#��`�	�������+I#����/���Z�i%
�f����������ea��l�Y�{���yh��w��h*���*�0T�=�����b�C�sU�[��3����i�
�aB��Q����Q<g���=s�V�t���������(k���y��:F���s_>�7w�z8��)J��}��4�Q�A�
��8���n����C
�a1���b
�dL�.����}g��{r�����<���]�
���A;�����-u��0�ldp:F�\��zo�=X=*��b��l��AQ����7�[�.��_�d��^��N�lh-�$��O�5��C~�u����9*>~��\���Z&��g����u�6E�u�pTbl"��iA�k���t�4���o�c��zI��/��w�`C����u����30�h��?(V����6����3�\�:Pp�G�G#�F6�3�wjSv�-A�����wR�����4�j����y=���{.5�-�ZL��q����r0R^���[o���69I�@\^".���g����U��M��pj�^�)�I��3�%��3gK��R�Y_����6��p^��8�qT������������ ��k����M?y���v�Z�a{�Dz%��A�n��A�-&AB�����yZkA�u-����:�
�?�q�c����Y�q�w�DF�~�������s2���I���Y�d��W���_���NL�s�D�y���KJ!�3��@��@Hb��^�yW��o�o��Z���9�i�8:��������������*�Zh�s��
��@��\��F�O��2MH<�/��l=�A�y���l6��'�m �bw%r�	h����.j�rJZ:q��*B,���]}�>�S������mYmK�+%
�dP��u[����"�-Fe�����qt���;|���	}g����b����b+x�2�"�)W�`i��:�<_]�;��0>�����A�I��ZT����o���>����}�y{���N;5O9�������j����7����������(��~k�*�@�X�?�i?im�}9X����vRs���F����H@IDAT�tQ�u�����bT�`������������7V{�[,�>*!.���x[5=9lQ|����1��>}���`��������I��:�����UVUW/��M���G��d##M�6#_4����E�a~��Q2�h&�A�F@0������z�\c���q#2"2"�j4��y���������s���BG�\p��cE��m��8O�������f=��=K��-�t��D����Bg������;n�i�m;��vY��z(�]��������������76Y��I����A����&�r�Kt8������T���R���Zq���F�a�g�����SH��f.j8`�`pU�H�i��v�z�}�=I�W����	��PV�������W��m��f����:���u�i���A1��/�P:��	c�YwN�rE�n�[���y�������y��6&-FQ�1�H�%����64�M����~��7..�]Pg$����A������n�����}e�F��������/���q8�a����?����@��������M7<���"�����"{�}^:S~E^,������Xv���/����[�}A�K���t��t�f}�\��|D��O\�tX �z��Bp����G(���U��<w���f}�h&�����	�2`��h!4����a��P�����h��S�����d�XK��0���eW!M�-'��8n�Rg@o��
��GB3��'V�h��?�l��w������:��0^,���C���y:&L�K��3��>�
�{��Le�$�9���),c��:~��0	�!��I��`,��x^J�0�t���/���*���"+�����.f5��A��I	��_�=01�m`���t'���-CN;�^
��N�D2�8��B�M13������`�H�����@s���~�.)=d�+�&��C�& ���:8����5�����%��������������o�$B]O�|Z��Evv�9����������#^p���y�-c�O�6�������=S�l�sl�B��*�NH@�Ek4X8p�3����S~�>M���G��������1���]��������u�-e�W�EDF����
�3���!u���q���Y��
�Ke������"��c��^���`)��y��cj��p8hR�T���QTY��6��(���C��4�tHod���:F����'=O�K����5�K��o�E@���
G����[Nu��1�Y����b<��(|�)�f������yQW����F\�����K������7i�X���5NRZ�i�y���+8����C\l�aM�26����s�q��T0�(��I�4�<��1�Lt��`+��e�7�O��W�l[1���5��y����G����rt�A��m��U�
�w�KA+%��jf}6�/��-�����������QAM���Uq��{E��dz���*&�3��vl�[�@��le�	B�{���e�t���
��E,�$&���������g���LD�����n�l�q_��c��-��.<�f�G�(�1}��\�m/��2,��U9�K1�D�p(��O���}��FtX����q6�#�]��m�OKn��-�����%
��N�@v6������m�/'�8�C&��Y�Qb��;5f��k{��f�-�'��`���F�A����i�����^b���s5t�?N��Q���n�Tn��8�`��C�@#���f*%����A����
_�9�lly[�X�!3V�K.��&�]��*jR��w�<�Tc]}�� s�sj�N�%�C{�>"8r�������_�",�wa�"�~���&�{jb���F%x����Gyl?�����]&��~�"LJ�
}t��\}��"�<$w���l	�E��Dc����0��5Q!���V�.���6���
���4k�s�Gw|��;���x+qq�5}��6�V��2�yH�A�����mo����������N��������|l�1��D)a�zz���qp6�M`�p���
��p��&vaw^����3%�l�}1��
��	�x�����v�z����c���������h��s�f����_|�k_+>��s�|����Y^�$F�C����=�+8
-O�mp796BO��`Nb�'���JH(���Q>0�$@��^y�02�v���K��o�H��7TX�o6`�9q��&|%�+�u�CEA�
�fo�����O���
-�����G"|7�=f�>�tX��������b��)�(0X�E;V�^��������R�:D��T\�9^^<�^~!�2Q� ,��2��8T������m"H��7i������7|6a��3�ea��g����HS�*V�Ew���D��z.�
����rw.H���"�Yt�#��������*�Xw����
�M�q%�O�E9"�i�N�y@��er�5k*��Z19:\�PE9���e��0"}�\�����U�\���N�#�|�Ln)������sv������)5�����}O�m9��x��K�h�K�@
�eqRw��Qp��w'�P�'eglQzvT����G��h�(�q�����s5�*��f��S������%)QW-&��ur���ld
9Uz(C�o��� XD��Ppj��3F�i�����>�G�n������<���4 @��tbr
2����������+�m�fM�z3��3zT�u
��v�>�Zt(��c���Qn�x^W�u�g�������yQ��� �������������A'�d��������- �0� j�����0��y��������s��i�~���b���"����}XO�EY3s�t���s���+1�F��G3�+�Q�	�8��U�$��?�V�a�A''M��	�EM���@�h:�s|�������Uf��?��ago�����EW�ue������6_��>���pu�E�L���<�\�A� �
��F%KC���F�3�(��btL�L(���
��k:[�����2H��'����c��x���[�*�����y��m<�G�R�k�M6�O�{��v��G��m��0��9"��N���p��$��1��q�	�mA�<��|v����P��(��:aI������q�a�h����N��YKS�,#4W���&#��T����<&�(��q9F�7���J�JW�Jr4���ew���s�p��@H�����������\��&}�XiB���S���#\��2�gs����N��){��z.�b�/�����V��jI���S�
 Rx�����`��&ofR����y�L�3����Kw�Q.��$�M�+�%�g���J�.��r'.b���JW ��~s��s��g�r���9~����"���NC��c7Z����s�C=�dK�N�W|2�1��X�v�{�C����2���UF���r��Y�0���w[k
�^�6�H%��!��?a|�"N�j��f��I�����nC�K����F	��{���"�q�~�>���>Y����6�P�D"^����=��s�
�vLPa��%��[zy����������J��O
1������?(�>
��������.���o3StP|���R������Y����W|��'S`�q>�W���E���?��O��~��S�}q���T�Su���8���`�q�'�
W��ol�Q�5�����V��S�80����c:�j>+=+���2�E.}�m&L-�:�)"�4n8���q<�
�����2r��~�}+�^����,t���%n����Y�3�E�-E.Y���S�,p����;5sp8�"�PC�2��a��[%q�!JS�y�*v���-��*i���WBUi9�%i����
<�i�����
t�����X�Yr�VR �����rYP�C�3���FU����p�i"�.�7��:���Jz�d���cx*8�,Xy*�!��0�%�y�.�s��h1��
v�?.����MZ�(E��!eb.S�0����]�\��yH\1�	�L�i��w,��u����qW���bL�'�P
��'��'���3��j���&-~
�@3�i�����qq�k~!�1�U�Fx�G^�Bv�OMW�
O(��l�YVo��
|�|";��&t����h�NLn���P��y�����ZH�������Z����):�B�L��q�Gl����N�p���IGtId���i-2�Q���v���!q�o������?�`�t��ig=ZA�����f������2�������ke�0&)�
&��E��m��N�/��q�)�Cz6�KjI`Pf�K�����cHg�����rk@	��L#��O��$���F����"�Z���2�%�	�zT��`����f����0�RY�������@J
}p��a��K�	t������ �8���Y��sd{�6�sW���g9�{�\��G�m��]���n���q^|'������R���w��P�t���Y���8g+���@��-�D!e��^����tpn�Y��������<�����7p�:���k���I�=��L�w����O�&1M�
Hhs��n_�lYhYn��1��>4�
����h�d7��fc�/���������H�4�(;��R�l������%F���qW}f|�^�Q�� �=Y�3U�F�3�@RU��<�����_���B�Nu;�-������tk@�����0��������w0accL�Vh�Y�HB#:������*��$����(^@#�a`���@w���b�N_��V��
pmtG'��?!�*}L�\�D�&�����^�����}�!�����\�C�7������.2�g	�[�y>O�4��3�W�=&i#��r��&v'���}�K�JU�j�j`�	.o���r���4N�Ao�5�h8��������l���i4�����|]a}��G�@W���
R$�.���h��[j��^B�����x6i�5���B�����������������?@��%7I/t9 q����JN�sK5�F�|�D�M��ib�/	��&e���������h�������3:&���3�Pc���}B�`��m���D���}3���:����e�&�y�'�j�0��$8�>Z����K�(�rbb��Ig
uw���A{��w��=�c=�yv�;z
�\��6���#t�y0N������"�M.�j�� F�al��~�G��`��������<ro�!h�!������������)>}�2=�Q�������v3�u��;�z���b�
u��:�TW:E��(^�SP��xB��;��O����F%���8���|60p}�p�r�����G����?/���/c����r��_�����e�8�t�GT��_�|���wC8��0�/F9@e�����c��j�T7@y�i������Hr(�f.�Q�!�CE��Z?���z���u�s�1cdHL%�s�z��8�qG*?��[� ��MS#E]����&�}�\��|��<C
;��%w

�=KC��-:�|�
�l~�w�%��d�'����L8`O�����0�aQ�fm�5��a@�Y�mf�8��_��4������G|'(�.�������"w���xV��i����_�0��"����&�Q�5i��C���.���8���|��%-�X��QR�iL�s��Dd����|�,b�)���5(~�v������s��{xW��Q�3'=�
�5g]�s���olp��J�>��s���t6��R��e�F�_�z�8�lE
����. ������l��d�8����	��&�d������V�����>&�:��q�����n0�6��u��]x;n��2@g�\�h�0��U���bpM�U
�wKc��W��$�6��o��M������f9'�l�s�,��S��i�;y=�//\���	��C��sj!�)O[9qB���(o�l����F'S#-���9�M|;=�?�AFgM&�Q�sAb|:$���Z���$����<y����@a���@?���5;$��{���C���#���|�?����eO�����w�fFr�����o�����=�z9�[����B�6�����z�h�9���}d�[��C���P&�>j���#ZT�'��m�N�����
i��5_���������uE�v�C�dU2[g��9�t�D��h���Az��V]���HC��G��U�K��	38��-��;�q�tr�Y)�{�V��GX�3���^Sc�/�L��]�����cn�;�=W'�=H�c�D��b��A���#��
��#��W����zi[�G��ZR�������I-�LZ�i�B��8��p��N������-�]e��ha��?���������``����%��59W��l��hj� �"��U��G7[�I1��$����
��v��+�@_��Fv?�'q�%����K�����;�D�3�����F�Fr�A���Z���m���U�B<h��q���a������^�1�6'm�G�<�7<�q��y�4��9�m�t��:�<�'��
'^I/z&�3�6������
BC���6uU�Oe�	>4�Gp���w�r����n��������&��]p���:�2�k�����[�c_/E�E�94��_�mp^�M��6|�-��������x6gM�y������_�~���g��na��g��":\1�[�>n��l$x�:3
lS��@�����-��o����q1d��rX������:\��������~��7�F�~����P��r���4V��:�
�D�IiG������:\=`x��Y�6V���mg����m�����EA=�V���o�Fw��^|��\�0�tB?����v���W��Y�y����U���L�Nb�L��hP��f����}�hs���N-ec(��
9���MF������k�h�~l���|���&�2.`Bz{� ?��2������
��u�R�z�������F�I������d�N�CS����l'��/����n%S]��e������k��IG�T���g���C����ip������Q���:~�:gx�H�3��>aVl�8[Ez��@��
P�O"����Y���������j�����t���~�4#������MP�l�'��8��t'�����a����AH��ej��|�����������z~(x�m��e%'�����^\
&�D��+��1��0V��c��*���D�/[�r.�~�j��n��n���,�oo����������t7��!���m�o���4��2���=}������
e���n���#����x���:��;
t��2��A����.����f9=�z��U$t�e����XY����,K�����Q��'?)�s��<����7��G.�f���N�������]f��iR8�|��o:��(���=�NK6L����F�B�`�C�����t��r�T����vYl��v�]<������xn��&��}swl����#g���\w���X�T��@�o�gc���
�N�F�4�QC��%DJn�2�t�(��`�v��PT�P$"+��+�����������NMA5���o���@��,7)�Pn;�szf�\��������6u4��-��)A{vA�;��&:��	���@8�[c�X�D�`_�t�G��cA�T�k�8T�!dn�s�����a�#h/�_��A�U��&a���:1��H�zy���x ���y�Ny�r�V�M�d����,���sP�� LPP���8��������%�	�6��E����\#�{
���)y?A�_���h!k���x*���G%�sJ�_�:I1n���s%�Q�md9��u�+�o����	�"|���m�#��2���>���4S�%Y)k�O2z�,��������+���8;�������6QD��Pa���'k��b`�������7���/���������^���]�O��*�{����lR���_�s��~�5f�7U�i?@�D]f������y��R�g��h��6j��k5(���[�I�p:�n�3N=`_�em�	�j�]^��JV��vpV��i�x�Y������E�Y�f���^qA��O��H�n'EGm�z8��i�[;��������.���x�X�Fi�5t��U)��������9 ��T�$a�������x�g�%�K�N'�mBPv"�w�'LX)�n�l@���;)�w�=���VW0����hO�'�����C�L���B�(5D��6���G��XVN���[!#����zC|'��������4az	�bhY�2��
Y��q&�Qf��tk`�C�����������\v��|�Y��Y);��>r)��%�x�2���=��r�+�~���I���k������Ne���Pq����y�Q����&���R	��&�m�5\2�w�x�>���39��������S_��6u����:	�	1�P���:U�G������"�������u��CC�9��U��n��]�K~�d�S�����a�����2'�b���Ch��C���;d�![{g>2`�`��2[�i��!mw�����R����z��s���/?����=|>�NX�R"�5��k],�z��}�d�"\�.y�I9F��R�a������!�g�~��������>}�0|�����w�u�?��6��w���p��;�kI/�I&������G���������z����|����>����7pz�����C��[�B�����]u�(�e�C�p����	�f�<������B��p�Y"��o>���]�'|��C���~�<����H��U������N�=�U@����C}��9a>d�����=�-�}?���������I����y��M���"�Z\�t�E�(3��'Z��t���c�����x��[�wV�m([.w�F#�(%~�]�Xz����9�c�>�;
���a`��gG�����T��L������Xa�	'=��5�UG
9�����tD���J��s
9�����.e34PW�/���Kw)|�r��fO��B2	�����Z��z	t��B{o���/�F��p�zO���b^
	�I��GA�^l[�[mT!������{�Q�GH_���
s�����6e]
�������I��2���u�$�8+]R.��@�����#�������SR�����^w?���9~�~T�Y�����&��>���t)o��N)c�����?�|h]�~IpR�z:0�w"�Q�h?��8�f�O[p�������<�DK7��D�Y��3i��b�#����C����*���l��3xP���_����>C�p������c�{���_�r����O�Ga�Z���F��`�Y�v���!�M���~�l<y~��C�9�A��}��X�40�M�Cl���C�e�0��p�t�k���&|<��$�2��^�S��
e��8������6�z!� �J�P��T|2���Oq����#���A�A�Ac��efQ�?���?�9 ^4�����5�x �{;_��r��5f��������$|Wx�*��;��"���3��G����l$>)D&.<�5�(���a5�L;������
�:F]�x�����t��]�Nr���9�6�p����6���o|����z��w�Y.=�����a���s���r`�CB�Z�u9��{�nY��U
�(�
>�OA������'l�;)7(on?S��,�4�F<��}���vlo@]��{>83���Q��9��Z��C������i�
9���r��3T{�7fw���5P���*CY�7`�~�?l���k"�r\�D����\
]Wc�yVO������*�����^�������7�b�*�e��gif�s��e�N'��mQ���+��6�jG���cH'i@@���R��X]���J����\�i�!u��&]��4`^c�4hBz�*|c�w�g2�\g�v�#W�t��[������n��w
��K.'�bRI��SttK^.���?]t��#2�Y"�\c�f�4��XE��'b��W@���,��{�_����Ag��V>)4�|�����F+�V��u,mri��a5 ����I�����t����la�_��rq��o���/+��(��ZLt*���h�����t]gI~N�kNuDY��7i�n7���������+p���?�%!�Iq~��1yd�!���������&_*���'S�r���:�1��q�V�MZ��:�����t��������=��
�� ��1(����5R���
>���/���e+qWVjD���c���-����m�����?�W�E�)/CLyD��������L����bx����j<��,$;�M��p�!���:g�kX<b;��n����^x��e�z\����/��+�Ay�3�!�\>�|V�������m@�# ��:e���|�f��:�.�	b�!xd�	�4w'��XZ�x���4z���	���[J[�y:�I#�STP
}BY(���=�ij�Q�������6�-������t2�H���c��%�9N�<��>������S��&��v��{�y����8�6l$���*��u�#:!4����$)��m����T�JX�m�K%���$��5���D���x����E��w!K})".�s�0&r�����*�4�����*�~�+���=BfO�k�H���,c�u��D��$���:�3Bg����c���\��@"KT�t����Y����{b��f������v�������-�l��{���>h��)^��br)tg�,��V��a�
���x���s��4���+<��y������<��G�[��sh�	���O�3��
�i/������$���=u��������>e���We����]�	~B*���L}6y�yL�Xdh]J"�c��G�K7��NY���ij���6�V=�I'�O�����$���[��������?�����|�����UNmf����
����P'�
������K��^�f��9#2����ylX�a��ax%���KL���QR;�.��e�c(:)����*A�M��M����
��|cw���0�%��uilg%��L�K�-�a%�3�7Y*�<�$5Ns�C�e���L�p��������4n]5��iyt�Rj+�qv�.1i�x�OM/]�����3c���	�G���%�������H�.���Y�e��f'P���jH�_e@?�����.<��9�"�'�P���R���k/����
�����:2�d��$#4�_"��9��f���<,��>y��e����'��a�t�:3�l`t��C��^f��*�[I#�K�L�b�n��:q�7��F�x�'H��>%�yg�U�ii%��Z����_��rS4��{�w�V��9���q�����9)-�
�X�������*�7��4e�yY�lp��E������a���*�(�
�
!/iGv�[�z���5��2������?��T��U���=)���m�&~�O��\����������9�� vd�	��yn���.�*�g�<���)�����J����d"L��_;�nI�h�������
�(C���F�@��K�$��O����@��ymf������[�DI�v��!<c����@�f��3~D���Uo�,$i�o�jIz"�n�[q�?d��F�Z�IM������@�Y}N����Sf^��/���(��qF���`m�A��@�C�!��c�4d�q�H��T�l������!����`���b@#�m�9nG��&��_�Z�' �����"��	*��'�������X��%�0h���3�"�����I��o���Ll&�u�5����2�|�7h���m��K�Z��%g�������m+���2'���*.��G���������<�[a`����m�;u��#�_j��!����O�'��7`x��X�L��*8��}��$�uy�ri�=uK��<�B��.d8�uO[��!S�W������#�Lh&vt�"��.]�������i�3qu��eW���\�i~���q�v��� ��UiOx<r����s����j9�;��XG�������"JX�7�G����%�"m/�X��J�v�5vt�)l�Q^�(w�pM��i�(��������F����k;�~�x��!%��a�G|Mc��`�+0�B-�s��f28R�*�,�T����S��B*��\���k��V����_Rg�~���$�C��W���$@���?��R?	}	.SI.���'��[�Gy����H���j�.�^0���1\�����s�3������?'{���;��,�R t�BV+n�`�-����Y�%���m1�Q)	�x�c�;����[��3�eM�C�����n����7��r��Y����/l���*�9x���U�����fq��,^I:g6H_x��2P�u����-�D�#}�N����O�eQ�~p��b��vk��M���h����'�������_��������qF�6+�\�4@q��g����'�D��_�����2X\����e���u����eX��.�j�a���'��K+�nf
���-t�'3���%&	���=s�����y���K���	��{^��	
U����1a,��9�y��(��g��
�I�.8��@h��1��C�=�T������`b���m"�s_�d>J��P��������5�jIc�axf�pD�,cBMNs�{*I�K����%M����$L���O8H�'5�A�}�i=��2�%P��)huA��<����-�	�������S�1k#�?�
���������AS
��U=h+��e������_i8h��$�,����:1����y��l���l����(h�����I%�g�����n�*�1I�����q�����'��~��Nf�u����.��������0,K��8[�o*��E���Hr\��r%��q+=yv�	������=�C���e�yn\U�
_����r7Z��G}t��O���V�����`��y��<��������iT����������e:1��kM����A"��������2M#(/%������A���\����m���
i��K�R�MV 9��P��X���'�	�W���D�t�����9���������4�<��8�����o8����7���Sy���a	�?��O~ �o�����V��%�9�n�;�=��������?'=��������x�I��A�J9��R8I�6eR����G��S�]�	tq���'��X�����4@����}&��H��-�T��CW�m�>�m\J�a\�O�!�gL��n�����9
p(]�9\���0�!���ec�\�� ��DK�SI�pB����&��K��'*�D�'�����B(D���5Hh43�4���2���q%$���;�g�8�v[u��Y�������@���U���\1��>q�'������J�b��&���3x��;]�b���s����?��6����&d�����=���
���g��z�+��M2au���u�{� �+w��9A���`�?�����dlW���-���!��M;e�:���-�:��y��Y���1i��:M#���������MA��?0�'��8�&VJ�#�1E�j=������������#F�=�{_o��Z�IeE��Q����S1h��<<9����\�N��nq���E�|B:�b�@-F��Ag��	���a/ro2�#�.��I;���2���Wyfi��(W<X4��F���2=�3u�(�]vq�s�O��-��x� �D��%�=b��S�g�)_i(���(��t���o��sl�������������������l�LJ�����c|<.`�v %duN����9�qe��/���#%��������"�a�}���x����k0Yc�;a�.��&���p�q��
�`�q&�9(s���"��~���\���%i�b�f����g�)��j�L�K/���N�&�]/������
u(��L^�nR?��h�oD?�$�;!�8j�,��}c?�Xx��M��0��Q�$�P�L�P�t2����������������o�g:����>
c�
����n���Og3�>�|���[����-�*�W~�+��'O�Y?�F��T�r����i�/����"�'?:�s�lGF����c�`��w
	a���m�0��.����u	�`6Br���L�m)l���"�%*����Ci���2ix�y}���:��W��<������k�NFF1�������O�+�H��e��bc�C��w��}�u�N�k2�<�'���-����t�`�
�u.�Q�*#_���<���B�}\��/�����4(��
jx����M�F�[��9�kN����e� }�l!9gqi���d�3I�v5M]9�$�����:[l�D[�O�I;*h�o:f�cO9��R����f�^�n�#I
^V����>��C
�w����E�//��������0���v�?	��JMM>��'W��Z�w5�������g`�h�JecG[�ySz[�����<"��G�%���������\��?���*t���dU)k��V��T��6N��#��-����u>Y7U�H��
����C�$~|���,|K�R�,@�8:�R��Sf�	,�T�2�8|3�N���7��1Z�
���2�����jg�\�����V)&��gx���X����}�%����P��y��s�A��>�0mA��L.p��G����Q�c&&�����z�+W�#����[;�����*��g��6-���"�*q,Q����5��g`�u�f=r�Y)�SE���g"�z-
�k\����h8����l��`5�g�t�Z{�j)����f�8����	��8�Q��4�i����%|�ntJ���uU��T�[nn�xq��������d'��������=�,#f �&�Ek���@����dd>�A�I�)�Z�����d�)f@2����m^���'!��������Y�z��%����$�yO�-[����^��cS�}��{%���RTt������|t��|��>'��?���p��y�]�E(��� �����1��G�	�G��5�9V���M~�|�
������>���#|�����u�������/�;�a��&?g$V�vzm�	������Q������D��]��xn�%�L�!�����j���u3!���)�*0:����]��W.*�u���l}�-��������=����]��xToK�O:�,��{q;y���&9b2�c=��b�E���2��������J�����W�������l
������=��g�)���������t����R{t+�H���
a+<�!�9O�:���O�b)�
AJ!Sz�n���MV���
u�d����"��l��������u�����i+t�.�Uu�C;�(��T���/}8��h��X^\%FPG�n����L�sZ��N:����`������n��hu�q��,���/�Lv��Y�]����u2X���t���$s&)���������RjY/�Q_���N}��}h_�.x>��CS��~�a���H�>�Y����d���8Q��OO��2��	����nU�BY��FZ��R�2�D������
�|jz�|GGG���o����3�����^�����b�;����Z|�{��k���~�����?����7e�����
��3��A��-xG0?�B��
��r*�o�U����G##; No��|W��.�5�2Y�_����m�V���p0@�W7U����D�0V���t�1L��A��40F0���%����_���������������9�*d:u93�qVb�0IsH�X��:a�!�srz�C�,H$��2G0���cV9������YY�8_IE&�N���Zo
���t�����w��q��<g.�������G�N]��$����.����I)L�nnn�*#�?�w��.��F(��+h`:��O�u���>�#��5n�(��us����O��D������r���s#O1�S��o���os���Gq�h-�����#�f���]���s����MP��q��^oQ�
e��!H��Ikc���i�A���M�������������!�q�qf`4`��K!>���:e}�7���J�o��5/~�<�AC�:�@IDAT�����P�-E�DFv6(�e�p���?�&�����Ep��R�m�{����Np��=�� ��Np�N����0x���pF�R+;��	V��:?�>�uCPa��}?b5�^�3F�r|w%L�h��p(o��q���L���+pJ�rB���3^��}��_-���
�3�0�$��x�.u3������XF�{<�+���Vy��<<��g\�}_�4{\����3\n^���Ob�h��n����HW���wJ�S�u��N��gl���=��m�fr;$;&'`��f���s&��b;��y�?�N�9W���U��%�i=�]�g�%�����t/���`�I��W���m;��U�r��,�����JI�����
2-s��6">F{�|�'���W"�zx�W�iM�_^r��!�����k�h�T�H{���v��~��x4<+~��/��8(�,�>�8J�j�	w�lb;[�FZ	#lY.K�z��j�_�g���������x�H�OX�3����G���T���X��@
��-�X������V
@{i�&�GX��pJY��}���\�����
��wWjh���g�,��=y�dKZ�����fL&�y-	�0��z0�}���\��"9�q2T{3��5�'��AT�#H�'q(������h$���!�P$�3	��fY���������E��������Ku2�r�A�����A�����U��o���g�:9k�fN(��1Q��-vx8f��;W��u��
��wU�+L���T�e���6�,:q�:<�Bu2V����4i<Q������������)�� ?����f�4�:��t���r`�t��g���������(�p#t�F��7�P-S��GLw���Ix�M���A����Xl1-����8��7�����	[lq�jL�/�tl&�G^B��C��R�~M��^���uA�z�d���onG��K\���r��)��!���A8�B�B;Ig~N���ms�:������n���,^0��1P���g{��e����w�~�c�3J�t9��|Y��1>�$�q<�N�;�����"����f�����9�zV(�/@����!���/P�3��
���vy�Kd�9F���CgH�c�r�cf���l��a���|�Q|%�+<�����0�E���M�C��I�
���YO���n�P<0l��R��r�`�/Yo��~�gj�un6����d��	������g������c��UA(3��b�4���p�p����1&:�0"%D����+	Y�TQ�+��;���c�uz$i(;���u���M�P�Tv�����*�ou��5�+�\1e�i�����n��
s��X�aL`Hy�F��#�u�K��q'�������A��Q�M%��@���Q�8����X�}5ya�<�{5�r�����Oj��y'��D�?����j��#O�[lG��)��&�C���#����p�g�����?v��[fub9t��z�^���fRaq�wj��X���/��M�m����n�YF9D�4	`O|��T;��=��RA�q�b�#��1|C�H���x�>�m��9�'�g>3.��q�	�h������8��E)J#�|����Z����A�t�cASNc��2Sb����y�r	��}V�h�
��-'��
��I5��.����D����v�xKjn�u
�%�P���,rQ'(��|,G��D�^q�}�Q����i��S����:dV�u���1���6�D�1�<d�Y@����p�g��������������O�I/+�������l=�5�a�����e�����&t�����q�����WY�8y�����g����<��W$^Q���/m��3���& �a�:A�q�8��M-����F�a�I����>�)'b��XW�_��N$��2�J��,�e�3oo2���e�����c-�
]���MdK8k:���m�������{%��<%��l����!�(q��"�bN%�*����&@���������_�U���
S6�h�7(�����he� ���b~�m�k����1I`�uB������|�>������a����yn����3~�-��
�[c}�~��C�g�3-3I&��Oy,�����4iE��^b#������\��N#�W�C�l?B�����Y�;Te����D�W��N�����&�c�e
�H�+��o�wH�Gc�5�@[��{.S*�l�`��N�w�!E��Hh�3�H_	��8���}���~<Nz��R�������ttO�A����V����	��yG��+z����k4B���o0|<l��J:��,�A����R���d�Y��f�cw6����DnG�H�-������5�C@q+����� N��qc�^.[�������2���6�j��/Z��"����>O�ma�L�6���!�6r}��/���aI������/���L����z�M�����go����t>��Djfd��|,��]?�X�8���=�Qa�UJS�p ��=`����Ue�g�lwsn�&&�d��!�c���"��$���n2��/�V���k������0!Y��c�<��\��;��|�EX<c�����-����4T������p9;���~cn7��A��XM~l��d�@#����WE6�������W���(-��i�������:��0��t*+.�J����s%�E��(��vT��Ea; jWI�3�C!�{Ta	N2�Z��J�0:�G���:���D;��8/��g�q5i�J�*��(�}������%�2���U�x)�����-m�K��NH�"��vq2�����+'uR������1r���Vr�{��2�T���l��W�m�T� �ui�Eas0fA�y����M^	G�?U�IiM�"��U��/���X+#e_��1o��*�������r[�t�}���[�Dg�6-�v��������Yo�Dfth��
�`�f�S��l�	h�)�QXl��2���6V�&����_�w�=S�S��{!m��s��+n&��:��]���i��X��P{��d��Z�s���d������l;H8�)7��-�v���r��� #$e�S�x���<�I:)���
������=����N]�R�eL<d:�l��a��t��G����Zu�kb�.����n��
���NVI�����j��)������K,%\I\~j
���KfL���[��zMifs]��n�����?�z��N��
���f�H��G�&
���5E�Q��M:�dh�3�&�"������i�J�����w�?-��<)��3�8;t��&���v�
���}�l]C�	����Ym�[�v�E���}�c����-�u�tpt
�DM\�<ip��V�=�g��f��F�s�B�q��:����.�����-��suxC]`*.MFK����[�0A����,5�a��QA4��ie��|xR�%O���B�G�Ic���A���<��m�hb|�h�����)MO`�5��������'|����d�I|
��[<+�A���g�3�CX,(���3�K���!�I=Q�u��]��|�;8�lz�rx
�Zt��^);��6J=+%;�"��o����}��w��i5����J\��������Q�,rR�r�����U������L@��[�<�{���}G�\��L'�;���"��0����@�L*�����r�����a��
�<��������"�dd#w�':�E�z��O���f�2��1j����tt�z���� F4>c��?��;���( ��������#�����-��j�v���[^�-k���:�DD�t��:R�����@����Yu��@���(v>aZ���Z�}@�e3O�l+���Su��l_�=���6��]�Bk�e�pJ�mW�$� ��|��-:/
j^J�l7����K�d�5[2 ��?����:��X��#�z�d)=eH��M[&�5��3�H��gy������3 J��Ox#(iF���~�>-~@?�<`�0`���{��w�o|�q���;������d�/�d�A���@e������sfp4L�1�T��F�m�9��U)����(���e�n����I)@��[�s�d�r����H��<s�6'�� �����t�����
�wf��Bw����V���}����9$�E����.��f�O���I0r�������>���a�P��Gt��np��\�
�8���5��[��yT���4��h������D�|�w���Ju��I���^���6g�[e(���*���"����3\�\�E���k�?���m��*O����=�5h�W�������=����JFk$�hby�'���
g5��� �u�A��cV����zy��l�L��J��ze�^*���Q0��|�1]N}^�}���5|^-�&���!]��9�g�l;B�6�M�{���9f�q�������J�K���+����q����=����1+4<W��j/�kc����Y�)M������l���S�`a(2P���n���b���!�+����<;�������aFd��C�t"��|�Z<�W(C�� s��W
�D}�	-������H��VE�����4��rT]Y�[[/s�_�w��-���|�1��CN��r%���T����Y��s/��?B�����3��D��@�S����"���h�U$y�O&�e���vH[]�89����w�L�����K��_L�k\v��s��aC=,�V�G>��&��!wOdQ���+p���.�Ve�3������������qJ�l�A
3���KfI��:\\]�.�mI��=f1��l^�����FHa�2���V�	F1��z@C=�5qF��K]\��@>g��){A��gi.�D�q��$��um,�46��2I���:��{x_�Q�/bJ��d�8���~V�������������^��g�t�����:�%��mq=g���{�����^b����v���e�qb���7H�FQ�0KW5�8����|�W=&�f9k��(���U��n)]��!�/���5I:��*q���{w���>g��6[n�2���t%X���Z��[~�����Zm�A���Yf������Dr��{U�A��c �oN�Lg_�r�>z���	c�7B�L:��!�P�\�}�O�@���\y�xB�u�����"���"���q�*�"#8��Gk�,w���$l$�Q���(K7/��Oi��u��%��Nh�O2q�s�\�������X�7�]!�x�0(�����G'0!��9	};pj�@g����������xO���J�KI[d���!�}�11�����\�����#'2��Q�%O�n?���8��L�&�x��h�!��������E���o[Pi����F�IS��������g�z��pG�����B�_�/ 
][�7q����-�H�����
��L�T*��b�A"����s�#��[
������$p�����!V��?�>�vp�wvw�/}�K�7�����������]�_	G����Zv������3pw���A�teji���Jf3���4���i�����-M��S�|��j�*by��w1
j��������>g�8�'��
���k�tN����.���w�~hx�����=���d�����xa��2����+
K��O�P�:��t�|P �B�M�k�:#����wIV��Mh�BWf�4neZ����B@��������7��c4�2�J%Y:�!C5u��c����=�B�\�o����v����%������TB��������i_s@��p����@���T�����<����t������K���-q�����[�b�,��>I)�u��I��	<\���pQ.��m�V��a����|�\�;'`!�	�:n�Vq`�.��K�����(|R��S���8g �A��/�<�%_��v����{��\e[�f�����K_n�K:�s�?Z���o��|��J���Zm�u+�:Gq����n
��{6�6������[�&Y�w�Y�9Y(gfW�V���V�3[p�AB�4��,�#�&��Z"p?�E��zI������X}����3)�xf��q��}�4��=�5$g|��~�+��m�X����=g��,c�&%���m��:�1�)K���$��^
��d�;#{����r�g�-c��+��tT����g��T#`���a(�^1���3-Sf;��v����;N��>D��`���?v�)
+,��n'���6�
�j�Y���%��/����/������C�4���R� �>��*�5	����BM~����I�$�M�8���|�i]�m��L�xxZ���V�U\/K�����2\l�]F���f���4�5h�mV�m#�����7q�����Ou�_7'o{�� t��^V�A��q`�u������"�-��J^�_w��$��0�~2+M
����z�%�J��C���d��P���7���#/�����H��N���tRO
=��\5�V��
,hW� �}8���3�m��M���>+_�k}�:�ZFh ��(���	1��\e^8���>��,����C�i}/��u��'QV�>"�{N0��SE���Was�l��x������$�����
mcn�6�?���l�`��@��YvD���6k��p����l���T*uZ�{�.jx�T�F�n���=C���|��v�~�\���:4�KO#a���I3�?~�MX6��=����N�*z��f:y�U���L�w���\�n0bE��,��,_���?�{H���?N�q;f��B�v2��1`��N��r.a?��I��M�(Kz��D~I@�}��u�M�=P�O�����XIW�`����S�T%�]�����f�T����e�R*����@�����iAXe��gh\�t�Dlwc@����G�)�7ZE���ulS4iC��c�X��)f�*
U��,k��L"W#��R�!��D�?���3+�>D����4�
�\r"�guG����,����d�f�o����-���U�<��� ����Lk,(I�gG����b�Y��^g�J
i#�
�9��������������+�� 4Vn��D	Y�0������Y�b�A�����	�� ��4�y��4��U7i�Z�r�:O*G�Y)��IO�Uyi3�������6���x�Y��R�f��Ow;�������7��aNT���e����n�R�F�ts�xD;��
���=���O0bM/���P�����s+=���5��jz��
���hz��F0��LBhZf���Y]���}~3���x^�j�\���VA������.
7����J����L��<�K6.N�w���_/��2���r���g��$���tN��-.k����;l����"�G:y����z
����l.c,�S�e}����<s�/����,�%���
��ua8�[K/�����y�:����Y��~Z�.O��9��.))j ��:�>����];�s��6�<�#L~����
�	&$K��G2q���E����.0v>�������2. 3�pa�1����iW����7���?p�=K����Ng��%+�)V�x��nm�C�����[�d�N�=E�7��k)B���#�dPH��#���aw�G\?nu���-��=������JF����@%��:�ht)��
;���F�v�}j{�ol[	�,o�-�D%�������`	W���.������[��wMy�e��g�]����@��:��������C�<�=�b=���-��'Z� �����,�E��a�m�������=A-��[W1%��<|����y��/h����8�]�g����P�nX��V���yT�g�%���
�>�
�J`���N�<m4*���������V������s��}V�`�����s�O�G�C�p�Ip��� ^^�d�t��v��N��;Yc�l^���������e�������9*�-�����Md�e�92�v���}��9x�:X#��xw0'�d��+�W�Y��B��|m����q��8�O���P�O6Kg�2��������/B�G�����W�d�V�-d��%�G����}B�g��������|���
���i����D9����1���8������n��.�s�������LIW�i��S��rNP��5��1��e����BR�*n���D�x��	�>��a\]c�>V���SVa���0e2�
�������x�w���w���w�u;,q�4�W�A<�Ew���'�Hoc�m��`�zf��"D�n��xN��$�������	��(�U������~�2��~�)�zL��9F��"�>	��(����/h�����E��v�������9g�2�	}i��/��'��b��|q�eJy)kV���n�b24<h�/uO[vw�Xqi!�	w��B8��be&��?�[�����<������`#Xmye�������v���N u���c��x$'�E������>g�>k��������Q��l+����90C?���5^<)�d���,b��,��<��@������0������/����������s/>W�������2;U�X�Hw���E������By���0l20�QW��L����?��A���*��r`J;����<r�����
o���Y��������;��/U.T�T@\R��1(s ���H�]�17�5��I�Zo�^��Q�Lg�n[��X��.��=TY����v��Tx?�����~��o������0~��l/^7RH�Q���J�������u�3�x���2���/AY�(
r��be8�j��=������>8�����Z|D�D��������	�l�C�{�i?���I�9�{�+��(�iO��M��5~�E.z,0���C������.��{%M]����e��9�4nv�e�X�<C�*�?�8K�G�f@����m,�3���(rl/������Q,G�G|�C�[lv��d�$i@��PN��������>x��]��X�h�6����5$�I��sH�E2n�I��7��3���s�l#1#]�5Q%���:�}Sw����J��&�8o���qc�P&A�)������LS���v������Ow�g��R��r��"4�'�{r������,�������R���c�d@���c��)�o�Q���f�Sc=C(��!4�����e����v����,��8���2��v�mf�����%�
���kW�z�pX��H��
v��8��)���0�l�'�m�ERn	d���u���@��6*�����<����|^��vC�1#����8u+�6�����|�2�/z>������|�~c��	�
n�����I�|�1� ���R�98�$
:A�$���G���R����V5���Q\�8�+��1���� 5g���b�<�KYY9M;|�@�������f�7r�
xs�{�������G��l�&�c��n��2��b�LJ�EG��y[qh,�(�:�����
��\1�2�3f�����6���}��$��3�tP�a��s���F/<�D�/p���3=i+�B=�#t��t�E��mp�w.�;�����d��3�C����+L���<��9+
s��7���F.!�lvV��By�*/e�a4B9�c[ �?U7���\��tI�v��l/���G�`�O�%(����$2����GJ��[F�e�'�On�Xu�aE����J���J�X��]G9y���mU:������[m��o�_���)0H^��7v$("��l����\�}�X��[6v�8_�� h��C)~�������+���\]h�~}�|g���~����Z�����5>�Z�M2��M/Q[�_xP����:)��x�F"=��n[��`��y�Z����v��~+��na�E��RF���A��K���U2�NI���*OM�F�"`���e����/����	#`;��Wd�+du�}��{��u�~F�Q�{=��>vV��T��!:V���o���
���]q��^��kQ�i�K�P�Sd!�H:K���Og�����#��4��K_���
���t��!x78����	��<sK|�h�19����7�y���5�`����&�:�k�c�v������04��BhcB���YH�<�������]�%k�>���(e'������g��Dxp�*W�)��b��,skCu+��\�N�A8�2y��t������Z
��#~{�v��Q�����U<=t�!4���y�*R�����������r��?7��D,�-���u�ml�R/j������(���$?h5���q���}��������������
<��/'�Q�&W:I����<��T��tu�'n)���[�0�8dR�������E��G����[�I���{���9W�����\���y�z�R���J�D�E�J��}f �F�130���)��'$��0:�>]eGz��g�=�|V1 ����~Px����0��K
�mT�b����k��a<�4G�&�3f���W�}+�){�{���#u{���*���@`S��L����"�T�k�P7��D��t�������D{�a�lc�� �[��z4N�<����c��l5�%c�����m��Ok�&�w����&`�F��e�i�s��$�a:����mo���bG��8��G!��fFp�_uvVu�( i&��Q��
��peQ��uZ��t>U��[�Qt�����R�N���5OhV1y�E�Jl�%�Uz���m�6�P��;>J�,���@j]��7\�r����4��#lc�B�-�vX<?l??���b��"]�/��:?Q���v�g���1?��-Z�AhB=�(�;?�_qWzw�]�Izz#��9��T�c|��+���a��Or�i�x�w�O�F�KN x�A� EGb�k�U��������aM:
n����;a�)��������N�}����}�
�G\��������0�R�����1�/1T
������Ol��0hT�#���P�2����N���(	m3(�� ]���������>:`Pf^��mP����
H^}����	`�!���������&����C��E�4&`����o�Ct81����1��OV5Vyr$�o�����)�r���Ns���?J�V���yV�YG��� �T�
��I�������$3,}Y��{�T��M��t�/�$��P�P#��.�]��*��������I~�`�<_��������q��)D��<1��j|_l�����������.�Y���������S�$EB���l��Y#�aS
G9-�����c-n������%E�e�UG�j���,���,zD��-���3�.A3^P����7�p�_uA_�U�n��n(�j�4h�k���1Y���md�<�U0P�-��Z�Y�1���7��9U�(f�7/R���-�?�n��x���y*9���]�B����q�9A��[��W��?��g?�s7�J��:�11zS6���o�����	�'n�������%���c���
el)�����I���{�H"�t�7e�s�X�e>��S7�1�������g�:��C��1��-���sBWp41���n3�b�o
&.%�L�=��	?R^��)���Zo�^�I'�� M�+�:��Qu�(O�iRA�!0M�pH��k{��V�AT�#�?eTqq��}J�����8K��
�A�hb�G��st�'�k��H2��4zY|������<�G]�X������������N/7�5�gL��g|�L�:e�M�����'���L
	�G���!���0p�^��!���<-&�j�L���_LuQr27�;a����6��A���L���D��7ng��t�-S�8���o�%�}���85{�2�/V�Cs�F�\%��V��^w/��H���R�s�� u�'��3c���2�YG�U�������u,�����������7����E'SV�%��T���:3hF����0���Z2dg`��9��l�tQ�������a�fn�A�D�_1���l���?�iQ4N��5�r8
��-����@a�h��|{"��M]>P<n�HS�u5�`�m��f����0����� �>^}`t��0$
�K%I�fUf�����.�cT��c�SVKf���i��E$���sM�m0��f�~��z�!��Y��wl��=�n.q#��tv�d_q��L��l�a�6�U\�=?�h�%8����plBO�^�v���/�����"$J��!�Q��r:D��}��>�����c��&�g7�a�~�+bj���xi�U=���a	�	�&e�����jr���IW[�tH1�,M������������y>�j*�����5RK���kt�l����G��W��6g7uQ\~Z�M��]��;�5`��C�<����@C�����P�y"@��w�������}���J���`���9�tD����nAe�s�n��U�;��@�0�����-����ai{a	����[T�e���qT��`W?$\|��r�:}v2�%��\��Aeb���
:���.Ae|�p��u#����n�r���i�S������n
Tq��et��l�y�A���5���/m�n
&��NN��4A�V�v�?h]%Ig ��?�S��v���j�
����I�dKv�wc�y���j|c5@w� Z4
����L���#��Zm�k�������P;�M0
 �(
A����z�cL����#oF�����:=�F�������?~�����#��S'�k�U�r��p�j0��g����xd]�V1H��R�����u��g��'�nk��4:YSk����8H!�C�G�7�8���5Z���vay[�����Gu�H��_�gr����>(��j�"����%�u��������~��W�\���r�I����{��!���Oi~F5&qn����u�u���\8�Bfccd�$�,�I�J�e�i�]��a$,�]���J_�Yt�{q+��=��qE���@[���hu���W�����������ws�����<�*wh�db��EL&��;���\�c��L�	�)8�t1��|/��\�cW���`�����h�E^�G#���h5^��W��t����B�eD$�/W8q���,�i���uM��#�S���)����.���'
�D�CH�1���f�
R�+�Q��F'F���d,R:��;4���O��2q�!��Y��H�giy�/h�.^�O���D{�����	�����W~����;�bAS�����)}f� .r���������������s�8g��a����v0��F3���� ���8�<Ed�3�5�4'��
f���&pe&���0G�F'��n5
���:^���rt=�
�`����W#�`mwu���X�1#���$����"=-������(����oln�������_��������>����\���=�����)�{N@�����|�F���/���:��(U�Ez�r/��m~t��M}p���*��xK��������(wp����Ffq<�?���9��_�(���� �D������ocb���z�jr�K��qC�ppHU�����$~�P��H��e$���F�F�Jq�{����P����*�.�e-FI�I�*h�P�U3���$4}@{�[717��������8�X)���U������E��f�G�Z��T
 AK�D������X��
���bFKT�/�T��*<v-!��'��@='�7/�W��m�O��8] JI��)lM ���S������)	U� ���j$K~kC���@Sm�����P����W���u�E�\~o�zf����aa�+�/���e:qa�g���`�X��W9�|xVp����'�����Y	��[���c�ao��#G����L�O���*��Z�UI����JFU�1��YZ��}��|GW�������V��?c{4���3��_�nC@]�2��q�I��������.�0���H������>y�}�2����E�����E�T�i�Mf�3�y���Z�Edi�����#)uq�V�'*6p� ��="
�$�{�J��#��*�"a��c�I�)3��K�����r��1���V1�L� *����m����V�����
�$��&J��A���2r�J,ZGhWw*�����-�k�,��s��>����e�4��$�P���wA'����k�7V�d\~�������D�t��r�4���� �D�%�H���Zj�NO�X��\�XD�e*�>Xu��5l����v���.^��~�:�qw�wD�i��~�~�rcw
�s��6q���a����������	�oi]�,����D���~�8�����ucGm���X�@UI����n��%g��"9���\)����	�j�L�Kzi����������r���Tz���w5R��2.R�'"w�k`J�f9���D�t1�q��<N%�4^i�A�B+�9���y9��~�P5�W��0��H.����#���X-l�{����;��F�r���c�� ��#{��{T\X����o����Ww�=��qF`�i������Q2#F���b3J�1`!�#����uF�"�!�l��M���w1G!�tm�����t����&V������SP��M��+���|��XFQ��e?$�qH#��\S����4�wtm$�cql�c������gPu.���I��x�D�C���	k�\c�p�����SGi�������x.�}��EW�}'�@�{��|�O]������p���Z�o�bH�r��cG6���1)����.�D���t'��5;��a�'��1/����������(xv����o.�q|rR���.=�N�
E�����0�l�A�X)�yB+X�CL�!��>�
�6�l��Dw42�4$�4��u�3����9S9�NO&�@��^��u���XW��r��g[9yM��]����`+bx��������O��zsL����������m� ��9`��?�M�*��4i+��
�;�����$�-� $�C#[�{�L��U��-h��9D�SUR�1w`E������G�~�/W�
'���btlbt:��*��>�1�]�a[y���+�����1\�C�����}{(��+�`�9�!hA_X��G��%�7��q�B�	]���-)����J)�c���x���\.��46��I�{�����Ge�@�=��3��gUG}��=���{����6'P������ge��`��(Se�6��i�e��W�c����#�2��2��wo�PJ��'��Ut'j�]�&���9aPI�0�2Z�t�i'\�`��M��Y�O�%j����gf��|]��!��N��^�P�K��:n�y _$�r��^r����1��xIk��h���
+7�P�sa�z�����)u�:\� hP4��T+tM��M�A��k�\�c����������uQ�
WG�v�
�5J�b�ML��`q"J �>����?1�Z1r�h+����g���q�N\C��1�jgXLO����6y��qX�i����n��� ��!G�{Hr�as�RP*�I�g:jtj2>X�G�'e��9;�(c(S�<�PA`�,<�;�Q���c��+�����U��^����3������yF�A|S%�1��gf�L\,�T��������<+�dGO��?���Ek�
wG��|O������1�t}r�yr��������� �.C������k��iJq�6�I�D?I��92V�3��Et���kT�bR�����������_*��4(L��9|��B��~��{~D���/��5Rv4 s�8
����q�L�&��������CYw�	�M��3����	���^G���bA��-w�@W]<B�m^C�:N�dV^t�o��Y�&D���)e��l2T��;��.�K�F���!q~�5L���&���k�d�Z�����B���1����\��B�S�����=�/c���e���?��R���2�>�����Z�@�L(�e�x��O1aN�l.b	���*�9���c���;��6�#��E��!Q�)1�!��/�P�YY���
�k�=���9e��o���S�������"�)��.�{^Vd1��i���&A>��uR��]w���d�=�~������s����>�Qpv��-<�o���!������&�tni��&��9�J��#�1�J�05�KIYG��:=T�6r����@IDAT����4f�Yd��^R<<8���KR�|��Y�o�9��������5D��%-�����H)~��18]��)����2b���=<{��w�q�k*��������zu)�?�g������������>(U�l�o'��5}���i����u1�
���T_G����R���J�!������q(\������&�����;�W�T��f���-UQ�N�8�5�ut�ADa��C7���w{���Y����Xz�B�� �+JT(�Zy�h��"�?�yS��kX����g�U:�T���[w8d��N����0H
S��)�>]�5��V��3��by�|.]U�B����g�i�����`DM�J%�;��n��g��;d��FA��^����m��u>E]���B1��[�x*.�Z�Si������'U�^�k����%-������u�zi\V,�_dZI��0 �����!�����s��[���!���e� e`���&�x?�����N�*8�~?��m�����!D!@�v��\l�d��<��f��8�.]��w����|�!���������DMe�����:�s�Q���|��VK��S
���������}����x�c�5W �x�/j85���q>�=c!���Y����i����%Y��dk���]5}\�mr������� ���-��������x�8�c������w���V��w�Pc��[+p���
w]'����pE|�j��E��k��j$�U~�<�����	�3'7 D���T��+gV��"
�)�m���A��)���w�>�3���s�(�;���H�bh����	]��M�4���A�l���m���=/a�%c����f�X�7�#�]
�iq���y��$��
j�<��zS�X�_��bi��:2�dwCMe��L�&����������!Qz��N�����7������Q�"�	]da�h����\��KEu����q��fG����lp 59�)��b��TZ�%�>���+eQ�G	��uQ��vji��c�;�}m���[����Q'��2\"a�ue��{*�.7�F�g�2?��L���N�3�9{;�����������:�b�n��M}��F�U<�x�]�(p����e0 z�)m�bH] ���2hD_���:���U��B`�r�@��G-�~������"��Cg�8���g3�����X:E�#��wp_�O�?qn����7�����eC\�#(��N�"
y��K��	��G��l�?H��C$s�Y�4?�>�[���{���*������b�>�0���s�v1���������V��@��a��;��R�h����I����&]pLsEW��P���� ��g�4��q:���q��j�0.�9������rq���1FX��[cG=������#s�����U����WY�����p
�"�v���,���.:����S��S��|�2��Q�%�&�>3�>���+_���(T!�4���?��r�{���#g�"�����_v�My9�����#(Kg�Y���36�H�����C����3���H�*9;Z�hk�M�����>P#�x��^�)��"��QYJ���*3�W���/A�;��g���@a���6�	Z����V����9fd� ������O�����5Z&|����9������20<�y�@76:iP����W��[so�W����L.�1O�b����KG;5q`j�_�"w�v_�N�#���X��+���
�ri-���$�6��1��^���@�i��dd�3�jtBm�'��y������+,�rc�s^�}XupV`Hbl]v���kF�.)���f������!���i��s�(��;�B���M���6+Q8�~� ]<���j�
y\��f};a[������f�����^�O�R���Ur�,[���2En����k���~���{�������U�U��A�O�a��G�_��?k���;�@&-*�
o2r|��v{��,�2~K�
+2��`�����c�bi_(��d�6��3CJ����T��$�]y=�w�*V��)��@\
����>B�1U����	W�V��,���u��/��>U���)�w��Wv��[�(�4����\H��9���i�@K~������G��0Qyy�*B35y�ow�V���8C����v��V�}s�#R2(�����������U�n'y�|_h���tm�����,�������gR�qf�R�4�Ra_���Dl�@��ejo�"�p��kv_>b��� ���Au�(�"n��%oTxB��mh���VL��8o	u���iVX��%�g�� �!�r����j��<�|�yZN��\�6�i~�17�A|�	8���c�x�%��e�2�Ez�?}�q��FC� ��������1�e'�Q�,vb���g|���H_�>��z��4��~��gyr��`r�C7�?~�m'-�.a:��d�64������\�X����PJ�������Az�"�(�"� �|"��>^��v��MRy%o���1����$|A��h���6V�5��9��B�<i�x�.^��]��p��_\7��W��ge<���D���� ���\�"�R�L��]�,��6��r������!�^������/N��S���-�k�1��'����LaL�v�y����
�#������!����/R�ol\�N��kx�2�&M%�8ha1l:��ml�X�2��J&�CE�oz�=��2���U���>���ds�4*Qw������rh��Z����E���g�VN���\p*����T+/a,Y���itTD��g<�����U"xdA3��������$Vb���at�C���b��m����KZ������C���|C�y+�z��]����,:��$o�$x���&WT�aL���7����u']���h�)*KP��gl�_��vH���w�>����W��0�_|H{��&�jq��������]�`���_++�#�)i�e�����L+���5�@��g~r�"�Ka�n�EC�e0������� �����(|���s�N.�O�G�A�7c�9l�������2l�0��]$��.N���X������]�
P7���r����y�7<�)��6�]����6� N0����W�z��tI%���u)�%<��O�)�����
�������=�=��������������lf|D2���Q4�nF���Q��������2�������I���;(���%����Q��db���Xe�;�,9����p�O=\�B���@������\���a��\������&a�l{�&qW���!�[��g�-��XC�r��_�M}�� <'���FEk��J�i<�z���V�`��D!���U�G�MD'�!oF�A0�aMZ)�0��aI�6��V���|��
���8��z~}�[���M�+��J�;z ��a���'�]�X�>n����F�>��fpu�!qW�uv��-`5��$3"���P�����������M��LbmRn�URg(��T2i������
J��OW��t����p����"��D����F���`��A.)�����^G�QV�������Vp������'+�j2Q V��O���57�d�a#����� ���8�J�O.w��
O��9�^�
{��8�>u�"m�����zZ���� A����T����R�/�QV���9�U��8�+��A���;AO8��S�v�w��g�92���[l�8�g���T['U��=����\�9����&��Je�//���w��y	E`+a��R���������/7�UwV�a���6l��4��zAw�\������;��:<�����5��rP�f���m��~���� ���W�����e�n�y<�����10)�}c"���4��H��/���K�bVb���o��\��kJ<4��Q�'9�^3��8 ����}��$�\��NL����h�;����e�	�|��5h��FwRio�����N�c��!9Cf���4�
���z�0�j��2������QWWf�z1#M���*��
�jz���^we�c���E�t1�;��}�����T~��l�[������c��i.��g���
����:m���@���t����m��������oM+�d#�F�#e0���~������u�>����m���q}�o������U��LH.�m����f���e�Z�������C�h=����2(���a�yNF��)�����|������Q���*�*��y����)�
�2�q����c�p����;����eq�gIF�(�����@���p'��p~���������n2c�8��u����;U6�P�h�|9d~���w�8�
��C�B�6|6c\�����&#��I��Y���_�K*;�eB���waH��^�p�zV�R��-z3�����9�Ns��g�#��>"%9<���$KW�)\���mQ��<�G�
r*��d�l'� =mQ�a����rxr�:�*����
A����zKS�Z���isq*�	�9O1G��\�1e�����$��o�ju	���;�������
�Gs��mp������3w���A��;��xZ��M���lm�Kxg�T"o+�M��?+a���
=�6�,3�Dyx���{�@�7�{��K�2"/�|�oxCZ�p���� �����q������HO:�e.��hkt�\��0:�xg3�����+VQ�j�}fX��A$�G�����F�
�
�RMv�Y�q�����?]`$��o��p���d�����3���^D�3;�t���204m��9��������[���6��2i�45]��3��*N���p��3��5�[�;(���	�v���F'hL�0
��Q2��R���Q�`���KF���<�rL�F�l\��+i�I!�����`����m���l
�!\��;�k�����������	��������X�@a���s2��*��#��o�<k���j]z?��gS�0��6��! ��I��<�I����s2��T�v���b�"���Yx��>4�5����EO1\�����Kw4��S F�	-����x����2�<�.8�U��;p��*�����}��kCt�,���J������t�����lh���^����(����b�v��{�G\�#>_�o��2+�3������G�k�`�l���N'�1����6)�H�=oj���]{u��?�f����DF��B:��w�1��������cH�C�z��>�n�����;�I�e��7F�T����?��o�A�U��)�Sz�p�
/U�!����*��V�$��C2�M�(Q��,������h2:�#���l�h�����4�o�}AC��7�r�."TL��,�9+��sb�7�M�������
���U�~W�0.?���|�Cp���0�,Dr��-��L��F��=��zv=v(��3��=������J?�ub|+?�T�<r�I3���b���y��ol�;�(����~��!}�_��}~�>q]������t���}��@�P�e��5ik'�����K�u�M�#�|�V��S1~�"�D���P�t$�<]�}-�-��TA+�c��E����J<~�bt�q������'��=a2��yb[4c�#�\[7p��1��3�9^������"�����3�s�~�Cf#�\2�����*������7.x58W�T-���GH���)��%���w�\\�9;��EY���~�S#]�L��.�q����S�&������-i�����|`������2;��+2��i��yN���=�|�p4_���'�q�b]3�!�D�~��D��[�����vG�9���������:t���]A�r�x[��z)���y�]
� ���b}�����h'kz)�����pu~���?v�������_ (�+��E�:���4�����Q��b�R��1�X/v8�%i���d"��,�]b~B���E���`3��<Fv>a���<J!hZ�8���s�;\.��'�����Xd:�����7��<���Q�D���/��z�>���8g3(��I��c��iVp�;()dEW��2�.�|�n+(�"�I�7xW����L���<A�?���P�0Qn��!8`�
���^���ov9�	<�0������G�xb���C�'����>��Y�.��0l�����1��4���	�@���5# ��`�f!�qeQ������l\8pi����h��z��v��d��d���F��z��{��F���$O�w��ZK�u��9>b�sd����u�A�p?�+B���7�+=�`�e5��-�i�5���=��w�J�=Vi�Q�$����!�m���p�����t!���e�������M����_������6 �� �]
A��RV�<��g��d^���S��^NT��.8��u���!�U��N�x���uv�Y�SY�}��@$��.i��hF�6���T?�:��O<_IX��W��
�Y`����������|X~j�ip|���Y�����{ad������6V��(��\e���0`�X�DScR����t�B�����(M�'���F�cdYa)�e��G�}c�c&�0��&Z~I}��������;D(Q����J5w?E��G#F�<ap��F�U��������#���������&�{'���8�n2��<m����.p��;w��\'�#��
+S���
b�w��'w�t�a���X��|��I��O��"8���5O�zv�>���]��-������EjVI���K��0)
�"��/�RF�i*��EZ�l�X4��7�������t~�������g������[?�%�� U�g��"�V�x��������zD}�C����]����������f��P��._��W�Y�����yF�I�y��`�Va8����.�=:J,�*��S��<�lB��AS�vW
�\��qe�p�
��`\����F�K������i2����|��g�F���%��@������x���lPNr���j*���N�0xR�8Y0x�����oF��T���d�����������,��k�p9d~�/�pn0�	C����B�N������9��s��e������[!R�{SLv�����I�+����*q��]P��������+��s��Y\(�]�K��`�UC��%�F}��qcr!8�X���V���3�)�O��Gkia�o��+��R�]��"�F*��[��8�(w������eM$K����,U�	s���<�K���9�)�N��)����d���sN�_����C��b ���Ow)e@���1�
����q��e+����Q�[>��s�J9x;���`sF-�
z�vF2M�6��������^<�+���7����6S����K�2sy���E��������lkPB����@��5�����3�������6���o�RK�/3����o�-�I7������3�����NJz����u���!:\����uy�3�-�-��!<`�����!��������F��������@4B�ve��	����SAmpz�E�)��
+�Gm������Un�<e`�@pl���g|�::�G�i`�[Y7qE�-�
A�!������`��%)+�q���2�sG������~C��
V�������g�����o������}>O��������<�n1�$��7P��������!0������� =�6B	�.���`w�l�o�5�f�J�J�������L3?*��V�T�)S �H��*�7���
�����������v,�v���.*���+������\�"'`��O`�!~\�;k������D\n�3C ����9�
&���J��	���lg�8�x�@zm C�&X�p���Q��m0�v���$�J�k7�>Y�w���)��+A��.D�9rM$W�� �zV����at�]Q������g��{��m&z=�I�H[f������M=��t����g�L��F�N�	N��l���LF��������E�pL�/0�'7f5����|�J�����yg�Az��L���?�OE{�`+�G�e�\F�N'N^�c��O�c�Yn��=�~�x��R�*�c ��`
�`q�kt�C�.��nm1���=,N�{y��������"�5B����������-/�����6�F>�=��.{V��4�0�!�j4� C�.+��QD�Qz?�'�H_N��+�(a��_����v���B�*����('�,�[����Q������]X�S�������
L�	�l +t���]�a~��'�����nv�[�����f=wn��4��P�����{�M-[���*�:�S���XN}����U"��7�
�����[��m����Z��y�<T����� ��o�qb6|�b����J_6�b����w4���v�H�u������+?<�j���1�t���.�4�&[28�z��q��r3?i����Ss����Y�4^�����Mp=D���������"":o�������8��t����.����x���c]9����z��,���aw����p�L��=��yAC���]<^+����9r����a�9�4����8d�GC��I����A��x��8CXS���Wh�x�t�W���4L��m�b0
P���9ZD��A�7��1����K�����4/�0.!�4.>�������+Z,���_H')y����2�:�g$�'|����1���B�b�	}it�M7u���j%����i�FX�Az�x��a����z�+�*u�h�����@��G��h�X8R��)s�9��
AT(���������N��N`m}�VW:����?]�&�%�_������k����/�/�v�6����~��1 u�vZ�,�o�����������T�J�`T�Y8���L�������Q+\L�s��M�*�A#���Ak�</i�Q���x�Z����56��%�
:�[����R�6cp�'M�^%�9��������r�^�%X(YT��{~6�����f�`��P[�]?�/uz����h���B��%��w����i�}����-�)�K)A��*��8KBqD���l�(��4

��?����������8��3p�Z�A�����F��W���@��_<O	�^�3l����d]�3b�b�Kaw�](j-<2��qwm���e�
��a��0���;3���>��3����=�������2�j��Y>/�_=�fE@��AN=�F	��7�\z�LW�r���f ���w*�O�����o��o�d���f��8���6xB>��|]��F&�:�MN��"�F��"A��W�Z#�>�L4���P�J�����x�@��f�P��;�
��,n����X`�N�gLlpd��	'�iR�"[�<����[$�8\�+�6�y�� oC���]�MD���ez�Y�)s�3������b��r���=x�;�l��f��+�J{������>J�9��
0q����|�����0���T��	���E���mEI/�7�!V7�k��L��LT~��-!�����<�W%@�@�����q�g��N�X�P�@���@7-(#�2[�q���.�V�P�D(�s�w�������j0�I��)pS'!+�F��"VJ���/l�����c�g�u�a�M�C=����,p�t_�#�o1x��w'�';�;���W@��)�_\y{�|h�O�r�a4-�R�����������xAI�K�]����o���Sv�V����>�_�����`��I��������&%\��:<�?�Vz)��5Y_�������cv��p��L~��"7�t�c.;;��,d`�O���S��B�U���	r�.���^2`/a���3��;�
s�%��_Df��Y�<E �{������-�K�JsX�7��@�ld�5������dc������������s��2�b\��=)&rE���_���<_p0ve�������1��}�(��$�2�n#��N�-a���C>.�RV,k����!��y�.�4�i��!���
���<������o��.w�G��)��[4�
�_� I���c���FT��- ��C���4 !�+>�\7������c�q�
�
o���s���=D7���8�R��tw�(�4���z�m�`��*OeZ�x�E�s�����$��~����S����:p�:+8�M�E�,J����
����{���~����������<+1�������[���j8��������e��
���G�5L ��
�	�qq�C������<�(��1�&���s��W�Ur��eS��J�'
�8!x�A�����Jy��e�g�8S`����=����k�����(5����]��^0/J�1��`I�'�y�|�W�$;|;@�h0���+E�u��$��}]G�A*a��j1ON�Q�[		��Ac�����'*��1�N�,��L��R�d
��M�����3|���`p����'��h��<$
�r��P�����
� 	^����J�Z��6 ]�)Tj�
�M����c���J
8�o�"�T��@[A�����n;�p]u"���3��g�U������S<���=*�Mt��2}ST��v���W�>����'�d}%��`
N����I�+7�����c�
<qNQ�t���X�(7ex)V�)��5�S\��*%��0�����L�z�j�^��MX�5u�%��E:���W����>CS�_!�;bA�d�Z��g*/�?sp�;�7YN6��J�	)8���7(����b�7�[c���M���������,��<erf:�w��(�_ms�������y�WoFU�U�?�y5�u$�|�,T#P�I���J���5�hT�Ui��|���s���YW����2�1�&n�N��������KD��_`-��-�`��$/� !�J5�.�E��A�5���z
�_�v��j%�2{�;L:S���rsW��^(��*��i��/q�R�`��4*"�����N::u�������4�l�����%�,-�5����xk���ef<Jg2��
�?1������u�o����i�1c�
r�ch���N�T�e�M�hC���
�m�ky��[MI����3%L5��h�W����]��rS��Rv��3���	�%A�~dO�'��kb{��ZO�d�u��L��ba�����_4i���I��9_yn�����������u��
#\�9����7��b����
�r�cZ�� .��k�C���u��ur����k�������y��2�._}������;��	�O�Ca/d&�2�n���V8D����
��<�(3i:p���0Iit����Z��,"j�e�[�j���l���+�C��4\g��rw����)
�H��s�;S4;%y�4�S�I�3�]?"&���&jw��r�2%�qy�����y������W��
�+
P���-�c0�p����g|8t�'����;������;,�o`�J�>����#����D��k4�����)qw�y��F�1��Q��m���+�P��g�l_t;���q��U2Mj)^����#O����U������H��	�1�E�o��_��O��X���G	O�qm�!�5��i�����OX�}w�b>`�n0�I�nr�sep�/���2�P��L2|�2��;�b���>�8��1��9�9���"V�n|�Nq��J�]�3��`���g|�j�}_�S��f�-}�"���������XN�JZ}?�q���Y�&o��\7�B�Of�
E@S�\9e�$VI��N6���`�z�f	�J��~���K�6t��fO�L���*��
���Aer�V}Z/��_\uN�N���/|�R���?�"�"���n��<�6��q�����v;DR���)����y���}�������<Qb�4AQ;	��K
�-|a��\u�����(�5�q,k�!��3���G/yB��.g<�Uc�����/������:�[%`���n2co�&n��`��1W�E�v��d�]�����	����?ME��)��|Kp��p������.�">~���W#�F3X�2�[
�@�I0�<�rc]x�2�Z��~V�X�rch���]�m����#���3���
^WY�`8pL��O.>�C���@\q(�����n�_->F94�-e������S��q�7�b�3�60>o������1&���#_�0m.��n=�H�rQ\M2z%�m~�������v��4���g������������-`����G"����,����,�2�3�����b��������~%��(�(Z�����C��:eQB���14��r������0���X1<�d��8�����w���]�vK��������|��Y�.
�j��F�<i��c����H�j���D�!/3N�Y�����&4��������;���g8�$CJ�����g{�����|�{�>�tu�������WC�W���o��$�[\	�F������1�1����l�R���N��8�����'�6�>`QDM�9����z�V�sw���Z"��Z�:g7��r�����5�XTP����r,���3��P	Gw��������v�'=�WH{����rx�|�|"��a�}�b�xG!��q��(~�C�~�;�W�7r�z���8����i�����$LDj{;�r��r���.p�?��y�	;�44,�������|��S�E��{��@�74��)h|�LnW,��0�N��X ������G'��h�=��#������(��Gk,(�7{��/��	��K(��(���6�7�(�YY�<.E�1�����Msn)Vi��!=��W}h�Eq�?d���	�<���OzV������w�����{�>��\��be��|���B_�` xf�V�/���B|�Q�u��1}&GG��Sa�z���6�S����}�s�
.��2���^9d����M���=�k�m������������w	A�~Q���b�*�|(e$}K��g�m'�P��k�q�cv��hm��o�\*����b���1�r�z�����"�hW2%��^9L���6B����x���^�tRa�
4�K����G��,�Em<t� ���i�0+����/����[/m������y���1���08yD}��[:Gtp�mc�����6��r�R������eh��iz�:Ae��&GK����I�s�X���O�~�r�6�n3��Qzf���\n���`Z���1�YCMV�2��������7i�c�N
n��pO�h�}Qu0K����
��:^+H�g���r���&l3�z����C����C��_�{t���U�Z�g�����av���o�gG��e�u�D�v���P>��������x%��pQ�.�ub�e�]i���6L��F���?�]y�iI�p}��-AQ��D���a�f����&��Xd��y�f�nX�Z�_��<|��?�����83���������aO%w5e��\��(;�~��6�I�|�wV��<�	_�D|��G5���)|��:��x!�%LR:A���5���_�������|e����R{g�e����7�T�k�������N��Bwni���!����3�F@�^l9F��
I������xpe���t�x��q�����X�T�Vud;d����.+��:��A�7�C��g(�v���r��6c�"������yMO�&��.jR�q|��u�+!%�>��.��K��ca J�%r�/R�F�Qr��1~��a+�c���g�9�q>O�|o�����(/�%�X*��i�����C���-V��4b�M�$��`g�����m��<�(Z<���+��]�% ����2-��;a�j�7<u��N����
����%�7\��A��c�t��= ^�W�~��f��t�<��	<���d������Y��D��Iu%s��5qq����E��41�1j�������Oq�w�B	��z�E�x�����(�FyR����!���Q�����H�A:P����L���;�r�,�d����ng��KI~�0�5��t/�q��n�bI-���b���~`��m?*�@G�LP����1�����,�6VY.�v%#)�ly�=��WM���mr�����)s���������;
��y����a5tW����%�yr�I�r<`8����q1��gQ
��u�Y�H��
aY��"�����g�1l�f��<�w���(���Z�V�s<NiJ�uw/+������/��~���HLS�c"�V�M�����Xmw�,�6�up�##�� �yeW�rr�8,pc,m'�D�Ld�Gw�_
��u��C�]�p��g�Ie���6��S�#���>���=��q�1�`A_H��S<O]\51hj�]8���.l����f�g�-�/���j������9�@z�������=�S�R���<�oV�:��o��g�M�q�
����l���G����W����w��!2�`��'�=��/�-p��y��Q����$����E�����x���?,������3�����?��*#���4��kN0��c"���yJ��F��o9���5\�A���8��W�O�}F,��m*Y��~�"Iw������(�:���q
gz0d/��=�1i8F���~��z����J-[D��<��������W���%��Q��v8���a���d[�?=������#�1\�����9:1 0p���?W����	0��G��������� /S���FK
K�X?�1�@����?�4�3�T_�8~�P��<2�
���B�Jq�t5�q��Tc��w�w��j�����#,M/��
���p���m.���W���7
oU�A��%=_���j��l�|��%Q�2���TSz/����f��
���g:������T�������C�p
c�JH}�"�Y}�w*VC���g���.M��j������}�;�rZ)hz����^%o�qo���']F{�V2���}>����<�OnP�\X�t�+�q�������yT4�_���atb�g!
r<�1>-�:�_��G�5<*~�3f\��V\�*��*+C�(�CFG�U]��G�{nU����	�V��;�����i�s���k�W�9����Xm��;������W}s��D������n��$o����@��T�����u����<na�������5:��8�n��q��=-^�����vZ��_1Id5,m�z�����[������b-�f(�k��7;]&q���z�S��OY!K��R7��]��k���s��o�Uv��
�W?�=��?"-�I��2!)��E���i���9+�W�����@��T�B?����u��U������Yi���������{���cW8`�
��������0!\���=�iOP�J�M�)�Z��Q�u���}}�vn��-����x��t�9����njt%�6v�:�Q�0���~��M~7����1��M���*E�������9��J��nR��|�?>��J��})���s�s�{�s�+��
����1�(~�����rEE[+L���
��7��r5H5��-�
/���9OBfW�2����5��
��7�u��C�6�$���EP�����1m�w?F��>�4������������#�K�7�O}Tvkh�����0�7���<�>��'k]���#
�v�C��c���c�]:�3�E���8�<���L���n��!��0&������O��\AD����e���?�P�v�R�j��5��X������Md����(�\M��-��t������.�j��?v���scu���E���E�������C\��(�Te�W�H�WI��<�m����i:|�
���B,��R/JZ]4K��P���������5���G�St��D�h2�hz���^���U|t��@x�@ja3�����6�l�h?���p�;9�\�����2Y^�U�I������"��@��~���h(R�C/A6+�2B����D�(�[�k��=$<o��BAaN��V��^Oj�w���y�b�PF�����l_�;�E��-^�|Y����_�(&>������������������������'��+1w
S>��?�����_����CV�|�EY����q��9M<1���8���\�E��s>AV7ff�Gh{��9�(�@![��ad�E]��R@IDATc�8l�����LMI���Y���?������A�sh8�a8��.�_�;�n�����^4u���&+zA��k�pF~{����.^��Y������U����_s�G�-�E�sq\at�n"jxfv]����W���g?}XT�����a �[���Y<G�����]C���������vvY�]������!�>�j�����(@Tl���Za��������z��~��Y��jaF�>J�|��#0������'
c�BA2\��k���e�+�O�{�9��!�E��	���BI:���~������p�4*	�!� pwPZkteU~��1}7a�\".����!�j��"�l�����Cs(Q�-E�n6)�����++����ig

�S�5�a�X:+��������h�N��;��:WP�f��\N��n������0����j����g��R>�<�|��E�B����3��U�P�T�lq+e��j��I�f�����V�,��A4��Flb�W8��������S�����U�M���>�wF'��C�	��6�����`�Y<��^n���������ug��oqV,�C��z	E*��"I��C���%�,�R�F�F�$�(�5Z�7p��2��89.���z��r��}������	��Q2*����.����~G������n@�������%Qk����G<W���6�0�AW��SQ�F�W��&���Ml~C��&�s.k��Rvs�&��5���.F[�
�����C�X�|�����?5��c�`#�m�[�F�m�#d�I���S���b�Y��i���;b��~�sWMPS��/�W��	�l����_T�����h��X_+o�-F�M�qE#����k�j���<�>��B�XH���u�sY�����+���2N61����s�HO_�tpr}�����
E�K���V��{�oW����k��G���74��Y��nn���o�f���eL4��m[�1���:�U���lpB}���������O��[��2��|��$�>���7Q
7�g������mp�?�~]<b�7��B b�M���;y��o��gK�i���sk+�����&�����1yR���6�����a�C�+���cQ�Q�%9�_����G�U�����nWYI�	�$���3������^���,�t��
�RN~?�]��\��E"w����f��K����
��=x�8����
���
8&�&e�_W~�s�A����zqx�w�F��)��P~���.J�F�B��(���,��.�ui���@FO��7���)���-�o����	4�����P��N��K�����nc������2FF���h�m�9���cS����mY�1�f��l�^yi��E��1�@Ww��%l����<@�������U��F��Yb,Y]�?�yC_���u	Q�$e|��,SG��,'M�:����Y��w����(�2��l�V��y��@(/�\A	C�dn���^:��d����{��{�0������~��g�0������wXp�-<y���9f�n�3�c��/����&��'��X�V��+�(����_�W�p��#������1|8�[=j��&�f�t���_��s1�c��.�^��&���t)��E�>������ie���',��k1�V$l�dT�����2�5�%���RV�d4o%\�Uy1�m�!�A�@*C��5���1��.-��`�wqL7fg�\��e8Z�;�� Gv���]�Y������Q��wr�WeL�z#'w;�+�Y���������p�C����O�2����Q�<*������:/N:;��O ��&����t�F�������=OX��h}&���k�M���_��B���<��W�.F<r��*��`M;���Q�Q��i��Bf]Y��M;
.�sn�Z/-�QRg%��|?_c��1���Q�6��
��U&9��n�/V��l0e���l�\���c$��j�Rv�����,�r^������^����lA�	��g��6t����#p���3��!@����nB�1o��Z��4��6�g�}sh�m�����?��+T���a�r54���?�$������/��e<?::*(X�&F'�}�;�qMW�������
���������@�vM�����Q����+��������Tf����r���]�l��&�s�]�N��o�:ic� �r�}��|7h]A�6J0�:B�mT��.3��a�eU�L��*��?D�|�����c/8p��Y����qf}[����\���Ga�����������cP���l	�y��X����l������P��������&�TD�OW���K�T�p�3$#S�s��uV^�<�K#����8
��_�rF%bI�������%�����l���v�1Jx��6�!�|��.�R�Ta<Bx�`_!���
QP�Ko-���/�a���<�\}"����J�Q�k�������2
��0�qn
���
�����/7��U��wq^���G��H-�����:���o�r���(>�1icP���q������Da	�C���
�S�!�������F�L��J_��?"�'��q�x�d���x����)�Ux�����FQ,}��7���>�*��A�������JT ���Y�J�!��n�S�H� ��i��+�<��������j��zQO�n����`�R�y(m���.A]��hs��'���::-�:LJ��5}y��(�����~�d���E��#�#�"��u�|	,����o��&

��m���,��sl4�����F��|M���_-p����Z���-�Np	��~^m�W{��l��N�u�$����������?���q��5�9�
:?D��cN�O��K_����&����o�>6����;��.M����uh��0�\1�4����r4�&���� M�a��5n�F������7
��M�������R�>�
\A�:�]D���`����_�X�$���#KI��wb��m-�H;c�h�y"g�*A\�p���fy�Lh�P�����)K�A�l�#\`�����>w�Q'|y�0
5F�#ii�����Q'����n��4$?����u��(W����ZN�i_�Jy��Qy���mO����5��Y��'���f���8�PX��q��o|����e��t��B^���������
��M�p�L8��������`��;�G���h�0��=��`��H���
��<�=+Q��Q���p7�<M��[��W[�[�����f4����0b��<x��g����*�]q��l������������6��uI=�~g��KT1z�}���`~��TY������]A;;�����������u��Z��!�����w���2�X$����L=���}R�
���.@uv�Z�'��C�~e%�����*���C� X��E�?AVpN�1�5J�^���7o��X,s�x���9,|���3�:�f\�[�2�����m=���_���Te�X���ru��9_>c�����aT�5>?/>cQ��]���ji��Cy'5����O����g,b�%��	��(���7%�Bc%L`@���c��>A<����n��S����l}<fB��!n��.^���Vh���\x������B8�yy@������t�g����X0��P���jq���t������������kO=;�|�z\��k�!*&��>��������w�����S��Wl�C;(X�a)��}��P5���U#�?1�;�����Ec����N6W���1C'YIr��#�JPeD�~A��b��x���hs��j����n=<�C���7��;Z{�����/��?\�����^Z�q�e�`c]���zmr�J���*[�!�=}�r*#��A�vcR:84�+V�z�3;������q����I��x�������ZO9����u���=���]G����CR���N#*�54���N&PEx�F�X�Ai��)�����H���|�Q��t�AW!Y�(��iW�{����r�Y��c��H���v1Y����
���K��T��X�z�! �_�R��v���B�����]�D#r��D(�\�le�����]Tp�;���|�����S�u�+W��*1�`�c� ��������m��h�*�T�����(�v)/*`}����s��Cv�
X��9>&��y��^��A���e�Ab�F'�H�!`)x�K��#�#Ld��� W|�w1�i`�t|�$(��"]���fxf��
���(�?@9z��&�?wit�w��f�%�M��]� ���S2�	�x/|1q	7[���NlKa�n���������2�lw�
m;i�~����
���r���x��"�9q*�������������A�%�
v��d7�&�@�<0������$j�d�x��U��Ac��1��F�d6����
�r\�d����C�6t$�Q$��s�������[�}x��@:���M���%��Nlo��wg���O����7
pg���!,�!:M/�����C��pF?���.t�!�����k2X���vcA<�\��F'llL����#��m�?��6"�}�c���3$�����79e�#���0y�n���;��q%(���h��wYO�sY���S�F�������t%��
�k�GdC���$6'�}+]���K=������u��u���}�4Q5�-��zKs��
@���M+������HC[X�}����6i�`��\�V���>8���^�X
=j4��g{Y���~&|.������e���.�!��^%R�q��Jb3��A�����su�C+'�
����_��t��5�?5�W�WS�D~�z�A�t(�wDa��NKY>s������
�V���.R�����i��=����(�B�	<s�����<`��;�H@r����+��98F<�w��!F�?��}%
��q�_l���Kv��>@ZC���2����]5l�w>�M���?���D�)>yl��=�8_�w���K���������!'�8�s�.�AN���a����#�u�p�O�lu�N������x�`��/<�[�}�����T
G��?9iM��>�,v�����|[��eVL�������O�<N����N���3����r��6ig�k�\o�F7���9/["T]�gx'���|m�99HK�	�6us�$N��M���O �bb�$�_<�87��z4���i�b�)�<��s�>�l'�z�0�y%�x�;�x����R���[���$	���RZ�C)�K���<�+���`W#?<y��=b`Z���o^��R<~�8v=����j:=�z�E5��r�S���{:{f��jb8"����@c{�V�=
Vg��ZEq��#[���B���*)4�Y�Cnnc@��>F��������Q�*�Ku����S��x���
A���>x��8�*^�������:��L"<aC��7�����
=�����`��B�?��G_�x���=?��}��H1
��0Z�we�;����eI�q~
�3;�H�����_u��Oi�SeMA���S�}��?A	���h#u���W�I_8�#��2yGV��j���`��45l����sG�x	�
u���n���&e��.h;�cH�W��Bp�q|P�P���52'A(.I�o�<D#�j)i/�y�Y'���w��C�Jx��+(�����}�l���Y��)5pBC�<9�]W�]3�%�;�p�E����MPMA������y���3*:l��|jp���~P��ZY�+��m=5�(�S�B�x�-#�;������@Z��I7���KmL\~����m�t��oUhGUHO<�R��d	���rz��������L�#�I�u�*!Op��{i]U�����N^�^�
#��=H��k}l'�0b'*	�VW���+>�#��vGa��h�.*$�2yZ�8�^d����3<3���ye�����q�7�\|�m<@�`��������z��wp]�t7���O;��'�S���u�	����hm}	liW�mz��/��]\N��?�j:D?�!��V�#���2�3piP��sNA�"+���!�x.]��2�48�+h�'[4��c�p�P��r����6��(�y^}$�IF@���R9���c��S�k;�q	��~�7��x�!r^����}_�����7&��h��e��7o�D����e�]f0$������/u��E{v���(�_�B���PEK���1�*[�XR��q�E���-�?ixv��b&b�k#3@?��]����Ub���U��i��2�t��g��uaV��5�V���X���V{�w5hd����RQpK$r��~�,l{��f������I�~����S����-�[?�������P��j��S�����!��`�Q|m�� �<flx/��
	�Q�?c��#����b2.;>���Q��[��q�b��l�����}k2��y��B9p�����`R��_���PS�*��B����:����V�f���M
v�6��a}�������&�_,]��wYl��a��2��KAWo���Cpg�g�
+�*�X\�`
#��@�L�Y�N�*I���V�6��L��dNAd��>F��g�U�W5xfPc���6�s�/A�t��|��/M��g��
�U���`S?a�	=g�[��s#=�9�����[�@i��g�9��.��������B��r��f�GQI�9���a�p>c��?�%��+�`��!�j��
�Z,����������I[�v���Ex���{��w���?$�����	�t�����&w:
�P����|g0n>*���
��q���U����K�ivar�s�C���VQ`i\PXE8���Q-���y{ONX�K�I�%v�����;
��h{LB�v��n�{(5s�U���*�������R�#��b`��9B�am�xZ
��������g���*�?��#�~_�I����X<�`���]}�����y:��B���,G���
�@��������)�
|#P��
�@�#�!�O=Cxob8��R;*7��8E�UX��������{A�M�����z(r��('
�B�A�;����v�"����
vkm��H�m�Q��1�R����n��2���0+d��� +�K�Jf/.�z��}We3F�xC�:l�GM�����l;s�"Zx�3���h�;��#��s�]E�c��C�^���%��o:�H�Br�=��<�c>q�����S�5�Lw%?y�EY6F�6.W�P5X9�������`E�uT8��K�����N4�8��.
&I �,]�.��7��(Aw���F�hK�i<�������(bL������n!^����~���c"m`5���W���=�Y�9.a�o�����5:I+�7��(��6�)��at�'5�o�����
�dh��.�'�d�GI�#���;�0��/q~a�,��.��V��}�2L���U��R���Z�L��9B�n`���q2:���E�R�������}����PC���pu>x���V�T���$�\#�d��2L@�pc:���V����RJqC*���(B�)�]V:w32%�i���1�ug�F]���WJ�*8�+h�S!��y~)Z���h�E���d�B&|�5:
q���]���t��Lv�jx����Vp����<[�KZ0'��;��o��(p&�9�@��xM#�:��mP���]L��r�!Z���G�z�9<��<��X	��u�\�3������e������y�P��B����8j���q���?W�Z�6�o\�i����6�8�����G����K����t���@Ng�~kl��+�1������e���.��7owI<:a�n��{�K�]�rW��?RO�������s/��M��~�,�Y2��?������ �w\�������]�T|mQ���������9��7��>�'��r��������O�>
���������cv�O!`ny�\�)����N�9����["5X�����N��Z�t�:��.�>�	s.��%�*sq"����'Z4���V�s��?D�{��8����K�g����}mqM�y�����#���Ci#{&�d@Oq<+��a����k�R(v1
�k�n�'���mq��"��,�WL�0&���E?��~��+�2?��*�\h�	>���@�z(������R����q��2�Q�����4�[��<Sxe��y�.VL��/s��U�7-�W�\N0���c[0ep�z��{*�`��'�~fy1�wf���O|'�����b������O����'q}��'�_���|�{�������/�U�*����g�3�!���tY�[L�\���|��N�+����n��@n�����������)��
�����	�;���nw�R�w�d�!�V0/X/]�wm��FE)3��j���Ce�<���������(��P��A%�g�2x�#C�����^�\��B�z�3���Z� ���v,|D������(��Wq�:W�����l3r+�0��~�I
�g��+!�	�46��k�7q;���
T������l��;(
��i NR��L� +����
4�>��/����.��p�� wj�Q��
���*�\n�����8#ow#�{�7���AC��w�9��%�Z����+�v���)�h���fz
e-4D��5vEUwq��8u�g�&��BV�E2�!�o��Z�8P���'J	 ���"]�h�������5�������I~�;#���0��m��c0����1l���q����g�`�`�F:���)��
�����_�e-����Ll/v)w�e�	�o� H���4�K.iP��������
%�x���Y�s���a�8cZ����T�Zg;�t�ix�mI�<{��{Nk4{L
�	�r�'�x����`.*�;Lx7���|��G<�����<�T�p�
^i�m���9il�|���Z��]�,�������7��4�
3�������vWw�Z�j�H!Kcc��{|��s<���s<fX{x��m`�>$�Y$,,$��Z�[����RwUw-���o�������Y/������3�^����7n���q��p_�o0�4R������Q��;��>��&�X}7�
i���Cq�5(+�UK����,_Gii(���$�j&(����]���EI���������6������^����xR!
M��7���~��Ni�yo�����#�Z�����J��S	7F�������������}����v��2���1u��9��pXK|(�"8�n3|�h�=<����{��tKX;���x��}���d��Qx=���>���l2��P����RW���e(�/T�*���*+���o���u�s1�((R�K�Y���+4�qa+�YA�%"�������x���Zv��L���b��!9��%��u��V75�gl�7�����x��[�~��V����)�DDE���yge��/�e����)� q����t�l �$���������^w���w�;d7�s\m���B��8��r*����r�5���b%�>1� s����co�n�'�U8���Q����0��A���)9.neNtn�k��d*���H#��0�>3��9|���6<�(���k��;����y%y��I@�Hc����h���������ip��{�y�i�db[\��o���^�P��3��!�	��"Y~^Y�3���y�x`wu�������&yg���qEq��*�"$1t��T�R���������7iP���K�{��=�dx�;t�~�����V���F���?d]���A���
K�>���b��_���������
\�z��[Mg����p}Y<�8V��k�c���������9��~b�`H�o��W�\I����3�-=����4�{�w���������E�98���"�|���{��������o�lgL`\/ ���������� |yfiY�uF�p�m�
�P��"/��M��g��?�L0D^������4B��B�!��E@���'�B���Y��Bl���6�0]�SV>,a�r��2��4����Q�C
�-B����yc����DV����AsIe
+�FNZ#�-�f��=CxK�_��Ul�2�X�������NX����������������q3��W��$�
���tC
�^X���(h����)��nB�D�%�go;sQ���zdep�<j_Y$$B�3�����a��^7;=,�g��V&����U�����`����RQ|�CY��3��^5�f��&$������C}��?��'.|7���]u��sS��p��&�aw�g�����B5��%�N�71F>����u�I�%u�N���ibf�CH�N�#F��cQ�c+�.�Q�W��Bg[3Eg��,�����F|m��q�Ko"�p��� 
�=����*��8��M�Y����k���6�a���+H ��^���a<����e?M>���P8.)�l���U�/k1!�h��)BL��q���D5����4��%�T����<���)���P�����Ex������~��X�BR;/p�w���'�c*����m�}!���D�tc%x@j�U>A��c���W���������h�gd!]Zh�/��P:��?�'��us����<v�m�QG��a��k������1���IT�+~����[��	�J�C��j���8c�/ ���||_�������p�:��q�Y1�����Df��/
I��.rZ�4g1���!g�����#jl�P1�����/����Nz	��Q�SJ��J��I;:����1	j������.<����E���I�������<�R�?F���A	i���[x�I�)����&��M|#�F��'+���t��~�����
s�
s�Ni����lWQ���z����e���|S��V�
H�����#�����q�n��*�)$pG���p�����D�[A;�;�����cG;��D�,/f���4���K�Z�&9����F�nJ:|g?1����O��;>�<�~w���O}�Q���T����#��{�)8�3�ES����K����On~7?���r4��Y���|	Y
r���_���y�=� �[��|{RYC?[�C,������jYb��Y�l=u�}"�%o=N�|1� <C�����z�[����D����{<_��-� �����u��^���@�����B�����~�y:�K��T�w�S�b�+����	��/�$0+���a���gX7���/����w4���Q��4�o��<(�#>A��b�lR�g��G�4��$�
��$����0&4n����b/4f�C��P%^|��Ffw������(T��G���:���i����&��O��1�R>���6)8��r�='m����!�k3�>W������Ra�~������M&�y]K�����h�E�.�Y�t������4��������*��{N��x�K��D���z��3}���\w�����E�dT�z�\U"L�p�n`�s�EV�(���R�A������Na�%v_��~M�F��YA1c�'���g�X�\<���o��Tk=�R|�j�����_�}K���8������3���l�J�B)Ey����K/
���4��R`���p!Z�x�X�����w�R�|�Q&l���vF�Q��2�h�2!��!�^Ju�w({�xf�g��7��y��J���@7%
-�=��H�
�2������������>�E����B���e�4VD8�#4fs�7�BiR�0a���T��D��51�!�]����+���[V� �MQ�;���?�ENgWY�Je�����1�C�"g��W���A!��vz�>��a.QR��RT�;eM6��	u�u��R��(��R�Q?e�#�0+�i�z��ez�#�7[*|�)�6Dt���v\g�o����K=v�b����������1����6��,�qdi�$���f�.���m�a���L��(�4���x��&��,k��t��,�s�0���FF^�{�8��&���?v����H�eD�TB�![�F�G`�c�0}�a�8T�@���0�v���3���L�S��9z}5
�X�o�L�p���3nr�;)��������<�������J5`�������H|7\��2��_��n���1��?6��Z7{j��)���f�m3LCA������1�Up���i
���������F��B*��j���2�
���\��B�L������u��,�P�A��<+eD��7������\��-�����/��'��E�[���	\���,~�P�HX��P�S�����v
,��DAV����A������j}>�P�$�	�f�Y_���W0�g])��;u�+�r�?��y�q���e^��D��l��y�b�������<�2����w��L�yn}>�����;U���&�;�a�������J�������
)G'X���������Ny~�t�H����l�8��u�I4�����6m������C�~���{���uC��M���S*�4|��>Qoh��2��V���0�����gv
L���3����O�`}@�Ix�y���j#\���
������o��4���^���s���L�U�++��=���]bU��"��j��k�w�O�<�����qs��;RG?�u��������U��r��P[g�{�Z�F���� w��8�K#������AeR&����t��g2�L77���#�h�������k��V���(+�t�����>�KC@9�u��u8�;�u@��Nyq���f~�#$����W!���AK����au�v
���\N\Z��o�������0��8U$�O�_b!��0�����u��vn�o�����8��,��8(x�*>�8&9�������G+�w��r%�zfN�����0n}�I�Q,����@�X�,9�2#\�b ��7�E�NfG��8���sME�| ��v�T��l���	k���>��u�'C���� W�
�G0"����Pa���*��8V���t"��,���yJ)�+�r����!������*����gj�8����&
lS�4�)�<�D4D���-�����2�"�J'�GI���jm������M��*���n�>�d�0GN����U�_����%�AAR��.#������b�vnp�0���C?��)��?��2Z��+�IXW�b�	��y��Y��"
����J'���/��|���"�x��}��,���D��B]
�
���wD�
���)� *��DM|Wr�E��'�N�!�3�*�������M�XR�^#<�]I�C��>]�l��Y\D�$|=�r�bX:u��(������J�1Z
c�?�o�����:
�a2d���g�G�I���L*9�@
6��a��?�x������������{
������������H�����}_A�B�]
�N�Z�1O��G�x����G�m��K���R�l��ea���	����(K)�px��Da����Xb����N�l6��z����F|��>�L,��[��,����|��(���2-���^{lmC�/ �����Y-g�����I��wX`���D��W������\��e���bQ�mxn0�yJ��2<A� t�	�4��Vz9yV ������
*������P�56ms�����==p��R�����A�P�g�{'0a��}k�3���&w�}����s]/&`l#h�#d�
g�u��f����*Q�����������3��fI%����!��Z��x�,mz�w�}z�H|}��I�6����u�e�~t�9�Z�g^�1+Q���7(�K�����i6g���:L�����@��������|e��������5
�����������/TsX�g�3��>�8��|3�\.��)��AW1��@��/s�&S���^��_�����cv��������]�����M�O>��7_��z�����qX�	�}=�A����;�}N+@0�!���	�+�{y_�f�UL��!}�!����&�b����x��a�O8_n��W�E%�%~�-:���%�z�����%���?3^rh����;��H����B���U@mAN+��.�6��
W�� ������w���p~��`����t"�4{E��S�5��V�<��3m6F�1rUy��.���y��nN�;\��E��5y�i���K��
C��������Su�1pP0P��������$���:�W��19A���s��6kx�.k5t^�K
s���{#���6��O�<#��mr

`���y��Y�raqx��
�@��!�x3,D�����hWA�f��.��N��}N�������@l�y�{|��iq������:�V�a���':�RW�Hi��k7��j3��J(��6g1��"F2Bd�\F������
��$��g��H�[��A/�n��B�M��S��&�r�����A9TR��%��sC��|e��3��DY#<��
��7�������J=
�}����4�y��J��|=$���X����0Mu�o�!q�&�w��a��,�^7'f�W�3y����`Q��a-��m��S3S���Y�E=w�����{&>�bW7��.�0C�z(9��+��$
�o�P���������B!YE N�sz~��#�e������~6����{p��b�5����P���l���a����:(�������6
�2y$u�S����-:!�"���A��\�g��(�"JG���~I--�xC������
eC}�����
-�C?�����������Lg���wWj�"g�$h+�`{��^QG�l���`���a���b�8�H!f���{�X��3�w�.�vh����^+>�\���XX�9���x�>G��qw��d�5�]�N�Xa�y���"���@�n��7� ������T��	��rL�B�����c���<�=C%n�,+�#�x���3pK�=��ny*��^���vx/Qnl�y��yn�# (D���GD~n�<R�m����������y"v��1UW��v	'�Ch���[_|��[��^��+�T���� ��tQF�`I=}+|���1��<��D]���IK�*�W\2�����al����m�v�8^�RLJw9gA+���UXO���y������KJ�<*�UT�R��{#����b�����[,�94��T��<����L4��V���,��p(������h��6H)}j>������s���s���dq��{d+�_)����<x>�pn�@e����3����jg�s=1����uP?9~1��������~p��l�DpD�%B����:>�
c7��4�OO�=�\�]O7�����}r2���l��qu-�i
����.��|�q��(�qv��(�z�VF�}(:�"��#p�(��Y�s0�}�5��uf��jX?��/������}��D$��}7��U����fI.�=�����
�����1���M�%�S����G5��'.��w�P���QT�WiW��W��'�Ea�a�����
��4Z�����=��)����@YI�C�slt��t�3���f������H���SE������Fe�<n�����g?G(L�p��C�%�	���g����ew�`}q��1p�0�6����T�a��$u2�c1���[�B2�O�����\����u��qQ�b!=(��SeCNk�����@j��� B�-���^�-�\@�j��B��c�.�*_�	�W�^
�Q�-���H(�\��'��K�B���zm�SP���,j�^��S����9G�Y�*���E��0�*������#<��	L��>]�KW�#�������
�	��@dZ"B��#�z�qv�
����UAD���#j��T�������E�)?�?���4�$���YD9�B{�Q�
��Li���5��O�	a&�����t���AAd~if�O2Q?���h�t"1��o�xu��*���o��;��uG
����r	O���@=�Z�i^������J��Q=�LZv��~�5�1�k�W�(l����q��_9�o��w�O��\(�<�
�6�C
���6��@��e�D!�\��53�����PpACn<k��vYmG����{��\G9c��S����
A��Y��0�����@K�bCx�
@IDAT��]��^x�C������N�S��%l\�/��QA���"VT�6�2�3Z�����u�&���Lfv��
J��%]�I��JW6�3z���}�{��sT���
�i���V"�����?0�k���I���������	�^��o7L��6��h����8	�+M9�5�s�P��I���*��Tf�=�\@Q�"�v��S!-���M*���;��w2-�o�?�H*s3��!�N�n��9i���y,C����&��t�������Y���4-�;�WY!�MS���w����A���R��_j��
d��)����d����c��N��EFox.�;����V
�*J'���0��G�W�$��VR��	P�R��
��M�x��h����u6vUt���hh���-e��}��S6
���U��
�������d��9�:�0PV��P��3���*�3{�x��^��������f���.�������{���1�
��|M���J�m�����������y=��"*)�I��p9�0���v�Bj�y��<L��f�/MJ����B��O��7�������F?T^�h��G�^�1V3=�:�����W������6��7��t��6M����~b���m=Q��e�����-������x�;�� ���"��:J��J���i�8�2���P��:|k�o3�;���t��#~A�Q?4>������RJ�����m,�6�q8B����Nv������������N��6����+D�����
��_�%Y��k5,��Q��Ur?t�]K���ZK�C�����S���������4�~|���7�\����{�oa�H��lc��_�
����g<��������_>����������v@��9���1��v��<�P�dh���P�C�{b`"|~a����,�������Rv}������m�e?�8}:�:�
�`�c�j���nS"��v��v[��L	t���|LN
�����%*��f��r^+x?5�]<������
^M3�D��h� |�V|��`����yUZ�=3��e�g�����3�hz��Y���hz��k�����&�I���"xo�\t�4R�h&�2��*(98]*�t��PPm�1�
��6q�Ige�����feX�`Dh{Xn{VQTPh\�]��]���x)���s}t[#|d/co�3���)8i�����B��i���D�G>�g�����Taq+��x&XU��_���K�����!�sk
���A�Nm=�l�X���0���R_I
��y	>Yi�C�Yl��)���W=�BQ������P�$��Y���~-�����&=.�Q�����Ex>���x=���k�M�e{��8q�������&�b
����0h*�D����B�e��F��)��.�x�0�����w/
�e�rOK��!��;{�9�m���������j��x��TR��s�EyP��a�]�C<EK��m�����"���D������9�����jfY/3�"�Q�J�2��}��_���+|T-�v�2�s�Pd�a�:�����_e\������@��J��:�
���`�5�����f��YN=&U���4C��5�W�ze�%���Pk~�_bc���>o��!;Ux�U"�h2|�8g���%B9��4�-E}WX�D~nT����K��4�6=��;D��!���Qy�bE���lj�����<K7�����H>��e�d]���2=4'G1��F�9M���~ri���,�����c�2y����x�{�A��@�����_����Pn�_:�4��h�&h��h�=b�_*b���3��x�B���C��>���}-���y����]#��I._x�8����~�}��r�����p���q/y���%�<��j����7��"c,��[�o���)�d��M���������ir�:���-��n��x����~����F�z4zu�������l��z�t�[�����g�������z�}��K�]�s�o�'���q����#'�vzw��xv��8}m1y�u*=���<�Z�q/v���(M�G�^�j��{��K�>�
�]��V����P*��y�Z��y�����wS���3?|l�}�E��������O'"�'���-����{E��qx��[��u
��Fm�t��>���s���$_��f'I�Z�W�h/����
�3�	��Q\D�����-�v��5Z�_ml�n�D��Td0�&�����I�t�s��Vr�Qn�~^������6���h ���*��8��,��_ZM/�a���Ge� .g�I~����Y�d0�c����L������3,�������.k>|���3��V���0'��C6��wc����X�2?=��b�$Y���,�����o�sc���dm\,�|�6?�n�D]�7!��\��/N!P=
���P��)+�Xi_K%
�W,����j�x�if���{u~�>�!Nb��1r��v�B�)���+<�O��(�.���w�=��9��i��?�S�OZY�TE��B8�CH�5����.����~��	�����_�k89�)=� u�3�\�4��^v����J�B�:��,����8�������Gf�F��Gx�8��TOp�@iU�a�r�MB��D�'��D�8�N%p9
�d�7��CY*�Z0��K�J�
s��}�6{�9V��PF�����d�0��A��?�R��P����lR�xuRE�Ka���{�*T��xQI����J��x����1�y6M�����S~7��6��Y�3��.}*���E9��Z�c��F��'�^<�Y����9A �K��X��|Q�4��&_\/|E�S3�6�(i�5��b�������t��s�,b$�~?��a�����Bv6?'[��H��R'�Y#z~����X��������@�S��A�����0�t�9�������h�J����G�h���������[��8�P:]�0��J�>�0����r"_:��0C)F~�W5cR9^8���`�}��"\"�^E����mz4^#$�4p����f3��I����u���(��^%�8��M����
��c��B&����L�x]�L��x4���5.��l����"�A��\�%��L����x&T�B�G���N��
�tB^a1��7�����o
>����u����'��M���o���/�(��`�Vlm(�|-����8n�nk�
�H{9x��<j�\�x�yT������U���_����4�K������)���a*G+O�<s1e&�oVW�k��V�����5�>{x�5�~��
�`�%�+��6����2��B�����������
H�������o���aI~hKot����a��{����$o���5I1���^�Sb��
��Y���s/9�_���u���1�ixoe��?��`�g�?L_z�!���Y�T�t�>�~��_KK��,Z�z���<�������Ook�ju�x_�|��T��h���F����������PqQam������J'��Eyz�Y��{�����q����.�'X����N<���>x�9�>��tG��X]<�"��/��Xk������Fx�Y�����R��e�9��}J���f|�v �����h��?���t.�#6�2��*�&zK����(4U�C!?c������T�[�����CL�����\���
�?���Gb�iH'�4:L�rt�2��;M���������}rq??%��������
��_���|�%���2w�<f���m�?�/"��{�K!yH�AI����;4�'�yy�����C
V�������q��o0�R_��n	c>�H�BF�.�l�Qr�x�E�G1�a!w,����>�9yQ��;~.�2���v���P�h����	��R����\o�%1�~c�O#8/�K���gj�i�1:
lM�]��IX�_���R�Bq��t�����`����:�3�r�y�y�o�_�t�`d
�i������z��Z)}5�&��C�I<	h|G��rj09�{�������LuK���Q��q(=�pm<f@)��hR�8������JKp���k��&){�dO/=!����^O�Z@�V�!7���jC�?C�a��I�\EO�c>k)�-c����u:6�����q�d~�.
y�U�n]��M���bYVx���'��F-��mP	�B�������Q��-t�Q�x\�|��uR?m)�Blv��)��C���y�8������P�u�h�5���#(�zX��U��R�o7���DNY=v��>���^�l�I��� 26_L��
��bi4���=�1��a����
�m
����5�P6���e�
�e�&S ?�>{�xc-e��t�0�]T�c�?�S�tg_z�
�Ix�Q6�u-
�Mn��!�t,�T�5��E��T�J)�(k�C_� �n��T|���z�E.�r�Yf���hv$g�&��^g
hGe�B��Vo���M��)�������gY<+���Lrul�Vp|W����W�t�0�t���g�W&�yA��o��'��*�����eA�(��qZZ��Q,	{�o����������b�����O7-_������(h�N���cL��	3h�Tib8���m���G�b�u�B��k|w���<"|���n�
^�14K����
�k@�&�c�
m7�i�
�"JJ����w��Zu���.����<|�v���^z*��X{�a�TT�`����:\�6K�W��<1�n�w��W
�v	0����q}�9}�$hGP�>�S"���'P����
z��s6<Vx��XwF��4���VHW�,���<���O�qw� �	��b�����1p�������NP�������V��K�x}zx�^n�y�xb�w��������><��x���9�h��s��[�S;]�yx�d����XC�9�����K���i{�8��������Q�.���R���y��)����Q(^L�AY��&G���w��vi��#:0?�v��9A����O��`��1FZ����[����2�I���S��-n�{��n
��w��c�R��=��4����:d9U�a���G5/�~r��L���a��2
��
1�|{�����r��4�M���?L�(�EY���������)]��{C��7��c�Z���;�XN`qr��%{V������T��K 9]�29�4V��������vx.d	���2���.�l0������;�o#����UJ(yp������`�N�N�0�����G��u<oDk����gE�;|�`���),�)��>Ht��I�S�]I�VFR�R���4Z�*Vx�>��N
_�.U	�j�Q�3�V��	a�`�C(N�C�����������n�r�������3��ZZ�����?�;��|����MO��R�?QU�D��:�A����
�,�(��C�RO�	��Mt�"<O���[C��@�?MC�(���6��0Q�N�����k�J��jq��������rjp���w��[������5�t�&��"m���*��m662�)����3^|���5Z1e��RQ�g�B���
������|������#J���wK�kl�����n�wh:���ALm�j�����)�#����b	g���2�-�B��[��A�E�>�N��Cb*�����)�Cy�E�5�����z�����y����:�R���Io'��^
��2�
�
tk�O"��u�{���7*�����������i9���bnp�?Cx�Z(���9O����@�N�1�FQ>�P�����y.Q�3S���d�-@K�t�U:�T4M,�����\�.��.l�|� 
���Y��J'��.�d�?���i�/���6�x�
^���4���x{*��R�I��H��\o�7b�86�|oK��O4y�a����i�M���Io�J���/��1snH�}"xz�5���J'���+�N�$��6�[E�WY	���Llz4�"��nU�����`�]��
|G�2���X�Usz�M#������������ �cY�-�.<A�f��@�����|3�g�'�I�u�iq�[��z.���8�b�>�E���n���Q�����.�v�H���i�@F��������;;�c���c��<k������C���M�k���������@>���?<u�:xH"�Q�������Wt���sx>��N���j�����0*=��;L�8�������'����^���W�,:wS��N}9�n^��i�NOb�����<��{�0PA)e�\?���?ssTx�'0l|Mx��W�\
���q����=��]#`����U@��H����v���el�`��n~���U7��m���#����*��'C��K>����Y6r�FlcU��D�+5�^�����H���%���>�4���[��<�������~���'8��eu~q�q=�_�<�����,4��u?�aK���f�_c�U����/
�E���������*����8=;r2��������a���02�M
C��6�����}x�1p0���� �``P41�����Z8�}����"�[~m�5���N*�{���a�]Pm�=n���������k��SQ���L�����$�ea��+���8W��P`�pAd��aq��
fY�����]���e��],���R�B&50u��B@*E0<<L����kg�#(�z����Dp���
���9��wN���3�
����
�%��1F�����J�B�y�B�kY�L>C�a�VZe``T�~F����x3#��Yz����kX=A.�@mU�t�Q�n�40����3�wCu@��"���IB�QG�q��P�x�U�x��U���j���G�<��&���QX�e8m����������1B]������5d��.���(#%�g��@�qo�,���ni�Ltp����#�G��B)w���N�.C�-������i�q��������6[�=p@$9�%=E��[���!6eD�*a��!}�:m[��v�
M��M����U�D�:g9���B��aA�^m�A(�X�_�����M5�)`�����{��V��pY>�A���x�(x~�FF���<�XL��K�����K���F�,���*+��K_���O[�tGUm8�N�
=�,}��.���5|h����h�������	������h���:�W�����/LcMC����t��dPp��� ��G�_m�
d���DT�v����~��(������Z����(J�����aL�~�l�SR�z��M���z=M�-ty�C�C���{��sP�o
��0��E�Se������uh��<�����M�>!uJ��qm:��?�N��C��f��ilx��������(��F���"��\t��8�
��Hx^Ui����T]&���@+E�������%�g(���LB[Ng6l�F�����uXRa#�{��:�l��l]��������������@����~����:sI�'BI��7��u4�O�$xh�WP�����8�t�����Ne�0�#��Z�:�'���Z��w�G�HP�G^�6T�Rs�h0����J��3��t
�m0�s�S=3�(�U��w��r*1�d�'n�L���f]����K�,�w�|x�"�_<���	Mdz����?�����_��^z�~*���f�����<]�B�����I��]��q����{zx�V0�x)�����_y>`^������I
�+��t��Z������k�=�J�q�+>�VqTf.�x@OK�-�����7��xu>��7=8�q������{��j���Wbl�����M�������y�X�z��F^���3��~���\��1��G'{����<�O�H,���Aa�����}P������wf��W��K�{;)~�E��{I����`	^�K��a*��z�	_7�����HTsv��S�b��M��7
;�}���3|s����<
]�or�fz�s�^�>�('��;c�h�h���QA�T����>Z������R��64:�
��G�n��<v��6^����>9��x�I�!����
������)�����5x�{�.��;����|x������g�j}���RjY�3�����+�W�H��U�<�	�VY���B�#N��jer�����{%6�zF�W�|E���B
?C����~�+�\�"k3�b���"��k����%hf,���E�h������EZ�*h��pP!�<Nq_��6�M��!8����I�Ry<-�Zx9&	&���V�N����� �s�I�(gP�\G`���U��}a|������	^��q#�������gPDTk���8%8�sJ��&a?�dZ�KU!�A�8��=��Tj���.�/D�keD$�*������$���C�a�4�Oc��P�]��k�c&q�p���+��|�r�^�AIch4��m0��W�u���p<c?P�ax�k���'���}����^��+����W��0�T{_�|"��PU��{��RQb��<����#�Y0N�����RTQ���<�F�)�Tm�p-,){��`��O�����l���m��K(=�O�B���=�/������|��A������M�a,G�
����j��x�,�m�[�8V\O+��J�a���2�l,i���O]�W�{Sn(7���y\5>�����(**b�J�2~u��n=�#{1!P�����C%���1�MS��\"o
!}�}��8����8��68�R��Bf���Dx�x��Y��P��(oHO1fUj�%LuT�� ���q�����q�N�3�T
v���{�1, `��z���R9�R���Q�E��CK�����\>U��G����s�"
�gK��!S�?
#x���E�6A�Rh���;I��� �v�o��;�IBI�b�
�v�x�G��.���s�TX�iK<�0I����+(GUpxV�2B]=�J�SY�V�Ws
��^�M�W�/}��Rk�c���K��NO�W4���e\KO����@�����|����E
%�y��4m?�G�7�����BW6T*E����u�o��g���R��~Vx�,���"�,�2��%��
6n��S�Z{\�&��<d���_p}A�������S��P)���L7�@��(����G���Q��n���1���0��@S������`�}d/�^6e�����2J�z��sQ1g���Zk�8�I�����K#Y����}A7�`���C����!o�[g��J�\��l45�?e�\d.���s����t�9c����m����&�&��?���#1�u�Y*��`�����b�`��)�a��h�`��e����,p������9����;h��eq&�#�au�:L��>X=�Z��Ub�:�$������.k���e���X�\z��9P�`�a��yNk�����Z{����0 ?
����^`�7|j��E�i��yVy-�����y��5:�������0�$O\P�V�����)�c:��o�
��+�F��r�}>�v�U��q&{�9�$��� r���6�&�eB9�\x���v��6��d���;���oL��X���2<�$���.����e6(������w��V�o��l���x)9D�����'�5�r��m�,qB�^�	��K�\^}���r�.�H���|Ez�7��%*\����u���7,�!K�
��s�w���qB7j�\�����{�V��a$=�<��p�}<-#��U�����t����w��i_�l���<V��/��)���o��X��la��ys��(�v`�R]���������_�2�jGW�6�0�[[06�/�/k�k�_��>�����'?^*�d�\������|B����R�F��j�_0�Mu����x
���Gn�L=�:�"[I	q6"L����!%��w`$T��<�R���*6�0�����H�1���E����5��mE�2.���������	���{�!��
7O�6������Q��-�45�:��W���Z7U���9v�"<�_�l��f
t��B
^��<����^
����C��k��<�,e-�k�����<���N`A�T��5��r��I���if�
q��&	'��FEG�
��x�RQFt��16��C%e���Z�����	)�!�� �n�6�rd��G�4�L�N��`���wm��G�^�U�j��F9V�}Gh]�=

��5�:z5���9�c�M�J�f�r�{�G�@`��C,eR-8��&���$�u8P^�{�Q��=�OS�8^�%����]z�-�oz�UA7�C�G�>�S]T09������n%��x�*n\�n��iBey��En7�Q�>���m�`0p;����hH��g��((�^��/��w�(�Pz���\�=�K���~�~�����X�_���p�<*l���F	s����x��C+D�S��P��jC�-�1����<�e!�������w>�Y��L�"`uC;�fTJ�E�o(o���r�y�qO����.�#����g���$�B����8'���Nr���R��1����

C�E��p���3&J��|���c�
�������b�a��}��������B<�xO��T��[�[����i�v�CO2���y�F���L�X�L�s��X#j��Y:M�����"���$�rg
_��������b �����V�$`��.�q~�|	�;FJ�;�[�%�w*yM��0`������A<��%��Z�����<�wG�3}���o�*��?eH�]��W�2m>������\��_9�'�a��x�r$���o��H��O�OP��[>9� {�������{��������94)@>�Vfe
��W�n������7��\�K�I���������f7i�]�P^������n����0�O���w7�Q��fT���>� '�/E��y���s�X`�'x��yWz1�B��q&{W�)d%_+��9�1��3�z�Y���S��N������*�>�^[���i���~U�r������)d+����e�'�!Q(b7��e�]��k�3��J?�q������F���r`k��
��l�Xp	T#|�K�Oo��9�P����doL
�V5����%�_��]������,�,#����
[�7r@���X������~�G��T�w+I�!�����vZ��Y3z�:��0Z�y��*��9n�"�51�Z�v���:@�bUY�X���8�����9"�#S�I��P��_z��+�W������#k��t��I��
	&��t������k�9�5��Q�4Bl�z����d_��M�R27*Zz���5�bL��
�|�C@����p��|j�00�Q�9$A�S��C����dY�Q��`W�k�2�x���h���B�����������`���<��B�0�6�4
a�����������W
�Nzum*jx���`+��D��#�\��F��6f-�V�H�U��@}��5�o;U�i9$��y�(_�'��^��u!y�+���o��C�����t�A�:�N���m�����Y�Ho��4�+�ed��6Ql$k�[o�V�c�xvZ���}"���i��`���9<D�<���-�������|db-�i,fM���z��9h���$����
��Pz�%��)J�>V�py�Z1��,4��I��U.��g��G��(�f��	`�
��'S���e�����N��}��ES�{�J(��z�����������_�c&����ee<���1
�7�*�
E���w��������������Bi$��S���n%]`���2i�s��;�-��]�<��r�q��[�8��x��3N��Y�Mfb�I��Me�t����'�y'��lpZ��Iq�cC:b�7:)h-��]��;%����Y�@�5C~��d�O������pvl���p�6�����s������I�K�?�pk������|���G��]���)�3�R���;���2�BUDl�|v���I���{��V����o����
& x�A:���c�\�gf���q��&j:�����������C39����7��J�k��k�����������D�������c��e���	w���&=9v!��G/����)O�?�7��>���n���}�#}�Ph?|���yy���Q�a�����<��qF��wU�������=������[��{��p��wH3o��in�Q�;x��g�L��@����W",�\)k���}:������p������Oo���n�k����������Z��BN�K���3����m���A��m_��_���|c!V�]���S%�e��2&�?�z0���C�}e���)F��b�����#`����M0��������9���[F����7��\S�S������a����c#�}����G��;����%�GrO���"Vk:�r�����z�w�~��!�n�.w:=�u_>��s	��tu7��)6=
��T�rYT~�o7^���j��]��E��8����ys��-
�|�sq��_��v>=G��;�{�����
s���y+����R�����DFBPK���e\4�)\E�����i<����>������k�vd���@�T�5��$���N~}z
k�ke��(88f��!��\7.�
qe �~�E���B��%,�]�����_��_�v%0j(�h\K_�`{/�������Q�����<
����$�	�sC�tY!�y�Ag��]hk�5�4t�A�]�zRRJ�l���x�h����M� *L�*U��1��h�lE�*:��M�Y��(c�-�#{O�����k����6�A��0P���C���
�dyin��J�����P���J��U�����y(����@q�Q\L���U��$�cc3E���"�����u�H�|��?2n�`c����.�!*�'����8gs��QB�_��C���6��.��l2N�rx�t�����Y�n-��`	8U4�+�*?����-pXB�r�����BQX�Q�����(VZ(�a�����BX���~h����rRi��)R:��"yf�L��?�%����=iR�U���O�����'	C�����A|����l.��-�D�{	���s^�4{���R0�|�a�P@��9��$
Jb���5<[��U�f�#�Q.Q�����u�ge(;,�`�������Z�r��������P#�^tk�a���%��������-/�2Qz�]�7|[%��Q��Yn]�[������e�r�0�y>����������;���
���nm<��/�t��Sz/�,��1����(�\5�2h��������v|�0U�&���6Z?dV	X&��g
����<J�T�(����),�/�o~��<���Mw������#���&1V$C���qF����������i	m��0�������g�<���0�s��kZ*���
D��?�-�'4�����\Sw�T������I8�����7�s�)�=�s��G�6���W;3������u��>8���G�S�Is|]>_��5�5�q�4;M�������+�����OM��i�������>��L���Z�L��x	p�m�?�8E����)w��j����w��;j��{!,|�}�'�^�{=����{{�0�w6�Pdj�\������}7?��;*M?Z9����Be,��v����|y���8z��x9)%����M�����xa��
�fSw*
��N���}�I�(�y~8��������'k��n��s~z���w�QQ*�As{\&���|{����{�q������o��J@�0�o.��m
��9�7�?��Hb�4��6���Na�# Ba�Hc������7�%���<#�#��N�]��)����b�'���R��H�9���ky�0�#������d�_���
���W}x����5n}���o�"79��z]�X�y���g���"=��OB��H����[���o��*}tr�{rV[j�
	t������}�1<#��,K����������������-=�P�H.^?�[�?=�����I���U��E�E�)�'���X��RR���jf��I���Hh��O� (\<�!\�L�N
7t�w���qS6l�Y�����P:]���c�[����#���%�5]��'	:�.H!�<�
���(�b3j<jb�N���/��o��P\��~����j��q8'&J�3��mh����1dV#�I���WW��
]����A����PjsXC���&J'��g��K����8E��wq]
��:����T����
�������P_�;M
�_B~C����:��U:�~���VM��#����g)q�%Q ��>���4��*�8� h��x`��#��#��>]5��A�
���
�}3��\K$���(���	�e \�
��5pB��KX�S�����h�YW\�+(��F~����P1@�'�8NfC��A�1��h@Oe����[nP
uJ��,���'�������@98R�G^�������v��J�+����XP&*�G(�,��"�w�#��Y�E�M
-�R�� ���.A/��S�G��
&`4�������R��j�I���32�cX��T�9-4A+������

P���h/�\G�����y�qE4��qNGx��gW���)%����j����1�_*vs�l*:y�~\�C�*=�hSz(�n�=�K��Yi�|?-���S�������%�`nm�r�G^>�0T��`�986I����r����h
�������(~�b�~�{��!*����R�8���q$�� �����'�x��c<o�����x�SK�c�vy����/O��V��^-}�CF���h�U>�C������RP�u��!������2X���:�����z�J'�ok�J��j�*���Y��G����,���=c�����B4+L���������L�g�u�o��_*��"�'��:���'��@�N`1G�s�j<��2������cl'�H��y�����;�~S=�
�w��5�s>����[�WO�w��?��������~��������N������W�w���c��-�zT�7���'�W
���t��W���^3�z���a���L�E$�_=�W�/���{����3>��������S��6��+��"��!/*�|��O����C�����^j;I*G���[�J��5�"�����������]�����l���x��������o��Pk���?H�{�������k�X�D����;��q���>�������v����^���w�I���**wR�e�'7o��y�z�;����P��J��N}y��
|���?�O�7 �������i�=�F�����9�,_����u�^z�9����g�a�3���o���G�`����v,]9���k�5�
��ng2���_��#�L�~]�c���l�P�y��JS7�1���
�3[��3
����4��c�v�sho��Pv�"f���'�&�]��������s�����w�����������U\���|��8�1����O�"��#*����~�=���U8���P@~��w�t���3���H���&^�����O���d���z6����������Kp���~������u
n��xyz�y����f!���7D�z�E���{M2p.V9�~x�5����7"[�_(�>U*W2UZ �4�����N��G�����Qb��/��;�>����o�����dzr���������U��������0lg%�����\F�S��6�\�*;8�\5�cmS��R��z��B�eCQu�W
�0��&>��r�>4��aXR�~�*�u����G��sX|K�Hp`�~��'<U ��&Mp��k[��&�EE�_��%G����y���+H��`����������+0�_�T�y!�����
��f����>N�l'k�B���(�������9*^�V���Ls��t�L�n�T���4i�7�
�`u�]nO"\_3�z��<)�x/.w'a�7�w������9Cg�S	8>[Bp�����G�����a�|S(��������������1|����%��0�v����t����t�����C��w�h�]2�zO�v?R��4�'W�X��.�����#,�
�M�k�+��b��;h������w��]����!�i�4B�
����*_�GK�[�S��6e�efk�7b](��b�*a;�����K������"�C�� ��U%W�:W�9C���c�F����>���h���@IDAT��_��c�� �.���4-�m�����s���&m�!�7`�F�T�{�����(n�p�R�/�8�Gl�Zx������Wx�8�����po��LSU�5�����
ej�P���<��>��g�5)��np�
F�G{f�V����C����u6��<1��tS���I��N���M�#��x�L!�=(��dwCY[@�1Y�
��#���l���������
g��G�Vof��� �\(__@����T9���D�|zi��8���K_q����w�W���hq���`�lTCe[�����G��G�k��j���maV�S��V(���i�>�s�4m��M�DEV��1��������k������5���?�}��a_h�9���d�I�G������S��2��D��i�e�N�U��c@<R�K��~���D��x[����������L?1��l���o,���������1[���
��g�bE8�8�S�S����n ��[<r5,��{�[�}`^�w��+��Z��Es��r���9������+�C�_��?x���J��:�"�k�'�7����o���?��i}F���Q{Y�z�y�\S����G��[E�?���_��W=�B����{�]��E�_������gd,+�Za6��2n5�{��_}�M�9�����["�����x������w��8����s�[Vic#x�������#��rv�{��;������g0r�`�/,�	B�o���/��,=U����x���K�?�R��W���s�}��}�;8��=3��~oc�*����ea|�a����_����4��G��)��������'g��������m������
������������J��F��V�}��c_��T�4����GF/��6�nW�������oO?�8����������m�����? ��{���y
�������
���������{����_�-�"�����S~���
�v��*
�M�:���f����!\��������\��c���c�����������/7_����_I�y�'eZ;I��������f�K��^�1���,���c{�����$�A��������u��]A���Y�P���U���o���{a^BN�Hq�����f�����BJD��7�����-Fm�}���Q0�|�D�SDz�n$7W}x����-�������w��O�v>�M�c"��L��3T���"��b��9�,��_N|m��'�fz�M�'r7Om���'�"���O}'���~z�
1I���_n���*����Z��o�Q*#��oi�����>��{~ ���7���SA�(�>����Cqg87c.���a��]���L^����KSog[��xw��B�:�w����g�A�k��`�����j��;�
a�W�-C�~�<�����}}��)����������-�Z����W��iU8�Z��_���b]��Z�h����x&� ��dZ����h"J�C�F���z�\�<p����i��Jm<�i��7v;��(�z�5�"�Z���6�P�D	�������Y,M����16����t.�-4�m ����QA��b�XA8���3�5�(B��Y�T��/����W�j��'Ci��m��NXV���L9-)pFh�6��z������r�R�R+�������~����DD��Gx?�������"�r'd�v&g-��hy�j,�����,���yt�y�*p�4��9ExA���Sq������":x9�sV��n�����O�ze�u;�SCQDC�s��
�&>UZd��]Jy�jeZUe�g0U�R�J�S�����+0pzv(�g��k�����Ti�bQ��"��Y\m<�+�x�6&i����c�5���j��_<�����
���
�?2iCE���\D������B)pC�T@�o���'+�D;/�,���0��h��^�{||�y��y��m�����&���2�>�c(uG_������Zx"����>��}r���Z�'���4�?�_:KH���3��a����(���?�X���#��KP����{�V
��4��Pe�L
%���J������]vLS�pa�t"��I���}iR�5�|���^�6w��
F�����*�V��y��P`�7J�l��k	�E��r<yK�@?�{�8P���������^p���;�$�8x��OV���c�9�:�v��ZG��{���%rH��a��W�<�<�,���e�1]GIe���^G�#���x%*~Nq&�J=��w}�H3�/���{�<�5?�������H1z�/���w<� ����0WE��*`�����'�kg�&��Xw�
�?LX-���|k���.@�,��}����g�����X����%�s�|��^ ��So�^3�=�������3�R�m�����<�T/<1F�������8AS�-U�N��L�w%�#�vO@����U���%����7�����6��U(,�?8�M�=�]���e��|�F�:-���|E����#����w2�M���gA��h����6*)�~`���d?�
���q����~C��s���P��{�^0n����_���+�ok���S��^m��n����
�w���w�{�	�����m�?�>��g&��G�zyW���������;�w���Cq�@���?5�g�
>8�U��GzF
K���coJ�&���6�K�����O�
�b�>�x����Gg��M�0��(};8��G��S��%��ex����UO'��"�{���v��#���I����O-�nv�C���N��+;�yx��Y?I��)W3���o�H�N�<���E9H�r�?9������c�!��%���O1������~�l�ea
�-��"���s�8��'X���~�yr�2�q�}G��1�$�����H$e�;G^��O�[u
�2V���S������?;��������%���?�����`<�aW����}c/�+|�C���[9�Z�z�I��������m���>�?R��5��nm��sJY��#���"���@�Xx�16��%KO�,)^��?\=�\���;�������0"��������6���|�M?|�o���;mc4���i��Q�V<�\�+��v{/�`�52UQb_�8Z�S�=��@����	{����"��{pSl����?�:�x�q�G��5cu��@�9��V����~j��J/�_A��A��8��H�}�uM*�����t��������w��\����p	�x������b��PY�������n,�����?�EF�&c0�J��������`�e^�7�f���+c�C��@�^z����%q���2y}J����{�_����9���"���G�J���v�Q����|�����*��l�O{I.���r��?������*s��-
�����2S��������c�r.���=��^��V�X{����7�b���I��l�T�^��7�8:�K�s��B'_������"��w�.����3�{��'�IK���'�%��F�x>xU(x���O�~�3��_��DA(�e�^������4T���T�YxF�HO���k�sq��>�����*0��#l!h�R�!KE�Ox3��Yxa�JX_�\���L��B��* Q$A����B:��dz�F
��Nw��#X�_�?�t�MJ��a��Q�g���|���`^&6}�m��*^A�x�t-5q�VV����I���Q��)�W�����
*�m�!��l�
�������_�z����P�3Y�z��>J��f�7�c���u�����}�Y��	������%�I�<T�,��Ra�J���z���n:�p�
d�+T, &+�T��m�w�9�����0_l����A8������y��
��a4�����2m�w
w�2!��b��y�����/�����P:d/���\��<<d�'-E)���/B}���U:���;�*��Q�H�.o��jS�e�{W���T���?=�'�7'�� 1�1)������I�(��d>y�2������-�.����
����s����-���~��5,�+�WVC��	k�'�V�`�zX%�F{c��e2�=%%�\�"��e��E�?<������!����������������R�1OF��|B������C��w�-C3#(�j���\kV���\/*�M�6�g%����*�n��yF}��E�S�}T��w�����4��@���m�*|N�?4/:��~�*�6O���]��
���u��\f��Gq���
y��GE<(�,�y��G�.�f����x	/0^p.���U m�:px�>r�L(�q�,�PIL��($���jU�,c�����d!�{���mP�u��f����!�M�a�zNA����I�h�9�
��x����V9�i����6�r���c���~���a�5�G|#���o�<��B��a(?_�N���~�*l�����
u;!�N��_Q��F5pCu�E�S��u��xm&���_J?w����o�����Nk��{�[���Ec6����_'�����?D?�����O}G�G'�����.���O���g�=��:�{�9�����A�	P���[�\b;�[�?I^�^n��rs_��/7���;��{���E�lI 	Y�@���{;�����f����f����Iv��>�M���?���|
��c��Z����x��KVh�ip�<]2��9T���j�����F�)��~L��~c_U����E�"����5H�L��M�\c#���1�.�I}��1<�$����O
c��`{��
�5)��5<

�s�������/���
Ig�&��@fGp���Orn����>��\'��`X��������1aM������������/�����M���B��z��� �����
	���X�����������R`����p��_������h�	)��%a��������PvgA�t�>�r����� �V��T�4�����%�J��n�rg|�Fz������)xT���{��i�{���������.�s��3�*� Y�
���_���_K�+��@]#�Z+�(�e�a�F
r$��r��Tc�$��_7�q���X�
G���:��F���B����R��&���j������w����B!R�*�G��3~�ll}{J�;�k(��m�|�� A�����~�i���B^|���3N�I�6OA��i�&+J	���.�����	�{����������2��b����P����J�Q����d�m���|�� a���e��s���0�B4%������/�3��x���h�n<�zi��4%�N�#�(��%�������I�x��
{S�%r�7�vI{C�Y\��H��sf��������}���E����q,����c_���^<�I������@\e���o^������u(sM�� m7	uN�
�p���I;���u���[7t��X�0�0�7��������c�a���ii����GK��x�|��}���|n�����!6���"�s��H��_��@�MO��Mjw��`���
]0���
��%�����c����XbZWnS�]��~�-�>}��k�F}�{i=���F���J���r��3�r���
i�D	]���������I��.r=>�i9��Nvf�X�_N�g�v�A�/|Q�M6�A��Ti�=�������Z����J��]ll����	����c��n����8�=����+*�|���Y�c�'$�u&t���\[+��3aM�
: �0h����b�i4����SOA���]�����v/&4?1+e�P��a��ZWa	!�d�K-��)�1��%�����@�����q����z)�g���Is�'jbb��:>�Y��L�A\~U1H+���-��*�CV%�b@��C%K�U��E���,�`�?S�����x�;����}`Sdp*��Q�,�o�K����mN��0�'Lk�1+��2����1��W"�����&a��,��8�L��0�U�T}8t�T:F�A�*�s
�
�?c�Y�.�&�<.���,#��������')��x�
���)A�7�����u�ih�R,���<���y���*�"�AE,�e�5�$D��w�F�����1�F$����`���^
)���aX��� ����x���P�P0��P,���s�3�H� aM#M���l,pGG�
h>��N:T^6'x�-et�+:^������:>�qW�zKa�7g��A8t?I�\��_�%�K��c0�_������P]��*1C�D2��p.����^��J�P7f������_�����8��g[i%g���Ue��
��A��m,u��\��0��B�)��P�v�)&Nt!A���}����V�����M�s������3��7�!_�%���%�?Z��{����b6�R��,4f=�vn�O���Z����dC��\BD
���w�&���|,��@kA����'<�t�����S�����HN��7B�"O�DgB�#�.�e�z�$g����S�2�e��~��<����������@�&���������r�(\�(���
��N���B~�A�b�t�v����������`,��B�+?(?��K�N���Ye�Cb]�J������xs�9��^Q��r��`d�����?,���|n�0���'��3U�j
���1���V0���������'��%���~>�\k�
�]�������������`�L2��C�����9��`�bY#SX�c~��|�)?Y��:e�>�A@Z��i���!��-r>p���d��z�����&X���iK�<���G�f�sM�{Y�T��5<hA�w&���y�B��r�5���*I<P��t���������8?}x�����G��I�����]�L�����a���W�a�e6;#�����Y`���B�H��=Y���|�c~�t�������HX���7a5%%L1-�@@���1��.���f��u����nm��*K��.$t8�8&���{���E�f
��G��������$C6���,O�G����s��>��k��K2|m�@R�%�I}��v:����z�88��~{��&��'�����f���������?[�g�&&�35��G��Z{��n�J:��e��[QnR�q�x
e����`|��~�seW�
eS���4;���3�/����(������N� ��|z��}����0����TP�&�k���F}�x�B�H�)L�(��H	t7)�)��?=���?���K���t�2�o��mU�E�����������+VC�w�kG��4����v=g����m�0��D)I�	~5ff
:{/�������d��<��;�g���W�f�yH���m����l(�G������iw��?�M�4��|�VV�����o���T����p�R������=��[����	��LX�i���:C]u�A����k����:_�E��n�J	��4�<6�C(�\|��1o�#�S(��
��" ����Y�5���5�������e��wN���+h�)bo����v
�����r���6�T�H9gV�O^�_^I�����X��L'Yo������a�4��I|���Y1�g�e7E/1�5����P�����x���{&O1��.5�|�
�����;0��o%��O��Q���rC�sh�2$�6
OW^c��v`
��Le�Q������OL�S��n��igyf�7�����[���)a�`�z�����)���B��Z������������R6
Ln�IM����g�����!OGY���2��[�z��;���A�����X|����<����{���EufO�js��=�3�9-�!���~��d�2��hGk�Mm����=����m4ELm�|,c�gA�Y�XF�k�����Ebd)�c�d��.VKU��p�s��N�+���k��e'�M�P9x������|�8l������X��h��n\(�����s�I],i�|
���0lo�e�����F��3����6���~��x
����vA�/��jf��1� AY5��#��]%�bE$'M��0>W������Ta��3���.V��yPVb|��1�P`nL^@#'�P��j�l�su���z�slJ���y�m���7X���/�B!��0�����^��R��p�aQ��2���e�
&��^p�E��4���7MCcfAW7Q�	�����xtC_N^��r.��wQ��H����;KM3���M���er����.L�&��`�{<kuW��:�|�3�va�
�xW��b�k��
��%d)������A��gf,���s��A�q�2�`k������mT����"Tc�cs��.{��J�=���r����2�u�b���:��>m��v��1�b���`���.���!�������P�T����.�����6�����Z���6]�x>�������As#uQt�����&MOi�ig��By�)g���D��m���$g*�Z�g�<Uw�*��Y~�U`9��z���{�!������,�*�A�b6���a�����t���'��G�j��Q�wgQ/���f]Z�/;��1�=�`v�J9+���.����pd|3vl/�g���C^�S5z�}o����5�e�l�2sp}��j�(W3N-?O*,���r��`8R���
��a����)H���m�o��M���6sK�+��`Tc}^t�O�`������a����}��y�~���W���
�C?*� ��$,�][s�#-���������a����W����&{v�MX���+k�Nd�8�u�Y.+m�IK�0�����iC��j�]j{���St��`%�����#�������ye:Ph�v|��������"dR�h]?9h��m�����zY��1W��������m�}*����k��h��L�vI����1�8��d-���p��|�y��ZS�%c�9��>u����!��"\!���JK�|q��G�[
�&�^�%�
G�S	?u������z�����c���3��)�����M�%��42�_�����FsuI�Y9���t"�)�4����j�
������Y �CXu�l>�qu�J0�?���	#�,��h�Z�Zr��k^�V2�\1t<�q��R�BS�;m1U������n�A��
�����9'�������+UC�R�8�|p�Q2!r�)(��
�(� ����i��KI�>v�>�4��R��$�G� w���}�)�13'��^���^s����h����'�bFY��1gd�M��_���>;�S�g����~������v](�jp��-��.%�O5���kj9�������^��dz�M���y��1'�K��z�
�g{Y��)�
-��~�U\m�Y�H!!���;0�t������:�/�uw0��}����v�[��Z]�N<��.Os>��Z?fn��d�����G�����b
>�o?S��$3S�����{��X1�/�A1������.7���d]�������F>���j�m�fa�^`���7��}{���|���g�==Qj��m:�t�N:�2��C{��
��/��,E�F��}	M���J2Z�Fn����� �}��1K����,���j~�Y��2t��������@�1��h���7�c}���D{���<����y�x�Y��%�}�,��lygJ����f;8������<m���uD��	�9����s�����g}�7�N��4�a�T�`�2�wa�_��
�0.��h�=Gd�D����b�9>;�W-~�����vE�F��x��9�Yt��?�WM���^R�������1�-�f6������)>g6�����8r�\?�����kDz��ZO��7C8Q�������]��x
V\�c(���+'9���-f��I������?�\��������\��6���i�%�<k�
�������������2��g�����E�����;�Jsx�s�.����^AG����O7}�����K3���������wX8Q��,��{l��%����o |K'�������|&�A�`����7�s��K��3{��#f�����:|��7Q��L�A|�v��O-�h]c�������H��3��m����Ap�c��-��s��:�G�@*_�����Y>���~��A�j�/r&�Y����z}��H������4�8#m�����?*�������h���
|kL?&��a��!\%�g��������7\:|$�����v�������k@�����;S>��y/�������z�:5N �^��r+g��Z2���Z|?�YuGk�B�����/�����m)z��l4_��I���������hJ��!gMt��R��b���Z����GY���p��$0��X7�_HA���U���tf��E�n����L���i�r����kV	o�#^,��|��^�|_�����S�X%���s������7���!�P���l�u�d������F0��z�:X���Z���'Mk�.3�����@��}��Q��O��Y��c?����8�\�w��Y�!������C[
����T�!��1.b�Sn%t�C{�
\c������3����}�]
�-C+����h�Gy�d�
3���x���I=�(�pKZ�n�9�Y9;��X���-"-)	C� �8��rsmm.���6R�������l6��mc����8���cg��e��Y��#�p���e���������5�����{^HN��|����^�Xa65��������U�B�����O�:�f���*�(�}s����<8%��{���?�����?�i]��O����p7�?^�D+��Y�~��
�_E�1�Flp����/g��S�7"<�6-�q��^4��������9lM�����c����p�P2�gn�i��4����X�W��CC�n;Y��l�q�f>K=|��^��p��os��^e����/����b�S�13���M���6�r�6��)�(C�&y?������t���������O����
����x/c
Q<��&�[�P�A�5a����FBg�H��!~dL��Z�(B�;�����9�"#(��S���s3���0L+��9.s�B�����l��0����~�|����s~���s�By����>�R�E%wab�[n�r/�NZ8KCS��:�M9�^!����t����Z��M�����#��OU`bm=:�I� ������fy:q'�W��t�A��GY�*<X6`�Z���9)��C[�T����*6�^�G��S������f��	6@2��
r�U����~Kh[M���[9�����}0�UK1�����1�c[���S�yE�(��cF`�� R���-�).)1�q!ttQ�Pj�3��UW�3=0��kLEi��xa'��o^flYW� -�����k������v�M0Vc#�	*����N�2��8q����3�}��>�<a���)�\��B�	&��gM�X��B�[G�0��kDE�J�-:C]K8��5�W%Xr�!t*F�t�+��sm\�p�Q?��G���4�YDrKvGI�y����6��`�������j0��d�����8qfV*����>������p����������G�o17
�N�n��@���h8�y��k�7'�5m�
�
���|J-y������/��l���0!���z�������	�w<F�F!|���]DZ��^d�tvb���Y�kny�<O����8W�|��l5Z_C� ��jr�s�����?b���`f#����0�|y�[3�n�/���4��`%(;��es�6c�X�-�;�������a��3OpM����>��0�������}��$��-��;�e�Y��{	DZN?�!BOYG�
C��R'T���b��]��	���A`4���004�k|��
;�xf�p�Ysk�����`�8!�Q����rs{	V��)��\k��X"H�"���(�,�9of�u'�)r���!�n?B'	�K0%p*bs�B����26��-�>!�����c�z�����b3���9�����Q�x�����}�2����q�=����
������l4�QBi���v 2V���N�B"k���)�B����}x�c%p�W�o�VQ6��>{\�r��)�1�U�b�"�z��>��#f����A3��g�6��
nN�d����� �V�����5$4��u�2����`��F*�����$}��A$D���gW��L������&�pg~��:����&L],S��Cfg�bP����~�
���2���
�0���r5���hs?W��,��:`j�W_�
c�}�z�y]\r����<L�]h73�������_1�c-�#l��� ��_,�SsW�(��2�<�����'s���|��:k�ZC�sg7���0}~�9��S1�ed{V�Q?�Q����3��v�u���b���;s���C������TQ;��m�9�a�r�z�E�r��y��������vS��[�t46\[���������#�&��w#p:Cfu���r�#F�_��#���-St���i�`%C��]�S`�*�>g��}���Y�����?7��M��z�+�~��s��
�R����v`���n�z���)���_�~��0#U��x��{H�e
�x#�������
�?U� g+���0����sV��6�N���q�+���~C�}�����f������b�#`�a��f�U\�4[YS�J�2����1�
{�g*W�gy��@��q���p��LY�����C!o��_)����H�"���R�{g__t��?�����Q����>�l���������_xPz]w`��95�=�]��{Tb�pc��,���}�w��&�~���w'���"(�����QY��a��u��v�y��%-��v�-+����{]�A�3�O����0H;9���c�X���\����M/k����S��
��Us]������F�:�U���Po�����p���G���l�E'}n�o6q�t����3%-�����yY���+�7sw�O6��*�G�
�g�������"0P�#HqUJ(��C���"�h?}����CiC}�d�\��D{GY���x�����e��
7[:����L�B#������c���:W+�6�2��������0�=;u�Y����N����i<a���]�d;��]�3m����o�a�GQ,�kn���S�9O��������b�!��9"X�y�����X���!����T�]
���T/���V�K���(��X^�O��f���I��7vmH
�w]ey���O ������5����S2�����K��4���CG����C|�����S��'���5�~
~�<!����c��U�������������'�w��J���=��U��|	����"g5������n��0��Y�P����s��B{�K*��{^[&�#�7 ��m�2�F����I��wgP�?�k�j�����,�j�g]��P�*O�*[��f�8��7���&�G
���uf��>��M5��<��9�!��LZW�E��Q����T��!���������1�vw���
���)�:��J�DN*��v��@������B�V�Jh�+!
"�|�}�x
gi�	�L��c���@,tJ���N�,P&��b�`������%��f���|�+�7[m�-�s����_h���'7QK��U$�3`�7���2�{��I�����
��'��Z�x��U���n�%6�ehT�3_m�<��BB�]�0���E.,4�j�6kX��[�X��]�4����@Sk���9�iaC��IT8R��j��@3�i6:�����:P�
��<34�c���q4��p�]��D����Z��e]hl�.k���4A���Z�>��VQp��4����O�����l�����S����j�WP����^w����|�����3�#3>�?1��j��j�s�s�$�<T:�~�p���X<��~W�>���j�dA��Q��0+�@�[��!���}8�=��M�#�D,Lj��'pO2���5��������v��2�?��a�S�3%��d�u��O[#���O8f�9g�A�|%K�j�^A�9�
��yT���ss����:�������!�������9B0k�u��Z�	�O�8�J,�l��L�A,r��Qk70bGY��
�%5�~]k��k9��&���Y`�+������Y�n����[!�5���Ado���*c���AL'���7��F:����rkl�����dS��uf��]�"��"h����@�����j���y�y)�]�p��b�T;a����.,��.�z�
��[�&�-0��m�3�h����b����N4u^��_=��B�r�����/�_�������Ce#6�!������9��f_����Y0���,�Tr!g�<�����A�n��;�����6��%����8�"��F`�� ��XR��`	�;}�N���"��Y���[�B4=f9�����joE����o�\����Q����Y��Kn�/����s�Jq�Yo��p��������;a�������l`����r��)�(������j�3����������7m0�
q�L���r�+�9�-����7KN�Zfi.a�s�b�l�5��G`.�@�A�*Qtc�6v��)B�9<ffc�2����	���Y\]c�q�o���?������K��W��N��������w�!�.�4�0=<��L�����l��~�z����m����'���Pu�n�:PH�Z���Y$�U����yh�9!��L�3e����������5���sy�]
^���*h}�G'�����Y�������a�%>z�c��j,kV��h����ZE0��z����d��4�mG��[QL��f�9sWM�����`���y,�
(�&���lqn����"��P�������M�����B3���q	<K�d���z�����.�
��'�>4��a��o�u�6W�m�u_�
S=�Dx��y���BV��������U���R�N���6�7<
����d��nd�e�h|pV��L}�q�e�l�*��V��:4���c����c���6��8����[�K��9{	�5��6D8��W�qg ��*��^��/��^	�rE�LSu���We.�V������`���
}2!���z���Z������������������^�C%�r}��B��3���kN�������I6�f-L��-z�9�8:�����������r�9^�`N��.OW����*���:l�?m�T����o�V`@�Vcya<�A���6���	��5��	�]{�Y��r5m��whB�5����F�n}����K,�^���{3?a�.Zw=_u��6���1�����,��0�q����K�N��������^�?v!��
nW�\����y�s"m���h���XPog�5�~]��A�U0�_!��R�!�o��F[��{}�_|����R��ShJ?�R� ��<x�mS�	������Z���P	)�`�����q��G����'��;����k�[�m���Y8=j��OX�KQ�3X*��!<l�����u�6�R
b��U������{��v�p�����|�P�/��F�Z�f2�?r�&F�KU�M7������a�o0�X�R2<�P�Aa5�Zs��+a/@��K���Zz<��-����G'�6Xc��j^�Q�xUhV�ohbM�[�X��i�����X\����/_l|�yaj/
2����������]a=B����5��Z����?H�d+����}����Sr�s��^���Z�)���������f=m���&_�L��	9r������C�Hj/�w�=ST������5y��:� :~��&��$h���v;h,P����8l�T�t��W��F�r	�K�
V�*�T�� �+(Pz)�=\��2Cs��R���=&N����of���N�_��+����i�2�N���d�6�M��a���H|�1-�b+=���y;n�dY�D�=6n1e'���M{���ag��b��c?�����O�"��AvN/V_��������{w������Z{w��(�h���}�A��c����\���qp;IO����*sY�y�g���������m`�e���x���/��biD_T����K�>>H��]Ob�>�5x����9��?[w��'��z��_�5l/{���C��*fn[�z��4��I@7�Ks�~�}�m[�n���B��;�K�@IDAT�h��
�cw���G��0���i��7���F����MB��,|��|�����M��()Lp���n�phL�Q���o���������~�7E�����o��1�~f�y_����]���*Ox�9���
:>c�}J|���)��)�iy��F8���������\n���j�9�>�e`�a��	O������w���S�<�mW��0��e4 T�f=��U���c9���7`����{1
�
k0���=���v)�iNo���Y�{�K:i��2xV�X����!����
�'��}��(��MWA;R�+���|�O��^M����3���H��n�jc�0{P�\��\����{o+�;����3h�G�V��rU/��"�jK9S��+��������l���c�������1p�0�s't������U�������0'p������[n5�����2g�NY�(�:�Q{z�}v3�*Z�Ec�h�a�cM�r[���T������/�N��3l�_�Q�&c�:�5��e������Dd����k�:�Y�������y��6�^0��b�L���%��F�/''�����E�N�[d�+|*&���gMDO4��<����Q}����0B��JC��a���^�|>��f�$��"����_�!����r�F�s�|���I��Bp��PJ�*��$�,->�[!�z���s�{�����I��U~�5����������W������O8C���� �n#D-�5Ykj?���N�0Kq��m�	��i��F��.�i�N���X�P�1��e����8��o��9W>o:��2��I	��������~��z�j�Y���~>��������v��"'�A}���
�������v������j���>��.��Jb�"�CPQk�����?`J�����~������k
i^J���Zk������3��S�K����V3xSY�
�xG0|���3��j��'��9XZ3��|��f?����<��K�z������d��/�����3�Gw[m���g�����D���EvL��]G���CX���o�B�,@p���F��d���#�bVP>��������f�E��-��=��Hs������0�����!���8\`��-@{r�w����c��������c�RoJ���Egq�v�T���Ps��)���2u�c�~����7�X�P�pg��~���P���x�wa�>����c5���j���g)��N��%�.47�N\i�����`�������p%�������"�~�W�	]V����=�����{f#��_��7-������7s;��Q�Bh���t�'b�r�1yN�>�}0S�f>:���x�
���07b��r��������3����>hJ$A�O�'���������Kq��N4��YR����Z��;�l�(-2�i�84�d)-���#f���[~�<�8Z�v�8�P�v��L=�Z��h�',Cf!V���kq������3�/���FJ�4�#�����V6j8�=�V<�XAv"�<���'X�t �8�{���j��b��l�����|�y���lv�8-����<o~��t��b������+����	�����6��+��z�a��:�j����._���9]�+���f�H�^i�����T�v�PwN��E�X:�v��l��V�i�|��-�M6���\M�'��m�����
�������4�s�3p��gZ
zq���M4�w��q����|``��U�U����\���6�>�6�����}�=���������s�����~�����ZW��#�6��+������D{�!�?]^M��A�>h�<E�I���'eU�Kl�7�X����f��i���X������
\�63����jBnT���
w�CXo�C��|��#f���`�`NB?�}W��n,>eN�����=���f. ����+
���6�E%��	�f�z]�e�2��#�~���
OP�3���M���4���Uc^���)�)�������������h0?���54���U �����5F+k@	o�q>�V,R|��Z1��xT<�M_�����T�s��W�T����Z�Z�H{_W��}g���`Z;���sK�G���Z�b��G�����_hK���\1����i	���,Ea��I����9W}0������b����w��hM������������h1������u�2��G��q��4r��E��}����b����Se��1�|����d.��
��q�UV}3�������sb:F���c�w>Z��W�1��U�h�)��/�`�V��\�iM'�Pj1U�p>Pz��uu�F��A��%�|�YK�;�Q�u����
,X:����'��q]�Rh���.�T��`��������`�7T����(�b��_����5Fz��g�/��\7����	��k}��z�o=��C0�_f���45�L.���^����9�?�]�/�H��,](q|����mW�!f���
������Op��J����,�����o{(1��AX�	w�����e��6}-���k��>��"�o��o*G}����h�*k�k�U�O��I�����vI��u�cXqd����-A�����lu�r�U�=n_���UX��L����AoM�B���u�s���������f��@�}jj.
+#�w{h��^B�nk���,�B��-0�ws���[Rn��|��������|�Q'}W�������Q�C�����d]���uY�f����_��/�
v����*���Xa-���^��|�����xQa^HAgY�f�������t����qYb�����q�4�O[d-��x��e�f��7��z�y���G�>���%�>n�����-��9~��M��N7��Q������
K�M��)T��w�#"���{����)]n=E\o����R�����1� |���	�;���h���2V"����g�'
u���`�Gz���t�G�r����0JK:b�nR�*�Q2�`�]92�+��X6_c��k��C��7KW���;�7����V,�Zg��;�	�-Zh�m���+����r%B�MOO������3)����RS�������`/����;*FK�n���8�uA�]}K��)��C1����y+;�Ti.�[����-)��&���4S�����;S���?�V����
/f[�����L|S���?�������{*�U�0`q�'_��;
��������2v-�x�k*�D:iG�r�)�&���JQ4���M4���=.�U	]����?���)�������J��j���r���I���V���N�
0�`����#+'��G8/df������q���g}��a���v��Sqb�R�*�r��wsW0��JlO���m|���3E����cx��Yw�.A���\����e^@3F�QS^8���������3/_��C���c�C��YC�'���`��y��}�P��'�����E�>����M��]����;{}��#���h����4a���������6�G�^���a^-#�)B��*��O=ln�L�e���cs�lu0��F�`��wHG�T:���|���#U3��������U����:���a	2��F8�|���k	����=��~�����L:�v�k#��\���|��)��-7����RE=i��}�io�1�8�]D����&�o�p����M�"��
�������GZoG�v��5��YI��:�`Vv�5�a)����a�������L��Gja8�s?gml,Zm^,YmN�,4����}�" ��:W��:uW{�|�A�����L���PI�Y}n�i/8��7'�C����3+�t��/�_oVw=b��,0U�X\-�1��?r���3t��������e=X����j&��c������9��g-n��b�l����|��=,�^b�@�����_�~�s>v�1���/X���6���KT� �>�����9�`7�<Mr���h�:n��'i�]��]k����"�T;��r9q�>�]�W�����7ue��H���p���e�&�����m��b�G���U���p	��T���qrW��z_���l3[���A��X��c�Q��R���M��.]aN���]?	,+��\���M��)\K�7�}�'M�`-�y��*o@���w�{~-���+�mO�d���g���IMC�i��3y��`�W���0��1,�^e�����[�0�78�|y����ubIR�={�b�):�����]���;$0�U��m���#���u'����;1���[������27��p�+��b�6.���+�N�������m���qc�2�e�!:~����Us��s����B4�n>�0B��f_�
�D�r��MI��:��n������uW��W��n�����q}�Gg�	�"+���Uf ��x����8�-g7e��{�'.P�1�V1����p=�t�����qnG8k�}{8�C�o�%$�{�e=��A6�X���O.���,��|{�<�z�{oW�6r-�fs�7c��e�[8w�k��u��+rN�����Z��vl�&�v}#�V!���s*p�]p
�+p���}�}����w.�N��%���J������c���R��e(�����J�����ynW�SA�J������D��v�'�u�0[8����B����Y����U6/��]i>w=����_&jf��ll�M������������R�<\�N\v.���R����m�D��0�r�����|�%�9��!\O�`�R�y)�];����6�?j�E���R���~��!,6}��S8�
�p2� K��U������x�����	��~����VE�C�V�D���u���
�<���l��������S1,z/|&��O�q��m�#�{�iU.��p� ���)��y�����EA�L�[G���I�K�{�^��9n��7����#��m�8������Oy��N��'����DL�oq,(p[B�o-G2�����e_69���a��Q�{%��o�}�� ,�zV�:
c�c���]��ml]�rp��F9�9�}�_���K����f�v�\���s)��x��8�:' �%�y��u��1��~�^
!���'��2���!�z&�v�����S�\�6��5t�l�D��f��+����R��T�}^��;5�b��p�*A_�;_'��A��M��M��[�17��cX���q����B�/�o��0=���A� p�Eo��W�\��up=O�]{���l�Nb�
A���uP����{ve+m���
� ���<���~q�-$�&�V�
�H���{*_�R�ZsOp]���!<%J�9�N��?����]��o�%I���9���nd_e��P�D��[�|[!����X��.��:�0l�Jd��-3��>���+��w��|\�����������{j|C-��8� �1��c<�Sru4�����Vr.z}�N���T^aVt�d�>��t���m-�����}m�������������p8q�p5W~
zRI��Z����]���n�gt�6�N'P�=^�r#
�l8�����-���%n��	���][?eK��b����:-X�����Y!�L��-7{������k)�������vZA��TUU�����I���s�����7�i���J����v����u���b�-b��@��vC�[7��h�L�{j�v#�*����S����2N�TU��4!p�!��j	���-N|]}���`1���L�����m����q/E�Z��r4�R�=���0�C�_��<<������J�����O�i�D���\��$���'�e�y�T����~���PO;��U�����%�N��&e�B��?��(��9���	�TK6:�H��A��7mpm��D�<<��0k��$?Cy:��Wm%7&�M	B��,���+�sC8��#y��:I�����In��0�YU������E(H.A|�	��c�N�.����,-�t;���G�+A*�;^TCi1sFx���"���Um����*"�7�����b������2�/�mS�;���3B��I9�YL}8"��(�6�/��*�c����x��}��O�^
�N���0����\�Msx�NH���/���r�&���S��"�>��/��YF�}�
Z
�JX�%y&�E|�����f���(��pm��ik�WM���5$oplEh�}�����%��/��5r�8��7y����'����*��Q�8x���	��0���)$n���ik;����,�p�}/qu���'�=m[O�8/��[!��N��j�SB���j+���'���WX�s}@�'�$��^��hK�,���oK�^���c�-�)���y���q&�m���s�D���o�/��?Pp':��S����^�w$�V���#��� 4�L����:w�g�e�$�"2��i��8������K�>51���"�@�TRJNX��N�.�M��	��t��R\+��Q��=�
�%��5�;F��@�b�5BZ�]Mr��m��x����q����s[�~\�7�Y_Ew%��*l]�3<hZ�p'\
��$8.�}�(>�&��:GI���\���`����0�r�S1g�M"L,���E�:���h��!y0����@�B[e�5B�W�I��h�Q����bs����g�zqD�Z���<�/ZP
�xY�9x����+�U.<�������p���h�^\=m6
�3�>t��^�C��_�Lp�$�����3����\y��&�n�Q\�����{���O�G<�w�\������;w�����U�`��T�@sp�O�!?�m�@�6�@�]�2��#�_��'���IiUE[?�cKM����Z+o�J�l�DY�'������X�r�"qu&nW�&�O��d�j$)I�3.1�$�Au����1(z��*'��c:����:�mM2�m3�ug��8w��-8�i�2�����U��(�Sx�{�-��=��.=��o��i,<.-\|�P�ZPAQ�� z�>:'��N�F����'���[�;x"�X[�D,���pb�J<������{���B��_"�,p��)���6d�wT��B�\����?���������j��/[Y��rw<&�Uf�����,��%������}o���-|*�^)�{��+�D���m6a>�`�J��'lL�F�y�ya3��#��k"#��-������O������:��~�H]Q.o����p���x��r���������6�I�������i���a��qBus�t�$P�^$�+o�}������o��0�L��Gq\��y0��T<��CE�`��z�����	�'@QV��Yx<�=�����7����7����U��n_%JH�/���Y����*�0��P�V\�.?�������b%���r�A�\���3��	�����b�m����uu�|�~���[m��#h����������������.o[��g#QV�=,v��*���)�#y�� W�������A�m�$Nl��6�+��=��(\W?g��!x��]\[��;<o;N�����x�i��5���A����r�"���T���������g���`�G
�KH���ypm ����VQ�~@�S��[�Y��6f�������[�1�=�h�d��v/L���~����������*1^g\�O�u�rW#��7X�a�
�Uh��$���_b\:h������,��i����	��j�Y����~r����K@���������0�)�����G-W�2n9@�BAK�b��#0k�eu��(���9R��C��js�G$a�A�q$���<y&���6$X)Ww,n�$p
�����H?��z���4��x�]�1����b�*��g1�U7�Xf��W�a
��q�_P���k�F-�$HpLniQ7������pHn �����R� ���}��q*�6n����ZUl8�I1�FtO�v���2���GL=Pm�����Su����:��/1���r�,a���������3�l��g���7Fe���v��������vzV��1���z�w8S+�-$�Ut��1���Z���5N�"�R��~���������������'G���S���ZD��/������ApZD�A;���1O�+�z�@��
���n��> �'���cc����H��W�D�~(��*�8�	�����|D��G+� �����B��#��{G�P��rV�A,���EAm���E�r~�[��G������'X�,��FM���@"^����?�~��}��	_u&��{�QWJI��3�8����%)������0����q���������i�0Z)\��!8,��\`hQ���|Bo���T�2n����A���:$.1~f1������H�>���e4�I�*J]�:��S��� �8��1c �@��1bL�'����hX�{���>I�.���#��v������L�E���tJK�+K�����/�$~��	�L~�|���C��l��,���~��Nc�h�k3�����C���'d�!&�����A��������IZV)�k������1}3��eB�eVrc���ux����vw��S�s�
��v�����\���,��K�R������|V�>
/��>��\;���A�,	^{��z�`�	8eMa���#���9Q�[T)���[����*�}Q�u�r�_{�w�r���`�xo_&���3(���:G��,QD�y)Zv�&���6�*�D�|vu��8�?y��7s*�^����RK���;h�<��e����s���["i��v���}�U�p'q��������E;�Z�^&n����d��-Q�*y��2�d/S�xOq��,!��?�>#�:J@�����*�z��E�Y7�FK.&%�����Z"I�r��||�������M;7|H<Z���"Lf�)��������q1e��I�k���)8�A;��T,��z/0��?S5���1c �@��1b�91�����RtM�K��!��������n�^&�5\R�od�}�+���d!&/�]�k(-Nc��a I/�.�7.'����N
UX0��iW0>�^��MAq�&1b��1c �@��1b��1c �@��1b��1c �������v3{�lS^���7Y(@���i����5�h
�.w(jnm���]���?VK$�Z�����fv��i�80����� ������s������=:t��/.'�@��1b��1c �@��1b��1c �@��1b�Lb����u��8~!�E|��`%���LaQ����6�?2��	)�P����+*8+]���\�G�����5�5������T���C7���-r�xuM�)��FGu�w�D��W�`����/�Kn�a��1b��1c �@��1b��1c �@��1b��1�zb@����fS����������'#$n�����j||�twu�����������;w����Q���l���z��Po�uvv����lI~��K�WQQa
���&��� �'w�������������1c �@��1b��1c �@��1b��1c �@���jjk�,�jN����D�Kx���hf�l��OQ���+][[G�T�|�z�����NUU�I��P ���������/G�?Oy�BX�-4��mG�:n�,7}%%�����f���)�-**�������J
7n��Y�H��Z[[��@���L)/���z(]�;�_X�Qu�it�K���m�To�������A)'�t��+�3g���g���������}�+��g�t���g�����-~J�J��7�h���4�>�'�\�	K����t���y���-[�X�	��<Q��j�`y��+�����`�Bs��lR���~����(�����5������t>_���F��D����3��KH�
��OFa�D���GW�w�\����O��(\����-]�����t�N����'������.�G�}��.4���|6�F�3������.�G�}pLJ_w���%�>��Q����y����#8�i1�>�Q����y����o~l
�:��/�.8�����|���L!�|���F���M�#�>*_�������d�GX{E�R������6r�'���p�k=��
�m:��
��z���lu�����8V��~���G��
��ta��e�r
�7X7��}�a��-<a���|Y�\��5odKOX=�p��>Nz�C�C����F�����O����pD]��
�u0�|�E����`�a�Q���:�>�tQ�f+/Xv��p�)D�:�>�\����K�`����p�^�`����[.���L����������Q�����M�o=���0x��#^�M�k=����y�9r$'������
��^�����p��uS
.��C���x���������uQ�]�L��r�������q>����)�x����o<g��;�������X�|��������^�kqq�.E�)�S_��E��������L�\+=�x@���:322jN�:�$��,[v�=3j��]vRQ�:S����p~����y�5��7w�����+]�|K�.5/n|�D@1o�\{6��4}K��C~���:h�V����u����Y�����7.\���s����� S:�>�U���_o�T��9cq����-��l�*D����.N��2*]��g��S�7�t�����}Jm)��>}�l���������2�v�$����kX{\��a��s���p��7Q�G���+WYM�������`;��6����
-��/_f�y�}y�������=d2�No����6vT��k� �24��F��1vm�q���/<Q������A��hCmr��A��Y|K���!
�l��/�X�N��a��B�a}1����/�5�6��L��/Z
�G.�2��������d~`�?t~�tU�l��o�Lu�7����m��^D�d��#��y�V�`����l��o:��)D�Cc���G�x\7���K���T}�U���|=g�\�y�f�V�I{�Q����Mg�7�t��G������M��Q�jL��6��c��6��]�p��i#�y�r�FT�����6m�2��������c��Q�4�/�r�A�~��
Q���7����S�8�X�J��'O�LY��OT�6�d�G�|���o��1k�,s���)S�L���>�6|-���|%`���q��}�R��n����k�|i.�tQ}1Me�SQ�f��|�E��l�M�z���N�)����_>M����V��b.�M.�n�y<au�yE�E���.[��r�]��M���C�<����e��o�lu���z����J�G�5,0A~[�x�7].uP��}���j�U)�D�>�^o�}����r���A���PVV�^B�� ^�P^^f����z#���!���uJKKR���S���<���Iy��'�t��WTVXA��v
��L��7��C>ay��w:�JB�����~����s9����`R����/��bR�WT\d�F��B&ic��O��k�Ym7"/e������O��JI����:AWW��)�)�C�R7%�6��a���M�����p��M��,���\�	Z�����Z��t����_�c�fhp�~�V�(8����hnl2[�nE�?%TR�BUB�����C���E��\�a}��,���l���A��{<�tax���������T���ucrX�j�y�[�jiB�D�
�����;�p���	a�������:�u�]�.5��O6����
�����I6x��(m\��*�6�����C(����BB6��6����\���2�I�/_Z�}Q����k�qYo�����*���O�����3]Z�}q��,09���u���������KX_Sv�����+�t9T�F����<]K���`�e���h#_��������U��`��6�M,;��th._��7]6���(���6����MQ��mD�c���(������?Ny��6���7�6��4/��_{�������.�j�\Cm��u����C����tQ��tQ�g��\CX��0ldi�5��p����'N�����iO�E���W���C�����FM����?8T����h�\�
��5^6��j[��K���+/	#���/mD���>N��)�������l�!\F��a����
�[������]���7E�C���|���>NT=��~6��k���eg��SJ��$��!�����3�y��,WY�����aq���`Z�m��$Q��_��n���q�!�2��R�X���X�}�-h���L	�)��]���7�&����z��S��
nza��n�P�!�>�i�KX���IJ\l�{�&[X��\.
%��?�zx8��.�z���gk���I���o�&�'N�{>x��e�����tBT�Y�l9��)Z�hCx��'S�(�
���������/����f�����(b����L�dJ�w����zF�X���T�E���|��.m�S�(�P���*����Gm��6.�XE{�����b�xk-��D���6����e�5�6����n��}b.��V3��L4o�w�a����GB�j��O�|��3�$�K1���`��k��	#�k�{���r��`=|�O�^s�9B��<����<����;�V���{��L7�E���o����7��K��K�m:���KE��x&����q��N�6���l�_�|��t�=���R������
1�W,_nN��a�}\�^�|����*�I��q��Ek�L����������O���������()�h�+�RxS��7�-
�7�6D�����
��c��FX�Z r��v����c]�q��ng�<���@
k��`�y<H�JAk"i�+L����
�����L�&����|h5mD�7~/�a�v
����m�m�r��S��E����=���6�M�a����Z�Ka����o�n{x���.�}��>%��\�����G��|h���7��=�=w��b�������sJA�`.i�`IQ���:�3wvv��`��A�u��+N����K���O�r��^X��5�mQ?���a�n�R���,?�uUmY�L�i(n����vTy�����6K0�n�0�
^�)�{�t��3=����h2�T���i�����0}�{M��>��s��7L��x��(x��U��K�`���b0n�����������H��<*�OM]
�P;�:������'1'_x������\����B��,��9P��B���KSQp��W��-��-=N�9Z��{6�
�u�>FI�J}�[i�������a�fz��#707�t���E�����5*]���o�08��#H�����a���3���M�����(�Lc��u��6�W������6��a�n��%������|���!��}m��sA�.�����M�a����o�}<�tQ���a��o����o�����K�0Hj�lk���6����6��m�}8_���WB�������8�'�G���6���.�Ko�W��v�O��XNw��K���pQ^i����>��
���7)^>����7��������&��t��jm��5_V.W�+���K�������vVJ0�(x��
��-]���{�AJI�]�a:'Ly�����a��m0n�^y�3����^��4�+�3]Z��g.��
�t�����[�|��E�-S>���������|��rs�zK�G�\?��������!�]SS�inn��a��s��D���m(�|�)��9HiE}Mg%C��`�\��GF��s��1���q��F8OQ���������K=�Q��Nx.KO���OX�7���{���LA��Km�[:e�x�7M�����ZA1�\�W���T�Y�O�~����618�U[__k;���2��"+���������Tg�,[�|����4���
�0����#*����7�U�o�o6x���p�T��,;�{/4�M.)��?w�&I�����r����w��i���������#'�6�LWiL����4���|�����U��iCOX��c����[P��/Z
�g.���:� z����[t.����0xr��|�������D��>_��7�/7�*��p�
��7�3=}T=�p��|�����Um\u�@�b0m���o�`�a�a����F�*�3��.�o$m�O�}<�t�[��o�4��������!*].�4��G]����6o6x����|��oqb��.m�2���3���F]�������O����W^����8�/F��/;*].�}����F�+f�~
~/T��J�
��z�������d�:jV�l[���'_x��y�h��+7���[1��O�s�)_n�5,���	��G��k]��!,]6Z���Qm�^f�sT�j1S�����s������J�F�tQ�fK��a��\<��E��-]6x���Qu�eD����O�Z�a��`~a��FJ�o�`���y#J�-}�|��o:_�t���E����f��WS��Q�'�������%������������������)�����\��	�Q��q���K�� �����G���������?�#���$�nkll0g�8w6:Z��/^l�=:t���[��eu�bww7f����+���3��oC3w�*=�tb���/i�/����'O���� X@X�;?1J�Vnoo�Eu0�W����)��N:G����H��t��z:r��~���,Y�����?o�������?��Q�������O����$�3f��\��Z����+WZ������h^xU�3��6ka}X�����O|_SSc]m���t�G��N&������wu���4+**�u�]�Bsb�,d�.�����O�~�����q9�k�6����=������C��d��`y�]��Z�t�P���p_e��
��6R�L�q)�� 
h������Q��k&x�������n:� mh�����hC��p�k��Y��l�1]��~�!�]a���~T�����W_+mh|�4���b���o���lT���!���F�����|���a����s��s���Bu��<J����uEmH��M�Z�[w�8y���v��:x�ak�(�x=���12
�|i#�t����{�������y�r���/}L
,[�l��5�	'��6��������}�th#j{�h#������xX�j�-].������ ��j��Ow����[����8�KO�Q�(��mB�s^��&�����`:�EjO�YZ��=��K��X6����(�����p��M~}�o$��&�O���.�6�s���������K��h�����[��)����l���S�������ec���>Vi����-��F�t��-sp~����� G6��)�5��G�7��|��o���A�����#�>������
�����upp��������pk����	�t��t�)���:7[��������*+*l���<p���k>o�x{$�+..�{�;�jbB{��i	��S���+V�~�C��1b��1c �@��1b��1c �@��1b��1c��c`&�����w:
5���s,.��� ��d�E��)~��Y�f�\�F���^#��)���>�@��1b��1c �@��1b��1c �@��1b��1�s�	�&.�P���oqub��1c �@��1b��1c �@��1b��1c �@��1���&_�m���c �@��1b��1c �@��1b��1c �@��1b��1c �B�<�'�1c �@��1b��1c �@��1b����	p�y��+7�*��6R�@��,���H�����dk�Dv����J<S��*��=�r<��S��{���R�y�J�{���0�"[-9�h���K�E�� �"	�x�w��{�����������}����Ow���i@@���|C@@@@@�@��Sh�� � � � � �  ��� � � � � � �@�*@c@@@@@@��A���@@@@@@* �T� � � � � � �D:E=�� � � � � �=]�+@IDAT P�A�
��@@@@@@ *@�)��7@@@@@@�
:U��, � � � � � �Q�NQ�!� � � � � �T @��4fA@@@@@�
t�z�
@@@@@@��N�1 � � � � � �@T��S��o � � � � � �t��Y@@@@@@���|C@@@@@�@��Sh�� � � � � �  ��� � � � � � �@�*@c@@@@@@��A���@@@@@@* �T� � � � � � �D:E=�� � � � � � P�A�
��@@@@@@ *@�)��7@@@@@@�
:U��, � � � � � �Q�NQ�!� � � � � �T �X�<�x�i�>-���+V����ss]g'e|dT����87��5 � � � � �KR��S�f�R��WwJ����+������6����VZ���8'��$ � � � � ���� � � � � � �@���&$@@@@@@�N���u��	�����uu2�#����������qgt�t���ig�ft�Y��^���?����:W��M���������eJ�����"3��0�Z��u�u2�P'�
��~Zf,I@@@@@@�����B�I"MMkpG96h��@����T� uS32���56i�hJfg��S��7��)�7��fg-��Y2<�k�4D-5c�+�SW�A&�I'�V�����i]�Mf����<u�<�Bf�u�2�	M��s��,A�Q@@@@@@�F�*�����Frf4���� X���&
6i����������4���K.T4#
��ID:��69��� ��P��u$���QSS��5Y4�����~�F
Hi�:�N-����I���U�j�[��M����?
8Mk^f- ��pY�� � � � � � PS�Ner�N�����4�Y/��&���jiZ�L['�����eh��<w�g2|��H�2���N�b�aV�a���Ff��YH7�p�\}�5�|y��X�L�T����������z��j�BE�Z��������4H��m�|���J[[��im����2<0$O���26zZ�GNH�m�a*[�����A1@@@@@@����������&�����;�9_V5h���I}w������Z�\V�:O6}�V9�A���p�L7jww����KiBc?Sur�
;���/���&����L3:��_j�����_������;�����x��X������������u����p��x��u��1Y��Y��W��?�y��C�z�fL[\Y�{�k�d!({_���@@@@@��A�R)g'ebtR���g���J�������7��%/:$g�ES�]r��W��u����U��������968$���������W��m�*����9=$�������1y��{r��e������[�n���jk��n�Z~��/����LJ�v��RV�r���n���O������{X��J��������+���k��e��dljH�P������������L� � � � � � �T�(�`frB�:���k�����'�G�?)����e�etzJ�{�ey������>*�m���)��}�<y�%�]�5�������;-
����������t}�L�5j�zoK��o�/��'>{�4���6]x�L<����o��Y%S�mr�u+�uzT&������=y_�Y�O����[���?#/�������29~Z�NAs+�bO�aM��9���@@@@@@�6��CQ���2u^��r���������32Y�,����mE4�����?>����w8-[%+7�'��l���)���U�j��L����NH����>��R���:
���hw{�24������4N�0-
���fdbfJ6m��A�Fm�4*o�|X��j��7H�u�73-��32r�y��w�^[E5L[�&���6�?��+���@@@@@���SI`�Zhz�\~I�k�M9��;2�����&
Mk�H�;u �������7OJ��kdm{��/o�C�dz�=�����}w��i����H��&���^#AS3�2;5#�������\�Z4�4-M/j��=M�r:�6�
m5�-��^zM�oh��:�j�{:��._�>������|��.����
95��ZK'�d��N��@@@@@��A�Rg5���]�z���2���&��������tB� ���)��V��� �[�4��%mu4��O�����hz\[&��j�I���A.��"������.�u�m��aD��kvA"�Sf�H��F���Q��p��R�[����f��]M6]������3#r�5n�u��Y�4s:�F�@@@@@@�
�0J
�\�I-[��
���h�v�2cA�l�Ic9��������)
�X+�Y�6*u�j�G��4;^'�t���a���I�h��Q����R�e�F������m�4&���5��\���!�m��V�N��iV�/ufH��A����,[:Lk�t��m�:%����u��M�:1 � � � � � �s&@��Z�:/>�������f��Y�f�N���WL�L�2�mh�FP���i'�e`dL�;:������-���%:5*����]}������3��o�}9��-�Q�����tS�j�)}��4i�q�v��	h>���_�u�g�����me5��M6XK,�+�"|G@@@@@� �T�a��M�k;�`hi[��Am}4e��e�����J��j�=��Q]�vu������������[��GV/���rJ������:*���c��A�j��q
T�~�Y�r��?�-�f�:
�����fQ��A[@ik�:
t�.�d��}��������k��VS��T��*�O���5�b@@@@@@j$`�����0���?��p�FY�4*3�gdZKu�i�@N��vo75%g�/��/Z#�D[1M���OM�4Sr����}M��������<�����u�8!��]��O�X����IC��f����fi�M����%�;�x����V�����4C��I�k�|{���q9��lX�Z��%V���6��X:��������+� � � � � � �@I�Jb�`NS�y#uZ}�\yA���G3.���o]�n�4�#S�2&[�K�N�-����7NMjhhBV_�E��{_�����&��lh���&m$5�iM���k]u�\p�j�o�������4����i`��w���<}W��6�<o�{��:�7����uY�u�i�e�|�Ji������BO.��A'@@@@@@���J�k���3n�e�����n��^���[I[%M��3�
rzl�|����5M+�����q���LL���>3%�f44�LZ/[+�����L���3c29�B�Cu�mw^!+f5X��A�f����u��jvZ�{_�wF�E�.����\�F�ej�u�751+�g�dm�����R
jinu��d����I�5��@@@@@@�Z4l8���k�������L����LZu%&N��+okP(3��y[�5_&Wl\&�M��y�%�����?,�����n����M.\�L�g'e��y���dXG���qM�����I���j��r���2x���O7�����57�&���^�i�z
05h��A��^�7@i�}u�����;�.W\�ZJ����J9���:1$S�������q�����4�T�����W����2-���h���)@@@@@@�6a(C���G�������k#
Mu\�S��'01��<����x�����G/�/��j�w���B�T�/>��Cyj�&��i���J6�����F��PY�1�{�&Me�l�r�|�����i���e��ect4�@@@@@@�9��S��^��/Wt_�Z
�[:�N��[���7GdyK��Z�,M
�^
�'���Qy��G��g��t�Y��y������5_�
m���yzbPN}Y�i���_
�h�F��\'MTZ.oFZ\�,��%/����dm�
i�Y�7�yL���q����|�
@@@@@�F����n��S� �"� � � � � �d�@� � � � � � �@��w��`F@@@@@@:� � � � � � �T-@��jB@@@@@@ ��>� � � � � � P�A��	I@@@@@@��� � � � � � �@���&$@@@@@@�N� � � � � � �Ut���@@@@@@:� � � � � � �T-@��jB@@@@@@ ��>� � � � � � P�A��	I@@@@@@��� � � � � � �@���&$@@@@@@�N� � � � � � �Ut���@@@@@@:� � � � � � �T-@��jB@@@@@@ ��>� � � � � � P�A��	I@@@@@@��� � � � � � �@���&$@@@@@@�N� � � � � � �Ut���@@@@@@:� � � � � � �T-@��jB@@@@@@ ��>� � � � � � P�A��	I@@@@@@��� � � � � � �@���&$@@@@@@�N� � � � � � �Ut���@@@@@@:� � � � � � �T-@��jB@@@@@@ ��>� � � � � � P�A��	I@@@@@@��� � � � � � �@���&$@@@@@@�F�����z��%��H�^y��@n����]��ep��r����Kvw�����K��.��tH��������G=\lC�3m��b��<�m�Oz:���o,+�~���[v�~�S��E%�o�;��o�XM���8v��s��7�w����Xj{.a����g��eA����V��E�|��4��0��X��>_�P ����R����)��)�,	�!6�;���>���Qp���;K��e^3�������e�o;E��x}�����j������_oW�����<��C���`�m���,y�8gy���Z��W��8o�EFTV���g��u6����X��%�c�KB��"�������V|�N[o~��G��z����
���_�g,6��c3���M;���r�)x}P�����E����s��[P �8���UL���j���e��^�:z�W���/���w��)�L�%Z8���{�D���^���������$[{����&���#�����iE������_��Cr�<�P���:�0�G��w������]��=���6��E�}!�G����
��y��l��W�T���S�~t����PF���0����,U���V8���)����
�R���Ni_�7�#0e�@���A��eQ�D���2����^�q��OfP��mP�2e�����Ovn_W�Z�sI���u�K�Y27�#z�����s����A����/5�5������W#2X�:vJg��W��e�U�X`�?:�����}h��j�-�}��uX���������D+�rk����'*����js!��K:D��s�����y�g�A�9_�P�������z�B�g	�;�����m��rt��M�� �m��������[��;�-���pK�Hd�*4�����.����>��w�[vJ��tuI0*����p�|�f[��d��.��M�&&���[��*`m��4�-[q�*[b-����V���V(�/��c���n�Lk���0	������������#�j,X�������c�
�O���jC,9����s��.�(���Gx[G'����
�l~s�A��6�v�ni�<��������h���_h��i���n9�t�~}��o+��?�Q�<�O~�=u�w�yKqJ8^�ZLE���t�50����<����s�Ev�V&�
�������
����X��d����h�Q���t�E[`��u�/�8Q�C&�n�u�}�y���
����H���h9���F����+-Z���zQ�-����D���r��[z�����v��mu�����0������b�7�{�,g�5� [���-+����6m�i�������/�o����y"�"����bD��������z[��������m��7~m��������<*;��nK
o[������cGf�v�M�5:}4��ny��x��p^,�"��������wx����".��u��EwK�������k���k�+�F:O���,��w�Q���sV[��>�+�=m���J�����B���[��h�������uM����/��(4y�*�n|��,#S���3p�9��S����~��������������
��a�c�����y
����p�x�;v�}���uZ.u��}���2�����/�-��=J�>�����P>#�R�����u��1v��v�y����m���r�-��y����������D����(-#��_��#��[���k��,z��e1�,��������k�+��%^�d��w�{��[s�|p�-���R��
_�9�p/nYv��'�3�#Hv�����/���]e�.K2�s�Fl�p�h���V�A�{Xb��pz����=|x�������E�}�x��Z����Td��p����Wl���
F��/�n����ss�|�|�k���77�-'tnsy-�l��B����!oG*�N0>|���.������l�����wg��� ������o��^�}�mo_�&������!�{Ln~�-}��6��2��L��V.�.+���1�Q������rJ�r����-<��g���A}��m4W���*�����y�p���T�b�g������)�(\�r���_O�����r�������W��O��}�����i��������k��2�J��5����z?��V�:t����ucpN��*p�������{�l�-7W�X�C^9�����-��1�d�S�e=��'��5_����
���H�~��3g�c�02�2!��������K�z�����	~��;r����T��w���|���Z:����� -�B:9��27�}���,�[�O�hE�]��y4Hk���L��V�e��L��;�zv�q����
�\�} s"���S��68*���w&��;�vHK��Vp`��}@ov{]0��K�K2�,�'�e��Q}�>���;��<��~p�}�} w��������=����� Y������������L��}B5��{���N�6N�'��mpr�VAA:��|�-��C�sI[x�oA>�v��zr��u<�(4��|O�To�^�ie�q����)���Vx��O���}�tZ^�\���e���,sn[� lf��X��G�u���;^���oC�=�������{0��K����'�r�Rv����������D\`��>����+�/�m�����2��t-�;�R�?i���v(�����;zS>���=�.rz�����].����v��
���_�>���r�
�e�N�����=H�����I-��J���z$��"{�Z���[/�!qO/����"eV.��e�����v��V��F���mm��Z��"��wZ����:.��m�U���\���h�l�B������6s���S�f��)�!-�ih��G�sC�n}.Q��iH/N�u�)��Dy����T���������-p����B.���[�tn�@e�^�+eH���R��s�sOW�<��
����U6~�N��Z����'OHY�������;dW���� H��n?��K:��!�<��6;��`�T�f�uW��d�EP�>�z.��u�m�L��L�^����5Q�5|P>���`'���k��r���{Ek�$���]����`?�e��y�:�m����r��C�~z>�H�Z*��
]w������:h@V[��j���u�]���k��-������q��93V���Y+�>�G+t�!Z����T�d���5W�������
o��\����%;�1�����Yt��,�K���N6��HK�n�6:36Ti��.�I�q;�:�]����G=V�b�*�v��V��3�*�9%�:.2]��������k���%�F^��n��V�����A+�2��k������Z��k��Ci�����K]^����������V�
f�Y�1:���c��-T~���C�]���k�L�wM$m����`;f�e3�_P�9��Q�F�l_.p]������c0���������I����������m��Q~��?:���+B���$�
������	�K�-s�I��GK���vJ�����c*���s�����P���������[��n��y,X���'-����@K��������J�(��������R�G�G/�	p4��������_���%�{��(H)R�'&^��������Yb�2#�[=��]�k�(����<��(|�i�z��k�R������:��}G��ZP�d�"�vL�[9u�)��;E��8���eh�����/r���_����{�H�{����[6��oh��A�_|�r�����\�{�������'4 uK��������C�Uh����~��p����
Z���Y������>KH/�s�:��qz��*E����.vc��\������Xf�C��?h����.,-��N��[Dx��2���m���u��+��x���9���I���_��7=VQ��VG�:tn��z���z�|��F�-��sZ��%�lP��S.<Fzf.Dl��Iu-~���Z��R}_n�A�>_����R���]B��5���T���K(�T����@��������
�
a�y�,Uo�����A}J�E\p�$�B���m����}m��>M?z�drQ���={��������v������,/�?f�c���.2��U���e�_������O���L��%�D��lAk�R`��>bO�����W+W��$#���z�����C�C�����75~D���q���=em�*;��`�"�z�q���2+�^i�B���p����6B��+t�X�a��Ee������#|��':N����Y����Pi�b�|4�=_��R�y���vv���wI��9|{g��P`%w����]H8�����U�j�����v�i�Ln-�{
M�����j	lp����,�[��yz���2[R�� ��������hW~��	�����^�L��^���(6��j���HYm�������}*4]��6|��>0>�C�T�1���9��k��fS+����=|����������<�2�*t������S�e�������'�.��_%]w������>g���9������{��$S�Ye`�o,0�����Ju��
�b��vA���N��+7�~*t��"��cL�g��a���h���������D������s�m��'s��\��R
�k����4�|,i	%�z�F�;�F��W�J��]���n���w��Z����)�kv�r?��*+���W������w~f���u�W��������=Wh�K/[c�g�����l�HJi�D&,�%u��;��Q�Z7S~�]����\��sQ��C�Ez������������!�!��2-��-��jw�l�����f������y�Uj��d�7s���-�w��9����d=��"���"�������B�\������x=������?V����n}�#����}d_��������u���<:���_��+�<K�SfdA��L�]�_7���v��p����^b�B�PZ���_���`��u��k��=g���G��S�^K�}(�`�V"���{p��[�x�������Isc��)��[D��.�O�Kr��J[������k�)2hoUz�����wXwc��x{C��O���z�W1�yr�.S��f�n���^[�d���Uf���E&=�q�;
�]h8����
V�:��#�g��l@�^D��j�/}
������;�;����/�KL��o�9��]z��N�s�����^��������	y��byt��k��'��,/q��[t����� ���u��S�6�o���n���@�E=Y'���d2�O��:\��c�8u����H�0�\��I��u%P��C4'E�{t��l[��5�0���m=���N��w�����eV���me��E���r3^^%'���'��������IM�Cn����UW ��b�+v�r�_j����53i��_X�~�?QhL�vM���=��}��P8%��{��;���KU��)���'X3c�����&�z���\��v���+i���V)�Q��5���.���K�2@��t%T�'���2��9�Pl/�H�?3�Q��J����%�C�:���8/>�������(�}��	��g����%��J�o���K_D�WW1~ 4�*�:�[�ju�k-\F�����
c��hA������V�wd�x/0[lt��'��|�x)p\#A���= 4s�����s�����.����y��������mR�1�Z~�`��^T��v}��*�J��p�B�y3�q�ek�$��46M)�pi��%\xD�}8:���R�S��
*�kq�r�����\����x�b��\w�A�9���u�:�2� ������R�����q���,M�/���s�WJ�����t^_O���/?�oZ�D�>R��3����.�[��*+�r�(�S�v���(�~�<-�����a�,/��k<��������%��&���
��GbSU��+����
��g�^M���n���Ryr�iN�N���
���&RY�������eOO��m�q����]XjE�>�1��������������F*�C����������sVg#����.2m��%W�z�����z	'��u�#�Wx�}�w�v-��6 �GW�WR�S<���=U�o�)��?:s�[��&���*\�}CG&���2��Q�$�{�l=l�z"9|\�}p�4�MZ������2+)�s5.�|���<��������%my�km�B;~|�c8)�s6��|��9s�"e=�����o6�d��u=���/�']wt�V�����~�C�PfY�OTxO\xnd����i��7��Gn�y�T�\b��a���t��h���*����K5Z�]l�b������P������|&��v=S��JX�\�*\��F���-�1ZB�3��K3\	��������Y�:(q=&u��I������o�����9�Y�1�V~�cz����CRi�e3���r���b��m�[�?���������f��_B�k9*�"o9E�(r]�
�F���U�e��y�v�R�'}���i��/v�_R��H>j��p����R�5*;�������q��{�QJ�rC�W�V�WR���hB�&��<��o���WO�<+����NB�z�}�]�f��w��bf�����Ce#�
�����$J�+��|�����N,��l�����)�X�|����B-E���S�g���o=���T��W�-�uC���qR>�H�O������4�b�����X>R~���d�d�fU;%�{��_Z���[���i],Y^������k��G�M���&��Vz�����=��d���P�%��c=���V�]R�0R<8�K�q�x%tE�y
&���g��v�����t	�q�>�����*a������C���2+}	��je_�*7������1$���I
�C��,���~)cy%��z�Z��%���H<���3��[�����6k�4��o+�B�\�o���]������j\���~��'n��OpY�]_Z�_�WM����}S�%W��f�=i��K�[�\��t]u��y��i�|�r*�d���=DQj�7i�$�Vn^���K�^��3m��)�c��g�9 �X�_��\���pv�}���l���h�������u�tE^�r����Y�c��2��Uw|���@�s>�����uP�zJ�����Z�V#�����������a�T�X^5��EV!���c*q���������`{�t�������e�I�B��j>��cE�qx����',���>N`��G����e�����M�-l|.i{�.��k��J������[d����a�x�`i]R����3q[d���[��)�)p=�s[�#������E�_��m�.��	����`
�j3Tq�Q��Un����>����|�^���9��Q���s��Q��/���]���Z-[o���t���"[R/�\�������J���!	��v�����c��)o���#�=������U`+�f����G]Sc[Rpa���!���*>��j�]�����Gl��~���Z�^}�=U��N��{9����H��63�|�����}�������/M,�f��ed�����)����}ZK_�U�z����;�{�\��U;��{$��r�X�]�H?��4�,/�>�w�������b��?�/�O��H�������gE��������^pa�������� ^)A?���J�\��N��y�K-{���n>���;s����S;�o���"<W���4����tui�`p�n�����%\�j�J�h���xY?e�:�s�[�R��������t�X�_��C���v����+������g�er&/����W�W�������X�25���=��������Q�����EG�����]�D��o5.k\+|},1(W��`���C;fV�uI|�g�%�p���I����6u?�]#E'.�\�7m���a3]���/�t�����K�;o�����e}/3/E���^zf�ei��'qe�3��������������
��	X��=����{e�����:mO�uy�,��/6�{��4w����R��=\�<s4�UeX��o�P��U��R�:������������ue��l���8Dw���+Zly��n��+�o�1�v
T������6������|�,�c!|��7h��>���V$e��,��mYNj:e����s�] �Q����2�>�oK�������s8�����k�o��W��V�1\R�b���|���-�k���
�;�\��df���pwN��}��WJ;��H>���^����o�c����)C����L�sh�*����s���L�l)���_^�mBy�[@������>�����y��I�r:`������n=�/kj��7�������	�D��/���G������s����a9�D����^���J���{2���j��)3��n!��;��_������hK"�s/k����������]l��M�R���K��huhW�'�����Z��8���]X�� ���>�"����{oLG��}�k����'�^����K���^�6���j��������V����v�
�>5��a���������W���.�{:�%���^�����Z��K�v?�{�C�K3��!�wNB,M9�Y��������hW	�;�}\��~��
��t�O*�}��O�t_���[w�	�bN��u�+����J�94a��#���m'�R���//X�H:�R�	��;���.+)�YEi��v`����{����)t��d|2��H�~
��������w���%�t����1��~=�F�]r��}yF������=����<�ZW ZQgeFh"[����������vi���AY�.�w�+��D��^[��<����������`j��.w���A��������:�f3[������;o;��<��Wz����.�s_��OuI�g�"�U�{��3��Zd��U�X9�_�g��`����x�b�3�^b�=<iM�;N��q�����\�	�����7����^�}]��@��kZ�m�������w���r]������yeSx��M��]�f��$��}�����5��~,�`�i��������3��==/A������eK2��l��y��s}�b���!0+|��>������w���������B���w���5C��G[��uc	�E����_W�d�)M:�[l��c	3�FiZ{$_M�f�%P���c<���_+j�7����p�uj,Wye����{7�>s��j�����u����N��k���m�?E����L	������Tf^�`�x
*(K��t�V��9������`�v�=q�a��M�|�k���c!s-c)������3yCB9����������c8-��(��'�%����T����ek����|?t��M.^�����y����.�,��-���s��b�]�b��/[����)#C�����G��u��O��K�/�O\%�3Z�l���r��+CB���L��=��u��z��d�M���<[�����1=��~-{y�=g.�JZf��_��[��� ��b������2��y��	�r��n��r#�/��'[�wW�A���A���{��^��{4�t�|��C����O�w��n�^
��dS�{�x��|K������g��z��yv��)���y3,�j��Kz-p����|I���s�C�43g1K���t��M���;�*��^���2�`��C~�,�����k��>jB3O����d��k����A�%����D�Z�tVQ�Z�\��D�a���/�0���KD`~���_���I�����,g]�9u�k�rf^d�j7
���H^d��� pV�b=�����%������%��D�i���*���<�p��
�O�?�-c���4���1����|i��.��m�Y��
h0��z3��\��E `��H��o��D��[�Y�*X�����J��IX|\O.�m�!���	��i���o���������h�1��%�%��>-���vn1���������ue�[�R��zC�����������rMa����J.�r`�������r
����V�����?{�,	j#��!>�%x���f/�[.��_��/��\<��5A�� �4�[��#� � � � � ��@����Fd@@@@@@�� �4�[��#� � � � � ��@���"��� � � J�@IDAT� � � 0���{�|@@@@@@`tZ�U@@@@@@�[���|o�� � � � � �,�Nm���#/=+�|=���{��C{���R�o�3�12����R��cy�se$P�����O��_J^v����3# � � � � �,8����s"C_����jI9�R�
�����r��~O�=Te��>���4��� � � � � �5 �����;_���&�~�[n��c�rW�|���'�1�R�Zy�����zD�w����l�A:�Z��w�������W�������L���^9��#�Zm�a9�'���`��7���3�e�8kQ�����*G����t����%�|z_���gsh� ?�`��{��&?����o��|F6�l�������\��Y9��^O���
-[��G����
-A?Y���|C@@@@@�,@�z���-y�wXZ�we��/wt�!W�i�~�l9�bJ��L��l4���i��G6��A��;!����������M���������L�����yE�d�:>���.��AZ�i��+Gd�����M�N4�eyr�:���d������^�p�o�m7��9�y��\����?����n���un�������+ � � � � �,l�N�����2��Z���%����#����}���r�����}s�d�h�F[5��O�u�W���j�z�d�~���/2��l�/�h�h�m�=M��%������-���)�n��Sx����k�-��*���-G�M��\:�+/j�*6��B��z������<����T��
��G@@@@@8�^/��zGNh7q���[�VM�8�A>�a�t���-G�y�U/q��A��C?�Q�+���d�do��oI�	
Ti��d����,_~�Y�rh
����~�r���:�N$�WO���#G�D�����"I��]w�7�r2C���d��t�z������_�t)��?c@@@@@@`!t�lk�#�k�#Y���'.����m���6�����/�W����e������)���/�w8����o���
6�.��u��B��|�`�����0x'S��k7:e}k�RB@@@@@��!@�z1�/�pT_�t���I�����O�^�;�{�)]��VH��<qd�l�����U��{g��~���A����L��G�f�VM���H���Sl:�����n���L����F����T��P�5��b��g)u:?=@@@@@@`at�o�C'��N7�{�NH�k��+'�6���O���}J�yB��{�Zo����u��0d���~	�����i����k����9��w�;����M�7���Y�wKn��O���dJ�Vg����T����������Y��C�o������/���$�� � � � � �_��S|=�#94�#�]�}K��VFC'���(H��r��������^<qK��l��a��M��� ��S���
�%����}7����.����]���gd�=�yw���^�����w9(7��CYZ_^�#���u�\�Xnq���r��3"7!��/��}&�`�u�Xvz��l����I��8�M�Y�w�v=���H
��769_@@@@@@`A�u]�=��s��2�WI����,��dU@@@@@@`I
��iInvV@@@@@��A��z� � � � � � �$�^oInvV@@@@@��-�j�Ij � � � � � ��� ��$7;+� � � � � ��V��Sm=I
@@@@@X����fg�@@@@@@��
t��'�!� � � � � �KR�������4 � � � � � P[�N��$5@@@@@@`I
tZ����F@@@@@j+�����?�m��#�;��Sn�������/�X^?zT����^�e��r�������211Q��i3X������Vi�\�Iz>�I�|��9YvZ�*��e�j���{�6�4���,�[n�U��~���#/����/�\>~�����2<<Rh����}��w�d��]���&}��@@@@@�Z	4�*����U�?�<��O~"�O������w���,{5m�u���=�B��������IV������;�������v��+��w��k��}�C�r����9��M�OH���r������Wedxx.G� � � � � �n�����/��r������t~���2��%����}/Vnu��_q�<��Sn������6]�����������NNM����s���?��������_��t
Mk�_��!�tKY�+/�RQ� )o�uA��-�jU���OP�����Me��]�gwn�n���<��ljo���~G�t���*7�'?����/����6gFG��6����!Y�~�����G5����b��������
~�6��^{�5���,_c�/i������\�-�
�{�g]z��m�������L�959%�M�nZ3�F8���9v��s���t���}}��c�E�n��������,����������6�
^�����r�}��/��{�L6|R[Q�~`A(?����89���|W�=��\�F6�����	���ol]*��o����c�g_#�T@�� � � � �,������\kH��l���k����_���_�k}��p��Vj
<�����+�����m�@���j0b��I���}�~{��q��6��']�n��&��e����y��!Y���\N��H����"]�
�e�]&3�3r��q���[������~%��]F5@�x���Y�v�<���KsS��Z�"����]���;��~���Q�M:��4P�E����������V?v���'������������<MMM����#]���;~m�����������U�}�]=p�������o��Q.���u�g���M�����K/�,W^u�LMM��}�%��e[��/�`_�l��]���?zfT.��bY��"G��?��>/���|��������j���|���d���������O>)�R��4��?����g��5�uux����;�����q6�[o�%���wy���{��W_����NV�\�:n���n�c�������u�x�F���c.�vD�O���E,��R�1�W��m��
,@g�����u{w��W����A����\�����]z����o�S��c�5�v3���������m�:.�p������i�7Kk���z2�������������6�����Q � � � �,2�Y������7^C�V7�����h=���IOLN�z�_z����y����3V�m����W��|������=To��s��IW������X�V�~�]w�zOK�
�����Z=��������6�x��W�u�+W�t��I�����^�������Z�t���ei[�P��u���CZ�_�����X������X������,��i�����9�^
b��5�u����(�3Y��"������#�����Z����O���~�����e�u�f-y|k��I[��`��YZ6Lj�����|��O9��>����4^y�%����^���{����N�C�.�ky��I��]b����A�b�q�������m���U��G��eX+#�n�~X�f��h�f]�`-w��o�F�UT�Gr��k��P>��[��<�������%<��}��ZK��������9�l�M�������g+ll~�����L�G���������g�[��`����N
�~1ln��>g��Vka_������d�;���@@@@�������f@��F_�j��~vph���Z�����o��K���:r������r�WkC�%��`}�%�O������mY�zf���]��Oz [n[��f-��{�bCxZk����[�l//<������w�F:E="�lg���u�f�����n���[��6�u�f�u]gA�.����wi����l��-����g\��
�_�����R��X>-�b� Y�cV>t�5��$|���X�*���P���;��+�|���i�>���K�=>.�]m}|0��[>;;;]�g�������|vtd��K��4i=�@��a���Um���i"� � � � ������'''\`��w�a{,hc�h����a|{=H����F-(��:�U����z��u��L�C���u}>����������j��
�t>�e��M;�=Y� ������7���=�"_�v��~��.���]����|�l�4x���������`�5.8a-a����� ����Zv�[����^���|Y�lt��o-�l���vP[�����H�c���g����?�=�����������?0����Xaf��i[�����B�Z Y`���4v�[���k�e��`��zX�
K;�����m_{��F�u�VH~���`�u��6�<[�1�+��a|�f���g|^��/'^�Y>,?����;X��i��m�r���-T����@@@@��;}��u�^��7�^��Y�
���X�W�X�_�����T�O���L���j�x����zN��\���`��V�ii��X������������M,�~�u�����4��|]���[P�z�JZ��-�����o['����-{��NK��-������M��52��e���PY������3����r����.�l�j�U��O����=N��Z�X���M��/!KGY0"y� �lv�-����rA[��6���l����D545�Ox�-_��Zx��Z{�.��of`A&����66]8m������Qx�VeP1Mi��Jv�{7������u����������|~|�|�y|`���F��?���4l����������t~=���f��[���������Q/�����g���j��� � � � � pnX}���~�Z8M�Ne_�bu���f����q����&G�n��X���:V����z�i�����-P��6��N��hJ	\���>\���e�?�<W'ku�6X=�5��n��=�D�>{�?iZ����������������/�z������d_��f�?�u]Ww�&����v0Y0$�]\���*kEe��*�����1��Z�@K[�E�/��9�)4�_���*���B��K�K�8����"� � � � ���������;�Kgw��K�z����O�~:�G��UZ:�������Ex����X�2Y����6�['�E�c�����o��4�cl��(�>��i��q���y�+ � � � � P��s��AU2o����NN�V�,=Z:U��\ � � � � � �!���g>"� � � � � � P�A�[��������E�����X����r���=�:�6f=�rO/?m�G�fs9�b��al�s����6��|���c1l�����Y�����O��Q��\����bX��s����'�_?0��P^�s�y9#X���\�"��X�P�&cRj.�;�jNJ� � � � ��&`���w�
6���-���T �,@Z:-��B�@@@@����F�W��?�(�}�oi�4k� �hh��h7-+�@q����2=�P|B�@@@@��,o����G��:�����C���Y�'@`..�`���s���Ay�����X��,���}�������D�7���;��;:�W��O~�����O���4��O��un����l�y�\u�Un�+/�"~�}�?��A�ss��kj"��OP�8�&'{�j�� � � � �@a��]��������nv���r�M|���l����i�'@��>���������w����/gA��+�Uf,�t����@��N�q-h��,������?��N��p���n���n���.w,�n���2��w�y��2��t�wn4��@��\2"-���J�t@@([��O�)��EwRe�1��h�t� �e�����L�����9,����Z��lz_��d�� �@�|�ijrJ&�&#��o��l���h=��`���|FZV���e�d���N��H�����K��_�`R�������<Y���g�p�
�����v�����v��	��y����@@����%�J�^���e��t���;h/���(`��}���]}�}>��.���Z���v�������MY�������aL>�tZ:o���S�����o�j���7�v�}���~[^��/]k$�tk�t�M7��#G��A��)i�IMM��<�
�ZDY7|�E�G>�7[����t�+=kQ��#����p�$�;�8{����#`���L'�@@���kX{w�U�����"A��W������f��>�\�QJ�+�V.%�j����~�����.���j ��ym����~��������O�q0��B�=
����I�c��Og����j����)��wC�
�������:92U'��E>��}����������:������0�z|E�.`���?k���;��9��[o
�y7���v��u�74<"w�}�����_w]��x�}Q6X0*��N����S��}��t�K=7�Y4t��h6%+��>�������c`�6�SV � ��m�K�)���W�~J�������>����u"�|�h���>���k���WL~�z���2��4������KG���:��-�4����p�n��������H���s�yaO��y���n�m#���X+���#r{c����V�2�q���wP�w~X>�F�Z9�ojw-�~���������v��-<X�w�79>.c�����Y����@�����.�����y���O�������:-�m�-1�����Mz)���gx)NL� ��,h�P������:5ief�%A+�����������w�Y���Z��z�E�e�������B���-����������5��'�A���}�N~x��vw�;~����[���Z�}���
�����������3�zV\�{~���ke��?�y@`����@�z���	��w������{��/�m��~'�u����}���
���Z-Y�{��������)<���U-.�o��%�����T��>�8�sW�����mG�p����
k�I�r�a��+��@@�$�^�*
y�JI\�Y���,�d��lXs����N�B����;g�E���k����y���X������]"���o�])~�Y~g��0-�^9$�>����~���5��H�V�2������RM���k�������T�/���>����j��N����������F-��h���\&����>yD���c���y���l��e���j�V�[�V?X��s���/�X�x�������K�T6�k��4�����?=��kAe���`�~���lx��5���z��W������� �t�m22�@T����n����[v������������~f< �d�����*�����,�*W�_���ms)Y%�=��v���n�_z��y|V_���d�'��?�Y����{r��n����QY9V'�h��/��?��.��7��}��������oX&iK����������p������c�	��v�k���"l!
�%��h���?_i�TNW�t�����y�����R����2�|v|P��zo��k������LXW�c+fdk�dd�|}��\- ��
�|���+OI�]������#{��������,�c��%
�w0����OWh���J,x�XI�3���{�sk{�[�3����n&����a@�	��k7�T�>�b��; p.	X��*�����|�Y��U���Zf���1�8�J�\<,m?%���.��������J�����?��S�G��r��q�7����k���ok���Z�����c+���u��XVI�k?Y)_�!ybr�|q����OI�d�� �{;�}���([?YYW~�����@�6�_k���I�,�qjn�V�w��f���2��g���Y�`���aJ�W�������F���'�?����+�2,�o�`�����x����Y��P�����k������|[��V^.��h���uU���$�cu��u!��'@�V�j%I:���=��o���Y�'�}I�S�Y,���}6�����,�E@`����v�f�o�-Ce-Z>��6|c�Iyp�{��?��~�J~��i�n��b<he�XkO�h�����|~�������<�\^Z.1�&�s�<���Fy��<��/;���;<%�=�\�?�A�x�We��_�G'�����?M|O�l�w-�e���3����|�k[Y\��Z����N�l��dc����-b{�]��A��@����'e�������1y�y(������X�Q+���|+��2�+���VF�����
��������\H��7���p�����Vg�� pv:�]o����
�'��]�B�`,w=��F ��8*W��T@���|��i�x�*�`�L��itk�tG��|���������r�N�|f�K�v�Z����q��7L��w�����������w������O{N���Y�/�N�U����p�|��?���Q����t\���/Wt������=�o�z�l��P��m9����������;!������q,����eC�UN��J�Y&�]���tZ��T����	?h��wW�+w6�qA��k���e��x��%�Q�X+������E|K9��1���%����E�o�Yts4A<��=�B
�X�����������d@��s��N


r��7�o�!���������HSS����//���[�k��V�7��������,CC�'�
��b�O,h������ub���b�?5��i���?��+����7X��F�*H@��,�F�6L��R3]Ye\)�_K�-���
���OK�L��B������7�J�>ophU|6���C��X��7]��s�?�MS��%��}X�I���M/}�W�7���k���������{�=�����)w�|[i���Ef�z�4VA������/�������]�-��5������������H�t����r�`���}��~�B�_;>t�u}�����k�����Z�����]}.���KVNj�����_����4@������l�\22*�^6 ��VY���r�w�Yp���Vv�[U������#�[9����s����3�kG�������c����s�]t�� �0~�:g�.�s�9IF�G���`�!�W]y��Y���,u�e[�A%4�w^p�aY{���\P��y��ez:x:��|�b@�\�'������K
����|����o8�VA��,�����~�^�J�^Bn������f�����zjV��1��mD����DK�����Y�}6�7����;��	�� �U�����r(6-��G�t���>�>���4��L�
��k���o�{�dK�w���e�����n9���M��4��'��y��'d��ef�J����h_o����Z��K��+�x�Q��:#����u�qX���A�/8��`�]����������ZN��Z��������EE��?,}[hY����[H���q���19��6X���smqW����E�����������Y���x��b��c����h~����Yp�|���Of�pv���?Z�/'��V�IK��C�����t\�e7)O$Mt���n%��b��-���
�A� q�������1O�������t�+��:�N,�s"�����pr����i;�;�K��f��!�@HB���(�"�Y�bGA������)�}��OTT��B �{�d�����������������	s>��;�����_;�SU�D�&���B0 ~Z[[���CU�����	|�4L:��]O���;��~�y���Q~�~�Mj�?6�ij��������c4��W�G[;Z�r���	yS[������#�c��#s�aO6r-��V�}����K�c X�o�����~'�C���l�������Zq4�����a�����T���`M�?�����v��k�o���������<\�d�qY��`!>������4=����<���6�f);��Rb�o�DiZ5V�}Q���x�p�2��,���g�$xO��[������"���.Q�]�����'f"�Z�v���fb��Z����pq���\t�����������/b������=�z�l{(�&�Mc/�	��YqE�:�B����iY4nA��\l)m�I��>f��:�(�.��J�f%��H����L�7�4���Yk
�X���N:S�%��]".23��x\v�������{KF;�N�^7>���~�gtaqw�=�������C��q�56�zZ�)���������CM�������{�D������m
�^9+;'�n2c�`zG�|�84��)�k"mH6��H�l;<]���J]!|?\wlgs��I���Mx.�6��v���=�����#KbK��^���_5�����C]���vP)���{�����HEk\<��a�������,���#o���*oF�����HC��D��4Jit$��*#>������JKK����z�,�-]B(M����7�}L2~C=)�H%�'5������eU��7���^�����d�1�uL�Gc;"�D�S8���+�6�����
'���������}ao��v�����cc�?|E��a\S��^+�R;��GC��T;:���#�?h%@-m��?Z�U��Z��k���L������k�a�5k��0�=�G:�����w����oFp������F���&+�����������p�Q��f��d�����Q��p#�#���*8���������e^��� XMK���sS�:����pi�q��'��p���s<��1+�?x����L��>������	�b��p�,�[F���9e�&��b���@ztO�Ch�F�(�f����
��4�%�J�h��c�k�����\2e<4l��OH�#�� �g����Ai��9��8�v��\���=�,J�W���X>%�~{��<�s��GC>�UBny+I���	<���X�-_*�\�o��lo�������us�|�
x:%J��K>�)���E]��6���`�z��_��}��?�'��6�8�!�6�����| ���G�t�K�:�}��c��_��4�u"pj[{���,�(�E�����7�x�������e-��aWCY�d�����%��W��>���{$���1��uY�iG��K��mT�m0mj|��{wc +;��{.�xc*+EKj��MK���?7n���[�K���T
O��KYXX���b�u�Y&V��9s�-���X���������x���=������b�!D�6��<D5�x${��)K]t��d�G|"@�
�MN����{\�-��0��@
}a@�p�JA
)�;1��7twb�?�FLp�k�J���O�[,f�i=��R������8���RGP?9"��"p��N��6���#Zg�:��0������� ��� ���!������������	����M,���r���l��c\�5;qg�����,,m�5�w�@����.>uH�CZ��;�X8�R�bq��Xb�x�hX�Tf$���a)d�rm��1t9��W\�F�=� �A��`�r%�M����K�nhk�92v��V��Z���qx��)x|��a,�Z��D�]"�1��P�x�����������7����.�<��B]�;9�iF5����������4z�H��4���>�����B�[��9s�I*:v>f��V���q�9�M2�W]/vgW�S/�����W�������*������;]S��3�0S������/�=����n*���y����;L�&�i�{�
�����b�uY)�7^��I`L��=���&$Z
���������o������r[���5�p�{�h���B��Ff��>����c��0��@
�c@���L�Ha ���
J���x������3��OT;c�X0�<Q+2����,��]�-w8�Tj�W���l�w���y�<�,��=��=
��*��w��z��1L�H����Zu�b��X�<����'����3��U��i�\���nC�a�<y&][��~+���m����]���h�
x�a6z\�{Z�
�]�#cu/��P�/���n���o����������n�qN�Y�F�:����w��qF�����vP��dP����q� }�m���u|~�qN�#a!�l�e��1dY[��E�����������EZ�~�lO�����X7{����gs]8kUw�)��P%s�1�R0r`��[��V�-��-B��+���|�<w�`N�Y�-�\M6�W]/��]���e�~!�����!����}��Pw�(������Z�1Ru�r���A�	��h]�R�����Sm�,^�k������@+��/�8���|F8G�����/����6/���1/t��v�h��}.<�
��2��3�c��?o>������O=7S�<s��!�}�a�y���X�$t�����������z��Gh���ci��t�4���s���� �Y��)�00�PE�a,"�u
)�q�J��Qd��<Z�����	����n���4���+�mK\��I��B�=��<w���������B�F
����bm���n�c/�.��J�1'��_�_
���.���lz����Oi���n�6����0=���
w�:x�/�`Oy" ����Zw1?���@�w&�w|�+��=]mic'���i���j��d��q<T�<���������c^�_������c��g{����N���h�n��������;����w�k��?���.@�0��g)
���(]�T�z�������������!�C5��;������`aq�������lg�a�E��>�fc����yp�������=y�{k�a��VN����p,K�w^6����rY�v�k�}������ ���a����*�Y6E,f�fN���m��G�"47��8�63'X������x�����%�V</��v���N���`����g�V��3��f��������H==��~r�����}O�����"B
RHa�'f�����S��?�����������^��?l�S�TXTh��gt���i��=s�_G�y���Q�RSS^~�%c��
��U�1
!�������z;�W.�$�U�K+p�]�j6���A�iG�Jb�����������t�(�U^�DS���r��hHY:%��T��� �YcI����6�00 �@�v;(S�4�����3��������k�=��4�i��i7�����r�&��jg����{e��r��5F�8�%�&e����hW���O�2`�i�N,�.cc��������"���6SZ[Q����e����*�dd���t����������/�S�~���}��R�;�����z�����tN��D�a#�c�<EL8���5#��h:�/�>����q���q�wKz#�w����/3q�x,��fY�QY�.�.����\�,��U�$�W��p����Ei��O�:�z��4�.T��z�}�������\�m~� ^��e#��T_@K'Z9e������c�������O�u��w�N�����sK��t�z�3/{,����0���>��T6�i����_=��O]E\��{��{�I��i�_t��<���w�,t��S�_�����1��
�'�x>R?��p���v�+U�j���Z/^}t����5�`��5������P��q���Js�q:�ma~���.��
�J��&{S���k
�F������-�����|V[+1i�-�>��F�K�+*��kkj���S	g8qxD	�����%X��U�g#u��5Hj7[��Y���&��Q�O����U�~���D]I8QK������z����������]��:� ����S��@
)��uM��p)Ha ������E�4�	���Ih�tc���pZ_�i�{��i�t����z�L��G����"sk���r�2���,Q���j���8e��SN���o	��x���g�d4�;6�?,��[�r�h����7��r��������h���U�u�dq���%7�d��q[�9�Xw�3���R�����5��0���y��E�����.����E�ul�~(yt��z�>��A��`��:��ZN�5���!�}�
�4���kZ���X���(��[s�����b�n2��4������0�����s���:��M�g~��������3�9�Vq�����X$���%��Q�Q�����1|s�19p�XA�e^o@&�OKn�+������E��������M�����O)�l[�')-� -�j��aKig���QBsyf`��Y�jc�I��������u��������zU!c������3_�O��v�QD����l�7�m1�X>��/���Q�!�����6���|:�;��
�8uSa0���R�D���ZvqL��?^��xf_�5�#��5\�A���hm�X�*�Da����������XoK�~)�6h����~7n4VM�r�!�i�����]���1OG��j�hi�$���:r��r�H>�6�6P�A�X2��F����?�63���$�����2�J;��j�R7���[{s��W>�w)�0���@<���������3b���s?,\�#T��N��36��KAJ�c�Ys�J!C�Gq�*�i����������>���D7\wd4���|�+8��Cm�uX�6�����*uq~N�X���F��B���� S����2�N����6���Ci�U����0T�*����^,V������������d}������l�,	YO���~��Q�HK'
o)��x���)�,���t�a0w����J�m]�]����d������"�����:�U�Q��$	�rm(�6R���PMf�`\��,L+J�@7u�8�o�;���zM������R$^t�g�D����>U7�O�����h�_���;���Kix����*Q�\0m��qWF�)fne>9�hM����& `�q#�x`�]/��]_�9�~iT�,�f���i�&\
 �'��!cpF�*������q�'8��L�(�6��/�s-k�)_���D�9
�������3����8{���D��g�w��iO��������`��L�#���M
��?6~���d���G�U"c#��I�=��d����k��l�c")��O�����n��|����7��	�����|���" �+HU�rF��	��UxP+}�1z��N���e��3v`f�H��pP>��k"�e0sc,����u_�L
�����jZq���W����R��@}C=�.�����{>#��i���r���t��kW4=��e�X�Pw��w�:����}6�_�td~r#VmC�x����+�I�_\x�x�!�G[8�E�����	�4\�� �}���!YF���{c��H.����,��e���4�k
)�0�
���Ml�R����~Ih����b�{;�G�����2xO�2��d&Cp,��>���=E�q�$`��(�J0����#�����%��_��s:��-_����C^�$<���3�.���'��L��q�	�8^�B��/��}G������>�;������@n�q`�W'@IDAT�#�9,{�*K���@�_y����1O����#T��`���[2K����k�X����\�N���K�T7m��wrd��~���k��m�&��I�znmwf_dM��"���I����7�y�\�~�u�'t�#{���k��}o�Oh=�!������
J4/M�����B�RW��%�K�;�k#����)�.-��?������f���IC`�#��������#����q�wI��pa��p�1O���{����'����������;��8�-�(�]���(��]�{�����?5�\�C��4�_����]M(7u�!,lY#B���=�9��'��:7go)�;*pp�W��E�X������c��/M�j=N�R������!���Y?����X���O�����Q���|������y��H�<�O?�q��y ���
�#�9
{����6����m���}�6lF_k��e�e���H��=l�l��
R����E���XP�"UT��b�
�o-S��C��=�;�;�����-#���tU��k������6�G��
���.����W3�,l��V{����]�T�)�l���v�4.��F��|v��(:edk����7z>_�yGa��t��I(�XA�X������O�/P�$V�h8��������&���'�B��x~.|3z����8����77j�HP��`��G�3��&�!9��M��jF�<tQ���G�'\2W�uLw2���������e��}�/��Pb��&J]SHa ��Rx`@�yB��p������������	=E �)��o2��U�{���`H�2���oz���6��z�!�OG�� E�G\�*�F�Nd��3{�aEf�JW�d>����L���8�����1D������c������u���;6�)�}�X��2����X.N�>�	�v�m��i��@�W	�9`[h����Y���@$�����aS��LC�.��q����^�j�
����!^j������/�����z�q������=Z�����~�_y>�\5
;|FH�qE�Zb����]��L��d���
"x�8@�������^����M����h?(P����]��x�3���0V6�wv��O�����Uay ���,�c�vc�Y�^{�n�G�q��dP��]V��;���;=���./�3���"�~�.~�������,O�p�jDZ^���hD������`|�
e�um=�����s�O�wN��{Nhz��O�N�u7���_����z� 51-I�h^��&�
f���Lq^q��"8�A��n~8�k�|�Q��=���4��sp�&b�����o�i� �S����/=����A�{���2�:�Z���Z/u�:����s��Ao�c����$_
���������q��~E�<B��Z�B�a
T��w����s��d�]��x��e�"8��u<��-���~����H�����G�`L�����Y���}���9���w�����P��J��m���7��FO��C]���G������8�gG�U��v�w���D�
&K;�owE�pVz��;���k
C��jz��'��-_��������{���=gO:b��y�����M"o��#ZY�����/7����sC_��0&��(�GW��k��F��}�� T�������22f���m�b�u���8�2Lm��!�K�q"	9�
�-�h�P�I�W�ko^��Ka ��w5�A�]��T��f��(�����*���`@�<�g0�
��:������|���*o���0n�K6��\0�D�m&)sK�Y��|z��+2����x��������>%�;�z=�cB�������a�<�S�����;�� ���-�l"\�Xj��;P���LhmOl>�_�y�����i�����c v���wO��*q���b}&�-���2�u��w���AN�e��-�x������c�^�
vI��'B�d31���������7q�Z�i��K�t��zn�rBB����^T��5��7-�����3��?������i�^����d��<8&g}`��S�`��8-;������	Z������+*��*�BX*�;J��
[Z�o��7{q����%�[���`�0|1�R��0�*�$�"p���c��������>��[��y���l�$>\~)��Pt�z�%(����;rqy���`!6.S���M/���:���ad,�
jx��4�q^V���C�����.*E�D��~7�5���?G]��P��ft�HX���������#*�+�r���+�L
��P��k��^�6)���2t����k���c	T�XL��[~�:j?�q�;�t�dq�IU�%d��C�H�0�F����'��*�����u��F1�Y]����]��
�
�|9�0(���E!LitZk�0�7��r/����7���g���.{8�W��{�_:�Om���8O�����lD��La�(�@J���+"�h��p��"��F�b����V-�Y!VFw��R�A���h�6^��x��`0�xy'�����K���G�A��\�����_�2>�I�}?��a��Y%�&ra��eB��d���Q�NR
RHa ��>0`?��,�*��#T� �A7^�i����K��3v(������N���`������L7�oi+���r�������C��&
��=��2��i	ag����t���Z��R��^����n�;���^�ef�O	��Dv�*���������7b���&s1���!m�u&To�u�i}�Ku���i�C*� c�	����L�+�;�t_���o�{
�T���<~8�(������Sc�#������3��868�) �Zo���t�X�� ��)�po���=c'��H]`�y�����_X��	��:��z�UU���M���.v���a-��x��i���[2�y^�[��E�_]^�1��a��s��W}t�����0������sZ�y&^�]�������������X�q9����y��^����6�o��	)���0�G��}��<��"c~#�G�f�>���/=���q�,A��+�vX\���`J��^�=�(���t�����s��	�����x����s����?C����0���M�	�u�s
d8�]"�Z�}�X(Z����U�y
�7]y��j��x�1��V2eP�T��.��?�~l��s|�nD�����[��RO�YGT�3M���;��aP�r`a�;&�H��c�'���J�XkZ�V�#�[M�>k�d�����J�����Gx��3]�������@�O;o��U�f������=���|����1������6p~������G�s����]\ ���ry�y~��4P��y�E����dY�E?L��0�������)��6���(���6������S<���w�iT+'-��g�$kCI���<{UbO	A=�����?Z���$�M�C�h�E�`�zV������Lr��!��:jp�c�8����3��oO�GYY3�j\x.<���6���h�Rs@��1)�0��@o� ���0p�`��}��}1�H���/i�
������3�(����I1���>h�"����R_\��Y�u����+��u'���������?A
�*�Az*`�R<xE`D&!]�����Ez��B]k6������">��Sp��O�B*����Ur�����������J[��S��ZQ�>TF�{,mv�W�P]�Y2yZ����`ky��)�5P��C���
���%��es,pL��
,�^G���I��"�iN���x�b���_�c�n������<�M�A��6?��6�n��e,+#�/�� �1�v���V8��R:Q@����K��=t�wC!6��@�Q2�9����K�z����[C-}�u��-hy�3�M�6:����*���S��7�O�3�7�~�Bz.�	h2;������F�u�/`{	j%����[�%�=��*�V4,�Z��/�m���	���O}eu_v����5�w���]���>�a������+.?���-d����V,�bbN�>\�t����6�5������Y���#�����I7p����������u����{��kW�N�+��Y�����p�e5�Z��=������T���n*�4�Go�n��{ZBj���r\���������i����v���8��b4�a���{����}c���/���u���|�ZCA
A��+��F�i���);k�����@���YNz��U1����o��Q����K����
�T��_
���R�NvO��H�-��wRB���ni�����[��t�~2f!��"�R�E��#��{�]�D��G�*CZ7<u'`'����2�=�8K��IF���A
�2W�k�G�k���m�;:��� ����%W�	���W������f�$���@�SIRHa ��RU�a| �P�qb��!y�0���������#��=n�G�9;D�d1���3�1K_oo6.����,<��]n�6�a��'Mu������vW�u���L4
F�`�[���K.�^�J��q��"�!�����S�p����>�OU~����o�0��D�[��,��@,Q��*(���:D����ov9�>4������s��|�����2��}y����PZ
22�A-
ya91f`(�/V�C�+�dm9k����{�0���>��p�R�
�� -�Lj��	�1�_�HF�Tz���/�%�������Y\�����|��Q���V����7��i��@v�Ym����M��H}0D����s����U��v����g<������Sb��E^2@�>�*�����]r.|��g\��rg�/!t{���Y�cO�����<�fL*��q�7�}'&H�%��K�y�7�<r^:��
�/���{���D�G!�E����D����*,����]l�O��"T��,.���[�N,��L�]y�[�ud�
�_�:6��[8��FNz�k�����r�B]WT��yoW4`;w�l���mp��}�
�kL`�.gT�^G�~���x�����	{�����e*0�q����j�r"�I�U`HT�~������}�������?�9*x�&�h����^,�����N����oy�k����O20�)B��%$����i]�.7���5�i��3&#�&�[�X]�Om
��m���]����%�{�M���0��N
�W=h���8������|��Y�P���
^|����>�f)�����b�wG�/Re�0����0�:��5�>T��y���&��$�G<��%�8��J !��X�_�J���e3�[���x��h�viQ��n2;��F�c�����>RU�����C	<=��U�vm\j ��R����x"�e4�x|<����Y9�]d���?����Y�%��e^�P��}��z��@
�p=�����IA
cT� s����5��d��=V����l���������w�j�����)��e��s8��������{�8j��:�h�41\�t�^�!�w�������;�tE��7���I�T�ES��\������.\�����O�%E��[cP0E&Z��/
�$���k!A�������L�����kZ��#+��v�����p������s����i{b�'��>��b�����VC�Cb�&��������[)���� ��%T�W�[��T-���Wxc��t-���H�Y��� s��c���&��&��1�VI,T���}��c�R��BWSA������c��@����o ���o�
�[�'�M����x|�x��K�ZqyM(kZ/����*����#�������=!����G}���kS�z��5R�L�����f|P���qO�����G��PE7��%r�%c�����)W�^�������P��Z���^CQ��h�k�8xp����
Y� s�mp�����9�%B����NZ����$%
t�F��A��i�b���S[}+��?��}�D����-���It�����Cn-������k�|�f<��c������<u-�YW���c�J,����,�aV���������DY&������W�_�c�l�M��������o����>t���I�>�E���(�eL�';��C�#:im���<��5���P���$a��3��&�)����L��gyH�8����[<k����i�Xi};�Z�*�����A�1��[]N����zP8���5�7-��7*�����h���)��;N�����c��L>��i�O���3At���t�?/��������cgSw��
�����h�]t�;���jK
�H	�b1"����=��q$~�GB��U��-w	��zx= ���N���|��~(~�f�=/�������p��*|���
�(�P&7t2YFS��q`'�����������/5/�i����<,�������C�%��3��C����Mv���mk����Q��.T��$���\h��u�Y
�V�)�L��,B���I�{t0��q�5����@(#C���Z������gZ/J�KK��d,�6(���]�?s�d|��i��T\�~�����|,
�'�o���
\������
��4[_�������z7N���_8j�����r�qun���h|���T4�W��/2�3�u���@�0x��$#E���&����Ep��ux`a�E���t����II M�}����WdT�!"�K��by'2����M�����t0���3�(nc�'����\:�����H^������]�u&��
/�&��`��^-3���{�X���Z]�y�����o����u�W���q����n�����~���V1���a���rf`�q��[e��������.��i���8���Qm�K[�G����-��O�D���5��iu��h��2^,�� e�k_q���aO�Z���*������0B��U��ou%��e� ���|�B1�5#�8�p��Z��>���]�=o]�]��sY�_����D��l������;�k��������Q�P�o�]��gP2�7����b�EN{\im�Vtt�IK�K[&/\3�����������T�4��������{�u��z9>�!]��xd�F�U�e!��u�H�d��D��4����a�"�z���sv����gK�m.A�����k�w������Q��sS������x�w�74��g�Z	0���Z�����\����B�1:q�5����$/���|}�G���M ��S�%���@�-;��61�#���7-�a��W���^���z���#��o�m��N�g\�3�H��iM8��w0a��V����/����m\��Y�JA7��v���]�������/��<a��~�#�!��s�����Vtipd7m�q����Z�>[q��z��;�GpVJ���4}����
�*1'Q�����D8�����98imn��#�A�.��'F�
���UBF�����B<M��-4[�k{�y [)Z�����
���
�.�ts����.�������v~'�o�������#}�D{Vc�����c���
�0p�`@5�������.���_���MV���2DH��p�{eF�J/�}1����E���X�z
��d�cY��d�)�?�M� }����S)�LU�p�i��y|/M�@g�8T�3�����������~}�Ld��z��u��	/u���fab0�.n��U���������|���v����k���m�=�������fe8���"3�>�����������.\����"S�s#�@�SK~0��L�?�ADD���DC��;�i�&������4�"p�/��%��Q��M�a�i���x>P<|7��X�Q����bS�+d��}��3	G�?�?eQx�\����;���i����F�|c$�U@o�Q�@���4�c�H�!�+o�%�:����Z��"�#k��wJti���Z]��_�a��K���k���j[A4f�7,BU��4J���z��_!|%��b<'�}����k	B!��\�u���������Xy�`�o���`N�m�����L�']C�xN4��Vj�", ���0�Z����\�������:�#�U:���E��9����v���������n���Xq�-��s;7�zT;���v�zql�/.I�N��3����xj���D� ��-{��2��9;���xt@l��~��F�Z��}i�:�V�lO�VN������n2s�a�tR:�V)�]��"}E�^va�o���.�+uw�j2�����&'��2�e��������x2� ����������R�������Yg]�[��|_4�>��T�G��s~V���5��M�cV��z��!�����{�`�Ag��"�(���*�(�����4�}���P����1�*��%
Pf]��hi������l������������L���NB���!jz��y��������q�����3�DN�8����|������>6m�e���P�0����@{�d�y�;��k{e$�! �k=&��H�����%�G������R���6S�z��sv�ZN���MO�D�f7��_����D�U��>X">����JD��k0�u���@%���@�U�T-�x�����9!��8�0��C�9���z��0	;�_����\����J���N�.Lr������w�=�����|���B��5�fou�A �Uo����0��@
)�.��F:��Z2������x���d���������V�[���;�Vdh�������%s�e�:����A����To���%,Q���n��S��sP�cM�c��RlZ� h�li��)!/��x%�dM�0�j����[��7�;�/�w�F5i�/��ni��}nC�q��1GN"p�����j�a��A�>�Zc�dNm{z�_��>�tv`y�J���EY�@O����]V�`����Cj��t�����La�6���^�c2B'Q\
;=8�NC����8�xsQV��5��q��x�:)���`_\&V�d:R���d�2�i%4����+�a��������c���2��nZ�rY�P�I��k���7�:��S|�����64�]�3���
����:���j�w��{A����k�����j��V����d���9��r��7�e
�������_3uVK����8���_�g�L�4YG�Y��9������%p~e�o�m����kj�x�X�(!sz$�c��:�tSo%\��4;�<��������9�o��F����>g;i�Z?�y�^F��mn�a�;kW
��=���
�.�X<�c���,	Fo��jf���s��)8y����"a��F��P>�`7��}J!#���
l�1�rbu�� =�q�1�P��j ��������~��BvDS��Z���`�j��>����T�����z�������I_���,����/N\���9�V^�����@����%���
�<T����L]o��X���i�����wg`��g�.��m]�~��G
06U�#�#N(�h���c����o��?����L�F+��3���X+����g��)}�W=)�P+�u�Z��;��
�����K��C���.y:��:��T��^�GgK�5`"�*:�u^4��o��;�3���IwMG���QXX���Z�X����������q�M����Z���&#t�;���{�����w�"$��	`�����C����x���!��J�x�� Pu�G�d��|��,j����DQ�G���&"Z�^k�93'���w��c����jl^�g<4�j���A.�%hs6��F��
����������
�OFX�Aj�u/�8�pk��h�|-2�:|!P�+
���-��z��
�g����"�Y�g�5Y�|����J�d�Yl�m�9��k\uf#~��N����k�t)|�te�M�.<�)W��&�����aa�2�B���u�`��x|�����_�A�`���`�+��o���f]4�������1�����o�1M�<t������=]��C��d���Gd;�������pD�#NG��v8��@`]�X��r���8�>��Xh�a�J����6�hjGF^5��L�Z�r������H�T�ym��w��*����+�;��_tu���u�!L���y5��nW��#�e?�������a�O�7��6��+|J4������2���8v�udX�En��J��,0����o%�J��T�{��n������%��%�*�l���j�D�Y�W��#p�oL,�L��.��I��I��K��Q���������x�K@�wd��������+KoB�#t0�ml����b��|�YV�#m��B+��I��|'����l^|�+�������g������T0;��qC{k�]�}lG��l��c�<��!q���������!����Mn:I�'��]���a����27$�q���BU����s:�}�4��������x�pf�4LS��G{��|$�i;��h^��������q���P�����!Vt�2�*���:�/�c��~���}8�5�M,��[%���Ax�Rd��M�Py�����q?�3�����xl�R��X$cu�k>$�������(�u,�.%X?�9�8G��Q���pa���3�up��j.�'P��18�q^��w�������"d'�7d��rE�lxj�y�c�?mo�4N���k����wc�����}�����Z���80E\�r�#��+D�u��Bo�7�����U!��;�O���L�5�*<���49���v��'����fo���-��~�v�$�����w��~����z�s<wr��l��T�z��*��Pntl1������N�q���U��g��w�||�ey
�Cv6��`Q�����<H���X�[9��?���"A`��I��l��2�����N�G�i�pu�{��Khlk�/�f�G��+s��L"*p�O3������0|�N��&�m��x�8��lA��/�������������:D�^8�i<��U�w����=`�����c>�L���T�]+�,^���PJ6~:S��r=�����r���T��D����3��7�:�^[zd<B?� =�k�������<����~`��-�%J�x&3���PU.�������.�E����Q����h�17���C$R)���N����5Q�>Ko1�x�w��,Q ��rUA�sG�HM"a�oY�'�IRI��������]\sR�4K\�����.��8�}��4�tL��
kZ��l�5�;�B�Wku�Io�n����i��lf�X"�J�
���o�*,��l����A�E��HQ+��
����o�V�I_u�
>_�)���c��
�z��g����i��gL�������3&����6�g ��Vc��{������*��|��+���0x�_&E:���L���j	���8��k1��w4�5"\y-�3�2t��Aaq�kR�_��!��\$k6�H���#C���
��n�\���8�?�h]���_t��
Q&l�}���6���,��N��!*��lrJ%��@�N�N\�k]�l����Z%�mQ-9���{j�5n6�;��N�.a<e4ZH���M�@��K�p�Mf�l;������9pzv~��{�|�OL���f��h�?b�b0�Q�$=�r��������s��-�����l��5�'�v��)i��G�uQ��#�����4c�/z�_����vp����'{W���$Nfm�o:�$������hf�����qb����[��������+����+�?5�b��'^_�y��'r��$5�i��(�������-k�h�K3;$�Om�� gW���M!,M�������A�uF���$�����4�s��W�����(����g�9'�����{��^��u?��O���t�/!wb=�tI/l	�_��,�%�| ��W��a_i1��V��k��8��E��G���Ok�����6�,t���u|������t��|��-��9�c�^�L>-���m9���x��s�]��Z����'��>_������:�4M������&����G�����r�l���)��:r��\!W#��lZ���6�Qj�E�=xj�S��90�����D���@��������=���X9*_�G�kl;�/F����L;����TE�����
�h�+�,`�%[0��<S����1%�������EXJ�]�,�N�����9w��/.3��k������m���n���1�^�������/�D�NOI���|���x�.��{7����]�I\��C�������5V������`���W�ssZ��0n�n<�O���+�Q���[��9;�e��|�������G�&�?{�w\WKN8������������g�;���m�&��Tb�t�'��"�����Rz�w~�����	%�v��t���X~�����(� ���g
;3�'g�������^tZ
������iY��b���]�������>��������~:�m	o�l��y?�p�o=[��7e��s1[���F�������d�W+Cal������a~G�������ob���[��}�yp_�5sO>e��E��������d��}�Y�:��S����S����M,�UP����tdLE�~{��%�L�A�HP���qp&�$�;y�@I+�q�J~BgKD���b���#��Z��[�&�~�����ET����$f:���K�&�;����B[��<�l����WJL2{[��a��KU����=T�s�Ra$�n����
B��K��_[i���.��&�+5�����"�o�q���0h5��U���Q|�:�����k~��Ko@d��c��o�)����h�d*�Sb�e�������_ZZ%�����-�����"I����-N)���I�AIG��R�Pv��
Q�ur�<7��!��'� �((����OH�$�
����_����P��T
���(?u�7g�\���;n�Y��W�G�Az-B/�G�0����-�|��6�-���2�]�	�`�nH����=/u�2��a�!5��bK�i�YX�G8�A�2��>�fj��q��u��p)\�+L�Z����q?Vd�*&��3��wH��9��[��pM���I?�b�IP�B�/�!/|3$C������2�M��#d��c��:�����5W��3��4���� �t��c�/M�f�/	����7���^O�������a�����IO�9�I��o������x�f�jJ�{�z��@
)�0p�b �u]_-Q�w�[���2@�;�?���i��X���4�]�?�����x����x��3n�P�?I��ej&j���!�~�>t�v�v��� �8��������d+�����

�HS����w�h����_������s����[�~h,�2����g�L=5��6�/�;�(��y!�-�������e���7��	s�gp��L:d���:�&�9�kh����aY:j|�*V���d�}����[��H��L,�p��
�O��������
��ZZv�X5�0K��NG�����0�CAa�5�&����p��B�E���6���h�,��W���Q��&Q�:R��~8�TY��M~���X��������@�c���=�I�m��#����sT��;
�����8�%l���g<Z�T������&f��5��{:-[�}bmt�}{M'�~�k���������V��*�\h�3+��:7X��+�L_Y�w�����q���bP��E�qg�_���%�����=z�i��C�t������]9[�}�����.q�d��.���`�(,Mk2�C�w�W���8����w����Z�5.�j��\��K8�g�����iR��E)o ��^�����c�Iq�I\�ZU��
����sE�'r�>N>
�{�5���U�&]F�K�5��sg7o'���F�Zn�=���A�?�e?J .G�/��2����:m��7�S��_����o��i-�pg���^�:6�g�aQT�_��]��s#��y��sLh��]c�PXV{�
���u�V%�0�:�J��P7��m������VgJX���c�����Z�D��9�������o��63{@��D^��8v��r�9�J�����X���Ay~��H�}��B�'
�6�����z��w�-�n���?
�F��-��^�_�z���KK�4�j��z�?��S��oD�~7��h�8�FD
�[%���������@��]B2r�bk�s��[zv��}/2+�-�[C���F7���'���G(9�8T��ki*� ��������6"D�z�k1,��X�2}>�$tu�Vf�.#	d����1�T4?Hp�Js�����"�d@��6Q�w�7L2�Th�i����}�3[J����d�p������{���K@��g�{v�Ul���R��*B���000�L"��5��P�mj�����f�����`�V&��C:��`l�sV����}"W
��O2�2�����P��{=8 �C������������X�TX��Dc�N��~��n��QU�iVO���5�d��'��������3=2��P��u��@#(-���(]�����w��Q[u=V�n����4�E�2Yf��+�q����p����
�a�L`�(��-�}�|	�8d��RR��q��J�8"*��l�t�1�>"B� 6
��)��X��n��v��_��?�/��b��A9V�����=N��i�>�:�0�G��?�i��'P����!���f����'E����2Eh����9�$���C���h|�$!
�tT!�����(9�e���#FpIS��]�����VO�I�w��g���^\��O�r��-�B265����@!��d&�"�i�?B�w�����8��^�'�-k�W'^i�vu���`�jM�Y�&�.n,���������kc�i<*GL��
q��0�2���Vq(s���%^�#��T>�?I�"������:��������&X��I:���2�u����@�4����VB��86-���<�����s���Y"p���
,��
u����s%^��=����1���Q����Z'����@�*F���P{�+�s�q��<��8e�\����K>�gl��)
xdN�jI�{}C�opY���)��E�����c�;j�>l�2z������L�&���	~k���^�,����iTW����:��Y�8r��������%��p�*N�VY
�*�y����&O�����������N6i�R��:�1|(�|(�����_��0�r=S�{��:���{��}G��M�����G�^w�6�V��:��d�~�~�j)����V'��\bA������O-�B������9�:��huC���o�7��9-�4�V��<ca�]�&������#c^�4e�T��@Wy���:,B(Z1������/��Z��	|�4!1�U�}����^��o
[��Y��,WS�����!tec%Q;����_g
H��b���&nV�������o�����
���|������Cb�\1d�=�� ������sog���L P}6�����G�����\������K�&�n���a�^/
"
X����"c�S�P\R�E4#�����n�*��o#x��7W�+o�c���u's����S��2��K�z��@
)�00�0���2���9�������|��`k����6x�"�����1�z`d3�$z�9��M=��v��S
��5=�$�&�RN�i@&(�{e\�0M�h�����"�S?�
�������X������o�+��
�e�����+������NV��E��G�R_@f���i����z�Q�a=�N?��>na�*�6����@�]�%b���0��*g���xho	�����7oE����R����v���ss&H��+cD�9bEjN��h���q�X���
���1-5����"|#��:�i�������6v��J��T���<�%�*�U��g���%R�d�p��	_��:*��[������q8����}����O&��i��T��?'�X���POA��
�xn�p���'�Oirb8���{=�Tz"~�*��(��IZ$qLr�W��B�o
&tV�[r�>�{�:D���[9h�x��p�k(`]�S��x\�j���+C��"�+�,�]��e��h�h�si�D�qv�a���X9%ZNl:z�Y"���'��tK���Z��@�c��Q~Hl��'AA������	Y��ap3-w[Da�J����>^�9���@IDAT��Q�5�)[oy���=�WxO�����0�GS�V�d(0�@P��k)ZC	v���	�4@^����Xp@���~��&|r�wq{�=����}*����U�^����P�c\�:q~p����C�g��8�Dq���M���R�h%���l���������~O������T���|����,D%oz�d������X.��oO���7�8�{0S���t�
_������U�?ni+>\�$J�������:wy�pE��h��#��|P][�~Oz����_t�h�c����9��^����/����*�3�Xz�(2V��~e�u��c<'�uc\!�y��=
�R0| ��w��v�?�=|%v�l�Z�����q��p�BL�>��m��5hkk���;��	�x�8x� ��O�N��{.� �zk���4�|0���������6�XDi�3l\��K ;)d��=�@��������K0����]c��T"�F�������&��=
[������c3~�4qy�9D�A�:����xe^^\����z�X���{<��������{<m������k��:]��Q(�������R������A�>���R���#a1��qC��?�YL���t<��P�m$N^_'.}xh/V���e�����j|���z5�eM�D�o�i�L��a��m_�w
������7)Ha`,b��U�n����i�.<�Qe�S����&��/�jG��)�yK����C8���}��7�=������j��XeS,S��
�>��OwKskzZT��J��7�t���6�Tc<��������%��o�;2�
w��L?H�;Jt�i���v�=����d�?(�]�u����BX��>�:#������L�[;�{x��^n� �5��3tH*�� 0o���ykrO��4��v���&�}����a��m�k$N�0��A�YG������Rv:����\`���~w��B'��o���z�b��UW��%�/�.#{��
�E�cg�t��]
�����_L���~���+���" ������4l���w�2�	���T��sW�[0-n��n
�X��T�@ja��y���_���K;����k���������5Y��x
�.EVnN���Y��=�a�dLr��u������c	��c�TO���o<�O��0����uh���,���u��}X����u����� �7C�L����.���K����p�-��M&�����M��������)4�V������x�+cEgO8�{e�s"��Z�m��\]�nWu7M[�[7�'�GO�Z�A�:��@W�A|���~2�^k��s&��d\�w�V������Cx�����m�t?���H|�E��Qe�+�E���B+���l�x�������i!GfAp���`��A����a��_a)p���7k�G:s��P�k�������E�\s�y%�a�i��j���e�e��8�?�L��/�3��(r����m�!'2�7#�y/6e}_��S\"
�����W��yW��_�yo�d:��=y�J#��f ��OH����]xY��q��/�p�]/��vlx�n����u7cy������B~�~G�.�B|�<�y%�;[��t>]*�69�b���=�ONO�vH_�B�����O����6��������{����o_�|cO�k�}��Yot����vOA�kw�VoB����C�'��������w�����Y�53_���f�#
c^�����{�9�O�KMMMx��������F��{��;�!�Y�i��L�J	z�u�?i���A�+�a�&�Y]�>Y7W2���a�v����
�X9��O�T7�`AKZ&����1�fky�:��t��V*VSC����Z�
����v�,w�I�X]���y�w�0�H'�W��YcLw����^��%��nks��ho@w����F=wz������!�}���1x��f�?V��8������3�(hb��U���)�0\�p�3i�����4�����SN��P@��@v�V����F�D
�k/�Os��}0�k�!q�$B'Qp:$�
��a�C�����������yt�F�3E���.;��,A�;YN��$�I'�����WZ%�����g�
��J\�Lb������ag��&�'�[�h2�'Z�������a��4��0�V��\d���
a��K��k/B�Vdb��k��:�+�-/
9�a�ay*pb
2�I;T�:�Y"�9�|���t���7������O���G��C�Ko�q��Z��/��ve�a���8PP���/���F��u�6�,u��b����A,�6=�pz�3�}99+�xi������#;FRU`"�BN�����Ie8��I��f��������Tu�����r���K���y�J�n/����Q�Q�����,+�������p�$��S�������'|
%�����/c\���Jj��#�R��9DB�/F��y��1���g�O��[_����Xk���b5%���[q<�Z I�]�����$�����@����y����t_u�Z8X�����w\��Fn�=��1(q�xL��R����iO�&,v[q�������KT*U��M��&�$�����E�Q���#��4�����<j���dQ����������Cc�i�����3�������Q$��^���$��fOQ���fK>���/�$�P�Z�h^t��1����fQ��J��+��e�S}��T���������binA����n�k���`�5B�	�x����Tv����q�y��@��I7 g�����Q��@%�=Ki�o�k{;��PCy*���p�Qi�.�Em{m�K�6q���^�8�N�+��n�2cy�|?pu�ee�K�����=���mt��]yzog����S\��	�Kh�bY��	��'��O�
���0�n�@�S����}���*�����q��g�����b����
6��4I�`JB�@�i�@x���B������(Ih	�4�������d5����j��|su�WW���,+6������3s���9s�w�5�0�i�@�x��Bn�
�N;��,�A�@z��2�RQ]��\�,�p/)�pld:a	#���4���[����e���x`��|uq�Z#a��<�����55U�~���&:=I�
0S��c�B��d/�d�MYa@a6��?��^PC?�5����-����P:!�����*0j��O�]i�)��YS�V�l}��_��?�9�HO�	��8��`�`}�Ow�=K�>�8�[���Ig�1���b�`~�D���y�nZ���4�72���QgQF40��a�,M�uMR'-vh�/5f�����%��/[��V�H2?��Z�A	���O� � _�9�Y�F������-�1�H.�h�.�U��X��f$���T�,�@`]��������B����R����`��hj=����k^P]�l��O���@D/1����q����QS= y�5
�9��
|����929h��:��������
$k���A�s���l{l��5�iB�F%8��J�'����$g����fGI��c���,�<�z��RJ��4��7T�r�<�������+�����������}Y
�'���@����Dx���0D5�%��A���
(�D<Z�A
0� ���N��j]�1�AE�����k���Vjk�~�.��U
_U��YX	2y7���������������;�����/���%�-��� ���e?gj�����	���gS��J^�����"lE����P�>dsYk
�|����c����:5���X���]���]��C_�C����7VP4����KSD����1I)��y4=dWJ�:��A��J���S�e�����{?���,%?��k��8@s�|��L���'R���`L�W��h����
�_'�o��D�"��91F����O�������������~�yE������X�2+(���44��S���
R�b����P���V�z��T�g��)+�-��x�(�~ED��Fp}	���&-����Y$����9	����fu~HUGoQ������&\�(�b�1��<)���'���Jx7E�c	�����v��!$nP�>@�	��S��AY7c��y"��<�3'�M��h��`��h�|���jr(+(����=a����jL}�}*`.��~�������x9��$�b��k��q[���T��q^V���0Z�J�"_(��	�+�j*Ho�=E�����@�7#}�~��JS�:`=C����b��;�)��D���F��q�K��d&�;�}��MV�FXnl��E���<mBb��c�o�����,�����z�I�j+���H[��E_�({���=����D$Z`�8���:l����$M ?����80- c�@�����N|u0��$���p8,(��_������y�����C������DTgN�=vm��f$?&�(�����P%P��f��PX���A��C����4���
3�Cx	����\��E���5������C�-f:�-l��V�3"�6�H��)�����f�IQw�
��O�)�
�����o�u(�.�Xz���.���!J-��Te5o��;������]�%��B�!���2��qUNk�BYs)���z����mU���~Nx�
������&���/O��9E��g�:��C�������|�~R/Y����E)�GS_g%yX���P;9K^�������;{;�����^����q���.>
eR��e�4�{0��`=��hCb�`m{���US���6�x7���}���R0r���
�C,��5�����c�4vG�u���>m}~xKq��U}���RFS<a���cz��V������y$a��:�[��v��bA�q�����)6�a�Xp��G3���=T��~�'��@���=cM?Z�d|
r�9xh���$q�DA��_�r���"��8<�~P�u.��"���[o8�@�b���8�&���x�B������ve���hb�Jz1s9��~\�U��:������XL�J�����_D/��Ti
���)c�%����V��V�x.1FU�g#�M� ����b(���R������r �w��% _1���k,��t����a�e�2�NR�myG)Oa�����8x-	�@��~��A
%�
�$/�
��B�6��h����5s��%���C�g4B�#�����5��r?�S�2!Oi���X������qD�����y�x�E+��(�*��U?D_��>|d��+Z����x�1���y��98���O�8��R�X��LK��/��V�X1��q�P����a�����(��b	�6����T4��?��@<����7����f(/'�����d!�	�9�RT�&����lh� �w���M��(�`�8BgNg���3�'�A�
���^3�v<q�])E�&.�pe~���`�#�RAL���6b���n����H��@�Nq�N�r)��N�'��VPz%hr���[�qPQYE�6��.�b�3"�}S�G_`�(�
��h����g�g��-�\�|1�'(����0����S�2�,4NP��]- c��@8���A�7x�2��� H�+��Q��������{TW���J)�~D��w����}���"\�Bx;�&���g���y!��fF*f�����R��25�O���<��
 ] ���8o(��hBxB��r�
���.��)���\��#��De�Vz6e��.?
+���/'���U��u��n�/lR�Rxg X��>�M��s��������Rd��w�x�.�e�-��):�}����BNmc*�~��[;jT����,.v`��R(�@$mgH��z5�KF�0J�6)�>�szh�(�,Y�
�S�v~la����]0�rS~��uRw��.�{����������x�cu@��E�`������������s�5#�=]�7�/
��,0�A	�uL[f@�o�u?��C�*��]��DPy�'�~_��h~oH���%�$C�)���"�{�_��>_J�(�A�������k)��?@�}Q	��;\>ISP��*2O@/7�(:���x�G��o!�3Ak�$qx�����2�����/U[��U?�����+���|���#�2��@�O.��.o|�8�\{'-����*�����c��R�
J?�ru=Ty5�Q
Q���x<%gx��\Ro���/��IW���@!o�����	��W�s�7(����Q��Db��k�v���V�V4^1�n��Bbp#�������0���g!g�U(R�S~�d/V��2zj��(	�'��;:*i�{�/�'
���;��������~���&�%��`h#��1�|H��IV�g@�O �J<�0���6_%��d�qY�(�%�r���I:�b��|�����neT"�e���a�Y������,�b��sD��%�P[����C�K\K���F�t�����<�=���T[WG{�Yz��G�����|������s1�HYd�u�_]�[@��Pb!=�)�J
�X��f�3>73<5����P^NH ���~LLF����rM ���K}������2�(G��e�X��!{MYp;u�]:��i����R'�������!12����	0�gUS&�j��
��>-�'���K<�_�j�>�4���� �X�-�������DC�����U3���.���-����/��yiK#&���B���S���#�,�ca&Z��s���T�����;P���0��f+A�H�@�- �J�U�
DF�|��&�H�����!�#�6�c_~�0l�x �Kz�PEH3��xXb.qOv����s����K��#�w
�Q|M�`T�_���]j~RbD�o��������0�b^���������T����9���� 
�?��������kI����:�?���	����Z��s]AeT�45�$���}��%.Zc�X�p$�fu1�����'����Bn~C��ca\�W����2d�O���"�<D �!0C�+���:�vIg��5[TL�E�����n��#,�4�=�x��k�>q��sl/x���}�~I�{��:2��;@����H��.+�C�1�l�a��W�Je^�e�Q���m�d���V�f�95���q�
:����U�pB���v��Qk�5x)����L�'b@9%��a-Z���v�<�$84��=<��m�+b*yI����������DX�C�wM��Tz�"�x�v���t"��5�� k��YZQ��<�b6�{0��#��`�)T�ze�M������k���!�#�w��(	��;��$�
u�����
�5����;�b�Ol'��1�~��K�~PJH�A����z��Q���4^��.�o;�c��x�-��:Q	���^V8�,��
<�^��8���jZ�z�^qj��7�}������M�i�)�cax@�g��_����)v]�31�����z+d�{���g��Cz��#%���L^�y�d��F�����p�1AbLCq
�&o�d"�/��,��[5^�k�[I�K)��0n�1�c<N�,?�8J�6*��-����p0�^���RRE*c�&_�r����_O�Sf����������}�n27�`TL-�w!��`5)�m���\��}_dOxG�Q���,����t�EGW��Q�6h�+���$�����T2��Kx>�W��U<��X9���?M��K�_Q
9{?�l���>-q����p�|��bhdH�8L���F�t���%%�#e���8(&>,� 4�E*�F|��	`����`4'���lX4����I��p�2a2�jQ��u���-[�\fq����z;a�@Yz��T�5���p0F�[���qU�+t�-�
�	����P�����{�����1�h#�����Pe����zcr����O�VA�E0����aQ��8�-��$ �	�`��6i��
�D"=#�K�n0�P��zWQN�K�r�Ia�\�Jq��������X�`���������}�� ��:�i���/�z����`�[{��J�By��R�=H���*�rJY��n?[��r���9e.��JR&���\f"a���[`!/D���Z�A5��S��M�x�1l�b`f7x���s��-���p�)he��D������"��������>+�9������E1T��}�xc&=�w�-K����\��o}��������!�B~�A��>��O�Z��i\���pL4�+��\�����'i�SC��d�}���|�0�TJ�k"KY��Y���lIWS2���!_{��'
q ������d����u)TR�J�I�������vJJ�����g&��U��r(E�^�Ae.�X�J��cT����?O�������
u
����T��	� Y���Xq��g������A�a\%��R�=�q������X�K�h��}It!,��^�<���F�w�CQ�J'��A�3��PK������
ie
X)��Q��8�[1Y������<a�c�1���J�B�3A�s����B������`=-�,���D`�z��*��Dw]��@����&���X��@?@���Z�K4T[�L�n��m�uko�[t��uJ	�����yBo�!w�����F!PC���'�V�c�����2l'���s��q�������&)������r��)U��1|�qG���"����Ab��z<�����i�"(����s"<������1-�*�a}��H��[}a�sbo;���j��B�v
�-V|�����rz��&����Zr��:���-�9NnTF�;_+Q�����T����h|����������<�z�N��
(h`4C��D&�ya�#�KXaZ-�j�=/��(�e+���SI��\.��([����|o���@���xnIG�w�����Qe$�����y�<���Y�	�c2��������]o��1_�6��[�'E�( (�|*cy[V�N����(
q�<�R:��
/'��=��r�.�2�������|um�D�%���;g&��"}���aX%<�}��:*���@>}��k����J�]�Iz�Zc^#=e�H��2�&Mm�+V����#���u_�Ng
�k�����7}9��r�*�9�4���j��rP^��@��m�mSRk�����mK}����o�<��l�B�._�`���1��$f2(�q��L��1@����U&p����������M�lA���~4�"�E�I��7J�wl�C�?��`!�I0�����_o��TX")n=��h&�u�������U@M#���-��o"}���C�Wq��:�~,�P�f"���sz��L�������}��{;��P��mO��
h[U_�h7��-�~[q}}��hfv9�}8�30�lZ0o��G���{/e��K{�Z�:s��,�2e��9x!�#a�.�P!�\�uR�2��JQ��,��~_�#L���Cf/x,�H�R{k��w7�/'��W�ZhvG/!hd�#���� +�r�>�5A�H�@�-X�:X�z�C���{�b�%��`i�:X�k=������L0*`l7�T�fw1<��d�X��g}����$��������=tas39<��bHc�,H�����	��ue~2�4]��fcb
�����g�I�!�c�������3�Zq����w	m2M�fO�y��S[1A���,z=}+��#_����wz1��TW��B�0
9�F��,;�i)���M�P��N���f+?����������I4����<7B �����E��6�������^������_���$�y��9���h�a�V�i��V��#x��G���.+���ZSEB�%C�-��q[�h��.��L,d����`H>����R^l,iO�V���hI��A�(hr��j��W/<T7���P�w����0�3�S�>�1`UA�w=���E�	���0��p���x��������v`��2���� ��j��S>����kX���wam���=�����o���o�X����7��y!�l�?���������|����X[)XR�B�l~��,��rRW(/��v��bJ��b���F���w%�1�>��M��)��F#�5�'�,�5�WP$��&e�5q+:������
���0�xT�����}����b�hv8��;��P�ggT������c���y���79��! �9�0R�M����<e��6R�{�����hb��t���C!����/��voUh�n�%�����������B�'�u��z�Uejr����F����F���0>��Z@1��t	��x��jxI����HC�C��#k�j�t��;��t�g#��9���x�)u����X�����sx
�O�~2�KF���!����.(��Yt�o�O�G��GS����)�8/I�0�
?��wb�X�3�n��P��v*�r��M���A�6Z"�"���+�s�������DS|�|o~_��^��c�����4��������C�����:�1��L_���Y=���p��K}����e������������C�0`B��i���F�����o�i�!$L��{R�i	p=oU*��z2mpP}����4�EYk�D��J1��c�P9��U�@�_o'}X�~�#Y(``�pL�qw2^���GYE�'s�\S��E/K�K4���f��H9S��p;`pea/����T��]��}��a�����gG�F38p���.:7��n�c���E�f����G���2:e�c���Z��?��*����;^��i7j�,����g(;����K��Fj��Mz����������k_E�D&W0�`|��F�h�5���� ���� ,������l	~�#DK�����C4��-�C,dc�]G����
���=A�n��o:�*$�'Z�?��K��<� �h��M�1��z����{�R��8'��1YY���rx�N�����{Rx����!x�b��X��|�ve����>�E��-��p� ,�a��o�A��
8�W����<�����9�K o���LxX��y�fiMR�`����6Z��V:�R���^HP:e�k�K��[O���Oy�Z���QZ�qu�)��0�N'wU��5�P����D�L�����a���9�����qwX��j'�)C|��S�vjo�'X��"h-=w,�[��b�+K�����/
t�������u������X
�}��!���t���tOk�zG�N��f^Co�%�(��n!+O���:*�������������*C���X�<������[W����'��}������
1}�:�������"<�y��Z`�p~C����L�,b�� �p]�Z��N��7�<��d�}?}��'��W�����
Y��O�?���*e������� E�������S��!.�i��ra[s�z�`^"��X�'���z�o��-��|��H��zB{�}Y?���{�	���e�O)Vt�R�|��E�Bh�7L�w/��I�/���G��1�a<�~�@����� _H�z���x��D��1N5_Q��q~����*mV:�m%�|�]r&=D���x�N��!��M-�B:������wWR*]��V��
PH�]a�"��uI����+�R�wxy�L�k���8���Q�bL���������(c���_�u_���K����|�+N��7v
���y����&�1�'x6��<��m�s�d�y��Hq����X�1�A�#"�9�:�0�����4���}��D���wXF�R���s;5��������)+T��#J���~z+�/�Nh�?���xb�w�]\�������8e�C5��#_���ysv��z'�\:������,���=op\�+F�{Q�%&��
#��1�w��O�1NQjj��'V���$��������BA����~J������`l���������Z��s������9�PjD�L2z-��FH<o��4���Kp-���,�3�Y����-xO^�R;��N����?�y�X���RSO������QQ:�f���dq&PFO'��x;��;K�kv
~h�O�.�;MN�^����*��$V�@�#�����1�b`����U�l�&n�����u�����&�d�d�I��q<9��6e�����;iK������:�N��E��0Pb�5��}�@���zw�tr5'Qos2�}��i��������?���_�9e/���o(�L���=]ul�u�m�1���J+�]F�S.1V+|,���>�"=���D����>Gw�A2�`a��v�
�l��qG,�\,��/�h'^�+�a�,����PH����;�D�������4�o?��k/�d�D�v^��H.�J���&�����o�J}�Nn��>�O=�&Z�?���g�+f���!���� �F]L��-+=�EYr�WX_A�������&��E��T��w5+gr��%���8OKco(�UT��J'�Y�o�������8�V�I��>a���������V*��D��k�.�'����oPo���b(fe�'���h6���������\�?�j/9�z��&-�c��R[�f6�`!In-���GZ�[D���R���G����r�'+�L���Qry�~V�1�l��=v:�_I����������T���xX��P)�H	��{q0"y�<N	
�������
�H�Hq�b������`
|��d���K��������s;�t��GV�Kz������1�W������B��������y'}���*���|�TO�ef���P��ke�a�`��N���" ��(HMy�G��1WE	��Y|�B�����>#���D�6N����p����W"p���7|J)imS�����_r�&������������T�K�u��-��Z���<�/��M�����b���������������;Z�3���!���S����[�Q�����0!���_���$=\�@�P�q����<[��/H4����}�2j��E�7n+��x���qOQA��T2��J�bqN��k��j/�QH�8_���B��T����f(	\�qp�DM�{f�Z���Q��6����.hy��{5���G�������2��}�o��}D���JQ��J_E�z�?�y,^Nr�K��hr*I�-�����D)��Ax\��RY��,������j.���&J�p�^L��a��g�4��%�e��=����6 ��&�:��| b
��O�P�n�x���*MI�������.���O�����q�h��OB���~�b�*E+��#����� ��Y2�)C���gP�c�:��\�}��m|�j��������lj�3Is�����L��U������`t#��d���0���?�A�B1��+���<������
#��9���{[�s��E;Aq�~�f��A�������!�g��b�/��[@��&�%����}�JiQ�6���h��*�o��)�����kI.unYO1�����g��u^�F����YzE����~h�E�����u �����^��I')h�+V���\@�����~��-6k�+$�����(0f6�o������ya�{�@��7m&=���zr��`0g<��U�c������
h��@�(�}L�2���8R
��-��l(��Bc���k}���)�9�W<I��������g����iJ����ZD��.��f���'?a�%Urz�z����b��	V!=��7u}�{�l�CYp�W�G��J����d�����?��lBZ,������MY���%e]"��������-�6�����M]j����,��_��l�y.M�\3 �H�����XK>���kJ������v�0��.3��:��K)����49�M+�K���hs��iA�#C���<7%H���d��?���������c�<��-p��@y?��fQ�*A�@T��C��j�8?
�q\	[p%��������0�aE`�j�&�d�S��x��������������;����o�����|����3bL����l`����hK��yu����� �A8�� LYc>�DN�D�4=B��u�!7�2�g���'���B{�++���K��t��I�mXO��$����0s��M�Q���)����%K�k�9.���N]V�g�IF�W�	V�����<B.�p|'3���{�jJ'�?0"�{�u����
D*�����������������8���w�VFY*�Ww�g4�WO?���n��B�f��V�����KT������!0���+�V���_�k,I�����B��X��E�����|L`���f���Sn��lTsFLk�ob����X���S�)c�u��2#��Zm�5�K��f�0�N���*��t)�l�*�������czw���T!���`�
A�������2Ce!|�;{���P��!AzHM#=��&1<"���d�c�*����SN��ti����k�XH�-�E��d!|os�KS��9���
���@2G`^�����P���~Pm�������
���f��#.�#���
:�3}��NP~A���
Y5���GS�^D��W�y�k��P��S��7��3��w�X)T��A��
xh�k�KS�_I_i�%�h�a�������3��f� ����G���~�� �l���<�7'0�E{A^+���B�>�H(1�yX�J�I;���cS����HOT��y������N�M�M���CHa(+�^T������`��r�P�uT��
���M��I���Q7�����c����O��X.bl��K�?>j���M�N<�E"����
���������i������?��k�G�U>Hs���������,��}��.n{^�xbQ��X�0��.����e�u�S�c�(��xH�1�3
[���@��9_[�"��[���1&i�D��1�=��u�����r�w�zd��x�I����F����>{����g|iao�����w�Lz�Y��H��D������-�|cLz����k��� ���O��$�z�b�Ss������t�r���B���:����?�����9�c:���u���B�o�/������2y���J4n=�eWN��R�I-�`���������4=C�O'L�x���L\�%��9�!�BB�`D���X
�����!^Gb���[������W�}�i��qzq������.�g������� ���<�0c���69���C\�xb�
�Wj��1I��U�CS�N{7�Ee��� ��w����qKM�e��������aE=	&�g���I^�������M��a}�Bj�r��Ce�5�y0�FB�[M����V����)1�k<�`�r1�	��%�}:����l����<��UMvj�
Q"cn/-���3S�X��B7�>��������������K�����I�@���1�9���4�hs��L'�&F��|^������`Y80I����c��pL'�T���>���|��2���^Z�\@�h���I�������U1R(~����!K��P��`�vC\C�w.�z+��H���I�������Th�*�~�*B�����:�����U~�4����L+�<t��yzh����]_�7?[N�w��::Sh��]Ng�����P�����
������,?��g����Q��,���Q�?@}�l���-n�b��OS�RK�L��<��"�������Ux����yx�G=��m�:���')x�Y�����~B��6�KK���5���U,�dn��j:�!�j���G�>�[A
�
��cI"�m��O���D�#B�������5~����@�!������:���^��n�J��T�gCI2D��E�R&���`�O����B�
�fj���=.��y�<�r2��I����z�U��������>'���.���9�����w���O�o����2^q�0V<=�w*��m�� p�~j��	'�yD;c����3}�S�Z_^�bWA�[�p��
&^+�<��;����J#e�X1� �D�9d"�Q*�@�[���c��x�9IC��������6��^��k����kXe�"�K{2�K���FXN �p�PO�NoR�X�>����OiA�����@IDATG�����he�sk������j%_R1
�$�B,Y4*����m���C|D�}s�4�������h;x~`�7��'N:�
X�3����7<��F�H���1�2���
N='XF3A������4��^�`��bx
���h��+��yt����cG8��}t%�g�����I��q���M�aV�na4��`���r��[R�;1���,�6:���Nz�/��&���g�0?`R� ���n�$���������6��A�1����"���|T���o�8����y���I���v%+��	�oz���a=��)j�����(���R��(�c��;ZS���I]J����K���:�y�/
�K���F���@y5��\PT��*�Vn��O�B�?��/�9�_/8��`�~:�i�VU}}���)�����d�Xh��t{S�???_�izz:-Y�T��=kv����t��4F�v�1��08cB/fK�`!*����{�@�nJ��7)e�M`��`:L�_�����Xl@aKE�`��o�6ze�[�q�����CBIE�
.��V�#���)�u�1+��DN?�2��BM�}GM�'~&���1���$��]y����q��ZL��c(Q.&_��I@H'n����&u�S��	�5XU ��^������9"F�P�m�i)Qp)x7Fe�k�����<GI�{�7Tw�����������5�y��o�������_YE�������>���D��p��Y�������������B8��zx1���d��w�����J��&�a���1�:X�d�w9;�x��5\�����Ong0��ni(�;;�9���- 1���X�d����^�=}&AR�F�5P:%Y8�G��tb������n-4��]f�4�p�e����b������df(�x/X��}�2��:�;��e�����G��w��NVM*0��-n����>�-���{���SZ6y1���J>�R8����I��T��u{�)�>�>HO�k|Y��9��XQ3��9�SV��*&��
�;���L���4��r����+{�s���iQ_�����?/`����G�u�����!�VM*t���7�AP2�i)�J�{�*�Lk�f���C�bK`��f�>�k�������}�lz�p�t��!T��G��^��x��/��d�I���d���$��B����<l4VXN_��2A����h�1$�D�`��Q��Q���w�r~�-D�Vz)��-:��Co�5�9Z���[@��`����}h��|v�s����
5���)a1x��<
��w���-	8R=$�1��|[����kx]!��t�������CJ�6��zc��������[Y��O`]���1J�	�K]��/���S$�zZ�I��>��%����u��x/'Q��}t���.q��_����l#��U\�M��"��K���|c��d��X����/[���}�p\�H���9Tc�G�(�������H�rj:'j�(����"��<��g�����������x/d;��JZnnVk��m��u%�=-�dE���������NHX�c�	��4E��o<7�te��F�����]�d1�����&?@�w~@v6��g�7��CJ�h��2�q�Q.��/h'�f��,���|�E)Go��PCS�z�H��9���-�����OM��������7nD���<������	�B@6�	sN]C4�\��" =*�>�H��|�H����c����r����D��F��*�.���GR@��L�*�x��e�oq�N�qt��[)�v��P�$�<���	J|���t4��U/��+x�D|'�U��g���w�/�t\!��p�Vf�q[��<���B�,�FK#m~ ����8K������
t��y����O?]y<��hPY�xjii�5k��=�Ns�����n�4����������&QF���+W*��l��9�K?X��kjjPU����L9S�Y8�B�Z:i�
�jmR���{���q��'�7�M�����R�B��~L���?����)��������Ya�Z]CY�z�Y�����V�]���Iy����eH��k���xA�
��e��D��5o��{g8���k��G���)%��p�I~,�E��0�~�e����c�1�������<5S���][�8���5Zrg��r�b\Kff����.�~��<w���:�f�t~����;^y������4��i�v5�I����-�t�/y���~/3.������Uw]�����rs�B��������������wc�����djw�\��}������.h�6�����o#������`k������6��S��Y�J�X����!��?P��)��2�l����y�g���Y�8K���u_��2	zY�����6����Gm��T���� cO�9�+7\��d�
�+f��~VG7��M%Wn3>>:��F�o������`?H>3jd��<$�#B���(]�@�k�/�������>^�f�����_Y�$�#<�:5��h�L������s�7�v��{.XBd���J�,.�`��>����q�Z�&V(�9�M60���]��3�6�������-��Z�O��kI���m�W�d���a�+�_�?�bC������Z��xK�>��H��������/Pfe6}j/���������2�c��b��qr��� 5z:��X����j,���WV�}^�tVu��Su�����l��r�����)�)o����Z��=��V����S`a#-��M���P��,,�&����%�^�k�?���������#����)s�����A>P,~Z�Sv�
��+O��r��)���&���t���YUj��6��������������d�`x�:��u	��<���8���F�_h��%���`�:�4�Z���d�x���P��o���K���[��{!�*�$�������(n*uq��`������	ywG}��&^C0���7��p�c�VQ8�Oe�`/=��E^�jU
���f�-��y�S��xiNz����������~�m�;}����^����Tm����p�8��/c�`���}�)'2\���\�R���z;�����iKMX�@%���o��kC]tMr��g�a�r��-��������Ax~�C/��(H4(v��*��Yb*,�D���8�6)�-��@��R�
��e@�	����j���m�����a�Y��>T�^���������5���'{���W�����r�X�y�������_&�*$F�������2��r���o������wo������!�G���d��*j�����o6��~d����l����o�+��,�.���)�k�AY��W6b���El�qP�1N����v��f��2*!�vA6e�+m@�UW?m���=�#�%$/������S��4��x5������)� DoWg�O����QF rG2�g���Rx<�"x%�H�"���k��Yv5?����R��{{��4��sZC_�2�jX&4������iR�d���6teY��kX�.m��UV�����:?���G���9d����s����2K���qT!w�GM�,UJCO������F�����61�3��4#�X���\W�f����9���<?U}�&6�	_�6)�~��7z��n�#�����n�����Zw�(H�4�0�����@{re��@����qcr�V�GmU�������,����X���b��Z��3:S�*�}D[�1����7&} ������H���[q~��AqyIn.��'���i��T:w���4���X���.���I��������pnL�P
x6�1\������:��(b �l���)���(���%t�����J�J�W�nsg��r=��hK����(x�q�`u���i�I��~+�P���|��~?|r?vv���;�� ��
l	����	M�)5U���>����LIX������t�G�n��uv�V��cg�Y{
c�s��>���������
4��F�s2�[:xw��	��I/g�L�UORO��
|�f������<�]��M}LZ��X����������;Y8�B��Zf�y)��}���c��qp��aH��Q��UC�4�^K����[�%����bg;]M-t�7�e�:a]�dg+;�Fc[\��ZV���o���'����e������������d�
�i^��Ci�m7���t�������LtG>���j�����n���c���`\�o�e/�]OP������k��l��q�	S~�r�RVI�^�*(��p;��o=����h]��8��IgA��u1d�����~K��y�Y���%���C���zH?BF!�^t<���[��T$&[���I��)5���#VPw��8�f$a�nc����)T�A���S�/@-�����m
;{H�G������g^uW[��X�bJ�^�~[Y�s��xH���s�CV�b�9Z�6��1Z�6�3��1nq[�L���#{�`�����)���f���������_l9���9"�?����v����A� �T�8~L������kd7�V(3y�-���N^���,�I��m�RNwJ������*��w��S�|��A��N����S�y7ZS�R�V�������ZN���j>~���6]M_/���3� ��(z������Zl��N).�`��E8�YV���&���wf
���J�nV�T�����kiW'������<.(����w�J��G��4������=�u�K�N�`��s�o�������r��b`3{A��?+~H;����96>.Z[�y�Wr��v�l/���x3l�=m6������ep�-7�lg#���T��X*mv���`��<�{���g�����B�Ld�d�@>f���ZvT
�z�of����X~�1A�Y��H_~�^����
�81<�2��U:[��\/s��s�KX�t������&�Kv@��v����
'?H�o�a��6��L"���'SR:���CO!^�=�B�{.��m��>H�n����j���g��7��f��jw����y��?�>K�c�f�m-���G�����p��n�x�7���RqN��e;+$Oc��a�^0��v�\D��	1��
���f� ��m��y���k5�YzQ=_�����tr������F��>������1ZuiX��`������Q}��o>Gr�Pyu�go2�.5�B.Rp�G����6Y����es�Rrc8(������������_g�����|v�@�;:�;��E��\G�����|@���=�}��`f3��j��-�p5~�0L�s^�O��;'�oB�;��
�B���]`�	��W��
� ����p92;@�	L
�����d�UH>��G�������A?��z��-�H���N��j�=�)�yQ�O�o�e#��>e@���ez=�t%��l
��������:�����Q7�X���
��=�Cr+7w�(��_yX����"u����y�����'�9ufX��,9_��J)k�2L\+��o�A�D�_����]{%��[s�����!g�:(�H0v���}�A�SL�e���<DA.�I{w�E0�Q\�"{�
�-a��>��J��#|H�'�4i���'��Tu�>��/�	��S��1��}��m;(�~���9����Z�J�������c�2�9p$��
s*�Y?
7^���Zt�KS�~�Fs!��o��A��k�dV@�d���� ���H/7����$(���WJ
x�)�y���7G����U�|^�E��8gl{�H��D���Q�4c��C�8b���)Sh����6�Ki{SA�����r��g$�����4���G�����`$����4zg�Gy��9�b�^���$P��o�������}>mN>����I-uo������0	�x�]c�p����Sqy���u% X�jb��Ni@�~>��e�Gq�����X~ T�V��Y�`�KW�)p_^�Vt�lx��6 �M�s��5"t�������CX{
���N���_�M�����$���(V�bC�.���2���*�2c�KO���N�n�1���0��g���-~u�1(�|�=J�����:�[���E�Q	F�-�$��fc�a�.��A��b�'e����'����e����@B,��1���U�����i�sN{c��h[�W�Rx!��w���	���,j���o����PAK��4���@-�����#����VC�I��|-�
���"�yq�[)9��;���w1l*��B^��e+�l[���h������J�f+��fS&�����������������k[�J����M/���U)�~�}��2���<����?�}�������o�����]�g������ �p\u�q|B�6�!`c���x{��
(3�]���x�������|s/^Mf�����}��7<G=)VZ��"�-���`�����n|�c�2�}���`�&�	����h\��b��+~v�'�Z���$�H�/eX��,l8.����|�������3�Qph���I+6�����@8���}��C9���T��o ��������YcgLO����!{�|r�w9��z={������5[���}@IA��]��??�s�Q[��Qw�z'x/��*���}����_���@���Wc?��+h~�G�����qc(��(O}{��
Ht�j_���g����J�Hy�:���K���,b)9���E���~P^;_+��1�s�w��PQ�5�M�e�$�*�0��pX2�g�P!��Z�F���
���"G��u�ZGc*��v�m���u�����G&�e���1A�v�0����~w+��9Ld,��f���\@Oh�������-s<9�y���)�����H4�Z�_����G�����'$�c}i*�@{���o���Ss����,��lX�eHGsr�����9Fe���V��i+��:�eP<$��s>g�U���7���v�!v\/{����x�\v�
��Z���j�p�Bb�.:E)h�	.�-�
�6C��?��	��;mem��nH�!���M�+b��9��1���W�
�,T����5��ygR�C2
�%�hmk)	^��J'�hC��L����|F�6��+�&�K7T���������v�E&�'Z��i��9��������O��=�,=��#j�c�-��:m����PxRFO���c�&{1E��Cz��o�Zw��V���[!,��8.d��_y���u�%#�v�pcC����r��l������ ��~��)��9�f�������EW���Q +�d�dt���^v��0�l<\_L�G\��&�\GO��0&�����v��TY��^-�z�i��
��l9�M�����x�N���H���K������},����)V��1�9��Y������j!��*V�9����&� ���BX��!Lv��v��#KQ#�J\��|�zo���H`��L$M�tP �����
���d6}�����m�t��k����U�"7[�f7��fAT���wlnc�zo�U)�2X�W�7�3���=�:�^���'�G{��o��A��]���8���XoCa@�I%��,<�yo�/��{���F�HL4����Y�dQ(�����Y�d#�=�7!�J'���o���i~����n+�K'ls��i=��==�g�G����z�JX�r�K�+�����b��l� u��9+��I�76������
BB�f�v�s���m7SSO}8;C�X9����K|�V�S������yH�������
&3��1?�8�U�B�d^�������Zj����>��RUz�u��B��z:��=�E'��3�i��t*�����+hK��p}��;��"�.�����"P�������Cs ]O�&��-�YI<�*�Q���Y����:���l`�.�"e�2�0�� ���[
JI� ?�A�@(�o,���GQI�m]�y�%k��F��2��nt�p�Q3�AH(�8���Du��r*�A�����.N9j+�d�By{���~[i��>�����"�N ���$��!=�������b����u����c|��},c:�m��a��q����������<[�U��P6��������U��oCbJ��oC���~����C��"�1��,|@����X���w�����1�
�>�'P�D /��G�y���<����y��6�B��>D�q��}������^�D��6��u���3[y_������������y�=��a
-`������-��rG������������4�g=9����MC��"|�-��:<&:�#������F�����]Q�s*F�^��t�����O���2��?��B�(G=���C5wG�7�91�A[>���y��%�]�I�5c�h���p<��
�+����3���#n'���������I��g�������2�SFIjI��!$�_;;Z���i�	�\
F��<6�%��Y�f��c��cN��#��YG����t)}��O��8-A��"��~+�t#�������������M(0{�bJ��n*�/`8=�x���p
i�V(�}r]���G�\�}m��f&�S��u�^`���$����SM��]?�*����JP�������J��g������d�*o&{�@k������l9a\��d% (=��&��E?e(�YyW���S5�I�'&�:���A��0��+�I"������ ��s^d1��������'3NV�K����N�������K�e�_[P��y�o�4����v��c�������!'0I���u�2��0�7�DL%)�V�%���Zl��T�<�CY	���Y���9�pE��qf|����=[|
�E����$���;�����A��L��N��������a���\����GE!:��F{=4�d���Q�����?��)���I�UT��j�|k�TL"�Z@zX��?�'|� q
�&�n����D���� ����A]Y]��lH@<��V6����Llx0[�'��.~��l�q����-�L/�9^��3������/�g���v
�d	Y��r~Wz�[:+�r�-;E�na��fY�|m�2�/C;���-������M���;o��U+��y�+�4S:%Qf�O��n%(�o����eB#��i�9<��M�!gw���Mf�����O~���R�k9���l����W��j~C����?��O!�&%D���(U�U,���
�V�v��c�C��1�<��������3�4�l!8���D����#�@���X���O~|����a��=&��e�?���
A���h^B��[NjyW�`H�-�.�#�HI ���53���'�����M��Zmo��+�X��7����|�AM������� �� ��P���U����W�s�?�d�#��m|-��Ao4��#O-J�����9�o�w�6��"�}�����e+>1|��/�����q*����;���������Q8�}0@��kb����k�4@"��5����v�T�YK�|��&|����Qw����/�0K{?�%�N�����+��=�O��5�s�{��-^:mu
{�������D{v�G�/��v���+���d�V]����2�"xx���9��SY��n��+O��� ��������VFU�o���2��7���
���=K}'�5���o�[
��Z�q�|�����o@A4�G�Q^�~6:Of�]��Le�9����=�6���Gw~�*���rKN����d����z�qL����q`C�)��2���G����������:x�#�1vc
��
���	eb=
T,op�:`$�����,�i�ST�8R��X��H�h����[����M[�l�s�/W�z���G�����4��:������N�c�9F�i��s���W�P<��
�p
i�i���q���#���2(3�4`�a		��
��,�0��-X{�����N�p��A��M��qN�aB���b�e���49���	��5Y���2���tn����V&��4})�w�my!�cQ�gz���o����d�Z���}�O	
ZV
�v�s��AR�+B�o��)�4`D���@�C0'����s$L���C�c��a{�1�r�w�zk��t�����RN_��;*/����(�60��X�<�,6���Hz���k(e�M���6��{��I��w2m-�M�S����1���&V:���x.PO]������������N�������YZW���;�������7�I�8�����x����ic���?r���@���(�@1�,cl0� �{�1����wH�0;/Xa���_$�s���6�X��	;E�"B�W� �|C���������AV:9���b�R'�N�=�LSJ�ss���<�����
r�|�:�9�m�jU�wA��Pq�`����YH$��O�&y���It���t�9g���I��T�.H�4������b[�<�������[{�'������.21$?9+�2���hS��f3��;nt�W%�7T�!w��j�L�)�����%k�&:y��������D�?���[%{�� T+���:���y�0v�����-i"��������%�h��v�)�c�����-&�j��.~MS"������%J`�Qs��%��Y���1�)�]��3X�7��S�4��}�[��F����S�vF!�������'}�N |����J�Ra���e�O��Z��]�e��0&�O�/�C��o�:`m��@�a��~P~�7
�H���q��0*�����0&�c1���P@P2B��kP�h��s��tq�F�1��%�-��8��M~�=�Y�@����uwR�W%��B���"�����2��Q:�5��z��F���������6���y>��;�2�l����|d�^O�d~����S7�C��(\.vpLP?}�������e�%��S����L�/	�R6&bYx�D�rUy����
x�������|���������q]��X�o��O[���D��1<�	>�����
���s����+���Sg�H's<v�a��m�B���uo�Y���0�yt���[�U�DR�g2p,	�N���s�q��~����4<{�? ���J&�RG��G������j����k��D�v�?G��������������7~N+W����_��>���	��w�Q��FH����pNR�����[B`�1`����!N`��E�b����,�����F�j�c�#�'�B�X�,�����M��z4��'o�6�O����)zJNT5m�?�j�3dz�+�Us��*��M~���q"�0HpY'��q����,���:zH���A[_!L����nK�7�s����57���L�9u<u$����3�����X��E���b�=���=�QK�5��]���?s��z3(��.�X\��1ggB�7`�a�?�>���L+\aU�s�RG���S�;�?��0"�����w	�^�}k��4/&�@3e����{�T���U��y
S���d���B������&�X��{%��_Jf��QEc!��O���q�n���k0�@����D�����EH�H���}Xd�yNP�{�j�x@Av�j�U�\��x�����<- p��pC���!�b�N���@��/���/4�������R���������s����-+�����9�����Rc�`b(:PC�A�!cP��.�{&hv;aO�A�k����������n����L&�L�L������D���DP�G�/� ��<Q)�����*��A������>��d�&=7�7����oVrr�����@����s��g����e�U��w�7O�;����9K ��@#Z�,h���'�.�%Mj"M�^�(��/�� ��\�Z�O�%B�����*��QLe	�� �cOn�����;_��'7{�����yUA��[���i	+��E�4���^����4�A�x�c���}E�Z�[��6�A����P�F/��"	�'�k��i�����D��������*\5��U���\���l�����8?�����R�{N�2B�TB�T�1��h*�8��wJ�M��^�|H>_�����sGQp���w%�c�.�C�-�p��a�}���ge�����4
eY���T`����	��PB��I}����L�I�F�j����T����v�I���A<��;h9���0�!~?������?���1=qz��;�������-M�s�{�pO�:R���#�@���O�����"tM��x�h��Oy��V	O4Xb?`�",�9�R�+P~��(<��utc�����+�	�rFd .	Q�b��7�"�����8�GbiQv�)�d�|�?��������^F����Dsr����T��W�i����kQS���;���@Z�G���/�8�}����;���t�����T!K�7����g�):��������!�������i[�~g��%����2I��Y��2����.-���@�>��p;_4O�J���
����2q:��g���i���������*����;@]NU��
a�N7�o��O��=
)�����e��)�?p�2O�����gPAZ��$L�]c���q������2/V0/��1�cS���o�x/ o��e^�4)����5��L[��p�������
!*x�������EK�G������W_��u��|�?�g���;qG��b����Y\o7�S�����/��E�
�
3[b!B\��]�����8A,���������������q@k�C�X��u)o1v���n��@$*-���l�U�?r#v	�[������w�{`�ee��P�7����&Qj���I��>�z�h�(����s���z��!�B�NE������~!A�o�"|���s������<&�`B���v����AQ@Z1���k?(X����>A�~���7��&7����n�?�U����
�E*�mQK�U�.��c�@����%N�mO��}3q��[PT��w��1q2���9c�^����\��!g���n��.��O}'�H�F���bl��u��i�;���t���}��hu.�Q:�o�B�����Mxmz�N�����EC�����D���6�����x���bS	��b�R�$�yN�L
g���!J'�
d��t
��EB��d�&Z�~���&�]unl�8�9��m���y�`�|mP����lCn�6Q:���<wE-n�]`��5"�3��RR�6�#K��������5-�Nloz;�o�_I��da��>5���<�!;��D�;�b8�%!�%�5"V�����7<��8�Cl}O��!�(,k:�}��N<��\�I:W�\��"��������dJ�[R��3�7W�/pM�/���;p-#q�g��{n�z��v+��R�4����~�kH�-�~�����������WE8L��0���(w0�y�
��_r�Y���2dwl�Y?���;g����D~h8�>e$\?K�|���=F��}~8��^rL����$���s����m��n�ks���>G�S��_�g�e� ����^��t��u�{����\�~[��Y�i���S�����.#cQc��z�)/��K|��->���<\�0�Z,������s5�������**����;���!�y�4d����W��Kb�
��Z���7�y�}#Q���R�j��]�p`�u��~,!P���u�
�a�������������Dl�-���9f^N,���4d�M\I��L�hG����U
Z���@AX$�(cY^���>������u^���	����a�)��]�5FL���v{;.k�Mk$dT�e����Y��8����%��w���Kt�������{�]z]T��^�#�Cr������-�)�4���������7f��g>�Y�w���9�:��H-�(Lx�;��2[�w������G���H�����d�O������(��M����PK�d�=�4�m�L���*{H��=�h���r����{p��;{�-���B7,<��d��5O����/�liS�Z*�L��z	��B_+.+�����d�>X��)<
!���y.����7����/�l�N�MEb=���6�>�������q���#����P������%>%d�@�Mzb�u�4Z��{d���w�J�Zp��[��-<�%�]u�<b��m��@��I����|Ok~zK���(���A\��Fm��,�'V�Pp��)5�%e���:03��p*Q��<
;��,�i��m���.��%�%I���[����H��
R��_~��=���u�H���6�r���8M�-
[z7pN���v{�����u��da;k1�u
��v�xU��^*����z��s�C�r�S�?X:m�������LGE�hy�)����`�&��l�2�G���C��!��U���7���G0~c#�)�x��mx[b|z�SH�2���}���Q-��s|�x���g���������
�dS	4�#['�*h����S���D�X��mn��{3W�"�]�
e�l�����+M67��wT��[��$.��(������J�C'6f�P.r�3w��lX���������L&�r"!�F��(�\���p�����}����sE'Q��J��{
7�X�
X/���m���Zh���9'���0�+�(`n���o=�~��[�����yO��t���2�Px��0�}��:7e�O�R���o���L��N���p��>M�H��H�MB��5���-9/��6ON�t��v�w�o<R�z4�:r��Bk��a|�w���k=���X�7y�u]�>�kU��|��/�}jC�^������>���9?�L�NAy�3����Fvq��G0�

B;:NEe�X�)�hCQ�����U��A�5����Yo��\b}���K��G�t��J�E���8������W����a��� �A�����T&V|� ��Z7�-�*V����Ng������*��d4�Z�o9^I:~3���o92�>��.����k6�_
'�]�������Z�3���K�q5��������N�"y�t%���I���E�D�����������tY�u]����1��H�`$�(I�e���x��M�]�%dT��!#*T�T�[��������'
!����Gg�jy�>s��{�)K�W \�6��>k�t.��������m���3A��8j��:-|&i4�H{w����1����#��������#�i���������.>*�Y^5��!�Z������p~W��w.n���l�F�n����#Z�2cH
�G&���dI�#)�6�i�\�0�r��T(�;��j��{�x�c&����rr�D��zD��ewr�
�c�H�
��,QJ����+�4,�{�;��%��E�q�I���x �O���!P����h���g��d*�sd���l��!��c^�{�eQB�L�N:�K|��W��<�C�
�c��2�d��&�ek
�Y2_�I����D|�������c��EP_�K�5/��M��=s���X�X1��$��Oo���#���+�_��J����(8�R����<��1b�������S<�{�eHu��E��Ti(P��2���|�Q`�>�/l�>����q�E���}Pb�dg�W�Y]���!?.D�.�'��5���x�$�L<�L�X�2�t������T?�Fw��XeQy�AQ�r-#�QH�o��o�P��W��������l�L�]��l�������1f�ZQ��	B����p������"Q�e�
S�aQ�d��T�8�����=!T����'����8����[�?�+���	��#.�/�8��Y�_�XQ���p�\^T:����5��T��(t��<�5��u�$�_29Eiru��C��=*-��URb���F9�R����#
9�R~��o{����8
��\�<�9�u���(#��QQ�l�#1��Q:���xK������]������T�������KpV �e}�F��;^��'E������,���Z�Su�X�����Y��'	&�C��cm�`��w�D��
�!y��x�X�>����s#yK�OdZ]Ubjz
o�"X����O���Q����k�Ay���������[�*�L�bt�*�G��������N�+s������]�8�����|��,�QPk���o����0��\	�9���]N{�y�i}�n��x�%�w������Y�!�.l��9���T<�/��c�.�,�x�|�N`�����@IDAT�Y�u�����B��m!����'
ac��R��Fj���'3-���c�&o�����$�"X$�K�/�^��i���w@���B:7���yP�����}gG^B�a�;�������^D�7����.=�,�Yxl;�6=0�b�yF������}�����z4������Z{<|���m����NT����1x���kQ{������K��Q�D>��wD����^�o���v�����"����0���}�sm�D���s��������3ccq�)�M����	����FF��z;i�y����A9���z'����1���1�3���*�����k<��
$�������$���0G�D���\&���_�C���P������{_���M-`C�9'�5bUz���F�;���4|67$�a������P�2����u�.�|�������d�5.x3��%��7��E�
/��JtW&��H��hA�C�O���n�d��,'f
�|��bo��,�y_f��V��y�[���q��o�3����������Wj�C�|kX�����zO$�*���Y���1�E�.@������h��8�/�.OL#��%y���Xe��I�Ka�+��~��]�������'�];6���:>�7�d��:��Q�.���lRU��v�6�"1=�*m
|J���DJ���7H�o��b�����Ff�M���>*�`o�L����������}��oh�F�6������mA���v9�#���?�"��:D� �S*����:�S���=v��X��o�9+k�H|����g�y�f�"����E���|_��s��tr���(�8o1&��"������M�u>����l\/����"����B��w2Q�dc)n2(,oA8�E��VD�/�eKL��H��_�C�G�����J4���y�bP���Us����
]���e0y���2$
�J%9�"=��L�F����P��W
���/�'�'�_���������B���������G�K~�h�V��K��+�hNE�oxb��uOU��\S^O�����PT>��C�f�\���x8"+���3e��������m����n
�����3�H�o�_���k�U���C�7u}�~A�
�_�<?�i8��j(1^��:�G^�V��o<��]������_8}zL,�5�%x��>.
z89����'Z���!i���W�X���`H�E^�,�yH�:�]~1*��+B"�Y�U����o���3�h�4+�FqhkJeq�aK���������u�F�2Y�1c�� ��~{�7��5�|�@��{r�V��8?���������k�y�s��cp^Q���W@,��@:��?c����E�J���	�VEBJ~}h���z&����P}&;�8d��� �Y���G	��|��u~�������t���l5���/��������U�c����� �}��(�||���j�_G�6cY�/�k��y�i���|
�;V�Ck~4N�0���CNchW����)��[��|��7�������^�=�m��-�lK��W��]��S�s����k�V������u�QTi�}�H���0S�H�x
��(J�aC�w�p��B�S��5�s�}�7�K������v�U����t�t���������e4��,>�G��6$�w�U�����m�:����X&iF���sB��O�������Z��l�h�w������yB"������iD�8i��,�k��h)g���5#~���?�
���7A5s.�Mb��8��>M�Nt+I�������77*us�F���J���9�o��u
J�F���u�����Z�'�M0��Z����xm�#^�4�7|T,Yg����b� ���He �d���;Z��.TR.�X[��C�l[2VR�����.�v�p���X��p���������+^��V�!F�_��=l�I�zJh�\���=sqO�SB��hx_2R��T��'g�������3C���H~�T�����m����5
C�y�_���/g�l��xs"�]!Q:�D�����x��`�=&�Z�x�os�R��x
���aK����FE�!��x>�
�5����G>�����P%7��u��@�c�a�X�u�2����Msq���g��}����~������1Z���r2S�*qx�x
��Q�N����x�P�$J��i��t��x�N�l�n#P#E�3q��B���=U�;��9�<m���8�ZY��$�	�7;��$V���7<9[��&i���W�t��bR}��I*�(���aQ�/��Q���czB�mo��!��
��W�^����_�����{�����=�����
�Q1�������:��G�[�D8Giy���8�`?��l�Q<
��9����
TG������r�����>N3�����<`J��[����@��A����@��>����w���'�>���6����_�	���-�s���M���
�xjC-�����`���DH�BHLkC�8������<C�N���-���6�x�	_�"iz_Nmv�?dO>��	5��$����v��1��
�I]�� �~B0��)��m�mQ�rf<��=l�>���e��w����O:R��#���$q_b���Y� ���f���n��f�O�xj�#������a����P�5���^��w�
����Q��$fod��D����)��g��������1j��>�K���
��=?5�����qF�hM9�#{�^a;�<A���J/��2iay�A�<�j�{�_�6&�Pe��F�D8%�g���kCP�����:*�N��4���9���_"������VXb��#��3�(DB��������g��I�D���z�(E�Y�J�d�g��_c����J�(����XG������
���KP���W���I��j�	�S?-��\���N����Y�����W�2.:����.��>QB��~����$������T:���e&Q�?2�;$������Z����E��z]q�f����O��&����T��5�H~z8
Z<0���;��*`iw�����E(��V8���X`��`�2%�+j�?3}v$�)$�z<����
��L	d��������gq���E�����6�V����6�"�+���
��#tM����c����-���W"���a~�?.�d�TIe]�5
-�i9L(I2�d8oj�d�%{}i^�~�0����z;����T4,<�rP�����b��z$����&h���
��jpy�2��PW�Tw���C )�����I 9r�����3QO��C���!7�����Pz��,k7x��`}J�,~n�F�8'(�z_?�H�c�<���mfSw@�t�����Fq���+)��kn������+mX���-��b���%&��l��e�%�W8��"��\�K?��B)�6�K*�����9�M ik�RSa�r57F�_��{��/M_1S�js������1M�k�
��z�#��<�R��W�q�XG����&���~~���z:�6*9��+�iw_�qSY_d��n#]�U�9���0�Oe*c��8X�������x�2��,�D��W��s��r��\������e"o�M�����=h��&�D������N)�cV'�oO�(�V��?�kJ�k���8��H, �����9�+��V��X<��Ns�F��%�%6������8���lI����l�|��h�*�	_H�r���
�K�j�������1���X^����O�����(s`�4��P��w�>B�V��5U~��Q��1(�n��F,9o{��"���	8�|\��k8�����p��3�kT2����U�)�<�[PvB~��</�tn�{p[{��KvI}��B�1o�#���b��#��b|�~w�cG���'1�IV���s���O�����q�����[��b��nr��1��G��A��_���V���w�*w�����(�l���S����K2VR�������ds����}�H���w����D%�o��4�"J!�b]MF�5����gc�W(���(�9h��
�W�(4�r�
��V�$�5�H�'F�H���K(�S�Z:p#��\'gV��PxJ�*>������u��:=A�E�e�No��w���%{)a8���:�B���-��5��:����
��&;3�2�N�9��62��jGE��s�#8�4�}�5�c���O��Ro7Z�p��I�/����.D��Z���'�!�b�P�_�����U���'�l����8�Z�����k2-M�,<�oq������M=��X�$*	t\�#�Zt�u��3�(|5�����x�T+��*�M\I�����Jo'*��j���������XT2�"n�)8"4�2������n��P� �R�9����t.�����#�_..�#��`���s�E�e70i1��ty<�&R��rF�x&!}���	��(��]����\�$pg�)I�$��}`�/`�[	�7z\�����*p�)�}��Nh���(�*�8��<�������7����J7��@+���6	��Men�<��I0�zO�T�p��r?��EAL�����8������GtWa�3D�(�+�*q����_���$�X<K��d���r�i�N'n���*��/�_��v
N��]�{�j���>o����9g��G�7��#����p��nh>��:�%���{�5�H0�A�u�O��j�{����[�"k�$��/��:���B���e�2Q�F��@��^��J"{�>��7�eF��������|�D^{��p�.���������C	�=��T>��'�4�I'��R�]ykl'�Q���F���2s�����]f����.������]�!}F���s�����v0y�EZ�}�H|&����"<�S������g�Q����I6�E�fj�u4"[���U�R�4���<��0x9����r��&ki��U1�Sy����k�x�w������}�j�\�u�H��uT�p,���(A�`[�
$��D�����0-�g!h<�i;��1B�y�0~�`��)E9��\3������
�Fvh
���sLm���WG�����1V:�\C
D�Q���+��3��! ����"��U<�J��K���6V_����oX��o���1����uO�D��2������f�s�7������x�F������W{�\3���'�N�_�����1]����F�5�x�$K �����Lv���u���j��E�`\&���xC����[�.���T`�����}��;I��h�V�Nl/�%���7*�l"��I|{� d�~���g�.MO������p�X����NT.��Y�hUeev8a$�$#(b���{�@r{���V7��Qy����]:�d�0U������c���r�����5�vc�rQhRb���<�nS�q�L]jY7~72�:�3��$e���0-.X�y;�L�Z-D*����>���a`�w&�u(�c�5�LP��qGn�7��g���e�UX��@n>*f,g>��1��3�lqS��8�S�7%�b2�;�OP(K�������.�ZO�� ��\��z�:n�$RI�@�];�K�sy0�c�����T��4
�[�J�?\+&�L)!2��C�T����s��N�$I�C�������7]�G����C�o���>6�{����(?��r�(�eS���NQ�
���R�E
���m�M�n���n\'�xT��Va���Xi�Y���#
q��>�����\p��;-U�8����j_L�o�k\K����S�����W��\������L{���CB8E�����d���^CM���l�R\t���������A�R��0D)9�y�}�X{+$�S�����
�������$<�/�-�������4V_~$7n����*�uh�����hV��SDh�k�����a������:����K�"�?���s�]�"�������������?�a�m������|�
z�8���6�O�X����[�oI��~��������S���t��Bt��Y��+�����������c^����24H��J��SLq���t��(�[1�ksa���T~I�4�,z�R�1��)=���IL�N0�R�_bc:�x/���L���Y�l���-�'��:������.,�v�����u��/��k�3v7i0,�����J���d�29M���q�������z}0G���36���q:Q����JT�����fd��a���R�.���Np���r�q�G�8&(��8�d���G�GI���5*�Ni/����i9�jgH(�n���S�V������g4*V:��&0��N�����g�==���G@�����#��������]�p�ox����i9O����5k�>��rEA2q�d�K&z%������
���o�7��989Ur�#�;������g|��"�]p�}"��5uv��C���8����W�v">�@��#{J&�3��A���}�]&~�1���$�����D�2��s�tb�0��a%�K&iF���X����|��(C���R�D�	����:�>WTL�%���x	��/�!�E8�u�ef��[�tO�T��M�5��R�flk�mN��H��
����>��^��E����EIna���f��*��K;�
'�_����F��\|n����)�=qz��r���LcL���jL��C���"{�W��=o�����Q��;�P ��$jQOm7j�c�3=����8��w'�?\T��G,n�*P�{���7��l\��$�"2��&����f �
]�G[�<�/���`�����zO�@�����H�sZp��:X��O������b�I�O��g6���{��
��h�l��Q ��j94���Ui,t��g�p(��e_�/�b�������.��6
#��'����C��:D-Q�x���!�PY���	��E�N��H����wL'���JE~L��8����f�.����<�E���G���S]�
t�����e87r�Q���H�I��$n�2��LYtc���lO���rs�L��_>=����=�r_�7���$�Ww�J�~�BN����������0�b5+Q�0����^��Gv��t�
Y�mb+j�>E�|<��t+�����<FB�#3���p	��Qb]#�����c����|������{a3~�P��i�f����#�J�ku�^�s��<�8����4��M��PY����H��i2�7Xwk�@Uz�c��������
�������b���5j0If���o��[CM���87q�������6^�I8'b<��t�}�a�#�* �AN�s
y�T��A�:���������]]�����D�<�������t�h��r����}A ���{H��._'b�<DDD3������;#p��NT�d�?�
�3���6���%���������QG�v���}���FkP�>XR�D��vxF���4vb�<f:gq~#���������������^#�5��/���bd ��G��1�8��YF/y`�!��6�6�����U�k���!��Y�e O:�V���������<E�r�5��:����./^mw�����Y
8�a�~G�S�?
1@����q�
7=%9���5.�j|�3�"�?!	������������c��r�s�m���r������{[y:%~m��S��~�x�t",���ET4�����Tr�k*��]g���_���g�7�
X�J�X�k���CJ����������W���	���s�K�&�.l<'#�Bfe�x�G�,��\��8�U�1�mY�$����YF0D�}
s������LVz�,������$I��O-���'{�+��������E�F���~����;.h���5\�����DkRf��7X��t�wbY��+�6Ue�2�-����j_'C�I��&/�wJ��9r��.�bs]��T
+�)Ef��bo�[�@����m]��I�Y�"�D����R�'�W���������VRA!�B��9u$�E�P������T�!Zy��*8����>cy����:��n������h3��{���8��W|�����Y��M�z^��>�WD�=�+� ��X70T$�o����R��?U:�WNnT������9D���ud�b(�p!>	P�es`r�
���E�P�h�:q��_H�6�������'M���������_�����]o��k�����;�=��_��1�3C������MX�|�^���5�
*�H��L����.0�m��[���*|�'qdvNO�@>�y�I�_�b�w��4�}sa���][fQN2���aLsDP����E���E8�S,�$x@\�V�R�s97���)�� 3%�������<��k������K*������&��������b�Wb%�:�[�
�<9?�5�66_�O������)���,����r������L�/��/w����e�2�*��	7�X���$���fi?��k<���n�����^T8q�I7��U���u������)?������c��#�`u�EOZ��k8��4�����	
��t|pP� FD��-�B����oO�����Q���[��q�?���Z����}Id����O�{p�j��q����U��=���z�����$��|c&����{���|�2���S������R��8�
/nh	�J�;�n7�(���v����e[�AlK��4�I�=3�;u�W�������o���Q�T�-�(����o�=����Q�����+UF���I���mb�wU��x�&�����j*�r�E������w+m��%dD;�{Y���s������{A��v�g
NE����r��A����K(����W�h
���(�Fj���&Z`�Z`�Q:���������H�����>�SO=K�,�i���1M2�{.9��V���hN���)x���I�2���]����=cqd�i�O,h�
�d�n+�%�LZ�w8�
*#����7��[O��&��C�
������[���3�U�}���d�\��_(4!�+�N`Y'�NUn�F���t�t��gG��}]��)�Re�*����T���Yn
��)���gs���9���`��m.�'~-a�(p��,@���8�f��KQ�����-�e��<��c��������Sl<�z
��	�l��Kz����E�o$`+��I��s��S��I��m�2��_L�����`3B�L�(M��� ��M7=���Z��a���u�>p���k��0B|���p�?bYY_�+zc�Gv��r\\=*�d��!V_��E�'���F	�tB�!��bQ:�o(�c6J������p\)~7������E�+pr�c�����;��F����oJ��'�;�o~g��*���w��{_�8��	]f;f������C������Vz�������B���	>S�G�b�%8���8�D�0��i�P���;@Ld7�NCu�xf��x��)��SH!��vQD���1�������Ps�!(������i����r|��,�fE_�}U��;{��si�w�(��p�3ai���,3�
��T���{~�wf�z=|�bxP���07qRe/���r{X��nh&�wC]��r~�OX@����WOMcm-��~dpN�"��� �z�G�|��8�q�����G$>�d{/�&�U�$Y�x#������Z�/�A�M��H������_~gJ��jD0\a��9?\��S��B�l8�"�3J'a��I�F�.��N���HL6��+�j�yh�LQ:�b�
�@>�{��a��T�1��V�����t���&���<i�+9R���%���[qEG1.��E����;���N���#�d��Ty
���������X�8O�9��K�QE�I�n����O��c��oeY���~1����#8����F:p���<�����k��(r����_�O�<�2.��o������FD���'���y4��W�� 'T���I��;�uA��Rh���@�3�B������'[�w����Kj���8�����,fBT<��3������F��4J/���Q81���k�&��������G��fQ����P�
���d���@�I\�uf��_'B������������k��/tI��'��u��n�LA�c��M���6cQ����8?|��0	�5m8���#!�z���sk���W[�{�QC�	�x����#oZ��J���_�����B������cU�R��o���YT�(5���|)���(b����-���Z��eR�9��D��%���)���v���������	K�#�a�i����=��g�g���n8��-\Y}>����=��'c���~)���<\�f��
���B�E�.�M����q�;�I����f��y���hJX��������d�t8�s����7�X�-0g��}�2)O���0����V���������N��v���{����#����\|��=���0��n�����7�x���N�X�[��h�x�A��������c�����q�.,��}CXc�f�b5��Z�~h�`�0}��j��4�rv�����J�Q��{d��/��Y��*}���e�t���=?���pl���jkG��.\j������������������u���m��Jp�q\^�N3V�?DBRV�2)���\���������.4���@Y��fH<�?'g��o<�d�a5�$
]O�@v�e�A"���8�����0�r���,w�8��Q���r�M������S����
G�X�!s�WE����gd���y`��#,�s��_�F m��4�u.
4r��2����W(��~�G�+����S����0c��hq�#w���g���S�Bvn
�9�w1���������tbZ�wv�B@�e�;g�*��WCx��FT��P$��.q�#s#����\����k���D|����a�w�WJ;OO�wZ ���?��w�y�%bz
���K�'�%�u}����AL!�9�d>�|�#���`X�HW>��M����S�uW�k��1pl�1����7���&u�C�:Zy7��W��i/>|h�������o�?E4�P*qn���6�Uy���(64
T�=�����e���_�����rm%�m@���n�������Y�5/2�N7��J�Y���s�������o���i��2���<f?�7��J���[����`�cX�/|�1+CH�=��P���z��� 
#�X�"��v��R|�;�%������;��>����XO
��|+� ��Hh�����DM�IPD������o]%/�7�Sk6�������SK���o�>�r��Y.����sGT�U������������N�)��������|����x��!��O�u��Ch��@��x';���<	�����N=��im�D���BV�X-���)�7	�$�n�d<�����(-9�y_����i���
���w�"�������G��
��6�=8��������h�����a?���$��{�������.1���x���D�%{�LI�T+l~�� ���%���?�=��f���7L�w\��	�h��j�}^�DE�G���z�-�hbC9d���,HX������O(RxN�=�a��S���*������i<6��/V
�����+B@��J��w�E���e&��ZX�e���"vc��mN�,L�q����X��VQ��-��I��W��8`Y:����Y{��%�=�rR����LvJL
�X�������!�
��8�8���g���)�f�4oJH����_�P��u=�v�N;\9��6�04���m�R7~�]o���s$~/����z��f�C�����������;��jt���X�P�Y�A�_��M�f��o��=/�K��k���_0����.�l{�
%��������fx]/�b��-^�=+�@�����Y���K�R�%�������nv{v&�\z�]�
xn^�j��7��?SW�t�zkRZoH�Az
�~?��1<�6�����U\�����`A�K���l}��8m�������-��������Q����GgS:�����7�rGE!-�����L�	���W|��&�{eN!�R����`�ik���h����y�~�e�F��Y{5I��=��-b(�8k�K~ &^-1z���9%���h~���?J����U�Fs�7xQ(V�/�.E�k��5Z�s-��@K�;I���Bn���B�]�81D}���B�$	�+�.�V��5w\�y��w��3x�I��|��C�x�j���}�� �7�H�k�_�e,s�H#��q�����s`�n���7����
�#���~AhJ�-���\}�����V��;������dU<���F��T����w�o���D�.��QD7%���'����$�X�������0dm��e��O�8�E�?��G�o�`�|+J�Bt���;�x�Y{
���!��OR���&���^�������
O3����?�}5��K��~B�TR�sI�����j�1��r�bD��sxh��_�[�[�s�b��A7!������H�%8~�{(��4P��h�H$��_P+%x���Y}�����.�]k������������W��*������8���-��8J<�p�a-s��/M�i�;�E�4#um4�1�2����]�~��=�s<�������(I{����-���J>�y�g����/�/S��G�-56�&�������#�3�m9�pom���{C��N��I�i��s�yr_M�>n�y$�9��c��l���b�tjs�%
��Na��.�w��.��9�l�h�Pv�@���#ZZ��O	������������SI�=�mi
2�M[��z�(|�XI�:��\�If}>K�
,��5�
M���W����		����~�{,�U�&o���q�ddk�O�g��JO �0��3�MC�G>��/��K�����c6��N�u����5���(�����������=xPbs�fu��������:��g�/����*�U��"\�.������Y�G�j��	B[qc���jS�P�d��?�S���m��wS�v�����%��H��>{-M3q�h�}��}�$i�@�Qee��%M2d�Bx�}�=b���z.9��'��]�������W���9%|���`��{�������BS��p��rJ
�����h�x���{zT��t�5�h��n�?A�������qpDf���R	+���S����C]�U�����h�P>��S��TiV:�7iq!tn�J�����w���R�#U����?�
G�Aq�.h�s�������~����aJ�s��N��^$�b}��z�t��W��>7�����������a}�$\�#�����Lb�$Cb%���O�>��h�'���
)u�#hN��~�
w�����'��8Rb��%������l�� ��Sp�[;�����?��OdY$���p�}La@����|��+������6.Nxa0?z����3���J'*�9�	�@X�T�B�}rum�!O�7R����dg��0�&�b5ux��Cv�B�

Q4���������b���,GP����.�'��W�Q��7
�����g��,��U%�OkE���!�F�B�t���`�w����#D����������>���vKa�����%��=�	��#b���P����j�y�q�ukz�P�}�{v3��_�P�.K(��}�
'�c[J$��.>��qx��4mW��;���Q�v��<������f���x'r1J0Z����l�i�Od#�6&����oI��$�P��*���o�Yp-�f=#^���;���
M��k&�/�kp�;%~����9x��^d�k�[�M�c8���x������1����O��i��Ws�A��s-O���N��]S���%��_1�k+��u)���l���gk��\��k�#t�H�c�w#�����X�����_�I��ti������>0w\�z_h�~�����&O�&��^��V_��u$�O�}O��H�=��DL��������{0s�uo8���B)'�}���.a�1���.Q\�v��+����^1��v�����J�q�1E��	�SD��mZ��������1�����W�	#���I&��O�|
�?����F360��8��^f�-��f��j���J��{��#���� �<O>A��3I?i���'�8L�q���w����{zVk���������IX�i�I!�)!1�,�38k.B��+q�A���M�b{kM����������p/��E{����&�'Z`<[`�W:e�8��^O���t
�c��������s
������$���{���|���b�Z'��(k�0I\��6��O��oH�j��cW������n��f���N��3��x)��Ll�T�C����K�szd,1��?Z���`�E\�R��>d?.�
��pH���> �z���(>D���&^�%������!��x�����5]7����`��w#�pn��1�ec�!���{���%|�����.�>��>��~�3&L:��e_����:]��\�b����aY�Ijn�.E��y`��S�������DY�?����6���i��4C�=�-���E��Y�:����k����Q*��!�l�8/�X�
&O}���'��������s��x��^���FIa�`�0-�]zg�Ff�Z���\P������lu�k�'#�O����[���#f�CtGNQ>uy�p�(��2�V�K�%P-91���q���G�E�4��[��v�s	���|�u�S,������v����m��N0�����H�{�Y�}o����0�uw"��[�v���ig�d��p��"Q�X����6o]��xo�NX�T9��)�!@5��1�	��B��%!����J,�G�[�m�(���+� �p�/�����z��~������S��#{�@������y��e���.��f��]�nn���U]��5���w���w�Ov��������IX��'������:�{��pb�~N^"}��h(�i���1�@��~�+[��(��Y��"����;��y��FqE����������)���~�o�Ub
��gMS����J>�g6B��"�<�/�����'�R�X��SxR�`Z��K���D�Vw	Vy���Z�:�w�c:��G���<��T��rq��8+���&���#T������t�c&�'���h��:����<�}��Bv�'���A{��Sk���"���h�}�tm�����fRj�
9���5T���`�=�w�K��e��x;��g�=�1�v���.�%��(��b��*���Wog�VW�)!k�j��}��~�}�����2���X����B�e��H�Q9��	��}�����X�h�f_'�1c�(!Cj��q0�q���U�6�<��V����x����dS����N�@������R1����kp�9���!e����LJsH��enA��7p����>b=B�ypO}� �����"�AA1��9�&:&����'P��PD
��'����v���Y�Q��������dr�����?��x�i�V)�sz�����+���$-�*�V����&�.�#��t����u]������h4�2����5��
��/p�6t[��]����duvbj:�����Yg-O����[���SX3C@��
����e�.z�;��&�=�&	�r���7��]Ou+o�[���_�O���;���0�v�,�pO��(n]���[Q4�^l�M�k�.����0?�I�:�������^���9r0f���7�z��8�@�L=�k���Z�49L����	H�z&z&�p&^��)._|�������B��{����������<&e�m<���A���&�%�����u�*(2�����
.�;�'H������.O(�O����7��W�����]k2}G�T�J��51������S�h��(qn��O�/*3��%1[QZD���s�Q��B��@A.��o�?�x+b�Be�LT{�E����.�������\��P�)�U�!�����:5��p���SD�E�2%Z�Q�����z��#��@���f~Y������L=�D�7�q8%p2�2�>�B
U>�l��x�����>�a}�P�{�7���6��Z%��2�YI�L�m^tm����7�z�������'0(�����#�������M}��t�w����0�V�F<��8����h�Z<$��h���A,s�
�@IDATl�T�e�{O�Wk���Fd���SN�
o����=����'��
Oa��_vx�h� ���i{���m�����M�No}�o�j/�O[T��ul�����/xO�n��{�W��n���w����|�����#~��xy���o�7qW�-������m��j��B��������,��^N�>��;���:2oz8r�oE���T��=��L7A��o$��oj%�I]3�R��Ok����	9���:�P�j��k-��i���)<�1Y�;PKp?>\�
�tO:�;?(����������$��'O�0��$��XD�EW\��i%!�����[o�

���l�!�v��2�}������GeU\���q���a�� m}v�d�2
t�Ey�KF|�9�K�S/i������D��L}�W�3:qE@baI��x:���I�V���~����4�;��[�����*�����
��
�XE��';�|Y�<{���L�y��AE�gRab��O>���idU*�J&��h��h�����x�0� �����p�!�"K<"j�kPWWgr����SOEX�6�����sZ�d)��i�=7��|`U��`K7��=�4�H���
ur���u���)�>3�'������C�0�.���/�Arc����7���K�P���T�5��O�X�)�e��Scx0�3�<�\�����|���$�/��~}�	��pC��'9^���7�/����wJ����=�213^��M���[+����_��r.~]��.@���dsp������7	����q�	`�C���%�G�x?��w�O�BO�-]U/�k�_�pw�q�(�"���e���F�����||�De�T�y"����y*3}lw����>#H��������k�
�e��?�g�����������&?��� ��L>��8��f�)�8��)�$�KP���	�5��`Re
��i�s�0���q�\��(HSy�Qyp��>c���@}���,��O�����R�g7N�\"^5Spu����\��;X�'�EaW3%Z����!SI��g�Gp�&'�Di�,����;�����:r���q��1K:�Y�?*���QZ����0&\��u&��Y��R����qV7��lmw!;�NQ:�o�j�W���&���B|_:�Y>������.�b�[~\�i��6%�F���Q�xr���Yt0�}�k�X���q�6���n��[r~@��X.��h����-�����	��-�k��S�d2�>	D{fWv�l8C���hz�����M���u'�Bhr����	��^��68p����1S���a\=�R�E�d�[�)��#�����+��)���(^u&6yu{|�u�������q
�-��W�pok�Dt��A�i(�����Q;$ �?$�Rm��{�rD$>L{�o��As�76>������e�������Ze�(X"T�;r����x�w0*D��m�7M���o{�O��,�cW���[��g;�������T���p��p�uTz(���2�O�����q-�&|���(9�^����A��k��oPh����bZ]��$������?G��I�7q�h��������
EYA�1�K���+4�|��gm�����&b@$���M��K��
���gK<����69�H�s��A�FQ:%���j$F���z�h����L��g�����X�������LG��d9��o��������w"-w��.\PQ����b�#3��IMT*1T��X�f.�	X���^P#a$�7S�a�K��������8���V\�
��`�Y��q�bl_�s�x�|�����:�c����Skk+V�z�(��.�����^xk���i*���1
��T)����&NzZ@�sTQ�scNh�Ka�
b���t�85�+���P m���ZxP	�l�C�:��G�{���%������[�����"��
OLG���!�u*�NA��Bh�r���p�qh$��x\���#�bA����'��8#�����G����[vv��1qW�7%`��a\�_�\��7\��7^��o��V��cV}�h;
?��Nkz��SM9����?�I���-�T���@�a�7AZ����O��xu/H�Uo�3"!�W?�bcUq����
|W ��Jt���3����j,�~�%6
-m8v��(��p�WE���Z�:|g�WD�p�����O�r�x�iA�u��w����gWu��Gs�`nM�*h=DK��q��,��5�<�Zl�5z��+�1:���G�;��9�y���T��
4�����U*�g�Q��#
������rA���D�G�>Y�`zO�����}��bx �to��i_����M�-Y���m.��6d	��|�p��S�g����i���7������~�x��,���={�D8������r��A��r��_n����V��>��'�z}<����x0�����Pm���D��z�/��x���N�	��Ao���~e������Q�rLo;~�x�|Y�d�%�d����	�+S}+���U	[�����L �>O@-j}���y%�xx�B6|Yt�J�o�3/��g}��#�/q��K����Y���-�Ga[�R�;|�����c�P�TL����:���i���g�����K~qC�O����`���os�4_��m�Q�yq��8uOF����\4T�05��� ��N\���k5�$_BK��
Q��n�x�rN���[mz����|�Y���(����	�����X��0p�D��s���fI�t���@C�#n�GbJ�?����k�x��)�M�J!�y��.�������
������`��$��������&Z`�&Z }���P���#1?�h�CG"���
��h�������)��8:�P-�!����u���k~'Jg��{����'�e��{��T^�C��#Xa���*�R���b���c�s��7��[= u���\��q/���9�R<zR��F�Z�i�%�n��o{p�*�1�� q��|������Q������<V(F��8��)�)*�J�����U�aR�7O��������D�E�7J��h��w��h�i<-X*.��� �*����������L?M���E9UR]J�)�$����������xXx��Ph��]��^�x��X��Z�(g:�	�qg^yM7���N�:J�)z���t�s8s�����k��Y?��ze$�3;S���
�����G�w���3��'.����E������[��?��r��y1n5^A�Ch ��"�'��s�1	h�nx���s�7����:r3�q������������d=�:�_��D��-�m��t��������<��.�Q-/��\�o0��]�,7G������(iZ��m�����[r,--W����+����q�i�`���_���:�M���8�,���*�<�?��d�'1hD�H�����C)V��������^�P��8>��LJ�����/8B�[���~-?`�Bjz5����X��e�SR,�����M�>���I��E	ZJ����q���p��_����a|�&q�$�������S��NQB�
�]�Xi���#�������9�t�6�%K1g1���h�J���L(���<���9����~^�_l�S���+=��0T*,}���qK���'��b0�3g�����qB����|
O��n������}�u����/�������~}�	�I���>���L���W�\[�?��#�|u_%�#��f��K���Cp�&��L�
C�.S9�p���EYi����?g^n^��u���qs�5�*�]����
���#Z�=>�n�T�B��y�-��L��xfN\<�r��W����"h�!N��{��f���$td�3��S���NJ�����"�����$m�20�3��]���Y[��y�_���{FQf}>�0�*Tg:�W������$f��k��o]�u��?���}���j�*�"_��(�'�������(�DL������FR���Y����4s��S<�����#�fr�Y��C{nHx;��H�V1�lO������Q�����_2���
���O�����r}�
f��/%��_q��}2y`�����g�G���m�K��ok%�K����ba���	_�������T���9�}����YG��R�j����w&�u���Z�eK�dY�-��/I�=��!,�����AM)��4@�@)	|%IKiM ��B���Y �f�'����"[����7��i���]��V��y�{��3s���rf��y'�r��&��C?����2(
w�9��$0b�M�T|��!�	-�n������"���t���81�*b�;3����9{+C�z�Cm�Bn��vu�<�f@`;w<L���!`3�7���c���%�S�M��/������[
���X4X%Emi��3$:7X���d��wH��{�[��Jf��C@3��U����������C9����L��\�/������,���Q��LS=���;O��i�|�����C!���L��,�����e��(����r�<p�������<yh���sB�(��7n����]+G*��M��������~�P�Zq��v}
�~K������c��`�\���^��������!�W�H�?�m��k{�P ��'����0o����d���������< \��4.���w(E��A�H���88W>����n�T}@��qEZ����W>-���_�z�5����Q&���M���5Y�K�p���1�m�\�[ew��$w�mN��;w��O��]0�r:�L�D����|��G���Z��P��9T)_/���7n��������HnO�lQ�
�/�7��,K�U�A�����s��)����(�M��%�L:"�Aq��W*����O��P,���I���������(s��YZ��6���*��I����M�B���h��<�{�0M��[%���wI��^��H�U��;����tP���O�w(w��������w,Wg#e_����7KTUy-�-������������������LR�/������U��2i�()5_�K~U���f)Y��j��7������:���~��iE��A���������P�y�>���
]r��}����o��E���{����Ll���A��B������+��;�l��N��q^�-�.)!������2�����]R����n�&��1��3�6)S�t��
��$��X�D��][������6<V|��H����,����������_f\���Fe�s88�����_���&��fQ�����	�>+�N�:�XfN�
AL�%��)�P�@cK�7�%�<�0�z�P�p�,�����%^?U�c��c�a�S��X	������!�b�k�d�[�1�������,b�0t$0��t�L�������3�+���b�A�U����T�i&�*���4��v��n��4/C����3�����
e���d�I����&���/,:�pf�mbo�@���l������)V�}��V��5��sqn���+]��Y���ofi�vm�������W�c �~���.���������K �����
rv����-K�geo�5���7��M�����/��:��l���Sn�&�u��9W�&�V_*9�k�#��,6��=+��%���{���[��%�F��%]�~x���?����)�7&���~Y�\��S������_�\��B�����fkO����zb��}������
g>�n�O+���2�W�[d�����*������v'm�E+?)���[~���\�1��io�C����tlSo�~V�K��^+����������M+�PTt��8�P���u{��>y�:���U_����K���T���G�)+�?�w|��^���\���L�]��#�^�]1�2t�O�h�F���;���?��%7Hw�zy5U)������j�:j���'R��U���{�b�M�3�����&�$ya�#2�������0���o���.@yE"-'
F1�da~�J�����2����W/0��Ie����:��2��;yl{�0���1 ��"�$��'(�oK����O�v�m��:#��P;��82JY(0Q7�l~R����t����5>�@�~��a��Y*�UKof�|~��2x���������M-J�&Im����}Z�*�#��}�������E�I�Z����Ai=����|J�x�n)WyT��Q���oK�k�TF�oVV���J$p���r��VxA�s0�pp��E���P�c�s��O�.�����*�&�m��5���X�!�������������D�#�Zg�Q��f]�9b�o�v�*����n"L;g��&��_�;�x",&~�	�@"L{�H�M�u11��#������5Q'�q.��g$O��8&�^���,4>�qLz�1��P��������c�+�d�c������)�;��0�a��P�����E�
��]Z�s��+T:��R�s��:_[	���p�.�/?I`��^;QO�s���
/O������iZ��4�s39h&-/�����j��x���tyS���]�&��7���#�9G��L���'_nV�-`b�����C��w)�Rm]�r�g���-�[����X����98�r�����������iP&�����R�$����T)���/�S��B*0����lY�vS��P�ZT����������9��>$����������3��w�g3��_�}�d�\���]�&�U�H�1��N���/h;�Y�{d�o���W����b��wnq�d�n���>%�/Z����Wg=8��u��5+3dw�q(����T��^�r�bG���h�\��pXa�C���j�����rWV��5X-���U�'��4�S%�p�V�d�\��������&)ijb_���m���'�����C���������s��������%r�a���t8	���K�i-g�}�&�M�5��L��5g�3�C�G�_�m��\6\+o]W#�����29y"C������m�������~K�&4�o> }g^�&�pO+|�����J�����.n��\��Gew��U�?(U[>(y9Rr�!i�i���62��S�tP~�z�����r���W*>&UK�/C��-��K����(��#����+B�u�������@����j�0������*����'La����o]4$��K�r�]zux��ly�xH1l�-:�����o�Z<���m�'�r��9���=��G%}����v�
����;d]��x�{${����v��"���y��f)o�(U�����KE��Hu���2�Kn����5�����H���}���g����"i��+�oZ �����(U������LT�6�s���:7,^g����rX����)��e��J+��o�G��������y��K��,-��ZI)�L;����}���-���3���Y��K_<�O��������[c"���)]��H�H ~�GC}5�G��$2t��~��'2N~wG�K����M�](a�D^�O�r�/Mp�Ka���s��!^{��q�x��b��}�4L�cQ2�L}j��_:��s��o�y����b������="�k���&��N��}�<�������l�52M����`�W��/x{E������H�_���3�*���]Jj����(����6�b����;e�2?���F�l��ejR?4��S�:����������{RZ�]9*���@��s������L��^�!�|w��j�d�����Y��)}�L������]���"My�ew^�4�,����B
��;AZ�*�G��I~F�t}L���v�������g��������_d���#�q��k�������fu6���QB���@`��_����
+�~X���	V����'z����}�
v�d���>��u�]r�R��|I��2��Ikl�$���L?��|��D������O*v�����r ������������0����_3Y�G���~Y�?_��8)���m���2e�Z�T+���$��y���?�]Zt�4+��`���^t�Rr|R���&����e�~�6�^�M�q�������
�~,��(7����ye���K��83����WU��Q=cUZ�,UJ�����{�~N�����������[
�T��]�P�BI����(��m^{-����!��u��������rSe���zJ)<F��Z�s�|uG��Q����������
�������xn�<��g��m���.�{�m����w��������Yq��F�(�`z��r��
*�i=��!7�@���K���9O�{k�7G�G�������h��R�������!�����X�+7o���?�'U�W8�8P&t��1t'rBw������U�z��2`�d�]_;k��yn��fbd��A��9�t�R�=V2*��8�C�jA()�R��ho��&�v�[����is�PfY�w��I�H�f�����X���u�������7�.��/5�[b�e`Y;�u��_X��1^1�7�<���}�L9�N��y�
��;g��V��m���z���y����R��zz�?��~z~����U������i��O�'C�oV O����d����b"��8��s����UCF��IMt8>�5O��n����SJ��a�����&��N+���Q��������e����Y��&t�)�|�v�^�\�Ve���c�2�{n�R6`���N�4=V$���&y��4��8����~$���X���c2K�|����&�0i~���Y����_�O��[���'/�R��*T�p%���t����$�r���r�K-��t�_��x�9/�x���J���P|-�I6������+���*yu�=�^z�\�2]���������ef}c��|a�\Y��Y���*�Y�G��[
��]MjE�yS�6�<G�kD'����x��5����@m��T�y"��2�wVr����}#&�`'����d��J���
���'D���[����������<����Y��v�]w�Qy����v�AA��%�;���j�{�����4e����x�/o�_�����Z��/���w<+�R�dO�b��'����sf������
3��J�A���N8����_*�,�{�qa�0��s��H��++��|u�I��,������"�x^�<��]���/�Q;�p&RuS��XvL��q��+��rr��)��gd����6��<�:����������_���?���Q;�F�1�%����
����Re<�{�\��2�B�*S���<O����;�|��j;��t���<���U�w9L��&�\~x�f2_?uu���Kgr��6  �s��C����?��\3c���{'W����P�`'�k�c2�`��q?��2�������,���(���������MK�����`[��C�)_��{�m��/}��[��0�O�O�J��g<��`������>q�LRbR.��,��=������0	i����'��D��G��c��3Cs������kDi�x0�xtU�|��b���:yr(7LL���Squ�C2�_P���@�G�)�y�������+���W�q�\��'��,��#w�-���B�rh�<[��T+E�?,N:U�<tU�<rj���Uu��qO�.�J1����>�LZd��_"?`
��U�$U�SO��vJv��R��{;���\��.<$�J��b���.t��1���;.����H��n�1��CLf����>8Z9`��q��ljpa�-l����?�H�|�q9��%/�:R.0Y�s���~F��7G���@
*:�'�W����i���Y�k���z��y[�;O���H����6�������F�yJ)8�,�nB9�
)(���1U���n�7ynu�=�0ugv���������M�F�e���.U0�N�a��:
]�*�P�u�|X>�*�o�i�O�������&�]������UO�3���;(��>%�����X>t|�d���D	)?��e������>yu���	2c��l��D:�'��3q�/q����Ek��3���������7l�����`���"��r�2�rv���r��{$0���9z�Qw�w3���1
$@$@�0������o���oc%��+��t�O�Xx/��g���l���m���C�9��1b������7�cg����1�M�j�	L&��������&����13dO��'I�;�������x&!��8N�f3�Y�d�-�����"��F5a�=dN�<
�=����b~O�'�[P
���A����Eo�	)I��PL�*iR{Bm�~g�������.�RvJ�:3�K�###�
�
*l_��`X�WJ�{�^Jd����JY��&F���\y���(�N�[�}��G�
jJ��N����jr?dY�$AOv�� ��dv�����:l7^�N���@G8S�!c��>ya�x,�,p������I��i��>�W�V4J���=iU���S���6y��@�cQ�!2#��1i����/HP:^�����T� d������������W"C�|�M���p_a���@�4Y����
�\/(B4.(�����A��{�3_�������F�����:���P�������������j9x��\v"]���D��3�T�;6(��p.�F�]�pv;�o�����3q$jv��Y}J�8�������&�j\�������H
/��*2>~'��B��W���3��A$@�c
�
�t>1�ji���n�0c'���f<�%���!0��N+,��U�����ps�lf~Y�)Y&>���$0�	`R@�q�&���"W�E��Xu�J�](�����=`:�IXi�	q(2�
{������D��������$%E��#���o�{��/�e�����!�j,0^�?k����5�*(�6)��Gfbl8�8/�T��v=���.(U����'o���ff����8{j(T��A�����3�5*��v���]&�.�Cy�;�������G����������n��e��������r���-��������>Mg���zm��)��x8<{,�.�.�]0E�%���ZDX�^��3���;;�2�����@�w��_n�[ 32�T��;�9b#a����2���1�Y�P��Sn�h�.���4����)l��
�{�Bt��Q�!�(�9�s���o�{��5��$@$@$@$0`k
�7���LH�@���m�`���s&Rn��Q�a��xU��G�=�]����|���G��I`���^tn������]�S�R!���;��w�|��D2P������d2:XY���i��rB�gOz�S�]G�M���f�EM��-�p*JLZ11n��ID��NP"a}~��w����'k��/�e��W6>�F�������?�����_�.�	�pbG�E"
ta	�}�`����*���_Z�u�A�������������SP��e��3��0��2����6��`��o@�(X������W��/e�t�K���
�00��3K�(���
~��%�B��iCxV��6�F�h���a5��92�����i��e��f�k   ����o0eNG$0�� �����Z}������Yal�����	L&������'S�d?{��kd��ur�����Izzz�QPP W_}�,_�\rsr���.���t��7�/��Xe
��Bmt=��n�m���wfB~���t�@�S%3�_z��m�3eH}�(�Z�+�.n�"�^Y�)��z�c�H�����-g^��2Q2&��
p������*��;������}�w:�Y�����w��KD�d�E�l	���}C�l=<W)}���v�������c/��IWy�������{���;�-����p@N6�FM��em������d-��(G^(0O�����L���4^���q�93}���Wm�rG�������v��+��~���e��Rm���J�2lUq�������!�0:��T_��
vg���#(K>7Yyy���f�9	�>��d�����`���2����d�G2�0��9���c������d[|����Kfh�E�h��x����H����g~�/�Db�����`~d��O����9����"�h�	5DG�E e�E�g��b%%%RZR*�v�(��.]";w�Rs�!%RZZ��]�F>"���Um]m��)e��	���>�H`��){Z��sP�f������pP)2<~�[fy~������U��j���ev.g�)���E�RJ��y����~d�4��<�i��/��(G���nI�5���Jg<����6�4�l�x�i��#�YO�a?�kd����:����������7W
@���L�E+��c{H��+��!�~{���K��W��M����H�H�H`��=�7�  �r�z�-�L9)��&0��N��K��C�Q�v/A��z�j9p�����d�J��r�J��o�VDAI���'G���u.���O�H�H0iM�DJS���R:�L�N��L1��6�$� O����g/jS;�F�v>3K���,���H�H�H`�t<% ��'@���3�G�h���i�5+kX�4������p/C�����	�@�n�lX&�@��t���enbp�|Jsv0�����>m�8�&��|4��	�	�	�	�	�	�	L���4���o@�{�=��n�wtD��?�	�	�	�	�	�	�	�	�	�	�	�	�&0��N0��3��r�&�t�YQ�k��op��0t$@$@$@$@$@$@$@$@$@$@$@�C`~y�T,������y�bMQ�6�R������RU��7�.������~�D���v-A��n�:)--��{�Jww���x����]:;;��K/�����=zt���sH�H�H�H�H�H�H�H�H�H�H`Z���T��Y���&�������HR�R%//O����GqNw.;;G)�Rdppd�	����u~A�������<PqC���RS�$/?_2U���������%1e�E��/�q��	�	�	�	�	�	�	�	�	�	�	L(v���%M)��;6�H��a�./^vk``PZ�����5�~�/������f��w���s��B�3�P{;{�YZZ�c�V�C����-��)Z���!���R���9�z��RM+��H�H�H�H�H�H�H�H�H�H�H��/(P��J����������w
�����2~�����y�����:ya?���y:�@����3�p(�p���K�HgR�%%%�d����t�����:������_���0����.5gjd��`�l~����u�im�_�kd�'�Z�t����Ki�C�#�f�w=���d����]������k���#��_z��RX�B���C���������������L�ku��{��Kd:2ge��_���>y�b~���v�-��[��5�"H:|���#��D>�r��ZY�D�-[���V��zT_��t���m�a����G&>�����v�������l����#�<6����6����"�x<����_�<�%w�� �p���#�yA��qD^���yG���g��A���6R�h��wDd��#;_:b��Kg�p��]��t��|:�U6�f�"�:8���#��g���*�&>]�|yk��u4���\��t��CV��n���%���'#����%����5��G>~���g?�.�.y]�|��u��/\,y|���%�}���������M�����s��	�����8\��xm��*W>~���
g?�~������o"mn<���O8����+^s��q12~�t����a>��3�}�A�����_8W�����4���|�k:L��'f��{������[�|
g��rG��#�f�w�������a�p&|�O�o�W���v<����i��~;|�k����t��)�T�����o~�L�����*wW���4��t�.R����I�H���/��Yjnt��r���U�Q��4�7o^�>���!���a��(���F�9S���|���`��Xv<��0�����M�gzz�V.������}h��D��x���3��Mt��0�X�z�>�	�4�+W����n�#J��h�����s6���Zu�>Kj��}���g�)�A���M�����������������-���������O��9��G��f���mjj�i�9Yv�p��qA����>���+����\�0_��R���-[����SZ�����/��=7�p����)����&�������kj���]��+]
�T{������2��b_�v���i��IH��a����f��5Z�2�����+*����:?�U��oWy��
���>#��r�r
���C��H�����N�O�XmN�p�����{��
R�:���������#����Ao���A���:�*3v:����SxG�M�������*V:\�L������#P�p�c�w���9�������t�KF[�z�j9q��n���@Ff������A����X����kW:zz����Ry������d����g��*���:���	���t�A�����|A\����g��o��<�yv�3V?���~�x��s�
�h�|����^4i��K��l�\������j�s�e�����d�U.y�������'O���J����_�h�<_�0����i��W������MV[���W�N)S�c,�ru����q��NM��
m�Nx/.X�@�O4���Xm��.&����[S[3���Y����SW���V�#���O��*Z����JG�~��.����<�;r��+�f<��g��*�.���J[�g������x���l�5�G�W������M�Ov�>���;<_��\�#V���l����T����t�fe9�ca��������f�E���m>/���(��['S��mg�wv��]����|�|��,��
$���������0�����g8��x����+�����WP*�{�0�����h^��sxi�tw����K��L�bW2���UkS�0CC���&�}��%Xq�m~A�!,���`q��8������y�����6�����Zi�z.s�-h�D���s�d��mJ�=���.3��l@M�twu�h��w4`F��&��D�!��8_:�	h��k�p����,SFf��9�6�0A(��a)Wv8W~��@?�.&�_=�R/�f����t�F�A�	�6�5�j��_���j��t��� 6�<�<B�4\"��������p�+(�����O����\_:L�����aIj?��"��V����3���8W[/�J��4���%�d�;\��T���.�U��Y
.mV��wD�R�@8W�J�O�Xu�Wg)S�t�����m�����KWY���
���^{mxw�����������t�
Y��D��/?}��g"�*_:|����V��A�g��Z�:>�m������o���+��V���[�E�N~�U���m�/�3(o���z�?��p�����������X�*�;����W�������mp�3m���)G�H�%�������y����!�OW��wu���!�`��-���Tk�\mNQQq�t��a��m���x���q��|������v��)�pF�x>]�lW��Q7)���n�q��]}_��2u��_.9c�U���`���A��EL�����3�������\�}u<V�g�M�O��q9�}������JJ�Q%����ypp@-B���?�vT:y�bb������D����S�rA��g���,$�0��
i������WW�0x�,�t�tH[�p�q�����QX���fm��C���{�p�t�8E���~���C,�K:[�]w��JZ}�T`���2X�S]}:L���dO(�����h��_�8�t�<��cw����Q��y�����ml9c]���0�b����D�1mN�p�d��JUW�?�+t�F���V�]m�IG�p����f��~p�\u��09��fr:�<��*��H1��(/1���m/&F}mg�:>m����P;�"�L�:4���E��������\*�O��WY���h�|�J�I+V��)dITS���32$��wLs�P��rv����]�<��D��IG����q�g;W~�x��3Qm��\#��b�6'h�H��n��	c�� u|��*#�)?���
EGCC��� �������P�/Z�Z+�0�n\�6'h8�� �H&t�}]�ax�$Z�MM4�]&��ars��N�?��}\���$"�(�<��V~�vj�Y�6'Z���|cy#C�O����*m��\�[+�<�?�Xn2�*�E�d����j�>IB
�IDAT�����������m�:e��2��{��]�lW���nD+�������/7~�><���N����t�3V[��:��s�F�!�U��T��*_:�����Q�tDgxN����:iS�#��~��D��*�z0����l�%������\��������f��ks~b9;.�3�xb='�����dE���d��}c���<���r�%�����=H8�n�*��vx���m?��6�'h8>�O���$4���c���C
+1������i�����M�B&�������Zj��4�yn�O�������1�/utT}.�<���s�;�Xu����F>`e�q(��������T_�IF: �H\<�p��<���
���&0��26T����X	�09��CLL��<��D_~������]8x@�?�3���N�����v��A����|G�{�s�����
��c5�j5��u���zm���/����3V8�L�t�:��a�s��+�&>����0�FAf�/0��w�Yx����6���?�/rb!�t \�~��l�u�x����3m�I�ms���%���U�|�}u�U��8|�������#��S��A(]|.�<�t�5���f��#W^y����o���.\��yky
�.,����=��	��dZ�U��j�u�p��T�S�EBh�}n*�Uv9@��z�	G�����	.�,F�Au���f,��9�m��������-�/�X�8�mV����uZ9�gb��X��e�����K�X�a�f_���%�]F�������8�u����������������UA��|2���=q��W��G�:4���T���+H�J�����'���@���A����^�q����	g>�����I=���F-��c��>����s�KMMN����G%{�w:�h;��S��MC��
������C;��	V���
���|������<s<>]��U��]i��4�G"�x�c�7&�\
'w��3��a���
����_c��0�g��4���x�M'��0���P�gv������C���.��M�e
��Q�M7�M<A�	�6�g&�	����E�m���8�<�<������s�|������HPy&��#��?:.����T_~�������&��gPf�����S�2��u�3���;�Wfl.~=j���
���
�8g�6�e���"����������J�YLVab�5A���U������L�h�xg��
2L���zE�����+�p������h�e�x����s���L�u�%�d�U.yP�]e�J�n�#����V���p��������p��N_��Q�[�k_�g������;v���o�6����F���Lx��/^��B�����X���s��X�*�Y�	a�I���r�; �<�t�5�x��H���+�Tk����9�k���o��Uxwc�d�]���H�]�H�+��VA���}���6���4�	��O����
W�S������q���%��FM���D����*�Xu��K$��_������������Gv��@g�Y�}���x�A<�v������sP��d���y*��~H+.)�;���Wt���j�
CC�C����R�{�t�ZS�W�-Q�
8H��4*oW+d�=8P:�|��D���x3�m����W������a�g��uZ~lg�|.:���
���?hfKKK����z��
u�2L�-^�X�UX*���:��DW~���j�]t��F�s�N�����7�������/2P�]�VO*�|�������*SH�}???_��3Q�-W�A��ZZZF��<��(/v=�
���}x�]�����f��a��q����Va���X�������{���a&A`��|����D���]����K�m�:��<�<f�*W[�x]m\2����!�.�P�UP����[�MjTy&���zG��9#m����t�:����,k������;v��U��T�Ix���W[[���|��'V�lSL�gT�����8�;�����!}��h�����:+�p�G���K���}�CC�M���
�I�3_�����>yb�k���/� ��x�U�t�����A��A���t����LgY���������j��NW��;���L�Fd��U#��v>��*h�4�-G�k_:�<2c�x�#�2O8�y��a��H�W��x���Ud�#O����yXrn�*��ms�:���K?4��t���s�������_��~������Tk��_���K/�D���N��msu�����U�}e;���f��|������vOt�&`�_����������C_Y42$�i��Q/\}���z=��w
�L����6����#Z��7�JD~������$��Uv�������Xm�����p�+_8#�t�D��������w?2����������P���D�o����+�������M&9���{gW�Z���LEG@!����,v�N�D��+!e_"iKYy�z5\�#           ����6����s��>�hv*�%��s&���Rfdg�KMUGX�E�pP�&�����J'��I�H�H�H�H�H�H�H�H�H�H�H`���g3��K��7	�	�	�	�	�	�	�	�	�	�	�	���oe�I]H�e���H�H�H�H�H�H�H�H�H�H�H�H���)4!           '@�S8~#           @�J���H�H�H�H�H�H�H�H�H�H�H�H ��N�<��H�H�H�H�H�H�H�H�H�H�H�H *�@c            �pT:���7            ��t
�AH�H�H�H�H�H�H�H�H�H�H�H��	P����H�H�H�H�H�H�H�H�H�H�H�H���)4!           '@�S8~#           @�J���H�H�H�H�H�H�H�H�H�H�H�H ��N�<��H�H�H�H�H�H�H�H�H�H�H�H *�@c            �pT:���7            ��t
�AH�H�H�H�H�H�H�H�H�H�H�H��	P����H�H�H�H�H�H�H�H�H�H�H�H���)4!           '@�S8~#           @�J���H�H�H�H�H�H�H�H�H�H�H�H ���)R���x�IEND�B`�
kqueue.patch.pngimage/png; name=kqueue.patch.png; x-unix-mode=0644Download
�PNG


IHDRk��!jw�iCCPICC ProfileX���P����lf�%��s�Ar�9#���A�"| Y@�*D%��$I� ����b@A����}�n�z]5;��=��3=�t��0D		�Qf���a����~ @�% #���h����U�>#�&��_���q�W���w2'��G�{ ���Q�����D=����_|��4aD��������_��//�cm�E�/`pB�7�_���r�&��q��
��
�J����>������_\Id��f���t;�I x����[0���!�S�����-����E�p>a���=����q�������=�7�D���a�p-�?�A�6����6���\��?lyd�3\���������G���k��c|���p������2�;F�Hiy��W���=��������k���������s��9�yd3$��h�g���><������������=`t�6�Z�O�#m�Q8��S����9�r*���'�C�8�<9���D8�$�$�5�
�g�������@���^�����6C�-u<���t^t���W����X@h#`�@�) ��:�{C`��p����8	N�$�
��\PJ@�j�
p��N��0���V��_�����!v��� H���!K�r��� (:
���A�P	T�A��]��&���2�}��`pFc����a
0
��v�
���R`��bX5�:���M��`�8������pQ�\nw�{�����x���������������E(#�6wD("��(A�"Z�'�e�6�'�dA
#��H{�7�$2Y��A�  ��+��(����G��P~�XT&����AM�^�v�h4#Z��6C��T�E�u�}�z��!��c�0�GL&S���tc�0��$$�$J$f$$�HrH��t�������Rb��*Xk�6	[�m�>��c?���r�*�Z���&���$"]&����	��p��H\6������������|6���_���Q����y�%�����M��''!�%� w!�!/"�M>N�IAB�G�EA���(��K1C�CIM)IiFH�IYO9L�F��������J��L�O��N�M�E�N}��
��
?���9�4c4��T�2�������]�Ktp:>:���[t����Y�5�=�������103�3x2d041L3�1r0�0�3�1�1.0!���,�N2�3=`�d�aVfvg�`��<�cb�d�e��2��������z���u���M�������m���]������>�;Z
��b��mNN}�H�*�1�\�\6\�\M\�Xnn/��>�mv��<
<s�$�
�>�xy������������3����7����B��
���'�`B�B>B�B��0a9a_�2�I���H�H���(NTC4J�AtY�N�X,Y�M��8���x����O	Y��+/$�$
%�%;$?I	I�K�J=��K�J'H�K����)�����5�M���=����k�[���w��$?�@�`���0��T�TLP�T��$��tK������r���1�c���{���BP�RYR�PuU�T]R�T#�U��R�V�P�Q_�������^SB3L�E����V�V�6\[O;C{L�J�F�DgQ�K�[�Aw[OV/V�G�o���?c�j�nPg�m(og8`�3�2*1ze,df�a3149o2o�kd�f����-�������@Y�[�Z����<m9hEmu�������u���H�>[r[g�:�ov�v�vK���q�#L���hG[��'�B�gY�T�g���Gvar	p�:A~�p��+�����u�`F�&���]r�v�r������Q�����������������}�{�G���g�W�������_��73�k��vM��@���ATA�A�l����!�!�!K�J����aFa5�P����b�3)y6r9J5�4j��������A����N��Z������u��;�y:��r�F\U<�����������X��M�Oz�,��������������g��6�������)�U�������t����?3<2��8Wtn?�=�Q�dVq�a�W�X�\Ny.*7(�Y�Z^m>e~L���&�[8
2
��(.�)����ya�����"�����%>%����M�X.�_�V�Q6U�^�X�Zq�b���r�J�������2�r���Wl�^U�ZW�Ts���Z���Z���:���z���XCd��u��7�o�7�6V5�5��	nF�|����������
������B���
��j�n�i[jwh��kx��C������k����]�]9�������1�wzBz6{�{_���{�o��t�b`��������5��u+
�}���mDn�uTv������1���q���	����c��SjS�O��<|j�td�tz��������Y�����?�E��x�8���X�X(ZdY�~)��iIn�kY{y������_o�	������h�}�nMj�s]w}����������[�[�����A������������2?3~��E�K��������?�e�2��~W�>�g�����>z��@�����������B�w)'n0//>]#�	PO�%��^������������08-�
���
D[`���bH�p<�MNIAK�F%B�JcJ�MC��P���t��!����d���\��<e�M|��L�
-
/�����}�,�C
!����e����STQU=&�"�������������M�C���=����e��p�h���������������U�u�M�m�]�}���x�h����.^'�]=	~n���=�<s����|�|��Z���>�
Y������"���.8��;wz;���(�$��~F/���E�M��?������d�d�d��x����g��)�.|V�U���T"Q�s��,��LEI�����WH����^��M����l���������R��-��w\Z�Z�������vD�������������{��Z�������������GtG������M�MM]xR�4w:�Y�L�l���9�.��&�:/�-�.��~���g��-�*��:�;�
�M�|����[��?v}*��Eo�u����oU�����x��L�����>:<$�_@���S���p�%�C��B�;B:���o%k'o��G9@5B����Wz##3��<�)�G"��:�V�>�a�1�q�I�Ib�{,2":(�/�+�#�#�+�+�+{_�S�C�U�Y�A����|�t��
MW-km]E]a=V}���������q�I�i�Y�y���������������=��#��i�y������a�B��C�a���S^������.���_
X|��.�sN�)ep�9:�T|Lvl��q����$�HZN^9���vv=�]�����2��[�|������:w=o�<���P�H��q��������K�e��}������Y�(^��	��U[W�_����y#_��M�f�[�����D���%���=��s�|gQWIw�������������i����m��$�<��<�brej����/�������A/����"�%z	�L���5������k����B7b7�n��/�P�}�c�����_2w�����K�n�g�Cu_���'�!�(�!01��a��@n���1A$fXRv��B6K>L��������������~�a���OvV�(�j�a�un8�0�
�����	!��(�X�$�4�L�|����2�d�������������z���M�j5�U%��Zi��:a��z���*��Fl�x�}�
�9��.�f�Z�
�6Y�g�N�9�9�:�;+qa?A��% ���0�'����A������X �t|�
#g��T��;iM8s*����������������g*SJ��f�����p�=�!�<[?G3W-O#_��E��B���	����\*�z�FYk�����gU������r��\��u��Oh��^u����i�����[s�������>m�j��������������}=��}�[�����U�8��>>9vf<{�h�d�����������f=O�;�"y>~!v1�e�R�r��s������y��:�����nw�E�������G�O���������m�������������/����&�%@
=6�����ub�����"��s���c��D�9I`�@�p��'��z�f�G�����}aT	�Ao�]���K�5����,�^�"�a�&�R�lC�D���P���*=�a��c���$�,b������9�.���/&���%;$�#?�H�DRfQ1P]����q��@�B�Hw����
C2#7�C�fZ�^�`V�)��������&\W;w��&o#_(��$0*X,�),!�'�/zN�F�S���}�<)/i:�O��r����C�<�������:��P���L�������;����k�6�1f71U236?ae�cUo=d�n���p�q�q*w�;�z��U�������������'���?>�*�2�k�uh{8{DF������c�b����������T���t���L������|����E-��gK����*c��.��:t����A�e����[�w�[#��w�v�v��?����0>�`�s��q�x�d�������9�2:���z���Z�����m�O�;��{�������S���0RA)hC`��� i�
�r�[�3h�3���]�M��"pgx6����F#n �#%���Ne�*Gm�U���7%L>f����K�
�>!=FZ���������o�\�������������SP��)[����t�t��>$
����L���Y�mV_6.��{NZ�)�ln#,�#�,>+~f��wS���ED�"s��b���b��y�V�|�PYK99y��G�%�)��c*��j���5�j~�������Y����1�6�1�21��p���*���Y�C�����t����	�8�
�2O
���M>�~|�^��[�r!��O�E"2#?�<=�{;N8�&�;������i����2���sts����?(4(�(v��ZY�./�����A\������^��1�T��s[���������m�����?��v0q�iD�1����������5�����-^Xjx����U�u���[��R�r�k�w������p��3���$g�u0�1���5	C��2����au�)�>�n
?o��#���|�8�i��G���P>��h�6CW�?at1���I�������������5�~���l�\���B�b���r�*�P���������+��2�0�32�2�1��$���n�]g����X�������������O�o�X�
z����7������+}Q��,A�@^Z�S�R	�������*\�\�]CJS_�����t���1���g+�9�K-+_b�z�v�����1����W�����uwW�2�6_w�z����A9���ra9��#��z�eN��>�/�����<��tv+-)�>�1S;k&�3w;�T�0�{qs�n�bYt]ek�����ku��o��lL�iyK��e���n���.��V�*�<���<*������~�;�43���E�B������~+f�b��w���_�����������>�O����{IK�NN����g>�����><<�Ll6��	��[��\C@�,��?m�'������bqi�30��iTXtXML:com.adobe.xmp<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:exif="http://ns.adobe.com/exif/1.0/">
         <exif:PixelXDimension>1643</exif:PixelXDimension>
         <exif:PixelYDimension>682</exif:PixelYDimension>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
�m@�@IDATx��
t\Wy��$r����"�2��U_��E�U�V���5Jt���S�g�o�Z���,p�jK�J�V�&_/�u+�,;��(�(W�Z9�*����j��;�����������3gf����,K�O��3����>��y�g?��(�����	�	�	�	�	�	�	�	�	�	�	�	����xURe�$@$@$@$@$@$@$@$@$@$@$@$@*kXH�H�H�H�H�H�H�H�H�H�H�H`	PY����4	�	�	�	�	�	�	�	�	�	�	�	PY�:@$@$@$@$@$@$@$@$@$@$@$@�H���U���I�H�H�H�H�H�H�H�H�H�H�H���           XET��"|&M$@$@$@$@$@$@$@$@$@$@$@T���	�	�	�	�	�	�	�	�	�	�	��*��f�3i           ���u�H�H�H�H�H�H�H�H�H�H�H�V��5��I�	�	�	�	�	�	�	�	�	�	�	��5�$@$@$@$@$@$@$@$@$@$@$@$����YE�L�H�H�H�H�H�H�H�H�H�H�H���a            �U$@e�*�g�$@$@$@$@$@$@$@$@$@$@$@$@e
�	�	�	�	�	�	�	�	�	�	�	�	�"*kV>�&           *kXH�H�H�H�H�H�H�H�H�H�H�H`	PY����4	�	�	�	�	�	�	�	�	�	�	�	PY�:@$@$@$@$@$@$@$@$@$@$@$@�H���U���I�H�H�H�H�H�H�H�H�H�H�H���           XET��"|&M$@$@$@$@$@$@$@$@$@$@$@T���	�	�	�	�	�	�	�	�	�	�	��*��f�3i           �@+E�u9w���={F�-���sv:�m���K��/��5���.���X�6Tn��
�uyq����3KbEwq���K.�
e�q���N��b�W��riy������3�]����K���R�l���U           �"	PYS$�\��~vQ���([��]��+���
�B�
���Y���d�_O����7_'��Q�l�����yFf����[��������T����O���?����f�x�c�~o~�^��h��8C�pD�\C�����)������20e��/	�	�	�	�	�	�	�	�	�	�	�@)y)�b p.�3X�,��]q���u����t2*�����������"���s��hz ��sj��+���6���
�
�tCE���z�-�����|����0�@$@$@$@$@$@$@$@$@$@$@$pa��5%,u_�(j��wg(j�$���b��X<���I���7J}e��T�[{�5K.qI�\�;������"�=           ��-kJVKrv��\�X�WcV�Q���PDb����7Z����Z�WpT\&m
2shRa'�~S��{/���dxpT��K�eR��U�}[��!~ec�����dp�OI�H�H�H�H�H�H�H�H�H�H�.H��)U��=#�s~i��r[���fe��A9����Q���~y�����}�^!�>���olvX��G�
�$s�q�����<W!u��Rm~�/	�	�	�	�	�	�	�	�	�	�	��K��������d��&y��&�%��P��h�d��g$�s�W%�Pg~d�]����)w����g?��^M>W]/�y�?��<#          X-T�����rV-��\.	�r���O%��%sq���O,���Y�����2��u������Eb�]\&g�����uM�������_          �P	$tj�D�^?'���A������������G��$������b������M��7���5�R.��r�D��$@$@$@$@$@$@$@$@$@$@$@��-kJ��u��Y~mS2�h4�r%6�YT�<F���:��������3	�	�	�	�	�	�	�	�	�	�	��*���d�7$]��,�xDP��gU����!          8o��)	��J��#Q��cI�R~�	�	�	�	�	�	�	�	�	�	�	���F���R��E��r���QY����9y(��#������H�H�H�H�H�H�H�H�H�H�H�����$�/���*���T�Y�ciQ~����/~!�3g%�0�DPeM������%KY��
�&D��s��1�;����d�<#          (!�
%���8*X����t��\�)�t�_|��T�-���}r����bL~�����9~:��Z����J���}�LL��[����6�I���O!���gD�>�\�CK$@$@$@$@$@$@$@$@$@$@$P0��$�G����E����P�T�Y�r��RLb��d����B6HE��JMM�,,�?����t��g���9��M�5�~��h*�x���7�Y�6���I�M;��!>;oi���H�H�H�H�H�H�H�H�H�H�H����)�2�$<&���D�A.������b~���������_�B��t�\�=��laz*�%�������n���bP�,�Bq���.3�����L87�)� ?��8������)�>��[��/`U�������I$@$@$@$@$@$@$@$@$@$@$P"T���Fs�����?��Eg�y[o�\�������g�p�4�g^��
��m�l���$6#���������Y���7��1;��k\�I�iq��L�LI��,2'NL�����_��[:�Ur.�7+���"��������d�����H�H�H�H�H�H�H�H�H�H�H��.
��)���%N��&��W�"���7���YY\����U��3�����2���[��_�&���Q����*-����E��2�Z���~��S{]66�C��)[����#g�'�{?�\��h��f���@�}s���	�	�	�	�	�	�	�	�	�	�	��W���J��p'_|R��)�������P���fe�/��Iy$����g���^K������db�`E�Fv����r�G����>1yK�,67!��xV~��?I�H�H�H�H�H�H�H�H�H�H�JK )�/m����E�����'�74IS}�TW�KyY�RL�#2=9&�Ss��L^`���?=�����EZR[].vtK�07[@\2�����c~ihj����6��5#��c21���&�)�>/o�0	�	�	�	�	�	�	�	�	�	�	,���-�J=��
n��a}3�R)2^           ��"@���"�tI�H�H�H�H�H�H�H�H�H�H�H��a5            �U$@e�*�g�$@$@$@$@$@$@$@$@$@$@$@$@e
�	�	�	�	�	�	�	�	�	�	�	�	�"*kV>�&           *kXH�H�H�H�H�H�H�H�H�H�H�H`	PY����%}��J���ra�d#��$@$@$@$@$@$@$@$@$@$@$�~\|k����u�&$@$@$@$@$@$@$@$@$@$@$@$���xcm�sK$@$@$@$@$@$@$@$@$@$@$��PY��
��C$@$@$@$@$@$@$@$@$@$@$��PY�����%          Xg��Yg��!          X[��Y[����	�	�	�	�	�	�	�	�	�	�	�3T������	�	�	�	�	�	�	�	�	�	�	�-T����bnI�H�H�H�H�H�H�H�H�H�H��*k�Y��uH�H�H�H�H�H�H�H�H�H�H��*k�Vy1�$@$@$@$@$@$@$@$@$@$@$@���5��@�:$@$@$@$@$@$@$@$@$@$@$@k��5k���[           �uF���uV�|           ��E����U^�-	�	�	�	�	�	�	�	�	�	�	��:#@e�:+P�	�	�	�	�	�	�	�	�	�	�	���"@e��*/��H�H�H�H�H�H�H�H�H�H�H`���f�(_�H�H�H�H�H�H�H�H�H�H�H`m��fm�sK$@$@$@$@$@$@$@$@$@$@$��PY��
��C$@$@$@$@$@$@$@$@$@$@$��PY�����%          Xg��Yg��!          X[��Y[����	�	�	�	�	�	�	�	�	�	�	�3T������	�	�	�	�	�	�	�	�	�	�	�-T����bnI�H�H�H�H�H�H�H�H�H�H��*k�Y��uH�H�H�H�H�H�H�H�H�H�H��*k�Vy1�$@$@$@$@$@$@$@$@$@$@$@���5��@�:$@$@$@$@$@$@$@$@$@$@$@k��5k���[           �uF���uV�|           ��E����U^�-	�	�	�	�	�	�	�	�	�	�	��:#@e�:+P�	�	�	�	�	�	�	�	�	�	�	���"@e��*/��H�H�H�H�H�H�H�H�H�H�H`���f�(_�H�H�H�H�H�H�H�H�H�H�H`m��fm�sK$@$@$@$@$@$@$@$@$@$@$��PY��
��C$@$@$@$@$@$@$@$@$@$@$��PY�����%          Xg��Yg��!          X[��Y[����	�	�	�	�	�	�	�	�	�	�	�3T������	�	�	�	�	�	�	�	�	�	�	�-T����bnI�H�H�H�H�H�H�H�H�H�H��*k�Y��uH�H�H�H�H�H�H�H�H�H�H��*k�Vy1�$@$@$@$@$@$@$@$@$@$@$@����u�>��:����M|yS�J������	XU'����p��)���do[��4�Lj����P'5����c)&����
��t4s}�^i��rK�y��FehlF�G�,f�e��T2��������yN�j���R%ccbcMK?����'���%K�����v��d��wj[eWw�L8$�v��O#�UM�.�	FKRN�_�u{�56(�g�����/3���Z������������Ge8�hT����tv���Z[��,��etpXR�U���MU�����]J���m�tUO��C��6�r���FZw�HPB�p$�^�yz�TI]k�f�e(���mM<���)��d�`�)��`k�4��Hu�5�ax��jL���%�k�O��*������32>4$����xx�t���J�I���`|A�U)/����]��V���X��T����5��l����K|u���N��!9�~5�D���,W��xM���0���c�`�j?�%|��v��T���i9~�_������	��=��wK�&�;�����r������}Pf�����G�9z����xj`�W<>yQ>w�>y�%��xiU��|I��g�bZ���+7Wv�W����Bd��y�8�g�������[��� 0��[��.�t��^	r�~�d�l��X�~{��r�_}@v�t��>a������|�j���~����J�_q��?�+�X�<�>�����Fb�}#�����?�{\C1�����r��e����&��{��o����(>���m��7��*�+K��)	�����8��JT��KQ�M���O���E�5��%��C�����6�i��j���FdddLB�R�k��]���6=�%��:�Q�#�PV-��N����I����-���*/q��Ew���FZ�1��xW���k����q���gU<z}�2_��tf��E5��J��R��	Id�F��{�3���������[������"�TS/�=��V.
��Ax��LWJcg��;���Z��������v��j�%X#��a���eK���*����]T�D�dl����B%�����U2�7(TS����_�����ni�\_/����ii��2��L���UAi��8�k��q�����,��b0��<����_��T��q�]�~p�{����������8��|��9���r�t�lm{�|��Cr���[����O�wRd�f�~������I`]�^��ZW�29\`��9]�������\&�v@���(�X�x����O1t�����h`
������5�{���*j��q��,�=�i���+}J^�z�S^�1���$e7��p�K�eV���(>����3mIN*���S��1���2�#�ru�t�4[�3�����5�3�G\��|���K����aV�Q�(W�dJ������\�K��<y)mb�������K�^u��r}�,L��T�t�6�D�DgeX���!m�;�%)��TF<�'��&M��)X�tK��E|�aQ��@s��(�3�O!��Rk�����$lY��R���Q��u���D�-��LY�R�� ��C.�2%W�A� 0'#���2b8o�V��������H��6"������03��`rt��I9r$s��l���-������RX�Y Vg\�]b�r��B����}<,~���YU|m��|kV�:�[2/$@�&��^y�CWI�bX}�����WQ^&���k��������ayf������������y�����>yAr���O9f���u������|MF�����}y�!p�`	]����m;���;�W����e�q�����[j����������������h�[��m��P[�����{%���l>��m=Z�d���<+��
*k�*�}�5�A���]$����N&��%]�UI�^�K��k��vi�[�"[�������$�
h�����p�������O���,f (�v��a��Y	M/H}�R���LI4S��ILz��s�K'�MPz�%j�.��]�%��g�SLf��wiA?qT�����k.udi���epD�����%/����-Y��gnz\��B	��1��K��MV���LN�f>ii����A�JQ����$�$O*����� >����gertH�U��6ik��=������T�B��dZ|���a��e�:vP��X)_k�}f"(#��j3a��x����������i��`A>EjZ��#�B��e(T)��V�'A����2m)����,</�F�j�b���p�Y�l(��)2!���4��Q�2WSc�g���4�Xo%Rf,2|-���������pTP-�(N������Z�R�^j�)3���
2�����d*�3��G�/\'�-X=��
�o��A���RW�4���!,�fF!`O�o�5���A�5��u%��R���|����m>�o��]3���J����d04g������x���Um{���v��6����"�v�Xu8�/;6�
@�q�����+'�}��d~iaJC���-��$���t�W����6���!�:4"Ch��2
=3m�)��\��I���y�I
�v������c�q��������z�����a��e�	���S2e��*��;�x�b���uJ�C�O�<Q��<�UieD9��mn)�.�m�]�������|���3N9��{d/�t�r-����t��7��&$~(��;:e��	c�-tJG}��f�'L���u��?�5��[��������e�����e��9�@���/�ss;���,���i�"5�tA���d�;�s��aA�4aA�
�j�-C��s����9����4���������q=����������0Iw��y�:�z
���2rIb����q�_g��������9�U�:�E^�XW��_�;�p���cn{{��%���k��,cl�*>[?h*�f��>{�����M���_�Ll�����\x����
���o'7|����9(7�J^�����������E1����������o���K�������2#�Ro����P��o=m'+�}��[P�����7�[*j�O���<y	��
�8}�#7y���]��2�<?�����b�n|>h����
�$��vd��
Z��c>���D��"?�6��Q��in�=���������g��i���3���,}��Q�cLcd+�9��wEQ��]�Zn����_z�<#?��W�����}��o��r_�YF���������r�����������v�uR}6$�?�%[-���p����us���}_����������!y�����x�J���{�+�S�n�����Sa���0�h�k�M��g��]�����2��#���r�k�V<�O�/�>���b�9���|�1(��KZ��{��/�>��S4��]��!U<OE��O<��N����d���n:��
m�M��������JZR��D�����fa�/i-���r�A�y�?K���F��!���u���W]�������(�������r]��)X��}v����a��V���_����������'Y��>���C��"��w�m5�2nq�� 7�"S0������h��f�+1�t@[n���p6��Y:��������K��Y���KX��L�:�Ji���N�Jb��~�����b�Pw��{>|�u�-&�������>y��>5�`���*m;�%��p�g�;j�o�BlX5)���b�,���)���Q��f�X	;eK�|mpaA{�\��,%�b�R���f�Q�$��\���J/��$���"KR����<5���*���u��"�!�U����^�*�dfj�����?�H��JL�{;�w�52�h%&M��������p�����]N��/u/��n�
�L��Rx�>��������1�JcV�v��a�Q�G�V$��%e�����D���!G+�i��AX������H	g
����e.�k�V�K��"�x,l����j�M���-�6����B�jg(��z����*|R�����t�������=�������PMs����_/���i�A������	��V(�t���bD��~.K���5���Z-Q������Z(~����K�e�C�j��o����Eo�D|mpa��Z6w�8���Jm[]��QG<����N�����]���NYN����G�,1BA��}��������,��0��Pp��\����V�m^���5�2(��}�������^��P�yTaO���0��8S��m���9>����������!���pR��@����BW���R5?��J�S��{�>���XX�o�2���<�k5�HR�b�EuE�:����2�����Dk���)����v�u�R���p�����i�����O��{t%�|Q����;���x�4<�m	��:���5���92����>�����M��9r$l�y)�n{���t�X#K����[|����<i4�p���fy@���\�
t^-��$���PO�����Z+U���Cs�G�s�EOob.�u>a�����+����L9���,���'Gv
>-�����ak~�c��
�{��m�c�Q����,a�
����%����9>4��>�0O��V6H7��`�6�e��{�~C�;���9������p���X)���0�_�o-(o�����I.�����m��,�$��e��S����%;��/���z�����5��!�.e6/BX��z�Y�D�W�[�����O{�7�n�6���9\��������������'3�P���I���k1����|5;R�-{ogn�^&!�_���>��/�BY��`����L`��J��{z[0[�v��;v%�W2~5vz{gOm�cYy������>��m�����?7VF����),�K�����������
����@zBNA��t��,N�3e�;��n<!����s�����]��o��eJ�-r�G���%��D�q�����g���Jy?.����|�&��7��3�����mJ�G�{au"��|��]�}���6�o?��}Sa�(��+i�?�J	A����<�h�K�y�>������������}A��5)�7]�K�se��h�,$�����[z� �����gNbT����?�Ey@������c:Fe�B��_O��uX�jd�
�`�	n�5��O��o����]~;*L�^-����� ����;)��.�/Z�
�uu������K/�y�_��l>9a���j]t�����&����1�������+���tuH���,�c�}$�g}��T��swC(���"7L~�f�)�z�5r��5�������^��A�K�B�q�j���,��J�3!	�5�������j0�&������%65���p�����������_�����J�{�K��
�Z���*���=w�\�I$�;��2(���g����q����te=`����`]9C��?0e\0`�&��{O�����}�S^����+4G�`������\���k���1��R1�H3|�X��2!�.�H���t��v����2�@�q�j��KVR�x��1��P��}�J��dD�w7K��/�p�k��Y�2�
I��	���w{��;4��r�!���dR]�5V/H��A��kQfc!���>4�U�#
XZ��N�Gv7�����Y�Me\���I�$�8����Cr(g�2k�D�2�b�?�l�e ]�b�B�~���9B���0,�Za)�~�W�� ��[Au��T37��4��8�p������u�<M�_y��6V�B����[��\�P������yD��	�?E=�\J���\�.�2��G��d���#r��!(�����"�C5j���z�� ����p�e,�B��\�iA[�����������?� �����C�� ��~G���)u�:)C��5������]@_�uhq�����PX�|�u5���+����<4��`	M�C��[Z�a�k�Z(-�����>��?[2�O�!�?5A����+���"����T[�_�������9��]l,9��\z'/�L����d6�d��]�yyu��@�W���-�q�x^�r�C]�����H�NL�rfd>�U,��2n��U����;�0(�x����@�d����i��`���R? e�a	��-�QP[�I����d��T����\�{X�e�C�u�[F���!�fd�@�
'&+n�-]X�Tb1E)�@�l���,�9��[=q���i.��%��f.�~p:�yN
������s]�Or��@�O
�,���i!$������5���s���%��&s�b>������&g��G�fh)p~��vu�Z�M
�%]���]_#������G3���!"N���G����0�x���v��e���u�D��#��S��"~�n�VW��(�%��6Fd������������������4�Ro����P��B���[o����|&f���W�������)�Z��	��6��v�����j��t.e��]�w����o�D:��B��|}��:�0w�������Y|�4�;���H9�Ww�������yEA�w�����(����������E�wx-/���4�g���
����a����*0���K���6�p���K�
�C������{��}V^�SXnl�R�m��	��<*a��k�<���7��kpm��������%��P:�Y��d�z�2���>��;n�;��)y�������-�{��>)3���n�3��~_
��KoyP6�i�b���h2�}��@���i{�=��r��+e������]����(��|L���G����������wc�4�����g�kr�������i����~9m{D����^	Y����`������mo���4B���T"~;��Sr���kKs��������r���E�yw��[>.�,V�g7��d�e���I�m��G����'�4��l�b�V(�5x�����;�/�n=-aXO�����o�y��k��_^���X�q����x���2���0�z�p�wpY�l����(;K�c��YF����O��*cJ�����2�����g����`/f�r����L�Bz�k�7�5������"�7�|�[i�
b|J������f�e��k�C��t^;����r�oQ#5���#C�h_���{�J�-D�b�n*������Zm��2�\}�$�������,�sD����w�,K{�
��1��M��Q��CD'&e��.���|���n*����<��o-$�X8�r�K
�1�eG��%�?iIB�	�9[���Q�
sh��U�-v�dj�(j�qD'dr�I�� �/��(�>�f�h���M[��`�Q�����?e�ZKp>-�:C�5�**����@&�e�K��8"W>p�rt�S�9,_,=L��UW��	��jrpHja��/7�=
qEkK\4�A���
��
�Ze��FB�5_�|/L[��DS���?��\@�K�C�M�.eZ�!�w*S��.�P)�a���lJ���6,���D��'P�:*p�.=T���A!�$��'M�{�'S2=��d�f�������4��|��G�	��V�F����m�
�06Bo��b?")�X�i��%�����, I�)d�R�|�h����f����Q"�l'�_����3�Q�l��������-������kP�T[�o�d�m`1��������5�p:d4{�!�s�\�0���&���N(��-hK�G	��k��S��0j�XJk�h��1��o�*�8UP[O}�e���s�@/,�0���8�P�Bla���;4P����U����W��~[" ��J�fd�1�I��jQ�0�>�QO2�t\�w��u�EB�XT��g�{�OL�#�J$�5M"�����`�Eo���mp�7��xo���9�yjK�C��F&�R��j�n�~N&���1�����SBr(k<
9#u;��J�X�k��U2)~,���5�8c)c�[2�l7+�7 ������J���d�:	q�k;��|���O��������u��7��B���\���9����*�[0���	�Nt�f�����D��$��y4����2\��c.����X�T�<�����S?`��<}�Y(7;n�vBX0f��5�?�g�z����H~R�����!�e�_����~��8���^����|�:�AF�����&~gvV�|WX]���h�] `����{|�o��?.}/�!-P\��f����}|��	E�^���r���
���|��^��FQ��^�/�b�]p���m��`����Es�w��}	�����{d���C�sU�?>a)k�7�py��v�l����]�{I�~y���r/8\�A(2L�3/���F�~�������7�������Q�=����c����Gf>�.���<�p��{:$w��Lq���@*N�5*-�L���>B�=�T���������]'������&���K_Na���I�����-g���y�������W��JJ�^��_;
e�f�C�$~�2��A9�qw���5z��zOs����BA�t�2��8yhB������*,:/Dn����.S�����Ge�y++��!���9=�y[�U��/>,Y�jj�z+���s���8$��K�7'�\Bd�������)`�E��X�CDD������{��^���S}����R�CS�������P����$b����3���uR_i�e?�3��-��A��Q�4�e�;g������U�y��\+=T�.F$P�X/m�u��|\��~f�����������	��*x3\ma����#�I����`��5;q����r�!���,O����K0+7��8���Ub�C�6��Z�%�]+M�8|�wwuH{�V���;�<U�������Vq�����82�8��� ���p��v���[��-�d���^�I�j������Z�4�R�1����-&�c2����u�JU�b��,��3���'A|uX�{�����\=�eA[8����Mb�b=�(��^i�����2qr\&�lJkn�����q2.�w��L6�(g����7��>nZfT��bG��vb�.�:�r����[�S��J��)�K���S��zVE������5>�YE�<�����i2.�3��������-�'.)e�K��J[��������"������$=i�����"]��OD����O��������V����f�F%�k�@=\/���?67�EE���N�8"g��;d]02��\S���e���=�/�M'%>��bR��?XNc.��*~�Bi�e�t��L�e��q���
(�]R�b���wQ"�OX��D��'����H��`I\-�������W�]XY}��>k�S���V������'���_o<�]m�=���������[0W*v�7y��h$�[�,|����v����i�~ �����P�J,���iG|Q�����������yE��w�cg�?�����9��S����.�
����:�x��i��)�%)��7���\W>��dfle�W���1�R���|��d@=;���������
���@��r$��.�/�\�n�jZ\�ryh�������6?�iXT������UY�QW1b��������iXmN�+�b����/7��_d������{�D�/�3O|Y>�a�+O~G^��N��r��oq�]�Ft<D�GF7W������S�d�U����
e��G��..���u���������cO"�3i{��@�sVF��:�,�k�d�P`}��&]��0g��Flm]��fM���z����C��P����9�+
x��U
2���a���N�D���!���Xz`�����L�G���<���zl�m���{�T���6��55��jP��<,@"pu��X/�cA�"��t��kr��������p�aj�kp
���8�1���� >�k�eCW������^�+a���3f(�t�3�Z����K���*���B���ea��X+�����DW;�����VZ�_�k����dyG�����sU~�
������ROj��=k���:�b1�`��[��
�/��
��b5�V^55i���A��?�+),�,�g��C��f��^���#p��x����n�|5>(T�"�����C<�
����������n��Ge�����Ob_�b��H�/F7�J1yD���j�3��f;/*_%�J������t=n��/K+�y(d�WT=�����u��������/�BA/�x�����_2��F�����aK���K�f�Pg�b�a~�F��@uC���������B�|	�E^�5�(3���n7n~!3�u����/�	�����-��:!�=`�Y1�J��Uy�O���������������i��-;���w>)���7����n�CJ�������|z���In�����������H��w2nw�5�{*�p���)���do5��m{����@IDAT���PV��E�w��!�
e���%#���R���Y�J��*��^���z�
���)�n7�?<���c��J�M����/c��&Xd��������oH��w���v��mp�m����p-w��r3\��?�\���
.�N���O�t���e��Z>YF\ �������e�O� @eM8����
|,��[�Z>�WL/�����f���(���i�	|�v���U�,��IC{V�t}��Y	�qA�Q���:��^�{�dD���q
�,o�|"ni�T<��C?���a�q����� �v�,�G����)�2����X4��X�����_�9��S�X1�K�a���=
�Y�������'%-�WW�Ve�e��lr����������%�����zi[1���P�����0a�<����vD�!d9��=�3^�X'#��M|�DS��y��Z�� ��q��*Xq�Cto�"�����*�+�(���Ygv��u�x(�&L|�C�C��1O0�XS�m�#X�x���0j���!�����yZ�R��ZO��at#�F����#2�l�����eM<���L����.:*��X�������f����`��M���>�P�^P&K������
{�#���)��-c�D�	Ci��
���:���������5���;9�]��b|Km��g���p���
��/�q��F���W�������2�U�qj����K{�Z`�N�1������z��3�	t��68o�f�-+�&�5�54�(L����.q�$�V�I%,.��eM5�-M�MT�
�Od��q�<���;�f0A_�u��N,2
����eU
��M�}�
R55%A��m	�����c��Sj	.g~�.GUQ	���S�S�[����c9c���\��w\)������jf���9�B�(p3�y;���i�������a�s�U���7N�3��BO���?���Y�����?�*��M���;��g�73�������(95�����}U�oA�u��~���'���jh�~��w�������;�I�6�f�;�'����$���.��.[��k����RwB�V/�����;G����`��}�r����L>.��/v��~.���������a8�-WI76�i��c�����}�F���Tb���>����W���F���k�o�b@DN���ot��<M���7���g��{d��'�p�*jN����{��)y%M��yxkf�Y���/�
����I7nv���E�Iy�H�o�*��~����n�W��.k_���9���w��;QN`�.�?��$�T�s�N�9���l��)'$2�?����q�"�r�g��V�-��B=��8s���s��oVY�!��8X�`@�Ua����U���� �)�>n�����b���D������].�W���n�^� �)+Y���T��p�O0������������t(jp�*(���n�'[��Ay��D�vT����BthP�]�]id����Y�'���`�������[.6;���1��o��q����������Np��:a(��p</p��o�r*j��q�����4���i
��"yT����J��������*l��L������y@�=PU��Z.��u�ZPJ�7Bp�%��`J��
�l��3?&i`�����ZiHm4��*�����m���%���d,�G�O7�N�e
V�����2����h�%P+��"�0�^61V_�Jj�F���o�[����f�L�+#��/5��,�
���5��k1X�X��S���C����ww�%p�`�����W�����IW�K��R�U������D�R5h�pf�g�KmK/�n����+�~�m�M���TJ��6�{[Wj}J��WF)��(���=����k������]X����fv�4F�:����*����M�ux��`��r����%�S�u���c#sK����VJ��1������R+�
��/�!�X�v���������Ti����~�k�.~�3���TJ�?`)�b����b�9u��
-qT��9{+��$�t9)�7����6"���0F������W|�Nv=*�b�9D�6�9�5��i�^��u�YR�4������L����I�7����������`��y������&��H��cy�����`�y���Ay�Km���+��*�
�������!��}V���]�N��G�I��?e
�F^�������� }P%�p+sR\�/��c����T���0��
~_��[P���q�A�V��j�=
���<��]P|;s��r���?��/6C�O�����#v{X`���T�L~�u�6�V����^NWX�)���g<�E��]�ni��J���������G��U��W'��q/�b��2���kDu#/{�\����c7��+�)�~G�l������I\�z�d����^}�#-�����
:��l���S!�s(jd��r;,Y
:y�zO��"�;
~{�@�k���%�w����������}\�x��kr*����<SWh��W�
wh��r��K;��m"P65��,<���!���<s"~�g%��17Y���F����G~Y��>`^�m��48���*n�����0GV�[�e�
���6����<�[xd�(�I�{�TcS��V#c����1�g���@�ZEx���,�M
g��
\�;{�{pD���O�c��,�
��	���z��}�.��2�n&^����2G�m94��-$
���f3�O�X���J��Q�2^#�e]#�'����h�m���
|�TV��"���bUU'-�s���-O��}R�"�m>)��S���m����f�{qSGXuVM�t�."�X���3B����
K(��V[{���\1+���D����%y����wck�Dq.n�+i�qf`V��f��
������dX���J{YT���� ����p( �pI���D(�\E���b�����Il`�}Y��n�S!{("��������Bch4K����E�u�������U�������O��N���]p}W���l{ �]�{)�
�q	5�I���(c���*���K�(���J���^�E_0���D�����f����9^'ok\���e��Yj�8X��5���I������q���b�{����#c�f�i���u���u������i��:�V|�!�c�U����z�'G��|����*�+*�Z�$����
�KdjF���Wj�w�����D>3"Y�s��Emc�4���
�����io>i��K�&��j���k47x9��9�s?_�~���k�%��0�V���O���>Q���C��f��7N���
��|����c�i��v
C`�_����h���F�����
�$��q�s��a��Y]��5�w+���Z!}ytbDB������o��h�@������|c�Kr�/�/���-���k����Lc��������OF)�z)�ou���'�Pm��?�c���U=��Q��S��U��LO_�������a��<��>{�'���3�2��S}S13��E0���cb�O����Ke�f����y���Emgbpk�(]]�2F?��kP�itY�A�ihh��^����5YcJyLf��Y��q3,#cP�`>���ZB��D���B�R�����X�_���Sf�cUPLb���rc�jM�������w��|K�������?��c����q�4]y�e��x�_���qSH�}J>����(��������hT
���p}�IcS���m���''d.���> �l{I��Bw��+eV��)l��y�����3Os�����B��Z�����oA7b������@I��������pA���r|S�,R��v�L!���15O_l�.�|�|b�#����-�e�`Y����|^�'.���T���i������������|F?��o1�h�{���G��������z���iy���_�g��%~/ �G1�b_��E���,)7A�����O��+��b�Jz������B�o�����CZ���ZD�}-�����>�������Ur�w�)-/����psY��)�!��}S�r������r[���o_%��*���Cr���$Ra�������}k������@>v������{L)���Q�V �������N-�
m;�?�m{L����%��X%�eq3�&W0�����W@���m����� `��]_*%���\�h=�S�v���?��Brj�]��;�y/��}�ig�]��*.���g1����U�f

���;-G�c����������L
���[*d>|A\���|6������A^5��y�;"�0w1r�(6j`�_���}�2{pP�tJd��p����HX��'���W�_A.���t�@D����B�`s\����Gd���}E����7/�-���b5�Y:`�?�)���9R�+�j
`�S|�H���U����J��V���I�HY����<��#����#��)�($�H��1X��H��W����%�.���%"#}�2���M����P�����=���Ca"�����J�Cwb�%�?�,-L
H�B���@���5Z�fH��=R\ ��~l�������3%C����(�f�d�����i��������ei��8�{?��t`��a��h��Ru&�"��a?HT��c�2�,���Q��|G;�b��6/����i�xtn��y��^I�+�plh&�`��H�yx�����X�FlrP�j����i� �	�.��EFJ�\�����>G�jDB�C2�����/H3��������<��[r=[�=/����#R���x��bXm>�6m�^�m�o3�e8� �����[�����`D�qg9T���u���'��!D�v8���)Z�!#2�Z�]"������K����
u{���m�*�#�(_��dz����=���� �������c8����#2"�f���IXm�uXui��1X�}|\p��wM���.��f�,�XU��.6_���i���H-L&�~j�>��.����D��<�X���2s�l�f����!9����������������1�������#��XO2�����J�Z��������Hr���:�d�O������O^�9�GNn���k�N��`	���9��q���N�������NiE{2���^G���q3&���o��V�X����!�6�K���b���������a������F�6.B]��Q��f�������_�Kz�~X>��=(�����6��S'����^���`�e�����G�Io�cr��]����Z<�����b�+��_���G?%�>�(|���p���`o���)�$?�%���z��^�P�����+�}��o�,��.��[��ob��i$\#M��o�'���R�w�mg&�����y�b;���!Y���%�6t���|e$����,g^�H%~�q�N����>�B���������!�r�3����_�����w�n�����}��V*B�z�E��f���w��w���!�W���7�����?&|�~��������`�����o~�~�}���{�k����w�����e������o�~��w@�W�
�+����~���o��r��w /��+�����])���pP�o:����x.���O���s����[����]���Sa��W���������x�T��_��6(|���h8uBF��������"�]�m�ZX��
���k��}`�Y+��f^�o}����'^������yV�]	�s;����F��Sr���<e���~�|J�������u�����EZrE�I���p������OB7
f��L������^vm��(�����f��k �L5XQ�#�sC��r-,2#_�W`���+ ��G�x�~q�
H�H������
��Cd����r�!�r��
���*��B�Sw�rp~D���<�0$@Y	��xA�/�U��bX_��g��x4���7�#�>�(np)��;�4�-���c��������_�Mn4{8�!���#�p�����o���"p��2������16 ��%07S��.�`��#�@�! �pS4�u5N���E$@$@$��@]��mO�E������x��	T5K/���iN�nku{�(\F�  �@���@
�� �e���<������=)�o�N�����	�;M��k�����Y��H ?����L6�H>�'G2����NC��XC��tIu%�N���E$@$@������,��I��.��}�t�EkoF{_-�.�k����	D�o�<��h���*��(�'��O�{��s.�|���H�JD�}v�@2Xe��W>����> ��FF����������=��d��!@e�r��Y� 	`�����uc���C97� ��B������\�{��P-	�	�	�]�#��U�������nE��/j��s���'���(��h6{2bw���	��/�;�% 8_�g�/�L�V��S���+����G�6�=�MS�=���o~�����W6u����g���e�$@$@$@$@$@$@$@$@$@$@$@$�������7I�H�H�H�H�H�H�H�H�H�H�H`e	PY��|;	�	�	�	�	�	�	�	�	�	�	�	�$@eMN<�I$@$@$@$@$@$@$@$@$@$@$@+K�������I�H�H�H�H�H�H�H�H�H�H�H '*kr��M           XYT��,_�N$@$@$@$@$@$@$@$@$@$@$@9	PY�o�	�	�	�	�	�	�	�	�	�	�	�����fe�2v           �I����xx�H�H�H�H�H�H�H�H�H�H�H�V��5+����	�	�	�	�	�	�	�	�	�	�	�@NT�����$@$@$@$@$@$@$@$@$@$@$@$��6�l��\�Wm�(7�|��je�������wd1s��������o~�|����a��-[.��::����9����S~��7�Iz>�����p-W�H�[d�O���Q�����;��gf<�9���$��M~��yyuv�b��>,�6VyzgG�9O����w��3g�n��*3}���G�(>��������g������Gt�<�uC�W�vt�d��        �@@�e��oO�����*�����.�}u6EF�+	#����'���b����gd��l��
������+�\��wPY��,���Y���)����	��+C��5+���XMT��.i��������`555rKo�h��uh8��4��:��YU���w�<O�xU{�1����������N��qgK_Y��������l�Jr�t���EyX�D�s$���[������s�L�H�H�H�H�H�H�H�H`���gQ�������H�
��,R?e-l7������3���_���]�6�_�����?��%�R�d�{�^.�s����k� U���H����c��5 �������i��Iz?�sz����eM	��f�����\�E��Z��~��yvpPTI�TZ��;w��������04��ZP����w�h���B��K5�
���h��4�*�����=W����M���6w
V%-��;V,�w�A�3jY�<���X�;��O����2D�M�t2��r*j�y�e>9vl���)�J&=7��y��'?����V2N��I��U%��G�a,��y�p�yS'�o��~���{z���2sZy���?LX��2����d�U��9sF���7%���U+.����^wfu�an���j�3��0��Y2�6��i��y?SnZ4�����5�y�9	�	�	�	�	�	�	�	���"����d2�K/��2�2&U�����r�e�Y��U��5��_K�Sn����*7��k����)�������T9�����H����C(aZ-��z�qz�Qy��3g-�����x�,*kV�oJ�N!��P�������=%`���~��-����*YT���M�vh��Pa��/M��Qi#UWkNwf�4������)�}����Y�n�FQ���I���
�9�L����Q%���3a��?���Z5\��I�P���+/[�	�X����3�����O���C��{��?p^N���A���Is��Q��C���B����
��^����_��F�j\�0s��d����U�x9�,.�*�6n�h
����A$@$@$@$@$@$@$@$��	�"F��5����K.�����5o��Fk����p�)�S�Y����z�J����4.��Y�����mK^edjf��r�\�����E�@-���<�z.�K���4�wy��Y?�Ok�~��~��L���?F�,}����I�a:��`<���Z���D��9]{j��������'Wv�-�\������\H<�p2J'���X�.��%��j��3�}x���hx����t�Ne�Z�8�~���I�,���y-;<���1i8�������(��N_$M�\3����?�gj]��Q����q�=_��������N��&�sL�r���2�k���1���G�}}'� s��Cf�_b�I������x�H�H�H�H�H�H�H�H`����*'U���T��k�Y�����?��F-Q4�.l6n�T�J��`��y���C�s�UW[.�4-�!��f#KTy�����m4��Z���Zd����O�������u�NN=��|O���������7z}�-.^[*k����������B?J(?T��P>Wc��8]ZyNM�*�.���(4���(�|���%��]L�|iUUB1�.z(��_~�R.�2�(��D��`��'n�Q��Y��(5}^�F���$����h'	,\~���k�!�2Qe���w�^+I�TqK_�;���V�����D��(k�
>�b�g��S�1/�����J�)����B��w�C��n<M�|Mz���>	�	�	�	�	�	�	�	���O@eS6�������C!�*oSo3*#U����T��r+���a��z�Fv��=����C�XN�. V/4�P����;���/�aM*�K_l��^!qER�g��*�T&��H]�o��{��W�@�V�L��5N���*�6*�'D��O��Yn������.J��:F���1Bs���$��F1a����<���*cTa�!��}?��F�����e�����^=s&fu���Z�C�E}R��V��Z7�����2G]�m(��R����(��<�\5����8��tU�����
Q�6�+�6	�	�	�	�	�	�	�	��L��[�����T���C�c*�TE�Z}��SeF�y�mA�>��
����Z?���S��{��S�dK�����L�6��e�O�g{������^����U�.��\J$�QRT��g��T�������U��N�Q��p�`�q���jmU���PA�q�fz���6^5T-��m��)d��(���W@�(�0��l���y�l�
�n�����
�B}O��0���k��E�O������6����������|?��c��U��w�z���*������(|4N�c�z�����Z�?S�=��U��|�yn�8�����7�*�4�z����p�������H�I��(�IJ�LK�g([&c=��(�T���I<�}�V�R�T&�Tm��T���&���V[�lv�Y�6��g��,GgD�"e���DJ���(>���c��������{�Go?N���u���>����/k��&�]@�w���@@@@�_��gZ�	}k���P��2�=#� �z���:���%���m<��y�=��:6��v��4l����=�gS)�d�t��Y�>�����w�m��A[h�Ak2�w����k����Yo��f������5�����}��|>>G�`����V�=���m������f��6e3,���������]�hY������g��Qf��W���b}
�����P��������;���g�l!�j���s�=m?�R�������������W�$���[o��#��n�Zi��|��p�?�d��D[���h�j�n[���~�������o�7�&�l�YG�;~u���c|uS;�������������>�L��O>�WQ�3���� � � � ��F������Cn���=���=���e����n_�Y���n/��~d�E"{����\�l��c�����9���^������x����?����6�v�rm���|��!�l.��k�\e���=?��V{.m�6n�-�d�����~=s-����x��+���V����d�-z��&����`��N�?k�j'����}����rY[�uZ[�5�f���,�-�>[���;���h��g�������n�/��~z����)��'j��6�����n�f���K����v�|2Kk�2������e����������Q�����~���$(�	�	4��&Zc�����>{��Y�>�����K��]f���Vc'z�����9���������l�W^9^��e�|�&��E���	@@@@�y�&����2>6��������6�y�=��gJt�����_�+����y�����x@FFF��D��������ov�^r��������_��i����~�5}J��{���_����n��{����g�}�=����I��Y���m/L��\e�r����4m��O���o������[��z����xx����Y���K `�k����#E��z_���9rdAA�ze.�t_���S����vzkw4�)�x~�@@@@�
<��Cr��'u_>��]	��<l�����G+as��E�f�"�R4q��9:2Z�R��4��jZ����r���[��}G@@@����8���t���o���e��.imR�4U�5�����SxB����ew��m�O�9���O�z_N���vT��W����tu�vm�p\���Z�=	��
XS_h�*�VU��Q�Kv�x���]5Ek��WU����[v����H � � � �,D����H��XM�w�����m�;��i�5���������5===������^w:~��(�k^����p��x�
���1� � � � � �,T�)j�X��:�|�S�j��>�����DQ���\M��n�M�`�\����i�jz�z����s�?��#��g��~[��tF���H�>��;Wq%��'izJ���P���ORY����l=V�/7����
[�uTt����V��4�7��!����k�>{t��|?������|Iy}y��~�-_<�rl]�}����a����m�i�|6��WuF5U��+�J�l�����F��+��g��d�a�������rI������-j]�
'��O���g|Z|����m��3�S�->_����������O�/S�����[������K��z���by�����k����R��[������_�����vD��2������_�_���<?��}����]�e���-/�>������%m���5�4�>D���9�z����/��I�N�/Zf���|?�����'�G��h�[G�%
G���+����k����}�y���n�?~Zt��������������d��������c�%�'����m��\r�)5�$n|����O����>������
|>_������>�<>�:|�Q�o�\��>o�x�-�i�/:����MI�D�����NO�f�mz�%>������[������~�rm�������~9��<�}��ge�U��w����d�To���u�?~Y?�������������.k��
�ToY���oWR9�����D�]�/'>���<t)i�����u�t��6�S<_�e}~�������+����~<�^_�������r6ny}JZ���{�|���v�	��h�6�����^s�N���.��E��5l�}���Q�>�<��&���z#?���m����s�������L���"�f=�_�_�M�����1�y��X>?������r>����7�E~�r�<�������'m�M��l~<���OO�m��L?_������#��/_W<_�|_ft^�<�����o����6G����:��}�z���t����t?�>�1�N���4K�}��G�Y�xyn������o��u�v�uk3���l���vMO�����i�|>�����O���m���/�����i�~9���.-/���}��s��n��g����?����n����G��y~�x>���ik�g�$�%P?�0+���D;��Z/���'��i)��������Z�h6����z�\���
m�/���Dmr6����rI�:j��
����4��`����I���#�g�&�'M�����o��������~^|�OO�L��������y���������i�|��~9��k^4��o��|~Z|�|������e�������>Ot�����2I������?f��F��/���������y����I��g���?=��z�s��7/>�����������L�4[f�������?�����������O����D��G�Y�p����/+iz�4�?���}�'�����g<-�Y�+k����H*o�i�e�����6xf$�/:��7>-�?:l�����������V]�61V�M�o�h��W���<��f���-/:�/�4���~���xtZt8��\�I�$M�2�����O����o��<�q���t?���/�}�|�q���F>�yl�|���������s�7���r�y��G���x^?n�q����������D�7:��}��t?�&��N�������/iZt�nKt8���x|Ie���i<��h��p4�
����������#�?�<?-���_�N�V���,�����tI�����y��]6:�����'-�_>:u�e��������m���<�]��e����;�[&iZ�,?~���~����#��/_o<_|~������?3���r�;�o���'���z���T�|��<�����?����������������?���/W/�\�����V�������x��x��;-?���yQ�����\��o��m���\jjvTh���&�����]�t�R�m���j|�a��is����gi�$��`�}�x�T��?6��Z����0j�}[�C�����9���Q8zL�YZI}4f�5������(
��9��/v����.l�-Z�A<�M9����)
���\��zZi��5���J�4�)�MA9]a��4���������KW��� � � � � � ��*h��5s�Gk�D�m��xt8^^��3k���I � � � � �a�����g���-�����������yy���e���r��Q9y����~d���r��a�E�8�z�j����a9x����>��;'���Y��#_}�	�<8�&���;r���u����TV�\�0���Ym��n?�����4-���h�h��F@@@@�;x��/��t���-`���\��n�����
����{o|����@�e�m<|��X��C=0ky�xd��YA &��UD�\�,��7IOO����5��������E�&�_���c2�uH�x�
�i�6�� � � � � ���6���#�Zc�^�F�5|��|-����Z����^�*M�^|Q���0k�X�%^;�g���+\����|V����[���Kgg���4�����\0'^;���O�M��sg����>��������Y�k����

��'�����{�]}B����c���2�@@@@@ ���o�-o����h��=��/�d�����{��g���`�5����O���&�,�����XMK>��Fb��tk0F�����K��3+��ii����.X[��Zp�@M���R��>TM�����
y�NN�T�����m�G��%R)I�sR�vV����1�`�dD�TJ��Q��4����wM�Z�/T�	`r���rr��9S�aM������0
k�5>����iPS���r�����^�5��=���2{�������g�/#����Xm�x68W�&z�|��h�x3i����&�<�$	4u���f � � � � �������c5o�I3���|M���O=�t�f�|pg���b�sX|�������m����&��c�1WY��#@��s@@@@@`E
X d���n��O��������o�m�VX@����M��}ZM�X�2'O�t?>�T���5�>h�
�D5�?�\���}�re[0����}�<��#�>t���D����z2LG@@@@Xu>���)��2��*M���M�?�}|p��E�@��T��A����L_['�MO_o�"�_�'�71#P�5� � � � � �+R����wgm����Y�k������,.^�IcM�}���-k��ucix������s������xyp����n9�������-���_��>���+^���O.����������< � � � � ���'���#.`������q�X���->�Z6~<��q��ho�N�5l��Y�(����Ng�z�]{������	�
y�N�/x��H�y�v��N�$��I�8�0�p��=25�R)l��\�a�~V+���\[n+��i���}S@N��1g��4�)����V�aM������0
j�}SPNW��M)���f�RI�@@@@@@ A�`M
�@@@@@@�� X�T��@@@@@H X���$@@@@@@`��,�4�A@@@@@�$�0	@@@@@X*�5K%�z@@@@@@��5	(LB@@@@@��(�����������o�"n��E��h@@@@@@�N�;e`> � � � � �4�@Ww�<��������J.���W����='��I��V������?z���<y��U��u��l�v����/��C���l�����c������g�yF:�����s���/�������I���
�����?�H�z�iY�v���5}k\y���5>.G�������6����v����n����/�2���-���YtV� � � � � ��rds9��k�|�;�u��X �6[���������o����i�F����,cc7���n�7o�\[�c��|�E���������.P�x�@-�ceY������n[������w�q�Z�����{�{���������?��w�v�>���\�pQ�����}��_z��Z�h��	��-�<�E@@@@@`�,��k�������5_6l� �w���<�������{m��V�_v��v���p��0�l����-`�y������;��r\6o�,l���'�jA����HJ��tw�y���o��7kym=V�%���G���i�4��[��k���>�����'��n�`�r&j�,�>�F@@@@@`�JSS���_���M��Hww��i���@�6�f��������+��oB-���Y�d���7��]�Y0b��h�k�]�BA���m�45Ur%[3jV��W���Yk���Y�x�`���:@@@@@V�@���F�7�GM#eE�4~��)�����GM|{i-.�8 � � � � �- `}�tv~���5;f�����pM�YM�����7\�0�Y<�5/��N����&�~������_f�X�R�t�>�r��V���1d5pVZ"X����� � � � � ��	X�4>�b��\��_>��cy��wdx�p�/�������G$n��?{�B|�0��~��}���r�<����yth��/g�Xk��	��.�������c�����|�O������������a�������f,���-18�C@@@@@`�X?3���3@IDAT�D�m���'�j�<��S�M}������c������Qy�����G��scM���~���{�b~]I}�D��+s��{��~�C�����6�:l���o�������_��_r���������~l���y��gj����9rDl��3�v�}��"H�R���6i3�[�C��"R)I�sR-N.l9r��������dD�T�����,�$�i���O�����\��2Xr���=���A���\��a�1
��K��%�}b��J������7'L��6s�]��.h��'N���X3��������O~�c9����5�A[���
C@@@@@��
D�^�����n�����W�������m�v������_�~]Nh��<�&nt��S����$�����v����q�e��&��h�D@@@@@�C��9{����)��6���]gS7�600 ;w�t��r�,��S���	y��7���G���������[�u�����I�\t8����6���������DxbL����DXO+
���4���J�4�)�M9����)
���\��zZi��5���J�4�)�MA9]a��7�D�J���A����b�(���4���S[{���e���'������\���nZ�j��jgD�\����������Sl:	@@@@@hT���A�)���$����5�[��6����t�l|�h6���S[�M;���������b���B����55��-�1�7Ha0
�)������(�AMg��A�l��0
vp����5>����i`S���A�8L��r��i�a����`���V�ii�$�J��� ���@Sk.]���,?�s%���^{Ml�O7�V�O6�����d�8��O��t^�Z�;{��p��t�������	���:9���n��a��j�C;M�Z+�H�@�����������A��-�����p�\��Y��0��>�����i��A����K�4.��8�M��%-�L3m�I�;�@`�@Sk�m���������Z0���=��>kf3�s��&��P3�[�3��%Y(�]���<��@��6�s�jg)�h8XL�YjI���8G��b��V�M5����7���0��,w?Q��r�t�|�Kb��r�����\��0�os�s�o�[����x���x9t����g?���y���.���~T^��i�9mk���_<)����g�^�~0q��m%�����
�n��S���7�'�]��M�g��Kc���;w��\��7���Wzzz�q�&Mt8~|�g6��?�q � � � � �����~���O��.5����:������l�����56���l����l�-uHj�,�,�?"I��E�E���D@@@@X�����!��?^+��^�l�"��Yy�_����$������~�Lm���-r�Dm��i�e�20�,}�n�5���?��v_�u�l��oI�������jT��������X g9kX5m�����_�|�5�v��YW�fh��'�26�W���M�Z6V��j���dqR�n��-���o�O��$@@@@@����W+@����~(�����Z�nMd�x�lb�W�-����l���ce����4�[�������_~��m���].�f�(�)�N�����\`f�\�k
/�����k��>��X�f�����t���8qB,�322"����G}��;u�}7�Fdhh��������G�O<!���r��1�� � � � � �4&0r����X:^��?��.������\v�|m�������7��1���5�eMm��s�����^|��u������0>�����W�Z��j]-Wj��5�j��OR�`�����K��~|�Z4/����@@@@@`�k[$mr�P{�oM�Y`�����M�Y�i�0������YE�{�?+#�C =�<dA@@@@@��@�Z�l�.��������n��4��5o��������_]�Z5��M_�f��`@@@@@���T1#�`��:<pY�~P�6�u<?��������6L5�2�0�d�����v��)d��Y�u�T��=�}��t��t��6k�L�m<�]n)�go�R��u � � � � � �B�Z����u����~h�/�l����������A���o�^��~����2X�u���������&������<������.0c��h�v�?��-�S+h�hm��Y
 � � � � �����0?���d}���7��]�����v5p��"Y���ky�_�����������j�X�(�u��W�M��)�k�C����fY������H��H�y����K�$��I�8���n�b��f�-O5�R)l��\�a�~V+���\[n+��i���}S@N��1g��4�)����V�aM������0
j�}SPNW��M)���f�RI�@@@@@@ A�`M
�@@@@@@�� X�T��@@@@@H X���$@@@@@@`��,�4�A@@@@@�$�0	@@@@@X*�5K%�z@@@@@@��5	(LB@@@@@�����F�~H+C�?U�?�</��|�~�sl���;�R�%���Pf � � � � �M!`����~�)��v�5������)�v���c���U�"����z��e:��eag� � � � � ��%�i���3�+=)�R��~I���?>���Z���G5��,��me�e�5;,0`�����Z�f���n���?����r��S���#[�?���-{8s��2�������Z��69'd�s��@@@@@��,��h���>����vuVM�5��������o
��R�<����	y������<�)����|\��_+\w�}y���.�o��':�6<�����4l>Y �t5'/���$��m�5�f�2<��t�m�����+��2.��2�Y`��[z���>�)���rV6�q�s!�9*)�377�z��/�+�v
�w��@@@@@`9�,�e�����3W���+���JJ����[���%G�m��6��3��&?n���?�'��T���������r�ZnT~��a5?�N�����{Rylt�������lI��#U���b>�U3\G����$O������7����I��������X#�@@@@@@`���������K���Z~8�V��b�g������O�\���3��d54����u]t���>n����I}�X��'_��j�Xz�T�	$��Z��4��U?���U�<�� � � � �4���x����6�%k��?t�w}��`�uH�e�UcA�����1�����d�,����q����T����GV�4 p��\3�L%+���J^�E	�,�7kC@@@@X"kv�^��2k���o
��wL�mc5q�}����\�[Y>X`�l]���on��5�O
+�k*��r[_@`;�5���4����F3ha=)
@@@@@`|�1��>��M����OO��k|h�!���~����.k��3?��Y�O�7��L��2����>j|~>G��rN��:k��~|���o����O!?�}R�f��@@@@@���T���o
���B~sb]���o
��G�@��e�_���h�&��y4KGJ��>U��o���l�2���P�nF�O�sq��w�x-�Z��������z8
_~K��*��:9%Rm>�f��%?IS)I�sR-N.���v���=���NM�4����+i��0
{��Z1����r�r[�4L�}��rr��9S�aM������0
k�5>����iPS���r��0]����F�j���}k����r
P�f9�Y7 � � � � ���Xsg���@[��`�D��&��  � � � � �@s<������yW�1#!��M��}��9���q9v��L�4?�m�}�c�v7��������G^�7;��ioo�x�0@@@@@`E
X�3�G���mc�ZW���A����={��k��&/����;w^�=�O�������I^~�e�c�6-)��%7��pe����@@@@@@��j��yy���e���r��Uy���e����4Hrst4��.����ur��e�t��[�j���36�8Q���1���,7���6222k=V����W�{�=7���?������Nt�8�YS3��r3���V�����
,��b�4�	Z����N���Q��������0
l�5>0��iXS��a=�4L��r���V�J7-M�$S����������.�;��#�w�����3r��!y����89���V{f��~�|�J�z�:;eb|�j|�Om�6�&#211Q���e��'kD��T��Z�fp��t����RzB�9T��Z�U7��0
|h������R9p�-\�A~J��K��lA
#�iG_
�M^��O����K�4.��8���4��'q��{�zKbZO���s�twns-�L3m�I�;�@`�@�`M�P�l6+g�������l|���b��:X�7�\.�c�=����M�U��
'kl�E{'������z�j�0Xc����V�x.�t���Q��'�av�21������Y���st�psd�t���r����9�p�:K`Z����75�Y�k|#� �� }1���&���@���p���
�t1L������ES�x��S^s����9���~D���&^6n�$�v���4;D[�n�c������}�4��c/@@@@@@�r�A�����G�cym����������M3<<,t���C_���z�J�sG��;_k����yp��Z�g���hM��p|{���Y�g6NB@@@@@������c�_�L���6����������T��FN�<)��RY���>i��7i���Y�Y4�\R�g���O@@@@@��#��������"�>�x�oH�xUn���H�2�jT��tm��>=&���ym��a*�+r�� 2y�V�M��,@_����H@�m��t�_�c�$�9Xw�������-d�f
�,�6�u��\�Dv��)���u�k�����17|��e��Izzz\��kz�j���dq�-c����-#��q@@@@@��	XST���G��aM`E5������� Sg_���g���]��t��&h�ib?�JW^q���<4�����������UK�r���'��i���<��� ����ny��g���=a���JS��_���/��z��K�\���q�y��u9qB���FFF����������S��w�ld``@���\^�����w��#��'�����eo��m0� � � � � �M P�p�����w\pf�hM�L�v)����Nv�)�~P�^��S����hm��7��y��jTM�����
���$XsstT�^�*^�1+�a���^���
?��#��s�Iqrr�,`������N��@�'�l��yV����^�gc@@@@@`
X���6��5������k$���tO�t��?��w���Z����nfed�
��?1�����������o�6���p6��\�0+# � � � � �,�������1n���]sX�,�%k��?�+�;6�5�y��@��5#Z���'���G����'exxX<�A�sb5o�|n��J%�*�zcY@@@@@��
��0rB2}�K*{{7���e���$�M�uh'��������Z������5�6k}���@h� ����kSc�6m�C�� ��Q���=�������l��i��l-4�!� � � � ��|���������E�:��j��E�O}zL�ci5�Kn��Y��Y
�����T&�Eax�Xm);���������5����_�o��7o�W�������Mg � � � � ��&�� �5{����+����#��'j��:��n��Wc#���2q�_KJ����s7���4q�_����Z8$B�v�}���V-/U�KurJ��|���oK~��R����Z�\�U7�
1
{h35��+�����a��kx�Z[.�-��K�4����) '����3Ea��k|XO+
���\��zZi�5��)(�+������R	�Y����o���q9r����&>�q@@@@@@���k���������c�e��Vy��W���+���O��	���Y��#� � � � � �@]�t�9�Q���k����6��yp�''��W���-���9$@@@@@@������*�k����{�|���r��A��;�K6��}�LA@@@@@pAj�X-��~��255�A��r��Qy��#n��w��f�8�@@@@@@�:Aj�����?��r����0 � � � � � ��Aj�X�4_���d�����b�6�>kf�0� � � � � ���Yc��C�K.;�/��O>U+�\�zU�O � � � � �K!�Ww|(���.���{��W�����[{]~^���{���3����n��>�a�W����67)����2P�r��o�l�zN����w�?���c.�K��V�1o(Xs�����|���y��'�'?���4 � � � � ��%`�tj�k�@�o��P���JL���-�����@��5�3�m�����kA�3��w,�R���5~o��������Q>@@@@@X6�x�?�{���W�3[�K����7�eW�-�����;��r�m<Z[#Zc�sL~Kkg\�2,
uN���[/?��[�2�w57l�@��������[O~������UJ����2|����V�C}��w��O�+������g5j����7�%�U��}B���;������8���_X���A�5v2���o;/n����#G�:$@@@@@�����FG�j������3�>�����1t^~��L��lI~�s�k�j�BI50,Hci����F�\�����qY�[4 0�����y}�?�g������������`��hPk�N�@������� � ���3��&�m��	�tuw�������z[�?�x[K� � � � � �M%p�f���O���=������o��P��p��[|m�?1pE�imm{-H�������N���|����e��?��g�,_�&��N�vN�2Zq����=)S/og���)�:���d�A�5����)9{���m8+B@@@@@`!������-@b?>Y@���d�2�vF4Y�jV�c���5hdAK�����������!6��8;{����{��(@@@@@�'`MhYSZ�$kn�j}��������O��d���g��S/�X9��M�?�T�RLR���A���m���.���7fm7}���`@@@@@`��������w��'�q�����}�5�f5p��:����v�W��<��v��s%���i����kA�7����[����F��/�w��n5������
���5�����z�Y � � � � ��[w]>�����'��N����������}�,$�`�����W�.j�v��'g�������=�<��xsxY�W���>��9|�}��_����g�Y�D���=&���7j�o��+�k��f.�@�f��h[Y
 \ �*K*U
^."� � � ��{Xo��n��. ��b���{C~�o�=^������;�~���[�O�u�Q�Z=��%��&�-�L�����>Q�(�d,�=�vl�}nC4���v�}(�S�B>/O=���]�V�^�*�������~��/���i��*��:��V���(�f��%�N�$��I�x{��K�-���L���!����'������~d�-5�R���(aZ��gBV+���\[n+��i���}S@��������4�����J�4�)����V�AM�o
��
�4��R�hM����\�$,w
���g�q�@��5>Ps��E9z��[�������r��!��$@`%
hHB����$@@@@@`y��Y�+�����=wF:;�j{b���l�_�\�Z===���]���������';vlw��N�/�OP���@^k�x���������;~L&�%b�U+P���/os����
G@@@@�0Aj�X3g#�����H>7]�f��Mr��a7}��A�h5�]�vI6���Y�fp�&y�����
����kx���~C^�&����I �$�W��Z.l���n � � � ��/pr�S~���o�5Lh����a�`���}
d���;���G\�5_9�9��I7����hF��
R*k23���'�266&V����b���j�����'�>q�>��#����NB��/0���J����$�@@@@V�@�f�l��������}�y9��k6l��
����l��*CCC������];kG���S&�'�o��:'�i��Vh���E&&&j���������R���������y���0Y��.Y��� ��~��UR%
�f�A��
I��$��FU��`��`�������yZ����-�K�4�Q��)�i���kRP-�`�� ��a=�4L��r����Q�E��r��TV�i�R�T��g��(��)�iq!������3g]��(�_���K�?���k7m�����
��CuSk��d�I��_�*�Dq:Xc�6^/U�������=���m)���.^c�
)�@C��gM��7����VS��5�0��q���_���,��5��0m�0^�Mq��o�w�l��0
{�������0
l�5>0��ipS������R���E���q+V�
k~� ��\� Y}����3��l��[6�Z7��o��A���#����t&������F���o��VN9ZcH�u��ZYo�D�Q�j]K���]_�����C_������X�d�I�#�6*������|p�~����
���).r��
\��~�M�$��0������g�����qV!���h|����
�%�S�s|�G	�g�T�(�RI"]�Hm<������#C[�������:��?Z�&:�c���3���l���!�_�o�4�3{� � � � ���D�O��.�����N�<)���n�������Uc}�������M�>�����k���Y�Y4�LR�g�f�|>>@`u
�M�����:7��F@@@@�&�1����=;t�p-hs��Q���r�������K�U[�h�{P^�u���	��I?{\��5�������+g���X-�7�|�}��M'!���Hk�,}���@@@@@�e���?��|�w��L����Z�����b5m,�:��������

��'\j��|W<r@�x�	w�)�GB�&��wPEv@@@@�U-����!���B �M�U'�d���%��2�y��\Y;uM�sR�vV8�L��An�\��7�]S; ���u>�}��	`r����kb�M��p8WL�YjI�7�l�p+��(L�O��a=�4L��r��i�a�������0L��R"K%�����n����&�6mQe �K&p6�E�3A+.���"@@@@h� �����2�?��4�
{��!�o�W���Y��q��K@@@@V�@����f���k5X3({���������#G��tH ��J������t�� W�qa[@@@@h5� ��|�[�j5;�V�@Z�f��iRU��Y����G@@@@`U	��@!����~����z����������{/�@��U}���4�@OuJ.�*6���� � � � ��\� }��@������no/\8/g������@��%`�@�e�/`OeJRA���";� � � � �
yD�+$����sgfm���t�OBV��uUS���[_i��� � � � � �@		�X�5#�����H>�w|7n�C���6���8�tJ7)��6�
B@@@@���g���o���a9x��������o�-��k-Q�V��uUs#�-kS�W�6�� � � � � �|��5Fs��I��|L�4�@J�A�^�G�������>!� � � � ��*��*�W6�%�����s�{gMg@@@@XJ�`5k
��<����v�����=wN�y4 �R����z���FB@@@@�I H��jn���w�����i�>��<��sR��\�]d� �@���h*����@��M�S@@@@@`��4��+$����o�Y�^����q7���@�'�7��i���5+���A � � � ���@�`���Qy��7����Q�������3g���@�'���uHY�Z����V��a�@@@@h� ��uuw�������v���}6�������M�f��9B�f�c �L���T#�jY�5Z����2	V� � � � �@k	�X��o�[�-��#���HU4D��k���N�lV�>�� � � � � ���4����hEk��t�>
�T�?��x�� � � � ���O����V ��2������T��Nk���J@�zk���f1@@@�	�4�Ae�@`~��V��L�N"Z3?5r!�,����������	{m�� � � ������6 �������jZ6UB5�rX) �@�@:]������V��� � � �
kZ�(�� �(`o.�uNEC5�!!� �2z}��W�|�`�J8l �@����1i���g2@,@�f�d,��"�=�_,���X#�}
)�@�~q������-!���5�rJ��L����� �,��I�U�2L])���d���q�Lu]����!)X�kV��c�@����DiR4���d��v��:&�1@���kz+U��`$h]�'�F�����U���L�oQ��T.S����*�b@V����z��nh\@5��6��?��Ha��\�2V��@�����zm�s0���p��G�	�W��6CS�|���=z~j���Dw�^�3�CBh]�l3�z�������v����_�'N������m�Ov�����:���>�A"G����q9v��L�����DV���l���Uo�
�X�h� �v�.)��h!�'� �@k	dtwS��6m�3���L�n���E`F���!�-L��b&�H�����	sh���U��Vd��jUJAV�@�^2���{p��;w^^x�y������{������������_v?6l�����]r��
W�}�8	V���L�T�oE_e\[C�`
)��V}��e�,�y+<)� �@	h��j}���M>MSh-t��U"U�����kR��"0��F�4�`5BH���%����K��F	,�@U>���bL� h��5V{�����]�������u�b����uR�(�����is��
7mdd���
X����^y������>�H�����'��Ie3��zVM3�������6���Rr�u��iz����NK:��k�\�������X��s�m��*f�=�e5P���L��B�"��i��Y�1��n��ZKp�U5��~��t��L�5����7��k������?�BV���{�P�5�Z2�o�0���,�5>�M�VS�.e��H��I�s�i�L[C���\�k|F�v/����{Tk]��4����>�1_�����������z��0��������)��d��:��e�<��jM�T���.� h�+jd��:;eb|��$���i��V�*��4lb��N������'k��i�`M3�[��/�����5��m17t�}����Z�F�/���f�������:����n�m���wf5X3�7_����N�YaLn���=���Y�z�F_�,�9]�#�����8j�Wo��)�_^���}����%?�&����+�������}Y)��i�#�X�x�R�]&e��i�F�r�:��w��_��-�����E��E��[���JI�A�����R�"�Zu�e��N�@}��q�oZ���U��FL�z��5��n��7cd����+2����~_��������@ .�2��!38��5�������j|���`��/M�d�8��O������/�ZA�u���E��7vZ�K=��A��)���1��+-�Pg��TY�u��h����A};��V��;�IN��X��st]�(��S��0-y-#].�-]���9�3���+Q�5z��O��s�p�v���s��.l��%W&
R�j�����b���[�����~mB2]T5�Fu��=���������j��sc1
����t����.�i����s���]��0m!�Y��X�x{p����������j�,�iJ�3���;3��R���g�fi����8��O����;���I�J����^T[#�����}E��W��"���BXa-����_S,�cm���@�
���n��j ��&%��w�5p#���{{�\�R��`?��	|��}MM_^6���2GZ4=o�-<R������?HLJiH�_�v��l�g03�PY,��T�nMgj;o���*=����V��nC�F5��/����M�����5��I,�����|��\�w\��X�~��/5k����'����,P��~'x��	}1Q���hM�����?}�g6n���8	�)�����9i5���3pOjj��/���t���0)�;xH6��m����^s�9S�f���6�@�
9S������vw3r�.�������#K!���e���{*{�KB`�	�[���=�]i���'�}�V�Q���e����c�Z��kF�W����������wR���n4e�]�����JB��h�`��X�4�����6��y��%5{m�/�'+A���]����\<��Y�F���ZH�U��E��[��KpA�o�L���+����g�d_��=;���8�50�gM$�����wN� ����u��y��O_i�
�@Y�U*`��.Z��?���S��P6�f�[��]
o��9�������IQ���1	�%�{�����t�����Z!�d��uf��?��~�Fp�^���'����=��8���y�6�+W.K��^���q?6l��i�8)c7�dh���e�6n�I�4�hvOi�i.�uM*������
�[��ZY��Io�l�WIn���-�"��M^���A���7pH�#���b��)���5�w>%�4 `3�D�56���@Y�U*`ML���g4Y��I�${p[����0�Pw%m�j��~�}Oi!������j<��v��J)y0�Y��Z���5�,����p�Z�����1
� �hM��W�����^ioo����������c222"����G}��;u�}7�FdhhH|�i��|W<r@�x�	���
d�$`��
��&��m���d��anPZ�������������Q�L��/�������5���H���\�V�������n��,�EK�v�W���7�]��������p����[��"
���:�I��F�����hX���[={Rc�W��>�,��gc��K��{�����\I�}��<D���@]���I�T�]e��d�O?���Z����t~��������R����!�6Xc5_^z��9�N��@�'�.]�$���|��y�������r���k��/D�9z�J��7m��B6�����LH������"2����ml�����m38y��g|��=D��n�"������L`0���(W��\���l�����LO��%�XQ,��:��/������TF��(D^�d5]����@�e�f�����^���������q�����nv5^X��`/de ;���5�f���C�`�Ss������t�*��PF�-����qI��:�?��{6��������"�������D��R�<����p��<s�m>�e�[�7p�2W�K���=���$�Ye�=�,�w�����\�T��@V�`��&����#-��Z
>�&�����YMK�jA�����fMK���Z�S~�rSvv���������5�B3h+���1�,�>W��L[���)�������'�z�jo2�����6�����4�hL��A�����w��~���}��XJ=����(L����%5Sa���:�R���������_I�`�"�R���A�C�y�����5��N���N��x�D��_>-l�_�m��(��l�m��� �Z}`F@��$N�h6���eJi5~k��8����Go�	04�k������x������f����_��HN����#_��������\�!�y������.��V������}��{{fR�*�/a�l�R��Q�/R�I�J������~m������$�B������^f���-��5��n�I3�����I���D��h)��he�5�|��y������S%�bIc��EF����7���v��RJkm��L�Q�W��H����9���#��|M��Y�n�#�Z��6<���k��o��
�oZ��#����}Q��ky��qLJX��}������*�������-��&��6)�I������IM�p�N�K���LW�.�m�#�x{g�L���N�w������B�l��<���5\^����v���N��R������dK���[.�������=Q�g���.���OC��
��<dEj���6�!0?�5�s"�"�k�*�RF�oN�>��h�"w�&i&�}2�)g:vH��i�j�.K����gn_RoZR��3���i��t��[,�s"Z������&��<%��T�|*;�����#5���97����kQBH�]�O�����jQ~�s��J� ��=�Mk
�������+�,V���Otk#����fO���g��E	�6��/����b���S���0����i�{�4U@'�[���}��p����knH.{�����n��w���2����U���z�g�����R��������YV
�����L��;�<�;��'���X:tO��7��6C&2���RZz+�_�*�A���X[�W��5���Xn��&i��4�-����eE�I"����JE�����5B��6��O���*������Q�n�~�%�v�go�k��8��T*Ow��=��?Y�%�rN~���d2����(����)nU	X�4����.M9��Qok�E9f����6������?��D���r}�P��(a@IDATCj�LC�/e|v�4\f+`o����f�����lr�����_H��yJSSw�Y[��0%+E���Dn��]{U�����g�LqM�����������babO��J)�I�~o��<7�������7x��&T-n,_�/�;w������2R�o�%����o��co%e��Ga�mR�mk�\���9�C����2SY���t%���RN�����z��F&�^D�����~�6���7K�
�m3�Z�@��<�v���h��rN��JN�������t���i�lE�U��dszD�Ew~f���1��o��`���/36FiK��p{�����[R��Rz=����ku������������������+	�VX���?�y��}����;���b����O�GeX�5Ur�������[Z����>~��E��vA�{�������-��s�����R������,Rc_��%��]�C_R���/X
g�������_��G��;�^�S���j�������,�����s,�������B��+/�A#����+����D��y�Z'���]�*`_��'����M��p������(kPa"�&�s�$�M�TRm�L�B7�3}bfu��yJz#�F��Ik^����~�zZ9qO���m2����HA������;��� �V���~Y�����^iv��aA��YY��������xG��8;�	x���N�K�f
|������Z�O_�����DZ�E3�����{�����u��^��VxX�m���m��`�����vY�/�fj�wj�h�X�>����R����^���m�]\�]���=t�d/�p�����JO�����j�5\b�`�����9G���}�i?��h�K���a�>��w���sc:�qw��b�� L%W�����L!q�6��5���o���K�LLD ���`��_P�~A:t�� ;j����E��&R�v3gm���m���-q�/omw[p�b3V�%���,�b?6���_R��7�A��
*������:�U��6��_�����o+����-��7yk�a@��[�&��5��b�oVr������;�{� W�A�s}�k��!)(���u
���9
��[m:��E$�n��L�1d���X�	��P������c���X��k��'�{k��8����|��A�%���]�xP[�a�u
z���Y�8l�6C����V��^#���?�yKt�_�G�)�u��u��wim��>�&�{�h��=���H
	����V���j'kCE����=�-bh��m�tX�Y��UmsC������G�J����
Z[o�'��549�/	��)Y;kwJz�raX[��F�k�Z����s# X����Z�u�l���oz�<d���/e�r1��o6�ov
��v_bm_�c{��:\����y��%���o��:�a���:�[�6x��t�:)�������,���t^V���O���tQ���������h��;�a�W�yM.�M�%���MV>��'?�}L��
�j��������m�Z�s�������w��;
[���#-`��^�\�9�,@��!>�o��LJ�c��40ca����
��HN�|^n��e�6;��������
��a[������l.���9��G������q�3�1��1���Y��?w�i;��U��f��%����9�}�mA{�-c�����t������Q�5|;�Q�W�j����>.����V���w:����[M:L����f�������eodL�"����<�1��Z������~/�����V�?t�������]���l����bA_�� ��=��R��C�=w\��)�������G��}��G�c���uH�9��A��-���"�rV����,X�
��,�?b�<�
[���|�M��g�!�?:�~��nJ���k�&�M��R����e���uZ#�R{#�������;d��s�K�=����+c=6�	nS$��5�6�T�H.;"��Z:�����������i���YJ��X��������pH�	���=l�����A�����&s�/t
n�7���SUrv����������/
��B���^kM��ru��5��)�f�6&����q����\Y�����v�5�w^z���/�lT���9�o�ZM�_��H��Eh���{�fIVS����dq����VK�����@�m������:��/E�P�-�\a�h��|�w$��4�Mo[3h���}?"���f��������{V�����������v�@���{�eK������L;�IE+�����n�����Fn���._�U��m��������������|T��`���N��/U�{5���4"���F�Zl�n����R.�k]�u�g�Zf�7Z������E�>�[�tz@�k�����#��b��C��[A#,*w]����z�N�TI���4X���|Fnd��f�1S��B:�7��n����
���j�������j���+�rN�����N��+���>D+�Z������6^^5r�:��j<�M��K��}�v�7n&�Sl�Qc�B{�p��G�L���NI���3*��V-I�	X@q�~qI�7��K��������dl���)`����
������\J������%��3Z��/��]���������6f�M�
�Y������=l[��q��wtg3zo�U��9 _��E>W�����#�Kk��������U}�����B��)�ov^�uU�������]�f���i@�`�'������dK.�K>e}��R����/Eg�M����Y���5Um��l�}r������ �i�1��n���%���Z��u����j��J���=09���2gD��j�����ev�u�W��\��5��/Y����7�����������n��Y��;�����6�^����l�E���z�7m�������6
��M����C��^B���������S�[�������[� ���[#��e}��5(�Y�����euNE�������J h�&�F��oJoV�\H��K[E�g&�m�^�n������>He��^�h+]z���Z�/�h����c�p����P�=Q�G:�W�i6k��FuT��;�Y'�5�u3��b:�6Y�����u�3]k�w*-���0��)����0#5&����`r\��oM�is�X��s 	0�$��H�
�(�
��m��{���g��>9JV�%���HQ��@$��7�8�~�3��;�
X,H������}����s*��_jw�8�9�dX!���}�l}��T�e2X�~
o����{��g�=z�_�|+�j�������W��H]���/���^
];, A�
�����;%�\���3z���:S��w%������Dp�t��r��0&H������W�)��~O='6����(��Q��>8t.U�_V��q�V��W�&��AjA����f�Ub1���r�wFz���\��.')a~��9'�:3�����I�}����	����Z�h�������� ��Y��N��Q�t`�������\I�Z�2wEd���s��P�^�:S����K.�E���,��������!��y�����g��g���"/e�7?�Ga��1Z�_���l��2�L�E�&{`B{`�����|o7d��)W���:'�LJep�|o*^�Wc�_{��"P
�|H2��cU���i��u;e����5���U��E*W��M��)-d�A�tRJ�?0�[�]�G@��6����yk$H�N����S��f7��>�(w��w������x��!�Dn6�����%M�,��t�s]�W8Y�n9�$k	��D*�I��d��B{���uv����������^��o4��F��^��������dK��P�AB'S��Y��A���`�R�8-�N���z��YDk�d�M��RL�5���z+�e�j>��e�2�C,������v@5����]�v�2�����k������7����"����X������&�~�a8�}���%��P���Z^v��3	&P�
�]�������-2��������C��)J�����R���QT�Z��.��X
���G��/NX��O���z{x�zN~@����;b
������D��.���������l�Q4)d�:�&h>�F��A��w������^�)E�E����^;��$3�u+�����xv"���6,���U�G�������I�\����N� "�
��x��:K�]fN*�#���O�=pq=08{]\;�{�z��E�=9p��$����Bh��[H8����WE3�'|r�[���S�>�()�u(�����38��%Os����)sq~V$�AF>�(�N	i������H�-$!�.6�k&��d�U�������p��4��5Xc�(F�`����Qrt�Zh;��9D�x�=}���%'��R����kz��Tf�vk�K�&
������k�+gGV�1&?���~"�@�C}x����Gz�� ��\%�M�7�.��x����U:x����5�4�K�_fRg`R.�P&�"��M��4(�F:�8����
�D���N���'��u��+�o���������o08��:s����> ��2����h����
�����p:������Nm�8�V��O`Jd��B���W��	u�=��������S�	��z�UdT-I���d�,�@��%����'u�NGyPl<�-
3��f���!��>j��ru&\�1Q�x?����g:F����B��5N������@����u�N�	$��Lw��Q�1�9�����K����\gf<5b?����Hq�P��WS����n^���eR�b�St}sB����1��^�������(�����f��7�e�b�-s���z7�V�R��Hr�](>�Ba�3�
�yhH��;)�=0�����m�4�2��e�ZA���s�����;����X�g��_��_��M,�n4����vhj��	W�t��Z���B:�qqW�Y��7���H3
\�}(��RMQ)�u�m�B�&U������.����Gnv�J��T��>L���������!d���k���)�T
�����f��
�l��x����-OO�zG;��A���=�/@��'r5��\��y���+*���F?�	�*��pTa�s���h�}/T}}q���b"�y]���jQ�{0m<���n����<u���(�n2J-���r����o{�A&l�#<����N��h�S=���E��)(=����U�����I���/�~QCFoN�.E�4e8u���5� ��u��W���W��i�=�y=�L���wfq���g��S�#���NeF����|�����8��w��P�����1�������4���S��^��/��m��>6��eP��*�{#�&�}!\/���2�����]��U�uU��|��:w��[6�5�!y_v9����/��*%����'0%��+�c�1��^��P���4a����]�kv�tZkH������Ru"K�FY��
���Y{�SM�o��)�_Y�6���Muq�p	��C��	�Xi�����R���z��0O�]�}��d�6-R��>Q����%����u�������Z��'��t��������6"��~�$J�W�&G�I�r�,����t���&{�����y�~��w�5�S����)���ha��])�+|@��2[U$&Z���"��DDyP��b��@pA]u(z�v��#�5��O������3���?����*.17�h�A[��d- X��j7NW5��
��p�j���b�g=%���rB-��C�u��G�|Ve�Z��F��%�s��8
�W?�������:�H_9��9�&���9�"��>����6��/��.����#X�+Mk��q�`�C#7[�-����"qzZ���w8��K��_N�s��E3k�p�����"�8��}�����~������v"�9c�O�����B��2��z@���	��)�v��-�C���S��I�t=���"�S�a,�u
�\E����x���*n������S����a�E/]O&[��F���i�q����j9�2�a{j(�~�c|"
o/���<T����2� �'�� s���#���$��r2��#��\�C�����E�X:8Cg�A/6���*
�]*��v����~,�,��		���#�f	��M�@�R��Zn����#�`��}.vSv�J��F[T�l�����>��7�����Jc<,�A���4S��T���c�j$���Tj#M����J�?��T�0�Jy��@�-s�h�+�~
[Cl����{��|7����J��&tPS����/�����)��5��/������r��[/�(��IO�SK
����.�������{�r����vG��kB����C���U���G
oc���,�2WB~�Y�:�Y<�nn���o�d�������<��zq�uX�����0�}4��d��=0q+��}�������Hm`�h�K���+���X�8�����Bkj�*�����o�6I>���B:X�b�8��y=���f����-�V�&�����G��&��U��Y�j�v�J[��<g��(��6����JMppO4�I�A}��^��j��1�_��S�#i�%��6A���8T(p��f���A�����/
e����J��f�Em,s��9P���j9��	i��$���A~�_n�xo�\�9'����|������Jp��\�G/N�V����#!s��o8�[N���7g|��������u�����������5�s{Q���g5V�\9�	L��mR��Y���y�E����z2!�S5*�}r�;�g{ ��;�AEN�
��G|�\�3p|���X���|�u���T��vJ`��������X��Z��Q�9������
8m��n���@�S�9��I���L�w`	B��������TH���C�L����������Y8��n���+��&���M�
�@e�6E�xp0.�$�zKO�|��
����m�Q`���/�����8����$���i������~.c��4�K��z|�����-rC�Q�/ ������^��Q�w�
�5�'j�)P�0���������N�R���������-��J�}��������j�������P���<�;�D~?����Ov�)�G�
���D��#'��|�D�Y�B�mEd���������'�e����Ay#�\J���T�����*����NT���}s�+����Q�g��B����y���<�"!,4����~MI������6W
��<�t���3����GfRQJ���O)5b=��>�<�>'&]�~W�����*��j��x�����dz�J7>�^h�����WY�`��`�:�d�w,�A�x�_���A,J�Y�����5�01p�����}��w�>Z�f$�tGY�r�Y�fq����c��2��&�����.P��/��?'�/��{�`=s�����J��=0����>�XZ�}'�+>�N�����~��<�(�I_6Qvx
��pWM�
���#���z4�#�o=�uw�v���M�%�Y�P#�����N�wWj�����dC����0F�c��O��k�2!��������J\�j���l�n�O�e]7�h�~��9�hJ*U]���H������sf�F��&(�
�� ���)F��4}����raGY��=;(q2o����`�T:�,�b���[o��\'����,(-�H�1��2f�E��eN�	Oeo���,�S����6�g;� C�T	N?���L�A��`����C@K]6���B�����4�~�A~N�����@��_�(�x��q���#@��_��P�	�+�E�574~X��I�DI1�C~
�;QmN�����"t��(�:S��)�28�G�������K2]��%�k�U�Tg�M��X�������}��,3��������X�A���[���	������
r��n-��"���&�w@�����)�D.�z��h��38��nSR����9<��/D�~1�,�l�r�r3T�U=����4Eu�%��RI��'��?'���w��2��c�9�:!��r@��
oE����l�l3��"�_(�X:NV���*�����3��k�P[Ng^g����%�k}��"�]HM�Y��m?�6��(R:�����0=|?�p�[����j�}�w>5\r��O����f6T�h���'�)���^k)��f�y	����qG	l#k4�u#ACs�w�����z��\�,����J����i��I��d=��VP��O&���$���/Te�N�r<< ��������kP H��o�7��(^K@q����E�>z���h��O�=�R���������O�Su�u:�k
���)���>l��P�������y	{���h���/\4���1��{��"�j��y���������ex���[3@�i�7S��L����4@o��������Hd����h�(r;�;���<|�U-�"�d���n������1Vq�'~�tb�&������n�����
3V+�������������ML0i�������BRG�^�&�|c�t�<�O}�&e�&{`�{`bV��?��T��(��@[i:f&����!8���� �g��}���xd���1*�����bEE�={^3��>���A��6�.����KAA��������A�cm�����#������N,�/��g�u����rNvu�i���]]r���� Y(���?Ir0@f]`��L�-�I+��I�3-Y'CW�A��/A��Ed��r��2�.;+�14;<�:Mq;W��D������g
[6��o!u�+w����z���'����:2�
JoR��"�%�I_�s��������c4����Y������bUo������
���_��8�>s`�h�������"�����F��Hl	��l�������Y#�����|��n9�*�*���L�?����C%9e�����*U�"������e���Wy��E���O��*�J�;��b�cW3����]�i�fG��t���T�3��>\���YC}N�iAR�����3���w"���vh1&S��S���b�cq8m���I�����|e<�ZX����>��i7Q�� ek�>/���;�3�����\�,Le�D����c�c����D����)��@����_(��EL[c��.��0��6�������^��p�o\1�cj"��eQ��j�4dgf�!u���w����y[)�6�R����]%N��	gGz�S���W���������~�:S%z��mJ�2Q0L!�e�<��O���S�����@�������<����/:��_R�Q��#�z����42��k���6���E{�|/�N2^��$u|=Xd��{mEd�
e:G�/�1��pz���e�^���*����`��\��d�����m����%���C�
*����&�#;�����&/�g1��+����z���W�~1��, '+=O7��O���]����^=7H|��HR�����2�����t@����?��Y�j,Z$��������-�����:���df��|������TY�9�@7�Y�l3�qb9�y��h�/2��ME���f�" �O@��a��I�$j���}��@b�N�6DN���S�lz������s�n����AS�����q�4��/hw�~�R &T��a�W��R>=�F������X�;���<$�r���E�Q���E�-�Icvc;�Z ��U�"v�Q�$i��}���	�>���9��~��h_�T�b���T�&|��#��g~`�Ik�
�b�w*S���yR�3)D��|@���;�:5'�'�Lv��e���D��v�������>*?���9�2�25�.�#]�K��U�R�����Zs�[-�^�p��q���2�7�<j=�V|*�����������:j=^��n�bNN��Nz�Y��������&8����W����/�i/����.���*�SPp2!@��������3.T@���+�p�?�#�L���p���/�p��Pc���kAIM�u4�a�������H,�W�����s�Z�� 2�d(\�i������'7
��*'L�L��E������5P�]9L��wTR�r),��%\����eO�2�hK�>�1�1�,����>(0�3�hH�k�5�&K�����]������>``���n��t�����w1>kzp	YB�(���c����bv��,F�P;,C[	��`P`���[�_������k���k��v�<��.[��6/�V���E(p~U�.%2��C}�p��dM�����miq^��M~-���� �	�5����`gR�FN/h�Q����hvj�-kj�.1S�0����j��]PnK����0��j�����C�*�'�_�}��_jrUp����C�7%�W�>	�O������bR�G��x��Ek��g�`
}���1��kF�63���b�k<!8�Cd?
����9��SP�o��i���w1��AS�yVqf�����:y
�T����Y�$'
%=��4��`M�'*���1�,�����(���:'��wG+AP� �u��&���wyx!��K��X��Fe���&uxS��<G�~y�o�Z�ak�#���$�R?��C����Bk���c<�s�H������x7_b$�y}
���Z3�P'7�Q?6��^�b�]c��L
��U��j��?�n�4@�x)F����0�v{������A��ud._�����]��	����
P]x&uBV��>�s���F������1�Z��2�4[�z�Z'S�k�i�y��O�������%���v���#��tx=�%�3?n8����T1�k��f�(��J2��.�.wH��(�dK����]�V��"�i���atf�1�q������Wnd��}n�6���t�<'|}��(�4��B�z�V���J�*]��'=�����F��=�f�Y�M�nX0Y��jl�y��3�&��F��y��h���I�l
��e
�$[�[i��#������l��7��r��`��<�*O�������A��8��{���H
��9���m�d*�=�l
j3�@�M�{����~O���`m�6�zW�������
3������N�@�K>C�R5T2I!��#d?nM�������/�~��tN^�34S�<R����U\�������b��U���PKb���~~ +3k�f��0�M�/<d����{��*������a�!�[c��2e�L�g��^i����{d�����[�gM�]�����M�0��=�I�0��n��}P���bZ�������LG'��J	�����K��#���"W���*�~�y��n�,�f��s�V*�	~�8b����1g�]���q|��S0���2�%<������U�i�)�[��2d�h�#�]��f����,��im����y�������xv��d��<�����AU<W)�3�w�nc>M$5H��)�����4x��y�O���JS�tN�{�H��X��c����1�S;��o@7�aq��$�|��u����������.���&uJc~Q��Qsj�]x�����&���k?����&�(g5��d�g{`2X3��vko����9c�5�-"R������+@�U��px:����A�d�������y�?�
������>E(x-�iR>�Ls?����.I��&7������IE�!�d����d"l���O��y��S�qt�g������|�����%[���vH~��h�F���%�?��|�/n������[���r��_�5p5�C�����_b��/�"9Q$UB~�Bj{���k��t�qQ�
����@n�"~��x����Qd�~���Q���\40SZ�(����G�Q��0\/�a<��G��D�\A��*�P�U�WB�z�6MJP��J��!:uv�_A��i#��E�s�?���
J�Z5�Q~mo����8�\��)����������t�m�w�oj	0���Ie1���K�X�	�-���[(����e���;
�A�e;�%�9E~�����������;��/<����\�i�T��6�>cv'����h��V���WvF7���tI��������~<:C� �:y���<+(v�e2��N�<�'#G�yg�7f�
aR����a���|u�_���X����
:�}�!��@#o����<��e�r�}����$��>�NA
l)������PCg6P���b�M9;.�t�y>�qM��i��W3V��E���
��$h�	-v�_�x�O���q8����U�+���c��5B�������>��U�"�E������i�i�8�z0���2��W�_	��,���]48���%
0I-��9��,�r��5e,��pvOP�N�;�KLg��o	5�J�9�E�&q��'@�kr��`�RnT�N�{ {������W���q����!E���w��Z[�L_\,�I=G�����m)N�&����5d����d�k��a2+D��)'����>������m�p.���$gM��i��D2�����C����RiQ-}�H���Tg�D�:`?;'�W���*f}�NCG\n����C,�\|`�jfg���D��>Z?��~�x]~�h��ert��h���&?$�y{`)�ER?���;N�%}���R�	����!;�]�x)a>W��^��ftAW��.#0#���:_(��|���o�Y6���V���nf-��~'0tO�?�d�����*����U����
�|Xd�O8Ze����&�`wS�Q���8�����!����a�����������r�x����i���A���Y�o/v�t���bf[B�7�����90�0���i2�{�����=m�\�M��J����-jj ���U���eipaOe������}��p;��	#�[O u���7r,k�n[�B��` c�j�0Pe	�f~
|h|��g�����z���P���o����B��s}��+�
�Z��U�
z�*����[��e)l_�5���cu`.zN>�h��:�e>����J0����`=�_L����N@r�}��v���I����y�
���2-�&�G���r�?�y��1#4!a��)��2]�u��[���������Q��D�_
?���<d����Y�\aU�����15������#Hq����5��'���4a�g�����$9��"2^������\6A��;Y#/GWH>��!���v��t�l:�^�l��"G��,���b'�?2WC 1��$H�@�]6D�������g�VNID6�w�'��&���w�q.����@�D"*1j��N�M6���Z�x�=�s4Q�?�CP�I��R��W*>/?�-��K�C���&X�����1=�%}=�_Q�q�"]���`�Z��`YkB��~=�^����/��s���j�i6���Cd�B�����g������z>�1�$��aj���MLo��>�XSr�����3��qOqj�HZLG�1)K�q^��L�<��=0�Cg���'����Aq����+P�uaT��&����w�M�i.f�NPC;H��/I���h�4��[�4CE�6Ks�<�l������_-i�?
�*sP��#�x�	���g�E��
E<g�W�1��S9b�*w@��c������N�xH���N���k���F.��,x�QH�r�[&���������Yzw�����^F(����1�������/�_dP>Z����A���n����m����`�y�(4���������g�LA��4�8K-������"�+O���R����}��r1���"�(���E�[�J������^V�-����:�~9M���(�7�?��I"��A���A�M'S	�����\������F�jCAI4�2$���urwO�{l��;������(>i�������o ��p��r,�#����=]e��V&��H�D;p$g���=�
PD#����������X������x�:�]2�q���iw�K��'O�^)
�d�@;����$����g;�F]���5UT#��;� y8AE/Tr�!����j/5���K��xQ�p�i�N)�����g=8d,A�%8�^��9�*�
��jr��<Z�W���`E�$y���u�������4�,��p���i�h��`c����1��tI�Uj���u<*)H2�i�w�T�8�8e��U�i������Z�"��u1��	���{8����8��w!�B����w�������f8�L�sj�%p��I��b���Y�Xq0Ga�i�T-&�~�l���n�� p��g������^�r����^��M��27�2a���2��(G�==r3����9��v���m�B\I���n��y�%
l�c�NWX��VN�J��iAb����%Y��Rf�����"��7����l��� ����2�Up8�����z���	�j�g�4�"��K�Z��L;�#�(��XOC3n����<�
�oG��9�c�Dp�pd�2j������
�L���C��P	�-�����T�A�<�����[��A��f8�J�	�F�[�8q�t8s��r�zH�D��'���d1���$�]PF\��H�<�,|3^��-$�� ��Cn��������������Z��S.�������g�w����-]���q�>��+O�_-G���|.�{���I�
Dh��n����k�������z�`�b������>�EeJ���������4+�F�"i�s�v��9�
5��37�T\���b6N��q���wu(J�zj^�R;���m���j�H�wJ���y���`�M�C����8(	�/^@7����I2I��[�2��*��p"+5�������_gr:6�����}4�O��H������>�m�p�]��Y�8<x
j��C��T�&�M����P��,3�i�����YM������<��u��t�nC�U�&�	���P����\�dE�P$�k����}�Cv���n�l�+����fz������|�~�N�����RD��i��2���^�D���|#������7�>�'���>S>o�<=e������5�?����Z���
R�i�5���\�;T�k�Z�_-{H���K�X[pI��n�����[8������j�%#�)=�\�E��!Gm��R���h�+`A�DQk�$��_'�SS��E���{���������5T�7E�+3��^��c���T�>���|$:FW��-:��������
�pU���*�����v�y����f���VS>E��(��c��-�uT���9���j`5��:�9h�Wu���6C��y��Z���!�����uT����R��c���������r-������f������R�=e����2W���d,d�_�1����(��u���	d�m��j6R��37�f�����J����{�l#]�v�Je�53�i����)��z��)������P��y����ho��Wv�VP;�8�����@�����t�T��P�U�z�0�5��2���~'

�?�'_��k��_���s�F��2e���1��Z�;�����e>�YK�/��Te�����Y��;\p?}����=0�c���
����r��Q��G��I�w� -X��1�=Z�C��zj
�@�,	���%�+�C�E�������}V�'�����`�pI�]S������)k���N�N�_�(\g���.]7���Z7A%sM_���9]~Px��<�����0���Bwl��9K��w�W��7�74�#�I�T�j�zY��g.��<��y5k��s(�� `l	�n���RK
��d^���m(�V�T)04����k�y�Y�k�R�c��_�#�x����!���<����PTD���~Y�s.�e���%�R�r��S~�X�a�y��t['�Y/��Iyn���c�|�7_���d�4(Z��y�29�I�F
��*y��X~�J�l����{=8_����gPG�\�w
����.���X��Q�]��7�{��b�1�}�[���WU�g�h��H\AW��H<���8L��&���w�2,��{���e������q�{��0�A�}�
��/������cd~w����Un���/���
��a��)�.�&�aL�g�%E>��4�������%���X���71K��P���z8�6	s�f���'b[����NCq������$z�6�`�D�?g��)$�*���2x�W��(����l>�U��(��h��,���������Y��ID@IDAT���T
�8�q_5z�`?�z`�Z����B�K����:�p�?��+�73����������dF�e���q����a5��0�����1w�,6�_������[p�����6�=�|�3g�(��II3��X"0��4�5[�-���u�R*u\�(�����K�T)�.�Y��c������\������,2Z����tn^�3����>
������;u�
"�3����2��I�1��iUMV'�H�m�!�\���
�����Ci	��~����e�}����������������x�4i�����D��������)h��4Z��������/��cR^p�n�������t�L;�������w�+�����U�@39h��X��^lu���p�	�U�'��c�f�����Jb4)B8�[u�G	������-�A�BOP�-WZ�
T����u\�"�?@=��vx�}I����?�q�������`��w�6myl����d�(@dp�����Y^L����<��k?�M����0��yT��g�p�w���s���x�;*58�.�f�;&Q���`�_�fml(�}V���8�7��p�}���.[��y���*O"�����%:�w��O6�:G��h������xz�����S����]��Z)W{Z�@<O�"�����O���EO�����V��f1��#�[f��'X�K���)771^�`c�d-�gJ31����&Y�N_��]���� ����+�}Y�3}C�E8r_���W�>�������~�<��M����3$���	,����oG�,�!�%g9:x�|;�	p4�8����)�V�@����7�����`s�y���w2/����D>�M�����x��w��>������k�H���#��V�S�$����2t����.��W���'�2����������k�����{Eb�T�{����;
Jc~P�}{W� �!L����f;���:��jh|�P[�����u�������o�6s�V��������>�s�!����^�&�[�O�f���d�i��r��}�<���G�=P���q>�u�N����w@��5������9K
LdZ�aq3�S�W���;)���X��,WZ����d��,T~Y�'v�"2M_J�$��<~�L�{��A[OiW��f`�,g����W��^q����#�(��@�M�9���ch��2�!��Mg��gT�m��<�}���|[�=o�����J5��+.�?�W�v���A��r�z��{uK���M�o{�"���vUK"K�h02�?���9�Vg�$ �	��l���4��N�����c��iP�;P�
�Er�J�S����B�.�tt�x�_�Y� H��A�9FV�����L�����O������=K�0�}foGS������8e�9%J7���>�v�K�u������'��d�F���t����89�^P���}s����#����:�/[�L_��fM1}TZ���E�^z�|�m��Cn���u�O����/}�
9q��_L��X�9�>�I��%�u��2���Q�e�yX�s+��3,>�o�{M�=
�zl�.f��t��!P��'e�&{`b{`�j0�m�/[�������7����,�N�����,JU��w���6���P)���������������e2j��������q22f�T�b�K���k�|��?A����t�-�]�U�{���"��H|�L��)yeo���1~WK���r�"�R�z�	=����K�V�)�����\�*^RD;06��H.�����
DnPX�
���b{"l5���Hk�-�i(��Da��o����Td3�\���=��u��������=�*P�R(x�/e�C�S`nWp���I��S��C���3X��
�r/u��!�UT?��"��e�/���
2�J0�����Q�
�u�f�![+�(Y����������Zy8�|��F����5�������\ pq��A����vO}�D�Z����~:�`E��������om���P�iy�3G~��:���S��C*�'�����<����\��{���w-H���|h��G�Rt����&�����n>gq�:>Q�J�������*{)�
�����1�x	`�i�e��/!�L�3����@�����e�{�W �����AULy��S(^-�����������2��i P���Qc��#}L���0hA�I7���}>�*�y��L�0Y_Bnq"H�Q�dAa����5o��U� C���7�U����5�?�@U�*�B���<��.9����A�&=`ZC�	�R*m��>����6$�2�G�v���>�v���J���!b���1�>���$���`��vUI�B�&H�Z�0�}�Sf���qJ�Z�Y�N�:����t������a�����2.��K��:�*�I�1x����[5��2�<�������xV*9s����4�j���rm�MV���f;:�*eO��i�����[p�9G��K��r��xUc:����%+R5d�����&�zd�y?����vpM���zdk.)����%AM�~�&�f-�n�5�U��g��1�Z5L�%�����?���r2�ldw�@1�������u���Q.x?4#}�-�id����T���8����&�����.�|� ����K�ti�I;��sl�O�����O
�OO	s���	@p������p4��-7��O��6m��A�p�,����?LM��P���;T��+��3��c�3�-�%lW�K&)"(gYK��WA�kqqM$�J������������-������mr4Q ��
t�������Jui/�������V����Y��sV8>��P����������������		9#���a��[�$!��}a�g�7�]e�!��j����s����V�9��[";��D,(�F�=�.v���R���wKyr���)Sq?�]��&��VCU4
��:�����D����Y�����`�����!����f�.Z����Y����z.�Mu�Vg%��\�����'����\���.�:\�x�6U���������#7��?0��o����~;�y�4���^(�];@i���f@=�p��k��r�b�Y�1�=���_�S
"�������2�����Q�����I$��Hk�$^BM�\��B3�'���R%�x��c�ZH������`���o�l������k�+��+�,�3�1��7�E���\�(���N��$���������/��H�R�E�J���]/���pBq��'qd~'�!� ����A�����_*��`n��J�xxB�b�=X3x����������d�l�N���M���v�ON@��IN�uQ��Tq���}a�����%P-k��=�)�9�'W>��*7��O�%� {��5T���R9�*�Z���]�y���1p5��?o��@f`�v����f�>S�E�
A��]�d���L����	�Cu�d	`�nh�{�#�}�.{b��{dj��L�������+��LG��H�3�o��o��"�^�L%�a����>j[q�����>Y�zn�?`�65eG�4��j��1�,�&A����=�do���|#�M�%���DVb����&^��*
��n�W��:�]�|4x��}=��o�<��U�������m�����E�	6
]su~M`��i�����-d�$�6�q��s�����1�R�����'
d��YD_d�_�q��Sx��F?_�f�kr����yJ�9�Q�<���������q6����P�;����&�W
�}1�&V��u�M��U��5��:�W�~���6(	y��K������r�?��ky�q�jh��{\d-&��L�i]�*���'x�ki�(C�"�}:����u����BL��6��?��^����M�M
��'�B~��*��qu��v����+(����ih?&��g�H��u�$�N���9S�-�\�{c�C^N�s�?)O����
�j
�>���k��P�O'����������z��j������B����V?�fwqF[V}v��l������w�@�����rJ�f���BO���5�}h�h��|$��������N>R���5��dL��Xz���W���l8���=���G��y���]����|5�^�ig;�����!��)[�|����e�}����0-7���yn)L���9�#���[�{�)W���.E�=24��z���>�7L<��A���1�Q\%����|P��Z����e����W�e�G���.����<(B�����Ay$OI&MuZSE!����'�a14�&�'Fw�.)u��c8�� ���$W�l����N��!;�q��@@,mzU>�:!W���C�K��or���m�&����qV:���@|�����U�oHS0$��Ie����b�����#(�u��02��`����*hE��&��L��)�x���m.�n��Y�����8.1|��H�+�y��B���Q%����)�N�N)���q8G��,(�V-�G���_j��]��I���A%y��Am�>)/S3�'�N=5�#�b��?-�H��8���D��y%�)����`?&�q�����AU`����52�u?Hu�&#�S�0������l����wi�'�zW��N/����~`�2���I�W�\n���X~B��IR������'�Of�8������?@&U���3n%;jU���"������H��zt?�p=��F���%�ejj�������Bl*�$
���:��j��=�C	G�y�O����T��p@��'�o��P�i}T^��@	�������{��S�C��g�8�=��u��oJ����W�g�1���R��&��L����f� /����$�H��Q �E:�f��~B7�"%�Iv���.N.:+V)����G����iKu���t�����t9Fa��d�:�e�����V:��E�#�g5J��z�
���P�l9�X���%�Z�����1?S��d��6���8�d=�����������Q�H��)<�:���E��vu�u���,�{��O��XO����&?P)o�tT�l����r�������N�\��O=nh�(��r;}rS/��NF���c���m��+����v9����?f�������w�w�L�9�B�_���m�^�F{�����<�a�j+(S��89O���\sI�S��	��2@��1���r��HW�������
�)5���ER�|���p=M��
���������z���i<����^"3�^��8!���<�k�����#��^��X���i��WZ�	Yo�G�m_��#���z�����,c><({�a�����!�S= ��DL�����F�k�eqVz3������S�/BVQ�=���I)�������p����!��>�[
�v�[�S�7�l�����Ft'?���t�W�<��0Cc	�'6\���d�
J)2� z�2�_N��Pl��u1�����u�g]���p�� �Zj��k~�C����BS�z@�2���HY�+:^%�MZS��/�+���{rn��r���(tE2{G�S�D�;l/���a(������P��QS��"������{�,@]���q;����~��m<'>;1!��A��(�"h�fz�?�	�,���<��n�k�3�t/��<#{���N�v)
@�o�|}�3S�:I^����8)��	�}B�w���+m��'�~�6�OKE�u9��px��X�J���T��j���p@�D9�j��Z��Z�h{���	�/��N���S,�`��X?DQd�q��H��������\�;i_���:�����v�#��k���+��R-2���7�uR�&P ��Y7��/�~����-���s"����|�>,G�����<�>�'���4�~�F�d������n?&�zK����+#^(e�!sc�������X����5J�#"�������w����Sk�R�5F��il}���v~�K���2�V�������}]/B1�*ov'���H�<�s�pr��5�-{^*�"�G�5��Z�{f�]�23����>�S�'g>��]��K�o�/b���cc��cZ�C��C��+������e���owh��0OF=g
X���X)�I�H��J��n�p
@T�����i:���r�_){
g1�������e�4JG"&���K��@Nj��s������{������-'/lh{Y��lN�H�H������
r0248��?z�E�>����2�f{Av�7�N��,��3���G������t���������2�F;d��1�v��=����2;pL^i��f�y-��^�S�H��<�������i�u��T�~�����}���_U���������;��������%q3W��_+��06�K�=KZ�v��%}�������V(��n12�oN����}��\��?�3O�Kx�����S�n�����9�z
��������_�t�>K���
���0�P}�[!��#/G4v~?�6*�PA������[^c�h��P�e��}][��jw�z��k������;e����;���hl!�A�����2OH��Ay��K����o���L���w��)����y���wcB�i$���cy���;B3�7�����<���<;�r�kW9�X��~��S��i�I���Pf��w�����R������ c�/�^�9��-G��nkyQ�������ue�/�]����q �K�d��C��]��5����Td5�����C����3���n�s�c���\C�� T/R]�.`?�h�Y���� ����ei?n���H��O[�{;��q���j"�kN7��/*j'����f�
��|2�w��@Me�XQ�X=��2��6�	��i��)9�	A'�c�������F�M�v�|�������i�Cv���8����L���r�u_p��u�y��7�1����'���Kk�z8i$���9����9�#O����Y�'�kDj������e�!��S+�g�������o�I}�s����w�!�;z�C�&{�yh��#9	Y�n[�����|���F&�)�o?)]]Zt��J�H}�n��.��oI.�5�;���j���D��J��(����8�]?�>���RnFsK�����H/��2�����s��}&{�����`Me%<��Iu5T>��MM����"���/��S�JQQ��>sZ��6M�`�*]l{��r3�)�_l{L���?}��/i���������t��}~��>�M�����j�>�K:�*������Ov*P��eC���~�k� 0q[.\� "�/|B��w0^ �aO������J�"9��%���h�X���=c8��#19
]��'�>E�`�]�+��(\]x~�� ��`����W�4:`^���%)�������I9����1f�/:�A�~���f[P����.P$�<����B9dc����)o��U'���������v
C������2��M��#JE
����%7�/�^�M����"�O����tt�����6�������t���*��)���B�F MYX��T:�����)��E�O)�f�G2����Q�����v�������#�G1�gI�7D�O�q�]*�Z_�7)"�����o���U�g�?�w��f�e�
�H������]�1��r�gP���m��)r[�[j0���{�1�Tt%����� G�k��w�}���JI���`����~�\���J��2c��cB�����4H3u���������k���Ha=�i�*S3p�t����ud��~'3�:�U3�rm��h.(��Nq�����km2��$�&�R�`�����!(iw�vb���n���0�C�����t�qj[��1����Zh�f��q�3.��"������"�-����ui���'���2�-N��e_qU�=M;e���������G^
����{���4�Vo'(�l��`Y����ZY����j�jJ�!0�~������]R��g�	;�k;�Xh����A���j�-I5�t;�:>i�����*k	^61F�Mg�9�rF�=v	e-�F���{����s�6x.���������!�/m[��[c]��c
V�1�[PEA�5��wN�u��m��  %��5n�,�p�*��m<�a��@yn�����9�X*��Z���pl��
eC�L#�:���A����p6��P]���d@�z�S@XN)��a�w��;z��������$z=���u�vV�kQ�����2���=8�0�`/�@=����P��%�H�u�O��	���[�2���8��[���c�?�I��f�r�Ja�1�u���54���o�
���F's���,'6��LJ��������WpnB)�p	����.�Cr���u-O�dA��
~h+_
��v�u9�c6%+��";p����S�`F�)^�sx*�v��d>����$`~Bf�v����h��teL��Mo�"0H_o���M�O�����.��8��cu�����5�����A�I�u_��f��b�����q��k�
�4�6R�w�T���Sm�7�<�#�������6	8K�������R�3����!��"j]���WP���I��d�=�Z R��[���p��;��,N�r�G;���:�"���M��0��m;���*;1��1k�����t�sKv����A�Uy���:��]����:]g'�"�\�g�fW@������2��������(4H���r�`�1��t��w,������Q��[=!���t@�x�Q)[�W^�Pj6��p���k�e-�\�el����
�`��y�Vw6�B�&�fS��g�d���C2���K�[8�����D������X���m#������B7��
nG��$�]��c�L�^>{Pv0'��qby��cA7f��f��oB	l�:����t2�g���[
����@��;O�9#�������)�Z�O���R�u%�zM��Z$�[!��l�z�T�5Q��-���@��`h�����/�;���;���+���L�.y<����������.��L�.Na-���~�Bj>k>��GJ^���i������C^�R�j�v'	~�3[�	�cY�v��8Z���B��{E
|4�� �gf�0��YX�$���� �c�2@[y��R�Y�_����m/h�#�����V-�����#�}2���TC{2�X~������%��8�9�0�u��Xn�����%�d�,������rx}pH�Z�zD�M/�I����[�}�������f�K����n������'�N�3�����3:���r��-[4��
B} �U�28������oL�m�q����T�G�Z��l��>�u�G��tx���K��'�D��.�?�C�����ZYH`���Im��������K�p���)^o��c2��������Y>`A�?:�����/'��������������~����#����1u�5����^������E�Geuw'6�9Ef�X�'����� X/9�r? �����;���1Pc�}��~O����nd��7B���f�s����&}���]<+]<��'�u}�f�z�3�{��f=���l��Fz9VN�a�G}{u=TOh+��]�-^�v&���~Y����������c'}U��r�}��"s[��b��v�XOw�k�������������{�7K6$������O���^r~����G�l�:#����#�*����W� 6��
��Z'W�$�}5v��J��N�a��	F�X��,��������D���G$�Q�`*z�����Q=$�3����M�=G�����������pc/��A���
�qt�M���6W�������0�u�ns�J�Wd�
(��2�u7��V2����C~�������y�a����K�/��?���:��F|K*����U�D�H�$�
@9��I�6�M�/���nC�����m�.��ywk�i����i; �����]X]��M-�q���	�^��]�E��z��c������u���I�C�S���Y����j��$�g�|J<�N>�����N�o�c;Qj�x��CM����#�#vy<�Q@G7�V��������]NP�����KZ���s4���FC��,�@��Qu|�b���<�J�<��=����r�[� �+��Lc�=
�WSC���ht�4C8�g���F^� gwY5���X�`S�����������=�~���m�&��Z������8q�x����B��8MfL���[�{�9��#���#g��M�Jd0X�t���kU�p��4��~
~�S�3�A�C�3Y'8U�N�����Dy���}A�c���f�;r;Yke7��GSR>������.�I��'��v�r)�C���T��~;�4������	�Z@Q�8���(��?)��j�������
��\kKz��
����v�0����H�����aR������rD�#�N��sI�}El�j���>Li���;�{d��������P:�3�%>�8��6<��{
����Y@�h�9!���=�D���2Zw��=�<��9�sdV�y9�6�O���
�D#��tQ��/YM85����]��{Q^�����V���#b�T�"��^�zN���{1�W��i��n��c�y��w� ��T�KQBX��lZ�y;A�]�5d��:�,� �rM�5y�g�
�����o�4`l�+bgPF����#*g�QE(�hC�pE�V�
^5DQ�16����g���9�
{�������F�M?+��$
�U4`�Bx�<YLFP3c�u
Wxb����b�V��8(
����Y"u�l�K���+�IX*�^70����v=h��l�
�}jp��-��c|�����=Y,d��v�"��+��<���</D5��L�~�nCATb�Z���?�����E�Pt����G:�=Z�����.k����F�cM�r���(�Y5���=�:�Im�
�Y9��Q��E!�i���%�-o����g��3
�����p:l����kK�W�#�:/�*�M2��k�PP&��<�i���f^ ��_���'�|���e���v��N����{��U�`�,��A%o�v�y��}5PJ��QI�u)~���9�#�hz�.���Ry�V���,���;�A��������y�#|����KR�_2���*������r�`�(@w�_D0k���hkO��}S^0]~�����L���y`�FOQ�
2V��z�{��q��(�"�|$G���A��?����,��qv��XH�7%����U�m��n�{�_3�5c'�����I[h��2�9T�O��mf����Yp����c���8iKz�K��p�w��g�%8j/�u��������8=�~��Z4j	h		���������/6		c��^'�I�&���5�e�����w��Y���xnf9q�\%�U��X�Xm#!KBFj			��QCCC��/�{����s��>��48�WRs��U��S�]U�v=U�_����:K��u�.i�_�3�?��S:n���K������l�wu�l���+vl��A�l��H��������I��������w.�7]vL�F�i����]�m�����<4wQ
�T�5��d���ur��V��^�n��|�e��[������o�����h���A�����[�LWni���M:��[��+=:��j���:�UC���{��L����w{�2��nG5�0�������Q����4���=�o+�����j�1�BoS���Z���eF�>��ZX������������������u�E��9�tu���{U���;,'V�^�:AeTW����$GWv��X�	5�~m����W.M�Q
x�V?��\��[m�o�.NX����:+���7����L^[���36�yT�ss��U]Ipn�}�l���\��Y�me�
]=�c�y��t����>'���	9�eN�F�=��j8�W2��^6����P��g��a�Wt��N��`[�����Sz��'w}K>I'�8%o��!����:C�-50�Y�Qg[�RIf[)9��g��kG��n���s�V`����z}�����.H}p���������~��	�Z�1S��'��������YkV=�;T?�~�������u�F�I���u���N��G�����s�7|L��|��������������e���k�H�zuU�}Z��-�vi�;���3���o�@�c����d�8�$SC��u��������7#|��	���q�n��$��j�������S�P�>5�����^��|~�&���u�������=�U���[�Y�����z�V���:�}���5�|��-�\W�_J�\���(�L���6='��J��]���e�q�]�r�o24���-�ery������4�r����B&�~E��6�|��V�a���<���po��6��������=�W��f���~-���v~����=��
���j}M
�k����A��>�������-�������]i���t����A�7tV�����������+�?�|xMW���nB�+�}�Ou%�����2����5���ZN�j���3�M ��]h]h��V��y-W���������q+�fc��nw������"eCa��������hP�����X��.��/�,jX�s��V����p>����05CO�N���������j��Z���7I�����j����	���?�9��+%�������&3j�����uuG������q������?�^'L����E�O�<U�u{�wtk�'�-d�~;�����rV��x���D��>��o���	���9{�
���z�/�D����_R�P�m�urB������������|o��4��L���n��>DW���Bkb��0m�>�`�i��w���G��Z���./t�2����q����q�g�]�B�<�'9��[G?��N]pl��I�]�r��Z���������-��:�1<�\�J
$v���{�+_W���uj���|�N&�{���b;L�r����Y'}g�gr�>��������C�;�����.�����!�������r��N�J�_�N��y���t����������^�����N����?m�w\3��\�I��[���n���\��5����|H�������;-����������<.�V������K�����k���1�q��\����
��G���Y}7k�v���6k��N��!s�t�Z������Y~��;�����g����Z[q��	}����Y/kur���I~�G��N���L'����z�{��83L������g�Lk���w����&tG?��������N��_��FubI����p,�Ft ���>����E�e�<���u���o��V��xd������3��U5���-����3���g�v�
��7��Ia���I�.�
_|�_��5G���xd����3���y��6��;f�N;@�	�{�����^y_�������������W,�t��\:8����������.���s��X�3��u��������b�~���&]mco6��^��<��&g����:����bF�e����������oL��4� �V��mS�]��!��!��dR
K���iQ���s��������!��UQ�
O���:o�����j\I���w�~��������Tn<���dX�X�j��|�����,�EV��:�q���&��:��!wLV�L����_�R������>��S��7��W�A�d�^[�����r&�����m����Jm���V/�m�����&K�~d�_�M�L:�����X����*�/��������
��
�����/�?2�3	�u[��V�����}*]����F�8xo���r�����xE>����������g���y�����c�������[;�,k3<�3{�w��o���geR����c?��E��W~�b��������Ys�q�����k�M����_������3����O?��Li[����2���������G��P�?���lP���kIZ�g��k�?������5m�t��Ou�5Kv�����+��c�<�F���XG��Z�{r�?���+���3z��N�=�[��O�����wwrO�CVN_�.�����~�V��Q�^cmV���������Y��P��n��-�&�����-�Y}�,���|�?�Dk1
<7����F_����H���8=�{����\���]�S��3�����������pFg����J}yb��US���Q]���*����~��x�|�3�� ������RF����+gu�y�f�w�/�H��Qi��~yS�f����k���+G�({�����8�
����e��O����M�PY_���j���/��rM?���Z�&�����|QWhL�O��q~0�Y�e�[�"��2��
��8�������6]���_?�]�}����S��7�PuD����@�+�kjH���w}�����j�l���e��/�|��m�3��������'t��fn'dv_��nC���6���hY;��{������|t��:�}U��&=Z��������}
f��t+/��Q��F���>��\����jhH��-@��Z��R��|^�t[�	5_�~�����[k�
Jg���m{PW���Kq��z����ek�U���+�A�4��"����JWK]�Sj��t�#���'&�ZW���U��3��9�b�_$��y�n��&]}0�d��
e���K��:4������:k~g��-nuKO��)�V,�����������^�����g������Q��}N�6g�F�����\����OE�-�SywM�WVv������4��h"�Q��|[�M��5��h��cgd5��ko�����izD��&y��?S�j����[�5}^�Z�����fm3Wu�+n�.LnN
��j���]�g�b���������N��V��z�~����z��H�~���jn���Vj�|�����>>������V$F��n�����������k�� ��MZ�|v���	,����B�i1������&����������G��6{>���3��-����?q���u��.�i���$���M)��kN\z��J��*w�v���Dj���F�;�_��tyb�)'��/u������4�z��������PWx����.��2���5j��B9��t�+���.��E��d�������j<�K�������8[�����K.js������W�i)����Gd���_��s��~.}���	{���j_�&��r���c�����$����N�:�uQ�n����d��)5�N���A���;�%��/�������0��"I��/�/����3�N�s��f��E���3�>������r����>�����-���}X�}\�rmT�`�8k�m��5Pi�j�k�N�����������k����6����*��q�4��I;�.����AI���4
S��7�^O��Vv�a�?�TW�k�v�%�����r]�<�Y�m����������r����I�	�/�z��Vzlq��?�_�����dHZ�����|���S��E��D�F1�T�����H�:#���-���$
����X�&*��2.���,��%�����m�}�M��n�`��&��+%���h\��I�����'S�`i�������t%���\�c:��p\b�A2iiFTJ�&��2��������I�q"��$�-L�$'���B'~z��$�Z�����s�^��k.����)�e��l�+���8���]�M�u���.���$+^G����r��&w�]r�%r��%�,G-���w�c�q�%��&m���'-5��$����8�5���kVE�zo�RD4M3
kAp���tl
���q�D�}�km�M�������`a������Y^s����O��u���4j����b�����i���������$%�"�~J?M��8�&To��Yo����_I���~l�yW���~��M���$��Y���^��
M������]�4��~��[gc��&�gin��Xg���,�G\;<���Vkm��o<��I�������xp��:sMg���#���������{4N�o�6����&k�|�U` ���9��>L��:?!-����[1�x��
������7N����������A �A���f�^��$N�S�V�L�{r'����u�=,�����+�_qE7"��3�*�)���yk�-0ft�5��[Z&Q���'���_��$
����tO�t�}�\����>[�3L��5��n�ee�x�w���iu��W�ee��������Ou+�
Zn��������J�c).@IDATj"V���&t[+k#|{nz?��Hm��K��� }��Wg�O�J�A]9�<MMu�/)+I����V�oz�aD�����/I^���jF���R���_��>��U�N��qa�4�L��������3����-}�<3/�����iY{ly�:k�9���d����p\g\�B�L��T�}����R��k�p��k���d�a
�(�Ok&_���\R��Sr�QW�a-n�����Ym���n2���x���RNWI|�G�����+������x�G����Jt��F���km�����^=W���n3qE�ig���CW��&}���g�����-�
��w��
�Y��o�].�t��V��()��������:=v������V���v�0�4�6"���p�n�e�M4�0-]|��m����zMe���if��6������.�Tv�����$l���\���k:�)�������4O��iF-�9��_���2m�8)`��D�^R1No�����vjh��^���/l����&mq��>�U����j'��������E*��=q���j��]��
����$�]4=Nr���S'��W�����������f|�z�r�d��9K�@7�������9&�0Ix=u�&<�������u��K��y-V�,OI�vd�<�%���F��i�3�s��qK���Yk���P[~]<��~�Z�,~r��7��qwaL5`A��D����6�����c[�����vr��������2v�g�kz��`�S���,��|�J�ba�~N�/���-�^7
���)c������������9�F��\���*�5,W�*��)c��QX<�HA|�8|��r��^�9���5����g�L/��<W��|Y|/��:y&����L$j�� ��zg�wQ��I�&W��������Q�-�s�.�4�3��9�i�^8�I�&$ai�:�8QD��I���;��<����9	��4?�������O��54
nI$���k:��%���������%�,���(�}�	�7�����-�I���I�Z&�L�1�g����)2=�K��J��E���wyt�Mo�ry�#]���}�^���4LRS�L���=k5kW]��4~Ix��%j��?����y���MP%L?�	�^C�s�G�{6>������&z��s����?�k����_+�IZi\��H��������+�2a'���'q.N��0��}�.��|TWT�(����a�NV�Tr�Y=c�uaLa���D�$}'I��_���Pih����$o�� ��y},M������ �]�o����V�������&��$}WR��%��S���������^w��t�}��<:!m����N+�	��^7�8�kIp�f���}3�>�+<��<��&�����=�"�=��^�HEt�N	�:��N��������h����r�ua\��7�Dk�]���	��
�����[���F����^]�na��<6�w�.�J�q���q����2%��g�#������d���.=���t PL�Km�	W����'��y����]Ic+m��.a<u�o|8�mn���~c�;�&����6���|��o��/i2�+hH�E����_l�� w(38v�RA>���`��=H��u"���s������.�5���wi��%�(��������]������^��$�4��</��\���b����SK��0�%��%��r�<�k���G��SP
`�ir.}wM�-�W�N^���g���:pNq��W���j���~��K:�:4c�m|"�l�f����9�vb�Re�0t���%�B}�������x�a��l������$'(U��qa��������� ~����*��* �M�����ARF</��)�G
oe���u�U�K?��<S�����NO��������1����'^';7g��.^�H^`����.�i[a,R�|g3/G��c�k�5�a���:����GZ��o�lh���-?&7��$I�w���t�G�������q�� ����7u�%���/?�nZh���)���.^z�t�$L���G���p�$J&��.��Cf��J�#���Y|�������W
�,�z&[��c���%W����a����d��eg�[8?M���.�sA������z�U�OO,P��MX������L����F�-J��;r�^��tVo��m��5M���$���;S��/k��9
`�\� ov�G��^���.�^7=���s�����uu>}�"!���N�����zx?��EH�L�����z��=��.|6~F�����L�� ��z��GI�2����uV����#'8��c�e�������/����\c�7���I9�Y5�7�3�I�l����]u�s��ms�Xg����@��@}�k�����@�|t�.������u��Y��2�����M'����h�z�_w���}h(��&4y��e9
c��K�B�B�$�4��Y���f���	N��gv>N���5�Y����������T��bx����g��K%��w]���|����������v����F�i�O#��.��
#�0�u�N^f��W������tu/�~�W=[W���d�T�kS�zx)����kyv.�z�|X�p��g�>�.L�k��a6U5�(�������He�����l�������/������O�s?�3�fql���&�'�~�`�'@R���r����Gz�ez1v��]/��USZ\��i�<���]7��F����Y&�$Qa2���.��I�����4�����j��[psVg]��g����&~�������&(��]��g-d��i�����'��Ju��v�_�8���O�B�t'�/�h?�2YK.������'�����X�w����ad��44���6#�W;7F���Y�&2���������$�S�l�+)����;�,���������\�3����A_�y�5���Zn,M�/�.�)b7[/����������P�����#�Xp�.�������8+&���~����>��l�`������������2R�.�o_��^'��p���@&K���*0�r��4�/������V6�V,��*�~���gs��	/��e���'M$����NGS�<�I��]��]����+\�S���T��������Qg`�cw��1���~��x�6���m���[��3(&P<-����%����u��c�KM@
|������)geH�������5:�N��$���n��\��,w_�RE�!�;�����#��Q�jN]ul/����Om�
�L�M���2����7����S���N��/�7%!P�������r�g�x�L��I��$_jc����.<���osK�,_��}��~��j���������&��|��fU���V���-C5o��97s:���
Y4 @����+��g[k�hl�1��J�����{:�Y���=��l�����o
+�o��$@� @uM ����U�5��hYW�����2;S�z���:7K�L5�\SR�f�vc�����q�A8�<�dD.B� p�4�f�n�y[P��m����m������p�����f���8�Iz�� @� �����K�.J��N�o������������q��q���_;��8�4�F���-8������l��/
��[�F%����#@�n��l�����InnJ���_�0C�>�m��dcS=�m��j�� @��(k�����7��5]������l�l�h����/�+c_�}�e����>���9��;����d��M��oHN�o]�*���-mmm299)�_;�������������2f���������
�$����V�Q,8@���&�k�4�+:�"�n���3C�lt[4i�zr@� �13�x��oP�\�	�c������*��w�u�LffX���#��t����o}�����Km��5H�
��	��wh��6C���L0���=p���r\���c����\� @��@��'g)�����?�\W��o���p�w���\���?3�R2�@� @�����0�:W����v�jQZf�X�����O��eOBc�����.#*�f���Qfgg����������vu���Wdt��O���/_.===��CCCr�:��H�$���������9����9w8��	�xd��lH*�[o�%����S�2�.�~�L�[md�b~��0��J$�r���wIKK�\�r%�z)�_o����g�W^�~����7���,Z���,'�~[�������?v���$��m�����Qok���p:�S�����'�r��0���z��r5��	��e9V�|\��1?��~�m��]���%W�/s'�9YR�X~c~����������j��F9�Q-�K���S����u�/��XY��e���<�����_�r��wx���!���S��PO�c��P�����u��,[���=��c���]������^�o��QF����]�vIs�9<�M^�,������A�-[.���f���o�/+'�^��<+�v������
��������B9�{�e��q%��g��>Xv'�X~c~a�c�6������f��q���\�}0�=���_(��c�6���S��X~���7U�E�^�=����_�����t��q���O��#�q
e��y�/���1�PF=[�
�G�<���2����
1�P���u�/+��K�+y�|��x�R�x����X~c~��XY���2����*[�[����p*6f�.kk[����n|"U[�r�Ret��+����%:K����Q��?/2�x���Y-����0t#i,Q�/]�F{�5���d<`F{���fn.�X�4����?��tH�����W^�UF������C.�����\����8q����v�;oHu����[��o����;�����e��}�v��>%�����U��n�:�1���;�������o��
�P��������9�����y=+e�o����xK���W����������5�_w���{��_�J���}���5����}������7��[9�-{���W_}UN�>������h��6�a>b�-W���v�1���z87}��in������l����7��z���e���z�e��q�:o�����_M�}�]���V����^�,�������F9����y�:o/b����{����'�u>V�c~a~ce9�����q����������gy5X��]��XY���2j}�-��������u�Y&&���g��W��b+d���|�}��������AZ[����a,U��jzK�<�w������]�X�c�1�Zs�������X~c~�.��*-���Z���b�A�o,�1�PF����B�p\I~�mx��G����U������/wo-\�/+����zf~�>������9om�}}}�>z���C�c����2b�6�����r��>�n�]�R�����YL_�s�^����q��i�R���rc'Y=��[���������1���(f�<kV�Y���X~+e�1�z�����5�v8>����O�������xT��o�/�Q�r����f}���I�fL��XOM%�Hl�Jw����y�9kO��������+%���3�K�V��5C��0�W��J��e�W�Ot$�Y����V����o�e�f��U=_fW�P�y�.H6vm���0o��q�����4*&�����H3=5-�.]r�������f}��'{(^�Y���3b�=���Q��,V�mU���Q�k�b~��Lv����'+?>9���w��Y�����L�K�.�Ae{��[��
h�2�����w�^���k��T��E,�1��������p1���Z�[���/�b+�^�����d�����/[XF��7V��������e�����\O>��\�e���u�m��������X~c~��XY���2��8V���Y{�W{�*�R+�b���e�_�r��Y��ru��m��~�u�:��1�l^ce9���S�s3�;v,�z.|�W�E�r��w�,���rjyn}%����vn]:������o�/��1�PF=��[i=��7���,�J�yV��>��7�d���7������_(��+�o����ld�S,�1�0��{�e��q�����O}���{�c������7voc~>~=���[i����o�/d+�1�PF=�����
����]�,+���N��b�6����c��������������m�r�������e�q�����rj}^�]��eL���+�>�o���a��(���z9���
j�2�F)�VW���b�v�B�[e�_���oT�����r��{���b��b�����V=��{?�������PF��JeW�~���������loD������>�XSm�5�gA{�R����wHN����1vl�8�l���=��nf�]�A�����4���o9?�����
��p�Y�<�N�3��zj�6?�B�J��l�����u�q�t{����7�g��}�knH��������k�W^��[T�^������|_��U�+��v���J�9�7�f���q�cmFW�������TO����q�����`Q�r������y��g��4� T�<�<k�U���a%:T��[�yR�r^I^��0�`Q�r^o�b��X��,*�����zb��1=C����L~5�yL����X~M�]�z�����"������H�:8)W���M����z���������{�����o����M��!cQ�r^/,�fx=��qy����%�����	��U��)]''���S�,�U���v��{W�zl}`���	�f��Z,�:+�1?�S=����M\-��Y�~Z`���ee��[����3���tV��pF�9�,o��?�������d���Z[l��s�g�����(w\��J��f�JV�T�Z:���j��9~0��-fX1�g:����:x{E����3F�.�X��5�����YS~������a� c�v�����d�fU��R;�Yk��+����3J|�X~��Y���-����K�[�F������������F?K��o�,��;_�4��?�e���>`W�Y'�^����:y�U�E5����^~cu��)�|��o�,���mU��R�|�r^/C=��y��=�l[
[�o�
����<O���V9�Ro�6���M���j�(�<�F9�7��>6Hk��N��mx�g�����|��up�\��T+�l�����r���P�^���=Y�L��<�g=�����??[�f5XT��/P�.����Z.7�f��V-�w)���Z���P����M���w%K�\�F9/�L�L�Y������E�����F9/�s-����B���
�Z{j��,���d�������pll�9�6�4���K��+(���l�/W�-������~mUJ9g[��Ng�����7�����@��p�x4���g�9����~c������M���nS�$s{�����Z���/�����yj��=v{4 TN�fx����S���n��hl�.���n����j{�����V3�D�Swc������2j�%�Uf��r/�7��7��P���~y�����U��V����=^l�����$@{P���\l��:)}y�l����j���m3��~���<��S�M����[O����u��qV�����x�����~���|c������KooD��^��%~O�fH^�|��KwR'�����}�:��Rq�vg�Xsg��������q�m���m�?;����hl�X)��	�-lxg���������s��m�l��
���.�x��K,�1���R������0w��j6m�$o�q"�m�Rz��o��e���,<�p�yx��Q��~�}���1<���yx��+�1���z>7�������\�������y�F9����s���f��2����g��z��u�/�a�a�
�������
(�j���z�hP�Z,���l�ce9���S�s������������z���e��_�/�Q�����.<���o�/+'L#<�p������}�X~��Y=c����rb�6�����R���&�n�������e��m�/�Q�a�
�M7�U�'
[�n�}�$�b���e����>L������r�]J����o�/d+�1�PF�W�",����/<��y/wo-\�/+����-�U���x���/c���e��1���z<_�v����E�DB�c����2��[��<<�����k&����������}&����z/P�fd1nfU��x�����Yg������V����]���b���~-|%.+7�Q��R���_�0��+����o���#���#_96x��=����p��&���%�1�0���g�.��n{n������Y�������p�/�{����Bw��j�E���_�_��z���X�e��_�/�Q���B�n]�����HM3�f;�����B����e�����WV�R�5���_(�Z�<�y�/V�����Y^����_(��m`v�������u���b�B���7V���v+�1���Z�{c��0d�����z���+���.����\i9e��8��r�.��be�R��[J9��v��cQ�=���7��������e���<�_3 tv��'�|�H������	D����B����J�y(��K�ga���������y��w1���o�/+;V�c~Y9�z�����-��}�{{���0O�co��1����0l5X��_�/�������^z��!�������X]�7������ce9���������3�t��K��.��V�O�
��]��o�������_�xl6][1SN������u��J����)rF�Y��T������exk���77���M��5�	��N�����n`0K��x��������l��m�)�u�.]��5�n�4g�v�\�/�c3��������_;w��d
��*����x�R�Y��z:���x$�1�l^��[�����sp��`,�3���Z.��r���1���z=�AG�r���C���_�b����2be9����ccf���Qk�bmW,�1�l��Q��2������Z�g�9��s��X����2�8V�c~Y9�<�g�j��*�B6t�bQ���i�q�,���rjyn������y����_V�X~c~�������2��8��J�Y,�1�l�c�UZ��2o�y,��� �g,�1�PN����B�p\.���������&[�h�X�	D��6���_�������2����zf����������Bv\��.���S��X~�u%������=V�c~��z?��E��������m�/�Q��~{�S�����o�/+4v�b~Y9�zn�.�������?,i��7��=V�c~��z=�����X���DI�i����uL�2�GI!�E�����se�,A��������6K1��M�<�f��r�c�����@�~�M�����7�huD�:N��:��G����9�^0l����+�m�6y����8�;�����6 ���~Ul������MM��w������%w���_2�o������yg ����e������$o�|�d��
��b��������sq�e�*����a����T���_����W�X~c~fp{��'������[S&�W��::Y�f��X�B��?����:�#oV6���?++3�3�0�d�rW�r^G�T��6�=��`I����1W�:_�r^��::)U���/�-w��%}}}rE��x�i]
K����y!\�J��[�611����:�v�����J�'�H9_�:���b����o#�W���T
��I5����Q�+W�T�f��	yZ[j3���wSI?��l��w���j���+�t�_�7U��R�|����X
/������>���c���}�����X~����WU�E5�y�c=������<[�dm�
������`����{������|����>d�E5�y��z:�����^��s���[�,b�<�W�r^OC]��JV��[����|������!����V��/>Vdi���*�a>��8���V�w5���:+�1�P��>����q���lK���	�$<�WyV��l�F[[��v��h�����r�:����[��07��b��Un���LO�����P���7�/���K��m�������n�6�R��Kr`}������U�W��
5s���o%�������|+�C6 @� @� @��6o��O�Z[����3H��L�������4H��i��
�fu��5����5����� @� @� @	�6d+uU�myvYw1���1%���f>����)P�)��Pj�1���Zj,]V� @� @� @����K�� @� @� @Jc
�� @� @� �����'i@� @� @� ���2@� @� @�jHcM
��4 @� @� @�XC� @� @� @5$�����I� @� @� `��@� @� @� ��XSC�$
@� @� @�0�P @� @� @�@
	`��!|�� @� @� @k(� @� @� @��0��>IC� @� @� �5�@� @� @� PCkj��!@� @� @��� @� @� @�!�55�O�� @� @� @c
e� @� @� �����'i@� @� @� ���2@� @� @�jHcM
��4 @� @� @�XC� @� @� @5$�����I� @� @� `��@� @� @� ��XSC�$
@� @� @�0�P @� @� @�@
	`��!|�� @� @� @k(� @� @� @��0��>IC� @� @� �5�@� @� @� PCkj��!@� @� @��� @� @� @�!�55�O�� @� @� @c
e� @� @� �����'i@� @� @� ���2@� @� @�jHcM
��4 @� @� @�XC� @� @� @5$�\���XI��������\����6in�be�\n�����T���]�[���: @� @� @k2@n�t�|�/Ho*d�����7'�N������{;V%��
�?���;Ey�� @� @� �����>IC� @� @� �5�@� @� @� PCkj��!@� @� @��� @� @� @�!�55�O�� @� @� @��"0/��Y������9����"
M����$�--���T[�������l�L�hr�����6T��y�7��k�c�46799--��I��IH@� @� @������Z����L]�.�sM�r�Ny��mr��U�l���25uU.��������db�)��if��L5�H���o�<����L��r�/�����7��DFf�K�����L���q�6���N��Y#�^��)�|�y����pL~� @� @� �x�@,~U$073!������G����M�J	oV�M��l�����]��U����/���:��������w>(%E��*��[6>�M���K'.�xbHr������L�������|�������G��g����{95�,H�� @� @� �����n�����3��=pH���������L���lq"+�}J����IOS�u;���5j�Y����{59'�d���[&kw����2�E��'5�]��?��BC��
��[��w���X �� @� @� ,N��5�3�R���L�������_��R�ed��9~V��%.����W�|R\�,	��!9xxF��D��fN�'����W�%
)29(�G����t>w��!���'_�^��c���:&C>������������D��3r��19=RP�����7G�U;Ma7/�_@� @� @�*!���J(U!��������G���`��I9{�yy���Pc�M$���o����
�w����J��Y�U����;
2sC����
5&%7&�^�;����/�l��������i�]�S���>��?Zd�����������W�9� @� @� @`i0�,��
���\N�!�}J�)�8"G�L.d�f����U�/x��0�t�A�[�7HM�yS""��A&>��^��IG�X3'9���~�)�9*'_���|��A�e����yN!@� @� @��X�S-�9���d����
��eM ���������0}]�wS�,_�Lr�_���Ii��*��{Y�sz<7�����Q�p67'���e|���L������7�i�&imM���d.�R��'�����h�_��A���7����" @� @� @�(,�X$ �7A`~N�,�~M�������|R�d
��2c+a��A�����#I���g����ejrB�:�e��5��*���MN�4��HSK��������r����q����iR���Spj���{�'�������lP��G��o��� �#@� @� @�*"���"L��N�������U"V�-k�6,�Y��X#��e���Z��uZf�gtU����i�e2�myH������WJ������$M�M�Z����
���fi�o��n�V��������hZ��f���zD(P<!@� @� @`l�H�"��dF�|����Ykc����>'W�����������y��teM�����<9���a^�w~^�)����Af�u�����J�N�ht� ��	���*�8� @� @� @ KcM�H������(57-�s�~�����C�f���n}���Ef��DM��26>*c�d��r���z��|�{���F]i���������\� @� @� @��	`��atK����������u�y��Y�G�D�w#�-��n� ����.-][�;��7eY���jm�K�.�������,f���n�6�+m��5��oJZ���(3�~�&0���M�p[�6������J�����/p@� @� @�@�0�T��f6JC�E�le���-rv������c4+��� ��a3��g3"=<!M+ge�|��^�$��Uy{�c�6�����X�����r�7���[eYS�������d���F�JW������:��Z�m^��"k�qL� @� @� ��d|T�PK$� Mj4�p��5��������������f�z_����Q�����yi���;��!'�j���� ~���O�)��M��P�����'{���ef�M6���f�&m���5-�r1X������D�~gVu���	� @� @� @�`�)G���Z����s2���-�vu���dfrRf�W���P���3fLq[������eY�����Jk�5������\�
�k03��b]1�+o�s�2;�B6��%���8l�����<-���mR^�y������m��&i��� @� @� ,���%����M�r���f� c��o����.�G�������L�V�C���lk/=}RM��lD�}>"3ftih���W���W��fRW�\�E5���h&�������D�}�)Y�e�ql�M�}�4
]�3��	�(��R�~c�l����������vy��7�[M�&q@� @� @X�5K�u�AmW����6C�U.�|F=y��OO���	��*���n����?�o������)9z����F]�38tYf��E7Z������<�K�������L�_��#eNW���}���g�P}l��X��������9��M������
����r�|��C��z5���'�t����6��?��<����@� @� @�@EXQ��j�����w��on�N�2���-�7�g[�9�I�2Q{J��<+G_<.�ejmi�������
��f�~g�~��Q�����wV�Vh���9�������-��9s���"������Vy��I�<"]]�o(�A�>��9�������������SyxvJ�L������e�U;���� @� @� �#���rdn�����"���r�Zq"�j�Xf���`�<��#rf�8��5^=/�~�3�0>)�9]a��%��A
9�������+i��rM��\��^�'y�����r���D^GW���m���\8������+l,@s	��O^z_&�p@� @� @�@2f�
b�45�,[����U�r#��?������]v��";;����������=%o�8-���e�B��S��O�����,�����]
6"��������sge��323zE&������I���u�����*;:OI��Z�`NF��o�W�w��]�dG_�t�:���������u�,��>� @� @� �r�>�3]_Q.�����c6+���_��-����t{���683��[��vhjJY��"�S3�kj��F]y3s]�s78@� @� @�jH�����J��=5���Fmn
���6�y���F��c5��a�[�25�KtZe�}�fV����z����@� @� @�n���%W/�l�m��.��/��s�-YSxQW��%G�0���-D@� @� @�r���_n
�� @� @� �����'Y@� @� @� `0�P @� @� @�@
	`��!|�� @� @� @k(� @� @� @��0��>IC� @� @� �5�@� @� @� PCkj��!@� @� @��� @� @� @�!�55�O�� @� @� @c
e� @� @� �����'i@� @� @� ���2@� @� @�jHcM
��4 @� @� @�XC� @� V*�@IDAT@� @5$�����I� @� @� `��@� @� @� ��XSC�$
@� @� @�0�P @� @� @�@
	`��!|�� @� @� @k(� @� @� @��0��>IC� @� @� �5�@� @� @� PCkj��!@� @� @��� @� @� @�!�55�O�� @� @� @c
e� @� @� �����'i@� @� @� ���2@� @� @�jHcM
��4 @� @� @�XC� @� @� @5$�����I� @� @� `��@� @� @� ��XSC�$
@� @� @�0�P @� @� @�@
	`��!|�� @� @� @k(� @� @� @��0��>IC� @� @� �5�@� @� @� PCkj��!@� @� @��� @� @� @�!�55�O�� @� @� @c
e� @� @� �����'i@� @� @� ���2@� @� @�jHcM
��4 @� @� @�XC� @� @� @5$�����I� @� @� 4���:6��=;�HOW�49�9�9+o;&#��'x+%vl�=��d���r�V�S�����K�<{X����t�R�o:\��g���19�����T�����J��m�u�=��7M��$�Hd��K��������e�����;i�&^����$�^Ei�#�������&���G�l�(]����-7-��r��	9;����������LO����G���h��x����s��gh�m_�n=g�k\���������n9(�����c?����i��}�J_g�k��Kyi����os�l��_��^��u�q�+�����#���S?zQNM���[7��/��]' {~�i��k;n�����g����M%}����/{�����
-.0�����V)����=�K������@�l��Ov�uI��������rd`Dj�t����e����-~r;����W���}���~�����>#�KU���[2����d���n+8$���YP�����<S:����{�����\�qT!���i��c�O�}��7W��B|���
�u�w#���,���XR7����U����/�H�<*l�*����j�-:����������V��a9}�M����-���O����c���K��e.���c�l��z��7}��p���l�%;�P39xR�����?`^�:�Z�	4�����l����'���t�tm�g[���l���������H����M�z��o�3���#y�~G\o#�>���W:N��4&��s�jr2r�M������-�p	W�v���]�
�}at��}[m&Djn1l��[�:����);��O����,�^3=,C��Q�����^5�L���H�$��]u#R��.vH������>���z�o���ay��E5F��������|����zv���fh������r^���������f�C7#�\z�����61n������IFehh4c�L��-�����U���(�%:68(a���Gz�,
IX�&���Er��[}7o��j��=����Bou��X>��*���=��fl�%y����Bv�W�: }{�����c�U$���N�K?�|Ny9�|t���:�=qBW�}r�e�������[������fZ��_������I���!���0�e��G�l^�Q9���W�m�C��-�;vI��c:G���*h�O�$������y�Cr�������v��o�h��G��������4��
�W�pm��$:yJN��!��������_��N�����z���m���\t���I7��R�l���=�b���O�����C�Sc�N���>v\���}��Be=��gp��p��_�����zs��[t>��|I^�9Q���$w���[��,�n�N2*/�����OY�{@�C'_���~����������#|Q���X~p{Kn:�5�B��];�::zR^
5^�������{u���l���2[ie���-��l�n��[��&O��
����c {������{���-��f;��t���7�����KC�p�I��gd������>�����e�H��$��2����nC[���U����t{�����H��+�C�����[����nK�3h�^��d��[�]�O�Q���������}{�Hw��d���G����m+��&��5w�^�j�@��
�������{��a���cG�� T�li�^��S�*���RN������y��Cr���]�p��eR;�G�x���+��a�2J-w\���M����2��Y�z�m�pD;������QIy������e��e�7SV\}�ze��7|�_���-�a��v��u�p�@�n/q"_���}��%�.���w�l��L���:x���;���!���j�m=��n�Qn[)��v�d���i;�qr�����#��='�W���Zw�����?T��.N�O[�.��q{���20Q��m��������#���`���S����X��5Z������u^P����n���bz��1��I�^���T�j��]�t�S�W�I�����"{l���v[:crg�>w�+6��<�3���-�Ec���T���M�����C�<P=���%���mA�wW�<y^�����;v=#��h*�f�c�<���;%���x�Y�����?���������}tpeQe��L��[=4�����<�]��f�ayN��t[(vo�VY���k]�'�v��sH�sc�e��r����3�Jo������$���4lS�l��Wvn����j��K�8���{{���d�����R������W���0�������eww�v)�C��[KE���S:\]�����_��x���#���i������nw�o���@x_]�E���V������X�����{��B���\���r,�]��j�
����V�$�*������X��3�����;�%7xDN�'��{��bf��hy���9�^x���]������������Ni�+a��QZ�yn����9&/��-d�����|����l/:�#�&x���0]}r��/:�|�E]-��g�Ni��v��wB����;���c��������v��~T6o�����������I��UMI?3�����_�?�Q�=p}~�n5�)��K��-���iK���#�V����?����,�.n��l�������<��}Z��3X�-v�|;U*����~?K�����BI����e�[>rF��m�}�n�W�����L�X��|���wk�)6��.�v������r0]atF�\���*����3����D�J�L~k]������>�{��#<�X�A�Z�m��������n�^�4y7��F�t��t<��Om�����H���G���.u�=*�6����Y�z���\Y�������Z�}�R�NW�����w������R���~}��-5��)����_�?���x��z�2p3�>��/>��n1���4~2v��V���������VRg�)!��Y}�mZ��U�=X��m�D��
Z����=R����t��m���X��&����O!��;j�?��L�Zu�3[�>�3��L^���������C��%wFN���3���k^��]�<���N�>��������i����M{2��5��=�����:�~hR��������:�q���xT�����e�@�����.Sk�N��S�NZ�8,�����S*[��l��h�ZeK�R=#���w�9$L�!]����������~sE�������s�9}VN:=��t�n;����&}�tuS�����*��=r��a9��[�NY��hS��%n�W��u[��{��#��t�uet�������i9�8��j���,].��'������sR-�ro���}���-qK)3q��#�g���&����i�ujQ�M2��AnV�xy�k�������!��x���W��������3�Z�����4�a����a{��K��-6�Zpe�~!��Y�/;t��n�du��X���3�����NR�u�DZO��h'���[�d���32f������0e��Isg4M�;���(���$���s�����������QI�nU9�u���3��?�t=(�/���F������
W�g)��^���q.m��-�;[WvZ���L����i[��O�F��l��a�����#N�'������r����N�p�����z�����Z�Z�:�/OK�Scgl+����e�!u_S}�y���o��j�����=,v�H��=S�^h;��nm��r�}��WgR���g��M�4�~m/N��/���C���AvkWN��I�>Ww��b������g\�%}�k�<���=����� �KX[����}	��co�k+N���y�s��v���Z��*����C`ZN%�R�Q����iGa��n���z.g�h[h�\E�;U7_���;�:Mwh��[�>�O��X����&w_��F&�j��B6�RQ[��{T�T�5
��I�H�O��;�:��+WI���ol����=�o�}�������.��+��b�E�Kq������n���}A�&M�QQFADS�JJ�*��7N&^�`������{�W����<���6���>
w�.��!�yL���Y����8����NT�Q0�DT�jF\5J|y��9��9GG��,�e�����}������g��o�~��^���55�ca�e��[��f������
�����(��1�K�~�1��v�p����1���(���j��q�����������k?^�����FK9��T�E�n�{��nm:��7�@}�>�K����7�~��8�.7��i|�N��z'��)��rQ1�0X��]�c>����R��N}[
�==����������}��k�bU��g����M��/8x��z3B�������I���}�����&!�7�MNb]�f�7V%��}(k��������hq����P������v����V��Jq��D���I��W��.i�OC���r�8>�g%d����\�j��*_m��|��q�A�&�# �/�b�������]K��~|/c,�����>�[�u��p\c����"���Hy0�'��c_)��88�����3���q���l�����o��XW��-,�cM2k[p�ih��zp��<��I�J�P������E��������������U!�����.LN�$���k����\l��,���z�a
�M^/V�1��e#S��kw�������<a����]�����}��w����a{�$���X�w��X���:�^L`��v���w~�8��$��gK����Y��Jv������(�v/��BMMtS1i�;ESF�!����1O�b�Ai�4�5�(6�-�
���.�Y�`���!
C�Z��&�s��&������k��r� �0��Xe�`�3?J=~
A��d�h��b^*$gir>U�% �JP�>0k���&��f�eir&��p��ul�"�U����2<���@3���'K���+��Y��yWic���*���=P)]P���>%f�*f�`������GpMMPZ�13�7�<%��4e[�!k%OMl�{�m�~�y�:*_���)�00���	(����z>��r>�l`���J&���e�u��4���,a�4tg�i��*jZ	�q���%��P����"�����>��!���`6Ab���i(��`1��Y��g����q��M�.w��3�����nZ)?S2'�i��iJ!<� /i|X��
E��iUV�i���pw�������P��B���Kkk!��	QB��u�i���3��A_��3��SQ6���Q���	���O5��t�����5!��i��i	����i���cN���#�)Sn��M���p���T7��IM�P#*�p���E��IC;XY��q��}��IJ���OV����P�HE��8�����`��	,�xk�C��`A:=�^z��.0+Y�,���4�k$1@�B����D���Q�f�`-������9���
��]P��y�@�]���V2�XgOoX�TVi56B�q�X�(���j
���D��{���������C�A[��bmMe�P���l�����{
�?D1tt��p�Vn���>O�1��NT�K	b<l1�`�`f��;���5��v^GL�q����,���g=�����F���0�7IS�)��)r2��0������@��u5hK����;�l���
��ca��phw���1�>g���8�0�}o�GNv���F�l|�_[��x_�Qt�m��;�=y�SU3x��M�� �=U{��]��9V������8�/i�������TS�H����R��mfW�f��|��dPwI�Zv���������������>���}����C�F����Z�a���������T���UG+���g���D��S%9m+�k2���v�P��,�.��1�de���uG��%�a�jM����Z���8������,d,
�����J�Q�i�Y��T����#�����T�-<W��g)=�w.��qX����`�o�=�v��~'��������%mc��fy
r�G.��I����{M�x` ��=�K��f�C���������S5�v���wP�*i�0��)5���2C,��Z�
<h�&�-O������V w��-����e��Z�b��\�b}Z�:�o���)^X��J�����UAKM�����67���dLa|�v���r��]/��
�c���Hv�v��W��"e �Ja�r���zh�)�tsh�^�H����+*���eM����f�{9��k��Y,fw��x�J0[/z"�Z����P�������D����Bgs(L 1� (���|����)-o2S�y
4�d��$s�P�0�L\!�Ze	>�s,�`fr�� ��!���i:i��YI��f!E.z(b.0�����Rt~�+��"Lqbf03�(��\���A�@�{ Z_1����0��>�"�5Z[=C�������\��4@A���	-�DF�$�xq:�P�Q�k3M&n�����3/t[���{�m=mj��<��Vr�n�BKCYY��eAY�ab3X3���6��
�%����7"��CX�����S��\8�	���e������aj�l!������,2��y)@�
y�?7�
.���\����=��<������MR�]t�������-~�u�����hr�A>k�������Ar��(+�g��E���>`VLV���v���v�i����_m%wv�6ha^)4�"4y}��,�v��������a��Y~>S��IoR�
BP�l@��0)��#��@�S�dB9����y�Tg�Y�V������WNk�A�kR;�jN���k��x��6cjX�Z[���
�>��d�����1�4�����(��K�*��E�V�OR����d��B�����6R��0�^W�1�������j�����<������%(�x�o�������4�k��#��oJc_eG�����!A��'����N����a����W(��c|�F�9���`s�����<�
��v7�%�0z���@�sf~o�1�o-cRG��k�Q�a��}P�`4��6�V�P��'��3i(U����u�k8������l�]�$������6�c�&��T2�_<��5>���`�1n��k��>��L�VE}a[CI�t#���Ql�,��5k���=]�1�5Q����N�{������K-�5f��v�c�zim�,��h��m;���p�l���9��V�k0�r��w��������h����L��:Qa���+�J���J]j�5?�����*�5���]��&Pk�a�U�(c2���z$
��>�&�6�Nk�(�4��6�����&�h��M���-�cN2��O���a^�y��c;�n���)�MD+�����=�g�=�����B��,�h8.jQF���-e��<�(#�:�o@Fz�^ ���|�@�
e0���1��4�p�4����IU�;w�����t$��w8����_�V���^��� _�&����it]���&�6w,�>���$6�x�w���Q�8uq�7�LK�
@x�?�?$Z�n@y�J+0�oa�(�1���Z�ei��c����8��uo2���&(���]�L��b0���[��Z��+��u_][����M����;*W����"�S:��B��A��b�u�J����MZ�:�sP�Y���������6����;�*�v����S���k�]�-��ZZ�Yae2xC9������&f�z-��a���T{��`9!0��6���������y�Ak������zR�w�<������^#8}����(�9<���O_��	X*m`f+���-N����u5
����|�L�����]��
8&������XOY�%��
����
��)V|4��$����p|���z��9�J���6�M�_�gk�o�?q����hG(�6��X���O�x��4k��L��M]>Xfb�+6����	�x�rLQk����mgS�����{3\��l�J�F[�s�6�E������4J�|��V#�������(��A1��Zk+�
i�z�'�J�J05���Y�^�������
���+N��r��=OV������n9�K��f��&�^m|��2k$��nL�ha��~���?���~��y��o��T'c8�����X�p���.����u���9S�����*Ba����Td�/:{���y`b���d��y[�P���r�E�oV��#��@���S����
�!��(t�uC�S5e)f��3��X��-���V�,�^�u������B����V�1������i@N����Z��>�
c���89���^�nV�hm
� �b�P[3���V��j���-�*u'��%�
�.��-��u�0;>�����Py��lXv���(�����:m��dw��N�`���ny����3��.&A�+�5���@�����H��^Ap�n��P����i^�6��VN�m^};�������;(#t,oQ������u_]�~�7TT4.���"������EMFk����N������on��T~�z�������?��>d�����3[��4J{�����M��l���Z��`92�Cn,�9��Dm��1�8���e�g\�/����$�����21Z|X�%6�e��T&��u�1#V;�(i����)��[��S+XG&B�n��t��0��a_qSf�k�l�.�m�����]X�xB��7�&���Cx�qE�g6�B+��������������m*$��
����]����K��`
g��k<��k7?	�rp�C_��{>X
����>�Q�R�]�:q����7��(��L-���c�6�t�x��Z��1=1��
����$r��E��f�������Eu�svrc���>[k ����G)���
� ��l���(+��q^���Y����X���gX�l�+���JvFd��2����1�7��3(�������A��V�A}�PZ�:�@���y�����w���p��4�k��s�TZ�����{+�[��-�-�����|7[o�������
��!��Z����2�����h+������-����*��u2�r���3��*:`���y2�c:�Kj_]������vP�f����{Cd�f��k������y���X���pg��c1[�%�p����
���p�H9�
q����;.P����w�F��k[\[���������d ?2��p/����d��.�`VC%]M)iy0�i���v����A^�|��x��!�;	7}��FcY��_�q���
��Z���T���%����`�{Y �}/fu��aR�1����H��[����N��N��I�}s���yi2AQ�4	�f��`�a�wm�v��Y��Pr����M]����Ghip�@�[V�(�yaF/���k���znA6���\b*�����9����`e.�^�E�I
�1��g�b&M�������g~��p�����Wnl����3�0�bG
������{����E����)�p��Jx��,�>7C�)������1����������f��4�vhv���bc��MB�m���\����%���G-��
�I0?�>^��<�4���&�~hLn�6�f��L}��0����4mB8��m������T�[�R/���M��7x
��g�����@��*�����z��a7y�J��:}�Z�u���C�CY�z}���)r�|����:;������ZZ�.�4�^�<x,D���;�����k��w[�����:Y2���<��/�u����3�p����i5��������������z�~��y/��P���s���8�T��P��K=��E�y�2(j\���,�r6����+k���<�:a�6�ff-�i_�yJx�k
���kM��iZP��k�,j���$���Xh��W���+bRGk���IXdX�h���P��������l6/5��Y��w^G��%���J�\�,w�Q,��m~`����[������ww���z�W�M�{[?S��BF��{��RJI��k�a������X�\rmcW���d���6}�����I�i��������@����E���m���u�����=J��~�^S�1V�����|#����3\Z?bq?Sn��*l�r���;�q6��&u��������_�f�{Cj[�;C2�7�c�T���g}}�:�n�<�`�B)�/�<{I�
�����������wT'h=��7�G�V$��<���,�a+ll�k���e�o~��z��R���]X�����1V<fV���`}#�5��
�cF|R]k����v�t��l^�����}����=�w��	ux��c����_������	|BQ�O���,�*Ax)-7�j��h�F�1
c�Ct��G�s��B�&�Y�Y�|~�>M��~�q��Z����,9H��H'��c�����!�P5��M�=��C�EN%a��2�.�aQ�1m�
����������T�B'N�D�����I����l?�&F�<�9^;��cXW0J}lI��J���{�c���q��!��b<����X�;����#3�?A'&�1z{C~�������3x�����!hX�+c����]|Dy��rH�g?J��&SvE����?�L��.����v<s�%A'�52�u�E�xm#G����F��2�CQ��J��������a�6W�k�n���Y���B��r_������
v��A���OIx���%A8�KO�����!H�
�4]t�l��w��7����U��~��-��y_g��}���0��4V'�Tq���ol|��;D=X��`���m�U4W��
�-%���~N3kV�u9�[�n�)��a}\o��G����)������xk�i���=�
��H~�� �c���(�1��I�
�4,e�4�zB��19A=%�lf���7�����u[Y�b��)k���������I�
P��f\��~j|��c�������xq:KH��Z@��zJ<�#Y(8x�-ii��o�K�~�a^�5��H�P�R��R�]�7l�X�h�i|��U]X������-�o��A��1�^j�B�������K��G|��|���[wC?�VFE��G��}������l�}L*�����AW��j�������4������=��>�_�T���v�m�)�5^��m������V��^a;Jr��g��c�f�����Kr+ug����Z��-��l�T�`c��������+J=<�a]F��:N��
i��l������{��
Z5���!I���mjM���;z7������I[�B���5Hc�H�@:��`s��BX����U:����r��j=?�q��������-��1K���nX�����4lyO�l4���u�E������\5��@���A�>/�fP��FL�7�Ia� [FM�!;���+G�<��?���Z���������k���Zm?N��q������s������q3h��%�������<&��)�I���v#}c�[���{4������fs,�a�^XjD�#t���]"Cn?fEG����ja�9����)��.,�H!s���{�Bw7�F���2���^f�R�d4�Is\�+��(�dX`���3�p}2@�#Ag�@��OQ������.����'�^J��c��
�j��"0��{ �^����}7�L�0��Gcc����,�
w���SbQ����S4��Q�V/E:\X[��Tr�ZZ�4���q�&��{�&����04���$5c����Q]�u��L��1�6������*e���<�R�wn{���;1��qo���~a,��O����;M��i
���&�)��JE� G[z]��L����oa9�\\������,����^�of�K�<.�ol�H�������,���;��b�65��3��,�	�=0�s�H����v���	1�����l�Kw�R��a���oqT'M�u�*��k'X�b�4�F����}T����jG} ��i>��i�E����	��M(����h
�67O�Q,*���XwJ�\����d�
~��Y2��i"����P�wc}����7������LrX����o������S�(Xq���Zz�l�"����,�Rs�`)�o� �2xvU9�u�0���<8��~���<��7�5���D��z)�M���5�R���;`�EJ/��A"Iy/\DD�[6k�����J��������/Cy�(+��/��Iig7�dz��b`�F������<P�E�?�cm�2HD�V����j����Yo����4�(�l��sa��D��}�V���Q}_���A_StXG��<�!�����s��p9l�ZCZ?����_����]�Po��s���s����FZ��6�3�a��|(��a��O�=q���T�T��p��O��wu��H���}t��p��W)�o�J�������4�}��/t�V����EZ��`���$��xZ-���������1{>1M���`�
o������7R^�/��7�7�x\9��D�98����e���V���������T$����n�-��~�U�Ic������;�o[�v��B���l���|i��w4���UY<_����y���J�Q+-����eJ��-���h.^3�{���J����^��N���J�������k,�`<���+r�<����E7r1L$����c�Jp��T.0n9mW������{V��3Y��4��.���	��n�MP�o�P�5;+#��+���4f��Y[��
`]j�������:|O���U h�Y��hx'�G�&��!���9�Z���e����{���y�����i}�'D��,%��/��\�v�WT���eM[�f���)�L�� f������������*�!�<C��A�J��.}a������9��&����
�������,1"X�s�I�L���I�,�D�y,����8���]��\�0e��.ME1t6q��e�@������i8��0]�����"%g��������o�~J�$Q����Ofq���4�������Y& `\l��M�1F�,N�t��g���|���SU��1w��P>����3���V�40�y�-|��L�oe�@����X��4+����low�q�Q��|���g�z�,-�f(2��>�.ae�^��Y6O(�L��
q��� �	���,��\��9��Ud'��6��C@�m�Dz�����bW�3y�!0�G��;9�C��� ��������R�����b�������'���*����������u�L_g"�Asgih
��3��"����������>����(S�gi�#X���(~'�&�4��o�|����P(�Oq(�g��(�\��-AY���j�63w�}�6��6�DK�Q�\�E�0�WoO�@H?��z-=���l3K��5�py�����5LN(������u�`��Lc�X����P�Br.���I7hu-�B������[5�[�+���!�RDc�&�����
P��������i���c,������<�#Y=h�>�K{��b<������Y��9����a�LSlM�����)�aO�]���$�
m�sM�mn�}}��:2�M���z���L����n����F��f�v����z��I��!	�����/��������}��
��F�����>�8�����]��y��X������p��>hp�z�}������L�}�G�h����I�5KM�����R�^��X��e|��p��[]���X�������._t7��os�H���������9L�������I_������k�*y2�����)���Q_�m�0����3������s�1vR7l�����e�7,n��kX���W�
������}����h�o|��`,�Y��
�j�dU�e����;�����n��gf���*A��x���qze�f��46�5�M��6�5�5�rj<R�����_��]9w;�K���J��qK�N+�����Ku�����3UcxC>��n�9.r6~�k����U�b(Z�Mc���Z�stfQ�V+�u�6�0�J��1|_�r7g|?��2����|I����5��q~l�W��������?S�hcu�2~��������1��9k?�R��sWD_�������{�(�k���H�~c���~�p�gN7eY�8U���	8���	����
�D�0�����.q�O
��t��s�X4�k���yZ89���59�����>n�d����������-�(c�-#��`�<1���#�g�l'���u6�b��g�t3n :�D�;!P���w�)�e:%���Zn���b�U��h~<7i#�t�^(�6�>\����O� ���I 4x����(��[m���{���N��1���[���
j�����J��������2R��
����*��\X�������D2�	�����n�S��Z�{E�x�������)�{�Z�DX�`/��;�Be\�� Y�4WvZ�$?{��'��;^������-D�7��\*���,��ZJ����B! �2���4m�B40>�5��>����4��H����<��c��Xi����I���k���B+fGcYb�.�G��$���@�#�i'2U\[���Q��2r�r���
���6@��$��TaR�\�u6:-��!���6�/CK�����%�� ���;��rOY���0e��ln#���A��-�iiv���~�����o�)����kX�&�C�h�������#{�ZY#�=��T�J����)���j�������zy���@[K@�&_0H>���^��],�o3I���|�B#X�j��X���A�X���h�9���wc����b5[,�\.�Ck��j{PJ*F`/��;���:�$�J@������|	! ��B@! ��B@! ������Y�/�Y
)��B@! ��B@! ��B@t*Q�tj�H���B@! ��B@! ��B@�}A@�5�����B@! ��B@! ��B@! �@�eM����K! ��B@! ��B@! ���DY�/�Y
)��B@! ��]�*�@IDATB@! ��B@t*Q�tj�H���B@! ��B@! ��B@�}A@�5�����B@! ��B@! ��B@! �@���S3&��	x�w|��=61�trf����<����h�N�P{K�����m����B����$-f�����S|d���]���B��^�X#u���|�A��,��r���a:����I��G������4�L~=�;��R#�K����?�}�(�������r��?F���KO����=\+Z��[�k�����������s�t��'�"l��R�.�{�D��u���?|�A����K��|��6r����z��6rT! ��B@! ����DY�+M��'5��4�s�f��y_��F���T�`��������h�bP�R�����b6���;7L�}A�$�w��{����4v�0]H���I�l	��{�����l��A! ��B@! ��B`e�����Yz����yfu�f���&��5��m����){�.N���&.(E��������L��,r����]�>C'��l^��O��w��?��G[��'��7\.��Z���<������B@! ��B@! ���(k�I���h?��|��>�6��X�������m��T�B���j��Y���EJ���q���������4O��H�P
�E����
�
Z�����a��q^�7���/!qJ�-��r�8���4����3�V4&����o��#sI�D�<h.�<�X����um����D������I���@�1�dk���y���-x��F�h0 �[�^���9�
:
�(���]F�SO�|��G�������"%wX��-�������r�)@Y5GK*3��+H}��t�
f�i������S�^[���'�H�^�F��,�����2*�0��	Z?�SKP%h3<@C�a�#.d(�0G��gbkyi��k���
Z���G}��-������(�Km��vc|���hv�Os���/C�_<$�$hn1M��0
t���i3�66klc]��O�B�=���_�~��G��Q���p���}���A��(����}�BT*~���!�
��i������7:@��-����0���G��l���=��\�{il�]~�f����v-�o��}{X�����������L�#�����C�#SO��|�z�w����^���~7�F�O/^�ss�����$=��4���W���Q:�W��}{�t�C4��w�-����bK�{#�����������[������o�������}f7hZ���#�D�,�
r~_����M����t������g>����A�J�e:;M���?��rY���O�~s0LZ�_<OO|�+��������H�s��>�_�K���~��b�o}�>���+�9��������)���� �/�@/l^G�����>�������4��7j���U�nF�x�.Q��'����������L�! ��B@! ���C������?���R_�C��UZ\�L��&��}46�G~S�|X����V/s�t���,��&w)^�cC1
t�)��H��I�wA�84B�>=�/>F��Q�7hu��lP�F>���|C�����	�5��w��WbC46�"�hc-IE�:Q9*%�`�MJ����y�PJ��$�����=E��D�`b[cP$����D�5X�P��5B�?D��O��'�����J�ocr�m7�����;�,�*�rct��U1��$����o���T?��m������CvC�z\M�h��|A�\^3����>(�
���C��P<
U�9W��Q�[�t�^��Xcdk�lW`��h�n(N��muJ7nM����Qd3�v�JI����
�U�)������(��)���'��Stk��0l5/��s�L���=�yZ��4kBQ_\�`����vcy���f��Ph�s.�
��>�.J�,�r"�������4�+��1�u��p�
���i�%5�s1��q�v�.(�F)p���u��������4����:������U��#�7�X�i��oSos�g�?lx$}���h���z���j��n�!3�����;E
G>�m:����V�O���o~��|=H�����J���=q�]��~��a��p�S������@+�����%7y�G����\�C�$�~�������D)�����W?x4�����?���:%����9p��>����m�����n�=�
���Kt��0}���H��+P�GO}�F����A?��n������o�O�O����zZI7�~�}t3�#����?G�7��O"����$e��#o�}����yi���D_8~���Zz\g��*���;��1��G���C\F��{���7fh�"�����F�T�Bf8�y;Dt�)�?�EE�o�����j��V����B@! ��B@!�y���Mu���c��&��h&Q�B�X���������Lg�&*n*&����d�x���Q����P�n(sf`y�\,]N���L�)���%/�� �L���|
��R<�'�)
��3kW�@/f�C��<y�V��yX����8���I��F!B�p��k�t"������t��M������%P&�B)�)
mM��&�����������>VtQ,���Yw���aX
��w���S��TB�������E�8�)�
Q0����MX�8a��~V����4,f���ou5F#�qK��  _�I/��dq
�M����Z�BA�8����s{��0�e��V�p,��K�S~t�z�!����r�<��/�O}h����4p]Y��q��q
�2Co��c1I��6�4U��2����0E|n�d�C�z���y-���4����\u��s���P �Q��4(����i~�|!�����y�����������e\l���0�\��P��4=�^�7���,���p=��}2���5L�\�5�������3�U���
���PX�/%X�"%�m�V34|J�
�V�����M�2Kt}�����J���0�(���C�)�U�&P� �Q�4���=�3����+Za)55K5�#���1���[i	Vb���o~Lg��/>�_i��\Rh��3��)�o���DK�K����bP\���<B��t�0�d��n:+��h��Vq���i:��b�pTS�<�����K���
��y���@�~�8�C��
�d8��k����������>��S���������?g�O��B
���?�L��[���u���������{��W>A������EKZ�FZo=h�M�����������������/���e���+1�(�@�2��A�U'T���)S�0]�o}���'�������~����$���V����9M��_�{��wK��������7�hb�����?3�Fv��B@! ��B@�$ ���T�� �xB���5�t��k��3@���C?��u]]�n��AkW=~��7C���D��ZE��kt���~I4��&f�����JF�u���y]�c:�'(D�X8�`�b��kBZ���4iZ���H$L�Z��7,���|�Y�<�TEQ����oP.C6*��Pw���)������e���U@P�;(;UO>�n��f�cu�����I�
�l
����EN����5�(�
EW
�J\K�3�UL���5^��l����������@����C����iiz�(�_�D*�hu�$���4�������n�B����a���e�"u����p,������dSu�i�c���H�������)f�(��\�����d{6��n��s�G�<�PS���L��Y�[;>�������`G�cv�A���
s(�)���w�5�?�1G2����h
��V��x�p�XiJ�E�+�������;1X��V�����`���88�@�O��&�g"�n��N�?$��EwM��=�H��;XX�@i�B�XME�*K��K��7���#A�r��5�a=}�ra�,a��W�D�/��?�.={�h,�����ez4y������&zx�z��04�'i�����V6�Q�=�Bi#�g��.+1��A��O>@��.��g'*j8�ss/+jx����s�@y�:?�'�M/�����g���p@W&��L:���-o�����a�2��Q��������{�n=��?{�R��q_gsR?��w��>YuV��:x'���s�dP�T]fs`,zG����JQ����?�}������
���3Vf�|2�$�B@! ��B@! ����rgo�W�A&<sY�"�,Q����\\�N5�i��yn�8�&L5�)�����}�W>j����-�Is��W�L�8\����%�Y�a�uN"Q��[i.�
���K����&|,��,4Wh���z)A�f
3�k]����#wA������Z
� d�I�0��^^�d`�����k
A���B��5�8��� (k#m��
���Q�=�5x���}�L!��U:T\��U����R|h��hd�\��k+�
"���P���&���F������@�h����zs|���������>:��-��q{�z�j���Zq���n7��K{�����`��O���K%h��(EP�h���'�4gc����B����)W�Z�(�T+��T��^?�Oy�n�2������)��^
�
\�l�S��=�_h���G�t��4��/�k�\����'�3����5�����'����[�*m�(���:�
z���t��7�	5�lms����|��_��k���)�B��b�]x����]�7g�k�>����t/\����E��Z6/B�l���t�����n�X�"�s�aL������ �Vu���;x'��q
�F�uK��(k��awr��|��/�3������#Vv��1! ��B@! ��B���������}������v"����,#�����5J��+Yi3������)�t��or������}A���F0#������]9Y��i�f���j*
p�5��EX�`�
���P��X�]s�V�C#6P`uJ(�J���4�Z�P0�k8X�p[�x1���&r�[��YX�����=�Q�8�Y��,hX{X,B!k�L�-�:'8��f���{��f���5�"}�J��f�r���'��D_<z����@���C�N��(������e�]6��=:����'<J�wA�p�=��=|/}�h�z�eD��O���Z�.(L�������{������S��������aO��s�t3�^3���j��@/���r}r��[�U�u.^���XC>�����{>O�N
��}7z��gR7�-���2P�����F�ZMW�B@! ��B@! .�W\�;�������b�U���.������1�,��=�<����;~��w�����g0{����<��!��J���u(S��]X����7*���-��r��*�#�Y���k�h��T���|}4~�8M`�kh����X�����
Z^8CSp�����7�X���+�8��+�A>k"+^�A�Z��s���|���������T���f�R�E��>M��<�5|��<�G�����M��3�S3�*�A��	[�K;��VZlk�i"7X+��Wkk�:I'O>B�NM���5j���������1�
[lYve��Ush*b���o�w*1o���q^����NaM��!�\���LYn�N��)���~�����t�;?Ng�y���;�����>�1=�f����;���<=�e�������<:�X�<�
z�>���U���&���<E����!�8O4�p�Z�	k�h"��9��^���7WUm^`�o���e�)�A��c����4E��g�=�������F���!������^4����'�5XK��~��y���m�7R�[~���`����)Jq:�\G��������}��-����^&�B@! ��B@! �@�eM[�$�+5���-����=P`�z�_[���s��)O���P�#-��*��tqk��rw�2k&@�sb��
��E���m����vwW��K`]�!4A^rp�U1�)��C�x�r���n��R�(��c�b��&56�PH�3]Q����>��.��w�8��C5T	�y�f*[�8d��~^��x�Z	�D5u��X��
���-�S2
�?n��
Z�W��c���RH�_�(����
IJ�_U;t�
8�XO
�gm������������n�����=��U���.
��&� �
�U�A��*��{"�G��[ml������g�kwp��%�B��w���PL.�rz���n�����b�o��?����?�C��������%Z��aMB�t�m�����|��w)u�����&�%J���Q�����g�,x7}��w������
��i��wh��<��Wp����"�p�6bI���g���{z���H�G�t��G�G�#�*����tK��E3��s�#����~�����t�{��������������//W����������6-��S��8���2���>K'�8Q�/��9de�L���B@! ��B@��# n��T%��J�G�rj��	Z��>����]�'hq�me��4-/�)���	%����,��"�S4��I1KK�n��r�����B���\��=�.I�����)��@���V����`�/����5�����2������^#��<�uhkz{����N��uK�	P��(�r��+L^\X���,V���z�@��1�QB�,��B�0��EJ-�j�LyGl
��g!F����Xu���/LQ���<���*����Z�P���#��M$(����Y��-�Ptez�P��c!�$�g����b�!����h�����7N�Q��IX���o��p+�!y?�����VK������@�qb[������=o��ejg�q��L�
�A��!�*m��Z�A���qU�n9�	�R<��!�+�+��^��"�=n�h�p����Z7������[ �l-�����_���ch�.��%n�g�p�:x��l*x���{,F��^J�����6��\ha�H�����~���N:������Go��>>K��}���u��o;�]�=F_���V���Q���a�rJ�%-�$�L�5V@���'���Qx���4�}��t�����������08L_��0-���(z'�u� �:�5v��.��~��>7��t�@K�'��D�T&��S����
��
}��w��~;}d�kt��]<��v�x��:y�����G�����W�~�R��t�n9T�*��S�|A��������%:ws�P�\����ED�&F��'���I�����g�BKw~�z��Czb�)Z��G�[��h�.�������rg�,��B@! ��B@!�q���mU����iZL���Q__��~e��ijrQ�	���
�345�J�����>���.�L�f�fI�Y�Y���E(r6���@x��PbnBx���zc�;3�tV�N�+X�k��
�E����5���u���F�J�ryR
��e=C$�&����r�\����OM�b+����@	V��:.�+%��������������i�O�m}}��Q��4� ���V69_�s��� ��#�a��A���Vp!7;=O�Y��fM��uKQ�������o��al�a��.���w�v��-k^�����=������6���$(�ff�L�(����C����L��,e<><+����e�g(�7�	��nQj��PXkm�/FaO�R�p=�`���*�ZT=��-�s���j)Ej%�����`:�����Mq�=�!��)X��
�{���h�]�s�l~�������	+�����M�P�\8�z�}�()`j$x�1:���x���'��N���>�}�|����?�����_`�s�o}��������s�Hw�u������n��'��|��8���;Keb��}����z�h�c�F��Z��Q��{o;�r���eP������"��0������bJ����;�;� ���^�
z��P��.�5Z�p�[����+��i6������.��	=�WOR��P�
�/�k�|����������]�Y/w��"������{OU��#Y�_,G��B@! ��B@�N!pE��=?���H>�+X��'Ob�&m���W0Rn! ���"�k�����_�<����U4)�B@! ��B@! �B@,k�BO�m�.�H������%! ��B@! ��B@! ������� ���=J �X�C���6�����b3{��R,! ��B@! ��B@! ��:Q�HK�1.���Xc3�Ns����.KB@! ��B@! ��B@!����5�����B@! ��B@! ��B@! �@G�5k:�:$3B@! ��B@! ��B@! ��~# ���V�R^! ��B@! ��B@! ��B�������C2#��B@! ��B@! ��B@�7���o5.�B@! ��B@! ��B@! :��(k:�:$3B@! ��B@! ��B@! ��~# ���V�R^! ��B@! ��B@! ��B�������C2#��B@! ��B@! ��B@�7���o5.�B@! ��B@! ��B@! :��(k:�:$3B@! ��B@! ��B@! ��~# ���V�R^! ��B@! ��B@! ��B��\�Q���! ��B@! ��B@! ���"p�M7�-��B�������Vv>v��w��O>I?���c�nz��0��O���%G�<�}��G�wWN����\�(��������+����s*E���������n��T^��E��P�G}���.i������w��62�w]����C?��������d�mo��/�����B�=�L���f[���)u>����%��z���r_��q^�#�{O�4�>6FG�m;�z<.�9��'?�	e��m�5���.u�<K/���������
����m��j���'�<����k��;wn��%�
! ��B@! ��B@�H������l�22t�R^K%�}>~�+_Y����5?�����W����}��&oL?��c[+��������^Z~�)������'���[�U�|�.]�y����^�|���%����5���a���4��b����>=MKKK�������^�pAcZ��z��s�! n�����
?$�w���!�>�O����w�����jz����b�0�����]�[�b�on+<���4?��m�v�6���.�lW��������2gE�! ��B@! ��B@��"���4���^��2��1���&�^u�����|�7�h������=��r�k��j�.���+c�4Y��2�>�����?|���1>�VJ|?�����4�����l�]�E�����Ak3^�DPflJ�
��k_K��~�vGev���A>���/j�~�TPfhFE
���h�����2�����Z����!�V8���0�QS"���s/��}����W�l��;K6?Ty����2*�
'������|�?&|�fP��w��,���A_[�?����2����ZM��1'f���}�-&�@�P��������o�~�~��
�Qq���Z���^���|)�Oc�s|U��$T��9�1���8��_����Qu3��w��F���+���r\�x	�K��8�j�����za�mH���H�l^0���9�#�)z��
�vR/?rN! ��B@! ��B��`���^}�������������Gt���k��]�y����� %�R�M�,�eE[
�{qZJ���Q2@%5��z�V��������?��n���0O>��4vi�z�]Zr�ybY�<��W����
������5�_��W����s`�8+u8(���w�<M=��Fl���]`��������{��a_�C��������q����-k���5��
�9>��mo��������P�q'�J�y��]���A9��/V<�����9pZXc�eb�3���5������1cN�n���~�8�y�mz^Y����������.��=9]���F��_���j�\�������\&.����A]�,�������r[����������1N�e��w����9�v�E���i�}|��6�e6Z�q����E���##�y�B@! ��B@! ���Y,�R2>�����L�}����r>�D�xJ��O�<�M�f��?�=��m>�WX��j`��N������� R�ZN�����{��au��=�<O6��XC�s���}�u<��ebt��K���m����e��^�E��J�"Mnk��716�c%�y,���EY���Bl�%6
���^��tQ�a�+
-�YP�,F�3bK	v�et�����:�u�U4���iSY��.�Xc��8T^�*Vh(u�b�E����P%�gekj_���YY�Z��J.3w��?^��\�1#��0v��i2V�q�3u_�������_���#a-���@]����[����q~������w���e���3S�)�P�TP��_n��f8�6~���)����j���+��?U���k���g�m��2/�_��U���nd����B@! ��B@! :������3�Q�L���i�cy*�PY��2 �w�2�=�(�'��<�����k�>S���s�����(�dwaW&i�\������2&�\V,����Rv����;����Z�k�,Ri�	�,�dy��#���{y	�����������<w"li�n�������:��y����������*+8(��1wl*(-���`��X��A�A)��y����Gu�\nV<(E��	�9(a�s����(vy��X	���k+N��6��`�=+k����]�u��}3rh��1���G��� a+f�^�����=#�����3���V��u��F)~���0�w���]����`�N�8��k*}�w�|�+�|����C�����5����/G����A{��~N�V��bkl��MX��J:���zN���B@! ��B@! v��Z����:����O�h�a��R�����XF��@;�_��*���y+�(��5s)dj����<����<����3��n�����L��]e�TMF7�9B��L��N[	����8+���M=,��`A������������K	��j���?e���������/�&��P�}@wq��/��zb~^�z��V+_�Z�+��J��[XI�

�����~N������[�����:�]��}k���{r��>�����"V������R��"�J�U��S
Dc[d��ek�f��))d���^������E�	! ��B@! ��B@��a���k_}��0P��Y��J����6q����tVx(O?����������m�c��
�S�����W OZfy�=c�g<Q��y9�f�����u��1�;g�g��u���3�{3f��&�2�t]�����eM��*%�r�Bv~�5�N)��,J�n�
?����,�7��Rq����U���ve����qg�n�X���Ah�Y���%��Q]�-��rZ���5v�����?s�����rp�8��LY��RAZz��P����b������e��?�B`e���yos;c�l=ct�fLR)|����;t]�zG��;���:�{����A��V��b���6����3���B@! ��B@! ���`�[$����&����L��n^���{��ZX��n��,NMp�ue�s���9������������
�������d��a�g�[�'�n����Y��A������w�^���c9�E�q^Y�������+j��3�z�����eM���(^D����o��v��R$p'at����,l��$P�9}H/?�����
Z��I����Z����B��YHn5;4���v����'�����^`�����J���(%�Rjq���dF�����V�Y�����R�����B3�T�����������S�j��6rC��w�|���v�p~��r��G��W��1��*��$o*SQV*r�7c��O�������r9g=o����2(7n���
! ��B@! ��B@t�������L���,Ur%�{-<�m���q`�������L������a���aA���h�-�9�s�.�Vc9����3������hr*���k�����X~��)�kX��e9��9�H}�m=������W�4�������\����R|-{����<*=e|P�:O~���(k����H0�k���J��8?���`�y�k��A�.�n�h�`Zi��/�Ru?N���]�`�g���r� Kt�X��J��3s��vy�zf�L>G?S<kPZp.�Z+E�Q������:��zT\�:j�LuR�����O�����u�|?�����P�\�'����Ms�f��L��+��Ww���b��Q	hT����zq���G����?���s��W
��������jb6��/.���&eU��W�>k[Pe�_! ��B@! ��B@��'�24�*c
,�R2.u�V\>_���s�T�_�QMOO������6*���=����^~8�X]f���o���n��Q�\^V�X��d��s��2]��������"�����p�	(Ax-�e�9;r�-0ZD)
�2�d���+�F�S����^�iL��@�G}��4�����'����\�+)�B@! ��B@! ��������g�	�����5��Q)��-yl��X�4�l�W�Y�l�L����$�cXK�u�������B��7�r�=�O��4����5Z������������^-��K! ��B@! ��B������f�)��f7�������].W7K���uA���������C�;4>��c�d��J�V1��x�_�<�����:���xF�����Z��F��MB��a�[��y�! ��B@! ��B@! �@�7h�V#�! ��B@! ��B@! ��B`_7h���W������Ow�*@��+��\�C���L����r���LQ
|~W7%g��.���M^{��Y��2�K���������~����_|�Bg2m������=�|;�|�����o�����F��&�����0��=��U�|��o���Z��N��o��]����L�n[���~��#���3�����������������fj��/G}lw���L�2�	��y��<��o��B��^�J�������n��%?E�,#�����B`�eMk������_�4�f%���J��=Q6K�vr�S~�Jh�@��R�.��N���VE)WCy�*��<pq\u������W�v��O��Y�N�2m��o���\��rAI�v������s�6��[���0��R�������J|�p'��Y���o�� l	�b�j�^~�����k1��B���hq|�3������b��j$*�����se����%�'��L����}�@4���{���Z�V���tZ���t���(jZ�M�f?e�~�e)�u	�9G�-������rR! ��B@! ��B@!���iDIB��M������Ww���f*�B@��x�k
t�/��N�����$��B@! :����A������
zlfN?�2��h{��0�|>z��'�?��mI���������R�f��4���������n�����NZ��5Z:�T>���`��S)������l��DYS��B`�P���y�=��/��r
! ��.!��[�JB@! ��{��Q����p�m=�������
���5�s����M�����PK������A��
�����cr@4C@�5����B@�9<[Y�+T��W��W! ��NxU@W�;�'?���l�}��B@! ����=�K�����4Wbmp���07Eo�:��d.]�T����Z/���K���9:�y�5����^��U�|Q�~�����Y���������t��kL�����?��G}���.����pB���;�R�! ��+�*
�a�n��T)�B`�x5,?9\���DY��*W�#��B������?��CN	��G�]��=����Z:e
�
��^z�^���X������]����o��]�������;���Q9
������1z��<�4�������a���;���hFB����+�D�8B@��J�4*�L�B@�N"p���n2��:)��! ��B��\Wo��o� �� �^������o|��*X�<��YX��l:��3_��WhzzZ[�F)O��x���aE�
�=::�Y�-p����9���7�,tT:��hyS������m�!���(k���xB@�IF�gDY�'�X
%���������R�5��*%�B@! �"�&l�d���I�=L���a��?��01_)O����=uJ�������]W��JV���������+lm�V<lMs��I�����\����-�$'�
�JG�=K@Y���s�2�^����	! ���"`���kvU$�B@! �@K���k_���W%�N ��{����+P��:.[��r�-Z|^���T���;����Z�(��y=V��b�-^X����Oj��.^������yV�4������K/�H����r�G��g��l�bY��ZJ*��
�5�����6Q��B@��N�hz�o.7B@! v���������������w%w�k>��9q�D�R�0���ui~��<��������A��z3�`aEK���h�v?����;��a+�$'���	%�#���&P��_�{��R8! ���u����T�Y�u�! ��MPc�d���.��B`[�9GWum[{���n���j�F�U���V��������]�x������i����gXi��)c�V�(K���:M�������q��N�H[��j��n����99g$ �5F�-���#������'�.���@x�Q�! �@�0Z����! ��B@!�XY��ZV ���
�G}TS������[�������X�r���m��
 ^��-wT�Jz*
��_��f���V%�z��\�3�+��B`�	\y���a����%�;OMr ��B`�P	em��_�{��2Xx_�uY���O�E��.*��5���w�.=u/��4�x�kT���eM=:rN�}G@���*�! :���@�������tt�%sB@! �@����mC)	m�����5����H�T4  �����{��R���|�
���wK-%�?{�'�U����gwg�v�m�VY5K�lI.�q�!��@�	I�@ !�?Z�HH�S��bJl8�m��\$a[�,i���m������9g����3�3��;�}��v���<������yA@A@A@A }��}q������N�))�  ��tP�2�� P�x�Mr8P��B�V�7Y:%�@#`��(�nH�A@A ���h�E5r� �8�9!>�-"�G@�5��Tj�"F@"k���I�A@(1����*����A@A �_���0EQ�-�9���W��8+����# ���c*5
�@"���O�8���I�A@(i��LAQ���	��  ��  ����f%G���=��B@�5%t3�+�� �u�L�<6F.Udv��A@����c��zA@A���(�o�4��`j��2��
�kJ��K����k��\X
D��L@IDAT��)I�
��H;A@({8�����|����A@��QT�U!�hX]�. L��1���1�+I�(iRI  ������	A@��*I�-��\U'���  �F�b����d���S*A@
�QS�w����,�9lD��F�������7���m[���^�*���A2���[�3���^���W����<yBw��p��-[���.���.�����y��qnXEE��~��g7������R(V��asM(H�����G����X�V��7X��.�b�w�����1���h�4B�F���h��u����	��  �� P�p�w�i��%t'�qj	w]�&�;ea��������;��t6�v�������d+���i��v��I����:���}�� P�$z'#���px�Sf�X3�����c�$�Vi���:�^h�%���  )p5g
dd�  ��  ��|!�h�az����\GH���������T��� .������7�\g'=���z�znP9n������s���5
�hhhh�^����M����:j�j���#���3�i�����I�kJ�M��D�K�o��E�i���S�M_������Hmo>a^�[]��2���od�h�1�d�\�D�Ps������BcNj\�O��/���,j,�Sf�i	 ��.��H������478Zk�-������Z�>�U�}e���T��1L�0�z���c��L�42�����~�)�S����\c���������T�b�h'r����Q�L��9��Q����N��v�(
������H�l�RU�f���!ll9u��6��6�+50�|�{����8�^��n��F��p��6����U���[hhp�� �&��xIk����?O#���gV�z��)
[wOY�F�b�0�8]N��d�=8�RKi�(����	��G>LC�2�-�������*%�:
j�M�[X5�ua�����Y`"j���
:�~���eYgf-(���n�W
����"
#���g�n�`�3(������������{`
1������9�qR%��$8f����~�-�
����\c�\����g��������Z�w1�RZ��Go�P�W2o�Iyn?#������~>��-Yo��1�32G`��u4������W�<�5�{�Y�Z�v�G�p�0������f�D�r���/���G53����?%m��1�Aw�(UU>���e5�L��&G�`��T���-�7�l�R����/���L1��������UF
��\nZ����p�R�Afs+o�6����
��C�Tb�Xc]�]\��_y����,�������qtD
&Y>�9nNIT'���6�So]�J2�����T�}e��G�j�QVZ�p%����h�E0�����L��9�d�W!������rT�����0w-�����r�x�S�IC�={�T)�w��Oe�r�jD�� P���`|A���������'�C�����^���kCO0s�S{����X3	�y��UUQ?=�,n���R����is|{��#��< �pr�\9lBpO����
�k��6�Z������1���j��?���eu(�4c��z��A@��4,cl���A@�5��c�YW&�� P�]�0��f������t��`#
:?��Oto������`z+��}�_�O{����T�\4����'Q���A�mA@(=�Q:������j��l��Gy�X��9G������*(19a����A@(`�Yk�]���W���q9�[�(��| ��>@�^�9��k�B9AE�| P����6[7��Ibk��N���:'��=��&-��En������x�	��}�(���(��g��LPM"���l�5�������d�g��qyY
�@q!�g���4�QO�.���a�C���ML&�`d��������:��5�#���RA`*������]c��K�8��_UQU��G�"&{A@�8�`#"2���������Q9�m$��f6��6�WS�����f`p���*}_u��Ws��I6L:l��A���o��>s���AC�Hkk�n_�����,CD��f�J6���C'O��9m������9n�79o���e�h,����#��� P|�krna�.�c
��D�C�	��dc��G��+{���=�]�r�  e��y�:����� @7������&�(���  9B�qW�D��N�&�X��@?�H���KIU���xcQ]:gM�d�o��A#���l������ez�!���9x� ���[�������U�z>�g��UD��/��G��o~�����J;w�������4� G
r��`�j�J}������z}��E�l��x���Gx�v��A~u������IA kx���9L~E�j[��9E;#�5OFK��=o�9T %�Q'�:���[�:3T
�@Y#�	Dz~i������?�'z���2����  �gL�������h������l��� P��yj���S�����c6�+�J�
���/�}�����%���}w�����;7^(+ea��q�i��l�|�2�?�kv������x�
X(������HOB�Z{P_�5r�����������c��7l�:v�1���t:5���%�
/��.=�\#���M�&�s�l���C�������5�R�  �'��
���k��(�^sC��S�W����]�!���$��������~�����<# ����\N�/��t��|��u�b��e mvY3������!���!��>��*v��(}DA@R#�^���]�Po���A�V�8j1u
rDA@���;r{������U�����+hI��^��8`����b�)��$m�@��u�LB�,N/�S�a���Ea��������cF�!�B��;+�a�>��Q�^^_9�V]RH�rG���|�#f�~��8p�b��#�A [�
H�f[��'��`0��k��/���� =���h��W���ls��l�q6�:�-�;b�)�'@�_���M��J���M��$��������k�3�i�+��d����<!��  L��Q�*`�vDMd���T'nsU�t��1A@A�T`6�R������3+du��I�G���Ye������e���%���4A�dcM��Z�X9#�7Vo�r�#Y�}1~j>Vc�r��%��a
/.'��`����%�Tza�RW�*hz3�&%A@(O��S@a��M��"k����<���  �
qp��R�\ �N����:R� 0pfE>��1G!�����������y$*�3a/��1���}�^�82���;=����w��Z^�e�x���
���JH�z�-H�����3m��A���
���Gw��__R��m���X1�O�.�@��:��[���\7�I�6R�����\!������en'W��1�kQk4w���6cM&xI��A����O���@Y �W-�Ng�IPu1�b�p���b�Y���D�CX�u���*��S���4���6|L���  �Gm"&��6j
��1{7&��mA@A@A`6XI�5���zxI�w;�V�(�;^3�K�����85���?[B�m��u����mG)8��}�^�������
���������\Mc}��*�
�
'!����3l��^H��6�6V���_�5eh�N������y�p#��<�!���UE�G�Lu6D�x���y=f�,o����Q������U�x�e��0��FCz'�@v�������Y'�����L>8z1�+�Y��  �7��zA��*�������A`@��#�oGX�w����W�V�����e��A����$������V����A�yK�y��T��P�6Kd
PJ	������L�m���'�W�$z�U�%4734�`$d^e��c4�u*F1����m��o.S|��  ��a3Tg�	�y�I����!KA@�����t������?���[`���}����e������#8��������]��x����}�+���j�������z'q��O=��E\�nDh�������2���&D������Rip���O��B��5��67�����i��|�W�Ni)#E�@U�2:�LA�j�ZK�<���|�:G�We����"���5��F���l3�T�
�@!�������"�>�>
�N%�v����#���  d����:9q�9�^B��B`�3�������
�!g��8(�������0�@��������h���UcY~�%m �m,a,�����X3y,o-#��G�j�1v��������`��.����w�P_tuY��N�~A�Dp
��w�
Q7U���9�wW�6�J\#�6V#N��k(b�t~���zj����u&�
A@"O���6��������
c
G(rd�`&��  ��@�i_�vNzV���"�
]��1�h����^�Lms�Q���j���o�����9l�:�v��6� "�*E��
�"���'���3X����!P��<�y���|B�WlS���������x(/�b���rQA`n�W������5zf�R�>��v�+"0����@��M��'����TG�a�A�I���_��A��p��H��h�`x�-#H����  ��Y��1��  �@r�.r��8�"�o�t�QT���\���3����{3)���c��*�~��n%���fT�>h(���<:��50��$K@_��u�wP��������@T
u0��Y(I>�+��IA@��Kywp���I�Wy5s�o�����N�)��������;�8���:5���	��  ���r4��G��)#)0�S(a@����N�$�pW��k���1�� Ph$�Z��=��@0F�e��N���#mfN�66��8:��T��Lg������#(���40�ty	�P�������x~C~�������p���"YS(wB�!�P�px�]�(��$���HL�*����F�P�����Q�mV0�@���THY�[k<s$�BJ(��  ��d����^c��|R,�
�@�"��n@%� �7L����X�Q��FD8
r�7�-�F��F��A`�`�v�L�2t'�������2�$�Kw{���t����P������~@GS0�YH�`E�6}yN1*3�;aac����m�����,�6�4�����n���7��JF���[���|������(�����^A�h�R	�� Q�����'&��Lx�a��AI�J}���F
���P��N��\O�1��X�e2���_E�A�4��2�Jk�"<�P�|`H�*"�3�2M	~3�mt�ZH=�Ks\��>�ou�R<�Q!�O�D��O�m�X�c��H�sw%�Y�@���(�Q���N�j������c�����H��<��=E���*�	����C���2������#��t
*Z�J��}�N���q�!��A>��"o��)�A��rMA``�������G�Z�����3xh�OxR�\���q���PiP�f4�VA@� ������X�Fq�
O��T";�G��-�8��M@_#��7�����%�s�S��w�����]%����T��W#":a��	����RG�E���L�"��< ����zY'bu B8�'�,+	r�@Yo�sO/���R�,9����!�5�h9!�����j�D�vY��Ad�H��1m�7WO�������s%;��}�4�}��  ��>A��n"��
���B%�;�4+83����fJ|�S���*����  �!L9��[s�Y��9�!������lm��s���W�!�������l#�2�\u�1isi�1j�����n����uk��Z�����8��v���Ma
�b����������48L�6;�8#��T��L�Z�HH�����=�����T��\�\�*�#�h^R���~a��T
�d�����'Y�|����y�k��)�yB���mc��%����5��g6%-���Y�O�����"038xU����	{L!G%�?FN����Mg�	03~\���y�dJD�z�
��
"��  �Xp�r���������5�	�)�
x�"��g�[A���w/�'a�)���n�P���_��Lw��X5o7�.���%��B�"�!o�b,���W���]o������(��<!��������mm��!�+��L��se]�# �����^A�h�*r�@<b��r/�������Fr����GC}��36��	�tiS*�I��d�+���<�����z�
��  y@@'V�����x*�y�/��<�$�d�h��P�]���q��&�)v�������O�������Z)B�q�{�
��u*bID($�Q����
���O]1��V����B�C9�z�/V
�f��M���2Y���D(���#���(c����+����w����'�t{����H���"�@�"��Bm_!��'�hs�F�����z������G����~��K�MB��
�S�J*��/��c�Z�
�A@������7����&���c�J��f3VK4��\� 8,Y�K��������@7#��y$"*�|^?h�K�}4����
��Kt8,�~�[�_�E�^z������Hj](�����F������(c
5�-�����������k�.����L�W��@�=���z�m��!��d�I��By��;���rTwD��CQ�9|K)���"�>H��vzt�K�#�"L����H_������
>u�6��t��W������D�L���B����R���\x��h-+\����c`��Y����^�5�:�L1o���OO���i�U�}���[��e�4�HK�� ����X��e7(�g��l��s�,���R�o�#pk����SU�l���a�m����=cRsy 0��VB����*_


M�YCC#�422B���4�7@��(�����.]���>s�P�D�$"��v�k�Sd_��)d��W�T]�Zc�
�����?�����i��Gi��m*]�cm�M�}�]c����gz<��  �N����M.�!�l�
�N�u�~���>�L �����HoY	6��D�t�=��S�k�s���z�N��)a�-G�-�64����V��]�|��E�����&+�q�[��sse�5`����#�:
���6�q��mc������6M�?�� 0-.9�+���?��6�l��eR'|UU4��px"D������cc^�N���<�dr�P/1�=M������o������gr�S��F�S[L����hZ*���.�Vw�40���~�1���D
#����D��(��������?��M������u�����������i���n0�g��52���6�-� l/
:�'f�Y�T����XW�lg�i��-
���
;Z��|�+���,0�j1��h�|�;H�Ec����*�^O����@�M���;���?��}
�F��nGy�SXM+��#���Q�wI��o���!�������@s���������L=�1�3��
SU�N�C����(g�R,����>��}����K�����J�W�X2Ps�)����^|^o���2��%����2b�K�
�Q��*����j�s��Z�Kb�H�LUM���{P�|������S�8�+���!��I��C�+6����V��}4�/Vk����H�l�RU�N��l	� P��S���b�5��jX���X���`��f��%�S���:X����ou�M�S�2�,���\`�4T�����t0uy��c�Q��
#G�����;��7�-
�V����9�_���g�5�~��������]���(���H}f,u�<
��^M��Mt�@��W�CW�Q�=J���g�j����_)��bK5���9�=�i���W�
�Ys�_9�W�����s��7(��Z�����o�/�wcM��U1�������<�������r��������x@a�eEa���q�~�~s�������U�(k����K����0�J���Q��"<�%���i.0e���Z~�����m���������U*PcSW��hcMG�K���:g�v�h�J	���,�R�sUZ[h��8����0E?Bc�8��~.-u�������og#U�?CgZ���z����
K��W��J�5���#��@Ik�qS�!5�.E��������o�*&�{��M�;���8/��+Lk�-�W����	VC�
������H�����������Y���r�z����NFi���L������l���G{����@�����J��3�\)��"��V�d���w�#�����y��)�O
�u[�R���~��*�����G����� ������KO�)LK�\�KG�`��3����r�i��n6�V+E3<y<yn�	��Rv���}��!e�y�.�_M���D��D{��;y�1�TSx["����"o@1b��6NtA����~j���3c��+��o�T�t�-H�.��Q�s��o�(����i%3��WDh�������C?���Os|�i{n���W���<���d��S���Z�`]�����x�1��*�>�|5�1�g�c�����P�Td��L�k6r�"g�U5NPo��d6�]��?{�Jfn�|��w)��rzu^���kh��z���^y�D�X�i��f>�c��c����B���=��7�Bto�e:q���
��� �&��r��o���O ���A�pE���[��	e�kt�D�k.�����j���;��b�}����z��r�L���5k$�u=�EV�3��a[$70�2j�(�}�$���R����t"3 7���x��������8�h��'��C����}����fq�6:{�t�5q�X��Z�d��M)+6CM�������^��:O���������fq%9E��B����!���f7�\��R�\M7�c��=zY����y5�LE���_�}�G('�#o��.Y����M!Z���Q'Qe�(rAR���R�U� ���t]�����"���7��![�Az��<�����t/��>�\��a�\K���������z��o^��:%��f
�S�l!�s�B�����\^u�1���W�s�d\I�	N�����A�.���s�
�r�����7i������7?L7i�#���jn����D������p�+Agwo���'�;/G�
�
E�����K0�����BQ�}��7�Ms��J��O��0������%o��C�v��{�"3&��n���f
� ���2���������J���d���ku�d �������=u�A�,O~���Z�;���< �UK4$���84H�E�C�c���9}|�fm����NN2�j�M�`�	��.�z�4p�����u(�d�}+�#���  �%p\�����11��>���@����{lRU���XC�\��TM?#�Z�?�@�"`U ��T��A�������~�9��#T����D�X��W��gmJ1��]>&���C�*nR�C�]�[�����R*)�VuR��!i)�9L��r����K^��6�a3US2��6����u�D _�� ���A��\���� ����#JR���"�8���Zt��Hd���<t�z�r��4���^p+��4�5*X:_�"�����+~�O���;AC��L�o=���J��N~m�W�����4��!+s�G9���W���B~��F5��A1DHmR�����?���y�	��,�(���\��I�`���
\�Y`�������RMM���u�K���eK��CXb�Ef��#X��������A5iSJ�k.X>��WWrg�sw�%����Q=��M~�+*9+�We��>
T-��8���������(p�Q�F�?�������O��v�~�A�`g�G!PBC@#�����a�D�}v�0��O���U����������l:�]�"�af�B)��
��U����h�Rg����H<k9YO������Px:��zPX��V����BdH2g��jqa��_
F]�*���p[���M�0_��3�P��Q�
5u���l����\>���c8�d��B8����#�9<�0:c��p��JEm���hz����z,�z~�5���
tY0�@>�����W�j����^�j,������P)��UN^�9TsF��5E����h��
VN{A6��
y4��h�������Vz�|JN��(�A����_F�W������_�h����y�<m��]��:�A-ZD[�n%��X�=L�u��CEa�m�� �������-75�o-0z-�2��
5���Q�$�|���sx.C�+���k<��J��Z������wD\�z�����8���N:�F
N:�Ay�8|KU�yE��a���/<Bk���KA@({�Bc����x/BB�{Q�|�k�����������������J�3S`$�Zp���'9{��h����m]���W$;��[�U'&���$g���{����y� �����F��HLO��[>^��e/19�N�����BS��Fw�MDA������5� ����������.�{��K�������z����B����������Y7�T+�]�r��6� ��?"d`|��or�4���UV����!�G6V��f�f��O/��a�x���x��5*
�il����W���`z�$-���Skk�|�-t��7R0�_��Wt������sgX%!����{[�{��	��D�|�2�?�hv������!�H���H��V^8��� ��t���I^��RZ5�6��7'L�f���!ea_;v\u�����d���>��E���S
x l�B��U��VyE�4���Bs.��B]OX���  e�{arN5���(O�
��5C������Gtq����@������+�6�tX�}��Y[W���p����jUa�\k�Az�;/���� ���V�n����i�-�!P����}^kPe�N���t:YA��6{bi�I!�v�s]34�]Q��W�Z0��~�Y�F���M�We�-���<O]�s�b�2��)�VN��^8D�O�GbGLE����	l�$j!�^���]�A$�lF�Tz+�\=��31�T(�0���50�6�V����8�z�!�M���e��&C`����Fknq��m.'��A���p_�%P����$��{��w���t�=��e!j�m�,l����N$7,�E�����&>����k�g�'����i\�C�5�b�o�2~Io;�Rt�2���rk���*0jA�i�L6w�L��������A�l����.3Dg�g]��W��b(� �AY��'�e�t����S�B��*W��� UOu.:���
Gn�`�NPX�[8y������|�i����-���*�BS`6�
����D}m,m���������8�w
Ej^�7�9�z�s�RY�S��_l��c���J}���L�HVN4pF��rdJ�������R���p����'1}f\�o�+��9Z]�9~Ao���th0���tt
"k2������G��x����),������O�?��z����r���`NSQ���!���l'�����ye�����i��F����zut�aE�v��>]�^�8Y����C�����7l��'��i��fe��S�����G�C@�L�Y	@��|5���
E@�;����j�q:Z��l��)��D�#������2��:%vc�Q�_��s���7�H�l[~��f��������8M�
��L3e"�}���"�=�����[��\oR@d_i�Y0�fg!Q��c����*_�W��^��l��R�1�V��+��x��\�X�1���{Q����l0��P��@�>�3�_Cd�9~��m�jl:]T�5[��$���&�X��A���`P	F��]E�"R30�X�����z��Q���R���������h���1���Q;t�!`�����h��9� G
��e����z� ��$�U���_����Oa������������NJ��3F
CfpWR�Ag������U<�JD�&�S��p��+����(���A�K���<�jb�)�j<�p*������#Th��,A��`��!�n��OPo:��h�	T���]0N������<��?\N�I_�����V
�4�@	����N(������X_LN?u���Z��Y�M��b��*���nZ��o���'��r>�e����`C���@x[����������)������/����JG���.�s�sry��"O��U����a�T���yq��Y����A���L�
�8�KC��&�cR;�&��q�/P�^�r��X��PWr��C5�_�j���dVA�1e\�\�������z�J��x>
��l�D����g�-a?A�����DM��gDS���!O�n�o��:�:������hq}����-�g��t���U���}�z{{����b����-��r�L6�Q���U!��>^a�%]9��d_3m�p���<
��H
�.$s�q9�`P��5�p�Q��3�Z�}A�UI�����6�y�	SVQ��d��o�3�}Mr�  �7�X�[q�8�6��FE�&�������h�)r��w?�z��\"��+�f������i����x1�Cnozb����c�L��1� R�dmT�Xa���j�RV8���@XQG;h�m0��]$3����D2�������{�<�G��r%���r��sd�]�!�&��~YE�=`|�]�Yt�<e��t�OV�)�p����\1���CG�~���B������\���upk���8���-?�*D� ��U>�����a��L�>~9L�<���-�9�N����h������QK!(��-��@�@�
Qr������K-m���m	!_�������z:�qH6�x����l?�ynvA_^�
��P�I>�V��t���q��&�zc �NC�����0�k\;@�����/	�cI�U2=*�+����W�=�<L��r������I���Y�]"Y"�x{�.��O�fY��&�B�#kq��������{4��Ld>���(������6\%T���yr�yC��1Q�W��5j��(P&�Fn����23q��N���
�6��%������S5D���5"�;C9S�L��;
�-�e�2 D�s�57�zr���%�����q�� ���8T�������JC���[�g�;�z~2WM(�z��!0��;]��eh��R�d�Jvj�qN���0�#��	���Q���l$���h�TN�����0�N���f��b
�sA��
6�(���ax��)���0��:0���H�Hv�[�g �6W�IdM0��R����N�:���i��
t��[����
�����lY?��a�����h	�rc�x�����xK�e&R]��VV�;�
yR��&��%6���O���B��U�3���7�Y�{�])L ��{x�}�e���0��OhO(YD�C�A��AQD��K��"��`�E�$s���������� P���ns,�&��9�*6���7�/N���>MT���r}��;Q@5%��I��o��q��Z��5z)�Z��4G43	�;��P����C�
�,zo('��T/x����t��U]Y������h-�[k'������������z����P���{#��q�)�*�{F�����*N�H�F*e�Z�c+��3�fD"N�_D91�������J�422LO<�m��U_����/Q5��M����J�������~��%��x�h���P�������k:U��5*��9w�^���"��HE����w�cfr����C���x��*�����"g	�@>`��n�N����n�B����A�x�^������/"�"P�U���hi�b����Rc����?�J�\����	�����0��,�<��8Pd���@2O��H`�d�;�|������o�]E�@U~�C!����h2�����r�X��������>�=EG*VQM��h�9����m*�dw�C/4Fi�)W���n_�a�%���gT^���������zy������Bv bG����)���=c��L�a��)'�6�HL��OR���=����=J��s�6���#"$C�=Hq�=��[.Yy����LD����#*�1����(�R�����W�X3:u�a-������ $C�&� 4i��t#��a������)�1����Qc����XN��G����/�?C�
�@!!����^�����T�pt��M������R0�|o�AE��%�$�gX���Uz\8� 9���s;<Vs]��h-V���Z�1����:'`��W�o�n�}�Q�S�"������t�����;��v�2��R�B���H���=��\�o����=,���#j��{���P����Q�����~�zC�U�yV*�mC�[%o?������f0�~�Qq{���o>�&6.dTQBa�7a��w�������q�|g�DU�Q5Y�7�X��bK����[��d)i"0y���IRL�d$�5�5�X.��a�.��13Hn�h.oP���o�Jk�T{��I����f�j��f��r��L��
K������e�m�M����A���-�1j��5|H� ��j��j��AuRT�Vt�Zx%OG%���H�;�������@�@�P*o�A�x��-���"`���HW�(m]-�������ZW~]/?�����*��
��X�>t-�Q������T�W���X�q����G/�����S�f��CY�5��U%P�&�/����}���c
�o��1J�\���n����T"%��c�76��k��C���5kK����a���S����Dmu�h��gO��aDg�8l���OL���|;!3%X�(��k��3��zQL�������uY����Kx�,A Mrj���u���o����� 0�>7��|	���4��������7���q!\���^���9����8�PO�
}(:��Xd�6@B���xK�������)e�u���$�<���������#T�8f�oT��\x�e��R9��r�N��=+�~����EWG�E�X��h
Z�qS{�.
�c~�R������r���6�(�fl[1�k�4��!E���j�M;���X%�%�G@tEp]p7���
\���x~ ���������3��r'
D[D��ke��:�o����h�?_I~�{�2��5�<����r���(p���r��\��3)�L��T���f'A�1uu�"kp�Qu�[������Y$-I�Cy.ge�`����'����}F��-}��F�y��G	�f!�'���&�Y$����z*v�b4w�n���(f�~��N��J4I�`C��O��E/S�3�vA`������;h�+��?���@���/"L��<��c>h�x��X�I�5���o{����/7����C�c��T��=�������lu�L(����z���t\�3U�����&J�����+���b^JhcM�m���5���l(�$I�5���>�V�M&uHY���P��+"���*E�6�9
�Wr�<0���0��`��,��������R��n.e��|#]�e��e���$������m����5��(�P���l��0VQ�UU;u�YQ�+�FCY�;h:�^HK��]��f����k��\0`�I�`|n�1�m��-��R^b���;�_z1�n�7��k��
��S��S�`��������9C��n�:�(
�,�J=���-*����G�,"j�[�^'�'�u�c�6��[#����%���t���L6���m�!���.O�z���B)���W
�hW<�{�L�f��������j���X���1�9�S�#�c����j�����8

�+a�m��qA +�(�!��?=������K<g���s(m���)e���QN����}����YI�X���4	@IDAT����Cx`f4V���0�.�i�6\M��"~ �����~���(�[������8�7M|@78=���`ec���b���'���K�Ohp��(���3"�����z��� �%�g����^�6�]�UAc���0�@� ���=�Dd�D'Za��:SX�^��;R��OV-1�_��w�1����}NG�Xq�Z��Vh�=���0�����|�CY������FTT8�5.�0=^s=-w#�+�%�(0�����w��p-���
���Q�S���#�dPG�]j&Ml����D�K�X2�>�7,��h:�AQUA�i?�1N�m�	�o&u[�����y�k����R}��l�m������Y�yVO�����K����v6d����o���)��s[x<�m��9c�iYl��m�����Z}�~�_�/�4!�����������9C�~!��KL��I]�T63��W�i�+IY3r�����U,�[h����� 0#91��03�����/�f`��6��g��H��B��&�4��|���t9��X��t�7��0���RWfBY9�c�����X�
� �D����!~�B��f�A���$�
A�)���]�n��ue��'5�.�n5�D���K�X�2��X�����7xFBX���Q����5V��Z��
X���(��U���=a�fiW��E�+����ex:���PIY��I&(a/�j�\��:��K-f��g���%�H���Z��:{��sN>�4cMG��!\����9�X��S��_�/������C���-�V����X��>C��n^�s��B�����|\��(0n�`~�#�ez�S*�������?�fU�O��8S�������+K�`���Yv����4N��"����������f��TU��'F-�f����	���\������*��J�1��2Fk����-�o<���I}��L���B6�s�`��c����U6�p�TK~/�VyoT�����W���� U�����m�f��%��5��t�� }��+��T��~v����'�#f��=I��Ml;(����Q�Dy������o��a����]G���3U\�(j7�.�u��1ReXx?��������\D��@8O�v���X6����:5'������S'N��_�:��Klc�� �
(j�e��>qF����u����FR�2������)k|DJQ0�H&���N�]���g����vE
����p4�b&�<o�����&�1��k~tU����\,�%s��Ps���������]Q�\�7��qtLdlO��n\���PP�gxf77L`��<�3����f�E\��y���\m.�~�P?�~1�IX)d�	{�C���]B=*�@	��';O����`�Vh�_2�G�[����0���w���Gx�!��`���-����4�.
k��MC�h��������>�����A�\y{fQV{���r�
�,4|��������d���
qV<f]�������9$�}�+��Z�V[$���%�������Z���y�k�����RX�Qs�
��zy�����pSb��; �v������D;
���{���f��5��a������� ��\3�[���,����}�>Z�?��m<f��g�,�� �{>�%rz�E��c#=(�������.���1U��:zN1���3U1���A;�*��/����������U��\~�v�e�������A~>��k��I��Z�m}>��E�#��(��/k���#�o����f���;*[�^�x�~���Q����ds��j�X�����$eq�����ACfW�y;����������j������� 0����3�����*JOn���t�:f�`��A{WL��b;�$yV��`��l�����k�yX�W)�I���yx����k�!:��BB��;]a��#.�9���g4�3*�����[O��
a��b����Cx��c����{:L"M���aV6�g�t�M:V���I
-�
|+��X#������"F`���oK���n��GP>����oO|Rl��|1E�tV��cB��O8��P�w�@�2��<{�/s�C�c�������_r�����uj���	+��\�M�{���)�1wa���o�wr�+��c��d�����\��+m�A���E�g?����pN���e��F�~5�����G����:��
��}���)���b�kMQ�������������q���'U9����O��:����Y=��1���$�� ���yW��M	"��k�M���=���}��������_��g�a �,p���k-�3F��SO�{�����7���.L�G�%��� ��}�������
��j#iW��Ysle��Y���?�kd�l?k�p�������~Y��YD�mW��w���p�u��<�f,�i����bL��������]�����(��=�-8�K�����d�/���G��s�����������$.6O�6&N������d�{(2|2^��d���Z���4P�k��C�mS*���}P����4��_���O�y��f��H�)'���������r��B��$UA�[�����&�������L�{4t����u����u�9�����Y�S�C�����	�Y�p�4&��>�E
�s
+xb����W���wE�w��ury�8�<�we]/[L:X���~l��+�8��+�'�#Phaa��x����)��}���$��e���`�
�6���� ��eZP��#�R$����CA3����,hQ�]G�e��w/�(�x|b���9�}�Z���d��W�����~c�X��<{�����<�?�q�M�O�{�[E�]�m-��������{�*��
���5���ZO�����6�c����!~�����)Q�o4���,����bloSS$(��}����LE/}��0���{���w���k��35:�c�I������}�F��*i��}��~���'T>���[_�1����:��6:�X35���>XI�����SD�; �>���7�����&������j��4�������z��u��]Z���X3�t�h��3�)(���U�GG���m���Bk�T��%�+0��w��f����3�h��e�
����c��k-�2�X��[9�0��Z����}Z0`��|j��)���i������<����9�����4���b�E��9����D[X������}��H��q���)����p[�t�o������{>@��T�<pM{�������=�#����+�t�����L+�g�Pn��3]3����^�������;�������d������CI��d���>6��WFPI�?^E'����9D,���6G�
U�%��x�!�i,D?��:���x|f��F��+��v-��U��'��r�^A��|�%�����1��1���j�Qh�vb��X�lE;1`b��}U�t�#�	o&�8]�-]g����p�m������h���&�X�2�?V��� ��'{����`v�b�s��m�m���}����Pl�w�
�>�>�z��$�	����t6d�)��w�����by~
	J~_���'���FiK�!��PVH����MA��(`|sHQ���h6@-�GEx���\-���O.'��G��pcn����;n	"���9��x_�R�\��2���*g�9_m��:�o�%�Fd
h�c�kLGg���No"������$��Y�?PhTy��������x|�K�k%(�(6����.Q�-J��v=�^���t]��&<���6�_�j��v6c5�~<[���Gh��z�v39�H�f"k^}F�����E-�����TE6h�X8?V&���,?�P�C�
/�N�����0��S�wk:��]������1��.7���YF����A�RZh�w�/�3-oP!"�#|��Pk�68f�I�K�����7��G-�}I�r'k�\���q0o�Ps<(�3}A��>2��������<Rj~��EJw�|aV]����
tR��Zz����K�R/}X�f�M���t�����>Z��Z�S���w�`T�n�_����W�AG���h��&��A���ez��	
}��g���[���r�Ey���(��Z��	s�j����WS����g"��{.~N���qa�_�?�y�Z��Tmp��{���>��3��k�t�x�.[�XW��AW����f�njx���M���QPS����?S��5I���1�%98'�5�Q����(V�guE�����J
*���R��?�h`�AD�����E���h�A��^K��K��A�
(�*6��|N�k���b��r��h��T�"�i����Y��_�W�a'p��d���fxh�~x�}��NN�V��#J{BiUX%���U*+?�>0�?�����Mcf`��]���*_1L>x�5�n.0C�U���������Q�LGh[���L�YW���h'�	�-?H����L�2m�P}��A!j�.�k5�9z1�#:�Ac`�s�?��7l7XC1����/T�����n��f2�����-��=�i16��N������CEc�a|Q�E�[���Zo���{�qA%�$��D�4���$;S��YNK~�^s9B�Fl��z��-'r�W��6��=������T�(%��B��Y��1�I�I��\G�|�@3�5"�;4�m�ud;7����|-{�E��������k��v���m����U9�s;s�����=��E�������xVj>�0��#�����Q�>��k��(�m�1��I3����ys�6�
>�@?���^���
���� }��Ji�����7���7
����xd���������E��m&����ig�420M��0�M�Ve�A�o�a�>��u�mD{�s{������w*�3���F9�u����	������TeL�����K�ts�#������:;�7p��Rt@�����5g%�C	�b�O�A��$���*P,C���;��3�y��Jq���S?��e��/�w��g�sV��;��>e��tD���j�o
��Vu���y�����{�kr���j�=��i��{=�tC���
����c�����	e�q�9h���c[���^�7�II�
Mj��L��$U%����Z"��s�zD�������\�A�����;B�����uIj M���_��c�f�����D�0s;`>�����v����-����*�� u��dw7�&��&���/y�0x�vT-�N���A=�4���Z,�p�P_�������~
^����� �#C
�V�Rg��������z���`WF������q�mc
5�%�-������`���d��������������7�%t=$E��l�f��T<�B3��W��*i(�\�2$0P~���=��M�'���N6u�ZIG��\��jc�	��#���m��u���d���[��lW�x<xN�"({��k��L�K�n�a�u�X���C\G�%s�/��^4	�(�M\�s�1��$�e5U|xa�A��t���M���t��%�S��
=�/'s�LL��\[6��Lt�G����O�dgvWx��i�x&��,Le"� �X�0�=x��s�{^��
"
�4��T^���e�P���4 �1jNw��Hs��r�����>w<_"E�m���{����C�S���>��r������PvJ�v��1).��1���P�5�W���(�X�9l�k�.�F�����#�"��/�1�m�g����+��[G���|���7��	%��l��P����V��O�I,�������pj���~�j]wDe!x� ����5#�hK���/����A�I�?0B@�����`.�W�MZ�y�z"_N���,�h�@)����<}�?������I
*n�����7{�X���z��z�
s4��c�,����y���������H~w�����+&
IQ�:G�y�OR�2e7�;�Q����@-��pZ~���h��)�f��I�����mm�Q4�����^:J?�`n*p.v�(��lLLa�{��c����G�z'�����c\~�!4������:2�]����v�	�y7"*�*��w��tqO�{h����������%�6��A��C����eA����P�w���=N���acX������~�>��2�U_!���9D[�m&c
�G���w��*��V����+�"c�383p>���SSj��,W�Fk�\�h8��5���w�v���N��e1��m���_�tjw]^a���$�����;��e��M���.���O�������n���
����{�n��JlL�������|S���m@�,���4��
V�A����j{����7�J�V���{���9�I=��b�����r��}$TO�K����0���T��sy�L�	s!g�7RHq�""�b���m�W/PN�g���<����R��
�x�v���}�PG�M���B����3�o�h�A;Y����q�q�.�l����3�����f5h<�R��8���)�����k�������I�l���5QCx�g��5����O���<������E.q[��� 5�?Oh+{�c��PR
�HO��M|�����h�����b/>���� "��| �	rR@W�"����(ht�(3������@����I����n��c���n��8BkUd����A'Wt��'������{m�v�k#����j/��^w�6h"7�L�8�e�����As��"���8N��F�K���h��������<����%F��:�S ����@��&���o��>�p����n=��i�p����lC�*��%S�su�����_�?��J���N�
W��������.��?j�������W�]j<����������9���pP���1������h���+����mG>2-��J����l��D-`0?���?�{XG��&���O�'��Y���P�zny�n8���'�r�#�RV���8~/��;���`����Z��Ex4-�>u��c�%�c�T=�������
u�s�A������/,�������B�0�����w��"�����#�
dedPG���J�i������sHW����o<���C�%s]���se��J���~��T�j�\5Kh��&����Qu��S���uZT���u;t/C������t�^N}
/!<�f��cG�����(��gi,���K��/����>�����m����u�M�����F��{���1&b$���T��>1�G��t2]T�t��{�H��9i����4h�6��!	�c+��3	��O(�'�w-z��YN�����/��k���?��z�
JW�$2j��zC�d�@������Q9�����I�{o�����,���M�AQW�����q8���]�������jpc�W��@��.�%��R0�{���Ok��B���,��5����nL�����?��O|qm=o�L�+0��!�����_O�^I6�0}g��j������	'� r�q3�{D������+�i����	��m��
��[9��m��@x��cI��������l����7�����G�����G�OU��N�N@z��i�z��A$�haC���p���$_��I��$O�x����O���"�z�D�7{A[��`���3��!G�J^�QE6%�r��
�j5�~Ty>��U:����#����.�{Z��-m�Kk�{�t����53
�8R)�gxP
�!���|�����g�f+N�%]N�o@$s��4+V���k�3��`�=��P@B!��M�'��H�.�{��p>�D�0�[��-`e(�w�'Ho<a#$C�`�"���Dw����ZLT�_�
�S>Z��d��|�!�5y��0l����Mb�TQ5�#>����A���E�.�+�9O���F�o<�(]��i}��a�Vj��S��l���n�����l���?��Q�����b��'����tM�x}�yiEeby��`�h�A�>��0����g:��x���:b��,P�}>i>�������W|�����s&���r�JS!y��[o���J��g��&:0CG��q:RS��rW�;U��^z����74�����G��$p_``zS�<w�Vy*�����<����/�����tWWP���0�n�x~���������1g����t��tA�O/Y�=�j'���\�E�>���U@y���Y����\��e��:�Qm��*����`��5`$���T��"jYQ0/����"�����yO=��<�K��v�����B>.���
^xD������V]���v�)�|�4_��r��u����X�
�W��P�^�L��_����������A����A[���/��*c��YZ������w�5�_�6,�7��Tu��{���\�oU����1�x8�+0�1���	 �y�f�.�{�l�!�e����������k������������=
���e�N\b�i������e���������P?h������Mv������=���=�h�:u���7������>�s=��
�k8+[c��c&Cc1en�{�����Z�t�d69}�4U����B�B��G'u�k~��������j�g�K�Gp��tBy5]p���`��F��LdI�l���T�zry/�����|���9�B����+��I�B!G��I���y�S�<1���g�d$.�O<�
'rE�^Z��0k���6�n�}�!��n���{�����~�q�Q�Ky�D�`0xI
�PW�����8����G�>:2Jo��T���}6��^�����%�sz�1
%9�w�l>K�j@�q����������	��V�qi���������>
�+C#[���/�O,������sS]��p���t&:L��p�}�@�n��w�2�X/P������n���������;���)��nA '0���K�7�x�!�|����<��!��vc����?VE~��{���Mc�����[����
t�1DW�+:��}��V�2�)L=k�����4�M*
	Q�NM��YR����0"pS�`��FI��P��_z�7�Z�Y]�GQ�f�P�Xc]��j�W��2t|�?j�U��)��+����"#���W���]��nMD�D"AU�2��G�j�7(5������n|��'*u4���G\��&jI]���a���
v����?��g�Wx�'
$����	�	�(Lm���������mz��R��+�st8��t]���DmT�]�wu}G�I�xe='q��E����{Q50b^�������6o��C�mI������=�{�c�>��Z����9�pt����I�}9k4����}CK_��)��g���.����Yu����3����Y�z��{iqE�����z5�?��B73q`}��
��7zJvf��#��
\�����"����9��fjQ9�U�F�N��0��
��Cg��AH8�hp���������/��z��
�m���,Sn{;i��>�Q��0�d#��h�5U�2�C@�y�W_�c?<NN�~�X�s�<E[q�:8n�|yf�5]q����*6�<�]�kM|�]���8��r��OM������p�������kN���4Q��@�"��f����X?�����LSgq�O;g
�	����a��(�S�Y"��������=K���M��A�v:vP������O��L�g+�pm��K�p��!��J�m�Q������t9	����K^O�J�Ua��J��g��~�Bw;�M)�h������67�9��R��@{��i3�}��"���2��k
����*��4+�U��<�!�U&]w,iW�_'��1<|����DKk��^���N����<(��C��3�����Q�C��A�|�{���*���k1�U�J�	CF���N/�h��y���S�T���*iG��c�����N���L�SS��j2��E�6��l��w����s�Vc�M��P�
�t��^�B]�tN�$J��f`7x���V�s����5�B��T�Mw1P���?f�S�&]����a=�T��G�f�S��r��Ct�����/�C������=��/*o���������+�TE���O�Qsf��V�$84pDyE��0	_r�Ej�TK��:�M��T����)��1���s����2�f�q�$8�j�-�{g<�+���	C���i4��<T2�����������g�L&���FIh		E� ��AwEWPW������k[�Zv����b[��.6VW@����jB
!��$�I2����9��0I&�V���f��7��w�}��{�����cR+����}��r������6��vS&��]�A_�� � @��v������2���~�tR
�[�<�@}z��[G7L���b��D��z���B�ir��`�Ac��FE	_�eVx8������/0��h!!,
���%�I�?�/x%�z����}T����zMF����]g��[��o�|Q�?-tEy][K�8R������_+v@��O6��:{?x��.���4���#qY"\{�;�o���bw)���N��4g�����gU���^!�TA�\����fo������>�J�v
5l��%�#��aB����H�5�1"]�q����#)�ZG��BOG���9WN��?��m&�:������@@�����Uc������9�6d�ZP�5�![�,	���I'����|��z~�U�B��T�<�^���5\����P��|���t��x�$�!O�6s?�~X��5�D�:�4�,�1�	���g!9#�d��AS\�hQ�L����l_ZI����������A�)�7�hA5I�
��9/������F1`0�C\0��}<E�3�b���D7�W<x��_��6� �jbO���;�9�.��O��b�i&{��Bh��`��lt'"�^<�}c����m5�-]G��G���������Z��
��]o����!3XB#e|���R"�7������������V�c���Kp)�z)�*��!Djx-h��������r��D���u$@
^[�,1�����o3��N
O�Pau�'�����YV��1���u�'����HrZ���B�}1��;�A����B��'�t�-���b�ZF�KC~�.�x������h�#���s@�eP�M1�R�Q���5��1��sZ�����N�����CV�q�bN�S{5���9T�������)c�^_B{9{HTj@�>y��o�3V��Y��}�{/;(/�?��=���!�=����Z-��C��gl�!�z���oo(�c=j�x�����&G�16��\�r����N��O�j���4��t��|=��==��������a����g����1���_���-�jN:�$�2e
M�4�]o�fvCUl�;YSO"���(�0���`����=��b���%����T��8=`��R]]�nPe��!������1�87	3J�=�t��$/�,��`HM�E�*w3
����z�O�B��^j �7�9;������q�m����aQ���~�*I��t����3�\u:m��L�B���A���:���T� 5`4�P�@;"�*V�I�PSs�-w�eK��>��}��1��+
fn�;�_V�{�Z��,���|�-�M�(a*�������o0v
�6r�A����?7���F�5��`����R�P�K
�������.�A��m'` � ���u �7H��V�3�T��B���X���ni�,A+����+�q���f+~})3H	����q:�|ypn��:�G�t�&:)������
}{���������F�%T_KQ�Zos��\�;9�����\�������Q�Sg���9����u�������=�V����!��f�W�����_������`�}��	�O��b�7���gM�0��AG}����Z����ZXm�}/<�e�� m��{�'�5^���}��6���&?�N�d�0��&�Ms���E���Db���������m������N�Sy��=�m���$L`���+!r����y"3�����FI��@-�1��S�$Z�a�F����
������������>Q��������lVn2��w}��0*M.�������������Z�>��xY�_~c}�0@���H���k��e�}�����d������z6�������W�914%.���x�JY��\��9[�.�m���a���yr�����yr\����vo���k�?��a��
i�[#PP^�����;� 6���e����)j\�2?�_\ne�!�O�=[����a7������N���c���&�B�h3�Kl�d�88��E�}���m�����>�k�j
���<�s��~|�x�e���V+f;���%d#��6r���F=�� ���������tYW���!���H~7a��Z�b�����S����(V�o��-���fm{W��6�s��8���L-}D�y4�wh���������)�4��-t���(��J�;�U1q9��@i5�`���������~���o�Fm��6��_;���E���Hg����MfJ6$�5�U�}�J�a�t�'����w_��������A;WN���I��kh���z6z�&�[�N���r����R�"�*cN���j���G�Q����e������7uy|j;���2n�v�w�%�C��-����:�b��	�}R��j��,��y)~3���=��������v���o���Z����D�)��|]�Iy}i���lU���{�==��.�_���h�����i����a3���4z�h����}c����������1���%I�l]�C�I9��xfv�����5qtJ�Z��"'�:|	d�����
gf������_��|���7���8H\
tgM-������-��/5��s&��u�YL
��BK�W��2�������	
�� ����$�l(�������i�LEx-FC� ��e%G���t��U�P��4�GK�j[���g��
�I���(>��z����ea[�k����2��#
�[�Z���0a
Y��FM{���%����a*'`E��.������e��A.b
u�}i7���;�����F�f������=��=�Fr�>
��<d�!�k���q�*4�����2|��f��S���K{��|CY>�S����K3�a6����������,Nb�
�6�2jt��fP$�v�dW?_[Ec��0���\q��P��|�$��Ur;@.[��y
b<j��d����
ESs����G3c���kY
d��wM�	>��,l������8����=�+}����K!u��������u�Z�+���Gc��m��Z\/�=���ml���"��(�C�~�>=����{�OC�@��
��#�J	7���n���}�C�n���9�������R5q\�0�BK9��������P���y�6'�?�h
c����{�����@�y���z:oY[���p������|n����5]?�z�����C'�>�:t����.�t4��ux��u��n���k����+4x)	��}���J+Bl����_��D�_`�4��+�����4-/�^v����9��0��K�	��dee�uy��1t���~��?[��O�XA?����k�:��)1�8����CuM�m[?7]����~�TN�p�w�K�B��X�����N4mfe%x�����"�,���u�f-nf��p'M�$�mP�~����;�QC#��a�����~5��C�;K�@�D���������0�CbRo�LF�gq�������C0��������U����_�S�����I�p:���{�������H���
����#$\E�*�w�#��b4S���?�b���.�'N���6cHBLy��������$�ofo}�?����2.�T�F�r6�o%7���O�S�ef��p�V{&m�7S<����6;w;h�)WS��G�8~<E��0����z
.���M���|��I�K�����s*�m��x�+����s*��hw��������
���1@r��AL-�9�~�:U�h�l�:�r	-�5��M� 9G�p_v���!���bo1C�����
�<;�+��g�)��/���2oMi��)�F�����&�JN��)I�tyc%;�{/���9m�%<?��,��qq�'Y�5Z�w����c���U��+�0$����?C���-��������=����*7�������Z��c}s�����v�1l��y���;Y�i���|��a�l<��wpQI�e����I������L|vT����9�0�Zx^�uJ�x'��Yu��y��N���y���	k[��C����H{���?��/��"�C�n}�~��g�� r���{�kLd�7��!Lr7���p }���p}D+�T�	=�!��0����|�s.
=L�f~0H�>��wG����5���j"�c����^������������I�k{IM�T
:���s��~�=��5cn���V�\)�<|���E���F��g8��g���+���>I�������.��`b�U���gGr������'�K��VVj�?Bu
����:��xi2/r��W��bA�x{���(?I��<���n����x���}]����.��|���l����#�LO�#��AW���C#����9���^ME���J��l�l��kcD7�Bw�iY([���s��A����H�.�c����s�X�5���G�i��%�/���W��e��P��f�<v@0�����Su4y��FDL��y��Z������C�\:GW����_�C�J�bT����5�����L����*�$�/q�\&�����`���%��!z�\^7y�/h��Gw�GVNr���Jzk������)N��n�H0qm����}<3P��xn~��aN��=Y�����44�A��<Hf�du�����b����7�H���a���k�������{@=R9'(���9%���B�����R�F�� 9�+v�B���S����gX����9x=����2�c/gCMUD���_������E�OI^~>��]N���J������!A���� 1XQ��(�y���/Gp^P����[���7���]	���,Kw�K.��������
>Vp�6="��j�D���Vn�Jw����7~K6���_�^7OR8�N��,��"=����~�0��U���0D��p�]X�oiE8Q�^��b#S�=*K`����2���_�v gNht�s�����]�9-����"6��
5��({�6���l�a�O��Y>�����C�e:����1���}I�����8�(�:Y����=�9T6�(d��9qkZ3_�-M��N��p~.�T�"�BjY�k"��s*�����r�@����k2P><�uqk�)�I�p������s�������J�:�K#X�lc�W���_PU���{�#�e�|rE=CQ�g���M���.<��;$ L�V��
����6�b�ETQ��k����G�zs�m�)E�2�	d�:.�#���Q{��q������g���]���^C�)�e�$J����n� ��vw�9] q��V�����t8=QZ/��\��.���M{���j�1>[��b�}�!��h�a&yT�.�w@~���Y'��P�8b�u��tg���W��D'��U���������~�<�r��=����Q����2��s���]��c4h���{�8F~�G��������&�1R�-�/���~
����6�<�����M����;��	������n�.z�`s�h�~k��y�D*�W��1�2�|�x1�����D�`.�#���7�I�s�����UB������?<O�� X��g��==`�@�&�4����p��g����"k=d-�1/K"1�f^q,������#���*'�2�.V�N����D�g>M��3�[���C��?���
�����fX���d/�N(�o��{_ [7�>���Dwpu�(���4�d���.)�!���`�� ��W�����j�1���&��v�4���9~"�3/����_*+�y r��0�R�o��ILd�_8`~�����p�H�IkE��� �����A�z���J���7�BGSB��}U�������Un���HH�p�|4�����|�����bO40u�MI��\l�����A���<C�F&��T9��n��	���:���h�2���Is�Z����(��4�iE���������7l6a o.xL��n�[����D����a��B���'�N���JM���@IDAT�d�=�����
P��s�,�4�����������[�X��8��{��;���@Ot�t��kW�}���iGIc����X�TQ����X4S'��2	��a�Se�����^
�[s����������
�7[i�3�~���_�OxT(��T?�}��[���6�����jy=���3� �&pU�����xiG��w����(��hgU���Z�������u��	��z�/�N}���4z|k(��g�k(�.��ZB���e���{���39��+��������n�b���������B��n�����6���P��6��X�A�-��}����OZ��^0� O��#��a�}bh��
mu���<����n#G;
F0
�K�s
����!�#l��^G^��C#�e�R$�i�"��!��NZmzb/~P ��*o�s����s���	I��``(�L����eM?��E4HA�0����K��k���L������)��w'37��M����SEh���%U��=��2���y7�����q5w���sY��bxhl�K!I�����P����eZgW��8���x/�GMq���/>�����������?���9������ ��[����P����YE��-�XC�	��<N+����(��?�<X@{����X��
��XFG�+��50��n���qIS$�~$CE�Sd���W#�
���\�wW���0�;����\�yb���y��$6 �k|s���	PB�Yt����k*���P�A�Q��-jd~�w}.�s$��#�`�R�U�2�����G��!P��_t�aw������;����
�\���k0���L�/�s�����^�=(�2��w^AM�Q�f�s��F�[��O��X���!n�`�("���^�9��0&{������A�S��s�q�P8BK��2��nH����cmq}�����+�+y�U������Ph���:�<�>����PO����=��4��r�������A��G�;;;��'��1g��q|@�R�@��g,��Mg�+������}�[;c����q������7�7��}N�g�x�!��c;p�R��.|�2xj����0h�I�V�%�a��4����c��b�G�J��A��6�����B�r:��V� �f����>�w�����^�q���[D���N
=���V�"'���������I���N�
NCA<P%��B}�{)��Kav�����% +���[_@W]F���J6%O���i��J�g����
j��!O�����Q���i��������^/`�����:eE���p�iT}�����]����<��9�L���T�;$�Jw5��G�"�P��<����s�R71�n����metj�p"U�g8��������!����wj��V���=$XG�G����I�S#��`N]�P���H�{Pm���C��G�����N{��s�E�P���>>�C6���z�������C�l{�mhN
��!fdF_�-���
��0S��?��(t(�!�����;�9��d�A
��pb�#�U��w�=t,�We�x��>Q�Iv�gP��'?@�RL�stA�_$�q�tu~HR��q��A���R���f0u���� oioQFB92#�;����`Dh�o��*��?l�l`��+�*�P��Y��&�������YE��O���A�v��2��k���������|/�������}�����J>>���c}���% ��@�������Jb���`hp~y�������������'N�0�2��5�*�K�x���_�e���$�y�?fh=;2��,s��m����_k:k�.�r��2r!I=r���O�r���l���.0��Q_����������yW�y��z��+�?�11�#�C��_�O��&:#�a���Kd#�{*�����������da�d�����Y
�2�nNo�j�$����%C�19����g��&����|-�:���ZD���V����a�R #�O���a����|Fo�*� z#i=7�YJI����b���z,�8z��W�o.3��3����%xs:��W�IHo���}�G*�������������"����P���=�O�
������FQ�We�~b������3�y���Dz=�. ��,�����������>Z��8D�������{A��qPd(6\�A��am��Cz��%G(�y�E��L}3����g)����Ob$t��;E��y���c�=�n/7��z��z�)�����Q���4�p���T���8)B����P���Y���c_M��������1
�}������&������`�sG0����~��#(��zI�]Qr��e��](c��������S��E����	��r��Cd�������)��H�/t�1u@�#Z������`O�Lz����LnVo���\#WMRR"M�2�N:�$�k����MIIc�8����R\|��������]C��"���S��oq35�I�Q`f��J0��;m�eM�Gz_%�����V�
M}�$=�5��	���O*���E}�7V(�\�1�Ag�����S��L�<:��a�
T�!������!�]�T�����s/1i���B�R��8F��W��	�fX�]��2���|�� !���v�7�� �h�pm���q�!��XzfG#�������Q��YS������x�E��D1D�e�a��������%{'�	A8�K=��:��n.~FA����.��5���1��y����������T�>](��;[���:cZ�FRg�����r�2�Z�������R���:`�:���S�Y�%�oz����;��(z`��fp���>��?/�����l�p����/�J�	E��_S��:�tm�;>�E��k~������c�8����`R���F)�TW��P�^���r�\��y?��0N�g����&����P�{B��;�F_�fD(�d3RY��|�PH ry�\I�����LP$�����ai����35�7���"/5D�PS�	-�uFo���X8f4}�mtO����������������m�=�J����cJ���(~$�<�7l���*;��t}Rc�u��2�o��r��9yM8=YIO����0F���g���T�\Q�]����2�[M�����:
���N{�y�����rd	A��v����2�X��<P����C�AtO�
�a��d���F8����q}w�
0<�/-W�sSU1�~�!	�A�!'?|�7x�n;�m�1{���b���^J�4<$�I���.Y�Ej����jU���(S�6��x�~��@���0/��X��"Nx~-��~�.H�\>�U�M���K�m�c�k�X9H���y���~���/
���N��KE������~;�����M[$
�"@�����P���V��w���|�D�%�F��R���O�K����u��	�W��x~0b�;b������z(~�a�0�������E�4�'�����:���Or.$+��k`�|(G�I;�����,2�����������O<�����P��d^P��"yTN�x�|�|���*b�����������F_X>�)[n�������uz
l���2����/*�#���PX*{��080|������pz��`�s�/ETHow%����@���F�Wc
���a�C�8�v���z�*#�[���)��k?�>���c^���'����c����~�km�wI�j���o��K�����rf�]F���G�\M;�8�#������Z�8���\�M��6&����|]�@��������N�*���7��n����b`�(������y��s_H����<��P"{�-�h�+�<��"��<����\�S����(>����>@uU�|����Cnu�H8���r�$PX�=1^8��f`.T f+���������{�gi�A7�`��5�-��9Miii�|6����������7�nER�i�����y���2�I�M$����(�0&py�����5Wqr��%�\/a���>��No�S���V��1#�ciG���k�<Q.�r��$��/�w��������>�� �����!O��c���X�
q������1���8 �������M���j����h����u��d!t{��h����L����X��&�!~a���~|z-�%��it>��9��E�g��kEl�o��\���R`�w1
�4�tdS����
����o0:�����/[
5�0�[��8�W�z�@�rll�k�� �8<����T����x���I)'\NO�^-�QP��G�h�H���t�����K�M��q^�>Zd��("@�k��2 ��9��6�Qo-s��5��mx��=�\���n�K/�����r	��|Me��4�(BH0����\��0x?���6�>����
y�yu�UZ�bpd����1��Td����pD=����]�}�{�:��l����x����*���9T
(���:{�����_�s$�+C���4V�i� ���r��]�E�
g�e�[�H��:�3B���bE�-�m�/�3�������i�_�C�����z���@�#����xR����"M����@4��(�wO�m������|�FT��u��I%Fm�Y��|]�������{�V�d����yJ���J���8TS��#�0�k�X�4���WNu����@������S����?gnq
��k!\&���\���3�����[?�A�y�,�Y���x\��;�>Z�}�x��Povs=�W��|�V?��E�\�:9�
m.�c����<�Pjw�@u*�mc������\
�k��G(�����)e�����u-��J���v ?���b�"�7�g���+�j�oF��yVr��px;��a�3���x�H���-7�}����K�/������xF��������������
2���E����:#�5N��=l�k�!>�5p�B6��Ey��
+��g������+Z��gr?G�|�������<
��s0~ ���-_XC��
���v�,��B��w����~��1��FTX���%u��}���p��<�=��������3WBH������K��6F����65"���QJ�e}��z���h%�����H��<�p����5<�����Ph_�r���%�\�;��
/�+jn�0so���.����V&=P�!s�]������L��������`�3��4��w9=����S��-�������w%E�8go&��v.�q�yL�s<a�^0��wr^SO��D�����v����}%�������(N-�s���$���5!�>C<��T�1K�f�$�b	���86hc��~;�#"{'��1��1sQ_����*C���?�����=�7�57c��Q�2gt�8����G}<!S���H����8�yCi����S1����C���@���G%<mID��N�m��ec�^M��1��������`�R�Mu�WP��L
^d����zz�����
��x���0@��%q}\%-`�Ss|Z0!@5�1A�3K�U���1�6>��8�c����0��]
��X'�u>'5��O�Y������vr�~A�b��������//�[SO�����+������53���/��5���^^�#��o����&�mH��>	?�@�0���kS5\AS\3�4[��7v��q��B���S��BRK��y�0��94��*,�-s��)S���p�6_Km@�,p'�u���w��hw��5�:��<��������z�|?����@XU�\�N�d�](������=�o
�|t��l�;�b9����B����E�����POo��������cv4���C�����x�YY�/�`�r�z������3��B�[b������-�
�����������\
K�G�f����E���r����$�����������B<���;����Z�����������p������Y��d�
������}����V6.�(�PT��Q��kH�~Eyo����>����r��{	��O�&6��6L�&��M;��cL���}�YPD���t�6!��b���������e~�����`�������s�hc��@��V��c�����C���Z���j)�
�����tm�>��V����+�8�u�@�M[����|f~/����F��89��z
=��(����z?�=��+BY�g
��?ABt�������(p((����"~�	�|����|� kP�'��c��7#��]���x8'~=\N�q����������}U6���-�O�f��������k��S(~���O���A��}r��N�Bsw�L���BR&I�"w�"r|���6���w���R^@Pjfo����\I�tGUb� �����A0����T�Zg��N���s&0�9�0�A����~(���I�
*�c��������P�����8�"8������_�)���<h�{��w���.��el����B���a�@�+e����u�dCk`	`�%Tq�G��c���!4y�.:��(�����s�i���kG������;�n�����tN�*Z��6��0L8�L�&�b�������Z�C��6��T��C�p���S�?Q,�<3�8��Vz��5�GB�'T��:������*x�-��?Q'��,(�s���x�Wx�.`yr`d�Z:��O��#���x��-)O�����r�����t�;����J xZ�6��Z�I������-��<6v�eK�$k\5�����>�3���l����1��2P�?�L�-<��9��f~��N.�'-Nc�'{0����sn��������?���/Z�Xs��0�r2�w9�lh�"��8V����K�-��X�^��E�r���:s;ty[`@��	����q�����6 �S�Q��q����������vu8������e�i���Y����`qtF��4���[�s��/%���9��Ja)�>f�x;�w�u��w��8&����
��9]�6x�AuU��q��"?�+��A1#r�8L_�+�<���C�����}�������3��@�,�����Qs��T�!���']����a�$"T�����b�A3U��N��z��Z3��nzc��;�1Qx�����u��uii��R�=����{M,��������aP��N��I�2��T���}��a���>�������d�&s2�;�M�K1~��
�j����7�^[�O�����\E.�qZ����'�A�;�����:���I��	W�1�:���mf���c��C�nH�s0�j����z:5���'lZxU��l{z����������������M��f`�v��AP<>����h}��
J*�� u�r��Av�����bL�5)��E���G(��q?����@��H�K5���}�e�9^N�N���
.�����t�+:�[zl����LI���h��e�~���a|�Xqa��S Oue���H��][�x�l4�c�s�xKlY>�"�o�:
����TZ���P����������s��u
w^	A�mDr:���������
�y�%E�{e&����:c�I���=��{�����?A��<B�F���gJ����K_
�W����J������vr/q��*�O�&���/�i�f
$�2r_�����#�P*���!�5[>�b� ��2����
��XG�}��&Wl���:���}�����4��SIf���J�j]��X�0h�����w����_�Kc��A ��Au
��C���	Nz��:��5�2�g����Q�>U!�~m�h����%�~0�:N���k:��/�\0��t��M�a�U��qBB��T5@��h��_G�
rc�T�8���F�kL/s]��1�vt���\�P�G��r6�`�*)~����,c�3��C����2t��NC���	C}J��>�z/��1�����~�g�=kr����J����F{
���@[��	�����4�4��y��
�t�b�m�L�- �}<'����!�p??!~c$����tQY3��*?����^�,���}A[�.V�wDf�?�ji���j�L��e~��k���0O�5,���Maq���^��9LOg�qj��*��ge�:T�Y}�_��(R�`�f�����|(�U)�u��7�C������-b4�{���s�����O��^z������c����a��Vhp�	�f����_�f�@��� w�i�qlf/����?��@��F����^�!m�r�y�}5��,�!��������}�n)xT����xd�A���,�n%�1O����������E��RB
��9O�EyO���K���Zz���Y��
O���!8O��~�|3�7�����H�O>�������8���>������H6��+���{��[h��UrP��v;M<��|�:��wdDV ��l/D�8��p(���7(�Z�����]�����v����"z���b��Ev�y��Z~� ?�Y`xAi��%BBb��YJ�>F�CFMM�7<+Tq�y�)#'��>_��}r�Zz-�>/|>����H$��LZ����L����S�q��n�����%� z^cil�a����9D5�SMk3����>�^��l�]jN��b�W�F�������&���$S�pC�������%����O��~���W��
o2jf�
�W�:��Tg#�m�!���'a�����;����B�3oa����Y�i]���!c���n-<q^dM-}��*��NC�c�������c���+��=�^���?U���w��w\`���G�Z�����l�s��~��iny���b�S2v�Q�E�&��f����
ZL�U+������?��!�!�b�����~3�M�3���j*�+��a95�
����b�]��W���J�ql��
�3�s������H+�{��zz`��1���'tD���-q���dt~�PO�ZLK�
�}zo�E\b?��KWp�T$w\�a*����v�;���j2,�D�=L�E����uL�`������`�� l�Mi/��Y�.��V)���^Ex d0�P,�i
�g9�����b@%U����%�Nz�6��.MX�vc���V��A@�@�����8#�G�u/�;��qa�����v�d��|�$D��<�"C�T�_`����0 Q{�"���MG�]G�h���:����n����V,�>G.�`K��K_r�����{���o	�E"�n��IQ�|�?f��d��?OC_�!��.�����z���������shY�]r[�=K��d�c?V6����,$�����MJHx�R�Z`�$clUy^�-�14��]Q�Q���(��x�Q?�M�b����z55���L*P��h����Fx�t'���5�5im�������m4��;�:v�\��{��C`4R�^c��?����c�7��Rv(}&Z��V�t`n�5Pb���{�7������C(�`	�;��c$���P��kA�������O&x����^(��1���m������y������������B���}���_�s�P�"O�qMM"�C�op-!�Z���a>z����������	b��_�h��P�G�W��u^�
5�>Lx������j,y5�Og%U �"q5"@YE"B���N#�J���
t9H��s.��+Pe��~4��S`���8�a�LP�g�����"
V���b�s3�j"���(���/5(��n�����Q����.t��z����@(���vQr����������ZQ��?c�����)������
7��C�k�v��h��?��@k�PM���a(��WY��:���L�>H��@������l����c��n�:x�+ZGE5�`G��~����5��%��*�1O|�5���&�_~QOO�Hw�L���n��B�J7�U��
��R��������]��n�!���TF����\�������������v��9c7��R���e�lo�
�����hF]�w��|3��;���
����Z�A���<�}��!~�e���1rJ�R�=}6�;����N��4JB]k�@��1������5B��������A��(��J�������;�e���L*C}�O�_���\)�@��'�?rE���b�������d��\�,#�6�C�Z�@�v���"�u��2x�(a�8|�z�p������"��! ����h�e�����j�:!}w�����:��*���bm4����?���������{��&}��0~�����5���g.,5�O��$r��0`�n��LXE}����S����qy_��2�x1���s�b6>���KA�@��C��F����>=n�bn*Hi!g���j�b�`���d]K�k�A������O��	_��+��!��}�Q>�6����i�0}��
x�ySb�������&8����������g��7����uc������kpa��R�mO��D��l�m��*�B_Vu?�^a��l1�����;9����u���
�3�c�o�,����!6(3��[�y|�
����@O��cM�n��A,�`�������16�r��-{8�
{�#���7T���,��[���[�/w�o�o��6�B��4��2�^��y��zE���������0�`r�/�?���n]VIs�����J�Z���^5z�

�S���B/��L���&v�E�^:�v=Ppm/X������S��<>
�<��R�r�w��t���tQ�%�5�=kZK��#�p��'I�.��jW�������>&�"���Y���e:z�M�9O��G|G���� �B��%��w��Q�1�	�2v��<�,'�I:QP@S8�	���*_4�jV�'BP����\�>�>����A�.���o�
�"�?�
^��.�#7�_����e?h�u_|Z0>����Q�=B��?C�|�}���t3b6[1y<��GoD���K=N{�+N�-�������e������_ ��m���$��}���PW��!.z�=�@jLTfAC_��;d;Z�"�U��q5D�I�����|l��H�]QM�3�:��0��4n���������k<U�����7A'�"!���4���>��������+1mQ�
��A:N�\���f�H8�{fJde�����\�P���aA<|�"�N�������1}d������7{`~o���BY�c���
I�e�V�w�5���P��^/���8@(�����T=�P���07�SK�u��X�4T��	'��6W���mk�'�c��k�?��5t�����4���>��g��3a@�����������������������y0��g7$&(<��|q����im&�~�������WV���uD
�;h��@q��������/e�

�����r���9����l�7�NtLh�6�\���z����j����~95�M5��9��(z�����B[I�s�1��������^���1�B�����k(>
c2����r��:W��C��������}}`Ec=R������]S�^�
Hes�h�^ys(���P��+�1���/�90��v ��@����T�:p^HP/���n������K�i���O��r���E��
�3I�u����� ���s�g��t�+99�����S����x����u�����hC�=�eH��q�D�t���|{{�E�?u�!?S{~���I�xnH���/�Y��pq>��K(?co]5�Q�2�i	Ou��Gd�-2�#e|�����s��/����&_�-��r���*������|3'��'���~W�$rp*�@
�����������t��{�w����k��&���8h�a.:��/]��J��=]�*�|���`�E��:!���7=�3~�kBr*ia�V
`�K��i��!U�k���q�]��B�j��2x��W�v����@[�:W��u�6[���}�UC7�#�r�pcM�6Id��+u\��`�$�Y�`��+i��-b�S/^m�	#`������vMP�<d7�����lK�@���o����t~���!�1n1����QN�H����%���-4�8��GtQ�iZ��5�B�%yu��5�w\��;�0�]P���lL��c0r���I)P�?������z��������9����8}�g���j���=_==���@������������9�}�J[-�B�d��#+���&�������%G+t����	�a�d�H��	���-�^���9)&�8f���;S�L]�}iNu�,�����D��>���2K�� )
���
���Y�<Sz>���<zn�����{hg�F�B�eZ�����.dX�O��HN�k����/iZ���q3��G�l�z}�E�l�{�"|���X�N(����1�'������;��iBmMmJab�ut��z�;�:�}!��3(@�4���k_J��������I7��q�6r�M���B���b��v����R���������-��k���>����S��Rc��n b������o�'P���m3��O�]D���!�>n��x���U/FF����I.a�u�W�cf�7i��/�x�0���0��5���Xc�%�l�0}J�6�gP{����n�cG��R�
�j�����#�~��^21�Z��@Ha��;�w9p ��������K���<���>�*���M�90T�0{@�u����ib���op.��u�O4��
r(�c�������)C�r*�9��Vrq.�\I�h<[�b����UX?��N��C��zoC
X�e���Z8�gJ��4b��o�8!l8�N�a���Z��S����\�`5���i%U���Ce���������1�A��������H8Bn�+�h��}�
���(b�'&��0g�A� ����&��>�VZc
�%'���������K���	T[����:��p
y������~�9J��I�����������w���%]��{����z���:,M�d(,���>qX�����9^�7$7���T����!�%	_�0�\E����c����LA��G�gN�A�M���/������	.pvD-�o;R�e��8Q~����x����P�u�O�y�Bq�����A��w����>H�a{���|�W>L��]���iA8G�>��`l�������O�Q�.����h'x9xK������J]�9]��}o�T.��s�F�s�_yk�����	O�}�A������7oLr��S������Sk]�m5����K�"=���_��[hVC�~�3��<1��������?r�(�VD�GG6P�����h�zc.��!�CyW�W�~���!BM}"���-��6��#��{
5<;��<���}9eXW�ql!{�jJL�C�;���r���A���	����z��������6?+@;����"��0�A��\vgl9]�j���c������{]��x8���\�	=��^�|�2�TSUwa��>c���	@��}�'���\>��1�R&Q
�kB���<�Bxn��;X���;���6a�<�:c!#��J�����'���P��������;{�����jPQ#�n�z��@����Uh������.9������C�w�\��> �9� %��0��^a �E����N�.�[jx�rxf����$�x,A�s�U[���m�Q��(�ba�pG����9�����s�����������l�}��P]��['���������Rk����y]�w�~}��uQ7R@���:���hcZ1G������l���t��s_d�S9�T�/������i�t�����FI��k�}���n�w���==���z�����w���@���Q�R���,���<=bl�����P��0Q���b����
q�a7�Bu�4��y��%U��[Z��"n����Ge`���-I��s��5�4��[�V���������(,��sEgPXD���(Dj�y+����@�}E/f�M������; P8c
\va���i�$���:NK�fF�.�����t���_����ut���s����Z,�� ca�"���f���$O����YU5�v]�M���7l��#\����q�����0����)3}(������{�(M�v��1�RMf���;)L(�k�y�bt����N�!(��
��lPS��K^K���&1�f\���CK]�HtdL4��J�Sx�������P�~G���1?
��9<�al	��@Vv��|X���~��#�#b�h�����M�H?G�}ES�B���F�6wg���e���VCB��:��n���;E�i� b����J����4���V0JPi]��s>Dkh2B ��)@��4���U�| �`BX�����"���������oE�H9��X�0����]���v%),+�?[w��s$Vmdc5���
��|;����`4��9���qX�����df��&���!8�P�a7Q���:5`�;	B]��	������]�ga�+<�n��B�u�R6�,�o���N�����7_�"�5P��8��\�P�G,q�|��:_�j'��?��h�����w{k��	�e���l���R{?�9<hA���>�k���o
���(������U��:g�x�`�/rr(N��}���3����tjv)Y�,�hUn�z?��o����w��k�����KX�- �d�6�.g	�m	��y=�B2"l��$�������F�W��q��P�S�pSY�K���~�������w�����2��Z�5���O�c�6�N=�~�x�B�^X^_�~;P0������������������,����7����_�<l�$un*��Kc	��-��C+c���e(��xi��6�������t|C�	��WH����^l(t���j����MYo0&O���4�c��@Y���|��q��2i��(�O3���
��������9����V@!�hG7y�����M���{n��&����tq�L��bUmp";�uA��6�W����Y{:�_�U�^@K��%�w�Z�����7X�=�	YF��@������.���=��u�l�<�z6l�}M���w����%#��m^o��9�u�}����S�i��HNn��z���%^�����^Qx���w��)����:�+M�\NK���>�<��m��cI�<Z�Ey�b�������?�5����j8�+����Y�$n���Q���:3��k8����i�v�l0gkH$�E�`.��2���o79l�|L#��t�D6�aO���V������{��<�?����N�z ,�pd��5�|+�W�\�����V5��'A�!9T_��fS#h��A�h������1��z}������ag�\�	����!�a�CF��X�t���O*�b~vS���*�w�K��k_z�}�;#��vb��� �D7�����ko�9�����+b�_�5��c.���$����qG[�R����"���1�>bY~��l;���8��j'����xAX+�na�����~�����ckhZ��>��{���� RG(��VLsO���g�0���r�����dj/�
4�FV�p��;A�.����n1�!��?�����w���~�	}���e�r%fU�^���j�7?����*_jnx�:�KN�r8S�5
V�d��g��~n=��s��n�o|z���L\7�i�45` ��fr3� ��}6�E�Mt�R,�Ir~��BNJy]�z�I:^����E<����"�:��&u4����2��	�����3G����R,�y�\tGkM����@0�G�`>�9���m���
w9����=i6Z�����+�w-4��3�F�'5���a-A��EQ09I�K��,��}9��^C�VF
��G���WG�	M�4)w6-e${��s%���f��z�M^^������s��F�l���r���v�!�`�pW�:�=�r���V���92������a��l��"�p����z�
���!�m��e�t<�/�6����se�SN���o�:�/(5����������|>�����@IDATA�6��]��jqR���8�#0j�:��-���Q�Us�E��3��&r�1 ���E�9�C��g���c����]�_cd_#�cvZ� ��>�9��'�'����4��czv������B���`��F �<�p
��U��q��+u�1N��l�w�,����|5e6�Y��F�k�����>B[T�F����N����<�������4�p�J��/!�#�{��1�����~c����a4��K]�
��7]��I��������B��G��a���z>R���B� O��0hw$x��8��t	��O%����R�`��J��Fe��gP������a��P��iN%G.3�y�������I�B�*&���>0J��.���O�?0����Ph���f�?���5�x�$�)������g�R��0<�a�y(�B�]SX����5����ia9F�!P�6]�@o�Kfo 7=YA�c��'�)����N�������4����2�.4��\��b&��o�(���
v_
R��������ShS��9�{Y<��^�Y�y�h:v���FuU��J9���Kp�:6U�����vT�(o�����y��bG���_�b.���k�>n�u���a��|:>/���� ��y�*#���%,q�x����#������%�������C�72O�^�a�[�{���j�Kc�)�����WI>)��������`$�1�<v���������P�w�J����q�`�d�M����� ��������>��'z������]���&����<�&Z���`���
x�������n��Wrmb%��-�����
����tEf���W��PE,�66*!7�'���Q	�i��4�A�5���������5'#x�`��i*���h��1x��q����(mFA�|8����A�	�
F��G8i��^���8�9�,��i3 �Y����t����xRr����C�R�
��y�?�[��;[Y&w�o�C������Z���s���'Q\'�|�N�J��
�vs^��e���Hrr�����X��5�U?C�0��=��-�E���{9>�.�vK��Y�����9x!�*�1KD"�SN��c)�A��{���@����b���,xv���8:����(��Oj�c�������r��%��-T-����?�uk�i����x�0�!fJe����D�H�Y��}����b!&X]���
�6_���5s(K���D&I���*>{�Vy7*]O�����b{��SON~tF�F
-��A:tv���o1�;{�Dt�c/�bHe�yz+e��*������2.s�����������
���Y���������j�S���K�A�
Ek"L[K�l{�ZG�*20@zf�������'L�f+j@���#�)�&D��mE��n���x�^���j�1��g$�������A�q��Szz������z�l7���ok��=8���.�@��������j����2:3��.Z�	/�`�����SF��sA��^�_� ��by���
��Ht/�������B7�W!`���\����PKM������"�1�W$�v?�*�~�&,&���eA�^��������*�S���
)���>��E���!������MQP��'@�������1��������V�L���T�Q�Tc�,N����m�[��W6o���xb#�-9��[�Pf���W�O���#dtV�������B�G��<�q3�;uPL8�:�`��,E7�����H��0�,hJ�E���"��E��M����nOfQ�(���P*O�"k*o{S�5�����pL]3)�����g�����A(i0~�	��\������	BOW	=��/P������SS�������A�G��T��a�����D6� afP��=���J/
��K���?�Nr��W�<�n��>m>�������;���E�H�g9���/�ps-h?�8PE������(1W{��L*���Z��WO�9�����J����il�a5���c@����[�f�P�~� ��0�|��X�e���lI"{8��G�~���K�7#�B|p�w ���W�nv�5_����W
����4Nj��4`��t{"���5�3��T��k[W
������s 4zvGJ����Q�a>�n(%�Q
�-��G��	��3/�c���D����n� ����w��Mv��RP��<�Z���B�,tw�Z����2���� �x�~������������<�!����Y%4��:����V���X����������$�~�0�+���������"��������?��k��C?u�'P��S1V�n��*J�'��$�,��z��;�A1�Qa�=����x])���2�u�����aj6rx����9z�����VLMA(�����%�~s�bz��Z���m�<�np��J U�����udK�L�������������FV���ul�Q4xDt5e��YZ�yk�k+d���j:����'��&}D�;Xa��+]����Co&M��aT���I�����yM�#�k}'-����V�0��M!oh9zU�����>���������[�-�X������@����@�����hJ�/
�5���M�6$_�4M�EB
���m���,[�lY�}k�����z������������O��}�}�����3�<g�������{�Y�k��$�L���6&S�t<F�M��j�x2��VYM������O�^`���~��SY��G���;~?\J�u�|�K������3*����	�iH���i!������Qht�����}��w��x�
;�$����!�>�q��g�g���O����-C�[�'�������7*���n{4���=b^uOaM����7u��UY�f�p�v���`UwM��33Nxx_sU'�e�^���	��}����������q6!�����[�����C����7
���D�y���5����~�v��G���y�C����v���WX�0a��F�T�m���*��p�'�:O�V��X�����P�^34��d�c�#��D=}���;��z������<�fW\����o�?�^}A�3bQ{�`>��,���D�5/{���r���&���P�F=����0��K��f����N%'@��}�~����A-h�����`��	�0������1���l�W���)��Mt�M�t�'e���Fp| (",k��>��G����ye���XC��"�G����A��pkb"�>4D���1�eE����K{��������uO[���5'�����g��/���I���Y��,a��@Q�  �a���r�8�)63�P�#�\��cS7
��y��G�CT�'��VgLwY3igU.m��]��v�6���9^�������x���7��������*�76k��
������7 �'NZ{M���t'~r�X4�b�Q��Zs���]k�-��A�y& �E@+��o	��##����b���`zA[���������\zkr"n�\VCg�>������cW.�2;�3L�6,��c�@���������a���K9/�A�}���5MP&���bM��>M�,�9����A���N,���9m�n����LN�O�������|������_������k��u��?���������wgB�H�G+i�W�Qk�3��6Z1G����~���,w��Nc?��,��5lq��^��"�%L�a��}Z`��+9��_�}}��B�x_-a3���� ��'�*�����l�����K	��x5�-;�s����@�3����B�1T�Z��,��}�3�z�����p��I�'���A����!�~�l��ELs<����;Bw��}G�0�oh�=<�JS�mn�
�TLA�i������~�q����[����HsE`�5�0wcS���jAc���|��G���i��a�����I	�d�O���mto����Lvh	�k��������8���l���7n�s���=��M���x��z.������"5u�E[/�����~��E�x;YX^��sD7k�=��l���
B>-�����
M�����7�L��v's\��u
�(�v����x:v�J�y�} Zk�V���J�A�
m}���:�/EgS�0<�e
��	�
�OX�<rW'}��t���@n+�g�z��\W�Q{�h=����N�U�G����}�����|��(=?��G�����zgg-�<[�%S�P�4slC��p���^�.�Pg|}p�?�lM��y���������p�B�p\�imT08�������U����X�u]��_�T�ti��V:y$w�v�����C�M�/h��:zS�4`�@�0g@�	��]���
ut��D������H	@�(<K�F��m�?�����~l��:�����MOh��R�z�i^0uLfg��:���Pn����G��������v?}<�;t��m������&z|����KU�{n��[��|��^O_K���S	n ���Qh��������7/�������.��E�dh�`L�����4�B�=������q%\�G?������;'S��O+�<<�`�7������ow�d��>����H���>p>S����Y����k���j����4^��7�{0�cN�����oMR�>>�9J+c,!N*5P|B_M5�}�<7~/?�>���]���%<Ul����}f=���������7a1��������q^�����@�<��g�����w�'O�*�5�X�"=ph�h�aq�i����c�x�:���~�9hM�q�?��9u��q����j�x�1�]��\z�P���R[�h�0]���������V����3��:�����x�z_:Bk(��@������7���4n�29v^[X���K8���6�
���q�d�0�d�j6yy���p�s<�<7�ny-����H��������E���F�����2/�Ze����������5��y��V����kg|�U�"�}�����������<XycI��
z��xk"yz��[�F�eUT�P��������8�I�fuiE]����;^���I���X�h��W�@\^A�W�^���"FQ'O����o����y��I=s~������C+Od��/,�������f���
��G�]t
���u��6��.�.���Wx�eqL������3t$!������C��kQUt�3�2GC'��[mt�x���y2���->�*�������cyJ
?�f>s���Z�n��=�H��
*b-\7�9<��p8���N�=	�����{���������W2�����������}����`�>�\�Im��T6���ol���cb��:�U������`�Gz-c^�b������)`���y�`<w�I~��?cL����v��CL����y����c��d_�b���G�� Xb�q��MP��z���7��	c�b*f"��6�0��������)�n}A<�=}�yLI�K�9���~/�t��������
��7����R�/���/��*rv"=���)��cB�QUQo�V�;�m,>Am�U����]�\��e���K������w��`�2���c�����R��s�0'b��y��c����6�(�`/~�������()�N�E������a���8���5y�)*\�A�;���w�v�>�X�t�)m�����>������;�;K������N���4��|��
���{�H���Nk�^�'roWs?q�O���:�9`�]�j=�����Vzs�0����y���$��r��~�r��_,���������
X{1��7�*���V���Y�c+6d��� ��bwG���ba��r�v���6,6��w�%1'�aL��)�\;Q�6�m�n>lW-�����8k��mOty���q`������u�N��~�{�]�'�C��������)QrY+};�-���k�;�����	����{O����)���D
���G��(+����j7Z�l��c�4�[�:iUM"�����=���\D��,����VC���h$'�+h%hU�o��^�EA������70�����3s��������$j�b!���su/�<�@���<�t����w��[@}�E!���K�i-��}W�nz��85��z�q0�Aff

�����]���u���z���S@�	9��4���7���Fv�����T�^�^�oq�&e���2�K��6QYc8�1�mz�������Z��f��W�?�����)��#��~E�a��	cf��O�e����W=T�keg\�7�cAI+�����)����)+���T����$�>b�@*����
������>Z���y��l�uE�f9O�W�P�}��r��9�d�U�m{9��)U��?�7��y�B��W�`4��i�&K�'/B�����_�K���~��
����z��p/��5�k�[�?�YK�<c
������������>Jw�<
��*��%���^M}��������t��������l`.E��e�������9f�KW�S�5T��p�hF{�����Syl����R}����w������b����c&����JB]�nc��3MP��E���C��[���'�Z?���3�����������c��EA��j2+1=0��1L���B�#���)��Ul
��S����stn_���}���G��&5��:m� 
k�l$��_b�0��9u�U�vm'����y=U�&v���>z���������=t���w&�^���~��]�.��fh^F��O`O
�����W�*���*}}���;J/f���*f:;���������^����k�X��W4��S%e�R�%/����F�3_�_>�3*�������nVtm��q�{�pSb��j;������:i�>l��q�j��oX�{;\GB���9���9���w��a�l���zs'���v�8�7f���NCS*��q��!:7��x�4�{?��X��Iy�*V�����PO�e�~	+g�SK���_G�R�R��&��[�/�����5���2������7+����Zq2	��9�=�JY)g�����y���;z�y�<#�i;�9���m�� O�[�@@{Rj<Z��|'4� ��������F�M���[^P���%��&ei�=����k'5�F�������>G} L�b���a?��Qk��)��$��o��$\_��9�B�<C�h��c�N����[���w$��f���	_��e���D'�w)�Xhb�L%S;D��H�,�	����p���s����V(��{��*�f����s���H�
S�p�8�rA|������@�f9����K4��Fr����Z�GX�kM�H��yScX�0T�L�l,���JO���4^�n9�^Y[�E��\���S����#=����'���,t��j:�{����.������5�����8W`0���\��*c���fR��O���w�g���k�C������v��O@`�P�����+ �I:���Q�����6�-t��4����R������,�8�S�O3�7X4���9XA@�t��2VS���a���G�A{^��O��%�@�������~���=��e.�V��z��n|"��gA
�*�
)�toAH�A�%���&
X������EX�yU�r�s^ �Z����]27������U����P�"R�EV�n=���#�F(:�H��hq�<Z����0��gfzm'��2E�'��U��V��!v�����^�B
y��x��# D�������{?z��/�_{�D��+���U������#K����mk��>�|���`aQrr)}y�[)�]����1�]x��1�@���d=X��R�;Y���nh���F��9G�
����e�	��N�'V~�R9����k����r���<ve��m�JE�{.����A�|,��,Mk����\���o������CI����X�t���������'7�*�������tKM�
��:�Jv��Ss��)?J5�i���t��v�{��;�������K����om���([�������;�k�����b�+6����BAJ��q�t��/03���i���K9��H�7�WV�����~��~�u�������]�������j��@�}���.������V�H������^��"�����\�0[�g�]�^�����VKOuq�:^�"�
\7jK���Aj��u�ewIm�)��9Pc���J�9sQ�:5-�QWC��==4�#�|��Q�#���>����Ct��N�����~�>_�}z,�*z>y9����<���m
a�y��~��f��AO"�c���KM7�)���A�.`E�J��~=3�.�:7
{	]���7{x`I���/�
�$�,�saXO�&�U��Ahw�����0����;\Hp�I��A��aA�}�����T�<1&��;FB�M�0���f�t
����:���fK���o��[y��	{vM�)�h^u�wZ���6������N��w����Q�Q��#$���A���YN�c-��s����%�3����	W2}��%���w��	1sQ%���?��.�x�I����9��yx� ����]$��z?���M��$��������%\����������JY�<�nS��t*%�E�v�cX~�h?C{3���tj\����
�Y�7���(��?��><�b
��I���B����I�6v�Nk���
oD��&���LF�;a���Z/���&V��f:�b�\��h-k�����k�m�����Y��5z ����C�E�-����-b��H�o@�@Sk$�eEr
=h����Bk���p��5�"}�D8��i���e�'��:������'����h(Km��g�c���V���1����l�7}`��Z��������2�����;���oM�}
�G���m�/����R]o���m���4����	�����Z���1��J�YgY�1��~��Gh4��w�5X����;C^��v�%Pa�1�e����{'}k 
8��
������+��L*$�e�U�����L��=��T��c���� ��(l����|v�)�s���\�`���?	���dw�u�%)�!_���-��k��
��c_4��������Q��.v'�j���q	aJ2���<�><oY���j�U���R��TZ�����zO��V3C�?������^H��*K�S�k��DmVR����*v�V��Ei�����#��t�3�O�l��	m�c��9|��_0�J�i����+�o#��5��1�N<�f��-T��c���o����!���Ki�PG��~�O��O����5��|�bF��:�e�N���r��f��tUj��L�_g���h��=5�IXg0�a����G��Qc��wRm�~�`Sq���DV�ps�(`�X|9��y7����N,���~U��J5�[�%�:������o���i��J#=�c�=c'aX�,��^Y��z69�5�y|���hcs��d0>]�D���9_���s��W�����0���*Y��[�s|']��8����f��1�^1j�!P���	�������W�N�[��t�s)U���3o����X�Y]����n�Xw}~���l��TH�.�8�����_���eo&����~��=dae0����c'G���_���5*&���%��z V,j�jd�	�	,!0�b=-f��l�*��/����Sx�Pr���V�t`�5����kziW�m���Q-c�,�;0v�V�R;������;p�����r���L��@2���Q[���H��v���c�
��<���)����i�� {px���Bcm�1��o'U�+q��	�`�:���nfA�M-O�#Ci�O]��
�]zJ6S��������(}�z���%������]��o[���Oi7����i�7Rj��:y�o����P�`��v5��ZJ�8zgS.QVA�3�-C�4�Z��=�*�8(B�A��;�K��������������`���K������'�������:�6���	�J�9�c��VM�?���@;z	�,1��v���@Lb���y�y���G-F����T���q��m��)_2�/��������������N�M��j�Q�<������c�i�
���1�"���h�h��|Ypq�������{4XM�e�5?��.�=�(�XL��C$0���w&�
n��H�^����}^��M��!zeK/�_omJY}��)�C`.c=O��C<�D��������`Pc
������`�������3�5�=X��D�P�i�U
02�B��'�gE��i(�#������!P-����4�{�~��(�)������!���]��Q��W���,E����`�e3�S�����LT��K�I�Rtp(��B��y�|�#����i���~�u�|���Z���:�>�4/,���~�G���E>x\���/�>#v�Ul�x�{�V�3�|�uT�}\�����
���������}�8[v�r�����=�{W5:����s��|;}b`+}������v�.Vw\�[��_�6W1e��MG��'jF�||?�7\��1�;yo����<��p)da�!�aM;�Q��%JJ�b�T�fN��}bs7k�'��fm�T.,��
�������z�����q�-T R�c��v��d���8�S�^0A��������7+�4�Qk'�)������+RL'*���4��B	�\��� �&1�:�M��� �@�_���8,z��E�Lb��a����&p&��*{�${�O���U���"����$j���+"�d�����<�E��@��4��g�l|y���&��H�
	���]T��Vg_����Q�+��m�.�i;�Za]���o`�"@Q�t3�����.�f>�5����X[h�/�*���\�aW0��I����u���������uyr�����4&z���1��L�X
��cqt�.����c�2XL*��#�d�]s�>�1i��=L��
���'R6�]������{���n���5�S��397�����2�:��>z���t������N%�I�������T��d�b|�JI�xl��*[+��&.�	���k;0���3�����\�RjL��nJ���,���S�i>#c=��<z�����ay[�A?yL_�����������@Ps�]'������O�Q��r�4/!��z*���YoR����0]6���C������@|��$�����t����>�����1st)

-�>o15%�u��aZ�t�������c�,�uv����x~&g��������p�&���5k �����n����bh���(&�{��y�t�97}�����-�����H.3?�)'���d�7����(��M]�mi/�c��D��K,,c��-��������+���So�G
�Q���J +y��W���+))g��6���@�������0�'��zK��X1=��n����R3����2L�	����:�s
�7*w[�D����C�_�
�p��������eW�e����vw+����������W�
-X@��'��X[�����/����$������C���L�`��]`$����'�P�
��3����%�{0Y�I��i��Wc(�x�&�*y��2�5zk�~z��z���*��l�UE����m��L���`�Cg%�Z����.J-���f������>}I���"w����	l�K�V�L�FQ��������&����E��.���#t��a��}�c����s;i��Gh����=�NP6�[I����H/���>���5�A`��>r2�@���C���p�������j�MX��'Y =�BB���������x�-N��V���g��[%E���5�4���(G;�H���T��O�!������mM��;B?,s����Gk�PX��4:����{c-��X��@��-6�H�h�d�{�5����C�ZW|����Z��y����r!�csw<�������T]<B�Z��T�s�|2��m��a]���3��`��B�-q�W�������_X.@���S��Q_$�mb,iZ���8�y�71���Y��>�sC��
�^��9Q�H������d�i �
���v�����sh�H2=����O��c��E�����zp�|�*�8�$�5�A�VG?F"L�`��t����J��P^	�xAx�wlA�q����h8�	��������H�/l�����EV���|u��=�+?T>��~�G_����;��/�m�&�Vf����Ki��N��O�����=p0]<�d�[W���#�h"����� `" ��)��ia��XK���
!G��~����)����E�.�r�m������
��!����r��C��(���;M����
�6�� wh��[�Lb
�\&af�&^�Fb$D
��~�o0��:,m���4�~���4���3>td�K��|3G�t[R�����~�ZW��t~�?g���A$�;D�������&�[^��;[��L<���y�������v�`�-����L �����cR�G��q��-[�J�:��^8?�A��PN��N�$�v���6��g[+��i��.5����l�����}
%����S����N,��O��e���/��A�J�+ZP3���*��1@�������.��m�����h�/�����v���g�n�o�~�j�Af��Cp��������j��N�P2�c��y�(���:<����L-U?g�[,h1�Z�����k���a�(�f���,]���C`��xF\�k��-�Z)+�3�5�/�z{���0o	57	�imTeZ��D6����8�0��9c���5�E����g27�
f^���e���e~"]���2O�HO�����y��G��3Y�+��'����}[	��UZ�G�#&6�`8�������	���z�SQA��_T}�:�����>p�����S������4��G��}��K�P��s����o��kl%������1�sJ(w]!������s�x`���`
r^�@X��]�d
������g��<����\U�Ey���%�t����fw���*6
���d������^����4x�w���.���_9��>�k�e���}����iY��u�/�����@������f��3�<{��Z��+�X��S�n_�������4j�m�?fL{���g��$�m���~��h'��p���>E�!/[T%�?F��Y��.���U�*����~�]�)�����K(�-�������^�7�c;\������w��[Yc�`7�l�0�	4
�N|��V�K�l���4�z`~s#T�t4U�:�)�^�$"w����9f�����-yz�b����{�[�sP�y�)gV����)le7@�p�q�n.�5]�������������~{�6���c�}����r���N)�����������Z��t����������ipp��>rs/g:��S�������?P��;���%� ��:�FWA���`��m������Sq������^f�p\-X���w�X[����.o����b5�)&���P)XL0F�dV������j�wS��^:�|�u|M����x��]!��XW4�����/��gE?��yx�KN�p��+�}pDA+Cp�e�`m�����b���:������tb�`]�\�a����:`O���!�7�{�z���b��l��
��u7��� /@�����*R
���� �@�I+���S�t������L%��������>��IX#��W��*�y��HN%�p�;�{� �05�{8�jt���B�	�5C�+����8N�[x�1�4i�{�>��yo��vV�8�>���
J<#[P�N����,7-<�B��O#��XA+�]��t���w���]O�/�Q�zH�a�}��<>��F�!��� \+V]z�#E���������
dDN��������~Z���N7=y��
��5�m��OW(B
�f[X���ILaZWN���0i������F{�Q�%|#�P:�1"�1=��F���Y�����F�"�
FB|�w��<����|t���w7�_���y0@�������7����'�^������\���3}|9^�%��wU�M���	��o��c_�����C�����#�51�������fTbE*=��L�{Y��D�{;>�!��e��r)s����\G�#i�}�6�E��QJ>����1�#w ��}�Pg�Nn;8�eJ������^�7���~������#yw��A��X)������5qW�q���x�� [��O?InT�+'�.t�X�gh�*ug��M���Y�*�]���[��x;U'.�I�����b������y����?���e�j���y5o�`�q���1���e`eijh_�������������;h��O���[�S���[>��q'l�2�s���V�������YYA]�v�,'.���j=��6�`�^����c%��'$�{�f��s<�m��}�������:l`�0�!&�����O�����_���V�w$����+��������wPG�����b�q���������������?��kZ:,����U�%C
T��@�8�O���9�!�f%�;�M+����,������H��}��t:�����*ub�c�U��T�w'���CG����b�����
��Y0rAx��]<��0���IM���v�h|!���Y��O���r�i�}*�����#=����0�3#�VXq-��k�@���J��(?�������qz��F���C��7�/�b�p{*���PV���������g(q?,�`y���~J�xf�Rk�=�a�~�J3�j�	cs���nMb�U��	�o0@�2���Hz�w�vz����T�n��e����1����(q>�{*^C�k~��]��o5����Y����������K�l���y��7\���`��C���'(�!A��\+���t�T�������A���sz8I��X� ���^���<��5�}hX�M�&M��$�i�}�NyA8Ok��#��W�)�������/Wz�����Z����k^�������tI��v�hS���3X���i�����^���nJ��I�(�A���$ca�X<�t6Wh�m�z�8O���R'G�������G���b��*
u�}h�D��3�iX�����>q�D��eM���	������(���5�
e����k�M���^����]�1�W3<���^>f���e]��w�)F��+�ic}���r��e'aM�&h\������t���� [Ct�����Z�V��N��RX0�K�6���t>C�m��_����J�{�lc�������
���>��\��u�Z�����8Hw/r���������z�-|-�jt�g�\����m%c��:��}�o����q���&%h����B0BK�I��������T�����J������L���t��+����a�B�~Z|�Ve���,���G'�AQ1[%���#�'��h��������'�����D�A�`|�sc
��������#E�"�*������K���x��y-�>(�-�x��;�J�����Y0�U!a��z8���P�F��qv����!���r���Q0�Rm��
U��|�>�fV�����,�'����8F0�'�n�FPv������TN��'���Hx8�a�p^X����`�A/��h������$��Ie�����)��/}�!OH��o`a���q�rYSp�����
q��Y&���
���*�C���?��`'�}�u��u����������q���	�g/���
�G�2����z��m<��8����������<\?��]�J���;=��*c5��e[��MI,�m�����%�����	�����T������~v%XM�,L��<:>��Y�5��:5���<�q��~^��K7if��������N�I3J��n>����\��=��N=���\�|fU}��H��3(uI`�L&����Ia��7Sl���S0���iP�xi�b������^
'a
��-�sX@O���	�����)����}���������!��� �Z��|Z�;BG��������PB�����D{�N'������F�&�O��[�zc_%�`�>�iW4�'r�9��%I�" ���xL�l�.�e.�mJ�>��gS0��qB.�ShO,<:���B�mu����Yr�e����(�IDATl�����F�=��� �P�f^��U����G�-J��E����KpKT�&���MZ�tU}�	v7���^(�~��F$wPkk�����L*X7�_�����S���JWx�+�]�p�c�����q@�����M������]�����)�v'o�.������+�������W7%r,�^�f��<F���?��[��z��>A�BP���M�������0���d�"n����R��>fn�w%���9��p[5����b����_�����e�2�n�S����nJJ8G}�vm���fXJ�erl%�@-3��Z��������"���KYU���������XF��u��
���?N�n�`��XL:a�.b�"�n���C`��,l�������J���6��_<D������e�|������/g��;�z:�*��/�����`���8 :�o�EY�$$�������{�Y��YX���zZ�����J��S��[DY��/m����f�c�7��R�	OpQj��p��]J��4�����%?�CO����c����������
JyK�r�l�7�0���`Q�8w:�Ip��8���x8��H���-��A�&3�)��,�n�kqK�^�1n�2X�[�YE��xI�[��\x	��PB�^�$����0���
fD�N!`�D����H,}1��A��9�\"he�n�z9[��Pv����>8���x�OGR��y�����+����T�Z%��E0N���D�f��#El����1�����)�XG"qy�ia�hZP��k�}hX�M�&�7S�S��zT��e�.�?�V���}��|�M��Pe)�`>��7H��*��H�{Q�k�t���nr3}�?��yO/I�" ���xL�l./�s�mS��)<<��c�M��1��Lc� D�R�N�)����G�H�b�Nq��wc%�������n���.UF�h�uP��l������-�Pf�`T�D+����PK��J������A�mv<��������������������/\W�^w��u�������Ctb��*�S��d-�rQWmN� ��������t8i��ZGE����%�Q��d���X(8S����d��e�<��w2��!��	��,X����]���y��/glVYh������a7Wl�����6�q���t���C	���<�@b�����@"��f��N�0��`^Q�M�Z@)����������&g��V���V�|�C)#.�,��.���UL�/n���-��*�{SF�����6S"c�b����,��.����B�-\�y������MKS��-��O&��t�*v�m����7�N�]�p~�����Lw��MG�p�������,��=����p�O���#���6i��������rp�:��,B�'�@Lp������,�1�h8U��A�S�h{�
.C��H���9�<�:�@Yk7c]\����rAqa�>������F�5�`����qp����T�
�SA/����x\�w�����4��WB�CC������Q'���`
!��u�t�Np��T��y������@e �6<�7����K���D���@���EqDT�`\a�,��Sx7!�� �Xh����i:��M�C	0��?.S����K������@!\a���o�`�������D"m������%cVm2�gA#~L�
�f�<��PG�V'����q����+2
�`�gq��Vu��F��N'����Qf�5]�F'9p�S�/��U���6p�����m`&`wK:�qdv3��d�����R�E�*�i� �;�����O�����.*���6����(��ru���a��x�����%��Ul�6�"�IP3�GB���3��
i�?U�fk��V��c��&��b�VM=�aY�c�G�r0��[	��<]6����$�u����p[��Q�E�pz���8TJl�
T+�q����J�sLu
��_���`�f~����I�wD�$�.�0na���U����N�`)��B_����J��>�;�k�`q�&|Vn�@�LpXiyx�b
���1�ms�����|S�y����������AZq&��!����D{c�����sWB���w�`*�F�(�b�7����W�;3��vZ��i�S-T��pS�q���<A��8v!�f��������x�e�5A�
��k���s����m����(�4"���Y0
��n�t(�������`��/N% ��6<��`�B(�	H��$4��d0\�������b�bbx0.r��	05�0���mOca6���z���������i.ZX��ae�t���I���0B8$��vq��<������8{�\2@?��������wW������d�K��p����J��b�E!��c�i�c2^�n%`p����|�����'�R)�25 �
\������!�N'.���Dji�WZ{�	��}��j7T��������&�L���v����4�����!\[�����p�Z;f���7��:�0g�nn��/�����0�U����p��M��*�����.I0�HD�W0����XA��K�(���,*0�JS��i}�h����F��O��#��# ����L��\^��r�&��QxH0���"S S9��n��k��d�������ly�{�>�LA(C�<�|L�v�s|��M����S����V�_�68u2Pu�"L~S��kH �;��{6�t.2�Mj���5�j����w��P$�-p��EY������uu�������o�1��v�VE&�����i�5[����N��lG,UJ0�jo}U8Ua��`}�Xb�������/J0��>�  �����VE��|D/0�~Q���.���as�m���i��L��)��]L��9~E,��E�����[�X�+{��LS�h�Mg3���R���L���A�V*X�]��������e�R��jj|"k�K�����Vf��f�}��i���8���s+�8E�����.^����
��|
�
\3E��f
/�Z	���3�4��
}U8Ua��`}�Xb������-*F1�����?��$�nG���
"��bO���z�X`,e0��Y���A�$�� @���Q��O��9��gA��=M�j�f�
��
*
�Z����x�Ou�(��4>�����7f�����a����8L�I>JN'�O>^l�L��S?��P_��|�����O�=�;�;
�)�GR�������)e�
Q�/����\	�����C�e/u�p��>F�c�b:w�}L�1z����}�Dx]L��f�O���o�{q5Hj;%��)�s���.l����Mn���Q�$��4�����^�A6�\�K�_A@A@&����?��$	��XDX39A@A@A@A@A@A`F�[*�3
��LA@A@A@A@A@��#0w}]L)AA@A@A@A@A�
�@n^���QgguttpEq����|�L�R�  ��  ��  ��  ��  ��\@����J����6���������H��%�u��;G^�����T�������3���A�I��]��  ��  ��  ��  ��  3�@Nv-Z���32����y��h����l������6��E�2������������{ff�T^1�,�m&�����;j�����f���q�����/�����UU'�������<��8p�FFFF��A�'���x%''S?�����V[�~^��Y��������C����Ig�-o��:����
6����G�	&��~q����g�3������Z�p��qh��w���SWW��j��k�s�~q�9[����Y��|��1��������
�1a�Ly����g�a���g�K�hwyy9����s ���������y�-�,���m��e��1����;�����-��~��<g9�yn�=�a��H�5���.6�my�����&f�3i$[����($�gb�����m����rl��X�(�c����
�d�������G���B?Ec����Y�X8��Q��k(��g�[�����-O?+����X4�7�������_ly������g��Ds����:G�m4�D���c�3�k���g�K�h�I����4i+g��{��G��
{[��>�pl���B{�B}�����g����-�,#V�].7��@%55EU���fJNNQ�SX$'')K���F�����������h```������Y,@����6q�6�N����p��� ���c6>�xz��>���������$g#<���������NcQ$l4/^D;v��S'O�������Gf{�W���� ����232)/7o�>[�Y�WZZ��������
�
J8d�3���c�������F�eF#R�X�����l��}�<g9�p�1�n�:������"�����2��t��TUUEXP�-+#=n�z��k�3��ao�3����PcT����k�i���qBZ<�f�B_<xP��
��hgb!t�._�������c�c�+$��X�z6q�U�cKK��*W���f��s�<���E��&���]�-\�O�6�����f�ao�3���c��'�X^�J���~k�1.6�my����~��ucc���_)eh���5d������ao�������-�,#�mu
���9��}�E{lu���������.a*�S4�(�j��:���m��yv��'���X�R��VW���=SKK�.�y
W��q�;Q������'���b��M��I�#/�v�������7Z�b�9��N_��h�H�'N������9����PcT�
�)++S{�`x��[�.�6�myf�r�scaa!+�'�V	B���� +��yd2��G�%�C��$����3��C�����.����vM���4��w�\�MN�=>��@K ���7��`��p���,��'�_�D+R��7�;��\�@�������kH��iJh32<��--����&Z3aS���I�M���������J�n�3��qaA!AH�0;�@�:o�g�s�3��X����ZU
hy�	�~���w���>[�YF���c���yL�`�w��QABkk��4L�\XT������1/���<g9�}j���*-�G�A���=����a����dyy�j~�����k���g�+��o���ZYc&`�9������g���=���m���9��_.�1����e�ZK����&��6���-o������-�Y�l�cS�}��Qk���&��>�o�6������-o6�s�s�m��sM#��PyB?9�{jEk����Y��.�1����*�������f	S���1Fm���g,��(�f�~�ao���:������(��m��q��&��Pt���P���4F��P4~$�����!_�h��.o�~�[0�F[EB?�pr����-�Y�l����^�qF�.��t�����<�<~m����2b�
��%%�F����6�99���t
2�p�!�,XB�����eZ�����yk�/���
�:���ts�k��8����c���r	�+Sh�|��i+'g~��EXmDg�<�h�U�D[oox�c�-L�`�������7���1��^��]<�E�u[�D(���L���{c�n��;t���*�����-/�2��1rA��/���_�����"�+��R������c��ao�U���j���@����A�55���!�����%V8�]��|a���c�����?����ZB	s&���d�Q�<g�C�����4F��������mm
��V�j���1Fk���%�����������h�Q��m�_,k_x#`�����6P�	A��?5�?��~�9�&~�m����J?���F��z���m�N7�4�(��6������XGLe����lsz��M��h|[;��NG�_����q(�V���@�:�~��s6�B�Q]�*>
�u��8��(��lsm�v��0�*�F2���5�T������x8��3�mp���N��E1���9�c�T8�y����$g�f���-;��G��p,f��'Zu��5�B2�1$8��M\`��|��Ia��E�i>9�f]�i�_��*OkO�>,H`�!!�?f������q�y��g
�L�~A~��h��~,��c�V��L�hK1��]�v���y�=n�g�Q��P�#������_�E��c]��qU�Z�:�oZ���4�
�7W�(���J���&��Z�z�Ne��_.�1
l��q1��
�6E�E�1�~1�k���F��
�
��C�����X����{l 0ob�0�3/s�\���P��h�90�~	5w��+������`
<t
�=�C��U�	m5F�
�)c4T�����lct:���<FC�!���7�p�r�c����:��t1�Q���`�o2���~��o��/�o�u*�S�y%Z�b�3�mc8B���+���n����6Fa�*���L&��� n�	B���Y��������������}���By�%O�N�L���IH��|���U��B�����]4
���I0^a�����Y6'<M���5�x�^��)B�1w���UJ�������)r��'0����1�M��5o����a��u�uk-��5�-��O���D@�����i&����'J�)zX�$��aYKp�
6(�Nf�����," �S������A�K�����&��]�]��9��8^);��S���>yA
���
��L�42�S�K�ZGy>�oK{u���������$$���;b�dfg*�R����3\��:���=�W���� &�d�3����H��}�����sg��~��lyf�1
.T��Pp[{my���x����<7��e��9�;h������3�W8��-O��_��<��X?F�A��B�/4XB����s�<���4���c�8�����-���
{[����>3q��uJPcj�G�����<F������-o��s���.��Q���������e����-�Y�l���k$X���<F��s���n��.�1:Q]�~r������h4�'s\�������-�Y�l����L�O&��102�����/�����ch�����Pj��A�#��l�b�s��{�=�u��<����@y�<�}6�myf�~
�),l���bG��E��F���Y���<v�;��rm����2f������o\5F|>�?w��{�������S��Auv&j���A=p��kux����/�'9�5�un���?Z� 
��p�f*f��\�Z)��
0�vN���t8�r�=�3�I0��d��� �n���������~'��l��_lyf�/�~1���c��}�zF���`u��k����M�6mS=�B4]% �������-���~����/�0��	��d��lyf8�a?�����s�<�L��<��X9�V]�w�&S�=�wh�?����<��p��	�]���<��a�:m���g�#�mu�'����(����eL�>��'��k�YF,O�=	�Y/��h������0�^��~z�������l�������������g����L4�����q���aa�s����-�YN,�G�~�
�N�����2~��A90//_�>4���T2���<�\�8���e����;��2��A�hZ[Zh�-Vrs��o�j�����Oi��
U� ��������+�,���w�r}i���H����1o�����|>�<CI,kf��~Mkk���$����5,P--�c�mL�f�`y�����4�:��9����2p� �Z�'77W+�?����
��H��/h�-����>[�YF����)D�B%[{my��l�������9�/��m��M��uW�r�h2wQ�^�b�@�,P���f�3�n���g������E�9
�9�����h�~.��H�&�<�Op�~q�9��X��~����A
���fC6��������e��1�P!U�W[�y�
{[�Y�m�������y��F��m�������w1�Q[]�~2{<��Pc4Z�S4��m�������6Fg�~�ao����K��b\tvt*zt���q
yf���-�,�����i�:�d�G��PX�p2��c��<g9�|
�),��/��'\�}=~������{����{������2l����2b�xxdXa����J��7illb�z-��kg��
)d1n
y8���m"��|�d�"��5=��M�<uO����'y�WP��I>+���2�����k���y��tM�2�C;:�)3#�V�^MK�.%LXZ��-�{Y*�WA�q��+(.>�9<����"���/WA�1y�O������J�L%[^�9�*����T����H�ba�[^4�eL#b�$;;�RRR���^��%��,��a�b��?L��a/m��Q�!`
�����q�:���h&@S���su�{��|�������+W����8~���n���c���
l��v�Z5?���������O��0��m�����/�����X:v��T\\�x��5	u��M�ba�p�~�%KJJ��e��z��/�
�P��s����h�Q[���#�/==�/^<�iII	�����E���a.��Z^>5�i.�Q��mEc���o�k��2F����6�	��T�h$s��_��XJ�1j��I��6��w�������pl��M?��1jCp��
�;�����-C���>�dm�X����8�k��jG$X���h����X:v��6�*�)Zc��/���Y�`c��G�i$���5��1������Wy�<�������QH�������du���s4/�AVV���py��X�L��"==C��P������e��R�~���{�i*	n����F�?�iq>��9���e����Dr��Z��
j|#3��k��K���3VUy�  ��  ��  ��  ��  �� 0�@�K�h�<����/��������$ ����4�g��aV��������H���A@A@A@A@A@�#7d�l��g�lj��4}W ������\�%���@`�4��W,k��$A@A@A@A@A@A@f	�,�W^+��  ��  ��  ��  ��  �� ���F��  ��  ��  ��  ��  ��  ���kf|y�  ��  ��  ��  ��  ��  "��1 ��  ��  ��  ��  ��  ��," ��Y_^-��  ��  ��  ��  ��  ��kd��  ��  ��  ��  ��  �� 0���f��W��  ��  ��  ��  ��  ��  ���  ��  ��  ��  ��  ��  �""��E�����  ��  ��  ��  ��  ��  ��F��  ��  ��  ��  ��  ��  ���kf|y�  ��  ��  ��  ��  ��  "��1 ��  ��  ��  ��  ��  ��," ��Y_^-��  ��  ��  ��  ��  ��kd��  ��  ��  ��  ��  �� 0���f��W��  ��  ��  ��  ��  ��  ���  ��  ��  ��  ��  ��  �""��E�����  ��  ��  ��  ��  ��  ��F��  ��  ��  ��  ��  ��  ���kf|y�  ��  ��  ��  ��  ��  "��1 ��  ��  ��  ��  ��  ��," ��Y_^-��  ��  ��  ��  ��  ��kd��  ��  ��  ��  ��  �� 0���f��W��  ��  ��  ��  ��  �� ��4���+��IEND�B`�
#79Thomas Munro
thomas.munro@gmail.com
In reply to: Rui DeSousa (#78)
Re: [HACKERS] kqueue

On Thu, Jan 23, 2020 at 9:38 AM Rui DeSousa <rui@crazybean.net> wrote:

On Jan 22, 2020, at 2:19 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

It's certainly possible that to see any benefit you need stress
levels above what I can manage on the small box I've got these
OSes on. Still, it'd be nice if a performance patch could show
some improved performance, before we take any portability risks
for it.

You might need more than one CPU socket, or at least lots more cores
so that you can create enough contention. That was needed to see the
regression caused by commit ac1d794 on Linux[1]/messages/by-id/CAB-SwXZh44_2ybvS5Z67p_CDz=XFn4hNAD=CnMEF+QqkXwFrGg@mail.gmail.com.

Here is two charts comparing a patched and unpatched system.
These systems are very large and have just shy of thousand
connections each with averages of 20 to 30 active queries concurrently
running at times including hundreds if not thousand of queries hitting
the database in rapid succession. The effect is the unpatched system
generates a lot of system load just handling idle connections where as
the patched version is not impacted by idle sessions or sessions that
have already received data.

Thanks. I can reproduce something like this on an Azure 72-vCPU
system, using pgbench -S -c800 -j32. The point of those settings is
to have many backends, but they're all alternating between work and
sleep. That creates a stream of poll() syscalls, and system time goes
through the roof (all CPUs pegged, but it's ~half system). Profiling
the kernel with dtrace, I see the most common stack (by a long way) is
in a poll-related lock, similar to a profile Rui sent me off-list from
his production system. Patched, there is very little system time and
the TPS number goes from 539k to 781k.

[1]: /messages/by-id/CAB-SwXZh44_2ybvS5Z67p_CDz=XFn4hNAD=CnMEF+QqkXwFrGg@mail.gmail.com

#80Thomas Munro
thomas.munro@gmail.com
In reply to: Thomas Munro (#79)
Re: [HACKERS] kqueue

On Sat, Jan 25, 2020 at 11:29 AM Thomas Munro <thomas.munro@gmail.com> wrote:

On Thu, Jan 23, 2020 at 9:38 AM Rui DeSousa <rui@crazybean.net> wrote:

Here is two charts comparing a patched and unpatched system.
These systems are very large and have just shy of thousand
connections each with averages of 20 to 30 active queries concurrently
running at times including hundreds if not thousand of queries hitting
the database in rapid succession. The effect is the unpatched system
generates a lot of system load just handling idle connections where as
the patched version is not impacted by idle sessions or sessions that
have already received data.

Thanks. I can reproduce something like this on an Azure 72-vCPU
system, using pgbench -S -c800 -j32. The point of those settings is
to have many backends, but they're all alternating between work and
sleep. That creates a stream of poll() syscalls, and system time goes
through the roof (all CPUs pegged, but it's ~half system). Profiling
the kernel with dtrace, I see the most common stack (by a long way) is
in a poll-related lock, similar to a profile Rui sent me off-list from
his production system. Patched, there is very little system time and
the TPS number goes from 539k to 781k.

If there are no further objections, I'm planning to commit this sooner
rather than later, so that it gets plenty of air time on developer and
build farm machines. If problems are discovered on a particular
platform, there's a pretty good escape hatch: you can define
WAIT_USE_POLL, and if it turns out to be necessary, we could always do
something in src/template similar to what we do for semaphores.

#81Mark Wong
mark@2ndQuadrant.com
In reply to: Thomas Munro (#79)
2 attachment(s)
Re: [HACKERS] kqueue

On Sat, Jan 25, 2020 at 11:29:11AM +1300, Thomas Munro wrote:

On Thu, Jan 23, 2020 at 9:38 AM Rui DeSousa <rui@crazybean.net> wrote:

On Jan 22, 2020, at 2:19 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

It's certainly possible that to see any benefit you need stress
levels above what I can manage on the small box I've got these
OSes on. Still, it'd be nice if a performance patch could show
some improved performance, before we take any portability risks
for it.

You might need more than one CPU socket, or at least lots more cores
so that you can create enough contention. That was needed to see the
regression caused by commit ac1d794 on Linux[1].

Here is two charts comparing a patched and unpatched system.
These systems are very large and have just shy of thousand
connections each with averages of 20 to 30 active queries concurrently
running at times including hundreds if not thousand of queries hitting
the database in rapid succession. The effect is the unpatched system
generates a lot of system load just handling idle connections where as
the patched version is not impacted by idle sessions or sessions that
have already received data.

Thanks. I can reproduce something like this on an Azure 72-vCPU
system, using pgbench -S -c800 -j32. The point of those settings is
to have many backends, but they're all alternating between work and
sleep. That creates a stream of poll() syscalls, and system time goes
through the roof (all CPUs pegged, but it's ~half system). Profiling
the kernel with dtrace, I see the most common stack (by a long way) is
in a poll-related lock, similar to a profile Rui sent me off-list from
his production system. Patched, there is very little system time and
the TPS number goes from 539k to 781k.

[1] /messages/by-id/CAB-SwXZh44_2ybvS5Z67p_CDz=XFn4hNAD=CnMEF+QqkXwFrGg@mail.gmail.com

Just to add some data...

I tried the kqueue v14 patch on a AWS EC2 m5a.24xlarge (96 vCPU) with
FreeBSD 12.1, driving from a m5.8xlarge (32 vCPU) CentOS 7 system.

I also use pgbench with a scale factor of 1000, with -S -c800 -j32.

Comparing pg 12.1 vs 13-devel (30012a04):

* TPS increased from ~93,000 to ~140,000, ~ 32% increase
* system time dropped from ~ 78% to ~ 70%, ~ 8% decrease
* user time increased from ~16% to ~ 23%, ~7% increase

I don't have any profile data, but I've attached a couple chart showing
the processor utilization over a 15 minute interval from the database
system.

Regards,
Mark
--
Mark Wong
2ndQuadrant - PostgreSQL Solutions for the Enterprise
https://www.2ndQuadrant.com/

Attachments:

collectd-cpu-pg12.pngimage/pngDownload
�PNG


IHDR �J"�/bKGD������� IDATx���y|T������-��v�&""��z]��j��[��R{o�V�x-���Z��(Uk��j{[�^��**�\E�jX����e���v~L2! 9�3q^���s&���7�|�=���i
�q�]�W

��h�,F�`1,��`X��b4X���
��h�,F�`1,��`X��b4X���
��h�,F�`1,��`X�@k���o1�v����������.+�7��K.i���/�4��W_=��]�t�?~���������	8�oM.\h���������]W�Z�h��3"�,Xp��W�x�-<���ew�]vv����_^s�5�
z��'������-:�N�0:��S��:KKK���O���}�m��:f������#F���+�eaa���'O����QUU���0{��>}�x<�~���{���`0r�@ 0{���={fee�;��?�l�s�����_ZZ�����z�����������������7����k}{+GoV�)=��'��7���ok��u�����n?x��q���I����_}qqqzz��!C.\x�C����w����O�}����w����<y����O��H,�l��������������Yg���{�egg��?x���y���?������.\����{��G?Z�x�c�=��{�
<���/��c�����,x��>���Y�f��5�����T[[;y���O?}��U�W�9r�W\QQQo��V����Sz�K�.3f���S���G�q��nn�a�����/�0++K����?����_~y��
��{��Y��,Y��!ZyPn�{���z���}��u���Y�����C�(&���o~s����&{�����;%���+�;�����s���>x�������������5+++���������,Z�(������k�}���#����D����o2d�i�������{�E��+V��������������c����7���_�>���;o�����EEE���������3g���l��-���}�����;f����o�'|P_|qt�M7��1�`�`8���������������g���oG�p�9�D����u������n��e��
~�?zO������^z��������_|q�[&N���z:4t��a��}�;�y�����Y�t:'L����o{+GoVg�Y�l��E�.\8`�����N�>=???r����������p�u�YgEw���Gf����	2��&��m;x��-��{����������/�����#��222�
���.�,��
7� ���iii����u�]�����3�����?�#)��V����f�Ng h����^���9���u���o���k���n`}}�7�������>�(��9v���9��j�i�m.���-B'���q��g��=���$�N�D�g���$:t��oy����-<�L���g?���~��zy��i���~��#G�lq{+Go��=z|��G�6n��YR���O�����[n1�W��Ut��
�m��������N�l��o_��h��`/f�Xf���.�+����>���������9��vG�/O�0��_9rdZZZyy�iM����v�����}���K�F�?d��g�}��r�[�.��V��z��_~��]��z����P(�������o��Q���49��/���������}>�������|����[c�=�m~P����x��?����CG��b����{����r�\�����O������{�g<���k�����ssso�������K�.��{��;n���~��-]�t��]�^{������'Kz���%�w�y���r�����m���k���3���������Y����%z������k��]��O�>'�!�(���o0 �X�O�>#G����|��'����n�����O�4i��M������{��h��`3[��Hv��"l��z����{�_F.���gO��5`�������p8������;����{FF�\����G�����'}��u���z��9s�����z���F�������{�����oo����l�����{�<xpZZZ�.]���o�^�:�o��FQQQQQ�[o�u��"��	k���?6M���_0`@FF��	����e������3��C����5k���[���a���b
��h�,F�`1,��`X��b4X���
��h�,F�`1,��`X��b4XK�+
�w�}����o���'�4hPzz��a�^|����`#������_��_8�t:��z���g��������.X�|��3
'M���.{�i�[���>�z�����7]�ty���n������}�N�2e���/�N��s��U�V���^��"�:u�+������l��M�v��}�UWE�L�<y������������������w��7o�,i����-%%%�in����]	.���o�����������]YY������8�/r�.�+
�]HR��JO����@RUUU^^^dKd�������>��x��B!������R`{�P��$C
��5�^@2�`{�P��$C
��5�a���{�p�����^ot���u:��neW��	�L�6X4h��%K�[^{�����ggg����J�a�)�5k�D.���l��b�
I��~zz���so����7n�����-{��w#�����u����]��A� �$�$B�D���!������_�zu����o�����g�y��G��g��!C|�����:z�Vv������D�A!H"I� �$% �T��g�A!H"I� �$�$B����w
,w�-��]��A� �$�$B�D��*M+�9��,�dG�`1�RZZjw	�#�$B�D�A!$F��Lb
��5X���b4X)����]��A� �$�$B�D�A��B����.�~� B�D�A!H"��H���,r��� ��`X�+�p)9�$B�D�A!H"��H��I���� ��`X�+�x�^�K�!�$�$B�D�!1h�RHqq��%��D�A!H"I������E� �$;,��`�.%'B�D�A!H"I����2�5X �`$;,��`����$�$B�D�A!$F��Lb
��5X���b4X)����]��A� �$�$B�D�A��B����.�~� B�D�A!H"��H���,r��� ��`X�+�p)9�$B�D�A!H"��H��I���� ��`X�+�x�^�K�!�$�$B�D�!1h�RHqq��%��D�A!H"I������E� �$;,��`�.%'B�D�A!H"I����2�5X �`$;,��`����$�$B�D�A!$F��Lb
��5X���b4X)����]��A� �$�$B�D�A��B����.�~� B�D�A!H"��H���,r���"�#G��{��%%%���C�}���C�Pt�O<1h�����a������6�	�ew����[�|�������N[�z��7�X[[��Hz���g��������.X�|��3
'M�dw�I|�0�����3g��9�-7�p��~�i�&I}���2e��"��N��s��U�V��S��JKK��cw6#�$B�D�A!HJ�S����r�cKKK�<�M�6����������<y�������m(����#B�D�A!H"I��I�`}�{�{��g?��sIk��}��Wo��fI�7o�4p����KJJL���e�]�D%o�%i����{����].�����M�v�]wI��������g�veee+�-�7o^��`�z�����{���y��w1#0#0#0B��0o���Y-�W&�y������{��a���]�v��Yw�y��w�������������������O?1b�_����/����X�%���2��*lF"I� �$�$B���>!y�p��]�=��K/��/��/��<��������k��������
Vd�*���]��A� �$�$B�D�����l���
�2h�������w:TR�T���u:������#''���G"I� �$�$BH��m����'��/��n�z��a���w����
Z�dIt�k��6~����l
8V��"8p�e�]v�=����
6l��
=�����#]���so����7n�����-{��w�.@J�,I������[o����O�={�M7��h���������'���/9~��?��������	��6���2E�"�$B�D�A!$F��n�E�I�+�tR4X��J!�e!H"I� �$�$BH�TY��,k��
��h�RH�OY� B�D�A!H"����J!eeev�`?B!H"I� �$Bb���o��xX���h�,F��B���A!H"I� �$Bb���$�`�xX���h�,F��B�^��%��D�A!H"I��4X)������G"I� �$�$BH�TY��"w����������������*��r���lw���|��X�'�J�A��3T8�w������_�wW�@O�����]yC?	�$ph�3�[��r��.m�s�.� ��=�#�\yCw����4XmD�����������{��k��#<�/����6�����
�`����O�J?	T�wf��Nn�G��@����/����X�����sf}[
w�+�4W�W�`g�PW�PW�9�vW�SC��F4X�JKK��cw6#����W������^��;-��%�nc���o��j�
V}8T8X8T�X����.��_�1�3���V<D�NB8�X���������p{���t��>�]4Z2$������U��|���m���B�m�����gv�+�tW�pWN�3g@��I�g�h����
������a��`��]p���8O�%���g�u�	�7������X�u�`m��Z��"3U�����K<��z��wf�?�!��P��H���<T�-������)�4[�]W���'�6��B�)��_�A<X����\O�%�nc�]�5�� �����sf�;�ouX@K�?u���^�������Vh�!�!���,W���`����i��9%��W�i2������h���Bu{#�T�+���]��t���w�(v_�%V{����C�!�6gN���8O����1��a�W����������y�nc#O�;�����
��*?V~��9���;�U0��]��)q��tL=����h��YvI)B����l��J��������"J��@M���������=����[	���0���r!��`������}3T��rvy`��Q���z^�,K7��p��H��m�lTlT���)9:��?��w������)�Lh	
Vu�+��c8��r��LI�3-�[Z����Js�
w�$�p���}3�3��I�54��6�Q8p�v��k8�w���J�SZf(px����}��?���)�t�����I>aE�`i��'��A��jw�1M�����{�+��H3�`�����S�!vK8P-3t����cGi�,ma�@������#�%��.��3#v����6b�2<y����S�AvBf�!p���_�;��3���m���E����9���d���6�6��7����/C5;���D�~
8�����)`N��������1��+�9�������`������R'+i����6X��/}k(�(��f���K2CG�x���d��`�$��f�V�i�@�$NG�-g���p�<En5��O�1�pH2�y�&�4~n:V�����3�SL-���`��'��R1�X�z����9������Sh:�}Z��*3�`j���!�;�pe������t������rw��L7�y��6�'_�t����������h��S�M��p��c�������������}������_�+2��������m�|k�O������'/��9�i��@���=���d�2�L��r�'V��-�=���-��2�������}����:3��3�5f�k��W�G�<���,���$�t���H+px
��H+0<17�
m�U�_]�8������XO���nc��:����5;B�^3X��F��#[��If�gK3�<i����$��+�k�w����O�����n|c���i�2��������x��`�Q�k�B��k�=P���Yg��v[�����O�������V8��m�����M�13p���$������c�s#��l�s��t��p���-�|F����+j��U�Y����5����,Xcj�P���|���
���#a�B
��;���n4k��:0�'/���o8�B5;��8��+w���xO�	���iEvg��@:�a8S�����~xKf�.���+�����"�Pa�cn4T����Br45[O���:��tc���������?���.:;2M��zA�7(�*3Pm�!E~Z�s��uw9'����f4Xm���p����?;����C��u�l������I����H��`�n0*�P�:b���p��	|
5��f�N��pC��wf��� ��O�$���:$�H���Y��������Xi�=]/��:�EcN�|1����	'wn���~���/��0���>ud��v���2^BI���4��\���!t<BP��`�2��Le�:�;�����[�uc�rf��t���m\���p�k�e<y&������S��`����M��l�YZ����3{��@R3C
��K���`�+���|���nWNI�����g�]ttWHr4Xvj�������33���.X�k%����Co������3�-��a�tW���p�$G"I� �$�$BH��^�d��Y����[����g�yO����{ ���4�Q24X��M��?	���~g��cI�E��R�vO������$k���/��W��l �O%V���������,GZA�k6e���+��k���!�$�$B�D�!1��J3X[��S��-H�{u�omL��W\l
�#�$B�D�A!$��+�:FG��2��#[����t�3����As\�6��Jn�\5�
�
@j���L�UC]Y\5��"ws��+?H���K��$�$B�D�A!$k��������F������j�i�n8<:����UC@�8�u
����m�Yv�$B�D�A!H"����Ii�j���}��5/�
��)B��|����i=�����;��]Hv�`�X��z�p�
���$�$,��b
���G~5�+��gw	�#�$B�D�A!$F�N��������O***��}[�li_a�^YYYNN��U��D�A!H"I�������+��_�W���7�������0�u�{�Kr]h4''g���%%%� 4X ��Z������G�Ji��u�&L������g�Y�f����'�xb��A�����
{��Z��kW�5c����[TIv��u�����o����<��/�����$������={���3W�X1m��3f���������K��$�$B�D�A!$F�&��|��_��%%%g�uVF�1�4�?~�k���3W�\�n�:�0$-_����_y������;e��D�9u���;w�Z�*�P�"�$��������w������F����G?��]w��l��M�N;�����o'N�ly�������VVV����8
�'�����~��8���������K�i�����[iii���w~��������7K8p`��%%%�in��e����+	�dXp�Q��������G_|�E�"����q IDATv*//�4o��Q�F-[�����~������+���JR�dU�vee�UG�J�z�v�`?B!H"I� �$Bb���
w�qGaa����/����O?�K�.>��%�l�@@�UW]u��w�}����v��������G�����y���.��z�����{����>;������`������`��:��h�����Q�s�f�	��Q�s���:��h�-�'t�Gq�#��7��~@Vk��{�������������>|x����?���y��_8u�v�������{���o�ly��7&M���z7o�<i���;w���7�k���]t��5kF���h���$���^z���������[��_�e������o���w��������P($)--m�����^o���z�N�s����<(@�����}��?��f'N��{����t:/���?��O�-+V����������
�d�����^{m�������?.@;�������'�|�l��5k�u���a���������t�M|����?�h�������pH�;w���>�`����W��3g��e���%�
�Rr"I� �$�$B�D���3��g����={��q��TTT|��?��-����������z��{�����>�����7�<w��H�%��g�y��G���3d��|����ne�`�x��B�


?��~���FVGIr��7�p��O>��x,��4X ��j�":�~����������:�������E����O��B�EEE_|������}�k��]!���"I� �$�$B�D���~m���W^ye�r��s�}���0�1��I�S�]�tY�`�����t��>l_a���$��F������G��t:��]�f��tN�Z�5j�����fw��5m������SM)�D�A!H"I��m�S93f������������M�d�*i�������]��A� �$�$B�D���3����/?������3��:�K+((��x�WXT�5X��I�E�Q'N\�ti^^��%
�'����b��������}�����j��XK�,y���>��4�/��r�����*--3f��U��D�A!H"I����[�p��Y�F�YZZ:v��}��m��u��I?���.��R��l?N�x����'�|�7���'�|"i���[�lY�r�������gEy�O{������7<�0�`0���o���������if�@<I7������I���[�n�l9r�����[���z�.�~� B�D�A!H"��ho�u�%��|����������_�z���>�������%��B���v�`?B!H"I� �$Bb�wB���|����/���7������K���\�x��)S,*��"�$��F������a���9rd�.]��4X ��k�jjj����������q�����(
�'�����\t�E�3�Q�w�>��s�92,WZZjw	�#�$B�D�A!$F{�5�0���kjj.\8c����-[�<8�f����$�����z�����
7���o;�sR�
VFF�SO=���o~���#F�x��w�?&@�eA�q���o�������������c���g�E�A!H"I� ���5X�7o4hPt�/�p����|��Z��,O�]���������13a;v������N�����D��I������X�'���m������+G�=��x������Z�������]��A� �$�$B�D���������������x���J6eee��A� �$�$B�D��*'�8E�I�� V��`��>�"���b]�t9�}<����S��JKK��cw6#�$B�D�A!H�2
mF��a
@��:Xk��L�>���X��J6^�w��!vWa3B!H"I� �$�����{�yZ�|��#�Ng��k��ioi�Zqq��%��D�A!H"I������(//o6��f���.�����}�Y�,O��`I�1cF��m������n�&�W ����:��s?��cI�7ov���w��?�p{K���;!6q���K����YUP�p�P\JN!H"I� �$�$B���F����,k�^}���7z<���{�5�0��U����_k������3�<s�e���*�1��I�?��EK��]���/���s������-��(--����A!H"I� ���y�P(t��/Y������,O��`���t�t�M~���#t
�7X��u����12@�KH�UZZ��_�D�����!H"I� �$�$BH��7�|s��S�N�|d�SYY��%��D�A!H"I��m\�u�%��1���c��]���{��w����]�eX��I�+��7���N��G��_~���_�������,
V�C����i@��Rr"I� �$�$B�D��9�u�92|�p���g����'�x��'���g�����s����23X ����7o����c�<����g��9s��+�M�6c���_���bu�y��7�w�y��M{��7�3X}���2e��"_N�:u����V��73X �$��2M��7��5k����g���l�2������r����:|����M�6��������n�<y�������-9�W�������A!H"I� �����{��������O��������s�%#?��3����7o^����7K8p`tKII�i�[�l���_U���v�`?B!H"I� �$Bb���jv�������|��SO=5��E�m������}��+++�3g��E�233c�WUUI����n�����le4�%������	���bw����|��~g!''��l!''��l!Bg�!��:��h���:��h���'t�G��Z|O�t��$G�7o^������3�����������g����_~��������M7���)�)S�����/Kz���}�������w�]w]eee^^^���~���#����^|��-�,��}B���|���3g����-����}�����.���G��~������7�x����g�}v����IUUU�+2w�`�6�"3f��U�n���k���������#������o?���o����������vV��+�TVV�����r�\�Y�f���p�\.:t�����z�N�s����<�W��!H"I� �$�$BH��N�>|x��9/����y�f���t:�����GEEE���^zi�����//...**<x�e�]��SOE�N�4���#���n��8E�I�S�Q����<���7�=c8v�XK*���W�^��_�����r�q��/���{��70`��qK�.]�lY+�@Gj{��k����zk��}N��W�^����.]z��W_y��?�p�n�,��x�_}mm�#�<2g��!C�����&LH�NR�`-Z�h��������_~�~��_����x<_~�ezz��a��'��r�����!BI��o��u������7^}����+���"I� �$�$B�D���3��F�Z�bE���$}��g�&M��c��O>�d����W�����c
�'��TN�rQ�kbI:���?���v��i�q
�=��s�g����B���������G�����t
m���|�����}�G�^������fmq��������A� �$�$B�D���2
999���(:RYY/!B!H"I� �$Bb���3X �$Z���`X�+�p)9�$B�D�A!H"��H��I���� ��`X�+�x�^�K�!�$�$B�D�!1h�RHqq��%��D�A!H"I������E� �$;,��`�.%'B�D�A!H"I����2�5X �`$;,��`����$�$B�D�A!$F��Lb
��5X���b4X)����]��A� �$�$B�D�A��B����.�~� B�D�A!H"��H���,r��� ��`X�+�p)9�$B�D�A!H"��H��I���� ��`X�+�x�^�K�!�$�$B�D�!1h�RHqq��%��D�A!H"I������E� ���y��7W��
�i�`��/���^1�8)4X'���������]H{q)9�$B�D�A!H"��H��I�<������e�����{e�YXH�������[�����gw!���:Ys�����}Kv}jw! ��`��4�����u��V���]Kq�]� �$�$B�D�!1X�ujn�������k�?H����#�\���������B@���:5y��������\
�]HR4X����g�����
��]�)��|v�`?B!H"I� �$Bb��.�SZt�5g-���g��aw-����,''��*lF"I� )�B0������j\
0�����#R�q�������1�,��m8r#�
�N�lD��"��7�?j�q��|Z����c�V�����2�����~�^f���8�6����
���?d�Gd{&��FZ�.�};sFV�}���%��-M{2d��n��p7��}���p��K:���d���j��3h��_,
�����L���~l����~��o3�iF���c8
g���o8���Yh8
�|���02�}�I#d����*3\m��Z|��$l�[~�[�0��w�##�wzdx�����'_�i�4K�4�G�]�m��)�$l�L����t����b^�<����K��IaI2C��x�H�FaY2"oG_��#�)��o���p�i���3�32�l����oe��������l���4�d������G9�]�o������i�N,��lX�l�i��z?Y���n�Z;n+���;��ii������p��FGl�s�w8��=����h��9�������1�[L7��w�hcq��k�
1
b�~�i���_)��+����	�0G[�8�al��5�M����9�vK1=�i��p�:W��C�p�:l���Uf��2���i���|�(h���.�Yg�*�p��nl���2�_���3�g���;���c�Di�e������7@�{���lN�ad7{!������$lt�3��n�Nz*�Up�������dGf������G3h�>3\���Yc�}1���l�m1�X��8����	;���o�O�@�Nf���=h�G�o�f�V
76��?k��v�(��6�	���I������w�j8��>����c�F{����<�pv��9��`����I�TU~��J�q{��|kG��4�p�:W��C�P�1_�+�m8��|�m�b'�
����4�9U��J3\E�J3\W��*C��g8�
G���k8r
G���7�G^��2��*X�4�Z�����m����&�h��n������&�^f�������h�}jj_�_�adD|2Y������p��2[������#C��w�1����B?
����`Izp�;��w�~�M������c����
��xf������Cwij������a�*����mt8
Z�s�6�Si�����Z����f������E�'���p�5�P�������K�gB!��C0�-L��
���+mj��e��o��,]�b�$�3A4Xm����^����.������4���P�:W�0f�F��5Y�
St��Y3�g8���|�V�
���_��W�w�����M7�4k�,��q��O<���O���g��s������[*A
������yw��W�.�Xp�Hjf�4��S[|
�/���~����{�������-[���~��{�y���"��~����g��9s����M�1c����nK��u�{M��?��-G:��29tWpB�;����f������4�������n����}���2e��"��N��s��U�V�-q3X�j��K���S.�98A�����2d��U��D�A!H"I� )�f�Gii�����[���S^^.i��M�w�������&O��z����j
��\�E�_��U�	�ta��Q\\lw	�#�$B�D�A!$FR7X�
*((�|�y��q��I��y���F�\RRb���-[l)U��O]���u��U���B�"I� �$�$B�D���
V3��s���[���~IUUU�rss�{#�+++�*O�S�_�x��k���@2�
��w��p��?��C�m� FK���Y���zc��e����>����6��%=��c�����]QU���_#0#0#0#�2��y�Z�d��]�������������t�%�D6����&M��sg��}#[V�\y�E�Y�f��Q-���E�Q����z���C<|B���\JN� �$�$B�D�AR�]K���3���?�����G��n��u��A��y��h���/�r�-�����-����i�$��9|��~4�����8h��-BI������/,[�,���4p��A�-Y�$����^?~|���#��.�u���}�����\@������;r�����{�UW����X�"���/�x<s�����0n���K�.[���w����c�>����_������>�
@jJ�S����kqAUYYY�=$=��3�<���={����^}�����a�#��{���m���n��O�Eq�]� �$�$B�D�AR
���J7X�f��}G|/����<(h��Z���=0��Uv�e��v:
V�d�����r�GKj
v�:
V}�x��%s��ew!�b����A� �$�$B�D�A��X�8���m��;�.D�����.�~� B�D�A!H"��`�{��~���6�[�����-�������N�����~�v:
VGx��k~���}Q���B@G���}���y������?'����,B!H"I� �$Bb����M��7�0�����gc�x����������S��?����$
V�QP��������]H,�����|Z�o��Om9������I�D�A!H"I��4X*��z��ko]����#�����?h�!�$B�D�A!$��m��_u�E\cw!@b��W�#�L����W��nw! !h�l��N��o�����������`���~#N�����w;��\JN� �$�$B�D�!1�heRB%�����������+�mx~�k �����83��Q��������`%,;}����\�g�\ew!�J4Xv2d<}���{gwme���"I� �$�$B�D��t+�$	�`E���w>*����7�])�5X_A�����uU/o_ow!�4X�s9�^��;�������,G�������~g����	=���K���!�$�$B�D�!1h���������-��nN�!���7xgA"I� �$�$BH��]�m�d^����/g~�����3����R������}�y]��_���B@��`%�'����[>Ys�v��+�tI����+nZ��`�������D�A!H"I� ���L�D�X��Oo����C<|����X��~5��m��V�!�mA����g�y��[>x�T��uQ4XI���'T��_����1�^���uR� B�D�A!H"����JR.��Wc����/��5V�Y\\l�P�!�$��N��P��q:uV!�D�LK���s-r��������~i�w�.�W���
�k�
�@C�vm�_���4�����
�AM�!z�6���Is�r�i#z�Q�cDA������{d��v?&tV��	���h�N�`�g.y�������iv���5��u��$_�!�M�*P/�><H����p�4����������*���i��/� �H�i{�H�4����u�@C((���4����!�]��v=-�����C�����3d�����"Ox_��6�P�W��k�
�m�_�?i�j����#���&�P�o��e� IDAT��4������,�'����I�ry�\�<Oz�;-r;����t� -#���v�e�=�Ieu�+�m����b��e_T���wfa�=���1��gIN����a�@8T���4�w������,G��F�����|���}���o��v�E�������j}�K�~NK�6~$K���En�C�����/�4���9��D6F?�%U������UCl=�A�?j�`Sf����U
D��VTk8n�3��_(���:�w��@C 2�J�I�3�����in����=�����[R�;�i8����I���t�;]��<�p�w��L�;������0d����x���q8%�eJ:T_��.����������[U~��nH^�H�uZ��H
�]Y]�����}�c����2W�k�4�+��������u���-q�ur�i.G�62]�4��$�9�5{���?n�U�Yu�W�/�Ph��=��z�,�'������vy���lWZ�'#���r{r�iy����x��Y0�\]��b�����e+��9=�����#
��(�1��g��,k��Bf�u�;|�w��QS����������C����V�����^G������k�'W�> ��J2��j���`I�a�_��>��;]Mo��iI��i�|TK*�dFnx��#��]�tQ�}�pHrF^�{}��_R�'�iXgt��,���l�1d�{N����tg�h&?���4Nv�`�����n����:+vKd��$��\��1��j
������MU6U�{�����Nw�Wc���$�0�Sfii��1c�-;Vu�~���6���5���S��9�����9���Fn������e�B�Na6
��-�U4�T�L��>���T]��n�3�En�3����}���H�_|���a����CF��^�9��,WZ����>�����lCE���6���tE�'�((QP|z~����O����`8���rGM�����^�wxgm������Y��d��.��]�++�e8=g����'��q�;���G�c?R

Vu�+�'|����Uo�:��.�V������|Ome����y��6�r
��Z����U5��;k+"�S�����ph@vaIcu������r{j�"�����O+�y���eD��=�v�9�@8���rgME���^sxG���5�����g��)��]�?� �K��.�����J��KN4Xm��,��"o��|�?���y��m�C�|���U��
��Q�SX�Stz~���=��Y�M���6���Q�7��U���+�),�����[�ST�S��XF[��]��U�/=������U��S[58�������8=���]�t��i�Q"���u�eG�c_�j+r\i�B�FqfNINQFK���P4XmD���dk�{�g�>������m8"�.�7��������� I�#{����|����U<g�������Y���Du�~s���*����y������������t�=<�G�F����i���[WU���3#�WD2��j#,%��[�Z
�����2�|�������T��E�-����][],e�����],�?�0��q�L!H:�v���b���}��X�o�������o)�{2v�VF��m�9|���wf^��R�s|=3sO~E�-x&���h��6�#k��������d��.�S4 �0IV��}^�������*��5����]�33��Bt^4XmD����OH�IK���+��|>�K�!�$�$B�D�!1h�RHYY��%��D�A!H"I����2�5X �`$;,��`����R�K�!�$�$B�D�!1Reek�@<��B���7���G"I� �$�$BH�T��aK� �$�$B�D�A!Hb+�O<1h�����a������v����6XO?�����g���b��i����1���_��(��6X?���n���;�����������L�2�|��:Nr�$�$B�D�A!H�*��)O�n�����N����6q������{���y����$\�Q��T����m�����L��9������*���
�)�>�u�k}�jmubeZ�*����HY��Q�����I�����!�~�:9����=���'�7�w��3G��yzzv�#��3��`5p/�j�^�=���{��{�P�����C
��������BCCMkBBBc������?9�~���F"2�X%,�t�.~J"����nq��{�P�����C
����`5p/�j�^���`E�����_�������gFjml��G4�����������z����%���������K�.�#�L!��,WJ$���u�R���3�I��v� ��z��%��&#k���1�����y
L��������{��A�g�3�]��NJ]$.������y�O��*������������5��+a=�d
�L��?�D����z[���S`,��Wv��&"�VkZ��je2�F��W����+444,,��>0�9p�@ll���;����#B"Z�z�������q��<x���#���]Q/�K�u��������*<<�/�KBB���zu�`�z�=X�
��9W�u����W���{�w!bkjj:������?^QQ��	t�����o��]7EEE�n��]7z��������ht�	];���g�9*2e0^}����p�F����[�n�B� "�D2��{����Q~��/~�����d'N<y�$���`0������0s����J�����|tK&�]�|�w"imm���8|�0c���+W�tss�oo������6�5�FF������[�i�Vnnn~~�s�=�P(��������������j��_�a���k��.��v��9��3f����!!!�ol�j��0a���~�i�e�V~~��U������GFF�����i��U```�����&O�,��������(�edd���c���D����e��?��O���kkk+--}��W����z�j�e�F��HD�����!�F��;�����#������������J����_{����fffFDD�Y�&;;[X���iii���G��8������ryJJ�?&�J322�e�5�\��}w��-,l���|kAAA`` ��D���a`d�a`eTt�����_�.,�F�Lv��%�����R��2����9s����}��B��.�J���~j�&--�������9�8�knn^�r�R�LOOonn6�w�����N�:%,����;w�|kYY�3�F�FQFE����o����]��]�������������k����T�xO�>�������.��=k�&77711q�������U��T*UNN��3g����~��a�q0f���[�2��h��)'N�0��}�������LD	#a`gT�J�f�V�\����5'''$$$99�����������w����/_��F���q�������KKK���t:�N����/�=���*���l���F���a�B�����}��i��`X�h�R�LJJr�������7�|���+))������`���{yy=��c999o����RSS�z�������h��?��w�6���a`d�a`4c�Q�alnn�?�Z�V�T��
��+���_�������x�(����o���k�.����`0�Z��������bSIII����g1����>}����D"q��1V[[�x�b��4J���������yW'��-�bTt���1������uuu���AAA���|YeeeUUUcc#���<��0R����IKKKee��Q��T���C��{��u��	��S�}�vCC�^������d�+FF��;*:x��^QQ��Y�|}}y����7kkk
�����n!"BD��!455UWW�t:"����h4�����B�aV���8�M'/�����qw��MNN��T*MII����B`�1�c��h�!�'��
V�N�������F�#���R����t�Z���{�����,77��7��N$�!�B`�!�c%%%R�499y��]�N��|���������o�/��>���5�B!�m�0�"k7�4�����0;;{���B`�1�c�1��FcA��������`�R�L-2�N�:�R�8�%.��c!0�c�2��(	8�D��Y����������7n����� BD���YC�D��DI�����h4n��u��US�L),,0`��F���.1H$���z*,,���]�V�={���F�����+����G���{7�2m!B "�@D���
����,Y����644T�)�Z�����m��M�6-Z��w����H��W�z��Yq��iqqqQQQaaa���*����[�������������P�!�B`�!�`�Q�l���_�2��3+
�F�0��V�4h���+��8@��!�s���F	!�2�j�D��7�������~�bebb�\.�R�!"BD��!B�e����>���w�^ll��w*���j4���'��Jd�!"BD��!B�e�����#�������w�!BD��!B "����o���w�!�$��
��3g���yW�B �@D��9Mmmm�������5k�V�5�z�����^��!����6X�����322BCC���.^�����.JlA���6n������j�*�!B "�@D��m��}��u���D���������x��!'��[�DH�aor�J�2�L&�u��h4��zG}�&�!"BD���H�R9r$66��&==������QQQ'N��0aBp�DH�a?"����h47o����O>��w�b@��!B "�@DD���g��5_������8u�T�k�B#����}2qqq��O�pkii��w��c!0�c!0���a�B�����}��i��`X�h�R�LJJB��	8r����yyy����o*//;v��%�!0��C�1��C��U�VyzzVWW[l*))���KabB"$���`t�`0H�R�������TVVZ�����Mp�{���Y�!B "�@D���,�\���U"��d}���.�Mp���B "�@D��!"BD�0�hO`5BD��!B "�@D���8	��.���h����e�^������z��Qa����B`�1�c�1�c�1�DI�aT*��~������4���r��=!0�c!0�c!0�c!����~D�Y�!B "�@D��!"B�h�'0�C�1��C�1��C�1��C�h�'0�C�1��C�1��C�1��C�h��0�!"BD��!B "�@D��	8x� >����4XV����`X,+C�`eh��
�����24XV����`X,+C�`eh��
�����24X����=[���[�����[��w��\$�1�5���+W���kay���#F�HOO:���cQQQ�
��JXX��q������.�>"g����aaajj���W�>}233o������V��s�Na7���z���� �B��h6o���|���`�qqqy��7bcc�����_~y��
���o^z���7o��1c��E:����/_^PP�v��/��b��+V�x���x��	,p.��
KNNvss[�`EEEM�4I�T��7������������x������h4�-�3gN~~>���7A��e��a����w��:��������'N4������Z��[�D/z+9�D�����C�XSSM�:U"�+�F#}��w���b�	�,����"���wGDD���T�>h�~d���
����a��!�����T�P(��,����\�p��5k���bbbjkk�-[t��A��@����������������_?����<���
x�	fr�2L�`eh��
��������g-���K#F��v70AJ�!�bGh��(((����]����a��������}9����g�=�I�4�1w�\�%8��fyy�C=��`��d�/K�x�P���*p��3�N�'�ho�+X|�xQ__�T*������������W)
�F�y�f�j�{�a���o�������������i����["?~��;JJJ$����O�>EEE��MS*����������M;��=z���������������V����xi�rq�q��/�^�OOO����Z���/y��ia=N��UVV������1n���'OQll��)S�w{��g����������aaajj���W�>}233o������V��s�Nq����b����R����(*�����������<i�����;v���+�����o���%KT*��;�Z��-[\]]�m���z;c�R������������kjjRSSc:�.:::99����`0t���DD��/�|��i�^o�P�V����^z������r�>}������������~��%&&�iQ�q�q��_���������;����;w�������N��t��]OO�^x�����x�R�n��]RR"�Jo��a�M�Tn�������(�}��������;���c���[�b�R���������:�:;���S�b�����G����q�_����M�&M�DD�6m:|�p�����322��4Myyy~~~JJJO�y�wg�~g���1k��zT�


]�d	�������={������r�B�����:L�\���f��a���d��!.$�����K����+����/���fU|���'Vx�=�f����)��g:<���o���o<��sD�m���w�VUU�������]m�{U��z3?�t�:)\���kjj���f��5t�P"*,,�1c�B�HJJZ�t���{�������C�������W�T?�|$�a��%''����������r��y���c�����;��^X+F.�s��cT�����P�j��7�<���z��c���5�+@����k��(22Rx(�Jcbb�\�b����[[['N�hZ3~����~���[����=yL����Q�F��������{��
s��1��[<�BLL�iy�������������"{ksc�=��.]jmm5GWW���{��N�<�3N��pn�
w�:t���3_|��)S�DFF���	�f���k�.��:p�@BB���W��t{>6LX������N���Z�QY������h��R�����\�67��`qv��"���2�1_6ijj"��S���`���D��w</P�'�Ri����2�n����1���a<<<L�*�������p�������}X�F8��B�(++�={�������
�o�>aSJJ��K�.]�t�����Iv��I�G����|���7�Ng�aU'�+X���j���pg�����{wDD�����`��z��������?4�v"�����=)�Bh|��Y8�~__�����_�^�������5k��a#G�����������1c|||�O������8
v��������!\��l���DTQQ!<4�N�j����#
ECC�����>��#
�B�r{9�?�=	���[������?��3�M
�"44������#G�������h4����������~�����������b�\n:RRR�}�������3G*�v���G�����(b�p������|���aaa�<�Haa��p��������Y���S[[�l���� ��:t���������b��?;���G����K�,Q��w��1�����k��y����������O�.l5�.nu����;wnnn���G�Q\\|���'�x������KLL����6m��� "�=�3g�LKK����z�j��[�|�l�����T��`��w���C�>��3������S)3UIDAT�g�����w{���/^���>{��q�����G�j{��K������W�:���3??���w��A���2�����7��))):�n�����O�8q�i&����{��l��9%%%##��'����/>��#��"N��WRR�g���������>�����C��zyyM�0a���aaa��o��l����������\X�����e�^y��������m�����w�k�W��Gn������'$$�����1�w9v
���={�|�I�Lv��A�L������W��
�����24XV����`X���C��$}`�IEND�B`�
collectd-cpu-pg13-kqueue-v14.pngimage/pngDownload
�PNG


IHDR �J"�/bKGD������� IDATx���y|T������-��v�&""��z]��j��[��R{o�V�x-���Z��(Uk��j{[�^��**�\E�jX����e���v~L2! 9�3q^���s&���7�|�=���i
�q�]�W

��h�,F�`1,��`X��b4X���
��h�,F�`1,��`X��b4X���
��h�,F�`1,��`X�@k���o1�v����������.+�7��K.i���/�4��W_=��]�t�?~���������	8�oM.\h���������]W�Z�h��3"�,Xp��W�x�-<���ew�]vv����_^s�5�
z��'������-:�N�0:��S��:KKK���O���}�m��:f������#F���+�eaa���'O����QUU���0{��>}�x<�~���{���`0r�@ 0{���={fee�;��?�l�s�����_ZZ�����z�����������������7����k}{+GoV�)=��'��7���ok��u�����n?x��q���I����_}qqqzz��!C.\x�C����w����O�}����w����<y����O��H,�l��������������Yg���{�egg��?x���y���?������.\����{��G?Z�x�c�=��{�
<���/��c�����,x��>���Y�f��5�����T[[;y���O?}��U�W�9r�W\QQQo��V����Sz�K�.3f���S���G�q��nn�a�����/�0++K����?����_~y��
��{��Y��,Y��!ZyPn�{���z���}��u���Y�����C�(&���o~s����&{�����;%���+�;�����s���>x�������������5+++���������,Z�(������k�}���#����D����o2d�i�������{�E��+V��������������c����7���_�>���;o�����EEE���������3g���l��-���}�����;f����o�'|P_|qt�M7��1�`�`8���������������g���oG�p�9�D����u������n��e��
~�?zO������^z��������_|q�[&N���z:4t��a��}�;�y�����Y�t:'L����o{+GoVg�Y�l��E�.\8`�����N�>=???r����������p�u�YgEw���Gf����	2��&��m;x��-��{����������/�����#��222�
���.�,��
7� ���iii����u�]�����3�����?�#)��V����f�Ng h����^���9���u���o���k���n`}}�7�������>�(��9v���9��j�i�m.���-B'���q��g��=���$�N�D�g���$:t��oy����-<�L���g?���~��zy��i���~��#G�lq{+Go��=z|��G�6n��YR���O�����[n1�W��Ut��
�m��������N�l��o_��h��`/f�Xf���.�+����>���������9��vG�/O�0��_9rdZZZyy�iM����v�����}���K�F�?d��g�}��r�[�.��V��z��_~��]��z����P(�������o��Q���49��/���������}>�������|����[c�=�m~P����x��?����CG��b����{����r�\�����O������{�g<���k�����ssso�������K�.��{��;n���~��-]�t��]�^{������'Kz���%�w�y���r�����m���k���3���������Y����%z������k��]��O�>'�!�(���o0 �X�O�>#G����|��'����n�����O�4i��M������{��h��`3[��Hv��"l��z����{�_F.���gO��5`�������p8������;����{FF�\����G�����'}��u���z��9s�����z���F�������{�����oo����l�����{�<xpZZZ�.]���o�^�:�o��FQQQQQ�[o�u��"��	k���?6M���_0`@FF��	����e������3��C����5k���[���a���b
��h�,F�`1,��`X��b4X���
��h�,F�`1,��`X��b4XK�+
�w�}����o���'�4hPzz��a�^|����`#������_��_8�t:��z���g��������.X�|��3
'M���.{�i�[���>�z�����7]�ty���n������}�N�2e���/�N��s��U�V���^��"�:u�+������l��M�v��}�UWE�L�<y������������������w��7o�,i����-%%%�in����]	.���o�����������]YY������8�/r�.�+
�]HR��JO����@RUUU^^^dKd�������>��x��B!������R`{�P��$C
��5�^@2�`{�P��$C
��5�a���{�p�����^ot���u:��neW��	�L�6X4h��%K�[^{�����ggg����J�a�)�5k�D.���l��b�
I��~zz���so����7n�����-{��w#�����u����]��A� �$�$B�D���!������_�zu����o�����g�y��G��g��!C|�����:z�Vv������D�A!H"I� �$% �T��g�A!H"I� �$�$B����w
,w�-��]��A� �$�$B�D��*M+�9��,�dG�`1�RZZjw	�#�$B�D�A!$F��Lb
��5X���b4X)����]��A� �$�$B�D�A��B����.�~� B�D�A!H"��H���,r��� ��`X�+�p)9�$B�D�A!H"��H��I���� ��`X�+�x�^�K�!�$�$B�D�!1h�RHqq��%��D�A!H"I������E� �$;,��`�.%'B�D�A!H"I����2�5X �`$;,��`����$�$B�D�A!$F��Lb
��5X���b4X)����]��A� �$�$B�D�A��B����.�~� B�D�A!H"��H���,r��� ��`X�+�p)9�$B�D�A!H"��H��I���� ��`X�+�x�^�K�!�$�$B�D�!1h�RHqq��%��D�A!H"I������E� �$;,��`�.%'B�D�A!H"I����2�5X �`$;,��`����$�$B�D�A!$F��Lb
��5X���b4X)����]��A� �$�$B�D�A��B����.�~� B�D�A!H"��H���,r���"�#G��{��%%%���C�}���C�Pt�O<1h�����a������6�	�ew����[�|�������N[�z��7�X[[��Hz���g��������.X�|��3
'M�dw�I|�0�����3g��9�-7�p��~�i�&I}���2e��"��N��s��U�V��S��JKK��cw6#�$B�D�A!HJ�S����r�cKKK�<�M�6����������<y�������m(����#B�D�A!H"I��I�`}�{�{��g?��sIk��}��Wo��fI�7o�4p����KJJL���e�]�D%o�%i����{����].�����M�v�]wI��������g�veee+�-�7o^��`�z�����{���y��w1#0#0#0B��0o���Y-�W&�y������{��a���]�v��Yw�y��w�������������������O?1b�_����/����X�%���2��*lF"I� �$�$B���>!y�p��]�=��K/��/��/��<��������k��������
Vd�*���]��A� �$�$B�D�����l���
�2h�������w:TR�T���u:������#''���G"I� �$�$BH��m����'��/��n�z��a���w����
Z�dIt�k��6~����l
8V��"8p�e�]v�=����
6l��
=�����#]���so����7n�����-{��w�.@J�,I������[o����O�={�M7��h���������'���/9~��?��������	��6���2E�"�$B�D�A!$F��n�E�I�+�tR4X��J!�e!H"I� �$�$BH�TY��,k��
��h�RH�OY� B�D�A!H"����J!eeev�`?B!H"I� �$Bb���o��xX���h�,F��B���A!H"I� �$Bb���$�`�xX���h�,F��B�^��%��D�A!H"I��4X)������G"I� �$�$BH�TY��"w����������������*��r���lw���|��X�'�J�A��3T8�w������_�wW�@O�����]yC?	�$ph�3�[��r��.m�s�.� ��=�#�\yCw����4XmD�����������{��k��#<�/����6�����
�`����O�J?	T�wf��Nn�G��@����/����X�����sf}[
w�+�4W�W�`g�PW�PW�9�vW�SC��F4X�JKK��cw6#����W������^��;-��%�nc���o��j�
V}8T8X8T�X����.��_�1�3���V<D�NB8�X���������p{���t��>�]4Z2$������U��|���m���B�m�����gv�+�tW�pWN�3g@��I�g�h����
������a��`��]p���8O�%���g�u�	�7������X�u�`m��Z��"3U�����K<��z��wf�?�!��P��H���<T�-������)�4[�]W���'�6��B�)��_�A<X����\O�%�nc�]�5�� �����sf�;�ouX@K�?u���^�������Vh�!�!���,W���`����i��9%��W�i2������h���Bu{#�T�+���]��t���w�(v_�%V{����C�!�6gN���8O����1��a�W����������y�nc#O�;�����
��*?V~��9���;�U0��]��)q��tL=����h��YvI)B����l��J��������"J��@M���������=����[	���0���r!��`������}3T��rvy`��Q���z^�,K7��p��H��m�lTlT���)9:��?��w������)�Lh	
Vu�+��c8��r��LI�3-�[Z����Js�
w�$�p���}3�3��I�54��6�Q8p�v��k8�w���J�SZf(px����}��?���)�t�����I>aE�`i��'��A��jw�1M�����{�+��H3�`�����S�!vK8P-3t����cGi�,ma�@������#�%��.��3#v����6b�2<y����S�AvBf�!p���_�;��3���m���E����9���d���6�6��7����/C5;���D�~
8�����)`N��������1��+�9�������`������R'+i����6X��/}k(�(��f���K2CG�x���d��`�$��f�V�i�@�$NG�-g���p�<En5��O�1�pH2�y�&�4~n:V�����3�SL-���`��'��R1�X�z����9������Sh:�}Z��*3�`j���!�;�pe������t������rw��L7�y��6�'_�t����������h��S�M��p��c�������������}������_�+2��������m�|k�O������'/��9�i��@���=���d�2�L��r�'V��-�=���-��2�������}����:3��3�5f�k��W�G�<���,���$�t���H+px
��H+0<17�
m�U�_]�8������XO���nc��:����5;B�^3X��F��#[��If�gK3�<i����$��+�k�w����O�����n|c���i�2��������x��`�Q�k�B��k�=P���Yg��v[�����O�������V8��m�����M�13p���$������c�s#��l�s��t��p���-�|F����+j��U�Y����5����,Xcj�P���|���
���#a�B
��;���n4k��:0�'/���o8�B5;��8��+w���xO�	���iEvg��@:�a8S�����~xKf�.���+�����"�Pa�cn4T����Br45[O���:��tc���������?���.:;2M��zA�7(�*3Pm�!E~Z�s��uw9'����f4Xm���p����?;����C��u�l������I����H��`�n0*�P�:b���p��	|
5��f�N��pC��wf��� ��O�$���:$�H���Y��������Xi�=]/��:�EcN�|1����	'wn���~���/��0���>ud��v���2^BI���4��\���!t<BP��`�2��Le�:�;�����[�uc�rf��t���m\���p�k�e<y&������S��`����M��l�YZ����3{��@R3C
��K���`�+���|���nWNI�����g�]ttWHr4Xvj�������33���.X�k%����Co������3�-��a�tW���p�$G"I� �$�$BH��^�d��Y����[����g�yO����{ ���4�Q24X��M��?	���~g��cI�E��R�vO������$k���/��W��l �O%V���������,GZA�k6e���+��k���!�$�$B�D�!1��J3X[��S��-H�{u�omL��W\l
�#�$B�D�A!$��+�:FG��2��#[����t�3����As\�6��Jn�\5�
�
@j���L�UC]Y\5��"ws��+?H���K��$�$B�D�A!$k��������F������j�i�n8<:����UC@�8�u
����m�Yv�$B�D�A!H"����Ii�j���}��5/�
��)B��|����i=�����;��]Hv�`�X��z�p�
���$�$,��b
���G~5�+��gw	�#�$B�D�A!$F�N��������O***��}[�li_a�^YYYNN��U��D�A!H"I�������+��_�W���7�������0�u�{�Kr]h4''g���%%%� 4X ��Z������G�Ji��u�&L������g�Y�f����'�xb��A�����
{��Z��kW�5c����[TIv��u�����o����<��/�����$������={���3W�X1m��3f���������K��$�$B�D�A!$F�&��|��_��%%%g�uVF�1�4�?~�k���3W�\�n�:�0$-_����_y������;e��D�9u���;w�Z�*�P�"�$��������w������F����G?��]w��l��M�N;�����o'N�ly�������VVV����8
�'�����~��8���������K�i�����[iii���w~��������7K8p`��%%%�in��e����+	�dXp�Q��������G_|�E�"����q IDATv*//�4o��Q�F-[�����~������+���JR�dU�vee�UG�J�z�v�`?B!H"I� �$Bb���
w�qGaa����/����O?�K�.>��%�l�@@�UW]u��w�}����v��������G�����y���.��z�����{����>;������`������`��:��h�����Q�s�f�	��Q�s���:��h�-�'t�Gq�#��7��~@Vk��{�������������>|x����?���y��_8u�v�������{���o�ly��7&M���z7o�<i���;w���7�k���]t��5kF���h���$���^z���������[��_�e������o���w��������P($)--m�����^o���z�N�s����<(@�����}��?��f'N��{����t:/���?��O�-+V����������
�d�����^{m�������?.@;�������'�|�l��5k�u���a���������t�M|����?�h�������pH�;w���>�`����W��3g��e���%�
�Rr"I� �$�$B�D���3��g����={��q��TTT|��?��-����������z��{�����>�����7�<w��H�%��g�y��G���3d��|����ne�`�x��B�


?��~���FVGIr��7�p��O>��x,��4X ��j�":�~����������:�������E����O��B�EEE_|������}�k��]!���"I� �$�$B�D���~m���W^ye�r��s�}���0�1��I�S�]�tY�`�����t��>l_a���$��F������G��t:��]�f��tN�Z�5j�����fw��5m������SM)�D�A!H"I��m�S93f������������M�d�*i�������]��A� �$�$B�D���3����/?������3��:�K+((��x�WXT�5X��I�E�Q'N\�ti^^��%
�'����b��������}�����j��XK�,y���>��4�/��r�����*--3f��U��D�A!H"I����[�p��Y�F�YZZ:v��}��m��u��I?���.��R��l?N�x����'�|�7���'�|"i���[�lY�r�������gEy�O{������7<�0�`0���o���������if�@<I7������I���[�n�l9r�����[���z�.�~� B�D�A!H"��ho�u�%��|����������_�z���>�������%��B���v�`?B!H"I� �$Bb�wB���|����/���7������K���\�x��)S,*��"�$��F������a���9rd�.]��4X ��k�jjj����������q�����(
�'�����\t�E�3�Q�w�>��s�92,WZZjw	�#�$B�D�A!$F{�5�0���kjj.\8c����-[�<8�f����$�����z�����
7���o;�sR�
VFF�SO=���o~���#F�x��w�?&@�eA�q���o�������������c���g�E�A!H"I� ���5X�7o4hPt�/�p����|��Z��,O�]���������13a;v������N�����D��I������X�'���m������+G�=��x������Z�������]��A� �$�$B�D���������������x���J6eee��A� �$�$B�D��*'�8E�I�� V��`��>�"���b]�t9�}<����S��JKK��cw6#�$B�D�A!H�2
mF��a
@��:Xk��L�>���X��J6^�w��!vWa3B!H"I� �$�����{�yZ�|��#�Ng��k��ioi�Zqq��%��D�A!H"I������(//o6��f���.�����}�Y�,O��`I�1cF��m������n�&�W ����:��s?��cI�7ov���w��?�p{K���;!6q���K����YUP�p�P\JN!H"I� �$�$B���F����,k�^}���7z<���{�5�0��U����_k������3�<s�e���*�1��I�?��EK��]���/���s������-��(--����A!H"I� ���y�P(t��/Y������,O��`���t�t�M~���#t
�7X��u����12@�KH�UZZ��_�D�����!H"I� �$�$BH��7�|s��S�N�|d�SYY��%��D�A!H"I��m\�u�%��1���c��]���{��w����]�eX��I�+��7���N��G��_~���_�������,
V�C����i@��Rr"I� �$�$B�D��9�u�92|�p���g����'�x��'���g�����s����23X ����7o����c�<����g��9s��+�M�6c���_���bu�y��7�w�y��M{��7�3X}���2e��"_N�:u����V��73X �$��2M��7��5k����g���l�2������r����:|����M�6��������n�<y�������-9�W�������A!H"I� �����{��������O��������s�%#?��3����7o^����7K8p`tKII�i�[�l���_U���v�`?B!H"I� �$Bb���jv�������|��SO=5��E�m������}��+++�3g��E�233c�WUUI����n�����le4�%������	���bw����|��~g!''��l!''��l!Bg�!��:��h���:��h���'t�G��Z|O�t��$G�7o^������3�����������g����_~��������M7���)�)S�����/Kz���}�������w�]w]eee^^^���~���#����^|��-�,��}B���|���3g����-����}�����.���G��~������7�x����g�}v����IUUU�+2w�`�6�"3f��U�n���k���������#������o?���o����������vV��+�TVV�����r�\�Y�f���p�\.:t�����z�N�s����<�W��!H"I� �$�$BH��N�>|x��9/����y�f���t:�����GEEE���^zi�����//...**<x�e�]��SOE�N�4���#���n��8E�I�S�Q����<���7�=c8v�XK*���W�^��_�����r�q��/���{��70`��qK�.]�lY+�@Gj{��k����zk��}N��W�^����.]z��W_y��?�p�n�,��x�_}mm�#�<2g��!C�����&LH�NR�`-Z�h��������_~�~��_����x<_~�ezz��a��'��r�����!BI��o��u������7^}����+���"I� �$�$B�D���3��F�Z�bE���$}��g�&M��c��O>�d����W�����c
�'��TN�rQ�kbI:���?���v��i�q
�=��s�g����B���������G�����t
m���|�����}�G�^������fmq��������A� �$�$B�D���2
999���(:RYY/!B!H"I� �$Bb���3X �$Z���`X�+�p)9�$B�D�A!H"��H��I���� ��`X�+�x�^�K�!�$�$B�D�!1h�RHqq��%��D�A!H"I������E� �$;,��`�.%'B�D�A!H"I����2�5X �`$;,��`����$�$B�D�A!$F��Lb
��5X���b4X)����]��A� �$�$B�D�A��B����.�~� B�D�A!H"��H���,r��� ��`X�+�p)9�$B�D�A!H"��H��I���� ��`X�+�x�^�K�!�$�$B�D�!1h�RHqq��%��D�A!H"I������E� ���y��7W��
�i�`��/���^1�8)4X'���������]H{q)9�$B�D�A!H"��H��I�<������e�����{e�YXH�������[�����gw!���:Ys�����}Kv}jw! ��`��4�����u��V���]Kq�]� �$�$B�D�!1X�ujn�������k�?H����#�\���������B@���:5y��������\
�]HR4X����g�����
��]�)��|v�`?B!H"I� �$Bb��.�SZt�5g-���g��aw-����,''��*lF"I� )�B0������j\
0�����#R�q�������1�,��m8r#�
�N�lD��"��7�?j�q��|Z����c�V�����2�����~�^f���8�6����
���?d�Gd{&��FZ�.�};sFV�}���%��-M{2d��n��p7��}���p��K:���d���j��3h��_,
�����L���~l����~��o3�iF���c8
g���o8���Yh8
�|���02�}�I#d����*3\m��Z|��$l�[~�[�0��w�##�wzdx�����'_�i�4K�4�G�]�m��)�$l�L����t����b^�<����K��IaI2C��x�H�FaY2"oG_��#�)��o���p�i���3�32�l����oe��������l���4�d������G9�]�o������i�N,��lX�l�i��z?Y���n�Z;n+���;��ii������p��FGl�s�w8��=����h��9�������1�[L7��w�hcq��k�
1
b�~�i���_)��+����	�0G[�8�al��5�M����9�vK1=�i��p�:W��C�p�:l���Uf��2���i���|�(h���.�Yg�*�p��nl���2�_���3�g���;���c�Di�e������7@�{���lN�ad7{!������$lt�3��n�Nz*�Up�������dGf������G3h�>3\���Yc�}1���l�m1�X��8����	;���o�O�@�Nf���=h�G�o�f�V
76��?k��v�(��6�	���I������w�j8��>����c�F{����<�pv��9��`����I�TU~��J�q{��|kG��4�p�:W��C�P�1_�+�m8��|�m�b'�
����4�9U��J3\E�J3\W��*C��g8�
G���k8r
G���7�G^��2��*X�4�Z�����m����&�h��n������&�^f�������h�}jj_�_�adD|2Y������p��2[������#C��w�1����B?
����`Izp�;��w�~�M������c����
��xf������Cwij������a�*����mt8
Z�s�6�Si�����Z����f������E�'���p�5�P�������K�gB!��C0�-L��
���+mj��e��o��,]�b�$�3A4Xm����^����.������4���P�:W�0f�F��5Y�
St��Y3�g8���|�V�
���_��W�w�����M7�4k�,��q��O<���O���g��s������[*A
������yw��W�.�Xp�Hjf�4��S[|
�/���~����{�������-[���~��{�y���"��~����g��9s����M�1c����nK��u�{M��?��-G:��29tWpB�;����f������4�������n����}���2e��"��N��s��U�V�-q3X�j��K���S.�98A�����2d��U��D�A!H"I� )�f�Gii�����[���S^^.i��M�w�������&O��z����j
��\�E�_��U�	�ta��Q\\lw	�#�$B�D�A!$FR7X�
*((�|�y��q��I��y���F�\RRb���-[l)U��O]���u��U���B�"I� �$�$B�D���
V3��s���[���~IUUU�rss�{#�+++�*O�S�_�x��k���@2�
��w��p��?��C�m� FK���Y���zc��e����>����6��%=��c�����]QU���_#0#0#0#�2��y�Z�d��]�������������t�%�D6����&M��sg��}#[V�\y�E�Y�f��Q-���E�Q����z���C<|B���\JN� �$�$B�D�AR�]K���3���?�����G��n��u��A��y��h���/�r�-�����-����i�$��9|��~4�����8h��-BI������/,[�,���4p��A�-Y�$����^?~|���#��.�u���}�����\@������;r�����{�UW����X�"���/�x<s�����0n���K�.[���w����c�>����_������>�
@jJ�S����kqAUYYY�=$=��3�<���={����^}�����a�#��{���m���n��O�Eq�]� �$�$B�D�AR
���J7X�f��}G|/����<(h��Z���=0��Uv�e��v:
V�d�����r�GKj
v�:
V}�x��%s��ew!�b����A� �$�$B�D�A��X�8���m��;�.D�����.�~� B�D�A!H"��`�{��~���6�[�����-�������N�����~�v:
VGx��k~���}Q���B@G���}���y������?'����,B!H"I� �$Bb����M��7�0�����gc�x����������S��?����$
V�QP��������]H,�����|Z�o��Om9������I�D�A!H"I��4X*��z��ko]����#�����?h�!�$B�D�A!$��m��_u�E\cw!@b��W�#�L����W��nw! !h�l��N��o�����������`���~#N�����w;��\JN� �$�$B�D�!1�heRB%�����������+�mx~�k �����83��Q��������`%,;}����\�g�\ew!�J4Xv2d<}���{gwme���"I� �$�$B�D��t+�$	�`E���w>*����7�])�5X_A�����uU/o_ow!�4X�s9�^��;�������,G�������~g����	=���K���!�$�$B�D�!1h���������-��nN�!���7xgA"I� �$�$BH��]�m�d^����/g~�����3����R������}�y]��_���B@��`%�'����[>Ys�v��+�tI����+nZ��`�������D�A!H"I� ���L�D�X��Oo����C<|����X��~5��m��V�!�mA����g�y��[>x�T��uQ4XI���'T��_����1�^���uR� B�D�A!H"����JR.��Wc����/��5V�Y\\l�P�!�$��N��P��q:uV!�D�LK���s-r��������~i�w�.�W���
�k�
�@C�vm�_���4�����
�AM�!z�6���Is�r�i#z�Q�cDA������{d��v?&tV��	���h�N�`�g.y�������iv���5��u��$_�!�M�*P/�><H����p�4����������*���i��/� �H�i{�H�4����u�@C((���4����!�]��v=-�����C�����3d�����"Ox_��6�P�W��k�
�m�_�?i�j����#���&�P�o��e� IDAT��4������,�'����I�ry�\�<Oz�;-r;����t� -#���v�e�=�Ieu�+�m����b��e_T���wfa�=���1��gIN����a�@8T���4�w������,G��F�����|���}���o��v�E�������j}�K�~NK�6~$K���En�C�����/�4���9��D6F?�%U������UCl=�A�?j�`Sf����U
D��VTk8n�3��_(���:�w��@C 2�J�I�3�����in����=�����[R�;�i8����I���t�;]��<�p�w��L�;������0d����x���q8%�eJ:T_��.����������[U~��nH^�H�uZ��H
�]Y]�����}�c����2W�k�4�+��������u���-q�ur�i.G�62]�4��$�9�5{���?n�U�Yu�W�/�Ph��=��z�,�'������vy���lWZ�'#���r{r�iy����x��Y0�\]��b�����e+��9=�����#
��(�1��g��,k��Bf�u�;|�w��QS����������C����V�����^G������k�'W�> ��J2��j���`I�a�_��>��;]Mo��iI��i�|TK*�dFnx��#��]�tQ�}�pHrF^�{}��_R�'�iXgt��,���l�1d�{N����tg�h&?���4Nv�`�����n����:+vKd��$��\��1��j
������MU6U�{�����Nw�Wc���$�0�Sfii��1c�-;Vu�~���6���5���S��9�����9���Fn������e�B�Na6
��-�U4�T�L��>���T]��n�3�En�3����}���H�_|���a����CF��^�9��,WZ����>�����lCE���6���tE�'�((QP|z~����O����`8���rGM�����^�wxgm������Y��d��.��]�++�e8=g����'��q�;���G�c?R

Vu�+�'|����Uo�:��.�V������|Ome����y��6�r
��Z����U5��;k+"�S�����ph@vaIcu������r{j�"�����O+�y���eD��=�v�9�@8���rgME���^sxG���5�����g��)��]�?� �K��.�����J��KN4Xm��,��"o��|�?���y��m�C�|���U��
��Q�SX�Stz~���=��Y�M���6���Q�7��U���+�),�����[�ST�S��XF[��]��U�/=������U��S[58�������8=���]�t��i�Q"���u�eG�c_�j+r\i�B�FqfNINQFK���P4XmD���dk�{�g�>������m8"�.�7��������� I�#{����|����U<g�������Y���Du�~s���*����y������������t�=<�G�F����i���[WU���3#�WD2��j#,%��[�Z
�����2�|�������T��E�-����][],e�����],�?�0��q�L!H:�v���b���}��X�o�������o)�{2v�VF��m�9|���wf^��R�s|=3sO~E�-x&���h��6�#k��������d��.�S4 �0IV��}^�������*��5����]�33��Bt^4XmD����OH�IK���+��|>�K�!�$�$B�D�!1h�RHYY��%��D�A!H"I����2�5X �`$;,��`����R�K�!�$�$B�D�!1Reek�@<��B���7���G"I� �$�$BH�T��aK� �$�$B�D�A!Hb+�O<1h�����a������v����6XO?�����g���b��i����1���_��(��6X?���n���;�����������L�2�|��:Nr�$�$B�D�A!H�*��)O�n�����N����6q������{���y����$\�Q��T����m�����L��9������*���
�)�>�u�k}�jmubeZ�*����HY��Q�����I�����!�~�:9����=���'�7�w��3G��yzzv�#��3��`5p/�j�^�=���{��{�P�����C
��������BCCMkBBBc������?9�~���F"2�X%,�t�.~J"����nq��{�P�����C
����`5p/�j�^���`E�����_�������gFjml��G4�����������z����%���������K�.�#�L!��,WJ$���u�R���3�I��v� ��z��%��&#k���1�����y
L��������{��A�g�3�]��NJ]$.������y�O��*������������5��+a=�d
�L��?�D����z[���S`,��Wv��&"�VkZ��je2�F��W����+444,,��>0�9p�@ll���;����#B"Z�z�������q��<x���#���]Q/�K�u��������*<<�/�KBB���zu�`�z�=X�
��9W�u����W���{�w!bkjj:������?^QQ��	t�����o��]7EEE�n��]7z��������ht�	];���g�9*2e0^}����p�F����[�n�B� "�D2��{����Q~��/~�����d'N<y�$���`0������0s����J�����|tK&�]�|�w"imm���8|�0c���+W�tss�oo������6�5�FF������[�i�Vnnn~~�s�=�P(��������������j��_�a���k��.��v��9��3f����!!!�ol�j��0a���~�i�e�V~~��U������GFF�����i��U```�����&O�,��������(�edd���c���D����e��?��O���kkk+--}��W����z�j�e�F��HD�����!�F��;�����#������������J����_{����fffFDD�Y�&;;[X���iii���G��8������ryJJ�?&�J322�e�5�\��}w��-,l���|kAAA`` ��D���a`d�a`eTt�����_�.,�F�Lv��%�����R��2����9s����}��B��.�J���~j�&--�������9�8�knn^�r�R�LOOonn6�w�����N�:%,����;w�|kYY�3�F�FQFE����o����]��]�������������k����T�xO�>�������.��=k�&77711q�������U��T*UNN��3g����~��a�q0f���[�2��h��)'N�0��}�������LD	#a`gT�J�f�V�\����5'''$$$99�����������w����/_��F���q�������KKK���t:�N����/�=���*���l���F���a�B�����}��i��`X�h�R�LJJr�������7�|���+))������`���{yy=��c999o����RSS�z�������h��?��w�6���a`d�a`4c�Q�alnn�?�Z�V�T��
��+���_�������x�(����o���k�.����`0�Z��������bSIII����g1����>}����D"q��1V[[�x�b��4J���������yW'��-�bTt���1������uuu���AAA���|YeeeUUUcc#���<��0R����IKKKee��Q��T���C��{��u��	��S�}�vCC�^������d�+FF��;*:x��^QQ��Y�|}}y����7kkk
�����n!"BD��!455UWW�t:"����h4�����B�aV���8�M'/�����qw��MNN��T*MII����B`�1�c��h�!�'��
V�N�������F�#���R����t�Z���{�����,77��7��N$�!�B`�!�c%%%R�499y��]�N��|���������o�/��>���5�B!�m�0�"k7�4�����0;;{���B`�1�c�1��FcA��������`�R�L-2�N�:�R�8�%.��c!0�c�2��(	8�D��Y����������7n����� BD���YC�D��DI�����h4n��u��US�L),,0`��F���.1H$���z*,,���]�V�={���F�����+����G���{7�2m!B "�@D���
����,Y����644T�)�Z�����m��M�6-Z��w����H��W�z��Yq��iqqqQQQaaa���*����[�������������P�!�B`�!�`�Q�l���_�2��3+
�F�0��V�4h���+��8@��!�s���F	!�2�j�D��7�������~�bebb�\.�R�!"BD��!B�e����>���w�^ll��w*���j4���'��Jd�!"BD��!B�e�����#�������w�!BD��!B "����o���w�!�$��
��3g���yW�B �@D��9Mmmm�������5k�V�5�z�����^��!����6X�����322BCC���.^�����.JlA���6n������j�*�!B "�@D��m��}��u���D���������x��!'��[�DH�aor�J�2�L&�u��h4��zG}�&�!"BD���H�R9r$66��&==������QQQ'N��0aBp�DH�a?"����h47o����O>��w�b@��!B "�@DD���g��5_������8u�T�k�B#����}2qqq��O�pkii��w��c!0�c!0���a�B�����}��i��`X�h�R�LJJB��	8r����yyy����o*//;v��%�!0��C�1��C��U�VyzzVWW[l*))���KabB"$���`t�`0H�R�������TVVZ�����Mp�{���Y�!B "�@D���,�\���U"��d}���.�Mp���B "�@D��!"BD�0�hO`5BD��!B "�@D���8	��.���h����e�^������z��Qa����B`�1�c�1�c�1�DI�aT*��~������4���r��=!0�c!0�c!0�c!����~D�Y�!B "�@D��!"B�h�'0�C�1��C�1��C�1��C�h�'0�C�1��C�1��C�1��C�h��0�!"BD��!B "�@D��	8x� >����4XV����`X,+C�`eh��
�����24XV����`X,+C�`eh��
�����24X����=[���[�����[��w��\$�1�5���+W���kay���#F�HOO:���cQQQ�
��JXX��q������.�>"g����aaajj���W�>}233o������V��s�Na7���z���� �B��h6o���|���`�qqqy��7bcc�����_~y��
���o^z���7o��1c��E:����/_^PP�v��/��b��+V�x���x��	,p.��
KNNvss[�`EEEM�4I�T��7������������x������h4�-�3gN~~>���7A��e��a����w��:��������'N4������Z��[�D/z+9�D�����C�XSSM�:U"�+�F#}��w���b�	�,����"���wGDD���T�>h�~d���
����a��!�����T�P(��,����\�p��5k���bbbjkk�-[t��A��@����������������_?����<���
x�	fr�2L�`eh��
��������g-���K#F��v70AJ�!�bGh��(((����]����a��������}9����g�=�I�4�1w�\�%8��fyy�C=��`��d�/K�x�P���*p��3�N�'�ho�+X|�xQ__�T*������������W)
�F�y�f�j�{�a���o�������������i����["?~��;JJJ$����O�>EEE��MS*����������M;��=z���������������V����xi�rq�q��/�^�OOO����Z���/y��ia=N��UVV������1n���'OQll��)S�w{��g����������aaajj���W�>}233o������V��s�Nq����b����R����(*�����������<i�����;v���+�����o���%KT*��;�Z��-[\]]�m���z;c�R������������kjjRSSc:�.:::99����`0t���DD��/�|��i�^o�P�V����^z������r�>}������������~��%&&�iQ�q�q��_���������;����;w�������N��t��]OO�^x�����x�R�n��]RR"�Jo��a�M�Tn�������(�}��������;���c���[�b�R���������:�:;���S�b�����G����q�_����M�&M�DD�6m:|�p�����322��4Myyy~~~JJJO�y�wg�~g���1k��zT�


]�d	�������={������r�B�����:L�\���f��a���d��!.$�����K����+����/���fU|���'Vx�=�f����)��g:<���o���o<��sD�m���w�VUU�������]m�{U��z3?�t�:)\���kjj���f��5t�P"*,,�1c�B�HJJZ�t���{�������C�������W�T?�|$�a��%''����������r��y���c�����;��^X+F.�s��cT�����P�j��7�<���z��c���5�+@����k��(22Rx(�Jcbb�\�b����[[['N�hZ3~����~���[����=yL����Q�F��������{��
s��1��[<�BLL�iy�������������"{ksc�=��.]jmm5GWW���{��N�<�3N��pn�
w�:t���3_|��)S�DFF���	�f���k�.��:p�@BB���W��t{>6LX������N���Z�QY������h��R�����\�67��`qv��"���2�1_6ijj"��S���`���D��w</P�'�Ri����2�n����1���a<<<L�*�������p�������}X�F8��B�(++�={�������
�o�>aSJJ��K�.]�t�����Iv��I�G����|���7�Ng�aU'�+X���j���pg�����{wDD�����`��z��������?4�v"�����=)�Bh|��Y8�~__�����_�^�������5k��a#G�����������1c|||�O������8
v��������!\��l���DTQQ!<4�N�j����#
ECC�����>��#
�B�r{9�?�=	���[������?��3�M
�"44������#G�������h4����������~�����������b�\n:RRR�}�������3G*�v���G�����(b�p������|���aaa�<�Haa��p��������Y���S[[�l���� ��:t���������b��?;���G����K�,Q��w��1�����k��y����������O�.l5�.nu����;wnnn���G�Q\\|���'�x������KLL����6m��� "�=�3g�LKK����z�j��[�|�l�����T��`��w���C�>��3������S)3UIDAT�g�����w{���/^���>{��q�����G�j{��K������W�:���3??���w��A���2�����7��))):�n�����O�8q�i&����{��l��9%%%##��'����/>��#��"N��WRR�g���������>�����C��zyyM�0a���aaa��o��l����������\X�����e�^y��������m�����w�k�W��Gn������'$$�����1�w9v
���={�|�I�Lv��A�L������W��
�����24XV����`X���C��$}`�IEND�B`�
#82Thomas Munro
thomas.munro@gmail.com
In reply to: Thomas Munro (#80)
Re: [HACKERS] kqueue

On Wed, Jan 29, 2020 at 11:54 AM Thomas Munro <thomas.munro@gmail.com> wrote:

If there are no further objections, I'm planning to commit this sooner
rather than later, so that it gets plenty of air time on developer and
build farm machines. If problems are discovered on a particular
platform, there's a pretty good escape hatch: you can define
WAIT_USE_POLL, and if it turns out to be necessary, we could always do
something in src/template similar to what we do for semaphores.

I updated the error messages to match the new "unified" style, adjust
a couple of comments, and pushed. Thanks to all the people who
tested. I'll keep an eye on the build farm.