Document NULL

Started by David G. Johnstonover 1 year ago82 messages
#1David G. Johnston
david.g.johnston@gmail.com
1 attachment(s)

Hi,

Over in [1]/messages/by-id/1859814.1714532025@sss.pgh.pa.us it was rediscovered that our documentation assumes the reader
is familiar with NULL. It seems worthwhile to provide both an introduction
to the topic and an overview of how this special value gets handled
throughout the system.

Attached is a very rough draft attempting this, based on my own thoughts
and those expressed by Tom in [1]/messages/by-id/1859814.1714532025@sss.pgh.pa.us, which largely align with mine.

I'll flesh this out some more once I get support for the goal, content, and
placement. On that point, NULL is a fundamental part of the SQL language
and so having it be a section in a Chapter titled "SQL Language" seems to
fit well, even if that falls into our tutorial. Framing this up as
tutorial content won't be that hard, though I've skipped on examples and
such pending feedback. It really doesn't fit as a top-level chapter under
part II nor really under any of the other chapters there. The main issue
with the tutorial is the forward references to concepts not yet discussed
but problem points there can be addressed.

I do plan to remove the entity reference and place the content into
query.sgml directly in the final version. It is just much easier to write
an entire new section in its own file.

David J.

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

Attachments:

v1-0001-Document-NULL.patchtext/x-patch; charset=US-ASCII; name=v1-0001-Document-NULL.patchDownload
From a068247e92e620455a925a0ae746adc225ae1339 Mon Sep 17 00:00:00 2001
From: "David G. Johnston" <David.G.Johnston@Gmail.com>
Date: Wed, 1 May 2024 07:45:48 -0700
Subject: [PATCH] Document NULL

---
 doc/src/sgml/filelist.sgml |  1 +
 doc/src/sgml/null.sgml     | 79 ++++++++++++++++++++++++++++++++++++++
 doc/src/sgml/query.sgml    |  2 +
 3 files changed, 82 insertions(+)
 create mode 100644 doc/src/sgml/null.sgml

diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml
index 38ec362d8f..ac4fd52978 100644
--- a/doc/src/sgml/filelist.sgml
+++ b/doc/src/sgml/filelist.sgml
@@ -10,6 +10,7 @@
 <!-- tutorial -->
 <!ENTITY advanced   SYSTEM "advanced.sgml">
 <!ENTITY query      SYSTEM "query.sgml">
+<!ENTITY null       SYSTEM "null.sgml">
 <!ENTITY start      SYSTEM "start.sgml">
 
 <!-- user's guide -->
diff --git a/doc/src/sgml/null.sgml b/doc/src/sgml/null.sgml
new file mode 100644
index 0000000000..5f95b2494e
--- /dev/null
+++ b/doc/src/sgml/null.sgml
@@ -0,0 +1,79 @@
+<sect1 id="tutorial-null">
+ <title>Handling Unkowns (NULL)</title>
+
+ <indexterm zone="tutorial-null">
+  <primary>NULL</primary>
+ </indexterm>
+
+ <para>
+  Looking again at our example weather data you will note that we do not know
+  the amount of precipitation Hayward.  We communicated that implicitly by
+  not including the prcp column in the insert.  Explicitly, we can communicate
+  this fact by writing.  [example using null].  When a column is not specified
+  in an insert the default value for that column is recorded and the default
+  default value is NULL.
+ </para>
+
+ <para>
+  As a value NULL crops up all throughout the database and interacts with many
+  features.  The main portion of this book will detail the interactions specific
+  features have with NULL but it is helpful to have a reference page where one
+  can get an overview.
+ </para>
+
+ <para>
+  First, like all values, NULLs are typed.  But since any value can be unknown
+  NULL is a valid value for all data types.
+ </para>
+
+ <para>
+  Second, when speaking generally NULL is assumed to mean unknown.  However,
+  in practice meaning comes from context and so a model design may state that
+  NULL is to be used to represent "not applicable" - i.e., that a value is not
+  even possible.  SQL has only the single value NULL while there are multiple
+  concepts that people have chosen to apply it to.  In any case the behavior
+  of the system when dealing with NULL is the same regardless of the meaning
+  the given to it in the surrounding context.
+ </para>
+
+ <para>
+  The cardinal rule, NULL is never equal or unequal to any non-null
+  value; and when asked to be combined with a known value in an operation the
+  result of the operation becomes unknown.  e.g., both 1 = NULL and 1 + NULL
+  result in NULL.  Exceptions to this are documented.  See [chapter] for
+  details on how to test for null.  Specifically, note that concept of
+  distinctness is introduced to allow for true/false equality tests.
+ </para>
+
+ <para>
+  Extending from the previous point, function calls are truly a mixed bag.
+  Aggregate functions in particular will usually just ignore NULL inputs
+  instead of forcing the entire aggregate result to NULL.  Function
+  specifications has a "strictness" attribute that, when set to "strict"
+  (a.k.a. "null on null input") will tell the executor to return NULL for any
+  function call having at least one NULL input value, without executing the
+  function.
+ </para>
+
+ <para>
+  A WHERE clause that evaluates to NULL for a given row will exclude that row.
+  This was demonstrated in the tutorial query where cities with prcp > 0 were
+  requested and Hayward was not returned due to this and the cardinal rule.
+ </para>
+
+ <para>
+  While not yet discussed, it is possible to define validation expressions on
+  tables that ensure only values passing those expressions are inserted.  While
+  this seems like it would behave as a WHERE clause on a table, the choice here
+  when an expression evaulates to NULL is allow the row to be inserted.  See
+  [check constraints] in create table for details.
+ </para>
+
+ <para>
+  In the context of both DISTINCT and GROUP BY it is necessary that all inputs
+  resolve to being either equal to or not equal to all other values.  These
+  features use distinctness instead of simple equality in order to handle
+  NULL like a definite value equal to itself and unequal to all other values.
+ </para>
+
+</sect1>
diff --git a/doc/src/sgml/query.sgml b/doc/src/sgml/query.sgml
index 59962d6e85..f9a8686365 100644
--- a/doc/src/sgml/query.sgml
+++ b/doc/src/sgml/query.sgml
@@ -907,4 +907,6 @@ DELETE FROM <replaceable>tablename</replaceable>;
    </para>
   </sect1>
 
+&null;
+
  </chapter>
-- 
2.34.1

#2Thom Brown
thom@linux.com
In reply to: David G. Johnston (#1)
Re: Document NULL

On Wed, May 1, 2024, 16:13 David G. Johnston <david.g.johnston@gmail.com>
wrote:

Hi,

Over in [1] it was rediscovered that our documentation assumes the reader
is familiar with NULL. It seems worthwhile to provide both an introduction
to the topic and an overview of how this special value gets handled
throughout the system.

Attached is a very rough draft attempting this, based on my own thoughts
and those expressed by Tom in [1], which largely align with mine.

I'll flesh this out some more once I get support for the goal, content,
and placement. On that point, NULL is a fundamental part of the SQL
language and so having it be a section in a Chapter titled "SQL Language"
seems to fit well, even if that falls into our tutorial. Framing this up
as tutorial content won't be that hard, though I've skipped on examples and
such pending feedback. It really doesn't fit as a top-level chapter under
part II nor really under any of the other chapters there. The main issue
with the tutorial is the forward references to concepts not yet discussed
but problem points there can be addressed.

I do plan to remove the entity reference and place the content into
query.sgml directly in the final version. It is just much easier to write
an entire new section in its own file.

David J.

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

"The cardinal rule, NULL is never equal or unequal to any non-null value."

This implies that a NULL is generally equal or unequal to another NULL.
While this can be true (e.g. in aggregates), in general it is not. Perhaps
immediately follow it with something along the lines of "In most cases NULL
is also not considered equal or unequal to any other NULL (i.e. NULL = NULL
will return NULL), but there are occasional exceptions, which will be
explained further on."

Regards

Thom

#3Kashif Zeeshan
kashi.zeeshan@gmail.com
In reply to: David G. Johnston (#1)
Re: Document NULL

On Wed, May 1, 2024 at 8:12 PM David G. Johnston <david.g.johnston@gmail.com>
wrote:

Hi,

Over in [1] it was rediscovered that our documentation assumes the reader
is familiar with NULL. It seems worthwhile to provide both an introduction
to the topic and an overview of how this special value gets handled
throughout the system.

Attached is a very rough draft attempting this, based on my own thoughts
and those expressed by Tom in [1], which largely align with mine.

I'll flesh this out some more once I get support for the goal, content,
and placement. On that point, NULL is a fundamental part of the SQL
language and so having it be a section in a Chapter titled "SQL Language"
seems to fit well, even if that falls into our tutorial. Framing this up
as tutorial content won't be that hard, though I've skipped on examples and
such pending feedback. It really doesn't fit as a top-level chapter under
part II nor really under any of the other chapters there. The main issue
with the tutorial is the forward references to concepts not yet discussed
but problem points there can be addressed.

I do plan to remove the entity reference and place the content into
query.sgml directly in the final version. It is just much easier to write
an entire new section in its own file.

Reviewed the documentation update and it's quite extensive, but I think
it's better to include some examples as well.

Regards
Kashif Zeeshan

Show quoted text

David J.

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

#4David Rowley
dgrowleyml@gmail.com
In reply to: David G. Johnston (#1)
Re: Document NULL

On Thu, 2 May 2024 at 03:12, David G. Johnston
<david.g.johnston@gmail.com> wrote:

Attached is a very rough draft attempting this, based on my own thoughts and those expressed by Tom in [1], which largely align with mine.

Thanks for picking this up. I agree that we should have something to
improve this.

It would be good to see some subtitles in this e.g "Three-valued
boolean logic" and document about NULL being unknown, therefore false.
Giving a few examples would be good to, which I think is useful as it
at least demonstrates a simple way of testing these things using a
simple FROMless SELECT, e.g. "SELECT NULL = NULL;". You could link to
this section from where we document WHERE clauses.

Maybe another subtitle would be "GROUP BY / DISTINCT clauses with NULL
values", and then explain that including some other examples using
"SELECT 1 IS NOT DISTINCT FROM NULL;" to allow the reader to
experiment and learn by running queries.

You likely skipped them due to draft status, but if not, references
back to other sections likely could do with links back to that
section, e.g "amount of precipitation Hayward" is not on that page.
Without that you're assuming the reader is reading the documents
linearly.

Another section might briefly explain about disallowing NULLs in
columns with NOT NULL constraints, then link to wherever we properly
document those.

typo:

+ <title>Handling Unkowns (NULL)</title>

Maybe inject "Values" after Unknown.

Let's bash it into shape a bit more before going any further on actual wording.

David

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: David Rowley (#4)
Re: Document NULL

David Rowley <dgrowleyml@gmail.com> writes:

Let's bash it into shape a bit more before going any further on actual wording.

FWIW, I want to push back on the idea of making it a tutorial section.
I too considered that, but in the end I think it's a better idea to
put it into the "main" docs, for two reasons:

1. I want this to be a fairly official/formal statement about how we
treat nulls; not that it has to be written in dry academic style or
whatever, but it has to be citable as The Reasons Why We Act Like That,
so the tutorial seems like the wrong place.

2. I think we'll soon be cross-referencing it from other places in the
docs, even if we don't actually move existing bits of text into it.
So again, cross-ref'ing the tutorial doesn't feel quite right.

Those arguments don't directly say where it should go, but after
surveying things a bit I think it could become section 5.2 in
ddl.sgml, between "Table Basics" and "Default Values". Another
angle could be to put it after "Default Values" --- except that
that section already assumes you know what a null is.

I've not read any of David's text in detail yet, but that's my
two cents on where to place it.

regards, tom lane

#6David G. Johnston
david.g.johnston@gmail.com
In reply to: Tom Lane (#5)
1 attachment(s)
Re: Document NULL

On Wed, May 1, 2024 at 9:47 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:

David Rowley <dgrowleyml@gmail.com> writes:

Let's bash it into shape a bit more before going any further on actual

wording.

FWIW, I want to push back on the idea of making it a tutorial section.
I too considered that, but in the end I think it's a better idea to
put it into the "main" docs, for two reasons:

Version 2 attached. Still a draft, focused on topic picking and overall
structure. Examples and links planned plus the usual semantic markup stuff.

I chose to add a new sect1 in the user guide (The SQL Language) chapter,
"Data". Don't tell Robert.

The "Data Basics" sub-section lets us readily slide this Chapter into the
main flow and here the NULL discussion feels like a natural fit. In
hindsight, the lack of a Data chapter in a Database manual seems like an
oversight. One easily made because we assume if you are here you "know"
what data is, but there is still stuff to be discussed, if nothing else to
establish a common understanding between us and our users.

David J.

Attachments:

v2-0001-Document-NULL.patchtext/x-patch; charset=US-ASCII; name=v2-0001-Document-NULL.patchDownload
From 7798121992154edab4768d7eab5a89be04730b2f Mon Sep 17 00:00:00 2001
From: "David G. Johnston" <David.G.Johnston@Gmail.com>
Date: Wed, 1 May 2024 07:45:48 -0700
Subject: [PATCH] Document NULL

---
 doc/src/sgml/data.sgml     | 169 +++++++++++++++++++++++++++++++++++++
 doc/src/sgml/filelist.sgml |   1 +
 doc/src/sgml/postgres.sgml |   1 +
 3 files changed, 171 insertions(+)
 create mode 100644 doc/src/sgml/data.sgml

diff --git a/doc/src/sgml/data.sgml b/doc/src/sgml/data.sgml
new file mode 100644
index 0000000000..2b09382494
--- /dev/null
+++ b/doc/src/sgml/data.sgml
@@ -0,0 +1,169 @@
+<chapter id="data">
+ <title>Data</title>
+
+ <para>
+  This chapter provides definitions for, and an overview of, data.
+  It discusses the basic design of the metadata related to values
+  and then goes on to describe the special value NULL which typically
+  represents &quot;unknown&quot;
+ </para>
+
+ <sect1 id="data-basics">
+  <title>Data Basics</title>
+  <para>
+   All literals, columns, variables, and expression results in PostgreSQL
+   are typed, which are listed in the next chapter.  Literals and columns
+   must only use one of the concrete types while variables can use
+   either a concrete type or a pseudo-type.  Expression results
+   are limited to concrete types and the pseudo-type record described below.
+  </para>
+  <para>
+   The pseudo-types prefixed with &quot;any&quot; implement polymorphism
+   in PostgreSQL.  Polymorphism allows a single function specification
+   to act on multiple concrete types.  At runtime, the function body
+   associates concrete types to all polymorphic types based upon the
+   conrete argument of its inputs. See ... for more details.
+  </para>
+  <para>
+   The record pseudo-type is also polymorphic in nature but allows
+   the caller of the function to specify the row-like structure of
+   output within the containing query. See ... for more details.
+   The ROW(...) expression (see ...) will also produce a record
+   result comprised of the named columns.
+  </para>
+ </sect1>
+
+  <sect1 id="data-null">
+   <title>Unknown Values (NULL)</title>
+   <para>
+    This section first introduces the meaning of NULL and then goes
+    on to explain how different parts of the system behave when faced
+    with NULL input.
+   </para>
+
+  <sect2 id="data-null-model">
+   <title>NULL in Data Models</title>
+   <para>
+    Generally NULL is assumed to mean "unknown".  However,
+    in practice meaning comes from context and so a model design may state that
+    NULL is to be used to represent "not applicable" - i.e., that a value is not
+    even possible.  SQL has only the single value NULL while there are multiple
+    concepts that people have chosen to apply it to.  In any case the behavior
+    of the system when dealing with NULL is the same regardless of the meaning
+    the given to it in the surrounding context.
+   </para>
+   <para>
+    NULL also takes on a literal meaning of "not found" when produced as the
+    result of an outer join.
+   </para>
+  </sect2>
+
+  <sect2 id="data-null-usage">
+   <title>NULL Usage</title>
+   <para>
+    As NULL is treated as a data value it, like all values, must have
+    a data type.  NULL is a valid value for all data types.
+   </para>
+
+   <para>
+    A NULL literal is written as unquoted NULL.  Its type is unknown but
+    can be cast to any concrete data type.  The [type 'string'] syntax
+    however will not work as there is no way to express NULL using single
+    quotes and unlike.
+   </para>
+
+   <para>
+    The presence of NULL in the system results in three-valued logic.
+    In binary logic every outcome is either true or false.  In
+    three-valued logic unknown, represented using a NULL value, is
+    also an outcome.  Aspects of the system that branch based upon
+    whether a condition variable is true or false thus must also
+    decide how to behave when then condition is NULL.  The remaining
+    sub-sections summarize these decisions.
+   </para>
+  </sect2>
+
+  <sect2 id="data-null-cardinalrule">
+    <title>The Cardinal Rule of NULL</title>
+   <para>
+    The cardinal rule, NULL is never equal or unequal to any non-null
+    value (or itself).  [NULL = anything yields NULL].
+    Checking for NULL has an explicit test documented
+    [here] and additionally there are distinctness tests that treat NULL like
+    a value equal to itself and unequal to any other value.
+   </para>
+   <para>
+    There is also a cardinal warning: when dealing with composite types
+    [see ...] the expressions; composite IS NULL and composite IS NOT NULL
+    are not the opposites of each other in the case where some of the
+    composite's fields are NULL.  Write NOT(composite IS NULL) instead.
+   </para>
+  </sect2>
+
+  <sect2 id="data-null-opertions">
+   <title>NULLs in Operations</title>
+   <para>
+    As a general expectation, operator invocation expressions where one of inputs
+    will result in a NULL output.
+    [add: 1 + NULL yields NULL]
+    [concatenate: 'text' || NULL yields NULL]
+    Operators that behave otherwise should document their deviation from this norm.
+   </para>
+  </sect2>
+
+  <sect2 id="data-null-functions">
+   <title>NULLs in Normal Function Calls</title>
+   <para>
+    Function specifications has a "strictness" attribute that, when set to "strict"
+    (a.k.a. "null on null input") will tell the executor to return NULL for any
+    function call having at least one NULL input value, without executing the
+    function.  Most SQL standard functions behave strictly, and in many cases
+    non-standard functions may exist that do not.
+   </para>
+  </sect2>
+
+  <sect2 id="data-null-aggregates">
+   <title>NULLs in Aggregate and Window Processing</title>
+   <para>  (needs research)
+    When executing an aggregate or window function the state tracking
+    component will remain unchanged even if the underlying processing
+    function returns NULL, whether from being defined strict (see above)
+    or simply returns a NULL value upon execution.
+   </para>
+  </sect2>
+
+  <sect2 id="data-null-filters">
+   <title>NULLs in Filters</title>
+   <para>
+    A WHERE clause that evaluates to NULL for a given row will exclude that row.
+   </para>
+  </sect2>
+
+  <sect2 id="data-null-constraints">
+   <title>NULLs in Constraints</title>
+   <para>
+    It is possible to define validation expressions on
+    tables that ensure only values passing those expressions are inserted.  While
+    this seems like it would behave the same as a filter, the choice here,
+    when an expression evaulates to NULL, is allow the row to be inserted.  See
+    [check constraints] in create table for details.
+   </para>
+   <para>
+    The NOT NULL column constraint is largely syntax sugar for the corresponding
+    column IS NOT NULL check constraint, though there are metadata differences
+    described in create table.
+   </para>
+  </sect2>
+
+  <sect2 id="data-null-grouping">
+   <title>NULLs When Grouping</title>
+   <para>
+    In the context of both DISTINCT and GROUP BY it is necessary that all inputs
+    resolve to being either equal to or not equal to all other values.  These features
+    use distinctness (see ...) instead of simple equality in order to handle
+    NULL like a definite value equal to itself and unequal to all other values.
+   </para>
+  </sect2>
+ </sect1>
+
+</chapter>
diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml
index 38ec362d8f..2b4fc79b8a 100644
--- a/doc/src/sgml/filelist.sgml
+++ b/doc/src/sgml/filelist.sgml
@@ -14,6 +14,7 @@
 
 <!-- user's guide -->
 <!ENTITY array      SYSTEM "array.sgml">
+<!ENTITY data       SYSTEM "data.sgml">
 <!ENTITY datatype   SYSTEM "datatype.sgml">
 <!ENTITY ddl        SYSTEM "ddl.sgml">
 <!ENTITY dml        SYSTEM "dml.sgml">
diff --git a/doc/src/sgml/postgres.sgml b/doc/src/sgml/postgres.sgml
index ec9f90e283..bd0e4007ee 100644
--- a/doc/src/sgml/postgres.sgml
+++ b/doc/src/sgml/postgres.sgml
@@ -101,6 +101,7 @@ break is not needed in a wider output rendering.
   </partintro>
 
   &syntax;
+  &data;
   &ddl;
   &dml;
   &queries;
-- 
2.34.1

#7Kashif Zeeshan
kashi.zeeshan@gmail.com
In reply to: David G. Johnston (#6)
Re: Document NULL

Hi David

I reviewed the documentation and it's very detailed.

Thanks
Kashif Zeeshan
Bitnine Global

On Thu, May 2, 2024 at 8:24 PM David G. Johnston <david.g.johnston@gmail.com>
wrote:

Show quoted text

On Wed, May 1, 2024 at 9:47 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:

David Rowley <dgrowleyml@gmail.com> writes:

Let's bash it into shape a bit more before going any further on actual

wording.

FWIW, I want to push back on the idea of making it a tutorial section.
I too considered that, but in the end I think it's a better idea to
put it into the "main" docs, for two reasons:

Version 2 attached. Still a draft, focused on topic picking and overall
structure. Examples and links planned plus the usual semantic markup stuff.

I chose to add a new sect1 in the user guide (The SQL Language) chapter,
"Data". Don't tell Robert.

The "Data Basics" sub-section lets us readily slide this Chapter into the
main flow and here the NULL discussion feels like a natural fit. In
hindsight, the lack of a Data chapter in a Database manual seems like an
oversight. One easily made because we assume if you are here you "know"
what data is, but there is still stuff to be discussed, if nothing else to
establish a common understanding between us and our users.

David J.

#8Laurenz Albe
laurenz.albe@cybertec.at
In reply to: David G. Johnston (#6)
Re: Document NULL

On Thu, 2024-05-02 at 08:23 -0700, David G. Johnston wrote:

Version 2 attached.  Still a draft, focused on topic picking and overall structure.

I'm fine with most of the material (ignoring ellipses and typos), except this:

+    The NOT NULL column constraint is largely syntax sugar for the corresponding
+    column IS NOT NULL check constraint, though there are metadata differences
+    described in create table.

I see a substantial difference there:

SELECT conname, contype,
pg_get_expr(conbin, 'not_null'::regclass)
FROM pg_constraint
WHERE conrelid = 'not_null'::regclass;

conname │ contype │ pg_get_expr
══════════════════════╪═════════╪══════════════════
check_null │ c │ (id IS NOT NULL)
not_null_id_not_null │ n │ ∅
(2 rows)

There is also the "attnotnull" column in "pg_attribute".

I didn't try it, but I guess that the performance difference will be measurable.
So I wouldn't call it "syntactic sugar".

Perhaps: The behavior of the NOT NULL constraint is like that of a check
constraint with IS NOT NULL.

Yours,
Laurenz Albe

#9jian he
jian.universality@gmail.com
In reply to: Laurenz Albe (#8)
Re: Document NULL

On Fri, May 3, 2024 at 2:47 PM Laurenz Albe <laurenz.albe@cybertec.at> wrote:

On Thu, 2024-05-02 at 08:23 -0700, David G. Johnston wrote:

Version 2 attached. Still a draft, focused on topic picking and overall structure.

I'm fine with most of the material (ignoring ellipses and typos), except this:

+    The NOT NULL column constraint is largely syntax sugar for the corresponding
+    column IS NOT NULL check constraint, though there are metadata differences
+    described in create table.

the system does not translate (check constraint column IS NOT NULL)
to NOT NULL constraint,
at least in domain.

for example:
create domain connotnull integer;
alter domain connotnull add not null;
\dD connotnull

drop domain connotnull cascade;
create domain connotnull integer;
alter domain connotnull add check (value is not null);
\dD

#10David G. Johnston
david.g.johnston@gmail.com
In reply to: jian he (#9)
Re: Document NULL

On Fri, May 3, 2024 at 1:14 AM jian he <jian.universality@gmail.com> wrote:

On Fri, May 3, 2024 at 2:47 PM Laurenz Albe <laurenz.albe@cybertec.at>
wrote:

On Thu, 2024-05-02 at 08:23 -0700, David G. Johnston wrote:

Version 2 attached. Still a draft, focused on topic picking and

overall structure.

I'm fine with most of the material (ignoring ellipses and typos), except

this:

+ The NOT NULL column constraint is largely syntax sugar for the

corresponding

+ column IS NOT NULL check constraint, though there are metadata

differences

+ described in create table.

the system does not translate (check constraint column IS NOT NULL)
to NOT NULL constraint,
at least in domain.

I'll change this but I was focusing on the fact you get identical
user-visible behavior with not null and a check(col is not null). Chain of
thought being we discuss the is not null operator (indirectly) already and
so not null, which is syntax as opposed to an operation/expression, can
leverage that explanation as opposed to getting its own special case. I'll
consider this some more and maybe mention the catalog dynamics a bit as
well, or at least point to them.

drop domain connotnull cascade;
create domain connotnull integer;
alter domain connotnull add check (value is not null);
\dD

This reminds me, I forgot to add commentary regarding defining a not null
constraint on a domain but the domain type surviving a left join but having
a null value.

David J.

#11Peter Eisentraut
peter@eisentraut.org
In reply to: David G. Johnston (#6)
Re: Document NULL

On 02.05.24 17:23, David G. Johnston wrote:

Version 2 attached.  Still a draft, focused on topic picking and overall
structure.  Examples and links planned plus the usual semantic markup stuff.

I chose to add a new sect1 in the user guide (The SQL Language) chapter,
"Data".

Please, let's not.

A stylistic note: "null" is an adjective. You can talk about a "null
value" or a value "is null". These are lower-cased (or maybe
title-cased). You can use upper-case when referring to SQL syntax
elements (in which case also tag it with something like <literal>), and
also to the C-language symbol (tagged with <symbol>). We had recently
cleaned this up, so I think the rest of the documentation should be
pretty consistent about this.

#12David G. Johnston
david.g.johnston@gmail.com
In reply to: Peter Eisentraut (#11)
Re: Document NULL

On Fri, May 3, 2024 at 7:10 AM Peter Eisentraut <peter@eisentraut.org>
wrote:

On 02.05.24 17:23, David G. Johnston wrote:

Version 2 attached. Still a draft, focused on topic picking and overall
structure. Examples and links planned plus the usual semantic markup

stuff.

I chose to add a new sect1 in the user guide (The SQL Language) chapter,
"Data".

Please, let's not.

If a committer wants to state the single place in the documentation to put
this I'm content to put it there while leaving my reasoning of choices in
place for future bike-shedding. My next options to decide between are the
appendix or the lead chapter in Data Types. It really doesn't fit inside
DDL IMO which is the only other suggestion I've seen (and an uncertain, or
at least unsubstantiated, one) and a new chapter meets both criteria Tom
laid out, so long as this is framed as more than just having to document
null values.

A stylistic note: "null" is an adjective. You can talk about a "null
value" or a value "is null".

Will do.

David J.

#13Tom Lane
tgl@sss.pgh.pa.us
In reply to: David G. Johnston (#12)
Re: Document NULL

"David G. Johnston" <david.g.johnston@gmail.com> writes:

On Fri, May 3, 2024 at 7:10 AM Peter Eisentraut <peter@eisentraut.org>
wrote:

On 02.05.24 17:23, David G. Johnston wrote:

I chose to add a new sect1 in the user guide (The SQL Language) chapter,
"Data".

Please, let's not.

If a committer wants to state the single place in the documentation to put
this I'm content to put it there while leaving my reasoning of choices in
place for future bike-shedding. My next options to decide between are the
appendix or the lead chapter in Data Types. It really doesn't fit inside
DDL IMO which is the only other suggestion I've seen (and an uncertain, or
at least unsubstantiated, one) and a new chapter meets both criteria Tom
laid out, so long as this is framed as more than just having to document
null values.

I could see going that route if we actually had a chapter's worth of
material to put into "Data". But we don't, there's really only one
not-very-long section. Robert has justifiably complained about that
sort of thing elsewhere in the docs, and I don't want to argue with
him about why it'd be OK here.

Having said that, I reiterate my proposal that we make it a new
<sect1> under DDL, before 5.2 Default Values which is the first
place in ddl.sgml that assumes you have heard of nulls. Sure,
it's not totally ideal, but noplace is going to be entirely
perfect. I can see some attraction in dropping it under Data Types,
but (a) null is a data-type-independent concept, and (b) the
chapters before that are just full of places that assume you have
heard of nulls. Putting it in an appendix is similarly throwing
to the wind any idea that you can read the documentation in order.

Really, even the syntax chapter has some mentions of nulls.
If we did have a "Data" chapter there would be a case for
putting it as the *first* chapter of Part II.

I suppose we could address the nonlinearity gripe with a bunch
of cross-reference links, in which case maybe something under
Data Types is the least bad approach.

regards, tom lane

#14David G. Johnston
david.g.johnston@gmail.com
In reply to: Tom Lane (#13)
Re: Document NULL

On Fri, May 3, 2024 at 8:44 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

"David G. Johnston" <david.g.johnston@gmail.com> writes:

On Fri, May 3, 2024 at 7:10 AM Peter Eisentraut <peter@eisentraut.org>
wrote:

On 02.05.24 17:23, David G. Johnston wrote:

I chose to add a new sect1 in the user guide (The SQL Language)

chapter,

"Data".

Please, let's not.

If a committer wants to state the single place in the documentation to

put

this I'm content to put it there while leaving my reasoning of choices in
place for future bike-shedding. My next options to decide between are

the

appendix or the lead chapter in Data Types. It really doesn't fit inside
DDL IMO which is the only other suggestion I've seen (and an uncertain,

or

at least unsubstantiated, one) and a new chapter meets both criteria Tom
laid out, so long as this is framed as more than just having to document
null values.

I could see going that route if we actually had a chapter's worth of
material to put into "Data". But we don't, there's really only one
not-very-long section. Robert has justifiably complained about that
sort of thing elsewhere in the docs, and I don't want to argue with
him about why it'd be OK here.

OK. I was hopeful that once the Chapter existed the annoyance of it being
short would be solved by making it longer. If we ever do that, moving this
section under there at that point would be an option.

Having said that, I reiterate my proposal that we make it a new
<sect1> under DDL, before 5.2 Default Values which is the first
place in ddl.sgml that assumes you have heard of nulls.

I will go with this and remove the "Data Basics" section I wrote, leaving
it to be just a discussion about null values. The tutorial is the only
section that really needs unique wording to fit in. No matter where we
decide to place it otherwise the core content will be the same, with maybe
a different section preface to tie it in.

Putting it in an appendix is similarly throwing

to the wind any idea that you can read the documentation in order.

I think we can keep the entire camel out of the tent while letting it get a
whiff of what is inside. It would be a summary reference linked to from
the various places that mention null values.
https://en.wikipedia.org/wiki/Camel%27s_nose

I suppose we could address the nonlinearity gripe with a bunch
of cross-reference links, in which case maybe something under
Data Types is the least bad approach.

Yeah, there is circularity here that is probably impossible to
completely resolve.

David J.

#15David G. Johnston
david.g.johnston@gmail.com
In reply to: David G. Johnston (#14)
1 attachment(s)
Re: Document NULL

On Fri, May 3, 2024 at 9:00 AM David G. Johnston <david.g.johnston@gmail.com>
wrote:

On Fri, May 3, 2024 at 8:44 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

Having said that, I reiterate my proposal that we make it a new

<sect1> under DDL, before 5.2 Default Values which is the first

place in ddl.sgml that assumes you have heard of nulls.

I will go with this and remove the "Data Basics" section I wrote, leaving
it to be just a discussion about null values. The tutorial is the only
section that really needs unique wording to fit in. No matter where we
decide to place it otherwise the core content will be the same, with maybe
a different section preface to tie it in.

v3 Attached.

Probably at the 90% complete mark. Minimal index entries, not as thorough
a look-about of the existing documentation as I'd like. Probably some
wording and style choices to tweak. Figured better to get feedback now
before I go into polish mode. In particular, tweaking and re-running the
examples.

Yes, I am aware of my improper indentation for programlisting and screen. I
wanted to be able to use the code folding features of my editor. Those can
be readily un-indented in the final version.

The changes to func.sgml is basically one change repeated something like 20
times with tweaks for true/false. Plus moving the discussion regarding the
SQL specification into the new null handling section.

It took me doing this to really understand the difference between row
constructors and composite typed values, especially since array
constructors produce array typed values and the constructor is just an
unimportant implementation option while row constructors introduce
meaningfully different behaviors when used.

My plan is to have a v4 out next week, without or without a review of this
draft, but then the subsequent few weeks will probably be a bit quiet.

David J.

Attachments:

v3-0001-Document-NULL.patchtext/x-patch; charset=US-ASCII; name=v3-0001-Document-NULL.patchDownload
From bea784bd683f7e022dbfb3d72832d09fc7754913 Mon Sep 17 00:00:00 2001
From: "David G. Johnston" <David.G.Johnston@Gmail.com>
Date: Wed, 1 May 2024 07:45:48 -0700
Subject: [PATCH] Document NULL

---
 doc/src/sgml/ddl.sgml        |   2 +
 doc/src/sgml/filelist.sgml   |   1 +
 doc/src/sgml/func.sgml       | 268 ++++++-------
 doc/src/sgml/nullvalues.sgml | 719 +++++++++++++++++++++++++++++++++++
 4 files changed, 837 insertions(+), 153 deletions(-)
 create mode 100644 doc/src/sgml/nullvalues.sgml

diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 026bfff70f..68a0fe698d 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -168,6 +168,8 @@ DROP TABLE products;
   </para>
  </sect1>
 
+ &nullvalues;
+
  <sect1 id="ddl-default">
   <title>Default Values</title>
 
diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml
index 38ec362d8f..882752e88f 100644
--- a/doc/src/sgml/filelist.sgml
+++ b/doc/src/sgml/filelist.sgml
@@ -21,6 +21,7 @@
 <!ENTITY indices    SYSTEM "indices.sgml">
 <!ENTITY json       SYSTEM "json.sgml">
 <!ENTITY mvcc       SYSTEM "mvcc.sgml">
+<!ENTITY nullvalues SYSTEM "nullvalues.sgml">
 <!ENTITY parallel   SYSTEM "parallel.sgml">
 <!ENTITY perform    SYSTEM "perform.sgml">
 <!ENTITY queries    SYSTEM "queries.sgml">
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 17c44bc338..98fba7742c 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -23295,7 +23295,8 @@ MERGE INTO products p
    This section describes the <acronym>SQL</acronym>-compliant subquery
    expressions available in <productname>PostgreSQL</productname>.
    All of the expression forms documented in this section return
-   Boolean (true/false) results.
+   <link linkend="nullvalues">three-valued</link> typed
+   results (true, false, or null).
   </para>
 
   <sect2 id="functions-subquery-exists">
@@ -23357,19 +23358,17 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>IN</token>
+   is <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result.
-   The result of <token>IN</token> is <quote>true</quote> if any equal subquery row is found.
-   The result is <quote>false</quote> if no equal row is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any equal subquery row is found.
+   The result is <quote>false</quote> if no equal row is found.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>IN</token> construct will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.
   </para>
 
   <para>
@@ -23386,21 +23385,18 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.
+   The result of <token>IN</token> is <quote>false</quote> if the subquery returns no rows,
+   otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result.
-   The result of <token>IN</token> is <quote>true</quote> if any equal subquery row is found.
-   The result is <quote>false</quote> if no equal row is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any equal subquery row is found.
+   The result is <quote>false</quote> if no equal row is found.
   </para>
 
   <para>
-   As usual, null values in the rows are combined per
-   the normal rules of SQL Boolean expressions.  Two rows are considered
-   equal if all their corresponding members are non-null and equal; the rows
-   are unequal if any corresponding members are non-null and unequal;
-   otherwise the result of that row comparison is unknown (null).
-   If all the per-row results are either unequal or null, with at least one
-   null, then the result of <token>IN</token> is null.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -23412,20 +23408,17 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 </synopsis>
 
   <para>
-   The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
-   is evaluated and compared to each row of the subquery result.
-   The result of <token>NOT IN</token> is <quote>true</quote> if only unequal subquery rows
-   are found (including the case where the subquery returns no rows).
+   The right-hand side is a parenthesized subquery, which must return exactly one column.
+   The result of <token>NOT IN</token> is <quote>true</quote> if the subquery returns no rows,
+   otherwise the left-hand expression is evaluated and compared to each row of the subquery result.
+   The result is <quote>true</quote> if only unequal subquery rows are found.
    The result is <quote>false</quote> if any equal row is found.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>NOT IN</token> construct will be null, not true.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
+   tests are OR'd together.
   </para>
 
   <para>
@@ -23442,21 +23435,18 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.
+   The result of <token>NOT IN</token> is <quote>true</quote> if the subquery returns no rows,
+   otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result.
-   The result of <token>NOT IN</token> is <quote>true</quote> if only unequal subquery rows
-   are found (including the case where the subquery returns no rows).
+   The result is <quote>true</quote> if only unequal subquery rows are found.
    The result is <quote>false</quote> if any equal row is found.
   </para>
 
   <para>
-   As usual, null values in the rows are combined per
-   the normal rules of SQL Boolean expressions.  Two rows are considered
-   equal if all their corresponding members are non-null and equal; the rows
-   are unequal if any corresponding members are non-null and unequal;
-   otherwise the result of that row comparison is unknown (null).
-   If all the per-row results are either unequal or null, with at least one
-   null, then the result of <token>NOT IN</token> is null.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -23470,13 +23460,13 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>ANY</token> is
+   <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ANY</token> is <quote>true</quote> if any true result is obtained.
-   The result is <quote>false</quote> if no true result is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any true result is obtained.
+   The result is <quote>false</quote> if no true result is found.
   </para>
 
   <para>
@@ -23485,11 +23475,10 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   </para>
 
   <para>
-   Note that if there are no successes and at least one right-hand row yields
-   null for the operator's result, the result of the <token>ANY</token> construct
-   will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -23507,16 +23496,19 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.  The result of <token>ANY</token> is
+   <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result,
    using the given <replaceable>operator</replaceable>.
-   The result of <token>ANY</token> is <quote>true</quote> if the comparison
-   returns true for any subquery row.
-   The result is <quote>false</quote> if the comparison returns false for every
-   subquery row (including the case where the subquery returns no
-   rows).
-   The result is NULL if no comparison with a subquery row returns true,
-   and at least one comparison returns NULL.
+   The result is <quote>true</quote> if the comparison returns true for any subquery row.
+   The result is <quote>false</quote> if the comparison returns false for every subquery row.
+  </para>
+
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are OR'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -23534,15 +23526,20 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>ALL</token> is
+   <quote>true</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ALL</token> is <quote>true</quote> if all rows yield true
-   (including the case where the subquery returns no rows).
+   The result is <quote>true</quote> if all rows yield true.
    The result is <quote>false</quote> if any false result is found.
-   The result is NULL if no comparison with a subquery row returns false,
-   and at least one comparison returns NULL.
+  </para>
+
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -23563,22 +23560,21 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.  The result of <token>ALL</token> is
+   <quote>true</quote> if the subquery returns no rows, otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result,
    using the given <replaceable>operator</replaceable>.
-   The result of <token>ALL</token> is <quote>true</quote> if the comparison
-   returns true for all subquery rows (including the
-   case where the subquery returns no rows).
-   The result is <quote>false</quote> if the comparison returns false for any
-   subquery row.
-   The result is NULL if no comparison with a subquery row returns false,
-   and at least one comparison returns NULL.
+   The result is <quote>true</quote> if the comparison returns true for all subquery rows.
+   The result is <quote>false</quote> if the comparison returns false for any subquery row.
   </para>
 
   <para>
-   See <xref linkend="row-wise-comparison"/> for details about the meaning
-   of a row constructor comparison.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
+
   </sect2>
 
   <sect2 id="functions-subquery-single-row-comp">
@@ -23603,6 +23599,14 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    compared row-wise to the single subquery result row.
   </para>
 
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-composites"/>, the result cannot be <quote>true</quote> in the
+   presence of null valued fields in either the row constructor or the subquery result row, as
+   the individual field tests are AND'd together.
+   Note that <literal>IS DISTINCT FROM</literal> is not an operator.
+  </para>
+
   <para>
    See <xref linkend="row-wise-comparison"/> for details about the meaning
    of a row constructor comparison.
@@ -23670,7 +23674,8 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    <productname>PostgreSQL</productname> extensions; the rest are
    <acronym>SQL</acronym>-compliant.
    All of the expression forms documented in this section return
-   Boolean (true/false) results.
+   <link linkend="nullvalues">three-valued</link> boolean typed
+   results (true, false, or null).
   </para>
 
   <sect2 id="functions-comparisons-in-scalar">
@@ -23683,24 +23688,13 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   <para>
    The right-hand side is a parenthesized list
    of expressions.  The result is <quote>true</quote> if the left-hand expression's
-   result is equal to any of the right-hand expressions.  This is a shorthand
-   notation for
-
-<synopsis>
-<replaceable>expression</replaceable> = <replaceable>value1</replaceable>
-OR
-<replaceable>expression</replaceable> = <replaceable>value2</replaceable>
-OR
-...
-</synopsis>
+   result is equal to any of the right-hand expressions.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand expression yields
-   null, the result of the <token>IN</token> construct will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence null values since the multiple equality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -23714,35 +23708,15 @@ OR
   <para>
    The right-hand side is a parenthesized list
    of expressions.  The result is <quote>true</quote> if the left-hand expression's
-   result is unequal to all of the right-hand expressions.  This is a shorthand
-   notation for
-
-<synopsis>
-<replaceable>expression</replaceable> &lt;&gt; <replaceable>value1</replaceable>
-AND
-<replaceable>expression</replaceable> &lt;&gt; <replaceable>value2</replaceable>
-AND
-...
-</synopsis>
+   result is unequal to all of the right-hand expressions.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand expression yields
-   null, the result of the <token>NOT IN</token> construct will be null, not true
-   as one might naively expect.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of null values since the multiple inequality
+   tests are OR'd together.
   </para>
 
-  <tip>
-  <para>
-   <literal>x NOT IN y</literal> is equivalent to <literal>NOT (x IN y)</literal> in all
-   cases.  However, null values are much more likely to trip up the novice when
-   working with <token>NOT IN</token> than when working with <token>IN</token>.
-   It is best to express your condition positively if possible.
-  </para>
-  </tip>
   </sect2>
 
   <sect2 id="functions-comparisons-any-some">
@@ -23755,30 +23729,26 @@ AND
 
   <para>
    The right-hand side is a parenthesized expression, which must yield an
-   array value.
-   The left-hand expression
+   array value. The result of <token>ANY</token> is
+   <quote>false</quote> if the array has zero element, otherwise
+   the left-hand expression
    is evaluated and compared to each element of the array using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ANY</token> is <quote>true</quote> if any true result is obtained.
-   The result is <quote>false</quote> if no true result is found (including the
-   case where the array has zero elements).
+   The result is <quote>true</quote> if any true result is obtained.
+   The result is <quote>false</quote> if no true result is found.
   </para>
 
   <para>
-   If the array expression yields a null array, the result of
-   <token>ANY</token> will be null.  If the left-hand expression yields null,
-   the result of <token>ANY</token> is ordinarily null (though a non-strict
-   comparison operator could possibly yield a different result).
-   Also, if the right-hand array contains any null elements and no true
-   comparison result is obtained, the result of <token>ANY</token>
-   will be null, not false (again, assuming a strict comparison operator).
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both elements and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
    <token>SOME</token> is a synonym for <token>ANY</token>.
+   <token>IN</token> is equivalent to <literal>= ANY</literal>.
   </para>
   </sect2>
 
@@ -23792,26 +23762,27 @@ AND
   <para>
    The right-hand side is a parenthesized expression, which must yield an
    array value.
-   The left-hand expression
+   The result of <token>ALL</token> is
+   <quote>true</quote> if the array has zero elements, otherwise
+   the left-hand expression
    is evaluated and compared to each element of the array using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ALL</token> is <quote>true</quote> if all comparisons yield true
-   (including the case where the array has zero elements).
+   The result is <quote>true</quote> if all comparisons yield true.
    The result is <quote>false</quote> if any false result is found.
   </para>
 
   <para>
-   If the array expression yields a null array, the result of
-   <token>ALL</token> will be null.  If the left-hand expression yields null,
-   the result of <token>ALL</token> is ordinarily null (though a non-strict
-   comparison operator could possibly yield a different result).
-   Also, if the right-hand array contains any null elements and no false
-   comparison result is obtained, the result of <token>ALL</token>
-   will be null, not true (again, assuming a strict comparison operator).
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both elements and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
+  </para>
+
+  <para>
+   <token>NOT IN</token> is equivalent to <literal>&lt;&gt; ALL</literal>.
   </para>
+
   </sect2>
 
   <sect2 id="row-wise-comparison">
@@ -23896,20 +23867,11 @@ AND
 </synopsis>
 
   <para>
-   The SQL specification requires row-wise comparison to return NULL if the
-   result depends on comparing two NULL values or a NULL and a non-NULL.
-   <productname>PostgreSQL</productname> does this only when comparing the
-   results of two row constructors (as in
-   <xref linkend="row-wise-comparison"/>) or comparing a row constructor
-   to the output of a subquery (as in <xref linkend="functions-subquery"/>).
-   In other contexts where two composite-type values are compared, two
-   NULL field values are considered equal, and a NULL is considered larger
-   than a non-NULL.  This is necessary in order to have consistent sorting
-   and indexing behavior for composite types.
-  </para>
-
-  <para>
-   Each side is evaluated and they are compared row-wise.  Composite type
+   Each side is evaluated and they are compared row-wise.
+   As discussed in <xref linkend="nullvalues-multielementcomparison"/>,
+   null values are treated as being equal to other null values and greater
+   than all non-null values.
+   Composite type
    comparisons are allowed when the <replaceable>operator</replaceable> is
    <literal>=</literal>,
    <literal>&lt;&gt;</literal>,
diff --git a/doc/src/sgml/nullvalues.sgml b/doc/src/sgml/nullvalues.sgml
new file mode 100644
index 0000000000..d77235a527
--- /dev/null
+++ b/doc/src/sgml/nullvalues.sgml
@@ -0,0 +1,719 @@
+<sect1 id="nullvalues">
+ <title>Null Values</title>
+
+ <indexterm>
+  <primary>null value</primary>
+ </indexterm>
+
+ <para>
+  This section first introduces the concept of null values and then goes
+  on to explain how different parts of the system behave when provided
+  one or more null value inputs.  Examples throughout this section
+  can be executed so long as the following table and rows are created first.
+ </para>
+
+ <programlisting>
+  CREATE TABLE null_examples (
+    id bigint PRIMARY KEY,
+    value integer NULL
+  );
+  INSERT INTO null_examples
+  VALUES (1, 1), (2, NULL), (3, 4);
+ </programlisting>
+
+ <sect2 id="nullvalues-model">
+  <title>Meaning</title>
+  <para>
+   Generally a null value is assumed to mean "unknown", but other interpretations
+   are common.  A data model design may state that a null value
+   is to be used to represent "not applicable" - i.e., that a value is not
+   even possible.  The null value also takes on a literal meaning of "not found"
+   when produced as the result of an outer join.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-usage">
+  <title>Usage</title>
+  <para>
+   A null value, like all values, must have a data type, and is valid for all data types.
+  </para>
+  <para>
+   A null value literal is written as unquoted, case insensitive, NULL.
+   Its type is the pseudo-type unknown but can be cast to any concrete data type.
+   The <link linkend="sql-syntax-constants-generic"><literal>type 'string'</literal></link>
+   syntax, however, will not work as there is no way to express
+   the <literal>NULL</literal> using single quotes.
+  </para>
+  <para>
+  <programlisting>
+  SELECT
+    NULL,
+    pg_typeof(null),
+    pg_typeof(NuLl::text),
+    cast(null as text);
+  </programlisting>
+  <screen>
+   ?column? | pg_typeof | pg_typeof | text
+  ----------+-----------+-----------+------
+            | unknown   | text      |
+  </screen>
+  </para>
+  <para>
+   <programlisting>
+   SELECT text NULL;
+   </programlisting>
+   <screen>
+   ERROR:  column "text" does not exist
+   LINE 1: select text NUll;
+   </screen>
+  </para>
+  <para>
+   The presence of null values in the system results in three-valued logic.
+   In binary logic every outcome is either true or false.  In
+   three-valued logic unknown, represented using a null value, is
+   also an outcome.  Put a bit more formally, the
+   Law of the Excluded Middle does not hold: i.e.,
+   P OR NOT(p) != true; for all p.
+  </para>
+  <para>
+   Aspects of the system that branch based upon
+   whether a condition variable is true or false must therefore
+   decide how to behave when then input condition is a null value.
+   The remaining sub-sections summarize these decisions.
+  </para>
+  <para>
+   In there are two broad classes of such comparison tests: first determining
+   whehow a given value compares to one or more other values, and second, determining
+   how two multi-element values compare to each other.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-cardinalrule">
+  <title>Distinctness - Overcoming the Cardinal Rule of Null Values</title>
+  <para>
+   The cardinal rule, a given null value is never
+   <link linkend="functions-comparison-op-table">equal or unequal</link>
+   to any other non-null.
+  <programlisting>
+   SELECT
+    NULL = NULL as "N = N", NULL != NULL as "N != N",
+    1 = NULL as "1 = N", 1 != NULL as "1 != N",
+    1 = 1 as "1 = 1", 1 != 1 as "1 != 1";
+  </programlisting>
+  <screen>
+   N = N | N != N | 1 = N | 1 != N | 1 = 1 | 1 != 1
+  -------+--------+-------+--------+-------+--------
+         |        |       |        | t     | f
+  </screen>
+   However, as with many rules, there are exceptions
+   <link linkend="nullvalues-multielementcomparison">noted below</link>.  Specifically, when
+   when the two compared values are part of a larger multi-element value.
+   <programlisting>
+     select array[1,2]=array[1,null];
+    </programlisting>
+    <screen>
+      ?column?
+     ----------
+      f
+     (1 row)
+    </screen>
+  </para>
+  <para>
+   Because of this SQL specification mandated rule  checking for a null value has an
+   explicit<literal>IS NULL</literal> test,
+   and additionally there are distinctness tests
+   (e.g., <literal>IS DISTINCT</literal>, and <literal>IS TRUE</literal>)
+   that consider a null value equal to another null value and unequal
+   to any other value. These and other tests are described in
+   <xref linkend="functions-comparison-pred-table"></xref>
+   <programlisting>
+    SELECT id, value,
+     value IS NULL as "IS N",
+     value IS DISTINCT FROM id as "IS D",
+     value != id as "IS !="
+    FROM null_examples;
+   </programlisting>
+   <screen>
+    id | value | IS N | IS D | IS !=
+   ----+-------+------+------+-------
+     1 |     1 | f    | f    | f
+     2 |       | t    | t    |
+     3 |     4 | f    | t    | t
+   </screen>
+  </para>
+  <para>
+   There is also a cardinal warning: when dealing with
+   <link linkend="rowtypes">composite types</link>
+   expressions; <literal>composite IS NULL</literal>
+   and <literal>composite IS NOT NUll</literal>
+   are not the opposites of each other in the case where some,
+   but not all, of the composite's fields are null values.
+   (The case where all fields are null is indistinguishable
+   from the composite as a whole being null.)
+   Write <literal>NOT(composite IS NULL)</literal> instead.
+  <programlisting>
+   SELECT
+     c,
+     c IS NULL as "c IS N",
+     NOT(c IS NULL) as "NOT c IS N",
+     c IS NOT NULL as "c IS NOT N",
+     ROW(value, value) IS NULL as "ROW(v,v) IS N",
+     ROW(value, value) IS NOT NULL as "ROW(v,v) IS NOT N"
+   FROM null_examples AS c;
+  </programlisting>
+  <screen>
+      c   | c IS N | NOT c IS N | c IS NOT N | ROW(v,v) IS N | ROW(v,v) IS NOT N
+   -------+--------+------------+------------+---------------+-------------------
+    (1,1) | f      | t          | t          | f             | t
+    (2,)  | f      | t          | f          | t             | f
+    (3,4) | f      | t          | t          | f             | t
+  </screen>
+   See the <link linkend="nullvalues-multielement">multi-element
+   testing section</link> below for an explanation.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-operations">
+  <title>Null Valued Operands</title>
+  <para>
+   As a general expectation, operator invocation expressions where one of inputs
+   is a null value will result in a null valued output.
+  <programlisting>
+   SELECT
+    1 + null as "Add",
+    'text' || null as "Concatenate";
+  </programlisting>
+  <screen>
+    Add | Concatenate
+   -----+-------------
+        |
+  </screen>
+   Operators that behave otherwise should document their deviation from this norm.
+  </para>
+  <para>
+   A notable example of this is the <literal>IN</literal> operator, which
+   uses equality, not distinctness, for testing.
+   <programlisting>
+    SELECT
+     1 IN (1, null) as "In Present",
+     1 IN (2, null) as "In MIssing",
+     null IN (1, 2) as "N In Non-N",
+     null IN (null, 2) as "N In N";
+   </programlisting>
+   <screen>
+    In Present | In Missing | N In Non-N | N In N
+   ------------+------------+------------+--------
+    t          |            |            |
+   </screen>
+   This is just an extension of the multi-element testing behavior described
+   <link linkend="nullvalues-multielement">below</link>.
+  </para>
+  <para>
+   Experience shows that <literal>CASE</literal> expressions are also prone
+   to bugs since their format encourages binary logic thinking while a
+   <literal>WHEN</literal> test will not consider a null value to be a match.
+   <programlisting>
+    SELECT id, value,
+     CASE WHEN id = value THEN 'Equal' ELSE 'Not Equal' END as "Affirm",
+     CASE WHEN id != value THEN 'Not Equal' ELSE 'Equal' END as "Negate",
+     CASE WHEN value IS NULL THEN 'Null'
+          WHEN id = value THEN 'Equal'
+          ELSE 'Not Equal' END as "Safe Affirm",
+     CASE WHEN value IS NULL THEN 'Null'
+          WHEN id != value THEN 'Not Equal'
+          ELSE 'Equal' END as "Safe Negate"
+    FROM null_examples;
+   </programlisting>
+   <screen>
+    id | value |  Affirm   |  Negate   | Safe Affirm | Safe Negate
+   ----+-------+-----------+-----------+-------------+-------------
+     1 |     1 | Equal     | Equal     | Equal       | Equal
+     2 |       | Not Equal | Equal     | Null        | Null
+     3 |     4 | Not Equal | Not Equal | Not Equal   | Not Equal
+   </screen>
+  </para>
+  <para>
+   The boolean operators <literal>AND</literal> and <literal>OR</literal>
+   will ignore the null value input if the other input is sufficient to
+   to determine the outcome.
+   <programlisting>
+    SELECT
+     true OR null as "T or N",
+     false OR null as "F or N",
+     true AND null  as "T and N",
+     false AND null  as "F and N";
+   </programlisting>
+   <screen>
+     T or N | F or N | T and N | F and N
+    --------+--------+---------+---------
+     t      |        |         | f
+   </screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-composites">
+  <title>Null Valued Composite Fields</title>
+  <para>
+   When a composite type is used, a null value can be assigned to any of its fields.
+   So long as at least one field is non-null the composite value as whole exists
+   and an IS NULL test on it will return false.
+  </para>
+  <para>
+   The IS NOT NULL test on a composite performs a test the checks whether
+   all fields of the composite have non-null values.  This is not the same
+   as a non-null composite value.  Specifically, if the composite value has
+   a null valued field then both this test and the IS NULL test will return false.
+  </para>
+  <para>
+   Please read <xref linkend="composite-type-comparison"/> for a complete treatment
+   on how <productname>PostgreSQL</productname> handle row-wise comparison.  The
+   next two multi-element parts of this section discuss those comparisons in the
+   presence of null valued fields and also in terms of the SQL specification.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-multielement">
+  <title>Testing Multi-Element Values with Null Elements</title>
+  <para>
+   Arrays and composite types are multi-element types.  Here we also consider non-empty
+   <link linkend="functions-subquery">subquery results</link>
+   and the list of values specified in the
+   <link linkend="functions-comparisons-in-scalar">IN test</link>.
+   When a test is performed on one of these multi-element values
+   the system will iterate over each element, or pair of elements if the test is
+   <link linkend="row-wise-comparison">comparing two row constructors</link> to each other,
+   left-to-right, combining the results using the boolean operations
+   <link linkend="nullvalues-operations">discussed above</link>. For tests that
+   require an exhaustive search, (e.g., <literal>ALL</literal>, <literal>NOT IN</literal>)
+   the search effectively ends when a false result is found (<literal>AND</literal> combiners).
+   For tests that simply require a true result, (e.g., <literal>ANY</literal>,
+   <literal>IN</literal>) the search effectively ends when a true result is found
+   (<literal>OR</literal> combiners). Therefore:
+   <simplelist>
+    <member>
+     <literal>IN</literal> and <literal>ANY</literal>
+     (<literal>OR</literal>) cannot produce a false result in the presence of null, and
+    </member>
+    <member>
+     <literal>NOT IN</literal> and <literal>ALL</literal>
+     (<literal>AND</literal>) cannot produce a true result in the presence of null.
+    </member>
+   </simplelist>
+   This is because any exhaustive search will produce at least one null value result
+   that cannot be ignored.
+  </para>
+  <para>
+   The SQL specification requires that non-exhaustive
+   (e.g., <literal>IN</literal> and <literal>ANY</literal>) subquery tests
+   return false when there are no rows in the subquery result, and return true
+   for the exhaustive tests (i.e., <literal>ALL</literal>).
+  </para>
+  <para>
+   Note that the <link linkend="nullvalues-cardinalrule">cardinal warning</link>
+   noted above is just the application of this behavior to the
+   <literal>IS NULL</literal> and <literal>IS NOT NULL</literal>
+   tests, which are both exhaustive search tests guaranteed to produce at least one false result
+   when the composite has a mix of null and non-null values.
+  </para>
+  <para>
+   Note that the rules above are applied to situation with a predicate or a scalar value
+   are being compared to a multi-element value.  The rules when two multi-element values are compared
+   to each other are discussed <link linkend="nullvalues-multielementcomparison">next</link>.
+   The two row constructor comparison case included above is also noted below.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-multielementcomparison">
+  <title>Multi-Element Comparisons</title>
+  <para>
+   The <link linkend="nullvalues-multielement">prior section</link> discussed applying
+   a predicate or a scalar value check element-wise across a multi-element value.
+   This section discusses
+   comparing two multi-element values to each other.  As both array and composite typed values
+   can be stored within an index, and comparing two values in that context must not produce
+   a null valued result, considerations are made to adhere to the SQL specification where
+   possible while still making indexes, which the specification is silent on, functional.
+   Specifically, except when comparing two row constructors, null values are considered
+   equal to other null values and greater than all non-null values.
+  </para>
+  <para>
+   There are five pair-wise comparison situations to consider:
+   element-wise when the inputs are arrays, and row-wise when the inputs can be either
+   row constructors or composite typed values.  While these four later combinations seem similar,
+   the fact that row constructors are query literals, while composite typed values can be stored,
+   brings about important differences in how they are treated.  Please read
+   <xref linkend="composite-type-comparison"/> for a fuller treatment of this topic.  Here
+   we briefly recap the five different sitautions in the presence of null values.
+  </para>
+  <sect3 id="nullvalues-multielementcomparison-array">
+   <title>Element-wise Comparisons</title>
+   <para>
+    First,  null values within an array compare as equal to each other and greater than all
+    non-null values, regardless of whether the comparison involves
+    <link linkend="sql-syntax-array-constructors">array constructors</link> or array typed values.
+    <programlisting>
+     select array[1,2]=array[1,null], s, t, s = t, t &gt; s
+     from
+     (values (array[1,2])) sv (s),
+     (values (array[1,null::integer])) st (t);
+    </programlisting>
+    <screen>
+     ?column? |   s   |    t     | ?column? | ?column?
+    ----------+-------+----------+----------+----------
+     f        | {1,2} | {1,NULL} | f        | t
+    </screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-rowconstructor">
+   <title>Row-Wise Mutual Row Constructor Comparisons</title>
+   <para>
+    In this situation null values produce unknown when compared to all values.
+    <programlisting>
+     select (1,2)=(1,null), (1,null::integer)=(1,null);
+    </programlisting>
+    <screen>
+      ?column? | ?column?
+     ----------+----------
+               |
+     (1 row)
+    </screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-composite">
+   <title>Row-Wise Composite Involved Comparisons</title>
+   <para>
+    In these three situations null values are considered equal to each other and greater than
+    all non-null value.
+   </para>
+   <programlisting>
+    select s, t, s = t, t &lt; (1,2), t = (1,null::integer)
+    from (values ((1,2))) sv (s),
+         (values ((1,null::integer))) st (t);
+   </programlisting>
+   <screen>
+       s   |  t   | ?column? | ?column? | ?column?
+    -------+------+----------+----------+----------
+     (1,2) | (1,) | f        | f        | t
+   </screen>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-sqlconformance">
+   <title>SQL Conformance</title>
+   <para>
+    The SQL specification requires row-wise comparison to return NULL if the
+    result depends on comparing two NULL values or a NULL and a non-NULL.
+    <productname>PostgreSQL</productname> does this only when comparing the
+    results of two row constructors (as in
+    <xref linkend="row-wise-comparison"/>) or comparing a row constructor
+    to the output of a subquery (as in <xref linkend="functions-subquery"/>).
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-functions">
+  <title>Null Valued Arguments in Normal Function Calls</title>
+  <para>
+   <link linkend="sql-createfunction">Function specifications</link>
+   have a "strictness" attribute that, when set to "strict"
+   (a.k.a. "null on null input") will tell the executor to return a null value for any
+   function call having at least one null valued input, without executing the
+   function.
+  </para>
+  <para>
+   Most functions, especially single argument functions, are defined with strict because without
+   non-null values to act upon they cannot produce a meaningful result.  However, for multi-argument
+   functions, especially <link linkend="xfunc-sql-variadic-functions">variadic functions</link>
+   like concatenate, null values often are simply ignored.
+   This can be different than the choice made by a binary operator performing the same function,
+   like for concatenating text, but not always, like concatenating an element onto an array.
+   <programlisting>
+    SELECT
+     lower(null::text) as "Lower",
+     left('text', null) as "Left",
+     'one' || null as "|| Text Op",
+     concat('one', null) as "concat Text Func",
+     array_append(array[1], null) as "append([], null)",
+     array[1]::integer[] || null::integer as "[] || null",
+     array[1]::integer[] || null::integer[] as "[] || null[]";
+   </programlisting>
+   <screen>
+    Lower | Left | || Text Op | concat Text Func | append([], null) | [] || null | [] || null[]
+   -------+------+------------+------------------+------------------+------------+--------------
+          |      |            | one              | {1,NULL}         | {1,NULL}   | {1}
+   </screen>
+   In short, please read the documentation for the functions you use if they may receive null inputs
+   to understand how they will behave.  Send a documentation comment pointing out any functions
+   that do not behave strictly but whose actual behavior in the presence of null valued input
+   is not described or readily inferred.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-aggregates">
+  <title>Null Valued Arguments in Aggregate and Window Processing</title>
+  <para>
+   When executing an aggregate or window function the state tracking
+   component will remain unchanged even if the underlying processing
+   function returns a null value, whether from being defined strict
+   or it simply returns a null value upon execution.  The aggregation
+   routine will usually ignore the null value and continue processing,
+   as demonstrated in <literal>count(value)</literal> below.
+   <programlisting>
+    SELECT
+     count(*) as "Count",
+     count(value) as "Count Value",
+     count(null_examples) as "Count Composite",
+     count(row(value, value)) as "Count Row"
+    FROM null_examples;
+   </programlisting>
+   <screen>
+    Count | Count Value | Count Composite | Count Row
+   -------+-------------+-----------------+-----------
+        3 |           2 |               3 |         3
+   </screen>
+   Notice the "Count Row" outcome, though.  While we noted in the cardinal warning
+   that a composite whose fields are all null values is indistinguishable from
+   a null value of composite type, the count aggregate does indeed distinguish them,
+   recognizing and counting the non-null composite value produced by the
+   <link linkend="sql-syntax-row-constructors">row constructor</link>
+   <literal>count(row(value, value))</literal>.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-filters">
+  <title>Null Values in Filters</title>
+  <para>
+   A <literal>WHERE</literal> clause that evaluates to a null value for a given row will exclude that row.
+   <programlisting>
+    SELECT id, value FROM null_examples WHERE value = 1;
+   </programlisting>
+   <screen>
+     id | value
+    ----+-------
+      1 |     1
+   </screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-constraints">
+  <title>Null Values in Constraints</title>
+  <para>
+   It is possible to define validation expressions
+   (<link linkend="ddl-constraints-check-constraints">check constraints</link>)
+   on tables that ensure only values passing those expressions are inserted.  While
+   this seems like it would behave the same as a filter, the choice here,
+   when an expression evaulates to a null value, is to allow the row to be inserted
+   - the same as a true result.
+   <programlisting>
+    BEGIN;
+    ALTER TABLE null_examples ADD CONSTRAINT value_not_1 CHECK (value != 1);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    ERROR:  check constraint "value_not_1" of relation "null_examples" is violated by some row
+    ROLLBACK
+   </screen>
+   <programlisting>
+    BEGIN;
+    ALTER TABLE null_examples ADD CONSTRAINT value_not_10 CHECK (value != 10);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    ALTER TABLE
+    ROLLBACK
+   </screen>
+   We are using a <link linkend="tutorial-transactions">transaction</link>
+   (begin and rollback) and the alter table command to add two
+   constraints to our null_examples table.  The first constraint prohibits rows with a value
+   of 1, which our row with an id of 1 violates.  Prohibiting the value 10 definitely allows
+   rows with ids 1 and 3 to exist, and since we are not told that some row violates our
+   constraint the null value in the row with id 2 is being accepted as well.
+  </para>
+  <para>
+   The <link linkend="ddl-constraints-not-null"><literal>NOT NULL</literal> column constraint</link>
+   produces the same answer as a <literal>column IS NOT NULL</literal> check constraint but is
+   more concise to write.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-grouping">
+  <title>Null Values When Grouping</title>
+  <para>
+   In the context of both <literal>DISTINCT</literal> and <literal>GROUP BY</literal>
+   it is necessary that all inputs resolve to being either equal to or not equal to all
+   other values.  These features use <link linkend="nullvalues-cardinalrule">distinctness</link>
+   instead of simple equality in order to handle a null value like a definite value equal to
+   another null vale and unequal to all other values.
+   <programlisting>
+    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+    SELECT
+     value,
+     count(*) as "Count"
+    FROM vals
+    GROUP BY value
+    ORDER BY value;
+   </programlisting>
+   <screen>
+     value | Count
+    -------+-------
+         1 |     2
+         2 |     1
+           |     2
+   </screen>
+   <programlisting>
+    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+    SELECT DISTINCT value FROM vals
+    ORDER BY value NULLS FIRST;
+   </programlisting>
+   <screen>
+     value
+    -------
+
+         1
+         2
+   </screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-ordering">
+  <title>Null Values When Ordering</title>
+  <para>
+   In the context of <literal>ORDER BY</literal>, distinctness rules also apply,
+   though this is insufficient since it must be determined whether or not to
+   present null values before or after all non-null values.  To handle
+   this, the <literal>ORDER BY</literal> clause will let you specify either
+   <literal>NULLS FIRST</literal> or <literal>NULLS LAST</literal>.
+   <programlisting>
+    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+    SELECT value FROM vals
+    ORDER BY value DESC NULLS FIRST;
+   </programlisting>
+   <screen>
+     value
+    -------
+
+
+         2
+         1
+         1
+   </screen>
+  </para>
+  <para>
+   Note that when dealing with multi-element values the comparison behavior
+   <link linkend="nullvalues-multielementcomparison">described above</link> applies,
+   if the comparison determination rests upon comparing a null value to a non-null value
+   the multi-element value with the null valued component will sort greater than the one
+   with a non-null component.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-indexed">
+  <title>Null Values in Indexes</title>
+  <para>
+   The uniqueness and relative ordering rules applied to null values
+   are defined when creating an index.  For the default
+   <literal>NULLS DISTINCT</literal> uniqueness, equality rules are applied.
+   Specifying <literal>NULLS NOT DISTINCT</literal> will result in
+   <literal>IS DISTINCT FROM</literal> rules being applied whereby all null
+   values are equal to each other.  This setting applies to all columns in the index.
+  </para>
+  <programlisting>
+   BEGIN;
+   CREATE UNIQUE INDEX value_nulls_distinct_implicit ON null_examples (value);
+   CREATE UNIQUE INDEX value_nulls_distinct_explicit ON null_examples (value) NULLS DISTINCT;
+   INSERT INTO null_examples VALUES (4, NULL);
+   ROLLBACK;
+  </programlisting>
+  <screen>
+   BEGIN
+   CREATE INDEX
+   CREATE INDEX
+   INSERT 0 1
+   ROLLBACK
+  </screen>
+    <programlisting>
+   BEGIN;
+   CREATE UNIQUE INDEX value_nulls_not_distinct_explicit ON null_examples (value) NULLS NOT DISTINCT;
+   INSERT INTO null_examples VALUES (4, NULL);
+   ROLLBACK;
+  </programlisting>
+  <screen>
+   BEGIN
+   CREATE INDEX
+   ERROR:  duplicate key value violates unique constraint "value_nulls_not_distinct_explicit"
+   DETAIL:  Key (value)=(null) already exists.
+   ROLLBACK
+  </screen>
+  <para>
+   For ordering, each column in the index gets its own specification of
+   direction and null value placement similar to that found in the
+   <literal>ORDER BY</literal> clause.
+  </para>
+  <para>
+   Note that when dealing with multi-element values the comparison behavior
+   <link linkend="nullvalues-multielementcomparison">described above</link> applies,
+   if the comparison determination rests upon comparing a null value to a non-null value
+   the multi-element value with the null valued component will sort greater than the one
+   with a non-null component.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-settings">
+  <title>Null Valued Settings</title>
+  <para>
+   There are none.  During initializion all settings are assigned a non-null value.
+  </para>
+  <para>
+   This is mostly meaningful for <link linkend="runtime-config-custom">custom settings</link>,
+   thus this section focuses on <link linkend="config-setting-sql">SQL interaction</link>.
+   Unlike settings created by extensions, custom settings can only be textual and the default
+   value for text here is the empty string.
+   <programlisting>
+    SHOW example.string;
+    BEGIN;
+    SELECT set_config('example.string', NULL, true);
+    SELECT current_setting('example.string') IS NULL AS "Setting Is Null";
+    ROLLBACK;
+    SHOW example.string;
+    RESET example.string;
+    SHOW example.string;
+   </programlisting>
+   <screen>
+    ERROR:  unrecognized configuration parameter "example.string"
+    BEGIN
+     set_config
+    ------------
+
+    (1 row)
+
+     Setting Is Null
+    -----------------
+     f
+    (1 row)
+
+    ROLLBACK
+     example.string
+    ----------------
+
+    (1 row)
+
+    RESET
+     example.string
+    ----------------
+
+    (1 row)
+   </screen>
+   Notice two important behaviors: first, even though we passed in a null value to
+   to the <literal>set_config</literal> function, the <literal>current_setting</literal>
+   function returned a non-null value, specifically the empty string.  Second, after ROLLBACK the
+   setting is still present (i.e., the error seen before creating the setting no longer appears),
+   and in fact will remain so until the session ends
+   (i.e., RESET does not restore the non-existence state.)
+  </para>
+  <para>
+    The other ways to specify settings do not have a means to specify null values,
+    a specific non-null value is required as part of the specification of the setting.
+   </para>
+ </sect2>
+
+</sect1>
-- 
2.34.1

#16Thom Brown
thom@linux.com
In reply to: David G. Johnston (#15)
Re: Document NULL

On Sat, May 11, 2024, 16:34 David G. Johnston <david.g.johnston@gmail.com>
wrote:

On Fri, May 3, 2024 at 9:00 AM David G. Johnston <
david.g.johnston@gmail.com> wrote:

On Fri, May 3, 2024 at 8:44 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

Having said that, I reiterate my proposal that we make it a new

<sect1> under DDL, before 5.2 Default Values which is the first

place in ddl.sgml that assumes you have heard of nulls.

I will go with this and remove the "Data Basics" section I wrote, leaving
it to be just a discussion about null values. The tutorial is the only
section that really needs unique wording to fit in. No matter where we
decide to place it otherwise the core content will be the same, with maybe
a different section preface to tie it in.

v3 Attached.

Probably at the 90% complete mark. Minimal index entries, not as thorough
a look-about of the existing documentation as I'd like. Probably some
wording and style choices to tweak. Figured better to get feedback now
before I go into polish mode. In particular, tweaking and re-running the
examples.

Yes, I am aware of my improper indentation for programlisting and screen.
I wanted to be able to use the code folding features of my editor. Those
can be readily un-indented in the final version.

The changes to func.sgml is basically one change repeated something like
20 times with tweaks for true/false. Plus moving the discussion regarding
the SQL specification into the new null handling section.

It took me doing this to really understand the difference between row
constructors and composite typed values, especially since array
constructors produce array typed values and the constructor is just an
unimportant implementation option while row constructors introduce
meaningfully different behaviors when used.

My plan is to have a v4 out next week, without or without a review of this
draft, but then the subsequent few weeks will probably be a bit quiet.

+   The cardinal rule, a given null value is never
+   <link linkend="functions-comparison-op-table">equal or unequal</link>
+   to any other non-null.

Again, doesn't this imply it tends to be equal to another null by its
omission?

Thom

Show quoted text
#17David G. Johnston
david.g.johnston@gmail.com
In reply to: Thom Brown (#16)
Re: Document NULL

On Saturday, May 11, 2024, Thom Brown <thom@linux.com> wrote:

Sat, May 11, 2024, 16:34 David G. Johnston <david.g.johnston@gmail.com>
wrote:

My plan is to have a v4 out next week, without or without a review of this

draft, but then the subsequent few weeks will probably be a bit quiet.

+   The cardinal rule, a given null value is never
+   <link linkend="functions-comparison-op-table">equal or unequal</link>
+   to any other non-null.

Again, doesn't this imply it tends to be equal to another null by its
omission?

I still agree, it’s just a typo now…

…is never equal or unequal to any value.

Though I haven’t settled on a phrasing I really like. But I’m trying to
avoid a parenthetical.

David J.

#18David G. Johnston
david.g.johnston@gmail.com
In reply to: David G. Johnston (#17)
Re: Document NULL

On Sat, May 11, 2024 at 11:00 AM David G. Johnston <
david.g.johnston@gmail.com> wrote:

Though I haven’t settled on a phrasing I really like. But I’m trying to
avoid a parenthetical.

Settled on this:

The cardinal rule, a null value is neither
<link linkend="functions-comparison-op-table">equal nor unequal</link>
to any value, including other null values.

I've been tempted to just say, "to any value.", but cannot quite bring
myself to do it...

David J.

#19Yugo NAGATA
nagata@sraoss.co.jp
In reply to: David G. Johnston (#15)
Re: Document NULL

On Sat, 11 May 2024 08:33:27 -0700
"David G. Johnston" <david.g.johnston@gmail.com> wrote:

On Fri, May 3, 2024 at 9:00 AM David G. Johnston <david.g.johnston@gmail.com>
wrote:

On Fri, May 3, 2024 at 8:44 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

Having said that, I reiterate my proposal that we make it a new

<sect1> under DDL, before 5.2 Default Values which is the first

place in ddl.sgml that assumes you have heard of nulls.

I will go with this and remove the "Data Basics" section I wrote, leaving
it to be just a discussion about null values. The tutorial is the only
section that really needs unique wording to fit in. No matter where we
decide to place it otherwise the core content will be the same, with maybe
a different section preface to tie it in.

v3 Attached.

Probably at the 90% complete mark. Minimal index entries, not as thorough
a look-about of the existing documentation as I'd like. Probably some
wording and style choices to tweak. Figured better to get feedback now
before I go into polish mode. In particular, tweaking and re-running the
examples.

Yes, I am aware of my improper indentation for programlisting and screen. I
wanted to be able to use the code folding features of my editor. Those can
be readily un-indented in the final version.

The changes to func.sgml is basically one change repeated something like 20
times with tweaks for true/false. Plus moving the discussion regarding the
SQL specification into the new null handling section.

It took me doing this to really understand the difference between row
constructors and composite typed values, especially since array
constructors produce array typed values and the constructor is just an
unimportant implementation option while row constructors introduce
meaningfully different behaviors when used.

My plan is to have a v4 out next week, without or without a review of this
draft, but then the subsequent few weeks will probably be a bit quiet.

+   A null value literal is written as unquoted, case insensitive, NULL.
...(snip)...
+  <programlisting>
+  SELECT
+    NULL,
+    pg_typeof(null),
+    pg_typeof(NuLl::text),
+    cast(null as text);
+  </programlisting>

It may be a trivial thing but I am not sure we need to mention case insensitivity
here, because all keywords and unquoted identifiers are case-insensitive in
PostgreSQL and it is not specific to NULL.

Also, I found the other parts of the documentation use "case-insensitive" in which
words are joined with hyphen, so I wonder it is better to use the same form if we
leave the description.

Regards,
Yugo Nagata

--
Yugo NAGATA <nagata@sraoss.co.jp>

#20David G. Johnston
david.g.johnston@gmail.com
In reply to: Yugo NAGATA (#19)
Re: Document NULL

On Tue, Jun 18, 2024 at 8:34 PM Yugo NAGATA <nagata@sraoss.co.jp> wrote:

It may be a trivial thing but I am not sure we need to mention case
insensitivity
here, because all keywords and unquoted identifiers are case-insensitive in
PostgreSQL and it is not specific to NULL.

But it is neither a keyword nor an identifier. It behaves more like:
SELECT 1 as one; A constant, which have no implied rules - mainly because
numbers don't have case. Which suggests adding some specific mention there
- and also probably need to bring up it and its "untyped" nature in the
syntax chapter, probably here:

https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS-GENERIC

Also, I found the other parts of the documentation use "case-insensitive"
in which
words are joined with hyphen, so I wonder it is better to use the same
form if we
leave the description.

Typo on my part, fixed.

I'm not totally against just letting this content be assumed to be learned
from elsewhere in the documentation but it also seems reasonable to
include. I'm going to leave it for now.

David J.

#21Yugo NAGATA
nagata@sraoss.co.jp
In reply to: David G. Johnston (#20)
Re: Document NULL

On Tue, 18 Jun 2024 20:56:58 -0700
"David G. Johnston" <david.g.johnston@gmail.com> wrote:

On Tue, Jun 18, 2024 at 8:34 PM Yugo NAGATA <nagata@sraoss.co.jp> wrote:

It may be a trivial thing but I am not sure we need to mention case
insensitivity
here, because all keywords and unquoted identifiers are case-insensitive in
PostgreSQL and it is not specific to NULL.

But it is neither a keyword nor an identifier. It behaves more like:
SELECT 1 as one; A constant, which have no implied rules - mainly because
numbers don't have case. Which suggests adding some specific mention there

Thank you for your explanation. This makes a bit clear for me why the description
mentions 'string' syntax there. I just thought NULL is a keyword representing
a null constant.

- and also probably need to bring up it and its "untyped" nature in the
syntax chapter, probably here:

https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS-GENERIC

Also, I found the other parts of the documentation use "case-insensitive"
in which
words are joined with hyphen, so I wonder it is better to use the same
form if we
leave the description.

Typo on my part, fixed.

I'm not totally against just letting this content be assumed to be learned
from elsewhere in the documentation but it also seems reasonable to
include. I'm going to leave it for now.

David J.

--
Yugo NAGATA <nagata@sraoss.co.jp>

#22Tom Lane
tgl@sss.pgh.pa.us
In reply to: Yugo NAGATA (#21)
Re: Document NULL

Yugo NAGATA <nagata@sraoss.co.jp> writes:

On Tue, 18 Jun 2024 20:56:58 -0700
"David G. Johnston" <david.g.johnston@gmail.com> wrote:

But it is neither a keyword nor an identifier.

The lexer would be quite surprised by your claim that NULL isn't
a keyword. Per src/include/parser/kwlist.h, NULL is a keyword,
and a fully reserved one at that.

regards, tom lane

#23David G. Johnston
david.g.johnston@gmail.com
In reply to: Tom Lane (#22)
Re: Document NULL

On Tuesday, June 18, 2024, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Yugo NAGATA <nagata@sraoss.co.jp> writes:

On Tue, 18 Jun 2024 20:56:58 -0700
"David G. Johnston" <david.g.johnston@gmail.com> wrote:

But it is neither a keyword nor an identifier.

The lexer would be quite surprised by your claim that NULL isn't
a keyword. Per src/include/parser/kwlist.h, NULL is a keyword,
and a fully reserved one at that.

Can’t it be both a value and a keyword? I figured the not null constraint
and is null predicates are why it’s a keyword but the existence of those
doesn’t cover its usage as a literal value that can be stuck anywhere you
have an expression.

David J.

#24Yugo NAGATA
nagata@sraoss.co.jp
In reply to: David G. Johnston (#23)
Re: Document NULL

On Tue, 18 Jun 2024 23:02:14 -0700
"David G. Johnston" <david.g.johnston@gmail.com> wrote:

On Tuesday, June 18, 2024, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Yugo NAGATA <nagata@sraoss.co.jp> writes:

On Tue, 18 Jun 2024 20:56:58 -0700
"David G. Johnston" <david.g.johnston@gmail.com> wrote:

But it is neither a keyword nor an identifier.

The lexer would be quite surprised by your claim that NULL isn't
a keyword. Per src/include/parser/kwlist.h, NULL is a keyword,
and a fully reserved one at that.

Can’t it be both a value and a keyword? I figured the not null constraint
and is null predicates are why it’s a keyword but the existence of those
doesn’t cover its usage as a literal value that can be stuck anywhere you
have an expression.

I still wonder it whould be unnecessary to mention the case-insensitivity here
if we can say NULL is *also* a keyword.

Regards,
Yugo Nagata

David J.

--
Yugo NAGATA <nagata@sraoss.co.jp>

#25David G. Johnston
david.g.johnston@gmail.com
In reply to: Yugo NAGATA (#24)
2 attachment(s)
Re: Document NULL

On Wed, Jun 26, 2024 at 8:14 PM Yugo NAGATA <nagata@sraoss.co.jp> wrote:

I still wonder it whould be unnecessary to mention the case-insensitivity
here
if we can say NULL is *also* a keyword.

I went with wording that includes mentioning its keyword status.

The attached are complete and ready for review. I did some file structure
reformatting at the end and left that as the second patch. The first
contains all of the content.

I'm adding this to the commitfest.

Thanks!

David J.

Attachments:

v4-0002-Formatting.patchtext/x-patch; charset=US-ASCII; name=v4-0002-Formatting.patchDownload
From e246e15058d5d7d514fb5c7d413fca4d138cae0d Mon Sep 17 00:00:00 2001
From: "David G. Johnston" <David.G.Johnston@Gmail.com>
Date: Fri, 28 Jun 2024 13:32:41 -0700
Subject: [PATCH v4 2/2] Formatting

---
 doc/src/sgml/nullvalues.sgml | 1037 +++++++++++++++++-----------------
 1 file changed, 525 insertions(+), 512 deletions(-)

diff --git a/doc/src/sgml/nullvalues.sgml b/doc/src/sgml/nullvalues.sgml
index 6c4c29e305..6c7aaed37a 100644
--- a/doc/src/sgml/nullvalues.sgml
+++ b/doc/src/sgml/nullvalues.sgml
@@ -44,28 +44,28 @@
    but can be cast to any concrete data type.
   </para>
   <para>
-   <programlisting>
-   SELECT
-    NULL AS "Literal Null Value",
-    pg_typeof(null) AS "Type of Null",
-    pg_typeof(NuLl::text) AS "Type of Cast null",
-    cast(null as text) AS "Cast null value";
-   </programlisting>
-   <screen>
-     Literal Null Value | Type of Null | Type of Cast null | Cast null value
-    --------------------+--------------+-------------------+-----------------
-                        | unknown      | text              |
-    (1 row)
-   </screen>
-  </para>
-  <para>
-   <programlisting>
-   SELECT text NULL;
-   </programlisting>
-   <screen>
-   ERROR:  column "text" does not exist
-   LINE 1: select text NUll;
-   </screen>
+<programlisting>
+ SELECT
+  NULL AS "Literal Null Value",
+  pg_typeof(null) AS "Type of Null",
+  pg_typeof(NuLl::text) AS "Type of Cast null",
+  cast(null as text) AS "Cast null value";
+</programlisting>
+<screen>
+  Literal Null Value | Type of Null | Type of Cast null | Cast null value
+ --------------------+--------------+-------------------+-----------------
+                     | unknown      | text              |
+ (1 row)
+</screen>
+  </para>
+  <para>
+<programlisting>
+ SELECT text NULL;
+</programlisting>
+<screen>
+ ERROR:  column "text" does not exist
+ LINE 1: select text NUll;
+</screen>
   </para>
   <para>
    The presence of null values in the system results in three-valued logic.
@@ -92,34 +92,34 @@
     neither equal nor unequal
    </link>
    to any value, including other null values.
-   <programlisting>
-    SELECT
-     NULL = NULL AS "N = N",
-     NULL != NULL AS "N != N",
-     1 = NULL AS "1 = N",
-     1 != NULL AS "1 != N",
-     1 = 1 AS "1 = 1",
-     1 != 1 AS "1 != 1";
-   </programlisting>
-   <screen>
-     N = N | N != N | 1 = N | 1 != N | 1 = 1 | 1 != 1
-    -------+--------+-------+--------+-------+--------
-           |        |       |        | t     | f
-    (1 row)
-   </screen>
+<programlisting>
+ SELECT
+  NULL = NULL AS "N = N",
+  NULL != NULL AS "N != N",
+  1 = NULL AS "1 = N",
+  1 != NULL AS "1 != N",
+  1 = 1 AS "1 = 1",
+  1 != 1 AS "1 != 1";
+</programlisting>
+<screen>
+  N = N | N != N | 1 = N | 1 != N | 1 = 1 | 1 != 1
+ -------+--------+-------+--------+-------+--------
+        |        |       |        | t     | f
+ (1 row)
+</screen>
    However, as with many rules, there are exceptions, which are
    <link linkend="nullvalues-multielementcomparison">noted below</link>.  Specifically,
    when the two compared values are part of a larger multi-element value.
-   <programlisting>
-    SELECT
-     array[1,2]=array[1,null] AS "Array Equals";
-   </programlisting>
-   <screen>
-     Array Equals
-    --------------
-     f
-    (1 row)
-   </screen>
+<programlisting>
+ SELECT
+  array[1,2]=array[1,null] AS "Array Equals";
+</programlisting>
+<screen>
+  Array Equals
+ --------------
+  f
+ (1 row)
+</screen>
   </para>
   <para>
    Because of this SQL specification mandated rule, checking for a null value has an
@@ -128,21 +128,21 @@
    to any other value (e.g., <literal>IS DISTINCT</literal>, and <literal>IS TRUE</literal>.)
    These, and other predicates, are described in
    <xref linkend="functions-comparison-pred-table"/>
-   <programlisting>
-    SELECT id, value,
-     value IS NULL AS "IS N",
-     value IS DISTINCT FROM id AS "IS D",
-     value != id AS "IS !="
-    FROM null_examples;
-   </programlisting>
-   <screen>
-     id | value | IS N | IS D | IS !=
-    ----+-------+------+------+-------
-      1 |     1 | f    | f    | f
-      2 |       | t    | t    |
-      3 |     4 | f    | t    | t
-    (3 rows)
-   </screen>
+<programlisting>
+ SELECT id, value,
+  value IS NULL AS "IS N",
+  value IS DISTINCT FROM id AS "IS D",
+  value != id AS "IS !="
+ FROM null_examples;
+</programlisting>
+<screen>
+  id | value | IS N | IS D | IS !=
+ ----+-------+------+------+-------
+   1 |     1 | f    | f    | f
+   2 |       | t    | t    |
+   3 |     4 | f    | t    | t
+ (3 rows)
+</screen>
   </para>
   <para>
    There is also a cardinal warning: when dealing with
@@ -154,24 +154,24 @@
    (The case where all fields are null is indistinguishable
    from the composite as a whole being null.)
    Write <literal>NOT(composite IS NULL)</literal> instead.
-   <programlisting>
-    SELECT
-     c,
-     c IS NULL AS "c IS N",
-     NOT(c IS NULL) AS "NOT c IS N",
-     c IS NOT NULL AS "c IS NOT N",
-     ROW(value, value) IS NULL AS "ROW(v,v) IS N",
-     ROW(value, value) IS NOT NULL AS "ROW(v,v) IS NOT N"
-    FROM null_examples AS c;
-   </programlisting>
-   <screen>
-       c   | c IS N | NOT c IS N | c IS NOT N | ROW(v,v) IS N | ROW(v,v) IS NOT N
-    -------+--------+------------+------------+---------------+-------------------
-     (1,1) | f      | t          | t          | f             | t
-     (2,)  | f      | t          | f          | t             | f
-     (3,4) | f      | t          | t          | f             | t
-    (3 rows)
-   </screen>
+<programlisting>
+ SELECT
+  c,
+  c IS NULL AS "c IS N",
+  NOT(c IS NULL) AS "NOT c IS N",
+  c IS NOT NULL AS "c IS NOT N",
+  ROW(value, value) IS NULL AS "ROW(v,v) IS N",
+  ROW(value, value) IS NOT NULL AS "ROW(v,v) IS NOT N"
+ FROM null_examples AS c;
+</programlisting>
+<screen>
+    c   | c IS N | NOT c IS N | c IS NOT N | ROW(v,v) IS N | ROW(v,v) IS NOT N
+ -------+--------+------------+------------+---------------+-------------------
+  (1,1) | f      | t          | t          | f             | t
+  (2,)  | f      | t          | f          | t             | f
+  (3,4) | f      | t          | t          | f             | t
+ (3 rows)
+</screen>
    See the <link linkend="nullvalues-multielement">multi-element
    testing section</link> below for an explanation.
   </para>
@@ -182,35 +182,35 @@
   <para>
    As a general expectation, operator invocation expressions where one of inputs
    is a null value will result in a null-valued output.
-   <programlisting>
-    SELECT
-     1 + null AS "Add",
-     'text' || null AS "Concatenate";
-   </programlisting>
-   <screen>
-     Add | Concatenate
-    -----+-------------
-         |
-    (1 row)
-   </screen>
+<programlisting>
+ SELECT
+  1 + null AS "Add",
+  'text' || null AS "Concatenate";
+</programlisting>
+<screen>
+  Add | Concatenate
+ -----+-------------
+      |
+ (1 row)
+</screen>
    Operators that behave otherwise should document their deviation from this norm.
   </para>
   <para>
    A notable example of this is the <literal>IN</literal> operator, which
    uses equality, not distinctness, for testing.
-   <programlisting>
-    SELECT
-     1 IN (1, null) AS "In Present",
-     1 IN (2, null) AS "In MIssing",
-     null IN (1, 2) AS "N In Non-N",
-     null IN (null, 2) AS "N In N";
-   </programlisting>
-   <screen>
-     In Present | In Missing | N In Non-N | N In N
-    ------------+------------+------------+--------
-     t          |            |            |
-    (1 row)
-   </screen>
+<programlisting>
+ SELECT
+  1 IN (1, null) AS "In Present",
+  1 IN (2, null) AS "In MIssing",
+  null IN (1, 2) AS "N In Non-N",
+  null IN (null, 2) AS "N In N";
+</programlisting>
+<screen>
+  In Present | In Missing | N In Non-N | N In N
+ ------------+------------+------------+--------
+  t          |            |            |
+ (1 row)
+</screen>
    This is just an extension of the multi-element testing behavior described
    <link linkend="nullvalues-multielement">below</link>.
   </para>
@@ -218,44 +218,44 @@
    Experience shows that <literal>CASE</literal> expressions are also prone
    to bugs since their format encourages binary logic thinking while a
    <literal>WHEN</literal> test will not consider a null value to be a match.
-   <programlisting>
-    SELECT id, value,
-     CASE WHEN id = value THEN 'Equal' ELSE 'Not Equal' END AS "Affirm",
-     CASE WHEN id != value THEN 'Not Equal' ELSE 'Equal' END AS "Negate",
-     CASE WHEN value IS NULL THEN 'Null'
-          WHEN id = value THEN 'Equal'
-          ELSE 'Not Equal' END AS "Safe Affirm",
-     CASE WHEN value IS NULL THEN 'Null'
-          WHEN id != value THEN 'Not Equal'
-          ELSE 'Equal' END AS "Safe Negate"
-    FROM null_examples;
-   </programlisting>
-   <screen>
-     id | value |  Affirm   |  Negate   | Safe Affirm | Safe Negate
-    ----+-------+-----------+-----------+-------------+-------------
-      1 |     1 | Equal     | Equal     | Equal       | Equal
-      2 |       | Not Equal | Equal     | Null        | Null
-      3 |     4 | Not Equal | Not Equal | Not Equal   | Not Equal
-    (3 rows)
-   </screen>
+<programlisting>
+ SELECT id, value,
+  CASE WHEN id = value THEN 'Equal' ELSE 'Not Equal' END AS "Affirm",
+  CASE WHEN id != value THEN 'Not Equal' ELSE 'Equal' END AS "Negate",
+  CASE WHEN value IS NULL THEN 'Null'
+       WHEN id = value THEN 'Equal'
+       ELSE 'Not Equal' END AS "Safe Affirm",
+  CASE WHEN value IS NULL THEN 'Null'
+       WHEN id != value THEN 'Not Equal'
+       ELSE 'Equal' END AS "Safe Negate"
+ FROM null_examples;
+</programlisting>
+<screen>
+  id | value |  Affirm   |  Negate   | Safe Affirm | Safe Negate
+ ----+-------+-----------+-----------+-------------+-------------
+   1 |     1 | Equal     | Equal     | Equal       | Equal
+   2 |       | Not Equal | Equal     | Null        | Null
+   3 |     4 | Not Equal | Not Equal | Not Equal   | Not Equal
+ (3 rows)
+</screen>
   </para>
   <para>
    The boolean operators <literal>AND</literal> and <literal>OR</literal>
    will ignore the null value input if the other input is sufficient to
    to determine the outcome.
-   <programlisting>
-    SELECT
-     true OR null AS "T or N",
-     false OR null AS "F or N",
-     true AND null AS "T and N",
-     false AND null AS "F and N";
-   </programlisting>
-   <screen>
-     T or N | F or N | T and N | F and N
-    --------+--------+---------+---------
-     t      |        |         | f
-    (1 row)
-   </screen>
+<programlisting>
+ SELECT
+  true OR null AS "T or N",
+  false OR null AS "F or N",
+  true AND null AS "T and N",
+  false AND null AS "F and N";
+</programlisting>
+<screen>
+  T or N | F or N | T and N | F and N
+ --------+--------+---------+---------
+  t      |        |         | f
+ (1 row)
+</screen>
   </para>
  </sect2>
 
@@ -266,30 +266,30 @@
    However, some usages of domains will cause the resultant column to have the domain type but
    the value will be null.  The common way this happens is by including the domain column's table
    on the right side of a left join.
-   <programlisting>
-    BEGIN;
-    CREATE DOMAIN domain_example AS integer NOT NULL;
-    CREATE TABLE domain_examples (de_id bigint PRIMARY KEY, de_value domain_example);
-    INSERT INTO domain_examples VALUES (1, 1), (2, 2);
-    SELECT *, pg_typeof(de_value)
-    FROM null_examples AS ne
-    LEFT JOIN domain_examples AS de ON ne.id = de.de_id;
-    ROLLBACK;
-   </programlisting>
-   <screen>
-    BEGIN
-    CREATE DOMAIN
-    CREATE TABLE
-    INSERT 0 2
-     id | value | de_id | de_value |   pg_typeof
-    ----+-------+-------+----------+----------------
-      1 |     1 |     1 |        1 | domain_example
-      2 |       |     2 |        2 | domain_example
-      3 |     4 |       |          | domain_example
-    (3 rows)
-
-    ROLLBACK
-   </screen>
+<programlisting>
+ BEGIN;
+ CREATE DOMAIN domain_example AS integer NOT NULL;
+ CREATE TABLE domain_examples (de_id bigint PRIMARY KEY, de_value domain_example);
+ INSERT INTO domain_examples VALUES (1, 1), (2, 2);
+ SELECT *, pg_typeof(de_value)
+ FROM null_examples AS ne
+ LEFT JOIN domain_examples AS de ON ne.id = de.de_id;
+ ROLLBACK;
+</programlisting>
+<screen>
+ BEGIN
+ CREATE DOMAIN
+ CREATE TABLE
+ INSERT 0 2
+  id | value | de_id | de_value |   pg_typeof
+ ----+-------+-------+----------+----------------
+   1 |     1 |     1 |        1 | domain_example
+   2 |       |     2 |        2 | domain_example
+   3 |     4 |       |          | domain_example
+ (3 rows)
+
+ ROLLBACK
+</screen>
    Please see the details in the <link linkend="sql-createdomain-notes">
    notes on the create domain page</link> for another example, as well as
    commentary why this non-standard behavior exists.
@@ -353,6 +353,7 @@
 
  <sect2 id="nullvalues-multielementpredicates">
   <title>Multi-Element Predicates and Scalars</title>
+
   <sect3 id="nullvalues-multielementpredicates-composites">
    <title>Composite Fields</title>
    <para>
@@ -367,19 +368,19 @@
     as a non-null composite value.  Specifically, if the composite value has
     a null-valued field then both the <literal>IS NOT NULL</literal> predicate and the
     <literal>IS NULL</literal> predicate will return false.
-    <programlisting>
-     SELECT
-      ROW(1,2) IS NULL AS "Row Is Null",
-      ROW(1,2) IS NOT NULL AS "Row Is Not Null",
-      ROW(1,NULL) IS NULL AS "Row Is Null",
-      ROW(1,NULL) IS NOT NULL AS "Row Is Not Null";
-    </programlisting>
-    <screen>
-      Row Is Null | Row Is Not Null | Row Is Null | Row Is Not Null
-     -------------+-----------------+-------------+-----------------
-      f           | t               | f           | f
-     (1 row)
-    </screen>
+<programlisting>
+ SELECT
+  ROW(1,2) IS NULL AS "Row Is Null",
+  ROW(1,2) IS NOT NULL AS "Row Is Not Null",
+  ROW(1,NULL) IS NULL AS "Row Is Null",
+  ROW(1,NULL) IS NOT NULL AS "Row Is Not Null";
+</programlisting>
+<screen>
+  Row Is Null | Row Is Not Null | Row Is Null | Row Is Not Null
+ -------------+-----------------+-------------+-----------------
+  f           | t               | f           | f
+ (1 row)
+</screen>
    </para>
    <para>
     Please read <xref linkend="composite-type-comparison"/> for a complete treatment
@@ -388,6 +389,7 @@
     presence of null-valued fields, and also in terms of the SQL specification.
    </para>
   </sect3>
+
   <sect3 id="nullvalues-multielementpredicates-arrays">
    <title>Array Elements and IN Bag Members</title>
    <para>
@@ -396,51 +398,55 @@
     operators defined in <xref linkend="functions-comparisons"/>.
    </para>
    <para>
-    <programlisting>
-     SELECT
-      1 = ANY(array[1, 1, NULL]) AS "Any-Null-Match",
-      1 = ANY(array[1, 1]) AS "Any-NoNull-Match",
-      1 = ALL(array[1, 1, NULL]) AS "ALL-Null-Match",
-      1 = ALL(array[1, 1]) AS "All-NoNull-Match";
-     SELECT
-      2 = ANY(array[1, 1, NULL]) AS "Any-Null-NoMatch",
-      2 = ANY(array[1, 1]) AS "Any-NoNull-NoMatch",
-      2 = ALL(array[1, 1, NULL]) AS "ALL-Null-NoMatch",
-      2 = ALL(array[1, 1]) AS "All-NoNull-NoMatch";
-     SELECT
-      1 IN (1, 1, NULL) AS "IN-Null-Positive",
-      1 IN (1, 1) AS "IN-NoNull-Positive",
-      1 NOT IN (2, 2, NULL) AS "NotIN-Null-Positive",
-      1 NOT IN (2, 2) AS "NotIN-NoNull-Positive";
-     SELECT
-      2 IN (1, 1, NULL) AS "IN-Null-Negative",
-      2 IN (1, 1) AS "IN-NoNull-Negative",
-      2 NOT IN (2, 2, NULL) AS "NotIN-Null-Negative",
-      2 NOT IN (2, 2) AS "NotIN-NoNull-Negative";
-    </programlisting>
-    <screen>
-      Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
-     ----------------+------------------+----------------+------------------
-      t              | t                |                | t
-     (1 row)
-
-      Any-Null-NoMatch | Any-NoNull-NoMatch | ALL-Null-NoMatch | All-NoNull-NoMatch
-     ------------------+--------------------+------------------+--------------------
-                       | f                  | f                | f
-     (1 row)
-
-      IN-Null-Positive | IN-NoNull-Positive | NotIN-Null-Positive | NotIN-NoNull-Positive
-     ------------------+--------------------+---------------------+-----------------------
-      t                | t                  |                     | t
-     (1 row)
-
-      IN-Null-Negative | IN-NoNull-Negative | NotIN-Null-Negative | NotIN-NoNull-Negative
-     ------------------+--------------------+---------------------+-----------------------
-                       | f                  | f                   | f
-     (1 row)
-    </screen>
+<programlisting>
+ SELECT
+  1 = ANY(array[1, 1, NULL]) AS "Any-Null-Match",
+  1 = ANY(array[1, 1]) AS "Any-NoNull-Match",
+  1 = ALL(array[1, 1, NULL]) AS "ALL-Null-Match",
+  1 = ALL(array[1, 1]) AS "All-NoNull-Match";
+
+ SELECT
+  2 = ANY(array[1, 1, NULL]) AS "Any-Null-NoMatch",
+  2 = ANY(array[1, 1]) AS "Any-NoNull-NoMatch",
+  2 = ALL(array[1, 1, NULL]) AS "ALL-Null-NoMatch",
+  2 = ALL(array[1, 1]) AS "All-NoNull-NoMatch";
+
+ SELECT
+  1 IN (1, 1, NULL) AS "IN-Null-Positive",
+  1 IN (1, 1) AS "IN-NoNull-Positive",
+  1 NOT IN (2, 2, NULL) AS "NotIN-Null-Positive",
+  1 NOT IN (2, 2) AS "NotIN-NoNull-Positive";
+
+ SELECT
+  2 IN (1, 1, NULL) AS "IN-Null-Negative",
+  2 IN (1, 1) AS "IN-NoNull-Negative",
+  2 NOT IN (2, 2, NULL) AS "NotIN-Null-Negative",
+  2 NOT IN (2, 2) AS "NotIN-NoNull-Negative";
+</programlisting>
+<screen>
+  Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+ ----------------+------------------+----------------+------------------
+  t              | t                |                | t
+ (1 row)
+
+  Any-Null-NoMatch | Any-NoNull-NoMatch | ALL-Null-NoMatch | All-NoNull-NoMatch
+ ------------------+--------------------+------------------+--------------------
+                   | f                  | f                | f
+ (1 row)
+
+  IN-Null-Positive | IN-NoNull-Positive | NotIN-Null-Positive | NotIN-NoNull-Positive
+ ------------------+--------------------+---------------------+-----------------------
+  t                | t                  |                     | t
+ (1 row)
+
+  IN-Null-Negative | IN-NoNull-Negative | NotIN-Null-Negative | NotIN-NoNull-Negative
+ ------------------+--------------------+---------------------+-----------------------
+                   | f                  | f                   | f
+ (1 row)
+</screen>
    </para>
   </sect3>
+
   <sect3 id="nullvalues-multielementpredicates-subqueries">
    <title>Single-Column Subquery Rows</title>
    <para>
@@ -450,34 +456,35 @@
     the column itself is multi-element then the thing being searched for must be a compatible
     multi-element value, and the corresponding comparison behavior described in
     <xref linkend="nullvalues-multielementcomparison"/> will also be applied.
-
    </para>
    <para>
-    <programlisting>
-     SELECT
-      1 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-Match",
-      1 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-Match",
-      1 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-Match",
-      1 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-Match";
-     SELECT
-      2 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-NoMatch",
-      2 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-NoMatch",
-      2 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-NoMatch",
-      2 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-NoMatch";
-    </programlisting>
-    <screen>
-      Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
-     ----------------+------------------+----------------+------------------
-      t              | t                |                | t
-     (1 row)
-
-      Any-Null-NoMatch | Any-NoNull-NoMatch | ALL-Null-NoMatch | All-NoNull-NoMatch
-     ------------------+--------------------+------------------+--------------------
-                       | f                  | f                | f
-     (1 row)
-    </screen>
+<programlisting>
+ SELECT
+  1 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-Match",
+  1 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-Match",
+  1 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-Match",
+  1 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-Match";
+
+ SELECT
+  2 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-NoMatch",
+  2 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-NoMatch",
+  2 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-NoMatch",
+  2 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-NoMatch";
+</programlisting>
+<screen>
+  Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+ ----------------+------------------+----------------+------------------
+  t              | t                |                | t
+ (1 row)
+
+  Any-Null-NoMatch | Any-NoNull-NoMatch | ALL-Null-NoMatch | All-NoNull-NoMatch
+ ------------------+--------------------+------------------+--------------------
+                   | f                  | f                | f
+ (1 row)
+</screen>
    </para>
   </sect3>
+
  </sect2>
 
  <sect2 id="nullvalues-multielementcomparison">
@@ -502,69 +509,73 @@
    <xref linkend="composite-type-comparison"/> for a fuller treatment of this topic.  Here
    we briefly recap the five different situations in the presence of null values.
   </para>
+
   <sect3 id="nullvalues-multielementcomparison-array">
    <title>Element-wise Comparisons</title>
    <para>
     First situation, null values within an array compare as equal to each other and greater than all
     non-null values, regardless of whether the comparison involves
     <link linkend="sql-syntax-array-constructors">array constructors</link> or array typed values.
-    <programlisting>
-     SELECT
-      array[1,2]=array[1,null] AS "Constructors",
-      s, t,
-      s = t AS "Stored Equality",
-      t &gt; s AS "Stored Ordering"
-     FROM
-     (values (array[1,2])) AS sv (s),
-     (values (array[1,null::integer])) AS st (t);
-    </programlisting>
-    <screen>
-      Constructors |   s   |    t     | Stored Equality | Stored Ordering
-     --------------+-------+----------+-----------------+-----------------
-      f            | {1,2} | {1,NULL} | f               | t
-     (1 row)
-    </screen>
+<programlisting>
+ SELECT
+  array[1,2]=array[1,null] AS "Constructors",
+  s, t,
+  s = t AS "Stored Equality",
+  t &gt; s AS "Stored Ordering"
+ FROM
+ (values (array[1,2])) AS sv (s),
+ (values (array[1,null::integer])) AS st (t);
+</programlisting>
+<screen>
+  Constructors |   s   |    t     | Stored Equality | Stored Ordering
+ --------------+-------+----------+-----------------+-----------------
+  f            | {1,2} | {1,NULL} | f               | t
+ (1 row)
+</screen>
    </para>
   </sect3>
+
   <sect3 id="nullvalues-multielementcomparison-rowconstructor">
    <title>Row-wise Mutual Row Constructor Comparisons</title>
    <para>
     In this situation null values produce unknown when compared to all values.
-    <programlisting>
-     SELECT
-      (1,2)=(1,null) AS "NonNull=Null",
-      (1,null::integer)=(1,null) AS "Null=Null";
-    </programlisting>
-    <screen>
-      NonNull=Null | Null=Null
-     --------------+-----------
-                   |
-     (1 row)
-    </screen>
+<programlisting>
+ SELECT
+  (1,2)=(1,null) AS "NonNull=Null",
+  (1,null::integer)=(1,null) AS "Null=Null";
+</programlisting>
+<screen>
+  NonNull=Null | Null=Null
+ --------------+-----------
+               |
+ (1 row)
+</screen>
    </para>
   </sect3>
+
   <sect3 id="nullvalues-multielementcomparison-composite">
    <title>Row-wise Composite Involved Comparisons</title>
    <para>
     In these three situations null values are considered equal to each other and greater than
     all non-null value.
    </para>
-   <programlisting>
-    SELECT s, t,
-     s = t AS "Stored Equals Stored",
-     t &lt; (1,2) AS "Stored LT Constructor",
-     t = (1,null::integer) AS "Stored Equals Constructor"
-    FROM
-     (values (1,2)) AS s,
-     (values (1,null::integer)) AS t;
-   </programlisting>
-   <screen>
-       s   |  t   | Stored Equals Stored | Stored LT Constructor | Stored Equals Constructor
-    -------+------+----------------------+-----------------------+---------------------------
-     (1,2) | (1,) | f                    | f                     | t
-    (1 row)
-   </screen>
+<programlisting>
+ SELECT s, t,
+  s = t AS "Stored Equals Stored",
+  t &lt; (1,2) AS "Stored LT Constructor",
+  t = (1,null::integer) AS "Stored Equals Constructor"
+ FROM
+  (values (1,2)) AS s,
+  (values (1,null::integer)) AS t;
+</programlisting>
+<screen>
+    s   |  t   | Stored Equals Stored | Stored LT Constructor | Stored Equals Constructor
+ -------+------+----------------------+-----------------------+---------------------------
+  (1,2) | (1,) | f                    | f                     | t
+ (1 row)
+</screen>
   </sect3>
+
   <sect3 id="nullvalues-multielementcomparison-sqlconformance">
    <title>SQL Specification Conformance</title>
    <para>
@@ -576,6 +587,7 @@
     to the output of a subquery (as in <xref linkend="functions-subquery"/>).
    </para>
   </sect3>
+
  </sect2>
 
  <sect2 id="nullvalues-functions">
@@ -594,22 +606,22 @@
    like concatenate, null values often are simply ignored.
    This can be different than the choice made by a binary operator performing the same function,
    like for concatenating text, but not always, like concatenating an element onto an array.
-   <programlisting>
-    SELECT
-     lower(null::text) AS "Lower",
-     left('text', null) AS "Left",
-     'one' || null AS "|| Text Op",
-     concat('one', null) AS "concat Text Func",
-     array_append(array[1], null) AS "append([], null)",
-     array[1]::integer[] || null::integer AS "[] || null",
-     array[1]::integer[] || null::integer[] AS "[] || null[]";
-   </programlisting>
-   <screen>
-     Lower | Left | || Text Op | concat Text Func | append([], null) | [] || null | [] || null[]
-    -------+------+------------+------------------+------------------+------------+--------------
-           |      |            | one              | {1,NULL}         | {1,NULL}   | {1}
-    (1 row)
-   </screen>
+<programlisting>
+ SELECT
+  lower(null::text) AS "Lower",
+  left('text', null) AS "Left",
+  'one' || null AS "|| Text Op",
+  concat('one', null) AS "concat Text Func",
+  array_append(array[1], null) AS "append([], null)",
+  array[1]::integer[] || null::integer AS "[] || null",
+  array[1]::integer[] || null::integer[] AS "[] || null[]";
+</programlisting>
+<screen>
+  Lower | Left | || Text Op | concat Text Func | append([], null) | [] || null | [] || null[]
+ -------+------+------------+------------------+------------------+------------+--------------
+        |      |            | one              | {1,NULL}         | {1,NULL}   | {1}
+ (1 row)
+</screen>
    In short, please read the documentation for the functions you use if they may receive null inputs
    to understand how they will behave.  Send a documentation comment pointing out any functions
    that do not behave strictly but whose actual behavior in the presence of null-valued input
@@ -626,20 +638,20 @@
    or it simply returns a null value upon execution.  The aggregation
    routine will usually ignore the null value and continue processing,
    as demonstrated in <literal>count(value)</literal> below.
-   <programlisting>
-    SELECT
-     count(*) AS "Count",
-     count(value) AS "Count Value",
-     count(null_examples) AS "Count Composite",
-     count(row(value, value)) AS "Count Row"
-    FROM null_examples;
-   </programlisting>
-   <screen>
-     Count | Count Value | Count Composite | Count Row
-    -------+-------------+-----------------+-----------
-         3 |           2 |               3 |         3
-    (1 row)
-   </screen>
+<programlisting>
+ SELECT
+  count(*) AS "Count",
+  count(value) AS "Count Value",
+  count(null_examples) AS "Count Composite",
+  count(row(value, value)) AS "Count Row"
+ FROM null_examples;
+</programlisting>
+<screen>
+  Count | Count Value | Count Composite | Count Row
+ -------+-------------+-----------------+-----------
+      3 |           2 |               3 |         3
+ (1 row)
+</screen>
    Notice the "Count Row" outcome, though.  While we noted in the cardinal warning
    that a composite whose fields are all null values is indistinguishable from
    a null value of composite type, the count aggregate does indeed distinguish them,
@@ -653,26 +665,26 @@
   <title>Null Values in Where</title>
   <para>
    A <literal>WHERE</literal> clause that evaluates to a null value for a given row will exclude that row.
-   <programlisting>
-    SELECT id, value AS "Equals 1"
-    FROM null_examples
-    WHERE value = 1;
-
-    SELECT id, value AS "Not Equal to 1"
-    FROM null_examples
-    WHERE value != 1;
-   </programlisting>
-   <screen>
-     id | Equals 1
-    ----+----------
-      1 |        1
-    (1 row)
-
-     id | Not Equal to 1
-    ----+----------------
-      3 |              4
-    (1 row)
-   </screen>
+<programlisting>
+ SELECT id, value AS "Equals 1"
+ FROM null_examples
+ WHERE value = 1;
+
+ SELECT id, value AS "Not Equal to 1"
+ FROM null_examples
+ WHERE value != 1;
+</programlisting>
+<screen>
+  id | Equals 1
+ ----+----------
+   1 |        1
+ (1 row)
+
+  id | Not Equal to 1
+ ----+----------------
+   3 |              4
+ (1 row)
+</screen>
   </para>
  </sect2>
 
@@ -685,26 +697,26 @@
    While this seems like it would behave the same as a where clause, the choice here,
    when an expression evaulates to a null value, is to allow the row to be inserted
    - the same as a true result.
-   <programlisting>
-    BEGIN;
-    ALTER TABLE null_examples ADD CONSTRAINT value_not_1 CHECK (value != 1);
-    ROLLBACK;
-   </programlisting>
-   <screen>
-    BEGIN
-    ERROR:  check constraint "value_not_1" of relation "null_examples" is violated by some row
-    ROLLBACK
-   </screen>
-   <programlisting>
-    BEGIN;
-    ALTER TABLE null_examples ADD CONSTRAINT value_not_10 CHECK (value != 10);
-    ROLLBACK;
-   </programlisting>
-   <screen>
-    BEGIN
-    ALTER TABLE
-    ROLLBACK
-   </screen>
+<programlisting>
+ BEGIN;
+ ALTER TABLE null_examples ADD CONSTRAINT value_not_1 CHECK (value != 1);
+ ROLLBACK;
+</programlisting>
+<screen>
+ BEGIN
+ ERROR:  check constraint "value_not_1" of relation "null_examples" is violated by some row
+ ROLLBACK
+</screen>
+<programlisting>
+ BEGIN;
+ ALTER TABLE null_examples ADD CONSTRAINT value_not_10 CHECK (value != 10);
+ ROLLBACK;
+</programlisting>
+<screen>
+ BEGIN
+ ALTER TABLE
+ ROLLBACK
+</screen>
    We are using a transaction (begin and rollback) and the alter table command to add two
    constraints to our null_examples table.  The first constraint prohibits rows with a value
    of 1, which our row with an id of 1 violates.  Prohibiting the value 10 definitely allows
@@ -726,37 +738,37 @@
    other values.  These features use <link linkend="nullvalues-cardinalrule">distinctness</link>
    instead of simple equality in order to handle a null value like a definite value equal to
    another null vale and unequal to all other values.
-   <programlisting>
-    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
-    SELECT
-     value,
-     count(*) AS "Count"
-    FROM vals
-    GROUP BY value
-    ORDER BY value;
-   </programlisting>
-   <screen>
-     value | Count
-    -------+-------
-         1 |     2
-         2 |     1
-           |     2
-    (3 rows)
-   </screen>
-   <programlisting>
-    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
-    SELECT DISTINCT value
-    FROM vals
-    ORDER BY value NULLS FIRST;
-   </programlisting>
-   <screen>
-     value
-    -------
-
-         1
-         2
-    (3 rows)
-   </screen>
+<programlisting>
+ WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+ SELECT
+  value,
+  count(*) AS "Count"
+ FROM vals
+ GROUP BY value
+ ORDER BY value;
+</programlisting>
+<screen>
+  value | Count
+ -------+-------
+      1 |     2
+      2 |     1
+        |     2
+ (3 rows)
+</screen>
+<programlisting>
+ WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+ SELECT DISTINCT value
+ FROM vals
+ ORDER BY value NULLS FIRST;
+</programlisting>
+<screen>
+  value
+ -------
+
+      1
+      2
+ (3 rows)
+</screen>
   </para>
  </sect2>
 
@@ -768,21 +780,21 @@
    present null values before or after all non-null values.  To handle
    this, the <literal>ORDER BY</literal> clause will let you specify either
    <literal>NULLS FIRST</literal> or <literal>NULLS LAST</literal>.
-   <programlisting>
-    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
-    SELECT value FROM vals
-    ORDER BY value DESC NULLS FIRST;
-   </programlisting>
-   <screen>
-     value
-    -------
+<programlisting>
+ WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+ SELECT value FROM vals
+ ORDER BY value DESC NULLS FIRST;
+</programlisting>
+<screen>
+  value
+ -------
 
 
-         2
-         1
-         1
-    (5 rows)
-   </screen>
+      2
+      1
+      1
+ (5 rows)
+</screen>
   </para>
   <para>
    Note that when dealing with multi-element values the comparison behavior
@@ -804,33 +816,33 @@
    values are equal to each other.  This setting applies to all columns in the index.
   </para>
   <para>
-   <programlisting>
-    BEGIN;
-    CREATE UNIQUE INDEX value_nulls_distinct_implicit ON null_examples (value);
-    CREATE UNIQUE INDEX value_nulls_distinct_explicit ON null_examples (value) NULLS DISTINCT;
-    INSERT INTO null_examples VALUES (4, NULL);
-    ROLLBACK;
-   </programlisting>
-   <screen>
-    BEGIN
-    CREATE INDEX
-    CREATE INDEX
-    INSERT 0 1
-    ROLLBACK
-   </screen>
-   <programlisting>
-    BEGIN;
-    CREATE UNIQUE INDEX value_nulls_not_distinct_explicit ON null_examples (value) NULLS NOT DISTINCT;
-    INSERT INTO null_examples VALUES (4, NULL);
-    ROLLBACK;
-   </programlisting>
-   <screen>
-    BEGIN
-    CREATE INDEX
-    ERROR:  duplicate key value violates unique constraint "value_nulls_not_distinct_explicit"
-    DETAIL:  Key (value)=(null) already exists.
-    ROLLBACK
-   </screen>
+<programlisting>
+ BEGIN;
+ CREATE UNIQUE INDEX value_nulls_distinct_implicit ON null_examples (value);
+ CREATE UNIQUE INDEX value_nulls_distinct_explicit ON null_examples (value) NULLS DISTINCT;
+ INSERT INTO null_examples VALUES (4, NULL);
+ ROLLBACK;
+</programlisting>
+<screen>
+ BEGIN
+ CREATE INDEX
+ CREATE INDEX
+ INSERT 0 1
+ ROLLBACK
+</screen>
+<programlisting>
+ BEGIN;
+ CREATE UNIQUE INDEX value_nulls_not_distinct_explicit ON null_examples (value) NULLS NOT DISTINCT;
+ INSERT INTO null_examples VALUES (4, NULL);
+ ROLLBACK;
+</programlisting>
+<screen>
+ BEGIN
+ CREATE INDEX
+ ERROR:  duplicate key value violates unique constraint "value_nulls_not_distinct_explicit"
+ DETAIL:  Key (value)=(null) already exists.
+ ROLLBACK
+</screen>
   </para>
   <para>
    For ordering, each column in the index gets its own specification of
@@ -871,41 +883,41 @@
    thus this section focuses on <link linkend="config-setting-sql">SQL interaction</link>.
    Unlike settings created by extensions, custom settings can only be textual and the default
    value for text here is the empty string.
-   <programlisting>
-    SHOW example.string;
-    BEGIN;
-    SELECT set_config('example.string', NULL, true);
-    SELECT current_setting('example.string') IS NULL AS "Setting Is Null";
-    ROLLBACK;
-    SHOW example.string;
-    RESET example.string;
-    SHOW example.string;
-   </programlisting>
-   <screen>
-    ERROR:  unrecognized configuration parameter "example.string"
-    BEGIN
-     set_config
-    ------------
-
-    (1 row)
-
-     Setting Is Null
-    -----------------
-     f
-    (1 row)
-
-    ROLLBACK
-     example.string
-    ----------------
-
-    (1 row)
-
-    RESET
-     example.string
-    ----------------
-
-    (1 row)
-   </screen>
+<programlisting>
+ SHOW example.string;
+ BEGIN;
+ SELECT set_config('example.string', NULL, true);
+ SELECT current_setting('example.string') IS NULL AS "Setting Is Null";
+ ROLLBACK;
+ SHOW example.string;
+ RESET example.string;
+ SHOW example.string;
+</programlisting>
+<screen>
+ ERROR:  unrecognized configuration parameter "example.string"
+ BEGIN
+  set_config
+ ------------
+
+ (1 row)
+
+  Setting Is Null
+ -----------------
+  f
+ (1 row)
+
+ ROLLBACK
+  example.string
+ ----------------
+
+ (1 row)
+
+ RESET
+  example.string
+ ----------------
+
+ (1 row)
+</screen>
    Notice two important behaviors: first, even though we passed in a null value to
    to the <literal>set_config</literal> function, the <literal>current_setting</literal>
    function returned a non-null value, specifically the empty string.  Second, after ROLLBACK the
@@ -924,71 +936,72 @@
   <para>
    As noted in <xref linkend="json-type-mapping-table"/>, JSON has a null value
    that does not get exposed at the SQL level.
-   <programlisting>
-    SELECT 'null'::json IS NULL AS "JSON null is NULL";
-   </programlisting>
-   <screen>
-     JSON null is NULL
-    -------------------
-     f
-    (1 row)
-   </screen>
+<programlisting>
+ SELECT 'null'::json IS NULL AS "JSON null is NULL";
+</programlisting>
+<screen>
+  JSON null is NULL
+ -------------------
+  f
+ (1 row)
+</screen>
    Additionally, the SQL operators and functions involving JSON key or array element selection,
    or construction from literals, require that a number or text value be supplied as an operand
    and so JSON null values cannot be targeted by those operators and functions.
-   <programlisting>
-    SELECT to_json(null::text);
-   </programlisting>
-   <screen>
-     to_json
-    ---------
-
-    (1 row)
-   </screen>
+<programlisting>
+ SELECT to_json(null::text);
+</programlisting>
+<screen>
+  to_json
+ ---------
+
+ (1 row)
+</screen>
    That all said, the system will convert from SQL null values to JSON null values when in a
    composite type context.
-   <programlisting>
-    SELECT json_build_object('value', value)
-    FROM null_examples;
-   </programlisting>
-   <screen>
-     json_build_object
-    -------------------
-     {"value" : 1}
-     {"value" : null}
-     {"value" : 4}
-    (3 rows)
-   </screen>
+<programlisting>
+ SELECT json_build_object('value', value)
+ FROM null_examples;
+</programlisting>
+<screen>
+  json_build_object
+ -------------------
+  {"value" : 1}
+  {"value" : null}
+  {"value" : 4}
+ (3 rows)
+</screen>
    And vice versa.
-   <programlisting>
-    SELECT *
-    FROM jsonb_to_recordset('[{"value":1},{"value":null},{"value":4}]'::jsonb) AS jtr (value integer);
-   </programlisting>
-   <screen>
-     value
-    -------
-         1
+<programlisting>
+ SELECT *
+ FROM jsonb_to_recordset('[{"value":1},{"value":null},{"value":4}]'::jsonb) AS jtr (value integer);
+</programlisting>
+<screen>
+  value
+ -------
+      1
 
-         4
-    (3 rows)
-   </screen>
+      4
+ (3 rows)
+</screen>
   </para>
   <para>
    A more versatile way to process JSON is to use jsonpath.  Within this context, as noted in
    <xref linkend="functions-sqljson-filter-ex-table"/>, the JSON null value is considered equal
    to other JSON null values.  However, while equaltiy works as expected, ordering is not implemented.
-   <programlisting>
-    SELECT
-     jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ &gt; null)') AS "GT",
-     jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ &lt; null)') AS "LT",
-     jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ &lt;&gt; null)') AS "NE";
-   </programlisting>
-   <screen>
-     GT | LT |    NE
-    ----+----+-----------
-     [] | [] | [1, 2, 3]
-    (1 row)
-   </screen>
+<programlisting>
+ SELECT
+  jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ &gt; null)') AS "GT",
+  jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ &lt; null)') AS "LT",
+  jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ &lt;&gt; null)') AS "NE";
+</programlisting>
+<screen>
+  GT | LT |    NE
+ ----+----+-----------
+  [] | [] | [1, 2, 3]
+ (1 row)
+</screen>
   </para>
  </sect2>
+
 </sect1>
-- 
2.34.1

v4-0001-Document-NULL.patchtext/x-patch; charset=US-ASCII; name=v4-0001-Document-NULL.patchDownload
From 3aad04b4478dd3662131cf987b678ecc0158ac9a Mon Sep 17 00:00:00 2001
From: "David G. Johnston" <David.G.Johnston@Gmail.com>
Date: Wed, 1 May 2024 07:45:48 -0700
Subject: [PATCH v4 1/2] Document NULL

---
 doc/src/sgml/datatype.sgml          |   2 +-
 doc/src/sgml/ddl.sgml               |   2 +
 doc/src/sgml/filelist.sgml          |   1 +
 doc/src/sgml/func.sgml              | 273 ++++----
 doc/src/sgml/json.sgml              |   7 +-
 doc/src/sgml/nullvalues.sgml        | 994 ++++++++++++++++++++++++++++
 doc/src/sgml/ref/create_domain.sgml |   7 +-
 doc/src/sgml/syntax.sgml            |  23 +-
 8 files changed, 1149 insertions(+), 160 deletions(-)
 create mode 100644 doc/src/sgml/nullvalues.sgml

diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml
index 6646820d6a..c55fa607e8 100644
--- a/doc/src/sgml/datatype.sgml
+++ b/doc/src/sgml/datatype.sgml
@@ -5352,7 +5352,7 @@ WHERE ...
        <row>
         <entry><type>unknown</type></entry>
         <entry>Identifies a not-yet-resolved type, e.g., of an undecorated
-         string literal.</entry>
+         string literal.  Also, the <link linkend="nullvalues-usage">null value.</link></entry>
        </row>
       </tbody>
      </tgroup>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 9b71c97bdf..9761f7578b 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -168,6 +168,8 @@ DROP TABLE products;
   </para>
  </sect1>
 
+ &nullvalues;
+
  <sect1 id="ddl-default">
   <title>Default Values</title>
 
diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml
index 38ec362d8f..882752e88f 100644
--- a/doc/src/sgml/filelist.sgml
+++ b/doc/src/sgml/filelist.sgml
@@ -21,6 +21,7 @@
 <!ENTITY indices    SYSTEM "indices.sgml">
 <!ENTITY json       SYSTEM "json.sgml">
 <!ENTITY mvcc       SYSTEM "mvcc.sgml">
+<!ENTITY nullvalues SYSTEM "nullvalues.sgml">
 <!ENTITY parallel   SYSTEM "parallel.sgml">
 <!ENTITY perform    SYSTEM "perform.sgml">
 <!ENTITY queries    SYSTEM "queries.sgml">
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 2609269610..f0d19c8055 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -23298,7 +23298,8 @@ MERGE INTO products p
    This section describes the <acronym>SQL</acronym>-compliant subquery
    expressions available in <productname>PostgreSQL</productname>.
    All of the expression forms documented in this section return
-   Boolean (true/false) results.
+   <link linkend="nullvalues">three-valued</link> typed
+   results (true, false, or null).
   </para>
 
   <sect2 id="functions-subquery-exists">
@@ -23360,19 +23361,17 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>IN</token>
+   is <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result.
-   The result of <token>IN</token> is <quote>true</quote> if any equal subquery row is found.
-   The result is <quote>false</quote> if no equal row is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any equal subquery row is found.
+   The result is <quote>false</quote> if no equal row is found.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>IN</token> construct will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.
   </para>
 
   <para>
@@ -23389,21 +23388,18 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.
+   The result of <token>IN</token> is <quote>false</quote> if the subquery returns no rows,
+   otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result.
-   The result of <token>IN</token> is <quote>true</quote> if any equal subquery row is found.
-   The result is <quote>false</quote> if no equal row is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any equal subquery row is found.
+   The result is <quote>false</quote> if no equal row is found.
   </para>
 
   <para>
-   As usual, null values in the rows are combined per
-   the normal rules of SQL Boolean expressions.  Two rows are considered
-   equal if all their corresponding members are non-null and equal; the rows
-   are unequal if any corresponding members are non-null and unequal;
-   otherwise the result of that row comparison is unknown (null).
-   If all the per-row results are either unequal or null, with at least one
-   null, then the result of <token>IN</token> is null.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -23415,20 +23411,17 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 </synopsis>
 
   <para>
-   The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
-   is evaluated and compared to each row of the subquery result.
-   The result of <token>NOT IN</token> is <quote>true</quote> if only unequal subquery rows
-   are found (including the case where the subquery returns no rows).
+   The right-hand side is a parenthesized subquery, which must return exactly one column.
+   The result of <token>NOT IN</token> is <quote>true</quote> if the subquery returns no rows,
+   otherwise the left-hand expression is evaluated and compared to each row of the subquery result.
+   The result is <quote>true</quote> if only unequal subquery rows are found.
    The result is <quote>false</quote> if any equal row is found.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>NOT IN</token> construct will be null, not true.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
+   tests are OR'd together.
   </para>
 
   <para>
@@ -23445,21 +23438,18 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.
+   The result of <token>NOT IN</token> is <quote>true</quote> if the subquery returns no rows,
+   otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result.
-   The result of <token>NOT IN</token> is <quote>true</quote> if only unequal subquery rows
-   are found (including the case where the subquery returns no rows).
+   The result is <quote>true</quote> if only unequal subquery rows are found.
    The result is <quote>false</quote> if any equal row is found.
   </para>
 
   <para>
-   As usual, null values in the rows are combined per
-   the normal rules of SQL Boolean expressions.  Two rows are considered
-   equal if all their corresponding members are non-null and equal; the rows
-   are unequal if any corresponding members are non-null and unequal;
-   otherwise the result of that row comparison is unknown (null).
-   If all the per-row results are either unequal or null, with at least one
-   null, then the result of <token>NOT IN</token> is null.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -23473,13 +23463,13 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>ANY</token> is
+   <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ANY</token> is <quote>true</quote> if any true result is obtained.
-   The result is <quote>false</quote> if no true result is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any true result is obtained.
+   The result is <quote>false</quote> if no true result is found.
   </para>
 
   <para>
@@ -23488,11 +23478,10 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   </para>
 
   <para>
-   Note that if there are no successes and at least one right-hand row yields
-   null for the operator's result, the result of the <token>ANY</token> construct
-   will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -23510,16 +23499,19 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.  The result of <token>ANY</token> is
+   <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result,
    using the given <replaceable>operator</replaceable>.
-   The result of <token>ANY</token> is <quote>true</quote> if the comparison
-   returns true for any subquery row.
-   The result is <quote>false</quote> if the comparison returns false for every
-   subquery row (including the case where the subquery returns no
-   rows).
-   The result is NULL if no comparison with a subquery row returns true,
-   and at least one comparison returns NULL.
+   The result is <quote>true</quote> if the comparison returns true for any subquery row.
+   The result is <quote>false</quote> if the comparison returns false for every subquery row.
+  </para>
+
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are OR'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -23537,15 +23529,20 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>ALL</token> is
+   <quote>true</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ALL</token> is <quote>true</quote> if all rows yield true
-   (including the case where the subquery returns no rows).
+   The result is <quote>true</quote> if all rows yield true.
    The result is <quote>false</quote> if any false result is found.
-   The result is NULL if no comparison with a subquery row returns false,
-   and at least one comparison returns NULL.
+  </para>
+
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -23566,22 +23563,21 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.  The result of <token>ALL</token> is
+   <quote>true</quote> if the subquery returns no rows, otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result,
    using the given <replaceable>operator</replaceable>.
-   The result of <token>ALL</token> is <quote>true</quote> if the comparison
-   returns true for all subquery rows (including the
-   case where the subquery returns no rows).
-   The result is <quote>false</quote> if the comparison returns false for any
-   subquery row.
-   The result is NULL if no comparison with a subquery row returns false,
-   and at least one comparison returns NULL.
+   The result is <quote>true</quote> if the comparison returns true for all subquery rows.
+   The result is <quote>false</quote> if the comparison returns false for any subquery row.
   </para>
 
   <para>
-   See <xref linkend="row-wise-comparison"/> for details about the meaning
-   of a row constructor comparison.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
+
   </sect2>
 
   <sect2 id="functions-subquery-single-row-comp">
@@ -23606,6 +23602,14 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    compared row-wise to the single subquery result row.
   </para>
 
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, the result cannot be <quote>true</quote> in the
+   presence of null valued fields in either the row constructor or the subquery result row, as
+   the individual field tests are AND'd together.
+   Note that <literal>IS DISTINCT FROM</literal> is not an operator.
+  </para>
+
   <para>
    See <xref linkend="row-wise-comparison"/> for details about the meaning
    of a row constructor comparison.
@@ -23673,7 +23677,8 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    <productname>PostgreSQL</productname> extensions; the rest are
    <acronym>SQL</acronym>-compliant.
    All of the expression forms documented in this section return
-   Boolean (true/false) results.
+   <link linkend="nullvalues">three-valued</link> boolean typed
+   results (true, false, or null).
   </para>
 
   <sect2 id="functions-comparisons-in-scalar">
@@ -23686,24 +23691,13 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   <para>
    The right-hand side is a parenthesized list
    of expressions.  The result is <quote>true</quote> if the left-hand expression's
-   result is equal to any of the right-hand expressions.  This is a shorthand
-   notation for
-
-<synopsis>
-<replaceable>expression</replaceable> = <replaceable>value1</replaceable>
-OR
-<replaceable>expression</replaceable> = <replaceable>value2</replaceable>
-OR
-...
-</synopsis>
+   result is equal to any of the right-hand expressions.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand expression yields
-   null, the result of the <token>IN</token> construct will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence null values since the multiple equality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -23717,35 +23711,15 @@ OR
   <para>
    The right-hand side is a parenthesized list
    of expressions.  The result is <quote>true</quote> if the left-hand expression's
-   result is unequal to all of the right-hand expressions.  This is a shorthand
-   notation for
-
-<synopsis>
-<replaceable>expression</replaceable> &lt;&gt; <replaceable>value1</replaceable>
-AND
-<replaceable>expression</replaceable> &lt;&gt; <replaceable>value2</replaceable>
-AND
-...
-</synopsis>
+   result is unequal to all of the right-hand expressions.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand expression yields
-   null, the result of the <token>NOT IN</token> construct will be null, not true
-   as one might naively expect.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of null values since the multiple inequality
+   tests are OR'd together.
   </para>
 
-  <tip>
-  <para>
-   <literal>x NOT IN y</literal> is equivalent to <literal>NOT (x IN y)</literal> in all
-   cases.  However, null values are much more likely to trip up the novice when
-   working with <token>NOT IN</token> than when working with <token>IN</token>.
-   It is best to express your condition positively if possible.
-  </para>
-  </tip>
   </sect2>
 
   <sect2 id="functions-comparisons-any-some">
@@ -23758,30 +23732,26 @@ AND
 
   <para>
    The right-hand side is a parenthesized expression, which must yield an
-   array value.
-   The left-hand expression
+   array value. The result of <token>ANY</token> is
+   <quote>false</quote> if the array has zero element, otherwise
+   the left-hand expression
    is evaluated and compared to each element of the array using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ANY</token> is <quote>true</quote> if any true result is obtained.
-   The result is <quote>false</quote> if no true result is found (including the
-   case where the array has zero elements).
+   The result is <quote>true</quote> if any true result is obtained.
+   The result is <quote>false</quote> if no true result is found.
   </para>
 
   <para>
-   If the array expression yields a null array, the result of
-   <token>ANY</token> will be null.  If the left-hand expression yields null,
-   the result of <token>ANY</token> is ordinarily null (though a non-strict
-   comparison operator could possibly yield a different result).
-   Also, if the right-hand array contains any null elements and no true
-   comparison result is obtained, the result of <token>ANY</token>
-   will be null, not false (again, assuming a strict comparison operator).
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both elements and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
    <token>SOME</token> is a synonym for <token>ANY</token>.
+   <token>IN</token> is equivalent to <literal>= ANY</literal>.
   </para>
   </sect2>
 
@@ -23795,26 +23765,27 @@ AND
   <para>
    The right-hand side is a parenthesized expression, which must yield an
    array value.
-   The left-hand expression
+   The result of <token>ALL</token> is
+   <quote>true</quote> if the array has zero elements, otherwise
+   the left-hand expression
    is evaluated and compared to each element of the array using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ALL</token> is <quote>true</quote> if all comparisons yield true
-   (including the case where the array has zero elements).
+   The result is <quote>true</quote> if all comparisons yield true.
    The result is <quote>false</quote> if any false result is found.
   </para>
 
   <para>
-   If the array expression yields a null array, the result of
-   <token>ALL</token> will be null.  If the left-hand expression yields null,
-   the result of <token>ALL</token> is ordinarily null (though a non-strict
-   comparison operator could possibly yield a different result).
-   Also, if the right-hand array contains any null elements and no false
-   comparison result is obtained, the result of <token>ALL</token>
-   will be null, not true (again, assuming a strict comparison operator).
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both elements and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
+
+  <para>
+   <token>NOT IN</token> is equivalent to <literal>&lt;&gt; ALL</literal>.
+  </para>
+
   </sect2>
 
   <sect2 id="row-wise-comparison">
@@ -23865,6 +23836,11 @@ AND
    considered.
   </para>
 
+  <para>
+   See <xref linkend="nullvalues-multielementcomparison-rowconstructor"/>
+   and surrounding content for additional details and examples.
+  </para>
+
 <synopsis>
 <replaceable>row_constructor</replaceable> IS DISTINCT FROM <replaceable>row_constructor</replaceable>
 </synopsis>
@@ -23899,20 +23875,11 @@ AND
 </synopsis>
 
   <para>
-   The SQL specification requires row-wise comparison to return NULL if the
-   result depends on comparing two NULL values or a NULL and a non-NULL.
-   <productname>PostgreSQL</productname> does this only when comparing the
-   results of two row constructors (as in
-   <xref linkend="row-wise-comparison"/>) or comparing a row constructor
-   to the output of a subquery (as in <xref linkend="functions-subquery"/>).
-   In other contexts where two composite-type values are compared, two
-   NULL field values are considered equal, and a NULL is considered larger
-   than a non-NULL.  This is necessary in order to have consistent sorting
-   and indexing behavior for composite types.
-  </para>
-
-  <para>
-   Each side is evaluated and they are compared row-wise.  Composite type
+   Each side is evaluated and they are compared row-wise.
+   As discussed and shown in <xref linkend="nullvalues-multielementcomparison-composite"/>,
+   null values are treated as being equal to other null values and greater
+   than all non-null values.
+   Composite type
    comparisons are allowed when the <replaceable>operator</replaceable> is
    <literal>=</literal>,
    <literal>&lt;&gt;</literal>,
diff --git a/doc/src/sgml/json.sgml b/doc/src/sgml/json.sgml
index 54648c459c..140f94e8e3 100644
--- a/doc/src/sgml/json.sgml
+++ b/doc/src/sgml/json.sgml
@@ -129,6 +129,11 @@
   the corresponding <productname>PostgreSQL</productname> types.
  </para>
 
+ <indexterm>
+  <primary>null value</primary>
+  <secondary sortas="json">within JSON</secondary>
+ </indexterm>
+
   <table id="json-type-mapping-table">
      <title>JSON Primitive Types and Corresponding <productname>PostgreSQL</productname> Types</title>
      <tgroup cols="3">
@@ -162,7 +167,7 @@
        <row>
         <entry><type>null</type></entry>
         <entry>(none)</entry>
-        <entry>SQL <literal>NULL</literal> is a different concept</entry>
+        <entry>An SQL null value is similar, but see <xref linkend="nullvalues-json"/> for differences.</entry>
        </row>
       </tbody>
      </tgroup>
diff --git a/doc/src/sgml/nullvalues.sgml b/doc/src/sgml/nullvalues.sgml
new file mode 100644
index 0000000000..6c4c29e305
--- /dev/null
+++ b/doc/src/sgml/nullvalues.sgml
@@ -0,0 +1,994 @@
+<sect1 id="nullvalues">
+ <title>Null Values Overview</title>
+
+ <indexterm>
+  <primary>null value</primary>
+ </indexterm>
+
+ <para>
+  This section first introduces the concept of null values and then goes
+  on to explain how different parts of the system behave when provided
+  one or more null value inputs.  Examples throughout this section
+  can be executed so long as the following table and rows are created first.
+ </para>
+
+ <programlisting>
+  CREATE TABLE null_examples (
+    id bigint PRIMARY KEY,
+    value integer NULL
+  );
+  INSERT INTO null_examples
+  VALUES (1, 1), (2, NULL), (3, 4);
+ </programlisting>
+
+ <sect2 id="nullvalues-model">
+  <title>Meaning</title>
+  <para>
+   Generally, a null value is assumed to mean "unknown", but other interpretations
+   are common.  A data model design may state that a null value
+   is to be used to represent "not applicable" - i.e., that a value is not
+   even possible.  The null value also takes on a literal meaning of "not found"
+   when produced as the result of an outer join.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-usage">
+  <title>Usage</title>
+  <para>
+   A null value, like all values, must have a data type, and is valid for all data types.
+  </para>
+  <para>
+   As noted in the <link linkend="sql-syntax-constants-nullvalue">synatx chapter</link>,
+   a null value literal is written using the <literal>NULL</literal> keyword.
+   Its type is the <link linkend="datatype-pseudo">pseudo-type unknown</link>
+   but can be cast to any concrete data type.
+  </para>
+  <para>
+   <programlisting>
+   SELECT
+    NULL AS "Literal Null Value",
+    pg_typeof(null) AS "Type of Null",
+    pg_typeof(NuLl::text) AS "Type of Cast null",
+    cast(null as text) AS "Cast null value";
+   </programlisting>
+   <screen>
+     Literal Null Value | Type of Null | Type of Cast null | Cast null value
+    --------------------+--------------+-------------------+-----------------
+                        | unknown      | text              |
+    (1 row)
+   </screen>
+  </para>
+  <para>
+   <programlisting>
+   SELECT text NULL;
+   </programlisting>
+   <screen>
+   ERROR:  column "text" does not exist
+   LINE 1: select text NUll;
+   </screen>
+  </para>
+  <para>
+   The presence of null values in the system results in three-valued logic.
+   In binary logic every outcome is either true or false.  In
+   three-valued logic unknown, represented using a null value, is
+   also an outcome.  Put a bit more formally, the
+   Law of the Excluded Middle does not hold: i.e.,
+   p OR NOT(p) != true; for all p.
+  </para>
+  <para>
+   Aspects of the system that branch based upon
+   whether a condition variable is true or false must therefore
+   decide how to behave when the condition is a null value.
+   The remaining sub-sections summarize these decisions, as well
+   as other behaviors.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-cardinalrule">
+  <title>Distinctness - Overcoming the Cardinal Rule of Null Values</title>
+  <para>
+   The cardinal rule, a null value is
+   <link linkend="functions-comparison-op-table">
+    neither equal nor unequal
+   </link>
+   to any value, including other null values.
+   <programlisting>
+    SELECT
+     NULL = NULL AS "N = N",
+     NULL != NULL AS "N != N",
+     1 = NULL AS "1 = N",
+     1 != NULL AS "1 != N",
+     1 = 1 AS "1 = 1",
+     1 != 1 AS "1 != 1";
+   </programlisting>
+   <screen>
+     N = N | N != N | 1 = N | 1 != N | 1 = 1 | 1 != 1
+    -------+--------+-------+--------+-------+--------
+           |        |       |        | t     | f
+    (1 row)
+   </screen>
+   However, as with many rules, there are exceptions, which are
+   <link linkend="nullvalues-multielementcomparison">noted below</link>.  Specifically,
+   when the two compared values are part of a larger multi-element value.
+   <programlisting>
+    SELECT
+     array[1,2]=array[1,null] AS "Array Equals";
+   </programlisting>
+   <screen>
+     Array Equals
+    --------------
+     f
+    (1 row)
+   </screen>
+  </para>
+  <para>
+   Because of this SQL specification mandated rule, checking for a null value has an
+   explicit <literal>IS NULL</literal> predicate, and additionally there comparison
+   predicates that consider a null value equal to other null values but unequal
+   to any other value (e.g., <literal>IS DISTINCT</literal>, and <literal>IS TRUE</literal>.)
+   These, and other predicates, are described in
+   <xref linkend="functions-comparison-pred-table"/>
+   <programlisting>
+    SELECT id, value,
+     value IS NULL AS "IS N",
+     value IS DISTINCT FROM id AS "IS D",
+     value != id AS "IS !="
+    FROM null_examples;
+   </programlisting>
+   <screen>
+     id | value | IS N | IS D | IS !=
+    ----+-------+------+------+-------
+      1 |     1 | f    | f    | f
+      2 |       | t    | t    |
+      3 |     4 | f    | t    | t
+    (3 rows)
+   </screen>
+  </para>
+  <para>
+   There is also a cardinal warning: when dealing with
+   <link linkend="rowtypes">composite types</link> in
+   expressions; <literal>composite IS NULL</literal>
+   and <literal>composite IS NOT NUll</literal>
+   are not the opposites of each other in the case where some,
+   but not all, of the composite's fields are null values.
+   (The case where all fields are null is indistinguishable
+   from the composite as a whole being null.)
+   Write <literal>NOT(composite IS NULL)</literal> instead.
+   <programlisting>
+    SELECT
+     c,
+     c IS NULL AS "c IS N",
+     NOT(c IS NULL) AS "NOT c IS N",
+     c IS NOT NULL AS "c IS NOT N",
+     ROW(value, value) IS NULL AS "ROW(v,v) IS N",
+     ROW(value, value) IS NOT NULL AS "ROW(v,v) IS NOT N"
+    FROM null_examples AS c;
+   </programlisting>
+   <screen>
+       c   | c IS N | NOT c IS N | c IS NOT N | ROW(v,v) IS N | ROW(v,v) IS NOT N
+    -------+--------+------------+------------+---------------+-------------------
+     (1,1) | f      | t          | t          | f             | t
+     (2,)  | f      | t          | f          | t             | f
+     (3,4) | f      | t          | t          | f             | t
+    (3 rows)
+   </screen>
+   See the <link linkend="nullvalues-multielement">multi-element
+   testing section</link> below for an explanation.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-operands">
+  <title>Null-Valued Operands</title>
+  <para>
+   As a general expectation, operator invocation expressions where one of inputs
+   is a null value will result in a null-valued output.
+   <programlisting>
+    SELECT
+     1 + null AS "Add",
+     'text' || null AS "Concatenate";
+   </programlisting>
+   <screen>
+     Add | Concatenate
+    -----+-------------
+         |
+    (1 row)
+   </screen>
+   Operators that behave otherwise should document their deviation from this norm.
+  </para>
+  <para>
+   A notable example of this is the <literal>IN</literal> operator, which
+   uses equality, not distinctness, for testing.
+   <programlisting>
+    SELECT
+     1 IN (1, null) AS "In Present",
+     1 IN (2, null) AS "In MIssing",
+     null IN (1, 2) AS "N In Non-N",
+     null IN (null, 2) AS "N In N";
+   </programlisting>
+   <screen>
+     In Present | In Missing | N In Non-N | N In N
+    ------------+------------+------------+--------
+     t          |            |            |
+    (1 row)
+   </screen>
+   This is just an extension of the multi-element testing behavior described
+   <link linkend="nullvalues-multielement">below</link>.
+  </para>
+  <para>
+   Experience shows that <literal>CASE</literal> expressions are also prone
+   to bugs since their format encourages binary logic thinking while a
+   <literal>WHEN</literal> test will not consider a null value to be a match.
+   <programlisting>
+    SELECT id, value,
+     CASE WHEN id = value THEN 'Equal' ELSE 'Not Equal' END AS "Affirm",
+     CASE WHEN id != value THEN 'Not Equal' ELSE 'Equal' END AS "Negate",
+     CASE WHEN value IS NULL THEN 'Null'
+          WHEN id = value THEN 'Equal'
+          ELSE 'Not Equal' END AS "Safe Affirm",
+     CASE WHEN value IS NULL THEN 'Null'
+          WHEN id != value THEN 'Not Equal'
+          ELSE 'Equal' END AS "Safe Negate"
+    FROM null_examples;
+   </programlisting>
+   <screen>
+     id | value |  Affirm   |  Negate   | Safe Affirm | Safe Negate
+    ----+-------+-----------+-----------+-------------+-------------
+      1 |     1 | Equal     | Equal     | Equal       | Equal
+      2 |       | Not Equal | Equal     | Null        | Null
+      3 |     4 | Not Equal | Not Equal | Not Equal   | Not Equal
+    (3 rows)
+   </screen>
+  </para>
+  <para>
+   The boolean operators <literal>AND</literal> and <literal>OR</literal>
+   will ignore the null value input if the other input is sufficient to
+   to determine the outcome.
+   <programlisting>
+    SELECT
+     true OR null AS "T or N",
+     false OR null AS "F or N",
+     true AND null AS "T and N",
+     false AND null AS "F and N";
+   </programlisting>
+   <screen>
+     T or N | F or N | T and N | F and N
+    --------+--------+---------+---------
+     t      |        |         | f
+    (1 row)
+   </screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-domains">
+  <title>Null Values in Domains</title>
+  <para>
+   A domain is a user-defined data type that can have a <literal>NOT NULL</literal> constraint.
+   However, some usages of domains will cause the resultant column to have the domain type but
+   the value will be null.  The common way this happens is by including the domain column's table
+   on the right side of a left join.
+   <programlisting>
+    BEGIN;
+    CREATE DOMAIN domain_example AS integer NOT NULL;
+    CREATE TABLE domain_examples (de_id bigint PRIMARY KEY, de_value domain_example);
+    INSERT INTO domain_examples VALUES (1, 1), (2, 2);
+    SELECT *, pg_typeof(de_value)
+    FROM null_examples AS ne
+    LEFT JOIN domain_examples AS de ON ne.id = de.de_id;
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    CREATE DOMAIN
+    CREATE TABLE
+    INSERT 0 2
+     id | value | de_id | de_value |   pg_typeof
+    ----+-------+-------+----------+----------------
+      1 |     1 |     1 |        1 | domain_example
+      2 |       |     2 |        2 | domain_example
+      3 |     4 |       |          | domain_example
+    (3 rows)
+
+    ROLLBACK
+   </screen>
+   Please see the details in the <link linkend="sql-createdomain-notes">
+   notes on the create domain page</link> for another example, as well as
+   commentary why this non-standard behavior exists.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-multielement">
+  <title>Testing Multi-Element Values with Null Elements</title>
+  <para>
+   Arrays and composite types are multi-element types.  Here we also consider non-empty
+   <link linkend="functions-subquery">subquery results</link>
+   and the list of values specified in the
+   <link linkend="functions-comparisons-in-scalar">IN test</link>.
+  </para>
+  <para>
+   When a test is performed on one of these multi-element values
+   the system will iterate over each element, or pair of elements if the test is
+   <link linkend="row-wise-comparison">comparing two row constructors</link> to each other,
+   left-to-right, combining the results using the boolean operations
+   <link linkend="nullvalues-operands">discussed above</link>. For tests that
+   require an exhaustive search, (e.g., <literal>ALL</literal>, <literal>NOT IN</literal>)
+   the search effectively ends when a false result is found (<literal>AND</literal> combiners).
+   For tests that simply require a true result, (e.g., <literal>ANY</literal>,
+   <literal>IN</literal>) the search effectively ends when a true result is found
+   (<literal>OR</literal> combiners). Therefore:
+   <simplelist>
+    <member>
+     <literal>IN</literal> and <literal>ANY</literal>
+     (<literal>OR</literal>) cannot produce a false result in the presence of null, and
+    </member>
+    <member>
+     <literal>NOT IN</literal> and <literal>ALL</literal>
+     (<literal>AND</literal>) cannot produce a true result in the presence of null.
+    </member>
+   </simplelist>
+   This is because any exhaustive search will produce at least one null value result
+   that cannot be ignored.
+  </para>
+  <para>
+   The SQL specification requires that non-exhaustive
+   (e.g., <literal>IN</literal> and <literal>ANY</literal>) subquery tests
+   return false when there are no rows in the subquery result, and return true
+   for the exhaustive tests (i.e., <literal>ALL</literal>).
+  </para>
+  <para>
+   Note that the <link linkend="nullvalues-cardinalrule">cardinal warning</link>
+   noted above is just the application of this behavior to the
+   <literal>IS NULL</literal> and <literal>IS NOT NULL</literal>
+   tests, which are both exhaustive search tests guaranteed to produce at least one false result
+   when the composite has a mix of null and non-null values.
+  </para>
+  <para>
+   The rules above, in situations where a predicate or a scalar value
+   are being compared to a multi-element value, are discussed
+   <link linkend="nullvalues-multielementpredicates">next</link>.
+   Then the rules when two multi-element values are compared
+   to each other are discussed <link linkend="nullvalues-multielementcomparison">here</link>
+   (including the two row constructor comparison case.)
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-multielementpredicates">
+  <title>Multi-Element Predicates and Scalars</title>
+  <sect3 id="nullvalues-multielementpredicates-composites">
+   <title>Composite Fields</title>
+   <para>
+    When a composite typed valued is created a null value can be assigned to any
+    of its fields (see <xref linkend="rowtypes-constructing"/> for how to do this).
+    So long as at least one field is non-null the composite value
+    as whole exists and an <literal>IS NULL</literal> predicate will return false.
+   </para>
+   <para>
+    Applying the <literal>IS NOT NULL</literal> predicate to a composite value performs
+    checks whether all fields of the composite have non-null values.  This is not the same
+    as a non-null composite value.  Specifically, if the composite value has
+    a null-valued field then both the <literal>IS NOT NULL</literal> predicate and the
+    <literal>IS NULL</literal> predicate will return false.
+    <programlisting>
+     SELECT
+      ROW(1,2) IS NULL AS "Row Is Null",
+      ROW(1,2) IS NOT NULL AS "Row Is Not Null",
+      ROW(1,NULL) IS NULL AS "Row Is Null",
+      ROW(1,NULL) IS NOT NULL AS "Row Is Not Null";
+    </programlisting>
+    <screen>
+      Row Is Null | Row Is Not Null | Row Is Null | Row Is Not Null
+     -------------+-----------------+-------------+-----------------
+      f           | t               | f           | f
+     (1 row)
+    </screen>
+   </para>
+   <para>
+    Please read <xref linkend="composite-type-comparison"/> for a complete treatment
+    on how <productname>PostgreSQL</productname> handles row-wise comparison.  The
+    next two multi-element parts of this section discuss those comparisons in the
+    presence of null-valued fields, and also in terms of the SQL specification.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementpredicates-arrays">
+   <title>Array Elements and IN Bag Members</title>
+   <para>
+    Examples of applying the behavior discussed in <xref linkend="nullvalues-multielement"/>
+    to arrays, and <literal>IN</literal> and <literal>NOT IN</literal> bags, using the
+    operators defined in <xref linkend="functions-comparisons"/>.
+   </para>
+   <para>
+    <programlisting>
+     SELECT
+      1 = ANY(array[1, 1, NULL]) AS "Any-Null-Match",
+      1 = ANY(array[1, 1]) AS "Any-NoNull-Match",
+      1 = ALL(array[1, 1, NULL]) AS "ALL-Null-Match",
+      1 = ALL(array[1, 1]) AS "All-NoNull-Match";
+     SELECT
+      2 = ANY(array[1, 1, NULL]) AS "Any-Null-NoMatch",
+      2 = ANY(array[1, 1]) AS "Any-NoNull-NoMatch",
+      2 = ALL(array[1, 1, NULL]) AS "ALL-Null-NoMatch",
+      2 = ALL(array[1, 1]) AS "All-NoNull-NoMatch";
+     SELECT
+      1 IN (1, 1, NULL) AS "IN-Null-Positive",
+      1 IN (1, 1) AS "IN-NoNull-Positive",
+      1 NOT IN (2, 2, NULL) AS "NotIN-Null-Positive",
+      1 NOT IN (2, 2) AS "NotIN-NoNull-Positive";
+     SELECT
+      2 IN (1, 1, NULL) AS "IN-Null-Negative",
+      2 IN (1, 1) AS "IN-NoNull-Negative",
+      2 NOT IN (2, 2, NULL) AS "NotIN-Null-Negative",
+      2 NOT IN (2, 2) AS "NotIN-NoNull-Negative";
+    </programlisting>
+    <screen>
+      Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+     ----------------+------------------+----------------+------------------
+      t              | t                |                | t
+     (1 row)
+
+      Any-Null-NoMatch | Any-NoNull-NoMatch | ALL-Null-NoMatch | All-NoNull-NoMatch
+     ------------------+--------------------+------------------+--------------------
+                       | f                  | f                | f
+     (1 row)
+
+      IN-Null-Positive | IN-NoNull-Positive | NotIN-Null-Positive | NotIN-NoNull-Positive
+     ------------------+--------------------+---------------------+-----------------------
+      t                | t                  |                     | t
+     (1 row)
+
+      IN-Null-Negative | IN-NoNull-Negative | NotIN-Null-Negative | NotIN-NoNull-Negative
+     ------------------+--------------------+---------------------+-----------------------
+                       | f                  | f                   | f
+     (1 row)
+    </screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementpredicates-subqueries">
+   <title>Single-Column Subquery Rows</title>
+   <para>
+    Examples of applying the behavior discussed in <xref linkend="nullvalues-multielement"/>
+    to subqueries using the operators defined in <xref linkend="functions-subquery"/>.  Note that
+    this section covers the multiple elements being checked are rows, each having one column.  If
+    the column itself is multi-element then the thing being searched for must be a compatible
+    multi-element value, and the corresponding comparison behavior described in
+    <xref linkend="nullvalues-multielementcomparison"/> will also be applied.
+
+   </para>
+   <para>
+    <programlisting>
+     SELECT
+      1 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-Match",
+      1 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-Match",
+      1 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-Match",
+      1 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-Match";
+     SELECT
+      2 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-NoMatch",
+      2 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-NoMatch",
+      2 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-NoMatch",
+      2 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-NoMatch";
+    </programlisting>
+    <screen>
+      Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+     ----------------+------------------+----------------+------------------
+      t              | t                |                | t
+     (1 row)
+
+      Any-Null-NoMatch | Any-NoNull-NoMatch | ALL-Null-NoMatch | All-NoNull-NoMatch
+     ------------------+--------------------+------------------+--------------------
+                       | f                  | f                | f
+     (1 row)
+    </screen>
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-multielementcomparison">
+  <title>Multi-Element Comparisons</title>
+  <para>
+   The <link linkend="nullvalues-multielementpredicates">prior section</link> discussed applying
+   a predicate or a scalar value check element-wise across a multi-element value.
+   This section moves the discussion over to comparing two multi-element values to each other.
+   As both array and composite typed values
+   can be stored within an index, and comparing two values in that context must not produce
+   a null-valued result, considerations are made to adhere to the SQL specification where
+   possible while still making indexes, which the specification is silent on, functional.
+   Specifically, except when comparing two row constructors, null values are considered
+   equal to other null values and greater than all non-null values.
+  </para>
+  <para>
+   There are five pair-wise comparison situations to consider:
+   element-wise when the inputs are arrays, and row-wise when the inputs can be either
+   row constructors or composite typed values.  While these four later combinations seem similar,
+   the fact that row constructors are query literals, while composite typed values can be stored,
+   brings about important differences in how they are treated.  Please read
+   <xref linkend="composite-type-comparison"/> for a fuller treatment of this topic.  Here
+   we briefly recap the five different situations in the presence of null values.
+  </para>
+  <sect3 id="nullvalues-multielementcomparison-array">
+   <title>Element-wise Comparisons</title>
+   <para>
+    First situation, null values within an array compare as equal to each other and greater than all
+    non-null values, regardless of whether the comparison involves
+    <link linkend="sql-syntax-array-constructors">array constructors</link> or array typed values.
+    <programlisting>
+     SELECT
+      array[1,2]=array[1,null] AS "Constructors",
+      s, t,
+      s = t AS "Stored Equality",
+      t &gt; s AS "Stored Ordering"
+     FROM
+     (values (array[1,2])) AS sv (s),
+     (values (array[1,null::integer])) AS st (t);
+    </programlisting>
+    <screen>
+      Constructors |   s   |    t     | Stored Equality | Stored Ordering
+     --------------+-------+----------+-----------------+-----------------
+      f            | {1,2} | {1,NULL} | f               | t
+     (1 row)
+    </screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-rowconstructor">
+   <title>Row-wise Mutual Row Constructor Comparisons</title>
+   <para>
+    In this situation null values produce unknown when compared to all values.
+    <programlisting>
+     SELECT
+      (1,2)=(1,null) AS "NonNull=Null",
+      (1,null::integer)=(1,null) AS "Null=Null";
+    </programlisting>
+    <screen>
+      NonNull=Null | Null=Null
+     --------------+-----------
+                   |
+     (1 row)
+    </screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-composite">
+   <title>Row-wise Composite Involved Comparisons</title>
+   <para>
+    In these three situations null values are considered equal to each other and greater than
+    all non-null value.
+   </para>
+   <programlisting>
+    SELECT s, t,
+     s = t AS "Stored Equals Stored",
+     t &lt; (1,2) AS "Stored LT Constructor",
+     t = (1,null::integer) AS "Stored Equals Constructor"
+    FROM
+     (values (1,2)) AS s,
+     (values (1,null::integer)) AS t;
+   </programlisting>
+   <screen>
+       s   |  t   | Stored Equals Stored | Stored LT Constructor | Stored Equals Constructor
+    -------+------+----------------------+-----------------------+---------------------------
+     (1,2) | (1,) | f                    | f                     | t
+    (1 row)
+   </screen>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-sqlconformance">
+   <title>SQL Specification Conformance</title>
+   <para>
+    The SQL specification requires row-wise comparison to return NULL if the
+    result depends on comparing two NULL values or a NULL and a non-NULL.
+    <productname>PostgreSQL</productname> does this only when comparing the
+    results of two row constructors (as in
+    <xref linkend="row-wise-comparison"/>) or comparing a row constructor
+    to the output of a subquery (as in <xref linkend="functions-subquery"/>).
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-functions">
+  <title>Null-Valued Arguments in Normal Function Calls</title>
+  <para>
+   <link linkend="sql-createfunction">Function specifications</link>
+   have a "strictness" attribute (<literal>pg_proc.proisstrict</literal>) that,
+   when set to "strict" (true) will tell the executor to return a null value for any
+   function call having at least one null-valued input, without executing the
+   function.
+  </para>
+  <para>
+   Most functions, especially single argument functions, are defined with strict because without
+   non-null values to act upon they cannot produce a meaningful result.  However, for multi-argument
+   functions, especially <link linkend="xfunc-sql-variadic-functions">variadic functions</link>
+   like concatenate, null values often are simply ignored.
+   This can be different than the choice made by a binary operator performing the same function,
+   like for concatenating text, but not always, like concatenating an element onto an array.
+   <programlisting>
+    SELECT
+     lower(null::text) AS "Lower",
+     left('text', null) AS "Left",
+     'one' || null AS "|| Text Op",
+     concat('one', null) AS "concat Text Func",
+     array_append(array[1], null) AS "append([], null)",
+     array[1]::integer[] || null::integer AS "[] || null",
+     array[1]::integer[] || null::integer[] AS "[] || null[]";
+   </programlisting>
+   <screen>
+     Lower | Left | || Text Op | concat Text Func | append([], null) | [] || null | [] || null[]
+    -------+------+------------+------------------+------------------+------------+--------------
+           |      |            | one              | {1,NULL}         | {1,NULL}   | {1}
+    (1 row)
+   </screen>
+   In short, please read the documentation for the functions you use if they may receive null inputs
+   to understand how they will behave.  Send a documentation comment pointing out any functions
+   that do not behave strictly but whose actual behavior in the presence of null-valued input
+   is not described or readily inferred.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-aggregates">
+  <title>Null-Valued Arguments in Aggregate and Window Functions</title>
+  <para>
+   When executing an aggregate or window function the state tracking
+   component will remain unchanged even if the underlying processing
+   function returns a null value, whether from being defined strict
+   or it simply returns a null value upon execution.  The aggregation
+   routine will usually ignore the null value and continue processing,
+   as demonstrated in <literal>count(value)</literal> below.
+   <programlisting>
+    SELECT
+     count(*) AS "Count",
+     count(value) AS "Count Value",
+     count(null_examples) AS "Count Composite",
+     count(row(value, value)) AS "Count Row"
+    FROM null_examples;
+   </programlisting>
+   <screen>
+     Count | Count Value | Count Composite | Count Row
+    -------+-------------+-----------------+-----------
+         3 |           2 |               3 |         3
+    (1 row)
+   </screen>
+   Notice the "Count Row" outcome, though.  While we noted in the cardinal warning
+   that a composite whose fields are all null values is indistinguishable from
+   a null value of composite type, the count aggregate does indeed distinguish them,
+   recognizing and counting the non-null composite value produced by the
+   <link linkend="sql-syntax-row-constructors">row constructor</link>
+   <literal>row(null, null)</literal>.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-where">
+  <title>Null Values in Where</title>
+  <para>
+   A <literal>WHERE</literal> clause that evaluates to a null value for a given row will exclude that row.
+   <programlisting>
+    SELECT id, value AS "Equals 1"
+    FROM null_examples
+    WHERE value = 1;
+
+    SELECT id, value AS "Not Equal to 1"
+    FROM null_examples
+    WHERE value != 1;
+   </programlisting>
+   <screen>
+     id | Equals 1
+    ----+----------
+      1 |        1
+    (1 row)
+
+     id | Not Equal to 1
+    ----+----------------
+      3 |              4
+    (1 row)
+   </screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-table-constraints">
+  <title>Null Values in Table Constraints</title>
+  <para>
+   It is possible to define
+   <link linkend="ddl-constraints-check-constraints">check constraint</link>
+   expressions on tables to ensure only values passing those expressions are inserted.
+   While this seems like it would behave the same as a where clause, the choice here,
+   when an expression evaulates to a null value, is to allow the row to be inserted
+   - the same as a true result.
+   <programlisting>
+    BEGIN;
+    ALTER TABLE null_examples ADD CONSTRAINT value_not_1 CHECK (value != 1);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    ERROR:  check constraint "value_not_1" of relation "null_examples" is violated by some row
+    ROLLBACK
+   </screen>
+   <programlisting>
+    BEGIN;
+    ALTER TABLE null_examples ADD CONSTRAINT value_not_10 CHECK (value != 10);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    ALTER TABLE
+    ROLLBACK
+   </screen>
+   We are using a transaction (begin and rollback) and the alter table command to add two
+   constraints to our null_examples table.  The first constraint prohibits rows with a value
+   of 1, which our row with an id of 1 violates.  Prohibiting the value 10 definitely allows
+   rows with ids 1 and 3 to exist, and since we are not told that some row violates our
+   constraint the null value in the row with id 2 is being accepted as well.
+  </para>
+  <para>
+   The <link linkend="ddl-constraints-not-null"><literal>NOT NULL</literal> column constraint</link>
+   produces the same answer as a <literal>column IS NOT NULL</literal> check constraint but is
+   more concise to write.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-grouping">
+  <title>Null Values When Grouping</title>
+  <para>
+   In the context of both <literal>DISTINCT</literal> and <literal>GROUP BY</literal>
+   it is necessary that all inputs resolve to being either equal to or not equal to all
+   other values.  These features use <link linkend="nullvalues-cardinalrule">distinctness</link>
+   instead of simple equality in order to handle a null value like a definite value equal to
+   another null vale and unequal to all other values.
+   <programlisting>
+    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+    SELECT
+     value,
+     count(*) AS "Count"
+    FROM vals
+    GROUP BY value
+    ORDER BY value;
+   </programlisting>
+   <screen>
+     value | Count
+    -------+-------
+         1 |     2
+         2 |     1
+           |     2
+    (3 rows)
+   </screen>
+   <programlisting>
+    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+    SELECT DISTINCT value
+    FROM vals
+    ORDER BY value NULLS FIRST;
+   </programlisting>
+   <screen>
+     value
+    -------
+
+         1
+         2
+    (3 rows)
+   </screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-ordering">
+  <title>Null Values When Ordering</title>
+  <para>
+   In the context of <literal>ORDER BY</literal>, distinctness rules also apply,
+   though this is insufficient since it must be determined whether or not to
+   present null values before or after all non-null values.  To handle
+   this, the <literal>ORDER BY</literal> clause will let you specify either
+   <literal>NULLS FIRST</literal> or <literal>NULLS LAST</literal>.
+   <programlisting>
+    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+    SELECT value FROM vals
+    ORDER BY value DESC NULLS FIRST;
+   </programlisting>
+   <screen>
+     value
+    -------
+
+
+         2
+         1
+         1
+    (5 rows)
+   </screen>
+  </para>
+  <para>
+   Note that when dealing with multi-element values the comparison behavior
+   <link linkend="nullvalues-multielementcomparison">described above</link> applies,
+   if the comparison determination rests upon comparing a null value to a non-null value
+   the multi-element value with the null-valued component will sort greater than the one
+   with a non-null component.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-indexed">
+  <title>Null Values in Indexes</title>
+  <para>
+   The uniqueness and relative ordering rules applied to null values
+   are defined when creating an index.  For the default
+   <literal>NULLS DISTINCT</literal> uniqueness, equality rules are applied.
+   Specifying <literal>NULLS NOT DISTINCT</literal> will result in
+   <literal>IS DISTINCT FROM</literal> rules being applied whereby all null
+   values are equal to each other.  This setting applies to all columns in the index.
+  </para>
+  <para>
+   <programlisting>
+    BEGIN;
+    CREATE UNIQUE INDEX value_nulls_distinct_implicit ON null_examples (value);
+    CREATE UNIQUE INDEX value_nulls_distinct_explicit ON null_examples (value) NULLS DISTINCT;
+    INSERT INTO null_examples VALUES (4, NULL);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    CREATE INDEX
+    CREATE INDEX
+    INSERT 0 1
+    ROLLBACK
+   </screen>
+   <programlisting>
+    BEGIN;
+    CREATE UNIQUE INDEX value_nulls_not_distinct_explicit ON null_examples (value) NULLS NOT DISTINCT;
+    INSERT INTO null_examples VALUES (4, NULL);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    CREATE INDEX
+    ERROR:  duplicate key value violates unique constraint "value_nulls_not_distinct_explicit"
+    DETAIL:  Key (value)=(null) already exists.
+    ROLLBACK
+   </screen>
+  </para>
+  <para>
+   For ordering, each column in the index gets its own specification of
+   direction and null value placement similar to that found in the
+   <literal>ORDER BY</literal> clause.
+  </para>
+  <para>
+   Note that when dealing with multi-element values the comparison behavior
+   <link linkend="nullvalues-multielementcomparison">described above</link> applies,
+   if the comparison determination rests upon comparing a null value to a non-null value
+   the multi-element value with the null-valued component will sort greater than the one
+   with a non-null component.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-partitionkeys">
+  <title>Null Values in Partiton Keys</title>
+  <para>
+   At present this is typically a non-issue as <productname>PostgreSQL</productname>
+   does not support a primary key that does not include partition key columns, and
+   all columns in a primary key are forced to be have not null constraints.
+  </para>
+  <para>
+   However, should you setup a situation where a partition key column can both: have a null value
+   and, null values in that key go to a specific partition, list-based routing will work as expected.
+   There is presently no way to direct rows having null values in partition keys away from the
+   default partition for range and hash partitioning.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-settings">
+  <title>Null-Valued Settings</title>
+  <para>
+   There are none.  During initializion all settings are assigned a non-null value.
+  </para>
+  <para>
+   This is mostly meaningful for <link linkend="runtime-config-custom">custom settings</link>,
+   thus this section focuses on <link linkend="config-setting-sql">SQL interaction</link>.
+   Unlike settings created by extensions, custom settings can only be textual and the default
+   value for text here is the empty string.
+   <programlisting>
+    SHOW example.string;
+    BEGIN;
+    SELECT set_config('example.string', NULL, true);
+    SELECT current_setting('example.string') IS NULL AS "Setting Is Null";
+    ROLLBACK;
+    SHOW example.string;
+    RESET example.string;
+    SHOW example.string;
+   </programlisting>
+   <screen>
+    ERROR:  unrecognized configuration parameter "example.string"
+    BEGIN
+     set_config
+    ------------
+
+    (1 row)
+
+     Setting Is Null
+    -----------------
+     f
+    (1 row)
+
+    ROLLBACK
+     example.string
+    ----------------
+
+    (1 row)
+
+    RESET
+     example.string
+    ----------------
+
+    (1 row)
+   </screen>
+   Notice two important behaviors: first, even though we passed in a null value to
+   to the <literal>set_config</literal> function, the <literal>current_setting</literal>
+   function returned a non-null value, specifically the empty string.  Second, after ROLLBACK the
+   setting is still present (i.e., the error seen before creating the setting no longer appears),
+   and in fact will remain so until the session ends
+   (i.e., RESET does not restore the non-existence state.)
+  </para>
+  <para>
+    The other ways to specify settings do not have a means to specify null values,
+    a specific non-null value is required as part of the specification of the setting.
+   </para>
+ </sect2>
+
+ <sect2 id="nullvalues-json">
+  <title>Null Values in JSON</title>
+  <para>
+   As noted in <xref linkend="json-type-mapping-table"/>, JSON has a null value
+   that does not get exposed at the SQL level.
+   <programlisting>
+    SELECT 'null'::json IS NULL AS "JSON null is NULL";
+   </programlisting>
+   <screen>
+     JSON null is NULL
+    -------------------
+     f
+    (1 row)
+   </screen>
+   Additionally, the SQL operators and functions involving JSON key or array element selection,
+   or construction from literals, require that a number or text value be supplied as an operand
+   and so JSON null values cannot be targeted by those operators and functions.
+   <programlisting>
+    SELECT to_json(null::text);
+   </programlisting>
+   <screen>
+     to_json
+    ---------
+
+    (1 row)
+   </screen>
+   That all said, the system will convert from SQL null values to JSON null values when in a
+   composite type context.
+   <programlisting>
+    SELECT json_build_object('value', value)
+    FROM null_examples;
+   </programlisting>
+   <screen>
+     json_build_object
+    -------------------
+     {"value" : 1}
+     {"value" : null}
+     {"value" : 4}
+    (3 rows)
+   </screen>
+   And vice versa.
+   <programlisting>
+    SELECT *
+    FROM jsonb_to_recordset('[{"value":1},{"value":null},{"value":4}]'::jsonb) AS jtr (value integer);
+   </programlisting>
+   <screen>
+     value
+    -------
+         1
+
+         4
+    (3 rows)
+   </screen>
+  </para>
+  <para>
+   A more versatile way to process JSON is to use jsonpath.  Within this context, as noted in
+   <xref linkend="functions-sqljson-filter-ex-table"/>, the JSON null value is considered equal
+   to other JSON null values.  However, while equaltiy works as expected, ordering is not implemented.
+   <programlisting>
+    SELECT
+     jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ &gt; null)') AS "GT",
+     jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ &lt; null)') AS "LT",
+     jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ &lt;&gt; null)') AS "NE";
+   </programlisting>
+   <screen>
+     GT | LT |    NE
+    ----+----+-----------
+     [] | [] | [1, 2, 3]
+    (1 row)
+   </screen>
+  </para>
+ </sect2>
+</sect1>
diff --git a/doc/src/sgml/ref/create_domain.sgml b/doc/src/sgml/ref/create_domain.sgml
index ce55520348..027a145f2c 100644
--- a/doc/src/sgml/ref/create_domain.sgml
+++ b/doc/src/sgml/ref/create_domain.sgml
@@ -197,9 +197,10 @@ CREATE DOMAIN <replaceable class="parameter">name</replaceable> [ AS ] <replacea
    Domain constraints, particularly <literal>NOT NULL</literal>, are checked when
    converting a value to the domain type.  It is possible for a column that
    is nominally of the domain type to read as null despite there being such
-   a constraint.  For example, this can happen in an outer-join query, if
-   the domain column is on the nullable side of the outer join.  A more
-   subtle example is
+   a constraint.  For example, this can happen in
+   <link linkend="nullvalues-domains">an outer-join query</link>, if
+   the domain column is on the nullable side of the outer join.
+   A more subtle example is
 <programlisting>
 INSERT INTO tab (domcol) VALUES ((SELECT domcol FROM tab WHERE false));
 </programlisting>
diff --git a/doc/src/sgml/syntax.sgml b/doc/src/sgml/syntax.sgml
index 4dfbbd0862..7aa811a448 100644
--- a/doc/src/sgml/syntax.sgml
+++ b/doc/src/sgml/syntax.sgml
@@ -281,9 +281,9 @@ U&amp;"d!0061t!+000061" UESCAPE '!'
    </indexterm>
 
    <para>
-    There are three kinds of <firstterm>implicitly-typed
+    There are four kinds of <firstterm>implicitly-typed
     constants</firstterm> in <productname>PostgreSQL</productname>:
-    strings, bit strings, and numbers.
+    strings, bit strings, numbers, and the null value.
     Constants can also be specified with explicit types, which can
     enable more accurate representation and more efficient handling by
     the system. These alternatives are discussed in the following
@@ -834,6 +834,25 @@ CAST ( '<replaceable>string</replaceable>' AS <replaceable>type</replaceable> )
      usage, as is the function-call syntax.
     </para>
    </sect3>
+
+   <sect3 id="sql-syntax-constants-nullvalue">
+    <title>The Null Value Constant</title>
+    <indexterm>
+     <primary>null value</primary>
+     <secondary>constant</secondary>
+    </indexterm>
+    <para>
+     The null value represents an unknown value and its constant, the keyword <literal>NULL</literal>,
+     when evaluated in an expression, likewise yields a value of <literal>unknown</literal> type.
+     See <xref linkend="nullvalues"/> for an overview of how the system behaves in the presence
+     of a null value in various contexts.
+    </para>
+    <para>
+     Due to the typing of a null value as <literal>unknown</literal> it is often necessary to use
+     a cast, as described in the previous section, to convert it to the specific type needed.
+     However, implicit casting is performed when contextual information is available.
+    </para>
+   </sect3>
   </sect2>
 
   <sect2 id="sql-syntax-operators">
-- 
2.34.1

#26jian he
jian.universality@gmail.com
In reply to: David G. Johnston (#25)
1 attachment(s)
Re: Document NULL

On Sat, Jun 29, 2024 at 4:40 AM David G. Johnston
<david.g.johnston@gmail.com> wrote:

The attached are complete and ready for review. I did some file structure reformatting at the end and left that as the second patch. The first contains all of the content.

I'm adding this to the commitfest.

Thanks!

David J.

in doc/src/sgml/nullvalues.sgml
can we mention
\pset null NULL
command, then NULL means this value is NULL.

you can also see doc/src/sgml/func.sgml
(The above example can be copied-and-pasted
into <application>psql</application> to set things up for the following
examples.
-------------------------------------------------------------
in doc/src/sgml/nullvalues.sgml
see the attached for one example output

in doc/src/sgml/nullvalues.sgml we have
one_whitespace<programlisting>
two_whitespace<programlisting>
three_whitespace<programlisting>
four_whitespace<programlisting>

i think you need zero whitespace for tag <programlisting>. like
<programlisting>
</programlisting>

https://tdg.docbook.org/tdg/4.5/programlisting
says whitespaces are significant.

<<>>
As noted in <xref linkend="json-type-mapping-table"/>, JSON has a null value
that does not get exposed at the SQL level.
<<>>
i feel like this sentence is weird. since these two are different things.

I think some of the query and query output can be combined into one
<programlisting>.
no need one <programlisting> for the query, one <screen> for the output.
see example in doc/src/sgml/datatype.sgml.

<programlisting>
SELECT '2 years 15 months 100 weeks 99 hours 123456789 milliseconds'::interval;
interval
---------------------------------------
3 years 3 mons 700 days 133:17:36.789
</programlisting>

Attachments:

image.pngimage/png; name=image.pngDownload
�PNG


IHDR���P�sBIT|d� IDATx^���U��?�%��ED@@T�(*v�h,Q�I�%U�����&7Qc��&�\����c5�&V{A)�(Ho���u���i�Lcf����<�����k�{�}F��|[}+( @� @� @� @� @� @� @�dZ��J-� @� @� @� @� @� @��� @� @� @� @� @� @� @�@�	���\ @� @� @� @� @� @�  \� @� @� @� @� @� @� @�%& \Xb�r	 @� @� @� @� @� @� @��p�{� @� @� @� @� @� @����pa�]p�%@� @� @� @� @� @� @���� @� @� @� @� @� @� Pb��%v�-� @� @� @� @� @� @�� @� @� @� @� @� @� @�@�	���\ @� @� @� @� @� @�  \� @� @� @� @� @� @� @�%& \Xb�r	 @� @� @� @� @� @� @��p�{� @� @� @� @� @� @����pa�]p�%@� @� @� @� @� @� @���� @� @� @� @� @� @� Pb��%v�-� @� @� @� @� @� @�� @� @� @� @� @� @� @�@�	���\ @� @� @� @� @� @�  \� @� @� @� @� @� @� @�%& \Xb�r	 @� @� @� @� @� @� @��p�{� @� @� @� @� @� @����pa�]p�%@� @� @� @� @� @� @���� @� @� @� @� @� @� Pb��%v�-� @� @� @� @� @� @�� @� @� @� @� @� @� @�@�	���\ @� @� @� @� @� @�  \� @� @� @� @� @� @� @�%& \Xb�r	 @� @� @� @� @� @� @��p�{� @� @� @� @� @� @����pa�]p�%@� @� @� @� @� @� @���� @� @� @� @� @� @� Pb��%v�-� @� @� @� @� @� @�� @� @� @� @� @� @� @�@�	���\ @� @� @� @� @� @�  \� @� @� @� @� @� @� @�%& \Xb�r	 @� @� @� @� @� @� @�@k @�@���o�!�\��|�-�����Y%��o�������w��}�������-��.{�}aF���w_�{�>\w��u��� �}W��	 @� @� @� @� @�\@�������b�m�^��0�zgQX�jmX�nC���M���6apx��}�b��?43�5�7����9������U1���V!t��.����Y0�O��u��Q @� @� @� @� @� @�@���E�9�@�Xz}�wu�l����W�_�qj`��Ma��3�^
OO�6l�T�!�c������O�O���c��m��y��p���������wKO-�������{���Z�*%y�X�-���
�����W��������w��on}tr��w�m��w?Y��M�����s���G��zw����@U��Nx-<�����9��>�j��������c��.���CB�6[W��	 @� @� @� @� @� @`��p���@X���f�����S����=�Y���9��tU���?�O�<��p�!�t\c�4�����?�����sM��n���)������q
V{���%'\��Wo-Xv��[��;2���k���	�����X?���oB���)!�������)�3_����p���SV/��B�`? @� @� @� @� @�4W�V�u��M�@�KW��~�&���������-��/cfO{��u��~�����jr������q~�������B��i�5h��}��9�317X���Y�!<:yf���"��_�>q����O**X�?���0}&|��w��+�G�>
�'@� @� @� @� @� @�@c
�\����E�R�����C��u��g��S���)����x'|�w�
+V���{
Q��������;�N���e�������g��^;�����m�#��nM�R��g^y�)L�NsX�v}�������tr��qp�l�U�G�n3�|�1���>r@�����������U:�q#v���
B�*����~t���)�������w�v��w���s���]��qcX�|uX��������
��g_y+�������c�_������ @� @� @� @� @��- \�V �B�����o8�����j�o�-th�&'\8j�A�+���^a�)X�K��z��a�3��~('u��
���;�kS������1�����O�c\�[�6���\������}L{�-/0z��9��Y�,3�^������������~�W-�u��JF �c��]^�s���y�)#���mZo]�G
A?�����B��^��z��w��.93l��S�cx� @� @� @� @� @��*��Tn�Z�@���]�c���Ti>W^pBh��U���c��k��_\tR����y�n?���9�Sg������k�~�:o�0�����9o��u��u�q��[��uYu�-�+�0Y�2Fq;������]c&�Z� ���j������9�4�N��L�� 0{�����b���#�
�^vN��9��`abH��:�����1��v�|w�������+b � @� @� @� @� @��Y@���� �4��\�3���:6���5h����n���0rX���w�^;��w�s�#��(j�����q�����+���G���7��i|��O:0��������?�&0z�]rv|p�k�X�^�'��6l�W[o�*5\��j��T������	k��.��S
�9kTH�_���c���:?r���C�3�oc_,v8� @� @� @� @� @� @�$�����`�H�_`�������X��2��cH�[��uU<vDn���sl�7��%��w=U~����im�#\s�=w�>�`��������nnKi��}���u��pyxy��:�5?����)��4��C��^�{^�8r�����_�������m���]������u�u0 @� @� @� @� @�-U�uK]�u(u��pa�Z�����~�s��2��_�>th��Q��q���,����������V�5q>��V��6|��������W�-��O�:.����C��>�������]N�p�s�f�����Z���f�������qS7�9��o/
�b�yE�w��j��9����v����M�B�j��,^�~����-���k�u���c�c�0x����~�>�����y����}4=�����K�{��a��msNV���v!�w�s9�����j�)����Mc}����Y����:�~�����������KV�)3�
���������^]�	{�n�= ����+o.�z��&���m�aP�a���6�39u4}���!�����c�6�w\���~N�R!�>��z|.���$,�c����m���C�0�O��[��2����4����
��k����y������mCz��w5��.]���}�����3{M�'����3�����)s�l��K�?_���x @� @� @� @� @�[F@�p��;+�X�?��/���J��Z�~C��ox`b.l�����o�-3�5�6�O���z��L@��;,��/c��;g���:�]t�A
��I3��/�������<x���:����5���;���$v6�n��Z
����
z����3�j�N{��a��M��I����T��R����3�����	1�TS��j�������)h���t�E�6��������
�t/z�����p����;��=���>��q~��p�������}����C��������V
r� �����\K+&�'���gN��<��By�Q��M���:���2��������Y�c�g�y�S��'Xm�����g����c��������2�����	��?���������o�A}�9���\�.Em���>_{ifyx=�N1@�����r����_���Q��CH��T)xy�������}m|������}�����OY���-]���z�����z7l����P�V������y�>�V���������:�
�ua���}p��/���Rg���O���G�>v���c�0��x��������?���}��n1{���QyP��l�0gu�� @� @� @� @� @�@���o�7���YKV�.�.u���/�7U����i���v�j���>wa��{�-?�>�����^�}�(��*u=J��C����}%<����K�����F
���ln�jQ�=6^�_��xy�n��U������*��Lx-��#�Tc�-�n�b�����.d�V
y��cb����W�y
����V������PUs}g�����w<�r������b�b+�.�~LxsA�����R�r|$�`��G�_�����t�Q�.����M��B��]�<,'\��
>�����`!��;���CN��]��:���Rq��2_�> \�����`��:SP��14w[��T��x�cS�=OO�|bT8���k:���S��Ja����?36���:����?��lx���B��[H�p���~��������#
9,g��J�AS������k��6TXvp�/~s���D�����Z|�5��nu~^q���Y����Dz���n���=?�l��jc? @� @� @� @� @�@��*u�'�R������%v-L�-��+��1���NL���`yG��m�����=nS����t��Ue������R�����)��T���K���.vT+[���U��J������������a��-��>��*��)0���u�"X56����b�x�f�C
h������N}�=�R���W�Qc�-�$�K/��U�n���U
���x�Zt�����g����c@����c`��]v=3�������e�n�_��]E_��b��_��C{��<=/���U�
����]�1�lN������S������`a�_����fA���US���-0uH��z��]Oe����9�=7e��������n����B�����%++{��m���K�����
�{#=wS7��j�!}���� @� @� @� @� P�:��E���H�����B#�-;e��9���_�F���~&���e���V!p�A(�sS�N����Y��|��u�?a������J���Q�����a$/7������	��*?E�����FU*���C��U
��U
���?�
��`�����=O��y-P�|�s�L�1�[���+�}�L��?!��[e�:h�p����ki�:�}��w��b3�4rXH���'�������`{��W��>_��:�]��{�_���0p��5��1�v�?Cv084|����#�
��zv�6~�),Y�~xi�;a���B
y���S�2���R����W�������w�1<�����ik:���s���2.LsAf�V<��=��{;��R@4uLyqF�3v�Kk,����������|<'t^�y�[1]���0���y�p�Q���{�,X�:�>>eV����B�gY�N���s��j	g�cq�/����������{�#��|��m�:,��������2��o�.����O�������bg��@m����I��'�������1=_��'_��v����M5^�T)�|�A����;���k������K��1����/����d��������3������k�|2L���)���	���[6p��Mo�UZ�+s���o����,0z��{V�$�	 @� @� @� @� @�JP@��/�%�|��i)�S��[����X)L�]#(�R��������<_�R
N�qD������#cv}z�~aL"�zgq��p8b�A����2G�������)��l���:�Z)p�])�Sz�i��b���)�3���G�zT����[����Gd��:�eo�b�^q�C!�*�*~����a��;T`���k���d\�ca
�J�����p����pL������
����~H8���B
�U��Z����	�����&�:7f[�zm&�������CQe��}`�;��~�r��)$�|�&������+�����?���o)H���
�6|"��������^��7���>fxu������/�����:�������pl
������9��dM�)��\8(�	�-^�:v=|&���$3Lz���#��{�T���mH�'�n�� IDAT��-W_g=< ��CgcH�������}�a���*ua�#5?�������t��������pv����zf�N;t�����+�z=����?�s�wj��~��gg~���?�	bVV��.J__9��LW�'_��?�( @� @� @� @� @�e���A�@�X�rs������p���a�ks3���������
�b��Q�B�\���B���������������V��";5�v�)�p��,���)�~p�1����!/\���u�Q9�L!����H��{)M(uM�>�P���KV����]v����ng���/�����OYe�0{�������/���e��{S����s2���Ja�������V���)9KK�'{���=���9,�>��o8���`ae���]&v�	��*��ms����N�%����j��n��^{o���gM�-��c���/�\cX�W���W_:%�����B{),Z]�P��y6g�OYi�0{���s��O��nS�9}���~���e����M1�j`�����|��`a�X)L��K�	��{����9����V����e��5|�����������R'��_pbH[�+uU��������Bvg��A��`ae�OS�=Uh���1l#@� @� @� @� @�hy��-��Z�������(R�h���
��XW�86,L��y��w?��!�/��GG}���}x���nMM�3u������L-u J�������dyw�t�K>9�Eu���)�saZ�>�����#�����bw�����������'�)�ZH�w-L����bg���J��:�UuL
ewFLA������������k�}.g���ce+[���������Z���'^�y�O�����KY������5F��hE�izv���N���_�
�_o��<S�����B�6�5�N���~�b{���W{���}1���.1������������_ON-*��>W7��K��_��L���Vz.`;-��eZ����Tl��u��Xh�������zy��5�%�w����W
$+ @� @� @� @� @�u.����	4A��)���/�4��_�n������~��P�/��4fC�~��/�is�����t`C����/�>/������������#w��_s�o�J�k�Z!�y�-����k+����8l��B�vm�O�:�=����N�.=bh����N��S
A����na���Rj���9� [�j�� XL�y�^9�?=mN�]e�x?<;%f��G�Wt`�SG/f���w�����=8�����F��W�_��j�A���c���J!S ;��y��*�H�����uLy�SR���Z��_�[����}1v"���b(����< 9gW��W�n���{�����{��}��E��T�w�a�j'�E @� @� @� @� @�UVc3��,���6�[�uZ��w�/\u[�?v1lJ�~��4gJ��x`h��J:��k�����`y7�d��s�nJ<
:���G��cQ����'���Z uS;"\���	5�g�Z�4L��8z�]�>Q=�2`�n9�������}�G&�v��o���j����s:B���Ko�S�Z&����e6u�;f��+����{��m���]���5�6�����
Y��o[a��/��{�bv/�����!��S���J]����J�\��gpe�V�-=���=�X@1���;�s|]�M�n��2~m�p��W��5=�����o��9�|d�9]��� @� @� @� @� @��|����������F�e������	W��X&�K��a�v�C��]B�n�����t���u!����� <���a�3��
���a��p���c�n����2��N�����/�]�y���c8��}�;��^���O��./�{gzt�[���&�H�����g���'�*?�]OL
9p����;4�,�&[��v	d���2+�����yeZc&������6`��v��m���jve����d�<`�l�]#��vD+d:mc��v�ge�FU�{����;�v��m�^�gR��J>t����o2�Z��.v���6[o��W�A�9������9Tsx��=��i�J_?d����� |
V�C��gq~����9�F����0���;,���e����w����=�����5���b�1�������B��z�Va���?�:wh���Z��L��B��
�}�-���3��=��������.��m����#w��?�r��C� @� @� @� @� ��t.lz�����@
��(����??:�{�����v�����k�N�&�W�W�'m;���2��w����1<�]���e7<V�YW/��� ���/��=9]z���/��`LC�31|y�cS�OsBt5���R
=���;g�����_��Sk.�2����s)���K3��ypbn�����I�m�r����y� w���V�E�z1��k^V�9{�ky���w������m+��*�T�
���Nv���9(^��+=|mVX�l���WL�`~mj��]+<'g�]X�P����}H��Nz�T���`��E�����^a����mS���_@�V�[��6�G��yA�
7�_���z�����=a��y-^�~��o�
_��_9��*'� @� @� @� @� @�y-�7�]j��-?;�����6���'����c�����G=f}��	����a���;2��!��/:9����>NQ��c�[�O����O������b����E����YVs�/
��7!\x�����&���9:�����c&�R������|gq�K�Z���!�B����9bF�8�l��"F�p��ya������9���].���w���Y���������5d��d��*�R��g��}��cSG�����*����-�����C~w�B��V���]U�7U���@U�������.�Q[�}���#���K�=O����'_����1������<��d����A� @� @� @� @� P?���u���(4�o�yX��R���~j�����Z>����������4��U,]Y~�K�=&t���Q��TO�����?7=�2gA�ox`b8v��ap��9��*4|g���T��~���C~����+�������FT�����p�3S��W�
]*�OS�0�v��wX��li��U����/��v�����f����k�g�R��R���_��x��Z}�v}�!���X
���:uh[�C>�G������0f������e:�G��m���3n���+�_[��S�������B��kU��n����>kE|=9uv�6{~|6,	s�[���1���
�]����!+oK����?��wL?g�g���������W��H���O��F�>>j����=*]�� @� @� @� @� @���p����
��o��#��������;"��xE���s��r��~6���E1��?�<<����<m����43������O?l�p����M�$���9G��~vK�������M����:.\w��9���Z5��4����z7L��V�'�����!;���w
��|�M���f�S���y��z���Ut8�p`������{��=;=��mj:�%��a�2��h����oW�pU]�-�zn��S���b 3�S�����!������}P�������v[��VV�����]:O���6�#p}����������sBz5V�+�+e]����w����c�
���t�/������G�>:9�5j�A���G�����"@� @� @� @� @� �/ ��/�{2
P�cSv'��`�i����>�s�O>y�>�q�L�����\Y���K���5����Iv���:zx�T��|7�����m�����Js0�RsL�����n�@^��4��������r�YSW����:���_7d�+�S8�S��9_�[��=6V������;�[>\��ko�����t�Yz"�;�5T���0g��m[��X�`��������~��/dC�4���Ki�4|�On�O�U!��}�v1���lh�������kK�������bx�O>>3zD�VE�����$|��7�_����v��zs0 @� @� @� @� @�@����e\G� P��:�
����KV���d��z?OU������Bv}z�~���bc��7=�x?s��������u��X�n��\�!�y�-/?�5w>����R'�Tm�+Y��L��J���h��C/�/�����E��`�.��=4����;�-�N��������5b�~�����m�������;T(�c.���p�3���$�/��I������C�N�7������xKW~��J���{����m^U
4���i�b���:����kh���gy����A�1��]��#���}���{^y�G�1����P�B����c��	���0>r����=�!}{�~���MWvN���2��z5��]����WN;8���a������3z��w*0�.�i��yz��g�
>6 @� @� @� @� @�JU��o����u PA�[��9���-*���
���h?���9�~|�^���R���y����_�/��a��_�V�}��8i�n���[����)��O��?�,?������o~$\���3���U[��|�R��7Nk�����0`�n!����=���o�3���������9����R�\f��8\�_eW�����pB�sP���j;����}�%���
.l�s���HV�\��Uk���K�_O��v��GH�QY=5uv8����<v�b��	��������w���u1��f��L��6�|����*�G��;����,�wYV`�6������i����c�����~kI�����T�w���#w�|������lx���9sM�k/���p�OlI��Z @� @� @� @� @�� ���:��.������
���c�����)UV��G����tU��~cit�����}@��e�c�g����a�v�k�)b
������J���}as@v��wr��[��*���E��u�!���:�^{�ES�����"��.1 �Bb�5���XC�9?�8w������k���.{���c�?g�����S�������o�y��C�X��Un��U�S%/���;y]���A���_��9�k{���n�m��?!�T{��'���-*X���<���n����_���W����\�:���{�uk8 @� @� @� @� @�@.l���lI�Ks�1�����z}����a�{��6n��,L]��w�Qa����l��O����!�����[�g�=���m]\����.�����-^�~��Q}�����.|���CY����f�Lw��!u�+�R�w���e��{�~!u.,��6BW�V�t�����W���|���
Y;���3��"��}pv7����q#r���3�?��Z����#�r���{�����E�g�;��>&0m���>/������5�o���Sf�[�~Muc
��}oY���q�������c��F
����9�����k/9#t��!g�cb�hE� @� @� @� @� @ 	�[��(�4Y������!7�R�_����{Cv�,u�����l�`a��mbe�:�w{C$�����[}Rn��z����?vX��S�����Df[�vm��W����W�Y������&�l�pW��h���{i�����nSL>����������:��]����
�&�����H;�]�B*z����;�0DX�jM��`I!������~9�?3�C��)b�]v������r:K1T&��:����n|���z��z;�+s��=5�N?l�Z}�Lz�v��t-�+y������o��s�����Ro�u����m�{PqA���1�[rS]s{������_�;��7U^�"@� @� @� @� @�hd���F#���h��>3=gr)�TL��bV�`����a�����5|p��g�����.����K���3�2D���_ukx)+����:2�3���E�'�H|��a��g_	��nyeu�S�G�5tl�&�*�RX1�R7��XE����}4�[_U������P��7�/��is2�f�����}�������%+VW��W���U�!u7�������KW
�����}n������2��@������'��w����sV�UgT�k{�tv���3�����S1���J����������O������'Bz>��R���u\�0�:�
g���VC?������Z��c&��s����X���Ls,��Y�!���+��G�]�1M��%�Clv����b�
��Ts����6`�����Kds�'�� @� @� @� @� ��t.l�W��	4�@�Zx�#�rF?��.g)VLM������3�������
��_8!�n�������9Ts�g����G�6���a�I�l�WL����B���*�.[��j1���}�����`�����}n������u�&�\�zmQf7<0���k�����3���X�x��p���g`!��1p�������>VtH��s�}RG�������pc���c�K��Z/�7bhH��������\���u�����W��Jv]x����c�Z����=1evQ���S�4�FW��6>3O>hX�����\X��+j��s�V��b�������������.�g���y�����52O @� @� @� @� @���6�S�<�I�@=	��tU��hy�G[�|u��5�
k�m(�[������v�w�_���C���0�������a��j��C�_���aeV�������������
�xJ�����p���7�������{B2kj�\���6`�n��'���y���E��)�w^h������d�T
d��o�t�,�������:��Cv(_J�8v��9K�.�T�A���+~'L���+l��7����Va{Cl����K����K
>�_��R��6u���6����ww=U��
:���14���|7��z�������R:~e����e�R����[���w���
c���%�7<0!7P<bh���:v���������Ck����FK�������
��n�H��w��9����������K����|?�SjMs��O���i��x}K��6l��g������9/������F� @� @� @� @� PB
��)!@K%���,XN����G^|}^(��]
e����U�}��Q������OO��	�|]����_��Q���_��� FY��/.:)�.N
U�sZ���:QRP���f�NW5��j=ns�ge�����N����������9�����86��H!�\?&<6yVQ�kI;����k|����S���������kp^���'��KVV;V�`�~���zU;h
/����=�=���������U��_�s+��j[��\!Hv����{��Nt���U����I#wC����n
���\�];_�� |9�
�������3���]��.����R(��J�9i�g^��0~�9����%����V��<4o��._��]5�S������9#\�������H��/��������a����w���KW�?���+o�
8Vy@=����>�]����_������0x���_�e~^hn�%�w7E���DH��b~�{���+�����ln��K� @!?;� IDAT� @� @� @� P�-c�o\# �R���ON�|���!�[��k�m�.�SM����.�ef��.�� B
0<6yfH����c��c�B^���p����7���/������E��3,�����N���+�_��S.:��J��Z�Nki����@������\�Y����p��sT��U�U�r���?p�p����uR�����9��F��/���)l�j��*v��;a>��k[Y�,uR����'�|���c
f^u���1S�.]�����3����������?�9\p������7e��')s���C���*��z�!��]CV�m�e�3�����R@��1<��i��5(���5dN��vN������k��J�^��G�����������-a�{���M�n
y���A���}���6��x�.���f�[��� <9uvH�`S}����=
}� v����Q8���������y���������Y��������g�11P�������C��o�}���IV������	�����s�RSg���y
����k��93c7���xm�����!��-0�v��%�����^]:��T����c�s2=s�����/�.�G�3(��W���m�=6��%!u��i��ay^��Q{
i���9����|'^��!�t?����e�����)�6`��}����K��]f�]��6���f��X�:.�C�w��OY��~�'�?��p`���+c�z�����Sf�;���,p;2�����������.������}=j��L��=���?�gaY����Y��{�~%�����J?�
�$7ss$@� @� @� @� @�h���q5*�&#�~q?L�W����_�h���4�1����_�b�������
���~Kc��>j���U�~9?�2�O�7�^~�.��}s�gU0���	�d�M������������;�ewiJ!����M�Phe]�R��g�$L���Rv��}H��'^�]�wt�A�
�
���	�e���3&uIK_��y
�������)�������\�������^������8�k�|*��*�qR/�R����������U�0�{�����sg~-)>u�L�b}����.�4v����2{=O����R�5�	��{N\�����e~8.�����X�>��=��Ov�[�<�c���O��j?�����k������.<1����2]S�9u�-��[����\�bX��8�B+]��|�����~���������Z_�!�	1��B�e5=v����i/9u�����g��1�����>��A��S]o���|����m�N�|�U
�����)t��5�U
~���*{�6 @� @� @� @� @��hU���l-V�O�^��v��R��k�vjHa�v��R�zv���N����mKoH�����v�s:����%�o.����k�Z��ai��9,�N��^Uv����)@q�%g���[g�x?�b@�ni=c�����5Gz����e�������-�����z\{�a�x=Rq��
0��m����<=�vUUe�����N'�Nl}{u��%kS�u�n��'3!�B����#����{�[�/�tr����@W:_
W�.��8������2��C�n����:c��;�?}�]��c�5_?�^��KW�	��=p��gf���We���}���C�vl�&��j�O��W�P��?<t(����SW��������O�x�WrJ< =���Q���OS0n�+�����o��]�w��� uM]{�
&�k/>#�V @� @� @� @� @��t.t/ha�zw
�����X�p���o�g��	��XM��[#��'<,�����Uq��/�zP��uc�;��.e�=���6����sJ.)��*��+1D������:���G�����������>8xn���	a���2����b;��=�i1�Uv���R�#�R��5�7�/���y0u�K�1S�������<�B����*�K��3G�>1j��BSe�k�m�;�VTy\}���������/�;����e����C8����9�����T��Ka���7w,fn)X���}�����q/�G&�Q�;_�x���]8l���I��	�Z�����W�����p�����%++=4�+����1���|����&�|��czc�������s�?���+��f�W��W!��?���o��#�������,�b�_�zM��t��;�t��)�Kofu��3}�~z�~�����T�����Q��������K���j�3sG���1�a���yO����5��+�a�[.;;\w�s�����t
���^�+���[����^V)t�B��V}��LS����w����;�	�|rjx��9a��e5������g
9���5�o @� @� @� @� @������X��l+&PZ��o�`��E����Z�v} �2R'���op��5�1c����+o�������	]�hw��|��a��M��aB
D4�j.�lL��o������.�c��u6�m��
��n����=��R���,�s��V��z/,Z�*?����&v�����V�.���8��%����1t������e����_�0(SS��!+up���3�^��0�z��L�}|�@c�K]K;�{�>*]��^Y����J�X�C|��5x��������y5#^���-�������6d�@��f�n�2����=��W��W���?�������x���+�������g���K\���!�Pw������������c(wyy��}�6��}c�1u���@���z�?]L�3?�"�d��
��6�u��mH������i������M��y?�'���*>��m�!��1�l3$>� @� @� @� @� @������� @�@I��S@k�//(��[$ @� @� @� @� @��)��4�m� @� @� @� @� @� @� @�t�K��[9 @� @� @� @� @� @����pa�^x�&@� @� @� @� @� @� @���.,�ko� @� @� @� @� @� @� P���%z�-� @� @� @� @� @� @�JW@��t��� @� @� @� @� @� @� @�@�
����l @� @� @� @� @� @�(]�����VN� @� @� @� @� @� @�%* \X���	 @� @� @� @� @� @� @�t�K��[9 @� @� @� @� @� @����V�*��[6 @� @� @� @� @� @�(I�K��[4 @� @� @� @� @� @����pa)_}k'@� @� @� @� @� @� @���.,��n� @� @� @� @� @� @� P����|��� @� @� @� @� @� @�JR@��$/�E @� @� @� @� @� @� @�@)����v @� @� @� @� @� @�(I�����M� @� @� @� @� @� @��, \X�W��	 @� @� @� @� @� @� @�$�K��[4 @� @� @� @� @� @����pa)_}k'@� @� @� @� @� @� @���.,��n� @� @� @� @� @� @� P����|��� @� @� @� @� @� @�JR@��$/�E @� @� @� @� @� @� @�@)����v @� @� @� @� @� @�(I�����M� @� @� @� @� @� @��, \X�W��	 @� @� @� @� @� @� @�$�K��[4 @� @� @� @� @� @����pa)_}k'@� @� @� @� @� @� @���.,��n� @� @� @� @� @� @� P����|��� @� @� @� @� @� @�JR@��$/�E @� @� @� @� @� @� @�@)����v @� @� @� @� @� @�(I�����M� @� @� @� @� @� @��, \X�W��	 @� @� @� @� @� @� @�$�K��[4 @� @� @� @� @� @����pa)_}k'@� @� @� @� @� @� @���.,��n� @� @� @� @� @� @� P����|��� @� @� @� @� @� @�JR@��$/�E @� @� @� @� @� @� @�@)����v @� @� @� @� @� @�(I�����M� @� @���X�lY���+����v���}����p��G�����aNjT @� @� @� @�����&s4��_~9l��V��C=�9L�	 @�(��^5jT���2KE��W^	�����w�s�=�{���v����[o�����q���
�uh��\sM��[����_�Z
������^�z�;l������L���[�>-G�i���3�(o�;�iL�,��@!�!���.���O<Q�L9��S���l� @� @�h	��-�*Z��;����0��_�����F�u�4iR<xp���Ox���2�c	��o�1t��=������7���
�����/�N�:��N;-����vu���������'@�&�������:+��5+�k�Z�>�/���p�Ee:~����i���W�X;����s�����������|F5�kbF���gCS�
�o���w��� @� @�h���M����zX�|y�����������ml @�1~����+���1OY�\������m�9sf�?~���\a,4�U�Ve~�;��Zr�5.]�4L�<9\{��-y�-fmS�N����=�X�kJ������!��w�uWA��8�4#?w4��e�Z���1c�K/��Y���C�6���\v�e���g�y&|�3�)x�w�ygH]LV�\~���u��|l��x���f~vjjH�gT����M�z���}Z��
����7-������oN�U���\��y @� @�H���%"p�M7���W��6�r��	Jd��I�@KHA�o|�[4\X���iS���m��r)��
�?>���?l��B���w��p�
�{��pa���s�������M�3�n~�&@��)�VV�\rI���w��~����V�����@S�0������>�j�r^'P��
-��7��or�����
	��@����9�����u1g @� @����y���+P��p���������������Wh.���6l[o���r�s����3�:�_���p�]6'.@��,`����/~����o;������_�b�_P	���{�o���!�c�=6r�!% d�6����@����={v�:��:O���Ng�qF�4iR�g��?$P���/^^x��&�*�QM����-.����/A�O���/t2��B��G�@s(��95�5������f� @� @�hn������/�ZL�<9L�81sd���=z�1c���o�9\}���C���!h|���e�bWQ�v�y����O{�ht�b��F�`=����O�K5�����)S�5�K/�4�/E���Q�W��	4-���O�g��u�\�������Z�qJe��z(l���I.�gT��,&E`�x6l�K��h����i���4�@C<'q����X�� @� @�4a�VMxn�F�@=	�u-L��x�����O���l��p�����YC���Hx���=I
�7�9�0E/��@�n2}��Z� 
)p�M7�>��!Oal @���][>��g�>�n'���E���R����"M����
���*E��H��
bAX�(*\P�^�ZEQT�
X(� �����o��w�<�d��d��s���Y�d�L>I&�d�3/�������z���y���83 � 0.�7�K�� ���
,���}����|#� � � � 
������\@���>�l��k���y�����Yd7���Oo%p����e��~{���k���^�<�Q�2s��5�x�3�.��b�=�\s����Zo�����/�{��^��������*f���2��~��W6[o��9��S��y��j�O�Ss�����[�,���F��Zh�����n�����*�����<���4�,��Yl����+�����3�0>�`��>�����y/��R������<�)�F�V_}u��W��5(k�[����ws�����>��n��E]���9�y��~�m���S?jtL�u�M6)�U>��������[����fy��8��<T���z�;C��:�:�8������jQ��Z|����k�+���r^��F��^��w�1c�����5R�QG����Mm�_3��vZ��V��(�\^��[������l��F.�:����c��������������{��r{������O������G�I�AUi��j�<�|���L IDAT�E^U������f���re���h��Q?tm���x��)�)���?����w�u���G?j^���u�\�u����4��_����L
z?��]���J+��R�����$�����|��_M
2R����o~��EV5��N;�d���'�{���.kT~������[���e�6���=����C�q��8��7�����q����E]����6��<�	Opn*������_�z�����������~v1��_��T~��\���&uy�o��������Fg����vt�����o{t{�����?���eU��F,�8��s��;��������t����>e�����������w�m���[h�k�c�V0�{���a�f�����u�}��F�������G��F��m���O�}P��O~���8����m~���s�����|�sHv))�aX�tY_K��Q���T_�Q��g�:����Y�[����vt
�^�z��z�{�+_i>�����o�9z*S����k����.w������������ApJ�Yv��7�Kl}~�	'�P�-����������E/zQ����o|c1��kay���?��?����+:�E�tu�6�:���������^�!W��z��|����]z�
7t���+��j+W����M�q��l��;J9���\��_V[m�#����3���G�M���/xAt�.����r�!����������W=����kV��)���������~t�bU��r�/��o��Q=I�9ap�[l1����
����>��rM�:T��|�{�M7���Twn��)�V�{TWe~l�o��s�I'�wi�O�ZV}Z��gp]�U������uu�������|�+uY(~;����e�9���e��I�
���g������/�����|�:��������G��W�3���W��0m��P�W��������n���+5����~�S���q#�f��s��e��~�������:��~����*��|��H�y�e� ���i�*��}�������{������������u�Y�}[��O~R��b�4�g�Nt�~n�w`����u,T�}��_���z'������w6z��&�V�.�m���W}K�`�_��_��V��[�Yw����9���/K�=!%��g?+�y��_<c�Q�9u���O����< � � � � �Y���%!��|,��/~QC���1L������f?�l#�$����!�X�_o���c��~IZol��/�|��$mk����F����f�
l�0g���i6h3�-��6��F���
�k�����b�SO=u`*�#b�:�_��`��y+O����Z�:m@���/,/:�o���c�5�p�m0��6h���6L��l�����`�yN����.s�Uw.�X��}��\�
�,��O�#������6d,���{��?��n=6�h`���Q����X������O���\���>��O�E_��W��O��q{�~�8�F���>��"�a9<+�v�M7�4x��^������@��m[M1�[��#n������m�[�~�P`���|�v�]�hJ�aKm�t�m���m�[������'>1PYl�j�m/l��FSm8W��u�����}������a�lP����q�d��-/��m�0w�(�s�>�b)�y;�I,�iad8�?��s^;�����U>�����AX��
������x`;h<t��k_��#6��lc���jb��A4�����=�L���/~���e������u���Y+/M�i8��Z������i���R������9��l�����#����c��g�m����z�=0v���F��y���	9��p�9\�2�{�����:���Dg������lC���lp��_����YXf���u�������
l�/���?�:�G�7��;%���g�Y�k���?s������u����
�O�v���������}�� ��v��&{n��Z�?D�������'�t�m���}�f�mj��]��
���Sl����-�r;L��Gj��l.�zgJ�M���A��^���{T�e~�I��6h?�=������o4�c�]�+U.��l�����~���>T,c������vD0�<��=1���T�n�����"�����>���E�=^�k:����[o8M��<�;��d;%�Q����fw����mg33�M)R����S����>=g�(���L��~{���n[3��Tt����
6�1O��M���{b����o*uy�]�m����l�al'������/�~��w���\�vW��F}��k��c�����[n�e�9����a����p�{DX-����g�u��W��U1����H9�9��y��%e/<�l'3���SW�?���I��� � � � �Yfvsl���@`���3J�MQ#&���W/��Dq#�5�.|�5�����(��]R�kT�X��u�����F-T��f��^+m�r��zfW��	@���w]mK��k�����w��U�?J����T#!*i���^�U/���j���o�G�������*o���6>r���C��W���5��Av�eR����X��^���zO�z��Z�b�e������6rv�}����U����C�O��]���j�����th�����e�~��]�F�S��;����hVJ�1���_I�/�0M����@�:�5�F�Q��!����HM�6\5�K���+4r�F�+'�Nf<����"�b�~�7rT�{���hnUI=~k�M]�)W#B��ZT���U�A��5�Q����?����g�n�K9A�b����5*�FF��z�������u�+���H��K�i��s�����2�)�y5j�y���z���?�����[������mc2��Q4:�F��D\��l�����Y�Z���t~�_�*W��lu�k�H]�:O��tz�{�SlJ��z�����Y���/����~���U�5%yj���{����O}�+��b�v�-����'�U������vU��Z�u�{������4�{���:Va���>(�~�c��������=AI=�k�P�v&�p��*����w��tO���?6D���0&3v.�9�����7��^eq8"bU65r�O���to��P����	�4����t��:�9�{��U��
�.����^������k�^�b�kSu]W�����uN���#p]w�u���^�$�k�&U_�I���K��y���'����2L��Py����������T_��0�N-W>����xVRY�{�o�[w�U�u�kG��z��o�����l@Z�i�G������O*�T����'�^����F"�~jT==w��e�_�8\4��������Q�gz��%y���.G�%��Z^Fu?
��-z�%c=;���rS���D:�����bU�{���l4bS]�u~�����U��n��[�e���?��b�i�y��L���Uz7��X�7��
e���U���U�-?=W9`;:(��Z����[*����������=Xu ����#Q�9V�<]��o�|V��w(���>��^�N:����:7}���,����Q���I�{�I���w=3���=G���E����z��EG��[�3]��V�������J�T�W��A�We�F
��Qu�QS�{��y���I�$u~}��_u�����G=����z^�sI_�m9�9��U�o�K8���Y�4bm�T��.�{a,�#��Gn����i�~��S�������������~P��I�g�/}k�w
�G��H����H��n��FW_����Pu�o�_SW��F}�'o�O�N@�������z�����������_�6U?V}W�rbI����o���*���
\4�z��\Y��w��]�M�}4�{���7�����)�������ks��u!� � � � �@�@�PEV�������l����i�"�Bg�7��m�Q��7��
E�����j~�d`���j�x�@=��#�Y42�Fk�>�����/eb���m�;���������ht����|�42ayT-����N;����@a/���z�n`�E� �pF��.:�&�7?��	t����p1�F���/����U��m�?�(H����+�u�s�h��i_�N��
?6�����F�
{eV/��d���Q4��ZN�i��?6�tp�=��gq����F�����4�m�^�W=���C����*3��x��k6V������,����<RCt�`b��J�l��������&�������R/���9'�tR������� v-���3z����H6���o��6��������b^x7���,���?^
7V�Z9��C�����:����e���G@����V���}�)�\�HRA��Z>������FW�
^��
G�+��]�N�����*�����h�P�C�k����+��=���1��QHq��
��h�a��.6@�X���\N�Fl�b>�6@�<[���a��5l#�Y���=�66���&\z��n4h��]������Wy��p�p$��U�	G)��������Z�~��s�����2J�3g8������&t��zR�k{l�x��H�wh��lP��j4&��l�E�4�^U������*�~�
^.�Q��Ui�]wu��N���m#���a���o�)Vfh���g��}�s�=]y�h�U)���m�ro�]w���pze|��g8�\'��kG�&����`����>^�*��E9�Mh$>�,�G����^+)#�~g��=����nf���a;����f;�����(g�(U#M�L�����t�tN���*���Q����U-No�G�����Q��9�����X�����8�U�%uq�T~&9�T���Mf������i��
�-��
����������)]^����Q�`����L�s�
��������l \���9j�g��T6h����)�Tf��C�3r��������)�8�=or�R��yr�E)�]�>����|n;M���Eyj;���~�����v��s:&9���eOy4P��:Z��#�z�F���+�:�4��w��l�����lg��|��Q�bI�u������w������{T����7����ic�
�@@@@@�[��KB��T l���3�������PSP���=��y���*����q��F��c��j�M�Q����V�G�y����G���j�����P�RUI
�mO��~���f�~(��������������Z�&����{��r~a;BF1��U<��������
���R�{�����F����]��g?[�k{���Wa~������DlO��w[��_+�S�V`V]R�@�fGQ���{���S���!� ����m?�6�/�=����m����%����5^���qD�����Z>?�h�.�ZU��?7��[��6��~��Y�=>�%5z����+�=��e���C�������q\,�.��������j+x�3���}S��X��WW�m�&�u�\��2����7*��.5H�������q���g�Y���h}v$�h��Bv��b}��bIu��}1���L2�����
|�*���r�����zr������W����zg�:p�g%���a"����/���g�h{j�� ������.���F���1j��<�r��?���Y��U�*'}�����h�nux�0C�U��_�dF6beFS�Ky��;��������F��7wQw��tibe|�AAM�[�`�/;2t4�]���J�*��I�<�=8<�u���Lu����9���e R��B;:M�W5��:5���U���OT�c��w��.���OW�)��)�4�)�����)��y������4{����v���]��+A����Kq,�:\P��x�j]�<�[�wU��~z�T�@��l�:S����S������:����e4����9e��A������(e����R��U�*Z�����M�����L�>�����~.����,,{����::��<P�
u���,�z����(�������~�>����+g�N�?i��v���O�w��	���ikO~D@@@@�N�/hI 0
�j����l�e�1������#,�N?��Y��&�������������m�5t�����bY���r=60�l������Yt^�8�� ��
����4�6�0|p��9��S9����zal���v�m��w;rPt^;�����~�~�~�������C=���6�����h{�76X*i���r����{����d�w���������6�p��F��6�����~���E����|����A�obl Ht��������'���6~7{��w1���L]��m�PlB�O~��k�9��y^�����O.&�����m���l��6n;2��A^�U���6�w�S]��jG�+f�gu����
�6�^{�[����:�v��������������v�h���
����}�{����n���Y�w]���[cG,�1+CN����y��I���m�h�H;n�6���`��,��:��m��y��
Vp�T/9���m�^�>�����/n�K.�����dG�0�q��l��
p,���o���V<J=�m��2,�#W}�����]����>�Wb���������R�m��O����ml�fWcG��]T���H1�������,o�K�_l��Y���[��
�s�oG�.�0;���#0D��A�n��0�o�yt?Q�Zz��K�3�m������o������S`\e�)�����5�q�c�l�qc��r��k��=a�@���1��{���o�Xf��l��������^7�}v]�����O�Yg�u���(���vq�����������,�Jv4Is�E��uOz�+_Y5k����m��g���_����AU���.(V�g:���v�`T.'�����rn�f�mfl0by���=���>���?X5��~P�����,���S�����l����S�w����mz��sm�}���R�~���*�U�vX|sV���2�w'�c�����������U;c���������������2��@@@@@���_z�]2���WKc{�t�����������@#%}�����*Wo{/u�)`N)l�s�����7��6m��Co�7p�
�u�V��>�r�-�Y�W���b��^���<���1�o�Z��)6�u�]���7�-/�6�
�Ym���j������9�;"�	����a��u�S��K�Gm7��-�,��R��)�#�!���V�dG�4���o�E����6t�:�����?�Z
��R��F���{�(�Y�Qz��w/o����
wX>
0UR���[���D����r���?��H);���v�9�X���_�h�����;���S�-;�g�f���))���@T��6���m�v]�/�|SV[����=���+�6����������|��7�)�UO+����oX���k��Fl53����N;�TL��vD��w]��qo��G���s3%;]���R��*ss�������R�nS�l[�7��s<+�uh�?����Y����_;�[�*��E �������v�\e��\@iGou�t�5�.��W���b�:�	;d�P?���7�|��S���\r��*g�����z(�1�r���m��7��K��S9o��Oe����Q�\6�IS,X��QSy3�MG9����uuNy��>���c��rh���o����.*�0�i9W�?L�}��������^9���m�k��)8���T�E;�^�I�;�����re��.�m�����U�.).�:�:�[{���:��w�m4_N�����iy���=������}=>m��U��M����,��"��A�v5=�{��m���\����������S�V}����k�oJM�na�zX7�Z�0S��U�������)��=�.���8���@@@@@�����#��7]����+�����FK�Jo{�����N8��2���2�'���U�P7}��9����������h�b
���G|��`�jS�Hw~�!��j�l�2���|��a�����'?)��h���69c�*��R�����ZI-�����l�K#G?����D���{�li�:��V��R��z����+@����=r�s8B��,���)�c�g��U�s>�P����)��/����(74ZN���n�a�i8�_U�������}o�'\�_�����|�mR#�_iY�B���W^9cu]������ IDAT�4���:o�2��+U�r];j���o5��
�	�c��7]]7aY�T�����r���'g}-�:��;�f_�+e�6�En��J��F5:����4�����������N34z���6�t��Eu?���zv,�'�+�Uv��E����������^�/�ku�+���4�W����z�q�����$4zu,�>���H���Qw*�Mwu�,o+�9���*�[���m{����>s�=W�� uz��w�����OA�� ���O]���Y���[��\�H�}���a�G���u���o]�a�[f����X�7�xc������e/{Y��Q�D1�IOK��(�9�Y���I�Q��e�`��i�.�"�3�#���\|��S�8��[k����_^|[H���}'��������'�	}���������q=��e����1���
@@@@�����>>���4��o����M���@��H
t�I�P������;�����(+PF
2:� ��!���5���u�k�!u�j������������WW?����/>�)p������-�X���������<�+��}�bU���^[lG
����{�����t�u������y���N���{�$�c�=�XE��F�y�+_����u�
7���{�c6�`�0+����7��c�Gf����Yr���	���6�3��};��}}�h�)��&|�����`������CU�����y��w���S���6S�-������vm�2S���{���R
Q��>����[o�u�f�i�����0&#�Xd�\��:$�n���t�����~��_t������o�nr��*�>��O����g��%�Xb�}��@D��I]�9O=o���G)ss���G����r�����9��tO���~�p�	U�T'$����yIy��������CRSS9�'�h�w��Ey�}\����p����z��f�m�4���}���S������}~���z����T���G���:��>^MF]��m�cZ��Q^�������lQ�\Q^���>��C���,T��.�w���y�������w�e~������u�Q�����;w����S�oS�6u�U�[���t��Z��MWJ�D�'�t�M�v�/�����K�t�K��yk�I�YrB�u��l�u���X_�u"=�������o�Z��J��S�Vf�d�R�>�b��z���	�,�N-s������N�,J��i����]�2���K�����o�!��~.\i���5���=,��9���o`����o`ag��?�}`JJ� �i]�z&l���~O}FQ~��9e\~l@@@@�����
�����g�F�P���X�!H
��hWm/��L�����5�PO�����������>�����1J@y�6��G?2����*��G?��������n���v��;��s���������S���.��MR���F,w�q�0Y����>X���h��37�0j^���M/��r
9�����{J��6R>��O�����O�9���R�7c5�KM����`��������q�>�W�A��vTG�J�S�8��s��u�����f��r]�(w�y�i��Q�u�g��j��Q���=V���=vZO����>R�g��s^;M�q��=�{��� �p?��or�UV+�Y���nG��w�}]����k��/�[RW����<oR�r��c��[}���6�E^9���0����v�L����z��'�<� ���?�2~��_�M�HW��8\�w={��w|#x�Oa@��^��bW��v��������u�X6����
�c����n'5���C�l�;���s������*�Gu�����S�u=-����3��"
��9-��qNS@�G>�7bk8B��v�m7�Q�|X��*��*���gTgO���#�0*�U�u��Cu���z�<W;�|�=�����j��J��/|�E=(���w��6�$��{]��N�����p�B_'Rg�����m������@����-��}�_��Y���i;va~'Q�N�,��>O���������w�y���V��sZ�4�����	��������u����0B9�I��(�\�w��d��"� � � � �@���K^�������)���~zm�G5W�����SN1��z�V��/}�K���O:�$7��0�[�����H�����q�z6V0�Fd�#l�#�~5�����N0?����F�P�G}��b�-\�A}�GH56R��}=� �p�>XS���������7g���e|���Z������dr�~M�M���6ek��)O�=4:��\�k��!�����j���8)�����L���{8o���-�>�AN9������y�=,G�6`�US�q������6��f���.�(�����<����1�S0������0V
��Zj)7����������9����6&9�/\W�kG�4W\qE7���^hn���"�H�TcY���Na~��o�nr����5z��Ky}�k^��>��Ou	:7�qU��������\oW�]�7�;�����f��+�<�)/���xV����Gi9����}�|�S�r��))Y��&�lb��L8�z����a����	�����z�v�6� �Y�z��0��k�q�{/���n�.���_5��o^����F�*������=�������~d������n�SW���V������S�j�s�����6�X�b��>^�mk�u�u�m��i��M,�z��b�hZ�l�����~�j�#O����~������}Z�R�����'�x���=�����V�-�dle�F�{�s�SM�#$�=���w#���G�Q=^e{�������.�������3�:}S�9x����-|^�
.�����[lZ�1G?�/�]|�&�pA���g=u���Vp��-+�N��]���cy���������}}et����c�&�.s�P�{������P��s��L���X�e��q_����g���������Y����X����w��!!n�&��������G�6�~�>�m��@@@@@ ����,Y��������J����Q��)I8��������
hb���������r�vj0p��������|���}�E�b�&�s�=f�]w-��;��]��)�����&5�j���o�[��_���^K�'5�RG,�
+�C�����*�A��/��qiR�=e_����g?����.)�%��Q���{o7�o�s����Fm?���[���fD����E�����Y
}
���4��}>��]
Gsl����|����C�y�#`h��
���f���.&]�+�DA�J�?�wn�^X���]������-[��[�K��������`�=�p�P=L��)-���.�(���o�nTV��E��0��F���GD��o�������p�h8����$��o3����/}����������9��tM��-oq������s�9�5L�}@#�kDu@�I����FS9�&��������*�P�!5���b��#s%P��E
>Q�4����/6���5l���3�~�Y���;5/�z.����=��5������R����S])|���^��k���2������T_U���{�u���y��2�C�P��p�����{�,����VW�m��g, �72�(E���V�N�4��W\����x�w������VI��Oz���Y��c�rMw]�����0P�@�^�w���A��>�Y�Q���c����F�����U�_���������c������i)�r�w��q�C�3�6��������K���7�F8�7���Y��&ul�#�y��o��l�O]O�|���m���q�c���
@@@@�	,�oU�	� �Z������E/z���>h�����pjL��L�?����b�q���)������*)i�%5b�
,�<m>L5eF��pw�������5����oUZc�5���C�8U��iz�����wM�w��$�{�Num�s��[ou��(�
:QRC�pT��|�w���i^5�������{�5R�Oj�8������[���I��h�V%5�����\k��������qa���y��������u����v�2�{��k��j�C9��h�c7?��u�P�o�����
L�����U����7]79���N;� �(�u�����s3�te������}�.�����r������K�g��7���k�u���g�����j��n^>������o3F�nZYS9��|��s������?���d����m�����H=J��w�������q����Q��c�u�i+�'q���r��<��{�3w�s���f,��]Y�}�Z���������K����t�u�)g����N��tO���XX��&UoMu��s*u_���t�|��}R��+�I�#�qX���o~���g�o�S>����]@~)��WZi%<:��q��etW���~<���I�E��7e�����������;�.�E�����|qZ�Y0ud;ul�#u�L��}�����Cy��>�pb � � � � �,@pa�s 05j��Z(��jd�����n�d-���?���r�)�����m���~U,�F
/\_L�T��6�lc���?��6����~�M7��jt�����n��^{��������t��}M�O�����N,��<�M;���p�;��zf?��C��1���'�i�L=��&�������E���<�q���X�}^����+���QJ^G����U�_�n�i1B���������u4��)��<u�'5�HM~d4�������7�p����z�����H������9��5����{A>o��m����~di��
�Q��������������N��u��^�Q��i���s3������������a��Z_��K��|�xVR��@��[�mf��-5�V�S���2�^ziU�gLWp�F�Q���5�/)����2R����UI����4�O�����O|�����u��$����L��4me�$���X���.��>s�=W(_��0�AkAlI�w�I
(����|�;����f�2����*:kQ�����%�s�~��i���&����u�;�0��?/-�����L��v�?�{�?>�����F#����=��nD{�<�E���B9o��{��,��n{���?���q�.�3����}j{)/����:��~n����8��'}�H��VYk�[_�R������e4=u��u����	��o����s}������)�� � � � ���G���~��c�����b�w��,����[�~�����s��jP��?�)y�p����m���z�(���4��|�+M�$�~�������Xb	���-�PB�]n�����5��O'�|r�e�9s�O���7o��/�5�����/y�K�9�������/�I�]=�x��n^5T>��3]���>���������ox��G������>��#�����g]COy�S�>)��3�����a�2�,�So�w�yg�*�:����6���Qe��[n��j�����W�"eS��'>���>g�cV���.��)C��a���eRF�U��0`�����/e{�s��.��)���ZR���y���0��HX:>��?OWXa�r�*m��E�M
�|�O����FAa�b��{��^V�B�c�����R����<�
i�]�M�����>���a����'��������Q,'U�YI��QF�H�����6����>Q��p>����)�p����w\�F�*?}��F���*�Qx��z�����\����]�M�����$�N�V�O�x���@��=-��B���3o�P?�s�kS:�I��k��;i�9�a����e~��)���������#�t��NAR�K�~�����M�G���{�����U�i'ul���������6��������_������U����5��Da'��0%�6����Met�2"���r|��/�l{R�L�,�r��C}���N�����X�1��X�;���T�I}OP�_=��t�9���Z�������C[{}����6���)�9%��G������@@@@@`t�G7d
�F 
G"L�����3��z!�%�$������M+��r��/������_�)�v��}���������>����J
T��g?;��:[��/}�QcX%������w���O����K�=�1�1o|���tm��s���7��ME0�{����������
VR���;�)���;���|�C��W��g�}v1O���b���{�b�Gy�	t�~�l������MR��mo{[1��G]�dV���?�������U��z�������������n�V:��K{S:��] SU�5��L
�������5�\s��})����j������4p^P��Y'�^����w_����%�\R���o�Uk���������D�7q���[ou���/(FN��Q����*�5BM����7�Q�����:R��(s�2l��{�.��}���b8�:���J�g5�������~0L��[������:�	G��*X.�c���o��6�i9\�������VE)l,^�Y��^����^�hH?���l��'Qw��2~R�k~,b�`�i
�����kW��O~���^#����X���?�MV=.��<�����n���/�~�5����6��6+�CN�����Q��e����2�|�;c?�j�]�R~�����x�zh1zc�|�����|��7�a���/���>�c��5�E?���#4r��W#:k��:�Fl��7���O~��bs��R�2M�M���TF�e�:�K*��n2W�}S�mOj=�*������>���}?��;��c���8������{�5�\����y�����?WW-�w)�U-N�������35����7�/u"�����u�\�?���z��sG�g��1k�!� � � � �@��8�&.��@��
O~�����dL�N>i5���I#�|���7��sO�*��������W.T������j8��o}+��y����,����y�N���d�2�N��X��w���E��H��{��.&k�����)�2��!'�����b�@��;�~��w�s�2��s��N�������c�)Nu|��F�EU%1�r�)��V,���o����F��<��\���Njl���Zh!��C��c
���m����M
{dK��YA`k�����?��g���?�i��O:��{�����]7z@W�U�<Dw02Q����5�q��|��F#���'UV(8��j�~��F�V��>�`w��_���uy�Gv5ZSR��s8v\�C�z���Fm
�����<j$>��*��IAt����Q%����})�u~��kUA��2����7��� �)�Q�S��T7���)
����m2�����h�L�6����8�X�Z�2��[n�5���r���G>�~S�jlK���@���_�����>kv��To��.L��y�DGD��?��F�U���s���~v1���k�����e����P_�+w8����i�����b���\��~��a���^]{�z����k�h?����_���}Y������=�4N�Oa@���J������y��z��$��>������I����������r��9�������!C�]������O���F<����O���w�����%,o��V�]J@y���w	~������[���O������;���KW���*����g�[T�>�����v�,C����Ro��k�F����J�F��<���6����Q�����zf�`Lt����yG�JzO��^��$�mW�t�:~���o�����(�S>�Q]lY_'R��>�p�u�1+��Rl��nZ��z�2:<?�,^5*�e�\� �\e�0������dY����v��N�����X����X�N��}���un������w��O��K8��?���u��~R���������#(�>��]|s����{��\vT7�Y�}���z���mjY:�7���?�����W��u�Yf��w7���0�� � � � � �@�E[��� �c��O?��]l$���+�i���s�m�����������C#�#����,7�����U
����=�9�����}����q�| IDATX��>�(J����5��oW]u�k�� 5�T��Q�Fn<���\P������-R�|R�{5(R/���Y
������.������v�	'��rZ�>��#�z�T�jl�yV�;�t5��65T�����;�}�qVc���*�I�����}����I���P��.����i��kD���G����s��K
`R�3���c�����C1��5��5�G<5��J5��U�DmG�Q�j����~�]K�5\z��p�����|��g�[�����%�]��:��(C�����>����kFAu�A�(�
�T���������_�]�jt�sT������j���k����z������W\�>�k�d�}4���b@����ud�)��x�M6i�:N
P���A��Fu.�������_]7
(�A�:?�=��b�����Q�,5�����S5lSY����/�1R�����c��C��}R�^5^�?*�L��k@^���7�5��I���W����>����CI�H�!��A]o�l���f�=���2M�m�xNr�F���������M�~S��Y�k��T����zk��'=��1t~����u$�k-������k�����IA�*su���D��:�P9�@z5
���������{��52R�g��y������k�;��z^]R#T5@�9�� ��v��Y�Ne���
t���n_��-��{Z�+�����xV���k]p��#=��.��*�����5���s�M7��V]Q��a����V���ZR�����5��:�P�Q��>�������m���]�?�MT7U�^�P%�G�H�����
��s���^�~V9�>P^���s����su�i+�'u���������zFQ���/�S�YHu������U��������F�U�z��k*���Vu9��� H��4���}�T�^e�N�:��)��g�UWu���c������z��(w��rO�}�]��u/�3������I�n�EW�/_��N��~K�X����DN��F#����@=Mo;�wFU����GuT�����8�\U}B�n�|����.������dU�����Y���yS���w�u��'yl���s����M���������K�k��B�I5��RW�M�������9�h������T���������F���]�/�T�U��o%9�0��rlwR��dY��>�o���i��s]�K9~]���w��s�~�:�:��r��TT�B����@�R��'��]U����UuJ}7S�T�����^������=����#�zgl�������w�z��Wz?�w��x�+\��z��o������zO���;�����.���)������|��w��Q��\�
@@@@Z
�I$�r��y`?�h����`3�/��#������v��p�������P=�ABC��~h�?��[f�ev$E�
;����~�z�ZP�v$�����Y�j��*�k?�
l��~�KZ�m�:�A0��g���
�~��`?���lC��Y��6``%�S��m�]���S��~D�������f�c_l���������d$w�Ap�6���m0X,o{o����o_�o�>f�z����]�s5���l��u�&����u� ��m�X�?�WH\^��m�T._�>r�W>Cm����}���G�'?�6��
���r����6��]�~��@�q~�`�}�m��|�el�Q1�I6:O��6ph`�����]��m�P�����
�1��6\�]�
�������?�*��>�p����C��6v����}Zc�5���[��{����*7�2�6>�\g�������r�J?�\)����r������
~��mG�-�����2U���������@��\�����o>k�6�h`��.kG��QS��v1�
���.?�6��`��u�����\���i8��Z����Q���T_��:���xVR=���V�����_m��_�	�+���z��'*��Reg.��|�~�
g�{����fL��a�ha�.3�2#���������T�Z�1g_vH���y��h���:^�y���,�N����l;Hi��Y��\+)��Z���������{��P�����T���A�� ���������7����|�%=K��������
����?����m����{�8�|�K��5��t�5�����W��aS�J��3��\k��:�t}����L,�������[w�������O�������}lS��]]���Q���p�di;J�ql��9��$=K���f,c�j�i*�p�{��yj3������e���m�����\j�kG�*���Q�T�a�7E7���m���;��u�����o]�EM���).�������A�.���}&����Q���~�zMuq,��
�`����?g���.�������������tn5���
f�[m�o9�9���|��E�ouJ���g�����S��?��������T����@@@@@ ��z�$!�������v������j^4,�=N��Jv����aq��.���bj$��E�gG0��l�����r$X�Qsv�$<��}`R����:�=�������%�������j_�?���mO����'(�E��jt�}�����������Y�����ra�m�����:�$����=�5ZS��m���;����:W���@c+�y������I;������l��O
���sV
�b
����v�O���l�3���/Bo;��[���	;��\����@v�'w��l���a������-����GWg'CY�� ����5��JvD,w������z�=��;���Er�W��S�0L����+S�����+k��jc{���HI]4\�}��:fj��+�^�2]e��>��:Ol/�5�NI����^I��=s��	vtw����u������p����ZWj#��~k��~��7��k]���u��>��V\��N;�4W��{��=�]�������$�T��r]��S^o��B-��:�z��VAt�$5�T	j�� !��
�����i{o�Z�3j������|�O��t��
���=���������ZVG
�Q���|��%�����b5�W���m*{��}�n��v���	.��0W}�lS�����i���R��F��xV�uaGr��#=c�.��]������'`R���w�x���s�k��n�����T�����E����)����3�/��hd�Yf�]^�)�{\e����v4��9G�i|��e|�!a�n�6���?��J�[8_�r@��_�U&������=����:��H����]_|q�Cp��wN>�d���?�>��;��@�*��=�)�P��o]}L�C�]�Uz�V�b��h���A���<�)n>�{�;;����#��U�j������5�2_������9:����:�������EO�kp����
���>�!����;!;
�@�gy���~�1�P�[s�5w��������}��k����u�6v���]���[������et�5[7�
Zo�{��yR�������u�g�w����l��uu���&�������F
.���=����qk{���Fj�\����,J��Ky=���~�q�gr^��}���~.�;��eO�cQ���	9�����}��u��B�7�x���{�=��������3��T���{y�9����$=PY�������
.�zs}s�S�"��r��6r�Q��^y������`����B�?���8�LzU���w=�����~�j:g�@@@@�U`!��}�IBX���
���Pal�������dl#xc�.�#��
D�m��^��P�m����c�G������U��^]]l#Fc?�M.3ly�����
�s�j���
H��~�c3]���b�r�� 09�+��g� ��	��;��x�����1�h+di@@@`����� � � � � P)�h�/��,��nc{Sv���wrc{i5�������'�����^9�?�������y���Q6&�Q��=����U��+�(v}��w�=�E�D�L�ry;��. 0	�Fp�|t@�@@�\��lS~�> � � � �=��������w�cn��&��v��2�0���6���|��w�fa 0�	\v�en�4���_���n��!@@@@@@@@@@@`A �pA9��'D����b������j�J��+��b�lLG���``.���?����Yd�E��}cG@@@@@@@@@@@�M������� 0C�1�yL���W_����
O=��b~F�J�cF�b������~��.�p�=���=!� � � � � � � � � � � �r ��-����y����3g�qF��e�]f����?r��[om�_�����v�g<�F�>��Cf��W���!� � � � � � � � � � � ��-�����<,�+���9�������f���7��N:�l��6f���2K-���7o��H����o�%�\b4r�O����9��3xG@@@@@@@@@@@@�K����:^�:8��c�K,a����_��+�t������w_s�G���^�nV~C@@@@@@@@@@@@�w����!������n���������{������k����j���~���K�9s���V[����:f�-�4�n���;w�$��6@@@@@@@@@@@@Y`��M#�� � � � � � � � � � � � � � ���,<59%� � � � � � � � � � � � � � �E���,��@@@@@@@@@@@@@�� �pz�9E@@@@@@@@@@@@@ ���YY	 � � � � � � � � � � � � ��#@p��+r� � � � � � � � � � � � � �@��0�@@@@@@@@@@@@@�G����9V�@@@@@@@@@@@@@�,fad% � � � � � � � � � � � � �L����s��) � � � � � � � � � � � � �Y.���J@@@@@@@@@@@@@����X�S@@@@@@@@@@@@@�\���� � � � � � � � � � � � � � 0=N��"� � � � � � � � � � � � � �d �0#+A@@@@@@@@@@@@@`z.��cEN@@@@@@@@@@@@@�"@paFV� � � � � � � � � � � � � ���\8=���"� � � � � � � � � � � � � �E���,��@@@@@@@@@@@@@�� �pz�9E@@@@@@@@@@@@@ ���YY	 � � � � � � � � � � � � ��#@p��+r� � � � � � � � � � � � � �@��0�@@@@@@@@@@@@@�G����9V�@@@@@@@@@@@@@�,fad% � � � � � � � � � � � � �L����s��) � � � � � � � � � � � � �Y.���J@@@@@@@@@@@@@����X�S@@@@@@@@@@@@@�\���� � � � � � � � � � � � � � 0=N��"� � � � � � � � � � � � � �d �0#+A@@@@@@@@@@@@@`z.��cEN@@@@@@@@@@@@@�"@paFV� � � � � � � � � � � � � ���\8=���"� � � � � � � � � � � � � �E���,��@@@@@@@@@@@@@�� �pz�9E@@@@@@@@@@@@@ ���YY	 � � � � � � � � � � � � ��#@p��+r� � � � � � � � � � � � � �@��0�@@@@@@@@@@@@@�G����9V�@@@@@@@@@@@@@�,fad% � � � � � � � � � � � � �L����s��) � � � � � � �Yw} IDAT � � � � � �Y.���J@@@@@@@@@@@@@����X�S@@@@@@@@@@@@@�\���� � � � � � � � � � � � � � 0=�NOV�)#p��w������w���>dy��aV�2 � � � � � � � � � � � ��	,���f��5K.��y�2K����Y��]�o��6�����!�`
�u�}��7��
I � � � � � � � � � � � ����/�(��J�7s�^j�U�<�@�����@n���~���?��V�����G�Y����b��@B@@@@@@@@@@@�y�s��4w�s������C?�Yy����?vn����= �����!�V�.��B�f���l�
�G@@@@@@@@@@@f	�u����[n5�������f��.7k& ���0���+r�@����&�Zh!���+X�(� � � � � � � � � � � � �*��9K�5VY��~���a��o^����= ����,!0��#��_n��-��^x��5�jX@@@@@@@@@@@�Xb���
�?�����/��rf~@�^\���C�H��w��z�.����2' � � � � � � � � � � � �B`����EY������w��bIfE�>	\���A^A����.;g���( � � � � � � � � � � � P/��B���~���������_@������1�	��������j� s#� � � � � � � � � � � �-�,��[��y�j�$�#�@_.��� �(����5,��"#���@@@@@@@@@@@@�z����������_@������1�	�7��&!� � � � � � � � � � � �]
,����%=��#]n�u#�@�v���@@@@@@@@@@@@@����}<*�	@@@@@@@@@@@@@�.��U#� � � � � � � � � � � � � �G��xT� � � � � � � � � � � � � �
\�!.�F@@@@@@@@@@@@@������'@@@@@@@@@@@@@: ��C\V� � � � � � � � � � � � � �@.��Q!O � � � � � � � � � � � � �t(@pa���@@@@@@@@@@@@@�>
\���B�@@@@@@@@@@@@@�P���qY5 � � � � � � � � � � � � �} ���G�<!� � � � � � � � � � � � � ������j@@@@@@@@@@@@@�(@pa�
yB@@@@@@@@@@@@@�C�;�e� � � � � � � � � � � � � ��Q���>�� � � � � � � � � � � � � �@�v���@@@@@@@@@@@@@����}<*�	@@@@@@@@@@@@@�.��U#� � � � � � � � � � � � � �G��xT� � � � � � � � � � � � � �
\�!.�F@@@@@@@@@@@@@������'@@@@@@@@@@@@@: ��C\V� � � � � � � � � � � � � �@.��Q!O � � � � � � � � � � � � �t(@pa���@@@@@@@@@@@@@�>
\���B�@@@@@@@@@@@@@�P���qY5 � � � � � � � � � � � � �} ���G�<!� � � � � � � � � � � � � ������j@@@@@@@@@@@@@�(@pa�
yB@@@@@@@@@@@@@�C�;�e� � � � � � � � � � � � � ��Q���>�� � � � � � � � � � � � � �@�v���@@@@@@@@@@@@@����}<*�	@@@@@@@@@@@@@�.��U#� � � � � ���c�>�������
"���"H@�Q5Q�7{b7���7���(������BDM`��
�$*��E@�.J���~s�a��\`�)�^����]����3w�?_ @� @� @� @�@e.��O�� @� @� @� @� @� @� @��:.\���&@���X�dI<���q�������E��[F�F
c�V�G����SO99���?����W�V<`�hP������Z��G�k��c�\�V�����Z�}�/��o{��I���
����c�]v�M�5���n����^���;�g�}Vb���Z�q�g�<g� @� @� @� @� @� PQu+j!� @���x��������)S�����9s"y����1p��l��`���c�~��%��PR`���q���?��/V�XQb���k���q�o}o�1�?���\ @� @� @� @� @� @�TF����T���<����3N/z�t�M�i���`���s����oDR�0�pa�Z��^�z��bew>k����h���v������S���|���q�a=�����n��������E�b��Y��:q��bc����L�e�����K�9�w��������r��: @� @� @� @� @� @�P@��{�UL �Fx��?O�m�l�I���K������j����$����G�#�������o�������O<�����o����C�u��m|�����G�b!�8����_�"<��(&&����{6�������<S������%��p�]w�/yQzi���E�6m���� @� @� @� @� @� PQ��%i�'����*�x��e�x~��h�f�wo��y��yT�5c���������Wb�r����e�`a�>}���/)q�f����G���F�/�4�� @� @� @� @� @� @��U@���>�"@�@)I��g�]Y%��+�,5X���V�Z��w�z������1(S����x���W�;��"yi @� @� @� @� @� @���"P��l�>	 @ b��I�d��������T��=��9]�~��q�u�W���"@� @� @� @� @� @�T����,���
��3���e���;������C�Iw��#��v��&E� @� @� @� @� @��b��U���.5[�I���^ye\�����}��X�hQ��GQ��[� @� @� @� @� @� P��+����)��}��h���1�^su|��ge������W��~�=��h @� @� @� @� @� @�

V��f��\�&M�����L�:5���!����x��7k.L���I�����.�T��� @� @� @� @� @� @�TN����\��9n����v�m��9s���7�����o�m������[��o��s��:��
�����������:������{����R�2{���zR�Y�f��s� @� @� @� @� @� P���Stj�@�V�b�/��T��3f��!C�e�^���)��m���?-ZTb������^h�� @� @� @� @� @� @�@�.�������[o�u�t&HXG���_�~�G}������/��;����^���.��];��]���u����z���A����q����k�����
}�R7�" @� @� @� @� @� @�6l�b)�D��������1�G�K/�/�7�3&.\��|�������ct��.��Z.U��]���G�;��x���!����v7i��/j�V��L� @� @� @� @� @���*V�c[X��7�8�zh\y�U1l��1}��������}�t�����y���:������6K���5�/_^���� @� @� @� @� @� @�@�.�Y��i	�!��������F���?"=���#c���j���s���L'�X�">����[�h @� @� @� @� @� @�@.�B�V	 ��I���[n)6m�����L���C�b�|��wj��� @� @� @� @� @�����5��;55H�u�6��[�'�6mZ
:}�G��S�b�_|���'I� @� @� @� @� @��b��U���.�D�~��k2�F��c�=b��vJ�\PP+V��QK� @� @� @� @� @����������*0w���������j���J�}�Z�j�I'���<��x��G���� @� @� @� @� @� PE�����mj�@��7���0��X�dI:~�}��{nM����-Z�H�}�����S�b�4����D� @� @� @� @� @������)�VC���}��wv�o���O�9s���q�m�����I�t��!��c��sjzG��-���nN�`�������I3a��8��D���s��A� @� @� @� @� @��lu+�����������k��>�{G�N��k�}b����f�6��2U
�~��x|���2eJ�X�z�������xf�K/���6�kl������o�}�s&O~w�����K��+�*s�����];���	'�w���R�<������_��o�6,���������/>���r�-c��E����/��W_}5�����V�z. @� @� @� @� @� @�*��pae|*�D��2����.]/��r�UVk��I���{c�}�-kX��b��l�n�ZfNymM�]�diy���%K�St��r�����G�M�ER%2Y;�9r���K#@� @� @� @� @� @�T���<U��:���k���g*����Q�N�2O��Y�����N�_u������W\��G�+6l���E�q�9��e�^�s� @� @� @� @� @� @�@e���"U~����k�!@����7'g���y�}.T_�������������Y_��_�
�5o�"��k���{��W�����%�cF��O?�4>����U�V���e��w��1��Ux==
�!@� @� @� @� @� @�	�5���n:�����V�W@�0_)�Tr��J��l� @� @� @� @� @�T3��j�@��	��q'v` @���S IDAT @� @� @� @� @� P��k���	 @� @� @� @� @� @� @��	��g�� @� @� @� @� @� @� P��k���	 @� @� @� @� @� @� @��	��g�� @� @� @� @� @� @� P��k���	 @� @� @� @� @� @� @��	��g�� @� @� @� @� @� @� P��k���	 @� @� @� @� @� @� @��	��g�� @� @� @� @� @� @� P��k���	 @� @� @� @� @� @� @��	��g�� @� @� @� @� @� @� P��k���	 @� @� @� @� @� @� @��	��g�� @� @� @� @� @� @� P��k���	 @� @� @� @� @� @� @��	��g�� @� @� @� @� @� @� P��k���	 @� @� @� @� @� @� @��	��g�� @� @� @� @� @� @� P��k���	 @� @� @� @� @� @� @��	��g�� @� @� @� @� @� @� P��k���	 @� @� @� @� @� @� @��	��g�� @� @� @� @� @� @� P��k���	 @� @� @� @� @� @� @��	��g�� @� @� @� @� @� @� P��k���	 @� @� @� @� @� @� @��	��g�� @� @� @� @� @� @� P��k���	 @�@��w�
����j�p�5�:��cs�����#_�uM"�&?9������_�zM�(1��7�,��3gN�1. @� @� @� @� @� @��	V�'b?��.��#GF�~��������;�\y�x�nO`���yd������^�M�5*.���w����V[F�F
c���]��qL�^q��7���cc��ku���<d����=�Zl��.�0�����5�����c����=��S�h��6)	6�y���]l�{u����=���~	 @� @� @� @� @��"u��>m���@�C���1cb��e��nnQ�:w��^zY�mM��q<���k��c2���kWl�Q�FF��
m����������'���	�c���u��>�0~��3J=��b��������a��f��z����A�D�N�V�>Uep�:o��b�}��'b���Q��?S��s�O @� @� @� @� @�����]5��] @`����[���D�j,��k�H^E��/�������?�@R�����z��H*�%�V�Zi5���.�8qb$���g�h��Q�h�"����f�������S�N�3����.
��G)�M|Fg��}�{����A� @� @� @� @� @��J)P�R��� @`�
4k�,��-.���<xH��Sg����	lH��C���x����E����$8�������g��s����N��_��w'��N�,f����~&.���h��ey�V��aC���������a�?� @� @� @� @� @� @��
V�c[����5v�6}F<��q�5��a��!���*����K��'�L�r��WE�M�����Q^�����)S�d�&�80n���k�.�}ak��Ax��q��7�{�7��M�~{��nT��?>���I��u�L���t�E+V�#�* @� @� @� @� @����pa�z\6K��u+p���g�N�kW����'������^1b�bY�F�|���3gN��m���v�1>�������{��t��G�����a�~����_��������;�*Z��:a�=�S�Ni��$���75 @� @� @� @� @�XwU3=��<�L�UX���c��K/��
��6��f��
��K_���vv;}�a\~�e�i���j������������4�V��{��t���������+��"������7�[����=�^L�p�-���o��������@A���!1M*8�)��/���~�����N��������\]�u1c��|�)1.�y;��c�M���Y�&�z����Gg*�+1� @� @� @� @� @�T��Ue��I������>g�����W_;��o���������w������c�����C����G��g��M7�4�.\�-J��-[�slM�H��I�����W/:�{���g��~�T6���+�_������������/6�����{��zxP>K�c���'���x��g���:uj$�$\x������_�Z�L� @� @� @� @� @��� �raex
�@�5F`��1q�O�
6j�(��c��m��D��+?�?���8���b��5��2���^��?�8���
�~����z�m���|�;���.]�	�=��:W�x��c��6J�_�J��5�z������k�������g+&m��	1e���L����i��R,X�S��q�A�����]c����?>.f��"�5������Q=���A�.]b�}��f��e������n���� @� @� @� @� @� @�2	V��a/ P�.���l����o���M�W����eBl���A�j[������J<������2��`H����^�����{d*����^Y-	�u��1������/kJ���b�-�g����}��������>��e�]Vk�E�
+B&l�����C�t�aCWV��u��3g������/��n����g�������������W�E�v����#G�Z����o�)^~�������O�$^9*�{~D��k��.�|��G�Z����w�}���������}-Z4_��M @� @� @� @� @� @�@>u�d P1����|0�9��bn��V��C�]����3�}��.8��X%_������d~�}���e�z����h��b��U�q�i����c���-[G��8���3*O�}��/�����%U����~���V���5+���N+�L.&�'U��T8<��s��E�[n�d��%��C�d*K�-6�}��1t�����w��/��\�����-�'�pB����bk6h� .������o��5�\x�i�E�*����_i�]#@� @� @� @� @� @�@�
�\X��#@�e����%���37n�{\���������2eJ���Ko�j�p���
f�,X�?�\�=��S��a+�.]�4����L��{l�j�8�����k��_x!�,YR�ZU���'����I�f�m����<G��b��3'������>���t��%����[n�e\x�E9�*�1�����o��^J������s�%��m�h�"g� @� @� @� @� @�TV����d����@�c�)�\:tH�?���2��\wE����u�n�����
yxPz��������S'
z$�:���]���_I8q���g��%a����&.����>}z�kV���Le��vh��%���k�h��Y�z�|���J�)�0q��bN��Rt�����U/���3�<�^O��� s�$d��#����: @� @� @� @� @�*��pa�}46F��
L�0!�5m��u���S�������5x`e��U��.�o�G�2�o���
h���/s��u'P0teXp����w-z}����b��27����=��5~~����y�R���=;n����{�8p`�c���E��3�<�n�4��R����)28�q_+R]2����s�M:��~��b�-��t��������n�k&��t�R�� @� @� @� @� @� @��	V�'b? �S`������r��.]��]�lY�q�����
���X,��u��M//^���!��c�9s����#����K:{�#�T;vl^;k��m�q���t�g1z�Kq��7G�^����o^l~.=����U�������Rc��j����T���I��\?S>���o��e4n�����^l��DYVKB�E������e
����f�@� @� @� @� @� @��
  \����j��F��\��}�'�|2�,Y��d�z�����W�����9v*TZ���a�V�X�v����S\x�E��C��O>��G�G��b#���9w��|���c
�������&�����=V7���#F�:n��y���M��:f��M�4]�R����%A����Y��6iZ��e�P' @� @� @� @� @�6�����w[X}�$��������v��q�9gg>�������71��-R������i�����}Ip�w�>9�����>��>�E��7�u�^��2o���	�u����|���c�����nm��I�W�9���/C~C�h��p�����@��������$0ZV+���g���,�~� @� @� @� @� @� ����W�jw�K�T�@�Jl�`5]d���1|���t��o��V^�}��I1y�������5��A�\��H��S�L�=zT��;6�O��{������i�����o�Z�j��q�����^��R������t�*�_/,���*{�2o�� @� @� @� @� @�H����� @�k!P�N�tvR��6o�������0bD�R����zaE���v��5]j��i��]c�Z�L�:5��_b��[4O�}��"������>+�N�m�Q4n�8�4}��@d������f�y� @� @� @� @� @� @`C
nH}�&@�k(�p����������_����o� ��l����
���O�]��XYZ������m��7���:������&@��A��+�V����
^�}�9��.����t�M������i�7�|}�a�4I%�>���1I����\����.w��I��c @� @� @� @� @�*��pae{"�C��h��f�����3r�����c�+���/��E��p��O>����y��h�"�����=o]L��
:4�E�n��u�C]9����o$�*�
��j��"��`k����x����n�������k����+(RbN�����U<�}��c�^x��"	!��:w��y�����������-�A�G<�|�����{�m�}�) @� @� @� @� @��S@��r>�"@�e
����Q�V�t��2�M����1��2�����N��i��i��O<�k�j]��C�t��}o���j�_�_}���:uj�t�C��%���2\�Tv||������������#G��q������o�S+���U�������Y4����o��T�l��E|�������2������{l:n��i����;���9%����N<��8�����������' @� @� @� @� @�6��p��w[ �6�5�N�:�K�p����/�,��+���W_}U���^H�����3��O�x������s\��c�vH��=��R��s�u�1�� ]u��6�80���i�s�������A���C2U����#.����8qb��&U������c6lG���9����m����V�������.��v�w�y��7�x#�������w�O>�_8�k���~�~y�E��Cg��g�~zYG�G� @� @� @� @� @��J+P����� @`���{C���o��.[�,�v�����;n/6&�D����%���nN>������|]��g�}v���n�`�W��#���3[���a�����Z�
���K�������:�����}�p`�L����,S����{�$�x�UW����6��T~�e�6��^{E��7N��o����K/�{��X�	�}��'�g�-����{����gc�������E�ER�0y���n���G�6m�E��d���(S�0�;~��b������j����J���g^z��t_�����X�f��n��e�]��w��MB�^xQ�iG������a��f����7��W��I'��l�M|���x�_������o��f���k���=��A�t���>}zt��w�{�y��7����������3�����Y�=� @� @� @� @� @� @`}
�Om�"@�@%X�tY$��Z4,6L�&����N�TK^5��~�q�}O�h�|�I\y�����p�-1��ik.L�]������O��?�/_^"��H�0_��������oF�~�d�|��W1r��b�7j��rk5��?,VQ��n�Vk����$���3O�QG�0]�v�����y��H^e�$�y�%��_��We
��}O<�x�=S����0\8f��l00	�m�����c��	���=�l��j;�g?�Y_�����U�J|�TX�����`W�X�g�����O�qM3�����#N��OJ�m����$�Z�%aM� @� @� @� @� @�����; @��$#��#��Y����a�xh��8���K�_��?����jp�Fh�a��~���3=��2�2�x��l�U�V��p�-(v�����L�	�� IDAT<��C"y��`��*������O��;�����:�3}��q�u�m�
�gA��`ak��It��e����	
�$���WmI���g��������f���������\uj���x�������m����K�2:xL*QV�6v��l���������*�6�� @� @� @� @� @��
(P+S�e���[ PA���]���;T���!@�*	L��n�9*���E4��y���.��DR�N�\K�,�I�&e*���O�dq��6��3��C�����5�7o^<��31e��l�����>=�{$���iIU�	����/3�[l{u��}V��%U{g������5N:����]�"@� @� @� @� @����[�?���c����	l�@�.��������pa5z��B��R����b����Uv�e�����m���ky�	 @� @� @� @� @��J, \X����C@9�<�!@� PU.\/��r�����F���<<�$@� @� @� @� @� ���#�[ @�X��G����go��}�8��c��-�O� @� @� @� @� @�@.����	 @��x������ja�Z�r
u� @� @� @� @� @��,PkE����;:�j#0�������y�js&!@� @� @� @� @� @�*��[�?�n�c��+�&����*���A� @� @� @� @� @� @����pa�|�NE� @� @� @� @� @� @�r
���A� @� @� @� @� @� @����pa�|�NE� @� @� @� @� @� @�r
���A� @� @� @� @� @� @����pa�|�NE� @� @� @� @� @� @�r
���A� @� @� @� @� @� @����pa�|�NE� @� @� @� @� @� @�r
���A� @� @� @� @� @� @����pa�|�NE� @� @� @� @� @� @�r
���A� @� @� @� @� @� @����pa�|�NE� @� @� @� @� @� @�r
���A� @� @� @� @� @� @����pa�|�NE� @� @� @� @� @� @�r
���A� @� @� @� @� @� @����pa�|�NE� @� @� @� @� @� @�r
���A� @� @� @� @� @� @����pa�|�NE� @� @� @� @� @� @�r
���A� @� @� @� @� @� @����pa�|�NE� @� @� @� @� @� @�r
���A� @� @� @� @� @� @����pa�|�NE�*��k��
�������G����;nO�=���*l���PQ���S�5�x�(�;�������G�F��D� @� @� @� @� @�k& \�fnf @��4k�$
M�>���������Y���><���={Y, �s��k��Q�F���"���9��j�h��al��y�k�6���+n���;vl�X�b���������G�C�-w�E�}}�����z���7��ut��K������q����f�a�=��SO���W_}����H�@�����S� @� @� @� @� @����g�1 @��Zm�2����]���;���T��UfU�Q���v��%.���bg�2��x������L��v��[c������B�?~�0bD��~��'1a������j��?�����R��`��X���x���b����u��z�xx�#��S���OU��o�E������Klw��%1o��x��I��CE���c�#��~��Wb��O �BZP0${��.�e�x�M�����N�>���� @� @� @� @� @�@%.���� @�J�k������_xa����|�#������]�����SO=�/���V�Zi5���.�8qbt?�[��=���5j-Z�����Y�b���i���Sc���W9��'�����X�hQ1�
D��-c��9��:[������
 @� @� @� @� @��5���S�$@� P3���Jm�iO<�������QH�����Q,�S�N�}�91��	1��Y�����������sb�����^�
�U����/&��w~�b��y1������_f���;�w������L @� @� @� @� @�6��p��ws @���.�t��x2Se��]y�U��Y������z|��Gy���;�L���T?|h��������]����-��w���M7����A���o4m�����Q%��,�:���bar�'�x2n��/kQ�m�����3��W'�/�3�4i\�Og{ @� @� @� @� @����pa�yVvJ� �Ff����3'{��m��;�|H����y���GM�}t�8���;�~����_�:���r�V��n�%>���t����tP��O��?����g����� @� @� @� @� @������2�VC`�����~���s����:����sN;������'��M7��v;$v�q�h��l��V[F�����W\��~�k}����W��^~x�Q�b��2�$���^:g�-��O?�����iP�f
��3g�,�^�����������.�N{u�V����7�~}��W�a��6��c���n���e
��%?�?c={Y�x�((X������=z�<E��2{��7��n���5���-[�,���{��%�
O:��
=o��{���D�9�.m�Y��t�f��.;���;.�q�}�d����Y����?�9;'�����������&�5m���K���������
za��������J~��4n���,�t�n\x�/"���%�y�����O����[��<7j[n�*v�x�|�O����O+G��f�;i�����!���n��D���;�X����������=��1�ze-�o�I������q�9g���#�Z+����^z)�8����a�fM����H�i����-Z�(��T0���������|��*y�������k���'������`m�F*�0 @� @� @� @� @�UZ�n���� @�@�H}z��[o��|�M1�/��2����������qy&Tu����������<���O$A���z2�#.����O.&��$Q����z�m��9^�U}��83S�-	�mo��f$�| �:v�i�U��~=64�ca��{�p��Q�b����������������
4�\��v<��31u��t���zj��]q����?�(N�����[B���?��5d�������o�{t������.$����;�X��d|r��2�=���1�_����e-S�/�y� V3fL�9I���_����`���c��OD��-K�M.$��_~����=���{or<�����O����;��{�������A������M+q������������7�=����=��
���������+��[n�C�!���w�z����c��;��r�Gy$�;��l�������Wb����������Z{-m���VQ#���t�s�>�,Z�w]���3����t9� @� @� @� @� @��2����E�k.��V[�5�
>���n�1
�p�	��.��:$����jEe�������C���(V�V���w���j�g����.]�/�k��&���7�tS����T3����l���%�<���s�=K���������J���q��=K�[�%n�B�3zL�w���_5j;e�K�,�V=K�%-�6ur����#GE���6��k���
�%-	5��������v����I�&e�<���q��'��d\�h����y��{%�,�{$��j��j�#�8��N���e*��"��q�H~�'����N$UD������1t�����{���/g}=��A6W�N�h�f�������{�EMZ�ysJ&X���7c�-�(w�g�~:~���#	��d��v�-6��Z� >������LKZ2���G�pa�/��7o;��C4�d�X�	�%kM�>=;$�������0�~Pz%�$����h�����oO�^�w�}s��6mZl^i��|�Mq�UW��~��c�����&��2IK~I�����g����\�k����`ab���[g��?�����{.��������$W�����@l��m2�a������/����~7k��O��e������RC�������)����~�i���3��������~��ng] @� @� @� @� P��k��wx�/p��Gf������
�?����r�-���./1��[oM���w�jUw*��%�\\,Xx�I'���]�
��r�5�\�V���[���G���J.�v������e+:%�0����/����*�X�"�8��lU��u��1n�������Ai7�y���g���]{�/�,m�k�_ y���W/S���H*��l%����:3�><��W^y%�����,���*��*������W,����a�pa���.L������z>�@& }b|���+�as�d�-�L��k�����{�O�v�/:a����o�`m���v��g������Lh����U�;<	�&�������$�������W��[�������>;�����l���[O*�&Ut��%c�0 z��S����c�`a�q���g>c~V�
fV�o�����j�O<�x�k&�:t��d��Gf����)1>y������}���?;��x��I�Wm���oV���5
v��w���%&�r���-,LB��2��:u���N�z��_����$�{������� ��n����3'z_}l��vq��w�����A����g~^O�,�v�]wf��
D&���~��8��cc�������y����w���_��^1"�����UW_]������u�7R�!*��A	 @� @� @� @� @���. \�����UK���t~���O�c���/�"��T&\��h�"�3�
C�����W]ye�pa�? @�	|����*Wo�o~��L���t�~�n�V9JZR�����
�U����K��I���L���LH�hK�Y=���h��;i���Cn����[�=��$�������~zx6�\VE��N;=
.[�,S��q���g*T��
+��[9�4���K�T�+���	�%�|���?���o�	�UTU���|2F<�|���3a��{�{R��`����^��c������������=Ba������M�R�������J��.7\xN&�XX�0	�=����VQL>��
������L(�A��A�����XM������=vo����T�{d���ZIs���q�9����t�������i��9��-7�<~�	&��;n�_\xa��!����s��L��3�a��$����~������}2��q&<XZ;��#2A���@iic�`�o{i,����������%�����<������H�*����2q @� @� @� @� @ ����W�����������t�^{�UjU��^}��*�����r�$�����������Xv�����	1�~��
���kO�W?�$(�j����I��c�K��k�U?�*r�)S�d���U���p@��%���T>-��|�)�����!I%��3�=���6��?,�;��^�V���-	���Z���#�w�}�Z�l�M�Vq�p�2��zh:���[^�H*��������*��-�J�p��������1r�����L���r_y��O��w�!��|+a&���zpa9���k���$��TLZ�z��+,,z�c�=6���� `�����|�e����/(,,���c�tzY�k�q��*��_���3�L�L�>=&O~��)��.�F���Z� @� @� @� @������1��+���_������/����V��d�M���I���H}~��t|R])�bxJ��Ua�'�~u�	�VQ�w��(�u�1ebt��!����O��s�	�Z�S���:Si�hK�x�A���"UK�U�:ub��G��L��U+�%������7���
��v�����#	'U����������4j����V4����1e����O�{O�TS�6mZ�{9�����s�{���]�|y|���\Cc���}�n�i�q��r�]W���[����=����{�_�z�[lQ�1t����E��eM\������T�}�Z��������d��_#�
a  @� @� @� @� P%�V�]�$��c���+V��V�������aC��eU'*���Lhq��#����ERik��]�*T���k�v[�\�r�@���h_����H����_�X��N�`hA�x��5��'�|";n���1`��e��@b����Yg�w�}W<��#1k���H~��~{������;2k�	`U��x��bG�[�b���G~��=]�����\�}V3a�����?(s^�����nVl���r�7z�����L�
�������L����'���s���_��|�HU��s���mV{^���*��-������n��R>�����m���.S��-V>���W�IIp4	����1c��H~G/]����E+�����l���He�V@��S*&�Y[� @� @� @� @����/z�=� @�@ex�������W/������6n��t���yJ[����%�t�nL�:5
&��x 5���[�����-�����`i'�[g��h��J�Z���3'F��.�+����������cc���.wCI���;d��&L�Q���}� IDATF���}9����y:?	.�z�����z�0���TlL�YI[�pa�N���I� R�6;�;m�w*��O��.W�]i7X5,Y���;���.�~�=K[n�����K���
��3���e��Zg��%y���A���n���3�}�9��r��l�g���B_y-�2��3YuN���K��_W��_��rK��������>m���H���� @� @� @� @�����U���5j���/WV�J�}��^m�yyVhj�	�����8��S�{�}�9Q^�����	5N`���	V���O>���� �A}��-'A��Z���?�?�� �pa�bI��S�N�W\���$vk�~1d��������8��#�Y�f����\L_Ip3i_}������g��y��7����V�N�lH��2h>��6�h�����?��*�l�Y����3�w��}z�.��g���>���cf�*�k&���m���Y��
��ZQ�+���}G|����<�MK�(���U�����H�y @� @� @� @� @�D����� @��5X�h��\9-����7�d�����������U�d���,@�@�Z0�������c�R__�4X�	�m�g�}��A���k�M��7o^|���]z���r�-�=|�	lUD[�B`�<C�Ih��U�gK�gI>[��z���;��q������4X��u�����7���b����7���E����w�����UgEY��Y���H�_GuT,L��'�tR&�[|�Q��7��kb���[��m�h~E��/�5:�I @� @� @� @� @�@�(�S��$@��u)��&���w��!����uv�_���1q��b���5+N9����3Q����u�o�u" 4�k&>|x:8������k��oO������w�%��e
��������7�L��6z��8�����R��:v��&M����O?�T/�*[ApmZ��M�M_�����K�]��gE�&M�DP[�lY���3���m+V��k��*]�{�1h�#��A��K�_0?g����������>�13���������w�y;���s��!���C��naE�2�����7�:��%	 @� @� @� @� @��
 �r�@wKXs�V�Z��g�����3sP�j���kvT&���D�?�3fL\W��X9K�&����RaK�E��y��>�T�=�C�#FDR)pM[ET/L��<��]����6m��n�����S�t/�{v���zo�6o^l�i���4{��(ZAp�M6]�}��@�Z�b��7O������N�9n���1u��l���w�,L������k��j�����23��b-V[�S��<�����,\�`Al�p���i��� @� @� @� @� ������� @�@V`u�P��u��%��T��>}��C���2A���=']��+����;.���������x�����^kk�F75�Z
4��az�$�R^[�S�"���jkU�~�����d�V�V0� �J��m��E��}yd�t�������L���4Z��*����$�V�����m���v������7�,w�U��k���99�s���ec��^��?���t����.��~�r�7��r��6`m?�v�u�(Z)r\&Y�[Q��������7.�	{���������J��k @� @� @� @� @�@�.�����	 P%7n��{����}�=��36�l�t�C=����(����CG����
���]A��$���X�DQ�5�=�&�����1�*���D�KQD��4���}�����w?s�;�wf��g�{��s��_���n��$�t�!�����Na��S�!��@�����cp��#�KSIlY
�[�{�K�}����_~>���*������K&j��be����W����h�Z�B��IX�Z�l�7lXa)={����^��{��g��I�2�������]�W%�i\��_�
�n��^X�m��_���e������>|x��
��B��Ixv�-��qL]v�s�=���������.�����wYkP.hY������F-]��U���i���EU���z�������o����U>x)o��];���^�'�����w���X-���k��,�^X��]�|�� @� @� @� @� @�^
��c�i�8�u�]���X���-V�0�����.��V��9s�T[u�����/���������qS�j��\ri���[z?��?���U��e5�lN�����o\�
�C=T%�M��G�1cF���������M�6�.��Y�����V[o]�2v�����o�4��������?.<�g�����k�E��X�����[b���\�>���#G�<+k��q��CK��)�l�E���c�9:��?��5���?���Iu��6b�Ca����M�>=�x�
�K}��
M�6�t�b]<��C*T����~bU��Z�G��[�����c�
����vj�v�=s�u�+<~i~����|a����U�6{���t_���mk��C��n�u������w���X-����~�����W� @� @� @� @�(��paq\�J�U���C���7�bu���������k���L����wk%��n]ta�d�n�3�\C�	W_}Ua9W^uuXo�E!�x#V����[
A�'<��
c���.�<G�����v�mW�h|/����-V}:��3����c��>}���w�����_�<����l�M�������[���_����-L��I���.�fz�Fu
t�\�;��<e�$�1[n����_���Ju#�����(0��E���o�Lk)�N���G8���
�|��G������'V��XMr��{C������<Si���O��c���C�
��'O^�o��T�-��4h� {�����t�u��a�)�T���x����!/��[�cG�~3���g?~��w��wB|����)+
+�{�;��p��w.1G�=v�Q��t�����C�b���z�N�;���I���{��v�X}u���������G��o]�,�p�M7�W_}����y���}�7��7���Y.�����)���!@� @� @� @� @�V>��+����Vf��I���/�KZ�j���a���v�m��`������Q�&���:����o�>�t�-����'�*N���N����%n~z'a���_?4I�PM�29
��5*<���-�0n��p��G�wX�������1u�9���N������v�u���-�T�.��z)p�a���>����C��a����M6�$���
O<�x�5	��U���=��R9� �]w�b����>K�?�%����6�nx���2�C�g�yV��QG�c�}�����Fa�m�
�WY�0�N;�N9e�T��!����$�UX���^�z����6��O��\�o�R_�`_o�I�y���Fm���>
%�I*��/��R�qg&���Pu���z�K/�,��k���������l���{a�����������[o�~��+>F�s�=/�p�o��b����&	��n�4x���o�k�~Mx���
<�z�X�[�n���	a�S��}�
K{��w%#��vH~6���J~N~�Tk�UIcu����m�6��[�_w]z���nK��'�v���{#���n�G����g����S�t�^��k�4\V���c������M��m��Ual��{��U��o����w�����UU���v�!�p���f�nZ%�i�����^x.�nx0����7,��O����������5���
����KXs���*���#B�?�;&F����GV�������#U�V� @� @� @� @� @��|����+�@��P����4�_�=�h�*�<��*����.���`xF�QZ�*���U����zH��������%�\Z�41/��V|����=�B���C�����2��A:��#�:*
���bP���O���$�����'>Y�pa�n���L���\������j�m;$�X��o$������f�
#G��0M��Rm��M�1I�+����={�fx(.�!�����Z�����[��[e���O�wN�Z�V���C��#�8�p�fw�����4-Vl�0aBZ�6�X������r�~��O�~����So�����o?������oN����]���������^x��BU�X]���he-�����R�7nnN����W��/^��S�N�������x2����+������*��`�UW�5�?M�,���W\��o��t	��:(
 .M�����w����������m�*��:�� @� @� @� @� @��"���g2 @`9}�1����O+Jm���!V\j��Q�����;��^�O8���CM��
7�(���O?�l�����wIE��0C�nuS�X����������!�,�zz+Z�J����A�VWY��O�b�g��aa�}�T��Xa����+�_�����7����!7��94k��6���{����p�u��q�����7�Z�w���j1:�=��3��(kC�,����r����I�����n��<�L}���Rj[�
y�?������S� eU����s�;/��S���l�y�C�������o^�Ta�u�M*��-��9(�h�"[������^�
�/��iU��9�"^�,��oe�uR�/�_~�T���V��v���T 8���ng��=���+!V��g.�e >9���2�Ui��������K��{W����z��IsH��*k����$x�������eiu��A]���,{Y��1�+U������.�T� @� @� @� @� @�$!�l)���B���x��w��o�u��O&�b�W_}5��T@�2erZY�m��Ij����
����
\�GW&�\�����V�����T����b5��~��t\���J}i���Nx*	�|6���Z���na���gU����R���7o^=ztR���0q�'a���iX3~ouM�m���m��)��mM�j���>&~21L�:%4o�<��v���V[V��n1���|RQv��O�J�V���j�d��B��b�2eJx��Qi�����<5����w��X��y������O��c��X��c�5�����n�y����>/��bR�qR�>}z��a��6�,}��s���s���J�������u��i�Na��vO�PB����w�X�v�^�����f�j @� @� @� @�������I��������������J��o�'@���\ ��bh���+9����@�J_Z��*o�rk|i���t}����8V��C��[��`�����ryM��K�_��b�q���O_+S[�~Gz���
��{���N_���� @� @� @� @��t
W�[0 @� �;��{���#�<2�@�9w{�! @� @� @� @� PJ���t�B� @������3�/����y��a��S���- @� @� @� @� @���+ \�|�=� @�XL���F�y���W�9f@���# @� @� @� @� @����<��	 @� @��
|�����s�V��M @� @� @� @� @�nT.�[O� @� @� @� @� @� @� @���.,�#�@ @� @� @� @� @� @� P���v:� @��	t��1�q��i����g��W��=
�n���F�B� @� @� @� @� @���@��I���c�x��w�Mm�u��m�� @� @� @� @� @� @���x��1�����k�����Y�a�]� @� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @���\ IDAT @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{!@� @� @� @� @� @� @��3 �B� @� @� @� @� @� @��$ \���� @� @� @� @� @� @� �A@�0�. @� @� @� @� @� @� @ O��y:M{��
6H��`��z�`� @� @� @� @� @� @�@���ey��?��k���5�$��q�������V�� @� @� @� @� @� @�@}�7o~���M���-�'��	��Hm��
�X�y�������M� @� @� @� @� @�,'����/�h�l9=�c�k���5�$��U���_L���V�� @� @� @� @� @� @�@}�����mZ��-�'��	��Hm��
�k�*4i�8�M�
O�1��2�7 @� @� @� @� @� Pd��I�p���C��M����E�6=��	�����@�
��kwL�9��)a��y���F� @� @� @� @� @��_`��9a��)�F���M�!���C�.����U=h��EXk��a�������������M� @� @� @� @� @���������&����V����*u�� �$!����yE��r��������
@���B��-C6k�44j(S���# @� @� @� @� @� @��J/������9����3C��zA��,����+��l�@}.������@��=n��0o������ @� @� @� @� @� @���'��i��^��*.?rO"PT����������I��>3LK��_�����,������y: @� @� @� @� @� P�
61P�b�f�M��a�6�J}��G�@-�k��+ @� @� @� @� @� @���@�<l� @� @� @� @� @� @� @��������$@� @� @� @� @� @� @��.��1� @� @� @� @� @� @��. \��JO @� @� @� @� @� @� ���\�M @� @� @� @� @� @� @��������$@� @� @� @� @� @� @��.��1� @� @� @� @� @� @��. \��JO @� @� @� @� @� @� ���\�M @� @� @� @� @� @� @��������$@� @� @� @� @� @� @��.��1� @� @� @� @� @� @��. \��JO @� @� @� @� @� @� ���\�M @� @� @� @� @� @� @��������$@� @� @� @� @� @� @��.��1� @� @� @� @� @� @��. \��JO @� @� @� @� @� @� ���\�M @� @� @� @� @� @� @��������$@� @� @� @� @� @� @��.��1� @� @� @� @� @� @��. \��JO @� @� @� @� @� @� ���\�M @� @� @� @� @� @� @��������$@� @� @� @� @� @� @��.��1� @� @� @� @� @� @��. \��JO @� @� @� @� @� @� ���\�M @� @� @� @� @� @� @��������$@� @� @� @� @� @� @��.��1� @� @� @� @� @� @��. \��JO @� @� @� @� @� @� ���\�M @� @� @� @� @� @� @��������$@� @� @� @� @� @� @��.��1� @� @� @� @� @� @��. \��JO @� @� @� @� @� @� ���\�M @� @� @� @� @� @� @��������$@� @� @� @� @� @� @��.��1� @� @� @� @� @� @��. \��JO @� @� @� @� @� @� ���\�M @� @� @� @� @� @� @��������$@� @� @� @� @� @� @��.��1� @� @� @� @� @� @��.�8{W=	X>�6#L�1+|9{N�;o~X�`���
k&@� @� @� @� @� @���@��
C����*���6�Z�vm[/�x�h�0i�|��	X1�g~�O�4
j @� @� @� @� @� @��eh��IXw�5B��-�u*�	(��8K P��L�&~65��q�F�M���_h��i�5@#@� @� @� @� @� @��$�`��0{��0}��0}��a��_�C:��zX�}����O�@���Y��
�6l����
`��N�? @� @� @� @� @� @`	��3f��?�.\�Y�C��~�%��@���#����sVVJ�F�i��X��A����k�(� @� @� @� @� @� �U�M����:k��?��Y���WY��G�@	
���X��X�`a�� IDAT7��t��Iy�fM�,�4� @� @� @� @� @� @��h��YX�C�������1T��
JZ@������d����0��i��m����I� @� @� @� @� @���@���B�F
������3k1RWJI@���N�Z,�@��vm[/�,� @� @� @� @� @� @��h��Ah��M�i��Y�wv���.,���0��j��t@��-j7Po @� @� @� @� @� @�@-Z�j�����9��;�" \X*'a�Q`����7n��3N� @� @� @� @� @��^�i��i��s�U��]JV@��d����N`��o���� @� @� @� @� @� @���}K�z��b>��Q@�����&@� @� @� @� @� @� @��( \X��bM @� @� @� @� @� @� @����E�55 @� @� @� @� @� @�(E��R<k"@� @� @� @� @� @� @�E.,"��	 @� @� @� @� @� @� @�@)
���X @� @� @� @� @� @�(��paqMM� @� @� @� @� @� @�JQ@��O�� @� @� @� @� @� @� @�@���kj @� @� @� @� @� @� P����x*�D� @� @� @� @� @� @��( \XD\S @� @� @� @� @� @� @��R.,�S�& @� @� @� @� @� @� PD��"��� @� @� @� @� @� @����pa)��5 @� @� @� @� @� @� @��"
�� @� @� @� @� @� @� @��K�T�� @� @� @� @� @� @�Q@�����&@� @� @� @� @� @� @��( \X��bM @� @� @� @� @� @� @����E�55 @� @� @� @� @� @�(E��R<k"@� @� @� @� @� @� @�E.,"��	 @� @� @� @� @� @� @�@)
���X @� @� @� @� @� @�(��paqMM� @� @� @� @� @� @�JQ@��O�� @� @� @� @� @� @� @�@���kj @� @� @� @� @� @� P����x*�D� @� @� @� @� @� @��( \XD\S @� @� @� @� @� @� @��R.,�S�& @� @� @� @� @� @� PD��"��� @� @� @� @� @� @����pa)��5 @� @� @� @� @� @� @��"
�� @� @� @� @� @� @� @��K�T�� @� @� @� @� @� @�Q@�����&@� @� @� @� @� @� @��( \X��bM @� @� @� @� @� @� @����E�55 @� @� @� @� @� @�(E��R<k"@�@=���W�������������O
�����l�e����^+�i�o}kY�2� @� @� @� @� @� Pk��Z�@���#�����\�u�h���y;-����p����{�6��5���MX��������/\u��a��	� @� @� @� @� @� @���H@�p%:,K%@����1cFx���+<r�����W^Y����(0y��0`�1a�����}v5jT;vl�={v���/��w��p�	'�A�+��b����@���1<s�L0u$�P[�2p`�j @� @� @� @� @��8��+���L��,�����s��Kl��AX�pa��aC��m�����nmu 0����{�N��[����k�����N�Zx_��7/������'�� @� @� @� @� @�X*.e� @��J(0l����>��������n��3L�4)���W�`�>�|/<���0m�����c��>	?��~{���W�Yu!@� @� @� @� @� @�JI@���N�Z P"�����/���3�m��M����_c��)��ZF1N<�7a��q���=��p�=��=��34j��p=�'�������0��GB�.]��s @� @� @� @� @� @�E.,�)	 ���|����_���l����;�=����������[��*�|��p��w����'�tr�]�e�]��'��� @� @� @� @� @� @�@i��9XJJ`��E�����N���w����������*\u�����{�u��Vm�&l��&��c����?Y�Y��G}~w�Y���o:��!tX�}�n�m���9'|���K�w�z�k�����Y�f��s~_�������/�O8!l���a���mZ�
]:oz��+\t��a����f�����������[�0��g�	GyD�<	����Zkv{��{���k��_�i��;���[����
{��6��K:�j�VM�q�������a����[���N�n������v�u�����U��z����w}��.��/����^zIa�e=���3��e���7�p����������C��G�4|k�-��Y������G�~,XP��
����_C4�m����N=5�������.�w�\���k�<���������o��a���kv\#�j�"=�-6�<=�[o�5��3������e���.]�~Y�
�t�q���f�
�]{m��_����{*~�E���;6�92�\: @� @� @� @� @� @���k;@���}�
+l�,T�W�p����
��yh��]&��^{-t����������>�5(	�\v�_2�U��w�~���f��Qa�o�����w�sQ�Z?��
�6mZ2dQ�j��z�u�]�[V����5h��k���	B|=�T������^=��Z=2��<��p��U����O�����+�u��a�UV�4w��x�o����+
���t|�p��k�n�uP�U+k��l������xm���a��1a�C�s��pz��_��7K�]�^}��p\~��W�x��q�B|�{�=���|�����m�D��.����
�}t�!����3|�m��C���t�n�4���s�U�'~W��{����S�^q���wZ��|1V=����O>�d�'���w�}'��������E�%��@� @� @� @� @� @��e.\=c	 �C�;vl��f�i��������nF��������p���(=�~�{���>+�]c�5�*]���X�0�~�������[�|e����p���+��l�aXg�u��?
�*�����j��v��y�����$�U���>��Sg�����'�0g�F��I��������b�.���U�b��������X��,X��C���S�4TV�~�=���iU����������Ox���+��A�u�������?Nv����[����p�o�Q!X��y����n����$9a�'���O��1\��S&O	��w^�k�q�����>���X��o�k��i���4mR��m�����ey�����(=���Z�����g��{��{����_={�y�����G=�Vp����-[�.���y�S��J�����%���Th��A���!��-�s�
6H�[s�p�I��l��Rb�~}��I8������9O;��0w��
�������[��k;��c���6m�T:g������Yg�Y������O����e���������
���F� @� @� @� @� @���.�+I� @ 'C�.�\��n�W����w.�m�������{l!X�T�^zY8��4���I���~��pwZQ���'O��?��Bi�����pc�PW;��a����2M^�;���Kv��V[�������
��$�����Zk�Ux��Q��*ve.<9���na��7�q1������UW]z��W!���K/%���B��v��W�SO;-T���S�?��$�wJ��s�
���+��2�p��5�3<����_��U���q�_�bP���OK+��v���z�
����s���#�W������'�xbh���ck�+�x�O
�xN�\zi�/4l��0<VY<��c�G}�~��<����c�>��=���O
M�6
���C����!�X�r��c�
�������#���=c���tPf�������?~���c1�]z�Q��7G�D\��x�o�^~��B��{���SO[�O��{�|�0��%���v���1�x�u�����~��g�9I���.��} @� @� @� @� @� �I`��:<Sw� @ �14X�z��]a���{���*T���e�����#�.��/��#��<�Uo4(�����MQ��K.�8L�:5�+y�;d�����r�0���C�`�e�U���n��eXC�X=��/,�����n<�B�0��i����<��k��������U��Xq1�L�����o�W����A�n+�}�^�T������ze-�b����/,��7��k����"
7V�N9��0����y�C$[<X���7�|K�,k�^{MUS���c����������i���}�U�{����F��%�/��7��bu��o�!H�e����
|{���ca�{k���{��g�{>��W��4X'���{���
a������wfZk]u�6mZ�.k{��F<�H�`a�C��j�
7�����+.����0 @� @� @����w�aRUw����� ����"����d�����If�Dc�I�q��$�8q\�I��8�+���P4���������&;��{M�������j�o�{���{�{�{���g� @� @����� �DU���^�z���C	�������Y��������������O\�,W��^v�Osu�x�e��p���<w���_����Q���}��9�<�)�b���a�6mB�N�jj������U�h?���k��*�z�����$c����%K
z��������{��������>a�����oHG����W]-z���ck�'��X]-
F���3���knc�G��L��,��LU��|�3�.��^{�3��v���*8F�G��;����F��?���/�}E�;����T��k�p�	��N�:���m�9
�FU6��.�5Sq5�w��������G�����o��Y� @� @� @� @� @���% \����i	 �W �ja��w�*���p�ZYQm|V��\O�4)y|�q�U�&W}|TUl�=��������gW��u|-����'�pb�5<�-�j�I�;��{P�>�Xeu����5Z���'9yK&�2������X����������4ibR3��������c�}�I�~��w�*��T�c��dE�k������B����1�$c��6-D�VW��}�U�r���	:W���j�u�@��h'�|r���G���m?��i��3� @� @� @� @� @��T�N��m�U`������W-����G������������������T���:���0th���k�gUV�x������^�y��w�����Z�n��D�5kf�{�?������l�]w
�/���|��p�I'��������`Y1�k���5V�^S�zO>�d���{�04��l��~����/����	�W,k����[�rE�W�Z�*��S��{?��=������1�zU����qQ�����Zi�6p��|���N]����W����|�����?~X����~���u��d��YU+?��2P[�8p��!
GW��~�V_~���&����X}�� @� @� @� @� @��'�x��|o�G�M^`������Y��L�0W�E��g�y&6���EoV��GU	�*iu�Eo.J�t��-t����)a�LF��:�B���A����{B#�PWvu����a��D4�"\���`�����8`��e�o���J����J���A��-Y��73�..���p��w�5kj8V_���\8w����Q@��K/�������i>����o���9�d?���2<�kp�V��Y���z��p�?
�&N,�rb��M�>�o��7��y��U	9N�����/����K>�F�-[V�x @� @� @� @� @� P�@��~��G��x����`P��m�����<S��}�����k���?8~|�p������ IDATUU+���u��^���e������`U�U������j[��,�NYwU�����B��-�2�t�:-�����2U��jQ�����L%�����>��7�/���U��o�6��������q��d��	B�S�V����m�4��^~�eq2�Ba�wV�����f�����|y�`�oo������ys��������\ @� @� @� @� @� P]���W��W��R%���������u����^�7>.����j���`V�QWU�h\j��}����X!k�n]�m����Kr�(�����a�=�,���+��.0��]����'g���v�8+����O<!	�u��)�~�a��G����;t��9�j�*Y��B�������e�I�!#��o�=\z�%�FT��3���z��W7m��E�����3�8}��_2���O�� @� @� @� @� @�������� �}��d����9s
Zy�������B�>{W��C�*��3���j�Tt�^w�������v]�+����R����*�ze�+E�;v��=XW`���;+��ac�I�L����.�jb!���o���~��a��Iq����:S���hQ�1
�UT���w�/|��?����h�]xA2��������������:�����m����*�W�{�{i(+SUu[�[� @� @� @� @� @���-�w�%@��� 0�����"BTQ����K��U���������d����?���K���L��T�q���,^��[�?�����XL�<�h���;���S�G������UCYEo��zt���x��W�]w��-[�_���d�E�yq�`a|�%��w6����N;%{]�	�5��������~;�b������,�m��{f[��{���U��������& @� @� @� @� @�
.,��@����+�����a��Mu�dW3{0G��_�~!
*U�W������_�s����M�l��!,|���s�*����Z�1:?0`@�J�Qh���f]~�w�����Ku
��-X� ���:�4����,7{��������������>��:��1}F�cr
��7�7����<��g��\{����mG!�U��x�����l������O�*C&��#5 @� @� @� @� @�|������w @�	D!��|0���G�*hW�FU�{���CTE0��k�.��oep���y���WOM��wL�9x����'M��w����CB���*��7.8��p�=w�=��C�MF<���8<��=�������'C����o^c�q���R�7o�{��E-�!�,�B-Z�������]w���wv��-�r��z�s������}U����m�	��u�F[Y�hQx��'��*+p�����-3�~�a�'����;�� @� @� @� @� @� �X������� @�@�x�����o���/;X�o����~��G�/=Tc�q��<�������������u���9]�v
�qD2���o�[�������*��|��W��~��������/��������<���v��9�U<��u�L�?����#F����Q�����,{����w�y����X����n;��`YE��r�-��M�r������.����['C�m@��SN:v��U]���Kyu2&;Z��
��{�d��7����n�U�;����jH��g>�L{vF�*:~�[�J�x������>MP�>Z� @� @� @� @� @� P��pa]B�	 P�����M�6��C-���{�	���G2v|�:O=���C����7�������6}��z��<����/��b���r���n�wx'�B��a�n���W]��8
��3&����9sf��>�����RtP<xp�w�y����UW]��Fy�gT	��|�6xx���$!�e����.XP���.]���������cv�T�?Sq��]z�%!W1�?��������>�~���~��������h��i�:u
g�}v2��k�	���*���(�7����q�����������V��=������-[j�>������r�O���<v���g����w��V���G���F��D*��rJ���{k������w�ygv��U�� @� @� @� @� @� �X��mkE� @�@��0SE�	�DA�B��Q�BTe-jQ�e��u�}����=z�2����:+~���p@8#���X�nm�4qR��F���v�)D!����G�S����z��x��~vux��g��q���={���{7��]��������u�zos�7n\x������a�����C98D!��j�.=v����L����Q���}��_����o
�|PP[�fM8�������_�QG��:�E��;���*�����~�{���-;<��p�e�e�j?�_3w�����~��OG9*��m�8�����a���������u��rn�;�s|��qq��/��7|�?��90t,+���Z���~�=��c�����s���v�7����{��O�p���{�5S��U����9��a����u���'�x2�F!��z��f����N������]�������z+<3����#�$.���S��?
B�������rK��w����g|+��{�8p�R�����0k����E���/���wC}62j�Q�����7.���~�7��7�g��v�8D=���s8���s������o��fX�zu���}������������|�2S�rA���O�G2��wK#@� @� @� @� @� @�@c6��� �"����q*�GY��g���Z'N��;��{��~&�57�v����y�^	?���k�'
����/�s�9�F_����wa���BT5/jQ����ws������e�����������,t��)\y���?�CZS�N�����wd�������M�6�?7�tS�����O�p��$U�r����~������?�����h���~{�S�vR&@p���F������{n�e��=:\|��
��~�k_��Q�.j�V���������]����o���7�}q��W�������+�
��y&DA��E�q��9���_v��sN����n�:����=�KI5���>D?�m�L�4_�0����)����M~=�	F? @� @� @� @� @�>I�����������TI������l�iQ5�(pS��?PY1{�n�1\����V�Z�/gB�'=�m��zw���2���9���w�v�mWc\�2�K��j
8�����3BTE/�"e���v�N�T�<�'���Q����?��Z���� ��EU��>�D�u�]�������O�T�|.D�����������'\u���+��R���n�9D���+W��}\r����{�
�Z��5��gQ0���~�	g��{��z�I���i���[~{k���C�������5����1c����p�����5E���������}��m��9���g�p�=������e�A<����>73��U����M�6��:$
 N��D��)���kQ1�����c�
�G� @� @� @� @� @��z	���i��a0MR`�K��}����I���DQ��)�'g��������v#G�={�,
(��6i���h�����^�z�Q��
Q������������{����_l�[��U���������
���^T��S�P��~U%��r��r���S��%K��5kB�.]3!��aD&�U[@��u���
6���M.��/�
z��%������_y������������{�>���
~q��-[�M{2,Y�$�X�"��n�*����O�*�6�{[�ti��z��7��7���Q��������o�����Z�}?�o+�}�l�byyy��w�zC��n�N� @� @� @� @���3a�ap��� �4������z�����@����*�� @� @� @� @� @� �$�������Z<�@ @� @� @� @� @� @� @�$�K�� @� @� @� @� @� @�. \X��� @� @� @� @� @� @� @�$�K�� @� @� @� @� @� @�. \X��� @� @� @� @� @� @� @�$�K�� @� @� @� @� @� @�.����F @��%��{�p����u������ @� @� @� @� @� @� ����"@��+��G�p��we� @� @� @� @� @� @��hY�# @� @� @� @� @� @� @��R.,��t @� @� @� @� @� @� P��paH� @� @� @� @� @� @� @��R.,��t @� @� @� @� @� @� P��paH� @� @� @� @� @� @� @��R.,��t @� @� @� @� @� @� P��paH� @� @� @� @� @� @� @��R.,��t @� @� @� @� @� @� P��paH� @� @� @� @� @� @� @��R.,��t @� @� @� @� @� @� P��paH� @� @� @� @� @� @� @��R.,��t @� @� @� @� @� @� P��paH� @� @� @� @� @� @� @��R.,��t @� @� @� @� @� @� P��paH� @� @� @� @� @� @� @��R.,��t @� @� @� @� @� @� P��paH� @� @� @� @� @� @� @��R.,��t @� @� @� @� @� @� P��paH� @� @� @� @� @� @� @��R.,��t @� @� @� @� @� @� P��paH� @� @� @� @� @� @� @��R.,��t @� @� @� @� @� @� P��paH� @� @� @� @� @� @� @��Rh]J�q ���+W��n�5�n�n;�SN9%-[�O @� @� @� @� @� @��K���'�l��p�O~o|�������B;&@� @� @� @� @� @��h����< @� @� @� @� @� @� Po��z��@� @� @� @� @� @� @��- \����{ @� @� @� @� @� @� Po��z��@� @� @� @� @� @� @��- \����{ @� @� @� @� @� @� Po��z��@� @� @� @� @� @� @��-�:���{ �tv�u��f�����uk���_��:�=���|%�x�M��� @� @� @� @� @� @��W@���b� @��6l�6n�X��(h�o��?�s
 @� @� @� @� @� @��.����hb7�tS�������1c��_���y�T�8`@��es��U>?���w�>y�dw>��s��S��w|�wO<9-����i2������&��0�����{�X���C� @� @� @� @� @�@�.l:wa'������k���w�;K�������W�-[���J�m��)o���������v�>���M�`������B���q����3�g�:����lP}���{���@��3�y�� @� @� @� @� @� �v��i?�� @� @� @� @� @� @� @��h�5��7�h��������*��{S��= PM�1+�%@� @� @� @� @� @���!0g��������4^��)�ra��� @� @� @� @� @� @� @���	����� @� @� @� @� @� @�) \X$�� @� @� @� @� @� @� @ m��i�1�%@� @� @� @� @� @� @�E
	h: @� @� @� @� @� @�H�@��m�~	 @�@)���� IDAT���w��qS)� @� @� @� @� @� @��
�\��K�e @� @� @� @� @� @� P��pa1z� @� @� @� @� @� @� @��
���l� @� @� @� @� @� @�# \X��� @� @� @� @� @� @� @ ���)�4[&@� @� @� @� @� @� @���g. @� @� @� @� @� @�H��pa
/��	 @� @� @� @� @� @� @�@1�����K� @� @� @� @� @� @�R( \��K�e @� @� @� @� @� @� P��pa1z� @� @� @� @� @� @� @��
���l� @� @� @� @� @� @�# \X��� @� @� @� @� @� @� @ ���)�4[&@� @� @� @� @� @� @���g. @� @� @� @� @� @�H��pa
/��	 @� @� @� @� @� @� @�@1�����K� @� @� @� @� @� @�R( \��K�e @� @� @� @� @� @� P��pa1z� @� @� @� @� @� @� @��
���l� @� @� @� @� @� @�# \X��� @� @� @� @� @� @� @ ���)�4[&@� @� @� @� @� @� @���g. @� @� @� @� @� @�H��pa
/��	 @� @� @� @� @� @� @�@1�����K� @� @� @� @� @� @�R( \��K�e @� @� @� @� @� @� P��pa1z� @� @� @� @� @� @� @��
���l� @� @� @� @� @� @�# \X��� @� @� @� @� @� @� @ ���)�4[&@���<���a����?H���� @� @� @� @� @�H��pa���f	 @� @� @� @� @� @� @�@����Z� @� @� @� @� @� @��J@�0U�e� @� @� @� @� @� @� @�x���
�@� @� @� @� @� @� @�R% \����Y @� @� @� @� @� @� P��pa��V @� @� @� @� @� @� @��.L�u�, @� @� @� @� @� @�(^@��xC+ @� @� @� @� @� @� @��T	���l� @� @� @� @� @� @�/ \X�� @� @� @� @� @� @� @�@��Su]6K� @� @� @� @� @� @��.,��
 @� @� @� @� @� @� @ U����.�%@� @� @� @� @� @� @��oh @� @� @� @� @� @� �*��T]�� @� @� @� @� @� @� @�����7� @� @� @� @� @� @�H��pa���f	 @� @� @� @� @� @� @�@����Z� @� @� @� @� @� @��J@�0U�e� @� @� @� @� @� @� @�x���
�@� @� @� @� @� @� @�R% \����Y @� @� @� @� @� @� P��pa��V @� @� @� @� @� @� @��.L�u�, @� @� @� @� @� @�(^@��xC+ @� @� @� @� @� @� @��T	���l� @� @� @� @� @� @�/ \X�� @� @� @� @� @� @� @�@��Su]6K� @� @� @� @� @� @��.,��
 @� @� @� @� @� @� @ U����.�%@� @� @� @� @� @� @��oh @� @� @� @� @� @� �*��T]�� @� @� @� @� @� @� @�����7� @� @� @� @� @� @�H��pa���f	 @� @� @� @� @� @� @�@����Z� @� @� @� @� @� @��J�u�vk� @�D�w��?���4]�v-�S9 @� @� @� @� @� ������} @�@I	���#������:�� @� @� @� @� @� @��h��]�$ @� @� @� @� @� @� �h���Fi! @� @� @� @� @� @� ���t��] @� @� @� @� @� @� @��F.l4J @� @� @� @� @� @� @��t����� @� @� @� @� @� @�4��pa�QZ� @� @� @� @� @� @��C@�0�d� @� @� @� @� @� @� @�����B @� @� @� @� @� @� @ ����'�$@� @� @� @� @� @� @��& \�h�"@� @� @� @� @� @� @��.L�=�% @� @� @� @� @� @�h4��F�� @� @� @� @� @� @�H��pa:��.	 @� @� @� @� @� @� @�@�	6�� @� @� @� @� @� @� @�@:��qOvI� @� @� @� @� @� @�M@���(-D� @� @� @� @� @� @��! \��{�K @� @� @� @� @� @� �h���Fi!4��z0l�]����s�m:��m"p��w&�}��Wl�wX� @� @� @� @� @�(-����O�!@�@X�~}��Kt��%�������n��0u��p�����O:)����Ip-
+��y�Z��m/p��'�A��/������E���K�� @� @� @� @� @�H�@�T���	 @����~�_a������������;�S���F�M��l�R����@�-�^�?���C/��������	��� @� @� @� @� @� @���"�raS�	� @�@#�\�2\{�5�Jeee�������s��,��X����!����������������� @� @� @� @� @�hr��M�Jl�
���_�(`�SO�j���S���q����s����@h��U��1�����y���n��5\���?��{ @� @� @� @� @� �:�����
 @�@N�
6�_�|s��o��[�q�^s�/��B�~�B�������b��'��>���f��p�}��7�x#����)n�� @� @� @� @� @� @��OY@r�S��'@�@c	������^������	��{��O>9���_���rMcB������x3[�l	������1� @� @� @� @� @� @����pa��"@�@�n�����{l�I���n�5l�]�����_r�U�V�����p�!�����:v}z��<��p�5?o��V���������/��<4�����c�B��v
; �{�9a��9����m�%{��7���`A�N�v���+W�����9&s��w��>���9 @� @� @� @� @� @��O�u�;� @�����0e���`c�]z����f�����_�/�2+
F?O>�dx�����W]�s�_�����/������t�����5+\w�/�g|+\u���U�VU�
1<��e����]�v9�����3�������s�|���Q��
m��	~�a|���~:�1��y @� @� @� @� @� @��K@���u�NK�@�
<��#I���]��}���DOZ����{%�:��*���-[�������E���}v�`a��}��#G�����-Z����eK���_�S���n�Zec}���{��������3��x�3�OO�/0 ��}�0t��d���k��="@� @� @� @� @� @����pas�8?%!0y���9>7dH�+����g�uvX�re�m������"���JX�fmX�v]x}��7��64(��S�L	W]ue��	�z��a�K/�G��}nf����p��������;�����X��+���Q�10���y��^}���%�>�����A @� @� @� @� @� �\����;7%%����y�;���V����hQ��_�Fd��=7sV���g����#�j�*^f�]v	�����z:|�k_���y���T!�u�]�_~$<���^�z����'V������M���>"+\�U���Kky����Y�f%�#�W�W��������?���!ZK#@� @� @� @� @� @�d�> @ �[�l	���KN��^{��D
�~����K���w�N�:��P6����J��/�	��B�?��9a��w��F��m��W]��-]�4��@������.����W��?o��V������a��
��(�$m����7�W_]P�T� @� @� @� @� @� @��f" \�L.�1	(]�(��y�������k����}�������0���I�&%����'��w���J�����{���!C��(������bv�6mZ��0�~�����H�*���A��=�<}c�9FyD� @� @� @� @� @�4g���|��N�@IT���c��8WCq���6h���3�y}���+ ��6,2�����n�������<�1cz��I'&��|����av��5~���um�J��������o0 @� @� @� @� @� P��]_� IDAT����NH�@��]���	��kW�'��xQ��������Y�	�U�����Y��=.� Y�eW�1}F���'T�<aB���T.��XW�;R}�> @� @� @� @� @� @��O@����� P�[�n-��~��b_���k��g��UIo�NeyFVvu,��|���j���88}ze��������Q������M�PY�p����J������o
Tcm @� @� @� @� @� @���g.���;�Pe���o��t����E}v�i��dx�6m
���M�d\4�z��J������{,|��G�{���������2er��qc��gg����6d�������2��w���5�I� @� @� @� @� @����pai��� �v�i�*�^�by3T(��;VV!\�vmA�]W9���,�h����n���������-[^{�����&}\�p�����C	����[��6-���D1|D��>m���U�����F� @� @� @� @� @��.�} @�@�z��Z�n��b���S~�Og�;��%y��%K
������:��c�9�GO�O�T$��c�&��36�Jx��G��'L��9c�����^9?�,�-^\�;�k�^�2� @� @� @� @� @�hN���������h��U���or���9�������W��3'l����W�4��dL���9�gW�1}z�7����o���F��;vl���	����G�����������??��v�����]��� @� @� @� @� @� @��@@��\�# P��2$9���f�����	��4\�ti&�WY=0��V�Z�=�d��=?{|�����	'L��8����?��3&~���/��3g���~;�;w���>mvf��6h���:�F� @� @� @� @� @��.�} @�@	z����fBq�T�+�c7�������5��k���
�6m���9��s���w���k��o��Y��G��^(����g�����������?j�G�H�^�����O'�G�<�>S�%@� @� @� @� @� @����pa3�h�$@���d*��l�����������	�o�>|�k_O&�}����7��s���?���O��(���w��c[�h�
;0���aC�������9�m�����<p�x������][�����?^���| @� @� @� @� @� @����pa��
 @��u�YY�������c]q�OC���5~�l�����LE��c�v��A�kj�.�����W�d[���w�q�����0u��p�����O�f��::l��1��;����.�Q����G�	w�y�0x��*s��h���N�^9/��:'Lx4l��9~UD��5
}�q @� @� @� @� @� @�@zZ�w�vN���������G��sO8����
�e��$4W��(h�6��U��j����:t>�P��L��7�|3��C=��j;v��{_�}�=ru'��W =zt�*f������U���=z�{��g�usu�w�����O�rR�2�X� @� @� @� @� @� @���+�ra��{''@���;���"^�f�����Sb'�d���������N?����]��/m��u8����3�L�rH�1����m�<=fl�9��Gqd����_�0
&�?>^�U�V���N�� @� @� @� @� @� @��@��������|i~|��>���0N�`��/�,\z�%��3��v���k���!�_�><1ujx������+BY���[�������;wnrD�������~'�W~���;��m� @� @� @� @� @����3a|���������@3.lF����- \X��[��V�\���7�X�	����y�4�\��1�p���W�~��W^�Z�h����8p���0� @� @� @� @� @��.�'����@�&��!@��"�jz����+�Z�*�t��E�fj��� F��N,L���+ @� @� @� @� @��T.������P�p[��s��������_=t��%�yy�������wU-v����/�v���Y���v���� @� @� @� @� @� @�!*6D�MG@���svB��F��e�\sM�������W]�(�Z��
������Q;�����U� @� @� @� @� @�h2*6����	�\X��� @� @� @� @� @� @�@�T.���������M�F�� @� @� @� @� @� @�lc��mly @� @� @� @� @� @� ������� @� @� @� @� @� @�������� @� @� @� @� @� @� @��	6�� @� @� @� @� @� @� ����1��	 @� @� @� @� @� @� @�@S.lj7b? @� @� @� @� @� @� @`nc`� @� @� @� @� @� @� @���& \��n�~ @� @�������F]~�t�RjA
%����1wG�Ej�b@��P���.%�q�0����� ����~� @� @� @� @� �, .L6� @� @� @� @� @� @�TV��} @� @� @� @� @� @� @�@���0�x @� @� @� @� @� @� PM@\X�"�!@� @� @� @� @� @� @����d`�	 @� @� @� @� @� @� @�@5qa���� @� @� @� @� @� @�$����'@� @� @� @� @� @� @�����.b @� @� @� @� @� @� �, .L6� @� @� @� @� @� @�TV��} @� @� @� @� @� @� @�@���0�x @� @� @� @� @� @� PM@\X�"�!@� @� @� @� @� @� @����d`�	 @� @� @� @� @� @� @�@5qa���� @� @� @� @� @� @�$����'@� @� @� @� @� @� @�����.b @� @� @� @� @� @� �, .L6� @� @� @� @� @� @�TV��} @� @� @� @� @� @� @�@���0�x @� @� @� @� @� @� PM@\X�"�!@� @� @� @� @� @� @����d`�	 @� @� @� @� @� @� @�@5qa���� @� @� @� @� @� @�$����'@� @� @� @� @� @� @�����.b @� @� @� @� @� @� �, .L6� @� @� @� @� @� @�TV��} @� @� @� @� @� @� @�@���0�x @� @� @� @� @� @� PM@\X�"�!@� @� @� @� @� @� @����d`�	 @� @� @� @� @� @� @�@5qa���� @� @� @� @� @� @�$����'@� @� @� @� @� @� @�����.b @� @� @� @� @� @� �, .L6� @� @� @� @� @� @�TV��} @� @� @� @� @� @� @�@���0�x @� @� @� @� @� @� PM@\X�"�!@� @� @� @� @� @� @����d`�	 @� @� @� @� @� @� @�@5qa���� @� @� @� @� @� @�$����'@� @� @� @� @� @� @�����.b @� @� @� @� @� @� �, .L6� @� @� @� @� @� @�TV��} @� @� @� @� @� @� @�@���0�x @� @� @� @� @� @� PM@\X�"�!@� @� @� @� @� @� @����d`�	 @� @� @� @� @� @� @�@5qa���� @� @� @� @� @� @�$����'@� @� @� @� @� @� @�����.b @� @� @� @� @� @� �, .L6� @� @� @� @� @� @�TV��} @� @� @� @� @� @� @�@���0�x @� @� @� @� @� @� PM@\X�"�!@� @� @� @� @� @� @����d`�	 @� @� @� @� @� @� @�@5qa���� @� @� @� @� @� @�$����'@� @� @� @� @� @� @�����.b @� @� @� @� @� @� �, .L6� @� @� @� @� @� @�TV��} @� @� @� @� @� @� @�@���0�x @� @� @� @� @� @� PM@\X�"�!@� @� @� @� @� @� @����d`�	 @� @� @� @� @� @� @�@5qa���� @� @� @� @� @� @�$����'@� @� @� @� @� @� @�����.b @� @� @� @� @� @� �, .L6� @� @� @� @� @� @�TV��} @� @� @� @� @� @� @�@���0�x @� @� @� @� @� @� PM@\X�"�!@� @� @� @� @� @� @����d`�	 @� @� @� @� @� @� @�@5qa���� @� @� @�?�Ct6IDAT @� @� @�$����'@� @� @� @� @� @� @�����.b @� @� @� @� @� @� �, .L6� @� @� @� @� @� @�TV��} @� @� @� @� @� @� @�@���0�x @� @� @� @� @� @� PM@\X�"�!@� @� @� @� @� @� @����d`�	 @� @� @� @� @� @� @�@5qa���� @� @� @� @� @� @�$����'�,��dc���|��O� @� @� @� @� @� ������=��2x6�������<�������8�]`!@� @� @� @� @� @��
���������N�@���0��dK����������]#@� @� @� @� @� @��O���_���^��{1���!=�������� @� @� @� @� @� @��T�n����{��1��<qa����*����1�n��W?V���t���1 @� @� @� @� @� @`}�\���������{���9������p�N�A�*���1~�������z=�>��+�w @� @� @� @� @� @�I>����^/�>��1$}�X������X��w{��������r����q���2?�[ @� @� @� @� @� @��
�����r����{��W���F`�6�"����X/���/n���������qnom�[M�z�i�Z @� @� @� @� @� �u��qv6����:,�]������?����~e��eNa�V��/��������l @� @� @� @� @� ���[�q����X�����U��U������&}{|:��B���������?�+� @� @� @� @� @� @�_�L&�:(���=����{�{_�������f] @� @� @� @� @� @� �D�� @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @� @� @� @� @����aB @� @� @� @� @� @� @�@/qa�{�� @� @���GGG�����������`����������������[� @� @� @� @`���0��u�e�IEND�B`�
#27David G. Johnston
david.g.johnston@gmail.com
In reply to: jian he (#26)
Re: Document NULL

Thank you for taking the time to look this over.

On Wed, Nov 20, 2024 at 3:19 AM jian he <jian.universality@gmail.com> wrote:

On Sat, Jun 29, 2024 at 4:40 AM David G. Johnston
<david.g.johnston@gmail.com> wrote:

The attached are complete and ready for review. I did some file

structure reformatting at the end and left that as the second patch. The
first contains all of the content.

I'm adding this to the commitfest.

Thanks!

David J.

in doc/src/sgml/nullvalues.sgml
can we mention
\pset null NULL
command, then NULL means this value is NULL.

you can also see doc/src/sgml/func.sgml
(The above example can be copied-and-pasted
into <application>psql</application> to set things up for the following
examples.

Good idea. I'll see how it plays out.

-------------------------------------------------------------
in doc/src/sgml/nullvalues.sgml
see the attached for one example output

in doc/src/sgml/nullvalues.sgml we have
one_whitespace<programlisting>
two_whitespace<programlisting>
three_whitespace<programlisting>
four_whitespace<programlisting>

i think you need zero whitespace for tag <programlisting>. like
<programlisting>
</programlisting>

https://tdg.docbook.org/tdg/4.5/programlisting
says whitespaces are significant.

Did you not apply patch 0002? The indentation in 0001 exists because it
was much easier to deal with collapse-all related viewing in my editor. I
removed it in 0002 since the final commit would indeed not be so indented.
The tag itself doesn't actually care but its content does indeed get
undesirably indented if the markup is nested in the typical manner.

<<>>
As noted in <xref linkend="json-type-mapping-table"/>, JSON has a null
value
that does not get exposed at the SQL level.
<<>>
i feel like this sentence is weird. since these two are different things.

Yeah, the linked page and this summary/pointer need a bit of work. I don't
like the unexplained "different concept" but probably "not exposed" isn't
much better. As this gets closer to being committable I'll see about
getting this topic cleaned up. Suggestions welcomed.

I think some of the query and query output can be combined into one
<programlisting>.
no need one <programlisting> for the query, one <screen> for the output.

Trivial to change but having both seems more semantically correct and
easier to read IMO. We don't have a policy document covering this that I'm
aware of, and IIRC both variations presently exist in the documentation.

David J.

#28jian he
jian.universality@gmail.com
In reply to: David G. Johnston (#27)
1 attachment(s)
Re: Document NULL

On Wed, Nov 20, 2024 at 11:57 PM David G. Johnston
<david.g.johnston@gmail.com> wrote:

-------------------------------------------------------------
in doc/src/sgml/nullvalues.sgml
see the attached for one example output

in doc/src/sgml/nullvalues.sgml we have
one_whitespace<programlisting>
two_whitespace<programlisting>
three_whitespace<programlisting>
four_whitespace<programlisting>

i think you need zero whitespace for tag <programlisting>. like
<programlisting>
</programlisting>

https://tdg.docbook.org/tdg/4.5/programlisting
says whitespaces are significant.

Did you not apply patch 0002? The indentation in 0001 exists because it was much easier to deal with collapse-all related viewing in my editor. I removed it in 0002 since the final commit would indeed not be so indented. The tag itself doesn't actually care but its content does indeed get undesirably indented if the markup is nested in the typical manner.

i didn't apply patch 0002, 0001 is already too much.

attached image.png for
5.2.7.2. Array Elements and IN Bag Members
the example is too overwhelming, one or two should be enough?

5.2.7.3. Single-Column Subquery Rows.
two examples, can be reduced to one.

typo:
There are none. During initializion all settings are assigned a non-null value.
5.2.16. Null Values in Partiton Keys
As noted in the synatx chapter, a null value literal is written using
the NULL keyword. Its type is the pseudo-type unknown but can be cast
to any concrete data type.

""
At present this is typically a non-issue as PostgreSQL does not
support a primary key that does not include partition key columns, and
all columns in a primary key are forced to be have not null
constraints.
""
"does not support...does not include" double negation, can we make it
"positive".
"not null constraints." should be "not-null constraints"?

Attachments:

image.pngimage/png; name=image.pngDownload
�PNG


IHDR
/0��PksBIT|d� IDATx^���E�����3" 
T�
�1���9��N�p������gD���(F�$ �$#HFI�sN����g{fgfg�M,���|��PU�������y
�\1
 � � � � � � � � � � � � ����>�C@@@@@@@@@@@@<���@@@@@@@@@@@@@ [^�V*E@@@@@@@@@@@@���@@@@@@@@@@@@@ [^�V*E@@@@@@@@@@@@���@@@@@@@@@@@@@ [^�V*E@@@@@@@@@@@@���@@@@@@@@@@@@@ [^�V*E@@@@@@@@@@@@���@@@@@@@@@@@@@ [^�V*E@@@@@@@@@@@@���@@@@@@@@@@@@@ [^�V*E@@@@@@@@@@@@���@@@@@@@@@@@@@ [^�V*E@@@@@@@@@@@@�� ��Y��'�k��b���������C�������;�����U���=�����CC 9�{�����x��\��{���vd+@@@@@@@@@@�l x)���7���x5L�~��%�l1m�r0v����R[�j�mu����*n�*��6��sNh`U+���1�wz��-[�1����y^k���qm�n��=!��6d��6}�2[�n�����*�)i��V�����N��[��9{y�^���|����~��K���U��8~���������=p�5��yJh��=O�W�>��%���n�bE
�k�U�X��c��gz�oGLoW�`�������3��z�o��gC������O��%�}�7��g�z�����z����*Y��u�+Q�H��������2%���n�"���F/{����tu������Oo�_��i@@@@@@@@@@��O g�;�?�l���M�����J�Z���������0z�����{��s�)3����l��n�n���`��%���P�`��t][�n�d�d�f-���&�37�e�j�n��Z�g��tU��e&�K�TXp 	�:���1�E�C��������33�?��������3�;"O�3�tF���|��}��2(�����s�m���,��|��bv�%'Y���s�����[��������N��9�W�\JjG6B@@@@@@@@@@ 
fa]T����M[��2��
�2�.�G����Z������m��y�����r���T�>c��W���]�����7��2M�D��{�
pY������m��
EA�@X�v������^��^���T�)m���.
8��P&�o��ec��e��Qp���h?��|��(#S��T�^��� � � � � � � � � � �Y)@����L��`���Gj_�6��U*�N�>���eJ����/���sOhh�kW�R����������6hB�$�W�a'[;��=x��v�;��w\�Q�����f7)S���B{[*\�������?�H�]��,X�f-\i]�e3]6)������}������L��i�S�0��V�X�
��,Y����e��dr�'�������t-'*��2�%���u?N������V0S�qG��	s{��u��V��l�/�R}��]z��S����eK��a_����s���6�yi��M^`�G&��ei���;��6���������*n��3Me�NV�q�bE6��=0�A�z�n��#�>�D@@@@@@@@@@ ;������n��	���z���+������c����<zu;k������C�gnjo[�����-�V)�f�������Iw'���
�	f�8�MC/�*�r����p�:���5�����F�r����5�y�]�d[�n�����s<�Ri)�m��2#�S�5�X�B�s�o�2����z�=�.d%3��`H�G�J���<��Li�����l����6|�;��;����R�me�P���Vmr0/9�{��f�8���^�S�.|�������������r.�'?�ZU+z����m;w��.�I�����Y�l����&zO��y(�K\1@@@@@@@@@@ ����"�y�R���\qf�#���R��o~d8xI�(�)���x�F/�z������.���S���$����/Iu�*eJ���j�w#�{���c��-��!d���6z�����i\�������E�+����e��u��=�:��s�C*�����	6v�BS;*#^�=�q��.�m����/���B������f�,�@��v�U�7�{.l�m�M�2�w/k���u�{O��:���T�S]f��[7��E"��k����� 7e�����L����^#����	��|�Iv�i�;�������,��GM�)��� ��V�L)��e�jv�!q�����^iu�W�bz��2�,��k7[�E���e��&u��S�	����<�r����X�� R�t	kT�`���cL�y��[���#�����m�;�[���
eK�!��Y�fu��G�2��*�k�4w�_�����L�����iZ�q�6+��m]g���_tRc��t�}~v���o����7�����h�,�����LZ��~�4����.���
���Y���U�[CgqB�Z�����l	fJ�X��Ce���R��3
^���I��7#�����d�\nq�p��y�
�<������e�J���U�N�^���Q����g�z6e�7��������������@?]F�e��vM�y��4^���8�U}k�A&��j?�zJ��J����V�/xI���n�9�/S�_k6�w�sc�2�S��]xrcS�o����oG��=CX�������JT�=p��1��i�v;�=��QJe���/�3+�Lw���\��f�X��Xc����m��U�}]�e�:�Y_����[=��9n���q3y��zS��rv�1����M�gTFE�m*��n����j#���.X�=���u���C��W�z��"8N���S��������~�Y����5��'��,��_�3����6u�_��]���x�l[�l�G�kS��).[f������e � � � � � � � � � �@v����1��^*?�%��)/J���,
�������C�f!R���	��*��T3�,��1;�����uM�nQ�0+�$��e��2��I����,�cVP��nr���M���&.�����/��/mw���7�9X�3d=�� �O��7_;����_�����8_��?xI�&��~y�`����������M���EA^���2e�e�R?u�n^��nQP���s��q��l�\P��������xAa~Q@�^
���������;_��"�
sV���S��L�����n�p����J���&�w�a�����B�tAG
���v_/`%X4������w.��{���;�(��qw��Z�����F<�u(�G��^_�j�\���.�ZfK�S����G�d
�R����,t.X*�"���������l���]�	H�z�rl�x�@��M��~�'$�}���%�m���\�u�N���������s��/\�dt�cV��J]�]&�`�~h����ck������w���mg��;4���o��M�eN��Ll�/�qA�������u��5�����g]z�J��Y=��z��{.)P,X�3`�l8a������3���.p��oGF���������;_��%*��1��]�yN��~��`�.w�g����x%+-��Vy��a���
�J.��/z�?�}���EtQ����=�2w~��u��]2��� � � � � � � � � ��*{u���}�
d�D|�'�&]In�l���Y]��	�
���U��du�-
�21%��a_:����eGQ&Y)H�/�m2jk���6��e���_����k�q���������,����!v��D������"��(��������L���O���r���/�O�:rb���(h$���eYR��`�&�?��3*_�b��H\*��E����}o�	.)�M�mtQ�B�s��h��Wz����G����,E:�~Q���]�����Vo�<��%e'�y�Nx�@�G?��P�1�����LQ���-����``D����iI�Y4A?X:�C\t�����U}D��V�ed�K_(�l�0kqD�������2��(�,VQ ����J��`E��T0�?]�[�}�:��d�mqY�4n\yz����P���L���l&���J�(�M����!�c��km�{=�1����xr������'��s����u�	�S�(k��'40e��Y�BtuI���%]�~6(ex�2��+
\���QQ�2��
h��d�X�f�p���������p�U�|=�^u/?�S�/:�O��S����axK���K?pImF��KWo��Me��U���O7������v�@ ���G.�@�S�z��q=��`��q9���@@@@@@@@@�m2/����w&��n&����p�=[l���\�LIS �IG���.�Ht����n����n=7A6+�&%:hR���kW�F�W��&"��D�Q�-/;�e:��2{�J���A������e�Pf�?\&�d3�l����R���\G��GYc�����S>8��GE�m]���>4��q�HseO���S���e:�|Z0�(��2N�(C���/�&N���Z���C�f����	B�����	s#��n� z�<���C~���r�Y��������t.��c
��m2t�<4a��q����X�)K�?�m�e'����cg���	g��8g���~�����U����}M���#2}7r�wn�E���xp8��r���������{��m
���<�m�}�����^�LM����'Y�f���<]����b�a��U���(�\����a�k��M��?����u��������M�uM>|u��`�U.��`g>�����bVga0S��Nw���`f�����`����X����t<p�)���(�K�����3]_~Q�;�����D������p��y�)(�W��m%7�2/�����w��ZR����g������~*+�twM(���X%�;�m�y�_��7�e�:�U�Z
�?�����}{�4�N<����z���L����u�����m�����?tO>ru���Iv�.w�*g�i�UQ_5��*����O*
xJT�k,Q0�o���D��F������h���.��wBC�����sI��t�
��VQ�)��(���|�����n<��<{����1QE��2��sa�o�d�����g�}����1Q������a�/
�{���#���������������o@@@@@@@@@@ /���ga��m-ju�(S�^S���e��|��^�HvM���b�\uz�,o��)�L�Y�re6g]�v?�B��D��%8�X��Nh\+��2)`e��M�2eri��)
BR��kw�c
jI���K^~�]tr�	�~=
����%1�U6`\����S��/i�n��������ew��>X`���@G�5c����{]��DE�(��|V�M��S@Q�i�p���/K�B��S����H�D������5��kNg���}L�^�2�O����N^�!�hb��7�������_�����W~������@"��.���]���tY{T,[k
NRV�D���[kw~Q��2���f�7��/���/%�/��`f6m�����!r^v����Hzy0���s�%���w�!�p���I���D�(S�[�^p��1���Y�V��)�R����<+�m���-�(h��]�Ed�Q���^���������?Y����� ��1F��T������(�3�(cM�@���.o���:��v������<��t��O��(�Lu���2qvZ6�&u�\��/.rc���
�v�ju=Eg���7��
:T����7#�k<R���JG��@�q_#z.)���f����K^��SD����,���cS���g���,f
�Q�V�@���/i���/=9��d�������v�5���2������3a) ����F����
i�*��/:���A]�zQ@@@@@@@@@@��E�������OM����� �`��X�����2x��Y~��<�	�~���NL���Ntd]R��S�1�2�(��/��v�)h#��&\p!�p��g���E�\���I�
fI6p��OAK.e�����A��5n2|�([��u�_~7��De�Z�j�Mw���	����d����Lt����lS~9�M���)�_�_�1G�xU��1:�4���� �`��_���`�,e��.�]v+�4p�O���Z�@�`���@���:�������D�D��/��*Q���M? +�~�����v�n��\��Q��e�RC����*/S���"��i/X��^q-)�2V����+�5�e�����v�F���&iY�������7���}�nS����328�(����u�2��K�wHZB��j'XV�2����D�,t�����Y��{�}'�t������i=/0���I\�k,9�N�t����/��UZ/�8:����2*��	v����i�UovYh\}��vq��v0����^�)@@@@@@@@@������g���e��'���S����V�jn�s�����u���L
K�#�f��i��sAF'�`�bE���K��,[����)_���xk�,,��v?K������Y���0f�B{���0�&K�uA�}a�p������}��@-W��OO�6Q�
eWIfb�i.�L���;�6�2���9e���^��.8���^�e��3E���7�G��,�s����F���C��9�^��b����l;
&�U���/�d���xf����G����9�]����w�e{ �D����i�a�G���J�e�;��J�#k�]}m��I�2XQ�B;��6���(���G�[�Gy�x����J�:�)M�i�`J��~F�_���e��>_�I�k�����g��*,���(�[n��@��]F��n���#��l@'];��*�J���*3�M/~m2z��3���L��+J��s����*����v���?� IDAT�`�X��)[���Y/b��Jw�K�bE�7���z��c�2(FgMT �_:�,?���K��|����m�]j��e�:����n���o�29�]�2�1;-.=�+\0��(���>{3��=��i�	�W�����B�@@@@@@@@@�[���\�J/j�?����K�i.��IGnw���&�Y��n��\=t��^ ��M����^^���&T���s3(�Q_>41�Iiw����$�Q&�]b���k�����A�Z����Y��2#\}9V�jE[����<���Vo����2�$�����)w]����1�M��j�T��<�}�jSS�EV�����>U��	��K�g��Tf��'��D�P�]k��%^������A_�<5^����1z������,D_��/��nA�@�b(*��Z7�]AT~������L��e�y��m�����bE#�t��J����p���U��t��Po�5�{)x��S���\0SF����)����z�7~���_�@p�vr���U^^��rq�)�#J��\�P�Jqg_�L��la�����
����V��W��f����oFxAC*��a���]������s�{P�f�\�=�g*z&��������M���2f�B��m?�\P����w�#1e�RQ6���,�'��[xwe��������kV�^�b�w��r��s����:��?~�d��nr�n�9�D;��s�EM�w���������gr�����	��.��/�i�i*��^Vs��t��81-��)��}w�I���T�d�X��@@@@@@@@@���g����8�R`�?�mm7��U��59z_�kn}�[�b�WU	.�yN8����������2���6
cN"��6'�LUw���m�;#�d���|/,;���[m��?�Mh�Y~�a�^&e�q���2%�O�O����Nr"���{��l�/���L���}��$��!�~�/?��|�������Y��{#�2��}�L���o�	�%�'�i%zb~��e��@�f*���73+���C�YO�
E��w��E�)O|<�>�7������)��)m������3���8L&x)V�L����A0s��to%*
������S��~cf��e���e��v��j��1dE�5(0����s����4�x�z/X�2�G�(����~�������
D���MOD7�g�%���.pV�/��:���sZZ0�Yf�����E�qPE��n=����`�%I��%l6;��d����f�A���������(��sZAW��|���^��^p�_���k�1���Iv�y�]��	�++@@@@@@@@@@��"@�R^9Q�8���"�Dg�I��+�m��^������o��<k\�j�U%�}w7��/���i�&�_*)3��]\���]�n�|��=XE��$��&�g&[����M�O&";�A��;w����X[��:�+zP~��6w�����Ol^R�aS�Y��G��	s��(H������"��.(2��;f�H���
do�/�#:��M�w�pZ&����ee�E��+��{�r7^v�p_�b��_�B)w�����u^D��d�fJKf{�M_���J�
�@�Q"1/^4-�M�0z%�"�sW���b4�������<��{��c���l�}���.�1���}���\}z�p���s���K�����x7�u�5u���T(m�������{���q�U�B{��������I6m�a�0>�������v~�F������~��@���%�2����T�l����9�t���kw�{^K�)�/�i�?���u�
����{���L{��5�B�a��N����X��@@@@@@@@@�S�?�>O��������K�M�M�(���d7���p�R�R����.���%J�0nV���5�kU+�I��	�?k����K.5�Y�����	\R�����er��2`�S�(�(���k�Y37y_�<��%��'I'���U���.�_�N����'x��vM��2������`Y�r}^�j�~U)���gUK��~�@���5���x���	�������EgJKig�qf��m�����������Wv��R�u�I���Q��G&��=_�e�
�5.��_8�����������LYs����
v�M�c�T��NN;n+�OY���Q������n8�yFUej�)M���[�����
���\��W9��*v���l�oc���[l���q?z������,�i��[:��O]g��� ��>pAs��)*.+@@@@@@@@@@�, �R�fUuS��QU���2U��5�����%��N��T���Nt���S)S�%�S��&�����+Oo��nIo3�e����>������f���\+�&��D��h��]�*��2{t����M?��P�z�o�6��2�M4W�UN��KWG4y����(m������\���`2e���@�2;���Qg���V�e��J����{y���u��7�����[���I�#�)��������6r�����VxcLt��x�GgJ{���v��HT.z�[�l��� �w��'������s�.��L+5�=��Z�"�{3;���;�;�����`�n.x�?W�k�l]�(*�P�~Y�q��n�|l�������Qy��X{��Xo�/?5"�)�}�b��w'4����(������U��uI;���$3^n~���wd������������y�BA��\���U�7z�
��sz�{?"�y�,D@@@@@@@@@rY��K9|�p�+���v�[��o� �S�D������_��'�G�_��w(���t��0�^��R\R0�G'x�Ge2P�����^#������F.3G2Eu�
��6c�����������]�:/�����b��/�3zF���Z�hso]����D��aY�A��"j��;v��W?�e(��i]��]P�����C��wQF�z�3�"W��jX3���>p�)xk)�7����j}�o\��z�R�"������t�
���1K(�`�`��2%�Y��Q���~x�
[���S��h�L����1x���<�s���n'�vT��{/>1\�*�����j.n�zK0�P!]D��sW��J����1~��oU�"�"2O��>������p����!��f��{�3��r�yu,I�@���3H���Q��i��H���%/[�}@@@@@@@@@��^��3��?�2zt�=��V�l�H���u�L���z����$-C��aU������?�f�t��M��G�(s�-/}c����W�X��e��}����4�~\�lO��k�=��`{����b_������v�g]z��A^jKm*�@���m���v����ZU+�����.�O������ued����e�����������=��?�v5����,�f6�U_f��<�B����d�`�,��.������-��sNh����������K[w���.�$�k���2�����S�p�������2e����Q`�.H��7�g<I�)����e��Z�L�ze�y����n���&w���e�z���;_�.����x��V�LZ������s���+���4w���Z/o����vX�2���4��8�,H����5����g��>��
Z�J����Z�����T���\v�`�U.����y���K{H<�U��>P���\����L����V���(��B��/�����]���g��Ce*����(H�����FM���e����;���u'6>�{�������-f���j��cI���o?�>��SJ�h������07-.y�S���I��]6�g���&��:�]�b�f�� � � � � � � � � ��9��y�G@�,[k��w�Q�g|�����+OM���Y#�����.>���������M����-u��/]=�|����� ��s[0D��&n��R�l��Q�������6���
A
��������/|�����n���o���]�
G������Id]��S��������3��kZ7QsY�N�po|;*������R��o�n��1h����df/N���id���&�k���&Uwj���&��2����d��Y�.��QYz2���vMl�����$e+��r��[��e�=�����%�%��Q�����;W����\}�Pv�/��j
�+Y��mq���@F?�"�&��u���U,�Lp
"	��[Ab
���_)xs��E�KEcG5�S�p![��g/^r���&��r��=�����!���_f���?�X�Hr������?U�qc���v�����������������V�}�)v��=�f����~��k��)�8��)�[������~���}�����V��#�V�������b4/n3��Qp����6
��UT���Yz��uL�0~�Q�m3�LY�Tw�@������s)�n^KR��9���k�4��s��+kV��~�5����|���7#���Kk�v�_�e��uA�zF���GZ�r�R�a{@@@@@@@@@@ �������L^V��w;_�M��.��*D���e�����!��`���`���O;�`I�DC�2i�#���l���K�N
*�����Eu�w��-����L.������5�"��&x+hd����hM�~���LI��j��X���"6o��DgK����������:a��@���d��%��p��3|*���^ju�W
�)�����l�����f���������,�^���DE�c
��2��r�~�'7u<�����)M}9�n�DMG�������
�fK��$7T��+w��n�W���� ���:�Z5��d�9���.������F�Z��RAq��O����ie�kV	���j�@RD?K��'4�go��F�'<��o��M/��
�R����]��g��X�gf����������������:��z<7�lz_���PE�":pI����^�I�*y�B����/����o��E.�i\�����,C@@@@@@@@@����r��(C��)�h7U�����`���ZM�W��AJY����\�?�P�.jb���W������a�
���l����2P(S�����A�K������F4	��A���)K@��ip���l��\��NkR��6���D���$��������e8y=x4�_�4Y%�3���[Aq�\&��'����m���V�e�P��6�7e!R���.�M*EYvF���/����Fvn�I�����:��o����e���^���2q(��1u���U��R�x���.�&��8a�t�j�fS���E{�du]���.���f�r��
�S���0�F����Y��u
��W� gY���2�w�E6l�<�qm�$�`~f�R��kQ�����w�&[F�6���t��Oi����>�$����v��M�m>���?�P���k��'����e�
��R���|Lm����l`�Y�����r�9��ugg����r�(X�|��.[`E@Y��l~�{���V���������M�&������[����������4�������x��LG��c
�K�,^����5�����dwIj�.H���&���S]����})yq,I�xNp�=U+���ie��0g��^���D�lKz_���x��V�a���C�g���M]����@��%�Z%�x�{�q�Z�xAA@@@@@@@@@��!W����O��0����uP������h�w���!��>q�e�}3��@�yw_��Z���
.�����g�m���f��K��j�-Z�7�K��O��%~��A@@@@@@@@@@ �
����a!�@
�p��~r����7.��	�)�v��.K����n��7�i�Z��2=3z)����q�n�x|x�M[�g{i@@@@@@@@@@��(@�R^<+�	��L�k�1�s�n�����)��gG@w@�������qN[Q���;��KWmoS�b��g@@@@@@@@@@���K���rLd����{������^�f��=#��}�#������T���@���#�d�D�b�C�d��������
��82��,E@@@@@@@@@@ �������C�,��<��X��El��m��+�+e=����.��-R �7�}�����G�3�Z�?�*�-e�
�-�w���������q{x�5��{�/�bE
��� � � � � � � � � � ����K9�MS�/u��/��T�T����<�up�t�X���u.������	s'u8����4�{.<�|Nj6B@@@@@@@@@@ �	����(��@6L����`������.d5*gm���+�k%������}���������?������K]�%��U���ZU+X�#j�����������@@@@@@@@@@rQ���\��i@@@@@@@@@@@@��@��|p � � � � � � � � � � � ����K�gO� � � � � � � � � � � � ��k�������@@@@@@@@@@@@�=��r���@@@@@@@@@@@@��/�����!� � � � � � � � � � � � �{/��=-#� � � � � � � � � � � � ��^�����C@@@@@@@@@@@@ �^�={ZF@@@@@@@@@@@@ _���O/� � � � � � � � � � � � �@�	��{��� � � � � � � � � � � � �@� x)_�^@@@@@@@@@@@@�� x)��i@@@@@@@@@@@@�|-@�R�>� � � � � � � � � � � � ��'@�R���2 � � � � � � � � � � � ��Z���|}z98@@@@@@@@@@@@rO������e@@@@P�cA IDAT@@@@@@@@���K���rp � � � � � � � � � � � ���@��k��@@@���v������	���`(`
���
eI}����6�&��U�bl� � � � � � � � ��@��+�n�v � � � �����s���6��VE
��.��@-9a| �����x�9f@@@@@@@@ ;^�N]�F@@8 �����v���.\�
,�#m��Fr�8/wN��@��r��v@@@@@@@@�I����t �]�@@@ Wr*pI�+���r2A�9i���v��z]����!� � � � � � � ��(P8��i@@@�����{r���f�B�����q���<���v]�r�����i�l��I�m�6�^���j��*U�t��p� � � � � � � ���M��lq���w�i
��<_�l���}�Q�_���(Q�*T�`��7�_~�%�o~?��=a�V�������N|���z���V��k���g1r��L��N�	t���s���O�����U`��	���[�n��C�iK��fo��^�����0
@ �@�c��=���m�������>�~�k��2����S��:�?�9$:��/����y���n��~l����>�lk���]{��v���z?���^ ���y��g��������[8}�}�{��/���8���kW�
X� � � � � � �@.
��������M�r���H�"I5�r�J�\�rR��Q�8���l��AV�X1k���,X����k5k��?�
G��/��O>i/����r�-��U"_���6���X��{���gk��q�g�!�������v�������o��������hEK������Nlb
.=�j�:������#�6�����a�r�����:g��[]I���'�h�F��p�����}_K�M�J������Y_������[�Y�J��j����������KJ/�4�~����9l�mX���n
-b���i7M�,�����*
���/V4�.�����8������s�9��[�f��e5k�JW��n���9����o�W_M�^OW�~�@�'������������w�y7�Q|���v��Wy�/Y�3��)S���^���������\�rv�1�����`]tQD���O�fM��k'��|�~���6Kj������Q���~{�����q]e$���������=G �	��?���}����n�<��U�R�=����'�lC��7�|���5�\c5j��{�E=:��sl���6��j��Y��q5�g/�	o~i~�}F��u�/_�*u��>��5��t�X���+��-vl��}�U���[��b��Z�������}��tz���f���}�f+sH;�����5V����W�r���6��/m����y�j�sg�C������^ie���^]=���ny���b��k���@@@@@@�y)Nv��V��r�!q_�
��.P;v��T�dI���_�lK�F��+VX����Xo�Vwl�7o�&7��2b��Wzg�����J���}�n�:���_�{������?�S�en������[�����v��c���U�,�k�m_���O�m�_�i�p�M|���&����O���lp�W��|��
�
�:���q��k+�8��.:_��hoCx�������=;w��e�m^�Q��%���>h�Ldx��i�}w�C�A��l�����_����].@j��%)�����x?����w�yg?>�����_|ak��I��=z�	�[����E�c�����>_\u�v��7���r�yx��<|r2���x/��nz�����\��o���V�T)���k���~�#={�B����]�����cG���{�i����aC�Z���#G
j��E���^��`��2��o��F���7��U3��.pF����\g�\����eoq�[7?���eS�g��.0)V)Z��U9����\��V����6�s�6���������[<j���{�N����w���
/�i=����
���'��l��t���9�6,\���c���y�{��E�hT�����)u��@@@@@@�|,@��\<��&M���3_`����?�8�;����IA�s��^��}����^���?��;
�j�	\q��1��@��lk,+������9�TN�+e����{m����1��R��������_�^�~�y�-�2��Uce_��2���6_��vv���	j�jV�p����?��x������1�U�Q���c-T&��x.���&GZ�S�Y��%��	3l�{'*SU��Z����UM�e��m�mo��T��-eG]��*�_/upE�����\s�xy���ay^P��,^��Z�8�����^��/�"�N�~��>�f�>��/^<�f���[�Z�n����v�1c��v�-�������^u��G�����^|�>�����O�,Lw�u�W�>����X�����c����4d�y�����dU���ol�����Z�l�^]p����o����Q��u�Hg�Z����E�������}��k��-y�S�io.\h6l�
*x�J���������@(�=�����.���9\}����g��&��J�kY�S�{��7,��V����_��UmV�*7��#}���~Tb��_b��X�l@k�.�
.r����F�I��ez?��R�j%k|U+�2"-�����������y��m�\����<j���Y�LISF�JG���.{����|��C�\x��1��)�f^����U�;�S�*3<l� � � � � � )@�WyH@�[T>��<����+
��+�M�����d����~�R�_�Z�L����J~=��v�t<9}�f7�����_v�f��V�l�Z�����s�D���F�~�R,3-�����Q�SQ���k���������}�~�S�����1�:t}�o�"��������z�[6���)/
y��p�R�+�[�w�"�Jd�����4�����@����}��iS���K����DV�N�?o�}���]{�u�6=`��F�����R�/+X0�$��<��������>'�?��z�mS�� ��y7���[o�b���2$�:w���	��/_>�6Yu������-V�h��f�u����:������S�]��<�3+�7������f���^��c=_�����.+�TN�I�~\:��s����z�K��l�,��#-h8'������
����D��p)�O������W�Z���I�Y�
e���������	��c�����8������OZ����~���'n�~h�/'���or���s�����^C������U�/����j����( � � � � � �Y"����,i�J2+0f�+\��7Qj����V]�'�|���j;��C����=z�������c���e�Z��E�F��_���������n���r�!�����r�\s��&p�(Q����s����l������{�n{���s�������U�T);��������Y��U���^p��ze+9����b���1��]����e�b���B���>>^���eK{����_��U�+����������t���/e�_���~:�Xu�m���^}�Uk���t�A�I���=�?��#�������t�I��#�x��y��H�T~]=��Z��"�[o��;��N���K.��Q����r��A�1W�V�t]�+�n������w��-{���"v��x��Wz��L�b�]v�w^t���W����z�������]���s��>�`�����y���:u��L�D����=b��q����f������W����Q������8�/+���c���/�t-�����C=��#�W�����nM\�9�X�k�J�*�}��A{���M�)Q��&��q�����<�e:J������:u��_�\���(����l��V�H����O��i��&i�a��y������k�0B��d���Kk���w�t5�^~��6j����h���J�*y�5�(�����&�&[t�W4�9 �&M���~h{\��;VIt\���.]�X���=[S-�u�)�xc����cUi&L�[n������]?:>e8���d���>�����+j_�\u�U�6I��n�7�_���_�����
7�`��%��;w�]������RA��^{���|�;���D�*�L_�|�w�\�]����v�}��7��O�n��E�e����.pI+�Z��������,2�����R��=W���^����t���7�O���4��@o�7j������������|�V�Z`��n�_^�n4w����������.�,�����&&t�"�|����lz��M6��������+���J��7��k}�{�����~J�\�4��1/u���?�������>[��u9�����i[�0��=[�l0����J�_���r�S��[�~�.pI�7��"+Ph�������lI��WE�e���6�������������>.��<U�����]}��V�n]�^�{
�3���7�Z����o������L�����p�z���U&;���k��G����z�6l~N���_R��������x�+T����]0�Zc��*=���Vc��p}V��e���^;&F���O�����zl�s�)/�sS�k��S�7�������{���t��������-S�����{�/s��bM���;���������yAV_W��>/��=��s�vz����^Q�{}~I�}{�}������Oz�_A]��W��}p�d�x6r�H�/zF$*������z6����:t�����3F��������=Q��{/���3k}��>����pf���s���n���>��s����l������9��n^�uo�W_}�}W���z��s�/�`��m��{xY��;�v�}���!C�����}��T�z�7n�������K����G�.�y/���������G������}����y���Z*�}�Y��h��c���v�m��_�w�r}��.Y�(�>���w
���[���I�h�����}s�>}��SO�������}�>��R��,E~i��K�.i]�&G�!-��V?(1�����W�KN���h�6���?�5�����/���y��;�2o��K�`oq����O��U�L�������%���/��'�����{��A���>��+�GOq������k��lm�Tik���������;����Y��~);������]�~��I�����O�{��mn��n���u�KZq��������Q�egz��)�>���������\��
�
+���v
h��@F�����L��@@@@@��n2%��w�2�^��W�-�@o7)"�&D��z������!���d��s)!7�?��Bn����M������nr���M�����i��!�rH�unrf�M	�I���nbR�M
����6]0G���p���>����&}��5kr�6B.P�[�BnrS��]������K��M�	��A�z�k��N8!��U���h�-s5Bn�z�~.�'�&�x��d���xr���k�^nz���-p�B.X���Mh�IT����T�2��&zD�~�}���DP�D�h���M7������z���'��Mf��!7��;/���� H���>�n�V�M������o��������m.����6�u����7b?��n�W�g�����s�{�M�
�	^]:����ks�����C��M�����=�}�	��r�)��.p���s�_���w^�<k��`�m��Y����?�������W�Y�h��&{������&tx�����Mx��[�e��O<��co�����'�rAU�z�����u�	o!7���N������K�4~�I�����"���t�:��1�?���{.��Zp���z�h?���D�m��/�8b?���sAp1��B7A��F��kV�M@���m�6�~.��k�oS���/���\L������M���G��qEn/�)n\�Mz���7�^�������s��;.7	2<��z�8�k�M��l^]o��f������!z���q�������Y��S�R7����E��j�R��o������1��������xc��������8�g���
�4�j�� ��0��x�J��������K��M6�������r�U�n�//~z��z��w��n}�{v�
�����~=��x��1���jm���nM���E�����n��F���p���������k�M�
u�}v�:4

��.�����U:������	
{���u��j�U3��YG����7pg�10�~�����-�v]�V�U�y��p_��yb����0������3j,�u�&�{c��,�2=�4��R^y��>��q�:���_��]�P�*�����O?�r����4��}����%���@#�>7�5]��n����������T/4���/�Y��#���cG�:�]�������X��c���;B������
�~�k����{���~C��7�Y�������9b�#�8�����o��'S�������]`L�k�w��u�f���'{��Z�x������
���}�|�Z�&���s��cn��lg���	���6��o������������{�W4�}��F�=����{���v]��U��$:�.��{O�����S��� ���!��AN�g#F������9��<�}����.����6��s��_��3��c�������5�5%��������n(V����9�Ix�E�M5������>���5+]5���g��o���_������H��w���03�;�v�Y�G���L�m���G@�}M���~��.�{�]���_��Sd��X��������V����Fc���>���v�f��o�1��N���n�o3��.��kCc��k��.��(�>����w
�����h
���X�_z���O����"�<X�ti�&"���xW����o�$��6\������u����C�
��d�2��~��K����{�^������>3�-1)����S���||��	�s�S������5��y��_B:�x���3������KL��8<�8���	o3����U��rp�s�s�"�
�I�AP@@@@@@�N@��M�A��/i"�?�������� ���ncE�_M��'�k�et��C�&Wk�Op����dsM���
M���&�(�A}��$��'�z"�?I[��~i4����4	^�k"R�$�x�K���3���M,s���>hr��t���&m�_�X7g���G}�,�jSX����^r���\�`�I�:��3g���e+���$���}9�:�� ���D���{����>�#X��\�<�=�%V���2�x�h��_2
^��"�h������)h��3����u]4AE�4��T�6�O|Z��6D���o�Z�k@;����^2	�#�@�i\�.��yC��������3��)`��_D��o����� �`��'?CAb��e���@�D���_�`2����?)����xi�9}�Q�^�5��M�~���C.CWD���j_��E�)�L�M
�6�W�����,�
4�j{_t�V��������uK�����sN�eZ�����-x��1��e���w�r�\��������d�d����Z]���:���C
�
? G����w�5�1Z��e_��R�_��������k���E�
Ml�u�2)E����\��h���-[��e�e���h�k��D��i���1����Bun����	XOl�M�y����)��������O��*MD�s���7��^7��^�{�������L�P���i����>nsC�eD
���3�m����_���=�fx�^W<�-�_�
U#������11���/

���rz_�X�eO
��z��?y��"�{�k�SM IDATir������w��������g����u�oMP�'�ir��^CB�~����C���_����>-[6yV���N�>��t\����O
�v�������U��J��P����������)�:�aF�Sm��{w�~������56k�&��Rp����,�[�������%;���]��z��g���2z�O�/��?M���Q�X\F)o������&NE�X���,����T<���z<���2�e��+�$��K���=�>3���3F���/�'�`���u��?�1�}f�T^R�L�3v\��?���s��������������A�
,~��
/�Z�S\v�tCD���U�?V�i�&�=���N�����95��K���Y�]����]��s�>{�{�`��^��l�����1Nwr�d��������n(Q��]�>�����u��SiL��7}����:�s��"z���[�
)�B�<V0Lf?w�	}.�w�~���~���sA?(�~�Lq����X2��������:&}����k��������y-��J��}�s���jW�3�o���f��}3�y/�>�}����^0n��<��.���u�z�T�~��1�x���j7�Y���CK���a�X��3g0p��;{����i\��;�nR0��-i�{��E�~
=]�yx��������O�����C/tZh��=�f�/Z�}�
~�����m]��p/���'�6�9���Ox�����w]^����B�:Uy���l�~�����������6��>�-�0#��D���t�s���b������t�K�6Iy��������c"�����Ly��q�?]@���z�&��Uh���B+gD~��r��� � � � � ��/���������OD���X/��dt�����	HA�K���_�L����_E�.�(V Nt@��}������_V�.��vD���?Em���cMt��&m��8,�����}o{M��U4�@�d����gb>��'��.]�x}�D�x�A�m��%��k�Rt}����k]���b���S�9�?�g��\�x��k�:O�	o~_�	��LZ�_�2/��W\qEL����U�������&�������
~J�$;YKu+P&VY�dI8K�����p������5��I�n�-��,�'j�u(H�����j���=���l�{Ec�����D���H��=Y[j��������������X�8��{AA,(*��{�k{��"XP�Z���\DA�7�V,�
6l��( ���w�Y��I6��=���������d2�%��,������p���
�K�{����
��g�J��,����m���UR��]�E�g�?6�kv�\��a���F��������/���2���;��{D����A��e+��4�K��/��~��UA��@N:�$w����~��f�
�~�2?6��K���9�>����sa��9b��Q>~�Y<��J+.�������g�?/WP������!O��sS������/J~�/(�)��{F��y�����5x������xx��%lD�NM���M���Sz��A�Rb�W���*_����9E���������H
��g������)�����p��S^zG��zkV�l�O����O����v�R��_��d�H���
�Lq�����>���S��E���?SI�L�
���;����WuQ�Wf
;���Mr�+�{s������G�YZ��3f~�
�I����qz����=���������K��3������}���
�Gm���$U3/)x)������amad������v�X���L�=>3�R����zO�*��Yi����E3��%`���G�������g���E}��9I{8�oC���_�a�D��fw��=p��bE��F�4cQP��Z�v_�`�iw��W������:�-����T�g�8�C��Lk��l�)�f�A�'3x�4�}h�%���R�R���$�@I�\�����_���/���;�,�!o&E�o��U����@���o�A:�5cl�@
8�L���)�vz��'��N�Q�-3�NK�Z1����9��Ty_�}5s�����%
�����k�lM�X�L��B�9�pz���q�
)~L����NL�QQqR���/�.~�������=OK�;�����5�c����a9s

X��VM?d�n��G�
�@@@@@X�*{��GZI��O7o����7�i�Zy3���a^�v;������z��e^�i�:��Sb�l����������Y��-.Of�:��EZ�u&�\m�h��u�v�� ����(���7nl�h�n���#0O�B�c�[t�i�e�r����7z����Tot|����%p�\�u����;/A���-�qyATAY��,���:`�[��_����|��-Z�~������Wbw>��[��������l�pW�l���R�:���xAA�����~������D��&�x�a�T��:��TF��`w���8���f�1��I`�a����?��<�/i��h��u�J�~��'��(e�h��������F�\i��q%�k�q�g^g��t���G�%2,�:���^���Z/h��u���{�^Jl5z�h��l�w4/������=��5�����������ol^��y/�x�,���o�.��	&�{��/�30���uR\���oz�N�����C�f�0��b�=:��\��Z�\������^��6��WP�?g���(���~������^���,��
�i����~���^W��]/;�*U)zN�q�������b�nK�|��b�+��������5iS������Ml��:�����m���q�?�L����`�[��LU�]3��9�����S�t���x����e�T�ul�������h5���m�y'�q+-]�����K���+*W��+W
��d�"{������f^@Ph��+>:���x�eo��f���]�nj��������M��1[g�v������_k;_t�U�U���1~��q��������==S����\���Q�������Q������M����������y��au9��S]�Lq%��w��;t����7#��9��y��st���xA����6��ne�����;�����g��C���Y��
���e�}�>����:���\�gj���~q���-��(��J�������f��I%����"�=^��*Q����V�f���vBE����p���TN���l��Y�>k'5�S��yrm����
����5o�
���������������=O�9\m���
����2�f!Ke)M�#}?^@��<$IA������Y,��P>?��`+��/p*�0�y�f�\���>��0�3P�:��o
qU����g��oVJ�~�m����j���-��!���e��6��������O�~�Y�����-�'�vy����m�#R���'R����}�����
lO�]��T�*5J���/�����`K�Z�6�����*{���������n��Z���)���������b����{��k��*ovb�f��y��6/x�~�~x���6c���<�m�{���#�����\�����D�j���?{����n_=�z�a�@@@@@@ D ���!��8������(r�X�/c��u����s����.���Q�#����\~u�W�%���>���b�r���:�#(�:B)�Fi�7CQf���:t0of���OB���P�%o�b6lX�6�<�����+�4oZ�����:���P��B�z3��w;��shV�y#���i�\������7��$�:�\�.
������}.�R������{���#��e6b���@�\�P��7j�)�0�zm���3�:��3�,��)���R���C�n���y3��H��e�p�`Fo���m�qI��>�����2Wd;���E��V0�7���Q�?����7o���"���S���:�E9h�������;��c��+e������Q�u:�f�+`������R�{�����.��xl�,>v�dc�;w.�,�oj�M�Va��t������)N�.����\��7{��o�-�������v�u�����w#c���5�M��vM+M)���gC��Tt8[o�u��R/��j���3+��I�����������7��-[����0�&���&z�}�k���Mxg�wz��6L����`��Fs�}��~�_��m�y�����{��>����N����W���A�����^t�������e��v>��[6��?�q�}����v��m�O����o��:��������c����`_����W����Y��\Py��}��k��W�,��6�����J��Ae(p����*T�;��u�����m�d�����t����Jn�\rj�����/��������W�&=���$�Y��_5unV�����2�_���{_�{��s�o��������������'?x7�Y�a����O����l�=�p��=z�pve��Oz���V��9?o6!���b�7�B���J<��R��wU3^�X��y?/��i{�{V���%=�I~�l��8�T�<�������oo&W��A)�s��f�7��^�2?��/O����)�D�����gA��L����w=k+(O���<!�L-��?f���g�C�������a������������5�\3�9����}�<�9�����/�_���\�0�7���;�}h�����:���|/����g�l�C��L�y@�
���`����Z��#���#l�q�G}�UFf{/i�����8��s6��~�S�����h���k5n`�����=��������4��������#/��������xm�~�����kw)�l\��{T�6��^�V��U��`0�v������z���5��S���'�*I�����E4�����O������4-�����y����H�k��]�t���m�#��[u�'�t������{�R�5�-��d�wz�1d[�����m�|6�e�����vuf:�������[�V-��:��f���������?���3�~�:�?=}j�5�is��@@@@@@b	�?+��*N&u~P@G��m��K����/��:(�G��i@����;�mW�N������w�����U&��D:NuZR�3�s��f|y���M�ao���M�8�uTP�M�t�Q\�$���b�Q��%�)xI�0_���:��H7�sP�]��s9��P��'M�d�~�����4[��g����@�������q�-�������KA,_|qjw�Pw�M7���zh�j��/I������J#�F�\�	Q�����%u���_'u
��V����������_:O�?�|�������:w�S�+���UY���/��:Yj��8�?�8��vO��>�.�y����+'s�F�������=��#n��~������V�iz�G�������s�_����:c��+[J��`�{�R6�\�G����������e��uM����s��u�Y��#�l?�6���9���L`�h�����m�'���?^1C��YE!�_��@T)}��Z4
�e��k���c�ae���/�+�Y����M���N{[��U����s��<�L���o��m#���/Yj5�N[G=w���ec�{u�S%�N�n�]"0i}��\���O^����~���5l��+s���u���n��f5j���H�#sI��������.��t�Anv
�*II�z�R`k������]'��.�����R�f�����m�m����x��r����{s.��:%k�<u4~��'Ch��\���8��t���/����-���;��_��k<�����|]W~����VP��������$����R3�^}���3��$��u�R������_�ky����4�7��J�
���[��np/
|��{���U|����LjU�8����4�
��)��	=��=���&�>�w��&I���RV�a^��s�K���g����|���5,O��@*'i�Kkvq��9N���m�j�M�9�N��n|��)������Nz�^�R�Zj�	���_����,�=8��+�]�z�������7(x)���}n>��ym��>`���Wu��T{��L��
^Zs��a�A�5��������'���N:������WZ�Y�6=t�b�(pM�D7�~s�k�#�y��7/�c�M�� � � � � � O�r�l��H
��;P}���n�����������T�`�A������WT�u�)��mDzd���n����a���v�A�������N�
`R��f�����]�:��IY�O��Ky��@O�&�>����\g�s�uv>�m����1j��A��Ov�La&��u��:Z��[31����7���]#������v��z�������W��>��;�?�m�Y������6�uf�zU��N�N�:����s�u�t����A���=��cntqp��<`�������G���EH�����������-*��/�����P��{B�{�_n�yK���E7��F;���KM�����v�9??HG��_Q��������r����%�<�.���k��|��lI�G�C����Q���G��v��4;��Q�b�����������e9x,_�"�g��i,�Fy�[�\��������<K>u�*��>���i�%��t�#�c��F������ [k�Ms*�F=/8�r%�M-oTr�j��^7�x��AkAy�.��=8s��P��(�}hF���L8�>���~����&%���<F�+M]p�����������AC�;�8�<z�hl�����$4�biSi���w�YfW��9�>Q�O?�(��������_�;y3��n���X_�0!�A���"(Um�������i�����,����J�[�g���oz{!�s���4��3�<cm��q��={�4��r�w�`q����~���ea����X�D��w�X����
��S3o��93���eI��*�4������4�a�"�oCAU��yBe���&��$i�#�8��������u��h��3]��s>~����<�\������
�K�eI�3n�~>
��e��v���Z�5�f��,LS�x�e)�v�����m�����w�~'�9?<o���;f�`;e�v��/����&���y��Z�z:m������}��g�p�����^8{TT�He�N���%mkG��� � � � � � ���*��Kvf5��'�;�07��	'�`�NY������:{��7MA����e�\��Qoe1�x�7o�{�Ut��L�,�U��M��?�p�`$��b�m�5�d����_�:dj���>8[�h�ziF�=[��YH�6
��!��2V��\�\��~���R�����&_��/��SNq�4k�5�\����8@X����S�N6f��������w��h6����
,�@�$��G/W`�>��lE�������7����5CMX�I�k4�+�p��!v�i��(F��aI�4���#���ow�\�9J���M��ur
A�/'���\t�lr�����{H%�i��+���.�����4�:������q�($�������S��m��OzM��[�g����I����9a����7�>��o�l_�Y�q�g���]{�E=8�6?z��U��GiF'�y����
���6i�:��6��Cx��yi�4"sEHu�����w����=��=vpo��{G�8��m�q���a
�ons�}oq��?��j�k�('=8�z��%�'YPV�`���������{���z�.�T���G��
��@
��lJJ����<�@^��t���c<�}��}��O������Ym�~}/p/L�2%���.[�������v�7������0/�#(m�]�~���AA������x����W�e����)[{��LoW���]��o���;w
�����\��l�fV�si�vyY����f=��7���W��u����$��4t����'O�{{/��5�,��������z�m��m=g��E��
,i�#���^(�g���+�g�����8_a��ty�:��*i}�{���nc;�����?�k�m7;����k�ni=��'��j��I���J������M�h]���m���<��� IDATE���^;��v��D���Gz�}��D��V���_�(p��qi��9�@@@@@@�UL���
��j$au�P������A�� �~8/���{{��g�����`��D� a���^s�4�}��w67n\��Y��?�8s����|�>N�������=h����J��N�R�H�8�q��v2;�����}�s�2[�je{���)pJ#L?���.0�K�.����T�>'
��|��MA�-r��~�m��J���E�:U�����y���C*��?�0t{uF�>}��Ft��)�����g�P'F�'u�
\R��Y��N��w�uW��9/�����x�
S�����������{��?�"2��A����O>Y1�mX���
�Q��?{�F����h���:����A��u���gqS����-�M�x�����\���fPR dX�����V������Z��Yw�`��Vt�n�G9O�6��+�&V��G~Z�t�����2)��EA��<�f�e�����O��+��3����Y��n��1���WO�f�T4�R��M��W�&\�g����u�_�DZ�<�\�jx��Y��U�R����7�I���O�8qb�{O.�`�*�'i�����l�/%>����E~�o+i�A}�����x���j��Q�F��4������O����Y�'�\t��8���d|��'���zj�7s�����f���6J��^����8�{���]v�u�������\W���jC)��+K����X�0��1������L27�pC����z��~���<��
�K�P�c}gi@m����N�4����]�c�w�S�c��Q�4pB�v��<��];�?3}��������PJ��$i�#l��K��u.��Y,���'�L��g�e{�k����;�|.OZ����!�������~����!H�v���6�o_}kf����v��W&�Y�b�bm��Y�cm��6�c�T�o��^8��i�`V��V�Z�i�Z�g���U���C���O�q���W�@�z�,���$�.m������K��}���VW�#� � � � � ����Kt�x�7�:��#�F>|��pu��[������:U��U��Nw�}w`�y��]���IGu��v�-��N%�H�Y)ng�c�9�����[��/AI�N�s����a��,9/���V���N�*[����\��\�������
�9r��[���3�u�]�����FONR��G����lu��LJ
���3\��i6�i��f�G��;�P����G�����.�<R�gB�M�G��Z�	]{z�L}��7���{����jAI���P���g��,�������;B�k���������>�eA���;���~4"~���:��l~'��m4�W�`���e���>(�������<��<? @������*zz���LD��2�r��2��������Xj���i�d���i��>k��?�+z��:��������������9sS�k5n��{������d,hw|��������]��g���M9���Z��mr�^QE�e�g����D�V3A�����~�Y<����&����F��u�JO_�~��F�^��ok���v�k�,��]X��[��s�=���1�x�d�SW�^��ew�:���w=n����m�i{K~���G}�������z��{O�s������?Kf��������������t�I�M�g-��|��K���gf�#�z�)�
z��t���d��}���O����<��7+��y����c_��5+�QGmK�.��C�qX����6YQ�����cA��
r������s�l9,Lz]eVM�x�%������,�s��=�<�Y������������4��f�J��
Z�uY�
R�����"k�+��8��;�J��������g���_��o�=O(�flJ�eZ�E�+�MX�vG�~2���{!�\���X�1D��L�m�6�v�m�V�y�����]��3��[�}V$��I��2~k���bgU�u�������n����������_1��P�����3�
l+����m.�f�p���;4@���o/�o�+��Z�q�T��Sr^���=��?�X�{m��8\=����>7���Y�$�8�<-�|�{������������U=[T3�>r�����E������4�wd��|��}�z�`ko��`*xI�Y��G���4`Y���#+@@@@@@@` x�@N�w�}g�z�r���s�=ni�M7�����
7�q�g5�O[m���S��GwU�h;u�ZYI�4R�e�]V�C�:��3�FMVG��'�|���cV'Tu����C�D�`�Q��S�~�,hth��wL�,q���o�T���v�Z, @��]w������Sd�<�8�����[�bu�?�)�H���S�x�R�����C9�u|����+�����d�f{Rz������~KRD�m4������t�/�A����*�W��3S�)�����N��rM����D����:����>��I3�����uhV`���g�����wo��/I�]�3���~�t��)S�������Z�a�b%G?�I��\�f��Ly��h�}T|���� )����|&�"�����E�����r�.����g��-���}��K.q��~��eW^y�[�kAL��*�L���1y)i'�4���D�:�A)����_���o.��������������3g�5�\S"`��3�t����D�|����8��s����se.�l�8{�sO��i'{d�^��97������;����������zUjT�z����R:^W�]�N\��r���J����l��O�r�ms��8�O�Cl�mok���[����l����3������>{������w��2u���u.�TT���&�S�\a{����^���1��{�����f_���P}W�#���w��[quh�3���i��Nv�p�Gz����F����N��������n{��;m�Q������j4���myRQP���S�l�>1�s��&��D��_�y�>�k�h5����v�]6���_���b��I�>j����M��~�"|R������=�(8s��?���O�	����c�c�������K�\rjj��?��O�|�g/%�{������9L���a�����m��T��������?������W�n>����
��w���>(P\��
���@��h�R�S��������{�����ua��8��������Y����7/��O��O-��������v���k7�`�U�8�H��8��[5-$�\�.�����A>�@7s���3��D{�<�{|����k3���V���g��k�bY�����<��$[U�^W�e�=�Y��|�'��;�<L���,�s��VS{5l�������L�����L��A[�~�5��'�]Wc���|�����w�*40��5[qY�$�Qu�����>j}����������jC����\}�4�����@�;(�w ����O{��M
&V�����O�K���C���~/��R�/�!3���X�>�|�3�H��o_�V��g���� �N8�2~��v,q�%�sY���������f�
�������<���;�&{�(R������	j��:����������2��GN�;�8�+�� j/O�����1{m������Yf���P����o|����Gj�i��g{\m�����xn�`����4�o�Gm`�m���o|�Z�G�u-��e��a��<��+\=�������3E�]����'�����g����u�z����1^�N����m������:�|����XqamP�f��~=�A5�u�kym�?��)�M��u5��/�O��v=���Ngu����%��y�
d����
��5��r�}���Y�4�x�l�q�� � � � � ��.���X]D��8;t���Z�x���M��*�|������{��:7�3�f��L+�D����Xy�]w]�f�m\u�T0��^�e�}e$����v������M6��ul���O\�=u�����'�#����ARv:^����Zk�:�h�u� ���U�:�_{���sQ��m]'~u,�8�MT���$�A�������3$|��nF(uQ��|��z��\k�!u�������t��D�2
J�>��>���cu��e������L�=uS�\�d�kR/�r���V0���'������V6�h#S��:����?�o�r�������8����0�>�	J3�{�1��Fu�NRaee.WY
b�p�
�gI#+���o�f�Pp`��A���{��;� �{�:v)�E����.�(s������������d
"�2���/���������o��H�w��i�]�Y�����
N�5�x��6k�,w�r�-��n�5�tu��tm���3��c�W�+h*XF�E�7����S�Cu��;���+]�l���<�_��s�{������LA{
������������N���
%/���>+
�O�>n���g����iA��Xf��~�����_]����������������}#=���6��m��s���g�}����0fw���y����+3�hX�~`������Vm{f7[��\�|�R�p�h��L�w�PlQ��������G�u����L�(��)��/s[�}�u��fN��������^J[u?�XPOX��u�3�z�6���������{��;Jd��;./�g������^A��v����]k���V_�&���-G?)x)}f)keK���i:�J�3e-����y�nTN�������_s���|6�������������8��~���^��w�����{�N���=z��A2�.
���AD�
��I�&����R�����}g.�G]p��P�A����g&=?�>���������G����Y�����Yp��|O��d�)�{�:-�g�����������1cm�,�%���~�^pE�a������q���m��7[������=��~� ���������������g�^��*�|e.�z�a��.3��H�.�?��
��3���Oz]���gl�����D�_=��Y1�]Y��v=/���}���/����G��� U���4i��Y^�3�K�5��/���{��o���#�P[E�,�d\������zN�w�~��v�A�d
R��z�c�HbUl����2��O��P�2������,���tn������O��-]�%�;O��7)=C��#j�m��kU#d�����r����{�ok�7��4���� *�A�,����%�g:�B�=�P���z:>���Q�Y�^�kA����E�e��o��O�>i�����$���6�	��
6����kG={k�@��x�oF�����v�GL����M�o���;��i��ovHo���&~�^�)3Pg�C������������������&m��v�u���q�k�i����=����n�&��j�Y��L��y���_pK`�5�������v+#=SXt�����WW��z�3��	��[����Y�+~����>�B`v
��������+	QF}��[�w8��H � � � � � ���yi%^�t���a/�?�n��v`��8���U}u�V�gu����'u ��k$t0���:7�����4"��M�WVRufPGr���^�����sI����o��<�{�� $u�����9��:��H�:���^p��5��;�p3���V/�A�:����)�AA������lV^���8��x���P���A�b+�@�Y8��������w��!?�Z�<�P�f}�tN�����9
PP���:+�s��n��N�;�����>�k$_I��4��F�V��:U�:��R�j�\p�9�N�������p�p�B7:���\�_P�=H�����H���Q��r������|(0D�2:~�N�{�:Z_��n�w�GG��"�Z�u�%�A���n����.�H�������^�,oAv�]�#}��C�K������~�{�:����II�G����L�^�S�Y���N�#��Z4u��q����)}��qX��!���r��R�TE)0U�5����r�_���}*�L��3���O�x���@u>TPhP��>�N��t}�Xt^��Q�a�#���"����o��?�Z����o������:r�i��Z���v��t���h�����w��4;e���m�#l�6�[��u�R�*��Ikw�:�{��?�d����g����u��k��^���n�u[g�-m������)F����m����:�U�^�T����m���
�:��G���g[��7w�UY:������{u�u���U��1�����v�w���u+k���;z5���mz�^v�C��'�c
�[�X����i�\|���t���������O9��������m�_qz��%�@T��w��l�N�Y�����\
�_��y3C�����u��r�K��S������-�[��
Z>|��7.��qP���}O�+�[�)�����uI�D���yy�|�E�x��7�YK�iskFT=�#�^:~u�V�~f�?����M�8�����Wh�f]�A�f����~u3V�+*���x��]Gt��YC��{y������6��{"���Q(��^W��)pA�@��*�I�y�-��A��%�]���]�w��I�!z��K�e�z�v�~oP;H���g���7u������s����w��	��C���S���Y�
��w����t��:���#�qT}�~G��m}������u�T��~W��.:jg*PR�K��l��j����AK����MA����6o�vG�1i}i�����P�����C�����g����|��U.��f����s�>z�QP����;��U�����Gheb�HZ����!f���M�-�����;�h��T{Vm���j���F]v����������Z�}�W`�M���'�����S����]������}���7X���f`O���W�a��6�����n���FmL����z�u���b�Y�VM;v���v�if$��v�F^�v+k�1`H6�=��i'�5�6?f?w������5��W�i�������Y�����u��h�fG�oUjVw��:�h{�t����T`����MR���oj���g�g��ky�5�|���z���I����5����,�� � � � � � ���,P������GB���q_��(q���{����V���U_���8�
v��+
^P'��L
�Rp�k�IE�,��[+�D����{��.E���v���"�B@J%�Y���N���T���|$u\V@������Qn�����%���Qp^u�#���V���b�~���R��fHVp�
�~(�|��y.�Gm:Q) ^3?'I����<����B�f��n�
$��5 � � � � � � ���@�
��
s��@E
$:t��	��x5J��6�xc�����h�~�����4Z�:����.��|�MYU�r@@�2�s�f+�,�
\���
P����U�r�29_�
]��V��^��oY{��_��v=����l��F�r�V��X��V5���{���kJI�j����<����UmyE��eUs�x@@@@@@@*��K��P3V{�)S���1c�N�:v�q�����_~����Zk�FK���M�>�����$@@�P�4p�@W�3�8#o�~���\Y=z��[��VPU/������gyc��V��]Y��Y3����%�$�v]����z?+O��um�_@@@@@@@(_������!�@L���g��'�l���s���
��2?�6�|sW�[o�ec��
,t���v�QG��3�}�������c! � P����gO7C��;�l�:u�[�>�h���2�V�r,�j��`�V��*G��]��qdeV���j���5o��t����-Y�����y���+���~����k�sL�<q�����4�s�� � � � � � � ��/P���#@�UE`�����wo�Z�����{�p�B����]|���~��l���������;���u����M�W����?���g1E IDAT�+����l��e��V[��Q����T��@@���K����nk�����S����5jdw�}7Ve P�re�T���X���U���+W�)4���he��qE;���OE��43�����k��6`�2d���)�����rA�}��kOjf�Gy�Yrs�h0��� � � � � � � � )@�R$@������_���sm�����?���]�V���B��\}�����{��a�l��I�����Q����c�����u��Cq��^�T � P�~��W���O\�:��yg�
7���.��)��F�j��[�tY^��J��V�J����������4�c5��B��4��|`��v����+�����`��5kZ�f��c����sg;������0���-@@@@@@@@ \��r/��f
 � � � � � � � � � � � � �L��B��� � � � � � � � � � � � �D��j@@@@@@@@@@@@H&@�R27�B@@@@@@@@@@@@���"�X� � � � � � � � � � � � ��^J��V � � � � � � � � � � � � !@�R�@@@@@@@@@@@@@ ��K���
@@@@@@@@@@@@"^�b5 � � � � � � � � � � � �$ x)�[!� � � � � � � � � � � � �@��K@�F@@@@@@@@@@@@�d/%sc+@@@@@@@@@@@@� x)�� � � � � � � � � � � � � �L���dnl� � � � � � � � � � � � �/E�@@@@@@@@@@@@�	�����@@@@@@@@@@@@@ B��� V#� � � � � � � � � � � � �@2����� � � � � � � � � � � � �D��j@@@@@@@@@@@@H&@�R27�B@@@@@@@@@@@@���"�X� � � � � � � � � � � � ��^J��V � � � � � � � � � � � � !@�R�@@@@@@@@@@@@@ ��K���
@@@@@@@@@@@@"^�b5 � � � � � � � � � � � �$ x)�[!� � � � � � � � � � � � �@��K@�F@@@@@@@@@@@@�d/%sc+@@@@@@@@@@@@� x)�� � � � � � � � � � � � � �L���dnl� � � � � � � � � � � � �/E�@@@@@@@@@@@@�	�����@@@@@@@@@@@@@ B�j�zV����e�����?�������,YZ{�H@@@@@@@@@@@@��U�V�Z5kX�Z5�i�FV�2s��^u�)��r/�>������yl�?Y�zum��
�Z�*��S��O5@@@@@@@@@@@@�PM�2���6o�B[�E3�_�vh^V �.@�R9^������i�m�^�L�a9��+@@@@@@@@@@@����E�m��?������H�X�����N��^���f[��k�TN��@@@@@@@@@@@�+P�Fuk�vS���,[�lY~��UR���r:�?�������U�Z����n@@@@@@@@@@@@����U�j��is~�#��S�*'@�R9��?�/��^�	@@@@@@@@@@@(t��
�����aP�r x�����-�f]�RN{c7 � � � � � � � � � � � �@�	��Q��J�� x)J�� � � � � � � � � � � � ���V�bK�.E�H��"��� � � � � � � � � � � � �I^J��6 � � � � � � � � � � � � )@�R$@@@@@@@@@@@@@ ��KI��@@@@@@@@@@@@"^�$" � � � � � � � � � � � �$ x)�� � � � � � � � � � � � � �@��K�Dd@@@@@@@@@@@@@�$/%Qc@@@@@@@@@@@@� x)�� � � � � � � � � � � � � �D���$jl� � � � � � � � � � � � ��/E�@@@@@@@@@@@@���D�m@@@@@@@@@@@@@ R���H"2 � � � � � � � � � � � � �@�����
 � � � � � � � � � � � �D
�ID@@@@@@@@@@@@H"@�R5�A@@@@@@@@@@@@�H��"��� � � � � � � � � � � � �I^J��6 � � � � � � � � � � � � )@�R$@@@@@@@@@@@@@ ��KI��@@@@@@@@@@@@"^�$" � � � � � � � � � � � �$ x)�� � � � � � � � � � � � � �@��K�Dd@@@@@@@@@@@@@�$/%Qc@@@@@@@@@@@@� x)�� � � � � � � � � � � � � �D���$jl� � � � � � � � � � � � ��/E�auX�x�
��.��y_[�Es�W����`}�m�]���K����d���;�j���u���+���9sR�e���O���s�����������{���o���w�����57���5��nc�z��I�&��4(�>�M���.Y��J@@@@@@@@@@@Xu������!O��~����?���Z��;��c��r��5�����x�@�e������cwb��//VcGM�2����N���lk��aUD@@@@@@@@@@@��&@�RE;#��\�����\�R�����7����n����-Zd�|��=���v������N�:��_f�S�n��������K�{��C7�\9x���=����
s�u�������6�|s������v��E�����O��^��ta��v���[�����)����z�����@@@@@@@@@@@V��V��aL?�&O��V>��c��^{�2��Y�v�i'��w���`���B�Y��I����je���-�}�������>}.������ooz����T��<��L5�YV�R����Y�@@@@@@@@@@@@`� xi�:�M��N~�m�������b���d�+��7��U{���3������ � � � � � � � � � � �$��tC�C`U�����a��7��,Y�*R�1��5�^}���[�#�z�����@@@@@@@@@@@H"@�R5�Ye��o��e��Ev�7��e�V�c;�w���Z���;�ec9 � � � � � � � � � � � Pj��JMH�,��~�[��!x��m�����kc��6�P7-X��j����5w��������~�������+V��i�R�[�j����� � � � � � � � � � � ��"@�R.Z�]��T�bc�>eGy�U�T�����|�M��kW[�u�����m���ffZU����:��u��*��q � � � � � � � � � � � �@�Z�D�(W�F���{��+���������k���o��?�lS�L1�\4���^��X[w�u�V�N���/��4h�u}���\z�u�~z���j�*�n����yY� � � � � � � � � � � ��S���|jRVA����v��������~j�n��~�M����p�q6��WB��I�&���rE���-�}7h�"�j��yeY5�F@@@@@@@@@@@��\��j~�>�m���k������j���7�t31z�`�
R�0m��B?�� � � � � � � � � � � �X���
|r�Z����[�"��y��T)j���R[���[�(�M@@@@@@@@@@@@��/e�a-V�Z��B��U
^d�����w���c�=j�/.�c�@@@@@@@@@@@@�b
�T1��*'��?�j���^����}���m�Y��������]Ug��a���2��3g�$�)T� � � � � � � � � � � � %P5*�X����k;��Cl������<�v�y'[g���h�"�6m��s��6����^;Z���r��3't�V��Q�����g�����U���?����Q�FV���Y��t��{�������_g3g��3{�2gU�T��N�j#�x�������k�^�z�ny� � � � � � � � � � � �D
�ID�UY�j�������M����];���{�V����i�<t�Vr����#������L�l�����q�_"�fN�6{�6����.0)=�1�N�R���;|�=����EB@@@@@@@@@@@�)@�R>5)����w_{���m�������_|a�����}�I�&������C�o��j����e�pU/pi��t�	'��^�u�i�,w�-[��v���?�k��a�bX� � � � � � � � � � � ��
TZ����������|im[����(@@@@@@@@@@@X��~9��������.��PG�� � � � � � � � � � � � �(@�R�4�� � � � � � � � � � � � �@!�Tg���S� IDAT:"� � � � � � � � � � � � P�/�I�� � � � � � � � � � � � ���K�p��# � � � � � � � � � � � �(@�R�4�� � � � � � � � � � � � �@!�Tg�:"� � � � � � � � � � � � P�/�I�� � � � � � � � � � � � ���K�p��# � � � � � � � � � � � �(@�R�4�� � � � � � � � � � � � �@!�Tg�:"� � � � � � � � � � � � P�/�I�� � � � � � � � � � � � ���K�p��# � � � � � � � � � � � �(@�R�4�� � � � � � � � � � � � �@!�Tg�:"� � � � � � � � � � � � P�/�I�� � � � � � � � � � � � ���K�p��# � � � � � � � � � � � �(@�R�4�� � � � � � � � � � � � �@!�Tg�:"�@�	<���V�Fu������>V�������_���iug��+��!\�����o��}��GV�f
�v��m�����!Y`�K/��<��}��GFV{��%���h�v��dH&p�9g;s��H � � � � � � � � �Tt��*��~^�����;�SO9��m����������V�^�T��Q�Ff=_���K*o����}���Ry�������/uj��O?�4p;������W`R����[���X�J���+�g���<��W�v�m7�j�n��%��������/N}^6k���/_^����5+�g��'R�?����r}n�����Syn���Y����[����K��Z�w�o�t�����7�|��5��a��|A+��kg��u��?����uWP�2]�������{��=l��7jhM�hl������;�����I���������;��1cF�em���������
�����J9����Y��g�|��+5�>;��S���Y��E�{4}���7��mi2~����������:�W*���)��I�&����o���E�����w�s9����}n�a[����*�z�#@@@@@@@@@�U_����!e+�w���`����I-��g����[�����cF��C94Vm{�Q���k�q��������x����7v�}�����f��yv���u]���:w�/0��P����W����*k^V�^�M�6����bT���B��N��_e�?�\��&�	,�L�H�t��:����s����^f#F�p��nGa��MPDP������[��/4�����N���;v�m���6����v���%9��^�RV`�����c�)e)�6�f�ml���S��2��{bm\�J�b�*����N��m>3���k������>������_zY�*xi@k���^�`���
�"� � � � � � � � � P���T���JW$����=z�=��]��`��~���=�t��c�f3��.\h��sw��V�fM���\�q/����������Z�����V�Z��������7��V�~��a�X��
�sU���O��A�W�/��n��F��S'���_m����})���SO���@Pr����������o��?{�U�5p|#"Mz�%D� � ������D)*6�T�!U�% ��^T@P�PD�i
�"��w�	3���L&�I2���,�{O��wg���u��r!���������W���D��-��������o�.Z���@PP1���U�����D+9�y � � � � � � � � �$��K����w��������|+�G(m���2�AW��R�]�f=$��t���b����7lp=���J�m��	�����_;8VR4pP��!G�O>������
)�v����'�P�BR�����Lz�@�^j���e���3Kd�J9x�@���^�C��&�I'z��%�r��?��"��-7IW9s����SK��������Kd��9	
/Q�{s��HNj��7��$\5p�j�����hatb��J��D�[[��h � � � � � � � � � �<$/%�;��AZi�nlk���K�.Ip�&Q��U�C���EqrT�TI��-+�p�l��8��:|���A�_�'���^!f��W�����{��? �9mURZ�jg���7o�����zu������yrKH�2r�c��i��4��3�H+�K����T���d��Ur��)��U���9H��7�0cu=m?���t��A��L3Hp� ��1����/^�(��f1�M��}u��U*�~}��qw��>���@�[��i�~f����u7h����O�^�9b��$E�f���c�	�Y��r�=�����Nl�\�W_�7���g�V�X!����~�%s&�RSV�X��r�>V��
����y��A�~�K�r�����;w6�y_~���9s��)������v�c�_�������1O��&M�����s���q���������K��`��g���F�~������
���BH�F
e���N�o���W�k��a�����;A�������-ZH�"���9�g�Gk��{��4���5M�l���HE��%����\���u7�s � � � � � � � � �$����W�,B�@X�(:I)44��o�����MD\�W�������'!�T���p���[�������o����F�e�v���o���t�Q#:�]�?��Sj��.o�5\6m�$'N������T���m����kR�|99t���i�������h�\^|���k�I|���A��'�9��5kLSxx�;vL����G���;w����6n����`�m���.���~������'C@+��H�B�M�*��?�3M��P������������
�0����s	\=y����cF9�����Ic��~�h����-[�n�fV��&��l]�v3�ZU|.\���y��s��6����i����=�4�~+t�����2�]16s�L��"
�=>u�������$�/_�Vn�.-]�D7nd���wX��&$��l��K�Ib���cKm}�����T���=�����)S��m���&&iR]�v��x#��?��t������-[��W_����������;u�^�g�5N��B��S������ � � � � � � � � �@r����w�����V��
�yEEE�s���A�eK�+&�*.���e���d�JQ\�u�6�5kV�D���i8h�,XP��;'��
3�R��h�?�TCi���8���y�y(X5��@y��R��Q�e��?����r���r��eY�v��.]�T]y����Le*�DF��^�{��
����V��.3����I%��w�����_L��������d����J8�krl����KW3�>��w��1M�:�/eU�x+y�iG��&��*��C��g�
���%�*���P��[��!y��j�%�����������q�\��{��J�~�/[�i�,Y���e���~�{o��qM�8p��9d��:}F�_����U�7o^SQ���_��~�f�$K�,&$|��X���Vm��T�RY��}z�W���v�&N�7n$t�;~�&)���[	�z��w�E��.�]�O<��L�6]~;p�J�� �<e>'z,s���z�*j}~[���%r�j���g�1����w�q[��i���Acm���l���|/�y�]9v���<u�����K�UK��i�����m]��}r������q�s�I����nW�P�B�;X�hQ{�M�c9�gw5�� � � � � � � � � ��[���x�1���>m����7^�N;�4�o��FN�>-� nM���6�G����nQ���Sg�|4�z�����F����>a�x����}�v�������4���n���0���Zv��-[�I��}���?D�U�W�n=�<�L�����t�������?�*U���z��������U����V�����K�� s����i�gH������>��0k�:%:I�10��#T]r{��do+�N��q�WD�L�`K�������TRK���������$��'OJ��e����c�4c����qk����6�W�9�R5k�4�g���^�j}o��6�^�&���d���hR�&�������7��i2n������S��v��f������'���9s:�����kr�V��J:4�O>����8wn�I�Y�*�TX��?����7��,��V��c?���!C����f�t9��'���'7n4����a�Kf���>��m��G[����F������M����V�
��E�Y#h��&W��g�3�����hb��dV � � � � � � � � �� y�W����]$`KN��%�J�*L�<H^R��={�D�3�����&M�J�z�L��w�}���0@
)��]8y�������G]t*^��d������/�*RU�V�.��:I\m�����b��d�mL\q��/��1��/_f�7���~�?f,�<�\�	q?���l��)�. �"���lp��������Wl���K���?��#K�.�%�����J�<�%�s'��sgb�����^����zE'�9�e%0����c���[7sLS5q��i��e��+������=o�>v,I�q�j�s��
e��-���~�[�n�vX���1;W�\��*[Z���m����gM�k������%�i�V^��j�z�:x�@�S�G@@@@@@@@@ �H^JrrD a�{��������`���-ct�������������W��wO�kj��&KDEE�L��@|����M�mE����x<�����oV����k����S�q�FR�Ha��1��I}�����-*�b\SICko�V��*K�����II���lk��c�65����M��JP�;C@��a�1��������$�
�����3��bB�_�0�{�^Se�w�>R�L�
r����U�ZE>��u��D�07�'��m��Z!w���c�.���~�a�|+qe��)���={�I��d���P��)ZIo����g��X����ZY������hBoS��X\���s2b��R����/o�?}:��{�*��K:���>��<=��J�����P�o)g��yn}��_�.��!� � � � � � � � � ��$/%�>k#�?���>t�Dn��d��x�^����K�{GW�7.~%����y����X��N�:��7o��h�>�\��ZVRGwY�r�\�rE�A�����eK���z�=�V�J���.\�T���%4���3K�[}O�2���+9c����}XXOB�O	t��Y�z�~�O�8�����n����a"��$1�����UO<�����l����<uZf��%%K�����O����^�*�/��k��s���c-��������*����l}�O�N�����=����w[��-���b'S9[_����m����/iE+��`���]9����[�TV�{j���1�v��2�K���.�|��I���>��{����=��w������/��N(P��a�����3�1=��������t @@@@@@@@@H���O�������������z�?�������l�b�
�����#G�i�~N���[�����UMb��_��]W����3����?��h���_����N����������}���j���!C3�'	Q����h]g��!|O�/����,��JZ�I��!���bR�J���YZI�u�6�U�&M������'��s�N8>H��| s�Kr���_�z|��j��w5o�B��[/���7aOts�������kNHBY��-%c���I5K�,6����S4�J��:v��.|�������5sf���x�;����a"M>6l�t��]����6�����r��i)^��l��I�]���[������s��]B>�nq8� � � � � � � � � ��H^�!&S!�3�O���
������B[�h�}�k��I�������r���8���n{��i�%UE�\�r���� yI�g�������C�E��X�C�kB�/��b	l���F���C�M"���3LT����:M'�F���>}������s��E51�$<W���q�~�i�����MxXg��9�WAI�*bU������&��6h`������d���fO��M����V���>V��,��b��~$W�]�����~O����u�|�)S�g����O�&p����s�{�����-{����l~:v�8�.]������Z�>�v���/���y�6}�T�*9�l'��#�!�����&Ek;z�w���$ � � � � � � � � ����K�zg�?8|�����O&��+#�>`|!����-����*:v�d������hLB:Uz��~���8�4)���������.�y�&�%m9��}wX�0s���?�`>�������'�Y�����t�:r�*Xr��u�;�R�JI���M������4t�$��VB��f���9[�3g���OVmZ������kJ���1N�X���{S�:|��K�k�$�.�*��Z)G���9fXXX��������wo3��q�]V���[;}:�Z����p���l������W.;N���S��/z�����hu�%
�g�d��Ng��a���1������}=m�n%KE�\��������w��_~���@@@@@@@@@�?H^���@x,��G�IC�*;��-X���:<^�I�E��QMN�R���"��s��5�9[�j������V��4iR\�|����a���m�V��i"����N��h�o����9���/�n��is_���+�������Br�����5'�/��U5�w�y;^c���?���wC0�2t�t
*fN�t����U��CK�,�l�;����[�u�U�%!���w���J��v���%��J�p56��'��}W�r�D_��w��Q��=+Z!����j	���]��I��JA���s:F������s7l��G�F]�r%�qgl�����e���qz,�����W������%����2�����b�����&M�u���L�����O�V�I�%o��Y/v����_y2]���n�6��l��-�%E@@@@@@@@�����������>�l{�������/�y�O�#E'/ir��"��q���3��"������(���agk$��&�T��J� IDAT�Q�V���Nu�}����k�>C��)���?���7k�T���{�nH����[�o����t���$�N�;%R�����*P�vv3�Z���y�:}����g�����-�~����~�o����O�&`����9�X��R4(��2�����o�/�N��/���t���8��;w���	=�	AZuD[���:���	�G�!>,/�������T�S���]f��-!������u�}_]�D'z���k�nf:���]{�}6�[������~+���M�n���M����y���+��,�0�I
m`�i���#Gx���c��//9s�4�h�`h�Q��GY�d1u��U������+���P�;�ie�
���Z����Fz����U+			1��n�^>�p�m7�����/K�_0}h � � � � � � � � ���K�z���o���%��������[�>��x|��W�&fo�d��=��cn��{��i�<�l�2�}m'K�(!!�jy����u�n��;7<���{�=�lUT�j
���%[�,�'w.)]���Z)�|��9�o��qw���~y�r��
O������B�{�L��u�@���V�������>�<������i��gR���%����`����s��&=�Pq+��sg���V�\q�~��w��m��s����8�V�\)�0��_d%uj%�|��=|6���|�����yF�e%Y��|y�H�����$�JF��j�g���R��N������kh����O��>e���}9��s=��C��G�2��e���oV�L����M���e�z�^����c��D�7^]�g�*�
0��_{���R����~����B�r����_/:���ItR+�����s�=�o��.!�s�4���A��yF>��G�+,O>���;��7��T��#R�j�rV�,e��2{N���G��^4�|7�o�,�3�=u����8�Q�>�����>��@@@@@@@@@�P���$�f)Y`��%�$�:u�'//^B���o.�V9��k����'�|��VU����&��]�����-��zh<O�<���V�h����Z���p��9���/������-�8�I���R�6�����3����_��$?MBp����/&O��,0�kb�~62e�$U�T���_�l�j�7wj�>}���n���&"$F����t�r������m[�P��4^Mr�$�>}��w��K��}��=�/�9����N�k�1=*T�`%�<��w��������.�I4���5�tZe)M�4&ai�����G������d��a�sjB��S��+�bT�����o����#�<b~3mc���?5�N�X�R�����9M�������u�w��������9S~�|>4Yi��]�:��n���t�l����g��%O=�Pr��-Z�S?s���P�Y�c�`��m�U�����i � � � � � � � � �8Hq�j�Np��?��_J�����	����d�U��q�&>wn����o��MBj�0���z[�<m����&�*U���6{:,���Ay��m�[oI��<gRL�q'�Mb����
d���������#<Z��_�I�2eL�������Y�z4�N�'��(E��s���j{�{��� bA�������4�+"bq"��� � � � � � � � � �����r�{����T^J��� �|�{��xP-Z(;v�H�@`��?���P�F�x%.9^��={�~���������Z�(����V�	��q��c������3��U%�m����"�o�I�R|����i�L�R����u�6=�"�8��7�K)R��!C�&�"�� � � � � � � � � pG�{G\�x!�*U*��Hi����|��,Y���Y��!3f���������3^_���e���^����u����^z�eI�.]|�'[�@�;�����?���g���/��RJ�,)��wO@�w�~�A�
�N�����d����C&>�D`��uf��M�I�r��dMA@@@@@@@@L�7���V�?��_J����Z��;wJ�fM%**J4�H[��P�JU���@C�t�%�K��r��Ys�����o�l�9r�����!� � � � � � � � � ��������������)p��y�\5 ��;�k���������K�/_>���	�K��;4�!��%p��1���%Ki����]����;�s1 � � � � � � � � � �T�&�B�� 8�+W����N�D��X�BTt�9O�t � � � � � � � � � ��]'@�����s� � � � � � � � � � � � �$��KI��* � � � � � � � � � � � ��u$/�u��F@@@@@@@@@@@@ iH^JgVA@@@@@@@@@@@@�� y����\0 � � � � � � � � � � � �I#@�R�8�
 � � � � � � � � � � � �w��Kw�-��@@@@@@@@@@@@H�����U@@@@@@@@@@@@��H^��n9� � � � � � � � � � � � �@����4��� � � � � � � � � � � � ��]'@��]w��`@@@@@@@@@@@@�F����qf@@@@@@@@@@@@�:����[�#� � � � � � � � � � � � �4$/%�3� � � � � � � � � � � � � p�	��t��r.V�X.iR�'
>L"	6�;�����H����G��eU�j�.����T��d��I�9��:!��s��k���.���M������N����'��t�N�|���\�P � � � � � � � � ����K�wO�(����{7v�t��EJ�*%i���k�a���$c���i/X����R���o��=���;w�����gM[�K�tie���N��~������������?2��I�"�:�]W��@ C�b^�K�q;c�~�w���F�
vk�d�4i��W���-���R����>���-���O��!CD��r��.�2f��zP4�w�}G�4�Z�G*��b��Yf�������c��y�l���c��{��1�����;���r��6]�4r��a�S�o������������9�T�V����+����o�����<����|��m^'N�p:]��e���6i��OB~�����{���	�*���b?H�`Y@@@@@@@@@� y)�n���@�����g��!���On���A&RD��/�����}��gV�X��������_��Q��H�"E���2p��c.^�(C��i�?�TC+��q�}���1�����J�&M�\�rn�r2�����U����>p;a�~�w��-�F�;wvk��d'kL�� �?�l���Y�D;��~�q��D���~�$)i��k����C�~�:y��7LR��K�-��L��!��o����#"�������	��9���������<�h�+T� k�����	��J�2�mc_~������z���e��v��%{���u���k��pM^Z����@@@@@@@@@P����i��_���9���G&O�zW%�D,ZhnF�>}�5yA�y��:���_x�U������o��^��Zg��q#G��S�NI��i���v�j��mN����U7�'�@�~��;�{��W�t�b��{��L����������y3���?%(��|��d�����xI��~TZ��;u2�m�d��
J�D�5����_��I\���}���$S�L��W��z�;n>����4�,f�3���
@@@@@@@@@H*���J�u�X}���o����?��m�������QV�\i.U�������VR��iem&L��Is��4h� ���ov��a�����1[�&w�.X�@N�<)�
��Z��u�\2����n���h�M�����Ir���&XUt�ZZ��Ye��o�o��$i�&_h��	&�/���m����js��
�^���Z�������+][����o|5��8�&�iB�w�}'�_�V��7o����O���~'^:�� � � � � � � � � �~*@�����
}��nlk���K�.Ip�R�H���}����L*W�$e��M8Z�l��������$u������d�����<�S�Cp��@�sN�4��i����H��m}�[6t�����<�@�d�p����[Bj���#GwM�������"��/}?f��R��#�=[V��+�T�VU�~���i�|�
3V�����?K���XPQ��1�2�c>��M��P�-k���/�W��Z�����o�q{{0P�W�w��y�fH�����I�{{�5���`���f�G�-9r�p��&ZhE)k���i�F�&.��@�b��v��Y�>�����#;<-�4����J���6�.f:d���uwI�K�.1���Mc*A��y�wkzM�g���o ���1{h����m�6�y��8������s�w7������\5�}�U�@<��u�\+Y��6m�$G���-[�=�8��Z	M�S�N�b���'w.��)����c_��S�����?�j�`�W�����o;���U��t�A�������l�B�)l>+9�g�Gk���r����]�pA^4Hz�A3V�x����k � � � � � � � � �$���'�'VE�Xt����P���K/v��}�K����94v��IH1�9�*VL��{�zk�p���~��|������Q�L�����F��z�F��d w��a��V����.����'����7Bo��M^�5�P��:x��4�s���WZ4o./�������$>�\��0q��8�X�f�Ib
7�	Z�FH��;w����6n���U+3��)�]��	T?���9��e?N$���s]-�#�f?���LX���K��e�e���^C���%O�<R��c�*U*���	�q����{���e����IM�=�q�t�{J��9,�$��w}���1O��O�6���~�P��?��~���f�V�6�[KX�N�n�Z���K��T��$�����w�}�mHO>��*\��9����<V��d��]�Z��>����u/\�a����4g��$����<x��s��:�e��o����B��I�K���;����p\�]�|�X�m41)4���o�N/��?���|V4�-[��k��*���9���.DY��5L�1��r��u��=��[�i��n�\N�	@@@@@@@@@H��K	&d�V@�����yEEE�4H���lit�$[���Z�$M�4�!a��WkmU���5�h"�'���h=�_�`A9w��6�$J
���9��S
�A���Z�����<����@y��R��Q�e��?����r���r��eY�v�I^���~��'SY�C��&����[�o�(���v���(�v�+W�H���������e��=r��!Y�|�UE�U�*R����KW���[M2��6m�Ts��U-�b����p,��T��l�{�n9}�t�F��~P�LY����e���������[��r�J��$
}���� #n%pj����3J�*���������������7���d%�T����i�����M������CS�N�����&,����u	s�'�����:��E���[U�N�>#'O��C��H��@�V�[�2�{R�c�}���qc�W�s9�.<������Y��M�&�-��+)V,X��IJ�.�t���JZb������?���'�0�N�;��m��,�M�����j��U�f�9����o;�}��q~�n��a%����6���;��+���0q�;��N����e�(]��O>��I-���F.]�"G�7c�i��V&s������ � � � � � � � � � -@��L`��i�?_�x�:u�������oLBD��i��UEA���m��[T�w���$�;�]���i����g�M�0�T���}�Y�����h���m7����g��jZAb��m��o_y����N�L��$L���6���o�������+e��	V��G&�!o����C���_}���x}=K�,���_K����hP����u����3�a�F��	�[�7�AnmS�D')9��_s��6����(��.y����k����{bE��~�������&?i%2�&�I���3����i��M��^��f9������#G�!h��U��6��ak�{������;��dLM�~@>���}EM�[I]1[�.��[��BM���I�4�Up�|����}�>�{���-�|��Y�K����+���6�����)�d�#�u��5�$�`�9u������*,�������4aV?3��T]R��o�e���;�9sf;c�l���kn}W���9��������7�y���a*-������}���7���z�n��;��P�����?���bf�U�V����o�����@@@@@@@@@b����# ����|M\��m�V�i���$qL#={�4�@3fL�W�B�&MMM�y��w�2���E����9��I�_���=��S��%L�m���s���W�ZU:�H(�jq�#F��������1q�m��4k�Lc�����&�i"A�v�b���dp�l�:��I�������4QN��m�L2b���'w.y�����z��3���W����/K�D���f������
����Gw����t+T��9t���X����&�\�vM���Nt�d�����$>{A���8����������f��=�+�8N����EWT����Y��niU���I�&:��1�5jH����ys���VVe#wM���J�+��������������k��)�5v����3��sZ}1����R��9x�����@@@@@@@@@@�� y)�l��D����\�v=^��4���f�P��#�����U��������>h%3�*�i�G��T�R�!E����x<�����oV��q
��Mh���-RX2e� iR�g�5h����T������K����-!qkR�&�i�MVrl��F?d��iSS=��_���%��>s:Q�K�~P�D	S�h������^�+!R��i���k�Hk+QE_���O���Y��c�}H�+S�G-T IDAT�����T�[bUGr�������c%'i�t1v�)MH��!�����Sn���?��]����.a��������?���Y>u���jn1��P����V�s����kN>iR��Jw���s����EK9|����?_��-k�������/� ��(9sd�ti���
h�G]���.�ub���e�9d����'�]�����!nO�� � � � � � � � � �w��Kw�'��G ����>��Vi�6�<h�x�i����{������W$��H��y��*V%}0>�M<i��������V���+W��+WD��D���H���tW+j%[y�
[UY���'-�qg��Y�5kf��:e�}�3g��������.��B�d�}�������|�<��#���!�j��:}��W�i[�h��5|xB����7n��e��|1�@]H����#�]7G��cl�����?�����D��&*������VuI��b��'Fi����[��c����������{������Z5����#G����������+'��=_+[-�qb������/�U���M��y�����L�6M*V� c�|*�H�%kVS��[g�ly�[�n�������K�	{
�y���9r��g�qP\�+��# � � � � � � � � �x%p�W���&�������~�4iDQ|�"�����s��S�i�A�^�y:�{}�_����#����u>1�n��O����<�����D��?A�4i"Z�����[���/Sq%��.m����<�Ui<m��;�KW�9s�IV�
L�r����g��8AA����(A�?�?oU��"I�Q�z?��4��(��ysY�d�L�4�$7%f"��_o�,g�FWo{����/��m�&7i��a��?������
�Z�>j�K��T�����8g�l�n�$J(�����oz���w��u����UY����.V?O��X���&{����\�tQZ�n�6zML�����<5i�TF�)�
�m�gc������y��q��I@@@@@@@@@H��w$��L����>]
*�WX���,�t�VA��k��I���Z��;���cN�p<�����;6~�����EM�����Kz=���5��j�����	e���O�Wq��QCz������V�s�Z�C[���~�L�O���-�F����y�_���� fL-[�2�������9V��$��{�~W������+��:��]��)���1�/[��$T9VKs�f�f�����N_���n�6O��,Y��)���b���y��%k����7���t�l%����O����*=�ZW2����^�������c$_�|n/w��r��u��;�L��������O�<�voO�O��$k;z�wo�a � � � � � � � � ����K~zc����W��t������b��8"�������yhY+�;v��1	�T��Jf�����L`��$[��e�9]v��MbK�r�!�2��.a�
�N�*?����hW��������'D��u����
��?���=�
*&��$�~�l�T�_�,f�`�\���>�m��W�����h����ce*���K���%{����[���N��P��m[�J{I�<��K>\���IV?�����vl�n?���;��x�����.VU8mc��K������a�^�*QQQ�����o���:�:ujs�������<�:�}�c/���I�������(!j��m�����X�R����7n%�����@�������+��
�Cw�oN`��D@@@@@@@@HN���S���B�{�.�wUMc���������!�"�krR��U�N�x��Y����w���`���m�v�*��I��������W�WO��m���4���4���}��j�o��V���}��q�o���}��o��{����	S��������z�����;o�{�>�o����u	+	!g�������`������j7o���3f��Z1&k��+����W�5y��W���\N[�n]s.2r�h����&���R���G���+��;w�N4��z���d��nUo��)��b��q�����I�&����U�,Y�+5���@�����<g�l+�4vb�v/Z��}���bM9�I<�:�:�?~��}{��~6����/`��g�������}�r��VR��jU+W���W`�n�u��
���l	�ZQk�b��������n�����A\ � � � � � � � � ��#@����"	P��s��Y����1W��u<~��+.x�o�"��I�*����W���D�>d��w3�������1M����c��vnM�UQ2�M��������O�5m*���[�$�I_��^����-[���v��)�"��6P�W�����d����v��,_�\JH���R������_�.�O��uk�J��O���KL�����v�2d�J��+�9��^������k��v�%���t�b���b�Z�m��-k^I������M+�>��	���?7I��.]2�O�<)]�:�=T��A/��z�4��Q��r�����?�)$En%0
8�$�hR�V�>l����y����f
M^9r�1���/_��D�q���y:>�����/~��wy��g��6M��6u��0����WL�W0]6m�h~7=i�Z�����������G��7�o���W^~Y����'��@@@@@@@@@�H��%?���}z������_�~��������v|��W�oE�	�k{�M��n�:�w/[�����
1!�jy����u�n��;7\������{��V���CC�K��Y$O�\R�T)Y�*R>��Ss���/�������r��%
<����������8,��1����;!��*�h�`�)�k���o	�3�X_�Z5G�"f[�sZ�l)AE�H��K����^
d��Uf��m�J��b��,�5�J[HH-I�*��J�.-�=��hQ����<���I�[I�:E�N���)a�<��$O=��,4��7%w��f-R����3����$�At������;��C�5}41�VHM��1�Y_��>�tL��m��v�������K�lY�P�����������~�t��B�r����_/�J���Iu�J�*����,��UQ���}�#{6�����d5�%��ZX�i�V��b��\,H�U�b^]�8��2eJ�='��-p��5y���������%s&)���2j��JK*;�:I������z � � � � � � � � �x+@���r�C�.X�d�=��N���^}��%�C��l�J��u�O���K��Mh��V���y����GM��������[�C��'OSF+i��U���hw7Gr��e��}�����]{���@h��Y�d��}�	�����3�w���u%8����l_�C��*.-M@��4z�4yA+�h��6m���%Ke���~�y���_~��p�y��3�1M�%y.[��$p$Fkt�"�V�kmy%W�k���r��y2��/D���3��K����q��\%���>���i��RV����|f��e>ci����U�~}Y�2R�\|����d�U��X�`�@s��)����4��1'<\y���a���}j%t�uV�P�xie���`�\�a�&�p���{�v�z�&�
6�����g��sd��MV�X)3f�2	o�s�6���U�\Y^��F������>q7��$�9�#� � � � � � � � ��@��V�P;�~�/%��E=w���$0����{�]�o/g��mR���t��]��C�=^`��������R�J�q�f��%��>,�UQ�
�-�����uie�R�I�X�s�����J�()�2	!IY������[�F�J������r3}�L�N�l /�@������@@@@@@@@p�����{8�
F����I@�;��������d����c�Si��\����+]��Q#^�K��i������C�K���?���b>:�v�Z3�V������fM�i�Y�i&No9����^l���&q�y��$.�[/����[VEF���v�X�-w�@ ������KB@@@@@@@@�S�����$�@�T�d�{#�I�������%K�\a��2�|y�g���
.^�(7n�z||�[����K/K�t��;<Y�;v�k��W�����#i�����y7Y�g���
/�{�-�������k'����.�7���p@@@@@@@@@��|���9������������ �;w�����JTT�h������V��I�"��LD�]�:��u�D�����?���{e��H��h4@@@@@@@@@@ 9v�?,�N��Y3��	�X	@ ��]�&���K�.I�|��_�$<|.�KI��288s������&M���|�J��Aq@@@@@@@@@@�����h@�/*W�,W�]��X�/^ � � � � � � � � � �'@����e� � � � � � � � � � � � �@`����(@@@@@@@@@@@@8����0 � � � � � � � � � � � ��!@�R`�'�D@@@@@@@@@@@@ �H^
�[F� � � � � � � � � � � � ���K�q��@@@@@@@@@@@@�� y)�n#� � � � � � � � � � � � $/�}"J@@@@@@@@@@@@N�����e� � � � � � � � � � � � �@`����(@@@@@@@@@@@@8����0 � � � � � � � � � � � ��!@�R`�'�D@@@@@@@@@@@@ �H^
�[F� � � � � � � � � � � � ���K�q��I`����&�}���S���6�;�����.��I�X���
�(��Q��I-+��7nx4�N����5kb}t�n��M�a����N����'��t�N����g�u�!� � � � � � � � � ��$/��">�����e�����k)]��y��nI��������?��`�Wq�������-[���o��us����W�������H�B����\ C�b^�K�q;0P�W��������(!7o��u_N�<i���W��������s���.]�d�3z��X}�{?(Y���3�9s�X��;P�tii�������2i�Dw]��7�������GJY��5Kf��-��-S������#�'J������;f���Xd��(Q��5�{�g������'{��c'_��x���W�1����3�{�����~�|�2Y��j���_�r��xj�u���c�q��]�y��7��t�=���_��Y��I�����N4Yw��O:U��������W���5+=R��5kV���B � � � � � � � � �w���w�%r�$�@�������w?�}���r��u�����#-��M��i����������\�\��8�S����K�������@�[o������+�A��=�GwB�a���/������k�uY����|���2d����uk��%q�"��������+/�,Z%�����G��xq��/_^��v��%���7���A'0��������'p��W�PA��[o��	-S&O�hp��)o��/]�:{4������K��-o�R?�_����K_��8�vM^>L�Y	��$�2�� � � � � � � � � �@@
Py) oA���&��������S��UI0��[��O_�_}�\�B�8?=����W�@���1P�W����5���w��,�T��<V�����_2iR�V_����d�b8`�I\z�vmY�t��~��\��(���j~����o*��k��5��u�'�����V���-T�$`j�/��z�*�*\z�� � � � � � � � � ��#@�R����$p�����7����J��m%C�w�����k��Y	�44��X�`����
\��3,��'OJ�B�$�V-?��PT P�W�w�l�$s���R8��0:t4�'M�(���_<Fz��������7�����e�M�U��9%u��R�pa���x��5{���%�Ho�9�I������qc?K��}�V�Z�*��F'V��'|N�g��U�� � � � � � � � � ��#@�R����$��V���v��t��? ����V�m�"��JJ�V���4r��MS�b���R��c����1���7On	�YCF�a,�5�v�&�}�i%}��1c>�������J�\9�z��2�3�����f�������N;H����)c	.d�;&�x���%[�,f��_|����j���_��}�����@�^j�i��M�����q��{����
6������#GL���h���;v�0�5k�\�����������k����OL�;w6�e_~���9s���Za��[c��1��W��yu�����}��ME��������r��DDDH����Xp���3�q+VH�~������
���BH�F
e���N�>l�VO�M�m������N��w��/�e�R�Ha�~�����Z!��{#Mu7wM'?3F*=RQ�f�l��������n�@@@@@@@@@H2�O�&Y,��(�hQt�Rhh�	���%��n��7_mB�Q#:�]������Q]�zk�l��IN�8!����4�m�6y����B�rr��Aw����{�_i�������k�.���s���'N�s��k��$���p9v�����G�5�w��i�m�Z=��U�B��)�]��	T?���9��e?N��VPK�"�L�6U���g��U�bE�922��A	���W4aR�����z���5'O��]5G������=��/>���w�l�3e��i ���S�N�+\l�Mr��ei������K�q�F&yX�/\�`uM6��%�$1����������Z���

*f����x����)S:U��������];+����?$]�t�;�e�y��W���=�t��`�N�����f�S�������m�f�!� � � � � � � � M�a IDAT� ��$/%�`}�)p��U��
�yEEE�s���A�eK��N��K!�j�v�!Y�R��m��M��`M�x�R%�B-[���5Zv���\��('�8)/]�5k�I���M����n��\Z�&2r����[�o�(���v���(�vM*������_@>�b����G<$����VV��^�c�6�.]��i�n�*{��q���S��R�JI�[�N;r0 ���zV5}�}��Y��Y�r��u�=$o�_���������s���=���{��R��o�����e����/[�l��������N@'{���j7i�D�q�FE�<�j��:���Ui�3��.�h��e@��x��'e�������V�����)9!���9��^�J�r��s���U���g�y����/�m�m}��M+��M�V�q���x��w���r��i��m��J,uW-m������o�u�����?���c�I�T�D��G�k]��B���`��E�}�7]������8N � � � � � � � � � _�{�;�� ����M�g��~@��H�	Y�p�������7�����E��iU�f��*��H�U�I|������&�|��Y�f�3����[�n��O�(T�^�z�y������b��}{�������Vr�8q�t���~8o����C��G��n�jU��%K��u�%c����z-����WW�	�[��>���O?��)S���M�����mQu�6��~��J�����qc�k�n}-I|I���m��=���VfK����������o'O���e�X���R�n]�T���)SF4�(1��l����%j�������fgs�1��59t�����N�&M��4�'�|�|���
��m�XI=���b���]���q������J�:�����|4k��X��.'����y�d������3�
O�o�|����o.WM��/&O��M��.������w���{�Ilr��}�9�o���:ib4
@@@@@@@@@_Py������] ��I�4q�����
��[�������&�l���$���K�������U�V�-q�q�'	#F��-q)��m����V}I��d%��|�2�0�>���]�8���!����R4(�$�m��)0���(�;�%�O�J�����|�)�.��n����,]�D��{^�W�*y������d�������{{����o�z��mB;v����w��K�N6l([�l1�����u�q��X��&�i;e}��2�/�����t��3q�q��9s�\V����b�V�������b��= � � � � � � � � �I.@�R��� 	����\�v=^/_V]��#���BCCo�������{�$�Bq��3g��Y�����;��N���I�"�%S��&�}�WTT��3*�b��7����iE	���iKH�����i���&+9�iS��n���d����p����k��6n�g~�������>s&QK���fv��+_-X ���1�����_�g��jU������{3yB�����m�&�h%�
��[��v�[x~O+�Z��Q�>0��6��H�.�sVu�#��:��|y��������V�N^����zws���V+�J[����3���E�qZ9-O���������� � � � � � � � � �@r
�������@
����r��!������w`R�]���t���tw)��4�����JJ+�
HJ#�4�
���4�! KH�w����13;�;�;�����G��q���3w�{�{�c��3�<+9��h�y{�%����G��]�Wj~���VRGgY�j���}[�����Uy���?�Y��U�!��+W���8���3�<��{�������'
?�=m�4{LY�+W�0�����4V:|S�m�v��K�;|��y�m"��&;Q,�^�����W�U/����5Z���).^�Y�~+
���W���'k���E������=G�|��]mI��>��v	&��k���K�/_v��n3�&��W�ZuSYQ?�����w�^)\��0@~��'���&��~�K�(a���o��s��u����y���-���B�K��qU&ML�5��!� � � � � � � � � ��b����/��?������51Q�D��(�hK��[+Q�x�%�?N��q}��
��
��Og�����n���?��s�h��q�'H���CU9��)�\�r����$���u^G�4�������w�(�f�2�JZ�)C�V��oE�s��y����E{����+������e����j�.7��Sqwv0��������������/Q�����&O�\5j,����bE����ge�u��U�[��Q��p����V����A�"r7q7R'����|4t�0���i����H��u�Vr��%��7���/]��JK:y��}R�x1��7�Ee��K<:@@@@@@@@@��{�;�� C@ jf��!9sd��}�vj��E�����+!_��w���w�����i����H^��|7o�?x�i��q��%M(�v��Wm�SqW�PA�{.�<x��Jb�i�h�~��};��i����{�f����1�j�Z�$<g�?|��>5q����y"�]r/I��qOl4*��)R����j�0>��p=�FT��#����������B�9������g��^�c*�����Q��|A�AW�hU����6m�PV6��m��v������H���w9g��=r�H��}�����t��?�t�FD;�&Mj����9s:��0@@@@@@@@@� y�'.A"�'O������j�j�_�!��@K�,���CDQ�d)s���sa&0iR��7��"E�:���-[����p@�d��;�7;�6u����/�3/^<i����c���������t�:u�TL����t�������d������s�J�p�l���U<s4������ofZ������=E��W+�h�/�����z���C��u�f�<~�x��4!��.]�*RM8>{�L���$L���u���n��&L8�V���\�����!��(P����6mrx<�A[u��V������*O�W�rw�������wv���^!� � � � � � � � �x��K�q��:�����!G�l�.��Z��'r0p�����&'�)[��}��B����6���<X�J���m;vlw�&"��qP�D+[|��.���NO���e+s]>$=����N��/J��cbk�:�����|���5|�������!�����������������UN�_�f�}j�-�D���g�����Df����.Z�P�J��v��u�%�:K�p67��Gv�QWL��B�*&AN+m���az���5����is�1Z9������;:`[���CN����cY�f3]w�����;���R������c�B�����&Mu����~�ki��V+t�����n�*K�:O��r��;�����;v�g�4i#1pR@@@@@@@@@� y���z���?�_�|���`��������a^�80yI��l��^��9���=p{���`>A�l�������G���{��UG��c��S�B��1nu:N;$H ����3x� ��q��!n}��a��g��.OE���;m��R�^=��?&i�m�6�"\�W�W�������lg�������]�v1�\�x��������Qs��t��h�;��m��V�&�r�vts,&�N�r�C�����5j�9+��"{������3��n��VR�&SuN�O�>-�g��J�}]��i��j�u
����=�F���=�U�����8Z3���t�j�:J�����7m�t3w�\���������~���)R�u��5k�qZ�n����N��9���������{��W04��i��T�R��:u�(�����[��F+A����v��b����\�}�����6m*�*U2�Z�l)�G�
�w��S�������[f
@@@@@@@@@_ y�W�q{�@�n]%k�����m�Ll��k��������#�&#��V�jU�KT{���VX�|����V�����o[����9�L�R!�{��Sg�~���a>���'���UQA�)��YC��N%�2f�B��5���/�2���<w�����!���U;J���������8�g��1����#�8��������^{]Z�ha��~����_�'K*��e�7�x]4����ZI�8�n?��������J��J6���%{�1%��������uF�i%YU�,�3I�����<��JF��j:f��QR��N��{��A���1�J�q�<���h��k��u��G�z�������e�6��o�_���UKin}_�)���*$m�&�0@��I-9�g3����r�����7c��P����skTL�r�@4uj���F�SO=e����?�d�����V��V��_������&Oy��:f��A����t��R�l�rT�,n��2{�\�T��Iz�����n����R�{�����+q��`=8(�g=:K!� � � � � � � � �D��K�����e��-�'�T��:y)o�|�5kV�][�o������3gL��������gim=4�)S&S�B+��r=Y�v���nWk�D�'�������-Z�$_hZ)K�V����5_���-qk��&!8k����)Se�����}Ml��F��)�L�2�������������f��n���sg�D��h�����|�|3y�4o��$�i:�W�\4I�{��s�.���GTl!�kzb��>�L����Uk��j��u�M2�VYJ�(�IX7n�|��.���;v�:TtMMH�x��y�94�{���c%��,Y��f��j�+oj��X�r���Y���i��V����;vZ���n�;s�,���=+	*�IV��w������:\'M�4��3g}+u����3�V
��fi�2��V��&Xyk�dUr�5�;
@@@@@@@@@GqY�Q�<+������?�ge5���_|.��
�������Ej�'}��;�R�
f��Zck���m�����aC�T�R�y�Vw�Ez�>(�B�
��y��^�^3:�����&*�Q�v-��~���fO�����:��#��H��&�a���:uj��1xR
[��Z�M���,Y��l�} � � � � � � � � �@8=)E���cCc���b�Ug� `�u�.�<��,^�Hv�����/>��P�B�p%.]����R�z5�z���]��3]��DmZ�B���J���}�7h������3��U%�m��!�"����H\
/�@����;g����#�����@@@@@@@@@���uK�2 ������������Y�d���;��n���2�|s����(n��!�7o����N��!0y�o�w%I�$��c�}5����������o��&���(P@:u��(������
L�
4��E���&�@@@@@@@@@ Z�<�Z��)�����G%��X���@�W~��Wi����&i�Q��U�j���@C@@@@@@@@@@=)E����K��\��� +���+�����7oJ�,Y�g��d��y$.��O�F@@@@@@@@@@"./�S�� ��
�.]Z�����n�}!� � � � � � � � � � �D����	�� � � � � � � � � � � � � �H^�mW��"� � � � � � � � � � � � M$/E4�A@@@@@@@@@@@@ �	����8�E@@@@@@@@@@@@ �H^�&hN� � � � � � � � � � � � �@l y)�]q�� � � � � � � � � � � � �@4	��M��@@@@@@@@@@@@��&@�Rl���@@@@@@@@@@@@�h y)��9
 � � � � � � � � � � � ��M����v��/ � � � � � � � � � � � ��$@�R4As@@@@@@@@@@@@b��K����_@@@@@@@@@@@@�I���h��4 � � � � � � � � � � � ��6��b�g� L`���(a�[�2Q$0l�Pc�U�z�(:�o/;j��PV���qkSw�������T~)���Sn�aP�
80��������3�8��%s�0�2 ����s���Y�0�Z�I����1�K��4@@@@@@@@@�>�������	���G��+�:v�BJ�D	cM2L@@��H���������z���4n����|��\���������^���8q���!C#���H�<�T�T��
*�r��~�"w����F9r�ti�3Q�D��_������}CvG����4�K�.����E����K+)S$���{Vj��)}4\�4�Z��%�=��o�5��v���~v��Y�N[�By���=�t9'{��R�\9�K���M�SA���?���H��T��}�]���p�y����\�|����\�j�}�$����'.���z�7�S-��_0�2��tL]�/��"������\�Ha����;�����h���eK#�T����� ���D � � � � � � � � ���@<��p�:������[��.��h��r��=I� �������A���qj��c������#&��E�zdMq.�7o^Y�f��Az|�{���4i"��6|��2x� ��l���k'���L���/]6o6�P��"r?��i�4o�L����`a�<qB��q��jE���"��%����}M��k���t�9r�I�t�:t�(���|����c�

u,n���~�F�qM����]�qQ}`����g�#I�:uT�*�������?^>><Z�[�x�`�]�v��S��uno�V�5�����o�y���r��A���A���%Mhn�����S72K1@@@@@@@@@�*/=�-���&��C���w�)S���$�%����{��j��V3���q�5����kW_9V�������;^�x��C�Y������	�����s��QC���;w�f�9��1	�qSN�>#��d�6m�Jx�E����i���G��n���s IDAT���-[6�jM�w���0��|Z�k����zN���N�"w����s��I�J�V��D��m��9��~�h � � � � � � � � � �@t	��]��������i��5�� ��<0���we��Uf����'��\�vM���/����$G�R�re_9V����+o��E����_��Y#�q4Z>7�L�����q�T��h�7Z�li�4L�/j��-&L��zm��%��o����z��������\�s��M�0A��Ot6=��+W��|����si��&����3Xe/M����y�%K)_���m�x@@@@@@@@@@��H^���G��!�����~�:�y����?#9�~Zj<~p��0���L�4�����+'N�������!C�z����3��"y2��)�T�XAF���X�j<�D	��j+�K�����.UR��I-3���������v�����\=��}��I�6�%O�\�2Er�����?~��}~D����4�S��M����J�2���=�;�;�}�{�
qg��Y*V�d*}3���^�p����`��]��?���K����4�B+Jy[�d�-�7��4q�~�*F=��t�RR�H9u��,_�C�������gK���$K�L��t���Y3��uk�k����f��qc�k�`�|s�������l�/��f&�yV���m��E��9#M�4���r�?��^�vm�H���$S���2����c?���C������t��f��)S���re�8\�vP?+��/M7�\O�4��ti����+��r����]�~]���#�=����k����L�uT��>.
��7�e��F��X@@@@@@@@@�p�����O� S�?�_�fM�����.5I��4����`W���*^}���U�����>�}��yI�,�yz��2����x��r��qW���<| �5���zK���k�t���w����\c��u&�i���r��Y��7�@���u�����[��5i���3u���h�/��b�����t�/`�\�^X-�#�������&����FuxQ�����E�P�P!��)�T�RU���/��#GG�9�a��]��0��u?�H������o�V6�_o�wI�$1��4��Z�*�I��K/�$9r�4��m���J�%P�Z5I�6���~lm��9��M�k��
:�\�9s��$YM����S�N�cU�� �
5]��U��&m/=����$� ���E�5�v@�j��!-[���K����i>+��?�,�������7���`�^W���G�Y�w���{�7{��ymP�^�W��k��X���N�8�4N:@@@@@@@@@�m$/��+�~}^���;r���p�<����W��Xu�Vm�R���(Q"���V)���u�� �V\*iUq�i���#G���~��7������[�n����v�j������!�D�J�v�&7m��'NZIG{��Y�es������s�N�5k6�f�9p��;~�zPz�UE�i�*R��C��&�����dGm��i�p���D���p,����lr���t�R�F��A��EL\�6n��
%��-e��=N��$
}���	�t[�8��F���)RH�2��K�,q9��;_�*%�N�Z4���$-�N�x�"��V�����/��������6�.�f�j�4O�y���u6���:�P�tr,���r��
���&	I�.X y��K1�CI�$���:Y�C��5����r��+r�����i>�C������W�YkU�X�t��];�q3f������C+���l���|�����=w��q��u�;��kW�U��|_~����HB���Or��m9s����M��~�a���������8� � � � � � � � � ��	�����1}�d��9\��m�xt�?���I�H�8�T��(h�o�C�=���s�Y-K�,�!���V��y�����<��s�����+����i�5����>�r�z�*?~�U�s���9sfy���f������J��z0�Gi����������*Ud���R�������[�7�Anm��&)
L�����mQu)��w����k�U�v���GUd���������OZ�L��iR��
L5��h��y�V�^��9�VT���J�.��4�t���DM��5�����tcnt���m�v����������?���_|a�u��Q���o��iU��S���i>��#����F�d.\(/^t9�N��R��
KZ}If���+.�.���>0�E������3�I��\�F�wU���fy��������7�ug��)={�%z^[����?�BF|���s�ws����	��=5j������Y�f����8]�@@@@@@@@@������-`{0_��Av[�UaZ��"I���	.^0g
�PtdN�7o>��+�>�Re����N��ZFX���G��r�;�ms���V}��og�JUA�V��6M$h��E�0x�A?�/Dm�GD���g7��4QN��;d��AR�VM��1���bm{���u��k���[�$y����g[�Ua��sZ��Im]�t1I�3g�3����[���k��K��
8A]t�N�+*m
2���~��X����'�&Mt4�cA*T� ��j~���'sf&�6�*�jZ��U+U���v����:��f�L�X����r=GC�����;��U���|��`���X��9v��q�s=������������������� � � � � � � � � ��!@��q�Dl�����cm������y�h��%f��A*�}��9t��G����.�u�,�:HE���������I��_�\O���)�K��	�����D@�������mZ�D�,��"�&%ir�V8�d��m�����4h`����K ~����K]���"s?��/��r�e������R�J�L�$���_��['�X�*��doj��*U��Z�Z���%S�L�*���K�)d����!�$���YV�Wm��}�;a���jn!�/Q�~H���j���0��L�*��������H�7��'N�����H�"�z`XM+���[R�d	I�.�$I���[��wo3=�F��ua�'d���6�l��B���������L3��7� n�'�  � � � � � � � � � y��K���~3Bk�UZ�-��3��+x{�%�Y�iW�^���,���YV�Z)�o�}@Z-l/[�+�"��+W���8���3��x�N�l�~~~��aCs�iS��O��_���+����;�
cb@�����JdB����d��2h�`Y�f�\����o�:uMh�/��
�L�����CY�<0�/�=POT�z����,��y=�����%^M�<u��������;n�X�s�^�j��j��{W�t��k\������-*���?Z�j��s]�8:=q�����������]me���R�xq3�+�D�T�S��h���<y�����su��}Z������p�l�Cv��>]��>KA'����U � � � � � � � � �D�@��?%gD�����?r���p-�(Q"�DO�%��{ _p��b�6��O���^���p���]?$o��~�s�N��G��O����K�x�o��3e�+W����$q�;hUw�'�n�����5�$+i�2������8�s���V�����x\a$}��Q`T�4��(��Q#Y�l�L�4�$7Ee"��H?n�*�/Vo{����[o�6U���m��I�]���{���E�8M���F<(7l��i�&��s��v�.��o�qc��*5����M`��	�`�&{������yC^y����41�G����^�~�x���#G�9_�c>��j����%� � � � � � � � � � %�����S�(DD`���3G�p���k�S9��UPl�����e�j�{�n9{���5b��&�h����%��w������1��L\��2MR�����+T� �=�W<x`%1�4[�����o��$���-���k4���.y)��M�65��]��_���V��$���@��h��++�yC��6l$w��s��aUvs�i�H��]���c�W_J�:�������A?��R���}#+�M��[�D���=T��������jB�77O]��}$_}5F�d��r�-�{��I��e���F��%�|���kD�3i��&AX��3�#��@@@@@@@@@@�KH^��CXx��Ve�=(�j�j��_�!��@K�,��mH���L\���3�I��ll�)�p?[�l[���1p��q�����`��i��/����&p�n�&v�S�?^4�N_�N�
�d��o���/^�D��$:����W�,d�`�l��E������sx����_x��	Z����	$0�o��������	����.Gg�6mM����={���������o�>�cv��e?�?~�c�L`�u���ikU_r��%
L��s������:��@��	M��^+g�
z����k�7_>QcGm�����:7n���x�8�/�J�.m��^��A�o���9�qu�@@@@@@@@@ &H^�I}��@:������U�X���jI8�}��%���59�L�����+T�h�l��������WO��c��H��|[�����C���~�A��1}��q�l�J��>|Hz��?����_4�9��M?^��+k^�����z,���?���$������Rd��6n}��Y{�����9�tk��������l-O��=[\��U�.[�Z5��z�*��g-k�l������8=�5k�\]����N�EeG�)�y�����I����U�-e���o��q��h���I��r��I�T���B
q�S����<g�l+�4tb���+�}����B-9�A<�=>�5kV�����~6����Z�����v�J�rT�j���b����^��k�	GF[B�V�Z��y���+W�:}�������� � � � � � � � � �>#@���\*�V��s��e�����&T�o���b�:���lUD49�V������W7��"��������'����7o�t��yp������^��p���}�>0��N�i�V��UQ<x�h�����#GK�
d��=.=\� �:=w��i�^�z&������m��Qy���������l�b k��e�)���+VH���I{����J��Jhz_�t��lX�^���#?�����I���l{N�<��*X��Q\���0����n�ZGC���5�����e�Z��-P�X1{bZ��������c��u7�?v��i'N,��������7&��vo�p��th���C�������jB��/����o����h����[�~���F�x�I9Z�n����*~j��e���k#F|,�QQ�[��C� k<�<�>}Z�x�u��M��O�&-[��'���V�b���-�7��MwZ��M�R�Jfh��-e��Q����������w����rg9� � � � � � � � � � ��	���E�P|S�{���5Kf�k��mf#7lv��~����QkB�moU]T����#�p�����{����|���m��r����0��)�<�@�����Yv�����?\�O>�D�"�>h_�f
I�:�d��A
,(k���/����{[�d�:t�o/C�R�V�(����W������={����{*��z��t���q�������n�Y3�\O��j�&E��*�4m�Dr�zZR$O&��e�*{���k���6o�\�y�W�b��&Yi�T�����i�
��h[�8p���;v���/����O�Vrd�f^����h���������Z�&C�t��5�V~r���:5�J�+�\�w�>R�N]3f��A�1Czs}:g�3g�9����K�Z�	B.���[�0�<�������*J����5������9�6@�i���I���iR��X��j�r�\��}e�������o�JZz���8]�4����M%�>}�K0kl}��Z�&������R�l������P���+���5���w�J_�s�%s&G*��R ~9��p%�9<Q����(�
K#� � � � � � � � � �Q��<��b<�?,[fO��R��������<���V�����l`UL��9��9s�$��j��m�~���[K�L�Lu�l�U?��]g���1����+?��=A�E����'��l?R�J%=z��!G:�Y�f��j�j�����H��hO�bU\Z*����i�i��V���9��5�e�~�)S�y��M�_���o8�T����~L�lI����$p8j���k�J�����E+w]�x��4�)����9s�J��%�=�6W��Eg��=����sjl���N&}3Y�^�"E
S}I����/�W����s��hm��S�J"u�����o�5��D��V��^���\�Z�/<m��q2����'��I��y�so�Va������,^�����V���&�l��-�<Y���0�z��o�(����9s+�����:]#M�4�r�*�9�[���1cFS�L�[����}+ql���N��tGl���is�� � � � � � � � � �qY�7B��(�T�����M=O��_|.�{�2���7�	��g��c��T��Y���{�����}�a�����
�R�J��-[�������V��6����z�����0Z�F�.~����i�����9
��'LBHXq�Y�1 �a��oN�;d � � � � � � � � �X����R4���N�"�X�7Jgp�@�(����L�8I/^$�w�6�&h���<��E�
���t5��Q�z5s�P����g�9>����_�����;�w���U�v����4'�7'9u�t�O6u�����Q#����@ ������2@@@@@@@@@��	��>/F#��$?~|���_��8@�-��	����2s�L�?�Y��k�Ex�7n����#<?�7lL^���]I�$Ix�����g�D����;��G�%q������b$~N��V_������}#� � � � � � � � �D�@�GV�����3��������6��@�'~��Wi����&i�Q��U�j����'�D� � � � � � � � � � � �Y�GOJ����]���8�����!@�H��{W��;'7o��,Y�H��o����H\��, � � � � � � � � � � ��K ^��.�EpG�t��r��=w�2@@@@@@@@@@@�T^rJC � � � � � � � � � � � �DF�����1@@@@@@@@@@@@�
�����@@@@@@@@@@@@���K��c. � � � � � � � � � � � �8 y�)
 � � � � � � � � � � � � ��"��\@@@�G� IDAT@@@@@@@@@p*@��S:@@@@@@@@@@@@@ 2$/EF�� � � � � � � � � � � � � �T��%�4t � � � � � � � � � � � � �@dH^��s@@@@@@@@@@@@@���KNi�@@@@@@@@@@@@@����=�"� � � � � � � � � � � � ��S������ � � � � � � � � � � � �� y)2z�E@@@@@@@@@@@@�$/9��#6	��wO&M�(�j���Y2K�dI%��9�R�
��woY�v���������D	�����/�M�|��}^����	����kn�Sc��>]����o��]�v�"����4�SI���d���������;�c�~����jR�n���@@@@@@@@@@@�\�xO����	�?^^�l���l����;���G�����_roQ����J��o�������G�"�����]&N� .^???�!"� � � � � � � � � � � ���	���mW�x�U@x�4nd�R�H!oY��7n,Y�f��w�����e��2m�T�q%M�T9�rL�d�\�G����K��N�?���k���C&�����iS����R�@��������d���~��Cib�����Gf��!�S���~��c$Hr
�@@@@@@@@@@@@ ���K.4�t,�a�z��{���;w��P��}`�D��\�r����w���[�y|4m��.���3I�$�s�^������Wo:lX��J�.-�z���E����
�>>'N�p�r-�#� � � � � � � � � � � ���%@���u=�M8v��efh�O�����h�-�'d�/����OM�9r�����i?
@@@@@@@@@@@���S��<������m��qC<x�$l)�=\�pA6o�d�5m��$H� �9@@@@@@@@@@@@""@�RD����)R������2��@����>1{s��]�v����-�l�@@@@@@@@@@@@�H��iB�e���_��%K�-|����/_^����,Y�X�B�����[�(a��k����\��������������;~���}�\��u.#� � � � � � � � � � � �� y)<Z�}����+K�.�f��I�8q���2z�(i������]J�(._}�����������$K��I��@@@@@@@@@@@@/���1�*�*U*�:m�<D-^$[6o�������K~��w��E�&N����J�����4iR9|���>���)S���h��H�.]�NO�8q��G�9K � � � � � � � � � � � �I��<��Z>-�#gN����4/m�iS���1_��C�m���a�&�{L�6�����H�$����)��K��y�FT��� � � � � � � � � � � � �����g�8��/�|<b�|8|��m�6S�����O?m�����}};�� � � � � � � � � � � �^,@��_B��&M��9|��w�(J�(i�����#�S@@@@@@@@@@@@�$/����?�]!^��>/�)S&)_�����ys���{>�'6� � � � � � � � � � � ��)@��w^��&�����={\�m����������+�=�z��z��):d���O�>Mr�S:@@@@@@@@@@@@ ,�xa
��'Y���c��Ay�Ji����+_N�f�&w��������)�e�����J������S���/;����	J�����u���5_��!�������*U*����Qu���V�Z���3��OF������k��&g��G:$��������?�I�	B��� � � � � � � � � � � � �@�$/�I��'Y ^�������E_�Z�B�d��)��E���f���_;4h(���q8f����/Wm��I��M�PC�r���I:a��_LbR�6n��/�L�:U���k^4@@@@@@@@@@@@��$/yR��|N�F�������d�b����r������M���i�J���������R?~|������Y�K����m��
S[�n��.�}f��M��-+m��???W��� � � � � � � � � � � �8���jN{����/��J>��[��@@@@@@@@@@@@��8p�����!pnx�b$D@@@@@@@@@@@@�A��|��2 � � � � � � � � � � � �� @��/\%bD@@@@@@@@@@@@�H^���F� � � � � � � � � � � � ����K�p��@@@@@@@@@@@@ y�/!#� � � � � � � � � � � � �$/��U"F@@@@@@@@@@@@|P��%�h�� � � � � � � � � � � � ��/���W�@@@@@@@@@@@@�A��|��2 � � � � � � � � � � � �� @��/\%bD@@@@@@@@@@@@�H^���F� � � � � � � � � � � � ����K�p��@@@@@@@@@@@@ y�/!#� � � � � � � � � � � � �$/��U"F@@@@@@@@@@@@|P��%�h�� � � � � � � � � � � � ��/���W�@@@@@@@@@@@@�A��|��2 � � � � � � � � � � � �� @��/\%bD�(X�r�$J�@���e���:�}��^-���/hP�~��f�>}�����~���J�������n�a�,�~��P��o7o�,��<x�pn��������|���Z������'Z@@@@@@@@@� y)��9�� p��-�9s��j�B��}N�R��T~)%�|��k��w���M�{����b]�p����Q�b��.]^u8v��y�1���6[�K�$������N���|MLr����/���%q���!C��J��'O.�*U2�B�
�\q��=2n�X����*X�$��B�����^�������=z��\�p�>f�������������Q�y��}��Q#C
)V���o��q������������5�i���I???��u*TH�6m*����I':���{�������]
Z{O��O��I-E
6�`���r���(����k�����g�9�,Yl������sFt�n-�%����cwR�Y�f9����z�q��TKi}��+ge������w4�\�g�������E�����%������?�o�8G�AG��{����7+-[�4�Scd�'�18'E@@@@@@@@���K�c""�>�o�+������>t��?���c��)S�\�2U�z���+���{� A�����k���r���������|�iS��w�^N���qCd����+�j�v:V;���J�="��7��E��Kg����+���5�O?������UMN���#G;L�q�@u�j�����U�V��\��v��a��d�b����%n����s���p���������s)S��|3i�����}[4������t�y����y����D&������#s>o�;��1�F���e����W�_t���=:��~������1u;|��������-���k��0M^Z�IN�B@@@@@@@@@�c$/y���b��&�d��Y�~�Y�|�>|D�Y�H&O�*9r�4������.�$�%��mu����W,�jF�4M��2e�;C%Q�D������k��������,/^�����;h�8G�e��v��l�cH@��A�n������|&��W��]��_���+�����'�T�V�$bN�����{���,��D���/� ?��\N�9+�n��.��U�Q�T����={�>���]�d�������F�},w�<�\��C��s�H��I%S�L!�x� � � � � � � � � �@� y)V]n6�i�/��J9*|��T�Z�$,���/-Z�����H�)�)G���S��zw������2qh������k�y��0c��;�3a�������VR����y?h;u��|�����R���.\(.\�9rH���]
�/N�>#?����\6���\�'OQ����w�4i�����o��������xF��m��'M����,�\��~�8�R�J&�V����O/	&4�]�=[�t�|;{Nd�����s����~+���:�������XY��f���E�,=z��x��?D�����#��$�]X"G@@@@@@@@@�$/y�%b�@��m%~��4)�j�j���_u8���_�Nn��)���H����V�m���2U�T))R��h����?����g����9,�����?�s��������+�5mUR�6}%�J#�0�V�:d�T�VU�}�_R$O&�3e�J+��WM��%L`^���/}?f�WR�TII�&�d��^��++c�v������\=��}��I�6�%O�\�2Er������x����X������Lv]�l��f\��]m?�}Z��������4	G?3����E���n������S������GD���w�6�5l�H�z�������-"{^�`��?��L���+�f��~��/�T�TQV�\�p���V1s��k���v�O��f\��]��Hg�v��o���/���[K\�|��[c��!'��^��y���]>�>���m��I��-$��9%y���7^?/3f�p������4i*�O�]��f��m��J�fN]�7[�hP��,P@R���ti�H��������;�Q�1}��:��\�p�6u��`�����\����uK���s��E�,����e�"�^~Yf��fE�C�J���$g�����.�=*X"����� � � � � � � � � ;�?�;��.�R�t������������/^lN[�f�`�]�t�[�v����;6x������Gz�|��`�0�r����>,�wkiU����]5M4�����
��\������b�����d��-r��yI�,��4�c����R�XQ9q���e�}>��������k�t-}�|��	a��~�:��4w�\9{��hE�3g������/Q.�qk��&M��8�N��4M����_L������7���>�?}�4�}��o�Qj�D�%L$�W�����{��
w�juW�]��=}���9��'Z�����'�6nM����d�����A���u���Z�h�\�~=d�y��s'��k�����L�6�4�~+�?y�7�Y*����}l�����������	�z�����SG�����Yk��+�k����!������SK�������6n��������?��/zM��������l2d��f{�M�����J�r\�]�X������o��E
K�^�d���r��US�P�&�d�N;���S���c��R�|yk��D�4vM0�������� � � � � � � � � ��M��%>D���]��������OZ]H
�+   <�s�>�����I��K�*W}�_��*Ea5�D��j"�>��n�m=�={v�����CM�T�w�6����+�j�s��[����5Q��U�����F�%{�M����^�7o����P�B��J�V-�Y�T�Y�z�t��M6n�,�O��������f��r
M*����d��M��<E8(����n^)M��#�S���;t�h�����!jGm��i�pA��B�����q�749��UAMZ�������DY�t�=~��
QQD��ZiI�S��[��c��q�<A�x���u���-�4U���}��EB�>"{��&T���K
,/�%��X��5�9sfSQg���I
6�T�R�$��s�8�O�6]�x�T`l����1�=��[`U�I'���#��??"�1M�������~��7���Kr��������wU�Dj���V������������u��g��������B���9K����l��U�^�.^�h������I\���Z�je>gA[
+q|����W���Lw�����1c�8�����\�������������+W��7�����Z��.��}���wW-9r��7��VRsy+�I�V_��U�����1@@@@@@@@@� y��������V����k�y�5 IDATl3�O��Y2����M��_�������K�8qb�h���k��%��2�:��o���y(v��q���K�$����sl���2x� �e%��z�~��[����T��zhX��jZ����;�{���dM����!�i�5������Ca-'�W����'X�~.e��6}�������,X�r�V;���Z��Z�l)�r���U���3�n����#�&hR��iS�����U�\^2���f%�i7���h>��(
�������M%��l���?`�I��p���*�4��s�~���o��2Ee�Z�N4��.]`U��+���4��Et��5u�0��O_I�2�I&�����>0C�����m����ysh�����lofL�a���Ku$}���D����59T��-]�$������������[$o��2s�,���M�/�������o��Z	�U2x�W��������	o�4
���~��e2`��`I}�=�$�)�oo��Y�=���������a����(???Y�n�4l��$�k��"�~.�?{��T�>p�d�({�.�Q�P�
��,{�w�.������l(S@AP�%C���*���%1�I��I������{����o�9��Y�L�5o����7��h�	*�y���������G7o��
V�*g%>����8� � � � � � � � � �/�5b�A(��������u������A�
�S�=D��K4d+�,L�<^�6}��5�@�f�������������z�����R�H��v8s��)�.{�����R���$s�����}�g��V��tqP��VF�c/z]O����6o[��9sf�nX�b�yH�<��1���s�}�	h�2
���{�l��)��H3�������!��S����6���M�
*X�l�<��SR�z5��7��u�&;w���t}�_\��8x�~Q�y���XL�r���s����9�^8�X4��f��v�9_��{{���T���7��f��eL����	��^���c]�z�
�q�]�}�����ys������d[�w�>m��gKt��&M);+�'�-\������n
8H
*���9�.0�w��&P���o�B��C���o@@@@@@@@@���K����r?	���������'�L�22�������O�v��W��_}��)����6lxG�����_������>d��f��k}�
c��5�3�)ZT�{n�����=g�f�"xI�fL�.�\�),Y2g�ti��_�l���c�GS����V�Y�<-���%ip��i��c�1=*�T�-L&(J����X{����>M�J�U8�%g��������5k.{��*.��X��M���_s�@�������z�������y|�l�*444�����c?v�r���t��R�JSg��iw��;w�	�`��
������m+�I�k+����{|�u����}L���2�U���S���CM�.-���h��J�*��9s����V�z{�F��>�n�Z�����.UJ��d����j������i��_�e��������>�����\�o&:�N@@@@@@@@@�D x)��8)
\�~]��i-[�l1�K�,]&l����]�����fI�LK���(q�=����������1~�w%BCK��Z�Z��M��k�[�ny������Cu�����j�J���>�[��<e{����f������Z
[�4[�'%����5��l��5}�t��g����+W��aa=<�
u�H�[���!C�{X��Uq�a�Wc$V?�{�?����W��G}L��}_�n�^N�>#��`
����e����f�����1�/�����3���1����Y�e��+���������=�����#��zo���T���c��f�k�z�%�h���������qO����������e�9s�2����_}g���kg�#-��������������i��~\��/ 5k������3jN���p7V�s�og�����bs�������}�>�@@@@@@@@@���gO�'}V�@�n��!��7},X��T�R����~�w���N�:������������V@��<`e�D����5����^��V P	+��^��~���>;���������>�
*���	D�5{�?qR~���D�^ce�����I@T��<�Y%}����y���i��`%������b����EIZ�I����i6�I'�\\��)\�sv��0��s�~�q/�u;��k����s���U���n�)P����D7���r��/�����m�H���E�j�.]b��s�N��*
Z���������f]�{h���&SV|�'�S��?�z��y:W�Yl���m�I�����'��p���6fxx�L�4��}�����c�e��?������-j��i��5���S_�!� � � � � � � � �$}����5f�	 p�����cGY�|�y�{��)T��_F�5s�.T��WX��>���E_���LS�_��������������������K���s�6���A�������M��#FH����1[���2_����Y|5o�q�}%M ������l�/��u\���
��43�2e�����8��z�����7M�.��n���s{I�\QZ��0_���s�����C���������?����4c��i�e����u��3������ ����������f1��8�=�D�\�"3gFe}�Q�:�����s�{����%G�1�l~]�v�j���c!����<s�������:�-�e=�A����3�m==ne[���Ysy���M�\�r�����}��y��;v�'}�	 � � � � � � � � ��^r��9<�����:��%�%��&p�H����*G���w���:�=�})����-Y���Ev���d5������!��V6�:q�D�L�t��eS�B��N��y�&�m9��}9��af����;�g@��t��A�D`��'O�������`�1o�L�y�-[Vj��a2�-X����;�\�*�����l����c��,<ZJ�,i�2���sM�:�y{�]�����L�5{2��3��^!G�������������>|Q�����	�'�����V�r�LT�<��5������i���W�����G�M�&��U��z4��<�����e����������t��9W�L�u�r����M�
+8m�cj�/OJ�TQ�I�������6��j�Vy�$ �����������#�B@@@@@@@@� x�O����.�;�f���/�����b�����������i���@"���_��-)�\�X�x�9��V�V�iE}��f�Z������5�@+s�f��4iRl��}���a���m�V��i ���~'�Ht�o����>��/���Sg���o����SO��4n�����_���X�'c~6a���^���|�
O�D�@�w������Y�}�X���n������^moZ�LYg�$�c[�~g�Q���������_}��d�sU4P�p��
W�yr<�k�dO�T�XQ���}�n]���s���4i�Is��y��GL��l�_��i��WkH-����f�����bwv����_u,���+P�s���kr��!W��~<�},}������yL�<�d�^4XL��yu�<�t��g����u��B��=��yR�����/�?
T�e���O��^�p��)$J�~}����W�\�(s`P@@@@@@@@@�^���Z�����v�".����=g�d�bjv�
��<1��������48����Y�����������~����t��O�i`O��5o�q�����Ic�y�����
�q��-[��������t�������5kff��wQA��w�������=�����7�	�����D��� X��l--���e��'���k�j��O?%��D���3gD��{�Ys�n�zR�X1g��c7n�p�o:^�+.�;��u+���|�^�4���
�\c|O�w��@�{K���C�XA-_��s��������s����k6:-��D]���9����������g�^��m�����>���o�~fHw���oZ&M�he�
7Akz�?��s:�E��aOJ���L5�Z7f�h��=������%W�\����?o�`�����{��=?�y3���{M@��>� ��c���?�����)Y�d��T4lh��k4i�D�wj�}o�������x<^��+���6n4�S<)/����F���^�GL�=[������u��k�V��>7@@@@@@@@@�+@�R|i�l������}0����H���\�3��/.�#l���tU�n]�]�����f0X�|������J���u�xT��z��m��??\b,{�������r��)i���d�"y���re������G���V|9�=z���;wni���_�;��;�%�go��m��>6l��y\��d?_�`A�u}q2X��l��q�G�����:�=!��iZ�}���)]Z2��Q
�S@����
8����V�dg���V�Z�r��]o[���EFF���j�������"+�S���e��Y��;�����S��`�
�K�|y%s���Dhq	��5���y���R��N���k��4KM���]v�����{�Wg+h:�����K�L����[�.�;+k��V`N'���B�
�W�\9��-*P��W^���I�����+/�������o�:K�,���r��6�\����d��i#G�2#j@z�bE�w|��9L��Hj�����/�������� �
���Y�^���.�������1�4�H��/&��U5��=��N[�S�,]&��s�;vL:v�`>+���1��:�k���)R8m5c��$�w| ��9 � � � � � � � � ��*@�R�^9��@,[�����#���J�,e��b����t�I5���ec�v5 �]��l���t���7��`�7���^���p��>��/��w��4��>���B������Re���A�J��)e��i�`�By��&��m����$U�V���yG���w�}�T���3��z��-�R���2}��.[�B&O�*�
(�t:_
r� ���?� �����k�vLw�����1U*U�$��@��(z�:w��v���Ce��u&�N���Kg�d��� |�����O�7^F�)��$�>}��"/GF���~g���
=����;��V3%d�m����/�]�^Z�l%y��1��j]�vm��p�W���E��t�^b|u?��#�;'N�$�}6����:�[�A���I�����f���f�rU��//;v�$�����VFJ������������\��X���=+{��1��o�?@@@@@@@@@ pRX�7�[�;��3���R�����X	I@��?�����5����������m��I�ZQ���'��ie=�>j�H�\��l����f���ok�-�^]�{np��L��u�	a��17n$������zZ�=������'��������#��e����O����-R�dZ�l{���	�E0c�����n��i�z�&�R�JZKA@@@@@@@@ ��8"K����m��y)��E��R����h�W�}��@�V@����7����.9.F�?4�_���{�Y��s���E�hhV�`)�:�`�u���/�d�L��2�x[F�a2����k.y�d�g��a�4[N����l�L��'�n�Z��&M����./+B@@@@@@@@�$(pW\KB<H�:��y{�4o��
>xE�.]�Q��Vi��Y���_�e4(���|��l��1���m�~}T���!/J��m�h��u�������8&w��%_|���)SFz���Y�4�v��!#G�0�����d��9����H������)S�k��'���@@@@@@@@@@ )��e����@_��_H����>M����;wJ��-$22R4�HK��
�,U�%E�(!�I^�T��y���;w���@������3g�$�v� � � � � � � � � ���{���C=�N�d*�2���e#���~���8qB�\�"������~F�������S ��N?n�BBB�U�V�n����%f5 � � � � � � � � � �@w%�8� DU�T�k�o���* �[�K�QY�|�+�!� � � � � � � � � ��O��K����b@@@@@@@@@@@@D���af@@@@@@@@@@@@���K����b@@@@@@@@@@@@D���af@@@@@@@@@@@@���K����b@@@@@@@@@@@@D���af@@@@@@@@@@@@���K����b@@@@@@@@@@@@D���af@@@@@@@@@@@@���K����b@@@@@@@@@@@@D���af@@@@@@@@@@@@���K����b@@@@@@@@@@@@D���af@@@@@@@@@@@@���K����b@@@@@@@@@@@@D���afT��+WH��i�i�&�:������#����A�zA�.,`���bXU�V����]�&�����Y������8X�vm�{Q����;o�p����v�6�����Bp	,X����������- � � � � � � � � �	,@�R�3\��z����5K:w�(%K�'Y�d6��K��~���O?���m5����9�����.\�v��k��������������9w���c~��!�����i;��)�'��k`��r��M��`I�"��1�]U��@ S�LR�vm�*W�����G?n����C��-+���5�5����;���*\��Q�������C�����?�����������6�3g�����E��r��!Y2g����W5j(o������J�0��9s��!.^�h�?�?����j���y���<jl���w�w��V�m3�O'G�q���z�z�I���r0K��R�zu�+w��w��)�mCCKx�6��Z����~��xb��e|���:z��o���^|���;�w������U��_�x�q)U��}���}����@0��� IDAT@@@@@@@@���KI�*��D��D�	��r:$��D�M�M�j��L*I��X�Bn��!i��1K\�h��K�.������s�K�"E������������e�����&M�Z��]���|��8�_�7o!+Vt[���(Y��D�^c^��������k48p��}r��-���d|���M�Q����^V7�M�b���/���7z�>>
��l��k�X������&HI��_�.G�
���k��j��+W��gj~k{��I����{�������Wo����������+&Lpv�/�*U�$��o��?�����J����/�q[_VL�k���4�T�>o^�C~y����2jT�/��N@@@@@@@@@0����0���`�|�����>'����}������"S�N����6/"��O�e�����h����f�I� ��S�xRU4��;��c��Y��g��vcF����OK������V��<�;�������jO$
�������i��&�,��}�]wI�=�U{��1	z���N�8!�Z��?��S�+.��L�����W�����++�k�n���bVj����s�=�����M&P���}=�i��� a�g�q��^�{z��5wLR���Z����@@@@@@@@@H~/%�k��}(��G�����7��G��5K���J��%"b�d����6����}I���Z���O�t��p�fR��hf-�}��h6
O�c&��!FV��G��G}h��ejr�������SR�P!�]�����K
^���-V����C��)S�D���C��;v�$��E�~������C����YYt44[�l���7:u�d�4,w��&s�g�M�_��
��E�S6l$�40r��TK\�n_Y����/����j���Ob]��m��%��~��.X`25�k�.�H@@@@@@@@@Q���D�g���� �S�v�
��[��9�s�N�u����uk���+ZB
)"
n?�o{�����T�,*T
8Z�|���w�{��w%m����>?~���
j2r���=78�>'M�h��m�NR�H����[�������#FH�zu����9���/o�]���3�X�+����K���"��/}��'K��J���$O�\R�z5���N�y��WM[O��?�,��v����J���$�x1�������q���d�b��:�}v�jU��zp:����`,�0o�W�vm��?y��a��~�����z�a��3��y���_4�T�
���q���.��@+c��r��9�>��~�u�t��Y
*h��re�����5�.z1|�i������e���z��3��|Y��w�tMs�����I�|y�Z�p!����l��9�i���������k�`���B�3W�q_vU'�'��*Z��<���V������le�����R��-]r���~/�h�\��)#�B�J���B����3���fpVz��i���zj�'-=���q\�
y�g]��;vL�����n��+�d�;��-.a����u������V���
�����Y�N�Z�r��X�Q@@@@@@@@@��.@�RR���/QrZ�j�,(I�,���~��
��l�.]���������_sh��;����s|_�xqy��g���G�2Y8�l��E�����{V�+
prW4���o�1Uj��
rW_��U�����(��i��<yR���n�ij��m���/K��+��C��uc?��?K�V����?���	|��4�a���b�c���&�)<<�'h�}�Z�����@���[����=c���.��T;v�0���z������}�#"����{q�n��i�u��O�/�/_�\t
�����y��#��5���������f�V����AMzk;
��=%z�&)S�4���5k�����9c���A��R�@���z".{�:��2��@t���!��~�p��W�y��7�N���3�
u��=��@b]����� �+��I�w�f���~��:��u���Emw��o��\���4��|�r�>W_��{���i{������;��y
�rU���gM��~G�k��5�J���{�x����he�l���|�a�Y����u��l��5Q@@@@@@@@@H�/%�����.�����"U�V��X�]Ht������#���|YT�$[���u�H�t��C���(������-[6�@wG��y������d���&Pj�s��jM�4�F�Go�����L�#�����������{o���k�\��,'�8%��\��������G�J���<���2^4��_������r��+��'��{�q��_�%�{������S���={������+�,Rmcd����{��i��^�����������V��x�Y�%�@�*Q{��={���3~�E\��
�+�y���K�.��]u������3GSE����b�\|;�S���d��Y����5�Ll���X�U#��7�����kX�LZ4�����E��z���C��O�����,�����sZ'���wkv�E��2C�be�;}���:}F9*���-�]nuD����L����z����9�P��q2=�X��u�6&�n~�|#?~����AM�J>+�����d���VP�%���i�}��/{������t�,�O����������k��,Y���/r�q���o_�S��@���cT�^]�o�Z.^�4s8s����5�d�t�M;� ���,�Y����m#"V�f�����J��D�DBB��=��'��BVV2=�.���B8� � � � � � � � � �@�
���i��>���t�4�g�9c�����W��]}6�v����������K-+����m��T�w���<<~�xwU�8��:����9��gd�k��V�����;�x���G�������J+�����d�������l-�QK�
�[�D�^�}�~��;�X�J&L��
P��;�����W���`�B��5��f��le�����-VLt?����9K�6}��>>����5�C��iQAJ����y���Cd]r�	�����vzm��y�����z�	�Y��5�f{��7d���&YB
�@��
��4����W��Q����CV��
�ip;��������7o>k��i�15�R#&O�b��T��
��^z���p���pg�<�XG��7nH�������Do�������}��?4c��������<y���������7�G�~�����^�A�.����Mr>�X�J3��o��+W�O�[����i��n/��%KMp�c����uq��=���to���r;P���=���f/��W���j���������M�jeZ���y63�N�`�^"<�Y�4�{����h���U i�Z���3gn�w�����3���o�B]@@@@@@@@@V�����4L,�4+@�~Q�w���[K����rb�����>��G��-���Ib4�v���A�f���U�B��-L}X����4�>7x�.R$�!��S�O��g��Q��*�,Y�d]��o���������(��/��������^����6����}i�������X��<���:v�>
�'���g���9��%����h�2
���
�`�F�J�<���G����s�q�{���r��U��)���m���I��i:w�w��&P���V�pas����1�kv9
��,/�lm��:w�b�H��x�w�y�\�x�L�o�~1����zEeT��P7FE��~��X�4@k�����p,�@b]�����,Fo�#;v��2#6��3��>����I�F���������~�����#G��Y�,[��������q���d+��q� � � � � � � � � �$�����f�	&�Y&��k+'N��2e��x+��/K�>}���^�~��/� ��,6�5t�8���������{cS�o�����0{��X�;V;v��l��H����s�=n��9S7��K����\�),Y2g�ti��_�-���c�GS���}pZ�,yZ�3o
J��4
��`%�2czT��-Z��9���{�Pw���N.>�A�R�Lv�M���!C^��V@�h��uk�J;+PE_�H����#u�����|���Yg4��R+;����t^+8I���1�Oi@R�.Q���O�vG�]�v��.Z�z��q��o�����g3|��i��������iv9we������I�bU�k�\�%��jn}7h���FeDl���G�@�����Jiko������e���>"/G}�z����n��������)���=����r�r���:6�@@@@@@@@@t���
1���lm���-[�H�b�d��en�/�A�������>l��2-��Q�����G�f_��?*S������
-!���3m�V�b���h��'�����Cu���)e�����_�>�����-��o+�"�R�
��k)lee�L%����;k����eK3��i��C�={VV�\a�����d*�I���]6��N�W���>(�
.����3g���eH��E_���F�w�>k��?����Q�|��@D���y/^�v��9s9=o������:=&zM5Pi����:��K�'/�<0J+/X��!�A�G�q:�������_0�5k���+g���!�����p�c+V�*�������q`����d0_+
j�_����X��e%s������L��y��Y��%�R�fM����s�����q��e���7_�lh��;;��O�2K9f@suO;��c � � � � � � � � �$5�����X�%��A:�o/kV���Z�jV��.�����K^u�.]:�@_����{ ��J�bt�S�h�^�|����"���W6�_��_�������?�?$o|��������@4����ysq| Y����G��?o2��V2��[���iO�/������=�+i���s���sLf�b��K-+P�xz}.�����E��/f���@���������Z���Kd���&����X�z|�y��;�������g�y�����e��_���]��q]���y�!�_j��
�7���ys���(���{�����K��d���2~����ukO/]�z���1����VO>�����W*��`�0�+���&����^~Y�����g���koeo����}����<���c\�D@@@@@@@@@ X<K�,�a�$��>8��cGY�|�(P���!�
��lf��)���������YPlE3ME�2l��]�?����o�~}M�q����k�.*h��?=^��|>��?|���|��%
(� �@*���f��������[AL��g��a���= �I�=P�b������<��/���� ����mk�����8f���?����=�bET�2_��g�^��p+C����=z�����e�Vr��
��BVf7O��{wH���^C[`W�1?�!!�����������f+�l���1���2=�W2���� ��?�Dz��+�~��4k�\^z���Kz���?b�'.r���M��']~F��/m@@@@@@@@@@�?���4 O}P�s�N�d�b��?�	\*R�h<{
��G�?(��t�����b��d�b���k7��H3�?~��6��T������'b
`��$[�
*:v��Mb�rZ!�r�a=��
�O�.;v�0�
����k"���!O�<)H���G�z�8�k����>�J���J��8N6u��DF���<�T�)-����t�}���6u3Sy���U�5k&9r�0��[����Q��;t���P����L�2f:d���?;���~�/]���:�5�O++��qV�%W���w�S��]�����~����\H�6�9u������<�6mT���W�o��S/O$���t����n�V�X�i�8�s�N���L�*�9���@������\��9��_��������������@A@@@@@@@@@ �^
���\�N@��t�,�}$_�|�*"B�/��u������������������-Z��4������9�J��Y��9g��������3K+s�f��4iRl��}�z���I��mu��U��&��������7^�q<��r��:u�����*O?��YZ���J�<y{������	R�z5�z��7b��T*l���.U�������K�����A4��U�u����5�����l�b����/_��=[�#u����^�z�\D�*8����;z_jy�{V��J�w��Q����U���5��mY�d1]L�0>FW�9i�Ds�z����)F�h4��������Lc&i����7~�����'F��4���}��*����(p�������y��gu�Zy�������3z���R�,Q}�0�j��R���f�W^yYn��a��^4O�������}�re���se^ � � � � � � � � ��O����w�Y��4h�k�.�p�����9s%k�9w���W�e���-��'��P8��~����f$����������������1
�������m�$`��2|�k���5�A�-��t��v?����5��fz���w���u����Gu������7o�������d� P��i�&3�
:��O��w?X�b��*y��Y���V`�fB���3g���u��i�&�l�R3W
��b[s�L��r��n��U�~sX?�k��qV%��z��a���bH[�B�J����>}zy���3��2y�	"�r��y��)�����Z^xa�����m�?������N�-V��	����
���n�L7j�H+�k��v�6l�����1cFsO����o"�y���y��W��Zy2�
�����p�4q�����~?l�Py��w�Ap��W������������2:�k�2eJy���D���m�4n��|�����3�{T��5��!�]�C@@@@@@@@@��/�4�	���|i�^�pA~������+��-x�*i@��-[L��n2��y[�}�{����.�bj���Q]_T�����f��p�-����������6l ���H�<��\���zu�|����|�_��G�������[5j�������{�����~���
�v�"/��,X�m]_�����3�������)RH�^�]�����/�����h�Z�s��i#����������2{5�5�W�a;t� �=78���0h�]���N�����+'z�hY�(����q<q���I��A��E�n���S��y�w?����IS3���^�<�s�=�H�B2o�<s���_�����<�Q���c�:|�SGc���%Y2g2�k�Gk{[��]�Em���+�#{6)T��z���������x�TY�d�������A��,]����\b^���0p� |����
���Y�^���.�}�QA���5�	�����#&@�����z������9m^�
��<e��K�N���y�Nm3�|y��k�{��]����������T�� � � � � � � � � �/�uaV����K�A>�<R���J�,%
0ul�J�6�}r����K���o�V��|��YY����+��-[��.V���y���0��H�~�^���@��>��/�]����Z;v2�C�LYZ4;�>�������Z�^=	
-��%�b?>b���d�h�f��k�*U*�L=�1��:� IDAT}���t�2�:mz@|�4���_~1���}���8��<�/[f����<~;#�f�kgy%V�m���r������SD����3��K���Ys��X-/��>���j��-e� Rw�m��Vf�9�3��)�5���rU��9o��q�e����x�P�y�����y92�n��c��U��4����Y(!Kb]����1cFY�n������I���U��������&�����G�^c��e�&G�6���u��q��h�����g�yV4XM��f]*V���n��
<[*%J���}b�8{������LA�1�����c#� � � � � � � � � `Hq�*p�_`�/�Tha�� ����~ �l��?��v����m��v��f�;�I���������G�)�+W���6{�.�58@��h�������uif�R�A�Z�s���7oZ�e����& $!��y2?��V����J��U���
3s�l�vNo 4�[��]:w2��z�&�R�J����"� � � � � � � � �@��9pD*�
����
G���9$W����$+���E_�����R�J��"�u�����fs�&p����{�J�����r���;�������n�:�<O�<2`���t�`m����M0���w���6u�	\j���K^�W��{����3��={���-�T`����?�6E��Oi�@@@@@@@@@�G/��n@ �R�N-c�#��5�W_}E�.]|�H���5K���K3��A��<����e���qn�m�������yQ2d��m�D����8]�vM�z�MI�>����[�2M�*��_?����K���~8afH����K��)����r~L
@@@@@@@@@�����`����_H�����@���SZ�l!����AGZ4lhe�Z,)R���t��
��.���K�����u�]�rU���FA@@@@@@@@@C`��#R�thb��A$�2���T@H����r��	�r�����_�~�	�O�R�3���;'����K��,�X���%gPC@@@@@@@@@(��j6L@  �T�"�����0	�X�d) � � � � � � � � � �������1a@@@@@@@@@@@@�C�����N�@@@@@@@@@@@@�� x)�.F@@@@@@@@@@@@ 8^
���,@@@@@@@@@@@@:�����1a@@@@@@@@@@@@�C�����N�@@@@@@@@@@@@�� x)�.F@@@@@@@@@@@@ 8^
���,@@@@@@@@@@@@:�����1a@@@@@@@@@@@@�C�����N�@@@@@@@@@@@@�� x)�.F@@@@@@@@@@@@ 8^
���,@@@@@@@@@@@@:�����1a@@@@@@@@@@@@�C�����N��$�r�
I�6�4m��O#����#����A�z� ��-�7������k��]�>]Zy�����?�x��J����kc��owh�>�i����N����7��T.�s���������k��@@@@@@@@@ �^J4zN
W�^�Y�fI�N�d��$k���5��.UJ���+?��SRX��5DFFJ�Lw�b]�p�����W�`��i�:���+<����m�\9������7o���K�)d���q��F�d��Ij��m^���w�������I��=�\��&H$���m�/
f�u��u�V��r��){�������_��������r������������A�2e����Y����������m���?�,�&NtW�/�����Dt�������d���I��������	r����������������/2�J�*������1����>�h�J����d��]�;������64h������J��^����;wn����Q����%<n������3��3�����~�����1Cz����v����/D��.]�m�D���� Q&�� � � � � � � � � �q�+�-i�ro�P������}��1CF���<��3��$��+V��7nH�4i���-�-Z��>��c9p`��s���f��:��%KJ��5M�~������V�u���{��U+�Q�������5���q�F�~�:��z��WE��M��k'!!!^��O����~��}�E�,9���_����,Y,���|����L�om��f�M&�:��'��S��R�J�n��X�=m�T��N�*�m���#=��{����k���W�^�
t,�>?A2�}i�C@�=,L�4i�KR�B@@@@@@@@@�'d^�	#�$W���/K�|���g����W��}��g+�����P������1�%�bY��+�����r�fE�����f�����)'�9j@�>H���:mz����m�q��KV���.�X��R�^=9��L�������5#�������~X�-[.�;.�"/��.���7h`2�j�v���o���?����M�d_7���b������1������3J��yc�� � � � � � � � � ��I����t�Y��>��c��������H��&`�x�P����DD����3�1������N��_�neiYe���?���/����N��y4������SR�P!�]��Gm��pG?&�|�E��}_:t� �2eJ���1R��;{���5kVk�Z%���@�k��KW��I'����� q��}�3���k�`[
���+��M��|w�}�d�R�3w^����A��fo���E�3S?��@�Z@�'���j��J��E�,��u�ns���D���4i"�3dH3&� � � � � � � � � �@B	��P���$�v�&�S�v�6
��[��9�s�N�u����uk���+ZB
)"
��ZI�)[���m���iDF��#G�������%B%s��%_�<R�VM3f��pW4�I��i�+�
����|��T������M���%5�W�q�:H��W_5mu<-?���t��E�+*Y2g�����{�����[3�e�b��:e��eI��UL������I�`�%X��.]:� ���?>�m�M�65�U�=jt�L�y�e���}��[���$eJ�?���+K\����fN��w7�e_|���={����������y��
��3u^6,���~�}l��-��SG)Z��d�;���o�����9�m`�f+k��������}���ys�����w�����[�E��R�L��Ur��.���g�yF�9����3��Y����L�iS��q\�U������W���~ ��(�?�Y�=�K���Y�f��Q��_�J�.��p����H��e�������n|�!� � � � � � � � �$�O�&���J�*�3WN��T��:Nbt�h�"3l��
��w��%���}��7f�5kF�3���?�V�����d��Mr��I����M��m���+/�,���(�r�������-�[�2&���O&�I���'N�,�>��]k����������I�;f�����@���[��i���c���.��T;v�0���z������j��������
�I�,5`����DDD$����5#�Lj�p�B�����x�f_������SZY���O�291�tc�u;�=y��:&PL��5 ���K���
��WO�����Ui���95~�������-[6�_?*��Y����~�X�\����8�AM���=�����dQ��r��a���cU;��+�������b�������q�F�p���t��I4�W�2}�4���~���Q�Z�|��9�����d�/��F@@@@@@@@@l/�Y@������^������7S�v��y@��Wdd�7C�ZW�_�l��g��T�N�����_�R�e��M�A~
�x�re��Z�By������]r)������\�rU��[/���3YW:w��Q_��&"b����_6|�Q>b�d�/p�=n������{I����)Se���r��a������
8�59����G�����[����������e�,��pV�c�!P�xq�oeP��������YV���oX���3������t��2�������}����K*[���4@CKHH6��B�
����>.kv�a���?*�������	��'�T���i���_4n����N=u���9{N�x�M���|�2y}�(��*oeJ����d��_�����?� ��-Z��������_�&7m�/��N��������o�.�;�������8�z��U�Vms�Q��w�:�|�<���^{�i�1������s��������5k�^��n�_|q�4j�H����&�m5�����h�%�����g?p��@@@@@@@@@_�����F�0HV[84���A��l3g����y������������[9s���O�^jY�W-�/�����������
*�o=4�Yb+������d�����d
����!���5���{��_c�N"V��	>���@�Z�m������+i�_�`�����($$D6[��:u�$E�]���<"3f���M�����5�@���L���81
��7o�9D�%G�����P�e��q����}������{M&5����/���	�8u��T�2��j�R�}����lY��9o�V����3*+a�Z��{
�pW��fw}�9��58T��-Y�8X�����v3f�	�)Y����=�|�j��K�<��<������	�]0x�vm�o����I��y�M��Q��'e������������aM��{(`���5j�	���5��Y�NZ�le���hp���K�.�f��;�y���y�Y��fJ����ZB&O�b~��yS6X��������� � � � � � � � � �@�������>��__3���[K����*\O���.i�����0-
���S�O�)g����"�8S�d)��9�i�o��X[V�VM��(��c+�G�����'�mmb��-���9�c7�X��<��:w��1�4x��56q�w��M�6�*~�9��3�2��z6q�{���7V4�`������OI���$_�<����������Iq]�O�N���
*7��BO.�7�����?�eL����	��^���c]�z�
�q�]�}�����~��|�l�����}�l�����I#�og%�����1��=`�����I�B��U3�r����\�>�M��c)\��*\�:t�����@@@@@@@@@H^/%���j@@�mo���O�8!e����V�_��}����7�z-��+_NA�����a�;���?p`����^�������=g���E��f&�1}�4{�q)Z��d��I��Mc��1DF^�u�M�>�Z4[�fY���g����i���J�e���lS-Z�0��(IC@��c�1Z���4i,*V����9{��#�g�m�������,X�P�`F�7�����W�*����_��������hm��m+�I�k+����{mz7o�1��f�<V��N�R�x�d���������fK�T����3GN�<i���gjt�F��[�V�w�*�K��l!Y��m�A�Z"/G����s���_�v�4����Ahh���y��1��\�o&:��s@@@@@@@@@  ^
�����U������Mk��e��^�d�2�`��Tv��%G6K�eZ���D�{E���Z=������[���������Cu�����j�J���>�[��<e{�N������� �R�h����<_��f�2�g[w|��5kVi������i��s:kg�\�����r��N�n��K��=������0��1����������{���>&c��/[�}/�N���V�������2l�PY�zubQ��k��ix��'�F���[�y�����M����&��K���s��n3gD�:3�~��}�������r�����}��Q�����_}g���kg�#-��������������i��~\��/ 5k������3jN���p7V�s�og�����-�����-��"�y�#� � � � � � � � �$?���O~.��n��!��7},X��T�R����u?�5��N�N���u��������b+��V�2h"���G�����<�<�*������?��h�a�����o�f��#�O����(���_�2e2}y�!}��uVI�J<-��wX��f8
V�LZ���#7� �b��K-+����4�V;k/�l$�&Nt���)S�<����avg�����^��v��?����W��V�Z����@�f��\w��]��X�����f]�{h���&SV|�'�S��?�z��y:W�Yl��m���^�{��O>%<�<��m���p�<i�y���/�����n+�������-j��i��5���S_�!� � � � � � � � �$}����5f�	 ���:v�������W���B�
�e�Y3gJ�B�z�u����,Z���/�4�e���o��]�?��q}�Q���Mwz����|�|S����uk���������2@�k���5�}��4�,�g�2S�e���]xp�W+��0`����)�M�������������4}����I��9�%9sEeh������f��Y6jd��o�>L?N}�s�q�������v�F������I��{��\�rEf�t���13����8�i+�V��9r����u����i{���d�f�����.�?w.�\H��u�����'2z����d��mIK�f����^���S���~�'�s��c����c>��N@@@@@@@@@p'@��;�!���ut��I�,Y,���7�KE���e�U9r������L\�����K����h������V6�:q�D�L�t��eS�B��N��y�&�m9��}9��af��M�;v���pu������� 'O�
�����Y�c�����.[����Q�dx[��K��wG�k IDAT��jT8+�{G��2�9���v��e�P�dI���%!����S���uW*,��>b�^O*�����>a���x2f�h���3Q�������{��6mZ���_W�����i�D���}[����'������p�������~; �.]2���)��N\;��iV�b��u��;w:=�`�TQ�I�������6��j�Vy�$ �����������#�B@@@@@@@@� x�O����.���������8�CoC����H�@�!H�J��X;(��`A�,���Nh~H�&"M����)��'��23�$�df���f��~~w��u��i���s��+WJ�"E0c�C����0h�Q ��n���fK�}�=,\`���j��;��;��U����;����5��[���[����"���� �f�x���\�����w�O�^�����?g����c�3��������9a�xy�Fu�6�}w�xEo�w��}��x��Q��@����N~_�j�}h��eM�u[��h�Q�n�D;OB���?_4K������SOh8[�������5|������9
�s�u�WkH-�o��G3�]�~=F��
�<���i���qZ�7o>�t��
9|���n�^�},}��R��G�>�L�l�F/,�E�yu������Y�f5c��B�����s�d�7�173^j�b�v���c�|�2������l!Y�������|��d��"� � � � � � � � ��'@��{N�B ���t��Q���'AAA��W_K��Ar��9�/o���@nT,\���I����5l��TkF"g�'�[�n9t��w�I6��w��:������H��������ui���?�<d�`Y�n��!n}��e���O?��p�@"5zr�!!!��ys�������s"�<bZ����p��m��F����Y=�����������C:j6u={�4j����f(�kt�����^z���o�@
.l���$����~�R�A��KKhhh\���oB���P�����AVP�z�uN����O������u_�ltZ�����q�`"tN��#oI��~�m����QI�o��9�[��g/3���R�oZ&M�(�g�6Akz����[y��W%s��n-��Qc�O��
����g=����={v�<p�@{Cg�������������g�m�
����Q����M{o+�3K�,�jh�Ff.�F�&N4�N-�y|���d����^������6���S�|�-s�4Sc���L�=[���w��-��M����P@@@@@@@@@H��K	d�}+��_�=�h���u�H�<����3��'.�#l���LU�~}�S6����f0X�t���+V,wjes�e��>Axxx�c�U�}X���>����3g��X6b�+0-��:uJ5
���$W�R�LY�j����i����}w����x9r�����$�q�����>{��l#��g�����}\�lo��?����h��};:�f������Q�~���SO=e���#�K���L%������
@,^��D1��p{]r�\n.��VP�9������87{����S��`�����'w.��I�-"]�`D���}F��X���%w���#�a��o���1�
"qT<���h���=mM�|���/K``��\v����fe���
�� ���k����Z�l����sD���o�%!K������7�t9�f�y��a���E%G�l���
#��\N��Fw�c�1���C���^�p!��=[�	���5
4z�2�d������o�~��JP�,�3��O
\R{w"[�nm2ni���;�h��R�z5�z�[W�����E��H�|����c�T�����;WN�y�S��	L
p8�*5c��$�o�7��= � � � � � � � � ��*@���^9��@,Y���S�����%J��h��2g$�vc]���A���WE��y����zh<W�\&��f6������k�w��#9�<�o}�����SL��/[
�����J��}k��!8+)R��)S������������gC��T�VMF|���he�������3g��=����L�2Q��������d�����
P��2�@��� 
R����l��]����(g����8s\����z��~����)RTV�Yk��4�)]�t&Hf���������q��q���������O�6��+����x����Xa�+W6�����Y()Kl�1���V��5k��e�'%g��&�R�k��m�����8z�d������+����O5�H��'N�	&���^��a��K��R�`Ac�Y!�����r���������VFJ�����=[3x����9�#����=+{��5���Qt�@@@@@@@@@���o�w�w{����{H����@�?���Oe����y�'d��9~p��;���[�v�������nj=�>t��R�J��q����O��!Z��������	�3)&��}'�Mb���Ic	[�V�~�|���n-���������>��{�^	vk�@&�����lbZ�o�(U�VM���F@@@@@@@@�x�=pD*�*���?��t\gN�z��#��=$|/;v�p��*��g�~b���
��YP�?�6l`^/��b����Q�h
�*�+�W��+�����o�?�;�%q-�����H����	\�+�@��]���n���K	pd( � � � � � � � � �T��j!�A�M u��2|�py�ys+��-Y�x��m�+�3k�,�;w��K�~����+W���
�=>���"��
zU2d������W��l`	Xx�����L������w�I���������"��U ,,LR�H!����P�#� � � � � � � � �$�@�]�$�����;���E�w��� ��?���<�������i	m���R�P|�P�@@@@@@@@@@<*����P��G�d2�H�G�D �	�y���8qB�^�*y���^������PX�#� � � � � � � � � � ���@����@�
��U�������I@@@@@@@@@@@��y��
- � � � � � � � � � � � � �����P@@@@@@@@@@@@p.@��sZ@@@@@@@@@@@@@ /%�� � � � � � � � � � � � � �\��%�6� � � � � � � � � � � � � �@^JC@@@@@@@@@@@@@���K�mhA@@@@@@@@@@@@���<�"� � � � � � � � � � � � ��s������ � � � � � � � � � � � �	 x)xE@@@@@@@@@@@@�/9��@@@@@@@@@@@@ @�R�� � � � � � � � � � � � ��^rnC � � � � � � � � � � � �$@����1|_`��e�.mi�����KO0��w�q�Wh�^��������aU�z5�6u��
)\�A	��E�=��:%������q}�{1v��X7r���c����X:�]`��5���k�d\�X�����ys����� �9A@@@@@@@@@ 1^JU��o�]�&�f���;<%%J��Y2���R%KJ�^=��_~�k���p���������b=������[���o��?���#{��M�z��my���%  @�y��x�� ��v���U�l9���'7v�<�L7)[���O��\{o2K�����g7*P��K��������^{]�����k�������s?�M�9sF�2D4H+{���9P�H7n$|0L�4�J���������2K\�t�~?;~��[�����}�����?~�Q�����������c�-�����]����={�p8��9s�}��;��O\+W�Xa�3C�tr���S�=B���Fx�d��5�w�9���~�V��lP����C������G�����a��V���h���]�:U��_�p�q)Y��}��^|����%) � � � � � � � � ���@*8g@ �*VT=�}�����3f�����^H�-&����-�[�nI�4i��,�-Z&������/>�~7{�P��'�f.%J����V;h�Y��A}��@_+	�w���E_Z�
{_�'��]���Q#e����s��T%>��
��K�������Q�y��a����0�lE��_�L�2%�Q�^�����}�v�=p���2j��& �Q���3�/[�`�C:��.e���6l��^��u��_bW��=��l~ �����T�����?~��?lX��[�b�(�D2m�T������<������H�TQ�3c�7�����N�F�4��B�K+��� � � � � � � � � ��/@��������\�"�s��_|I�.]&���.����)S��fM������A�D����X.���O���O
^�lF�Pt��|���j�^�|a���5 N�z��#S�M�������t���|VF�������N�8!O>��.\D&O�*�8(�W���?���V0d���%.������b�t��]+#X3��/�h����&��gs��f��:u���D��6m���q#Q������Z�wY��kVG
T��f+V,7�u
 � � � � � � � � ��/���{P`���e�������z�����"E��SO=%+W����3��>5���z�T7o��D^a6��?zn}8Y3��B�?��:uJ
( �����-�W{����o�����}{	���{���z��h����V�H���&XYt4T3����:t0@�#Gi���L�0Q�����L��6j�X��k
h����l�L�0A4RR]����T�{��l��Vr]�6m�����3;�����g24�m�61��� � � � � � � � � � ��/y�b{�-�YAR�N�p�S�~����?;����k����W�J������J���m�{��&M�h���M[	p�]���m�6y��w�a���P���90����Sj��)��h,\�;w�H��i�k�������s�Z���<,9sd�GjT��c�8�f��o�������wK�N�H�B�%s�-R��?t��}||��%���Nq�a�z���_��}�;����������j��m2M�49I�s?��c��[���J�l���3O�<����h���
��4p�~�2F�k�Z���/_^�9be\�c�������&MK����=����}�v�i��X������3n��X��:��7����~��D�/;�����u�
*$�+W�2N.��d+_����R��-�r����.�x�	)S��e�l!H�r���^0�;G�����_�zj�'-��v�R�m�^y����c���k��j~�sd�&��2J��E�k���v�����b�ri�(���e�"uj������:�:>�����������9@@@@@@@@@���K�d"b
d�|��YP��,���~�F���l.^��Mxs�@�������5#��\�W��U�y����q�F9y��d���d���u�����R��
r��!W�����}GZ=��y��_~1�O:��;d��	���v��4{�l9~��h�}�Z������r���f9j}/{��iS��G�v��i��v���
I/`�\�\�-�w��������.^����K���.]*z��e�J�\��^��&8��������O�5�a�^�z�m��~�:��2��@�~�!C��n��y��~=���a.��������z���y���4F$��jc]k
�]�l����fn�~;6�� ��d�ZE�.������i���7�NiPS�re�sF���zHj[���-�����G��v
�rV���+h���5��6k�������-���w{�����'���u���u��-[�e�&�)����+���.��'�r�� � � � � � � � � �@�^��������E�V���.z��qC��;�W��b���d�����l#����t�����5K�7�M�6��G�q���I����FF��X~��W���+r��Sr��5Y�6�/=zT����S��'T��woY�~�:|�
:����7_>�S\�~]�wV���'��L��{���C�����[Y����"�}w�����>x��;*3�O7�e���J�*9�B]2	T�q���w��9s&Qw��A�r����A���%��M���*�= [H���A�^_8��,����9sf�v�^�Yg����2%�Q�
��|~�N�`����-+���3g���3r��Qig��E�����/��)�{_w�<n��u������u�Z�j-)R��9���9sf��'4��U�meY{���e��MVP�e���i�{�g�^y�
���t|�i9}�t�i^~y��\�����%�ie��(���G����f�j��I��Q����[/�.��=�9{Nf���d�t��AV�,��1�o�r�*�Lxz���z���Zl�9�{�����i��`+��� � � � � � � � � ��
����-���>���t�����c��9c����;N���:yl}������L@D�������@K��������l�����<����~l%�
l�q�V����h&}([�f�z��Gd�uM�����������+V�����O>5��ps��%�����w9^�i��MV��:H���E��h�z2c�,i��?��	��>4��Z�O�R��1
�����MY�"�x��K��v��������Y|����7�e}�_3�i6�a���uaa&YR
�@����f9������-[D�<G���U�"mB�e��~��{�=������{}��]L����b��gF������gLp�:k��3�L�:M~�a���?0:+z�� �����`q6�~�O�k�������/
��me4�L[��5sy9-Zl��"j�q�"Ed��;�7o^so���K�A0�"]{���R�zu�o�~^[�n-[�L�y��ux�M�`�W^$<�Y�4����������Y i�Z��=���#~S����5u��p=*@@@@@@@@@�5��|���_��	le IDAT���zE���[�j%M�<��vw�����d}8�VlY���H��|I����Sf�x�#K�(QR4�������:�>��I@�f~��|��p�z���3�6&�}��/}���&SU��l�R� �������}2D�l��2�$f��� ��&s�h�j<X7n$�r���kb���������W��k��I``�	r�[&�>�Y�������h��Y3c
4�a�&�t������W���g#2*m��7FG�B?���s�n��I�&:�B]4���V���3Y�F.;w���M�J��]^
TrV��I#��eks�w��<��5��-����]�Q�,[����^�z���c0���C�b�{�B3>��y����+����@@@@@@@@@���`B&@ ��f�h����8qBJ�.-��;�,�{��?�j{H5�?���'� -4�5��q$��~��~���5=9�����t�q^�����K���G
=XP�d�ti��_�]BKx��X����#�E��,K����[��48M��4X)r�1="�T�-L��w	h�[@���gus	��,Y�d���4�U�mDj�����e��5��
T���xS�h��W�dX�
��3��h��E��e�����ZAfMLV�/g�r9��=�M{��i�����X���J���*}��5��'M�T�j����\��	��A��F�����i���K���.�;I)���5����%���W"~o����N[��hz�����)��h��1�jv1[�z%����
@@@@@@@@@�D��%?���;n��)�[����7K���e��%.�/��������_�#��A�LK��{H�Ai-��}I�����/��u�H��e���r��u���5����0���.b+�
��������'����;k����eK���i��K�={V�/_f�w������'l�oW�L�-O�*W�,�����V�f�?�6mf��`������	���������liD0_�{�.��a��}/\��5=9��ys��D�<z���K���ef���.�\�p��k�$g��l�����p����*T� U�V5����p`����������6l*����	p�e%s�����}���k�|��~\���+5k�����>'���:[�Q�-;]�\�%e�����Z��O�2KE���@@@@@@@@@�W�T���97��� ������VI����L5�MO��t���8M�.]:�@O���} �R��1���)Z��+����
��G<(�����m{}���d��m&M3i=����d��;WN�p��[Q�g�7�> �n����v{F���K���r��!_����S�p�epQ�O@���{Y>�g��hL�����[=��,^�H&M�h��3�]�6m�s�"��=��s�����&-���K�.y��������i-ZL���'����l�@Rw�q��}d��-2n�i��U��v7�5�x����V�=�����K��+o�0�*�g�6����������>g�g�����������u�Vb����M�u�@@@@@@@@@_p/}����}"�L(����d��%�7o^+;�J)P�@��f���R�@�8��v����h[�LS�_��;v�����{l]ON�8Z������v���;����.i@�)xS���5�E��%���;V�,s��3f�?�t���$���-{���~��H������n����wU3~yC��UN������]��m��Ed(��}������r��-��Vf7w�k����t;�y���� �G��-�+��?�AA���c��
j���&+�l��]1�m�LO����Lo.�~�4�����g�w��y��mIK��O�o�#pI�N��+�y��!G�����I������@@@@@@@@@�W��%>
$P@T�CY�h�����.=X�Pg���G�?(��t����+b��h�B�<H��U��N�8k�%�2��/_��y6m�(��-����������9��i�e����3�\;vJ���m��'O�������q���w���}�+VJ��$�� u�DFL�C�1�f�����o8��}�����>�3S9�:��l4��_s���.m��L6���}�������Sg��NM�?�pd�R�M�y����a�����K�*��O�J�����
�e��}�Y��1�i�q�����������sV�6mZ������r�����?MU�
��7���q���v��2e�����{�������R����~��l��!z���������;�IA@@@@@@@@@��^����^|N@�:>��h����s���+�p�"�z��=z8}`�Q0������lI	�����p
N�V��������j�6[�����#���'m����N��|[��������=�����]��}w����u���7��s�hM�<&9s�L�c����������k���c��/�l��\�,YR�gO��K	��_�N4��Y�{��|9�K�������g�q6���5x�W�~}��6h����\���8+y��3M���u��i}��cu���9���
�3g��V�A�N�4��R�X���d�b�����~N�4����QC��"25���B���������Lc&i�B��7lXc�	����
���e�o��~6�R��k��U��YM7G��Z?��]~�"��%K�\���E�O�j��X��L�[o�)�n������<
p����gO�������u��@@@@@@@@@�> x�>��;���v��e��y�a�/��Z�f
�s��9|y[f�����hp�-��y6lh�5#�����>���V��UG���c{��E�c�R{����=nr�O4��-���!�E.l�k���-Z�O?���������}���H����N��G�g�.�i��j���������A��\��Ygx��7n�h����6=R�����e��d�����,-�#5����9#ak�J�fMe���f���
�v���@�R%"���}5lj����f�jG]L]�F�g����f��~�&x�����i�g�s�71�z��c�?t���e��O/�����M�<�����N��n]��{��W^�pG�����47�$����.R�pa{&D5��>����tC�}������8G��56��6|���������Z��z��0{�l�4q���k������&#G~d��m��6]�O�.������)R��Q�D���u�4i�����~��3���Z5[�(W��� � � � � � � � � �1^�iB
n	������5}5P���u$o��N_�������I
6o�lz�w�qD�mYG����K�:�}���N�l��,?�'�ul���t�g��n��3g��X6b�+0-��������A�+g)[���Z�RF����{[����u{�~�9rH��M��}z��r�m��uaaQ�_�5���~���?~�}=���}'d/��7������^���}�'��5G�}me�i���.��d�$����2{5���V�e��o//��r�-$�{
`�R�vI�:��=�-[V�{�e���1�:?�������������B�@�|��t�GC�u��{�3�-Z(9�g��
m����j����S��l_yE�6mf�<Xr��n��, �|�����7�Q��!��Ej���w�]�y�����:�kI���f}
������u�k��sD���o�%!�������p�\�D����O��/o~����+AY��{��4pI�CC#�c��o��&+��#GL�d)�3Z�z5������7���'O�*����~�A���m��;WNs�����������������[� � � � � � � � � ��w
�����]!�uK/����W���J�()y��5}l�J\H��V����s[Y����*z�����V��\�r��0��H�~�Z���@��9������S��=@���:��}�h�,-�M����_�2���
H�������y�+��"��L��(e����z4cN�v�d��%2u�t���i���={�g���\�j��-�s��%&����g]�j�<�����h����O��4�V�������r����d��j�����}�����9�~+�&O��d���d_�������+W�o�r4w�����D���i��������i`�f�jh�,_�R�-.e��q�����H��&���;�Jx�����*6��3���a&���j$��T�VM&N�$&L�m
{�~�{�s���r��a��K_��w:�J���G^x�E�`5��j�����H�V�� ��R��CN�'g���ge���f��y/�dr���@@@@@@@@@�,p�*�$���=�d����+ ����}��|�e����9s�w?v��u���U���_~���K��0�z���w�J�*�a�&��%��h-C�{�k���{.��Yj4�����9w�����`��r��a[Fw�� ��w|kv|�����
�j����av� � � � � � � � �~%����P��_���x^�7Rgx����H��}d���a���e��R�bET�|��'�E�9�%p)�t������
LU������#������k���r��)}������<�>�>q�x���?���j��N5�KO>�$�Kq�c ��k��1�lS.��5d� � � � � � � � � ������W��!��S���S���������������8�{?7��5K���k���o�+W���
�=>���"��
zU2d��������c�6�q��|��0I�>��?��d�?�"�$�@XX��H�B����" � � � � � � � � �n������@��{H��8�@���������-$<<\4�HKh�FV����4�`@@@@@@@@@@�j���H�RE�z�l.�R$�� ���	��ySN�8!W�^�<y���/���s\���~@@@@@@@@@@@/H���c{ �� P�jU�q�V2��� � � � � � � � � � � ��$@�%���@@@@@@@@@@@@/ x��.[A@@@@@@@@@@@@��^����Y@@@@@@@@@@@@�"����b�@@@@@@@@@@@@�I��%���@@@@@@@@@@@@/ x��.[A@@@@@@@@@@@@��^����Y@@@@@@@@@@@@�"����b�@@@@@@@@@@@@�I��%���@@@@@@@@@@@@/ x��.[A@@@@@@@@@@@@��^����Y@@@@@@@@@@@@�"����b�@@@@@@@@@@@@�I��%���@@@@@@@@@@@@/ x��.[A@@@@@@@@@@@@��^����Y�-p��-�4q�4n�H���-��2J�J�Z5���e����}���^|Q��M��k����?w��}\����D��%�������-��(��l�"�z��R%K��A�3Gv�\�����O�m�f�;v����l��YS���� � � � � � � � � � � ��+�����pO�����+�f���Qh���n�*�~����?_{�q�&��^������L?^���e��k�.�8a��:}F�f��'b� � � � � � � � � � � � �m/y�a?I*�<�[=i�2g�,/X��Z�j%y����7o��={d��e2}�4����1������>�2er���7�zKz���tx������W�L�l��i�F���/�K�6�Lz����V�L�h�>]�u��V����A����3%88X~�5L��I�&��#� � � � � � � � � � � ��}"@��}r�9�c���ke���q��9�h�z������5j���W_�k��9��^mHH����j��!��u��+V��^~y��;th��U�ZU������������������s�@@@@@@@@@@@�K��%����&��wl7#4�'r�R�i4������4�#��
�fnrV��� � � � � � � � � � � ��W E|2�}��9��+W���;�p�X�p��)��~����M[I�&M�c�� � � � � � � � � � � ��G�����1�o��/o�r��My��@��?�����d��m��j��9�F= � � � � � � � � � � � �`��L��,���cR�res��#?��%K��W^���f(r�\�vM��M��u��%w��S�W
r��K/�e�C���*T(Nk�@@@@@@@@@@@���Kq����	�L�R.Z,������9r��|�����uk)X �T�TQ>�|����/%�r��(�2���8 � � � � � � � � � � �x�@*/�[B I���d��2d�;����e����e��r��Y��k�h��I'YAN�$����1cF����m��,Y��l�o��o�%={�r:<}��Q������/
 � � � � � � � � � � � ��'^��&s��@������7/-{�������_|.���O:w�(a��;=cHH����l��!��e�,Y�
��z�Jbn��@@@@@@@@@@@@�>Hq����#�T�d���������a�����M&&_/>��������@@+� IDAT@@@@@@@@@�b������5�h���}#�����M%`�*U���q��	��� � � � � � � � � � � � ��k��\�����N����*UJ���+�<��#�s���[�n���8 � � � � � � � � � � �x��K�y]�U	�������O.W�9s���T�R.��J��^0[=z�����;N������T�@@@@@@@@@@@�M UlhG��<(-[��G������K�GjH�������r��!�:u�L�8���__�-�����sN��!m������k�$��:V��^�_����� I����QM�6���~Zf��%#F�?�<*}��
�
��~�M���+�����4i�D_�� � � � � � � � � � � � �@�/�JDH�2�+�v���Y)[��L�2�Y�h�Q�<���kC�-��o�q�g��o��\��'I�N�bt��I��'��?�4�I����$e�T2}�4�={�yQ@@@@@@@@@@@@O
��IM��9��F�d��[d��������������C!!!R�LY+���t���N�����j������VS��]L��M�6��S��9���'��W�N�:K��Y]MC � � � � � � � � � � � �T ��U����1��{H��=6!� � � � � � � � � � � ��)����P�hrn��}@ ���-"� � � � � � � � � � � � ��
����-#� � � � � � � � � � � � �/��Ub� � � � � � � � � � � � ����K>x��2 � � � � � � � � � � � �� @��/\%�� � � � � � � � � � � � ��
����-#� � � � � � � � � � � � �/��Ub� � � � � � � � � � � � ����K>x��2 � � � � � � � � � � � �� @��/\%�� � � � � � � � � � � � ��
����-#� � � � � � � � � � � � �/��Ub� � � � � � � � � � � � ����K>x��2 � � � � � � � � � � � �� @��/\%�� � � � � � � � � � � � ��
����-#� � � � � � � � � � � � �/��Ub� � � � � � � � � � � � ����K>x��2 � � � � � � � � � � � �� @��/\%�� � � � � � � � � � � � ��
����-#� � � � � � � � � � � � �/��Ub� � � � � � � � � � � � ����K>x��2�&p��]�U�I�6�l������y|P�]����8w�w>�{���w��1����<�s�u�z���1V���g�[��$2�����Z&e�|���Y��K� � � � � � � � � � ���<��$���O?�$����g��&e����������5k��,�`w�~��Q������`/U��h�P�r��){�y��Fo���Y�f��m��i�fR�jU����uK�������M���`��}j���.��E��7����I�l!�}{k�V�Z5�{����C�9s����;w��g��1�z�,9*K�.����cG�.���}���G����>lcG���i��,)S��W
�����u�x�-�O�2`��n���yg��Q����e�(��?d>s|0L�^�X�J�J�����2K\�t�~�?�tYg�����r�q���\��/��������k�=\�����TH�5���E��i�����m|�J��46��m����U+�sZ�REy����?$t���w���w����y�=����<��B@@@@@@@@@�H�]�a7��@�����k��qk��!+V,���$���^�j��!�`�`+��U��k�	���2}�4��e���2l���G����/!���
�5j����q�#�N�<)��o�4i���-Z������;��lX���o;9�|�.G}i��f�9w��d����4>Y�����c��:$����
[g_K��u�����}6��W��.�������������u}M�8A���d��9S�lU��C�?�8
�k/��?O�t�j�t�Z����j��1c\��@@@@@@@@@Hv2/%�%`�.�+V��}���i��B�
Ir��'N�������5G|���^��W��~����=�gL�.�����YSJ�.�r���R��G��W��y�b��-r��%��Os��{2���e[n�C3M�:������G�^�8������4XI;�5k&���
4���*���'��'[��������)S��%��U9��1�~������K���.����4�L��Q�h���\�n^.^��?�,�X�2Z97o���=�������,z���_~���M����k�����j��%��,� � � � � � � � � �xB��K�Pd��Z@�4��V�N��$!!!�u�Y��l%S�L���fx�����e��r��A)T�����Z?~�x3��Ow�u�r����3g%E
����������|�%�W�~.��1a�s_�O�s�*U����������o�1YS��,X��,��Y�f�)�'��K�*Ur���;t���k�����-��_�9Lf5}���`�`������1n��\y��kCeT�D�+Q����X�b��m[�s�����Y�I��Z� � � � � � � � � � ��g|+��gg6<"9p�#&�$�y���L��q��%��Q���a�	I�:��|��X��*U*��I�6m�g��U�������#Gd��%���D�W�vm��'NH�5"O|��%�h}/�4
�P��e��=�Y��c�i�[��(�K�����G�;�O%9�c]�t�n��wr��Y�X��;'���1/g��B60�o���[s�C�'�ha��i��e��#m��Y����z��f�(�s���Be�����?�8c������?'e�����Y�����I�������6Y�����v���z��u��^7s��u����Gd	�6uj�zm�Q�q&%�o�5m_�f���O�<)��3�V�\���f�y ���>m��~������2a/��d��Y�g���j�����,Y@@@@@@@@@@ ./�E����@�^�$  @f��.��_O���\�����1���I�>�'��Wo�q����
��^5k�2������PI���.]*�o���e�J�\��^��&���������w8���r��E���^�\��l!��I+�R9�$Q�=��
0��|�r�c~��(y�n(�:3f4���['��}FZ��1Z��o���U�q��K�C���7'O����V�K/�(���s4�|�j��m����a�����,�8[���9sF��>~8�p��H�"���jE��v�T�;wn�]��������5����Q���h�"F��>!U�T�������M�����u����K��~=�@K
 � � � � � � � � � ���K�J�?(l=��]�!����*�O�n]�Y�jU��'�|C,�P�m�v,���Y���~PY�R%���<l��>�O��^����Ff���3K�j���:\�|���^9/^��ObW��2�T��te	1K����WbgK��X��}�y'M�(��wb3���G��HZ�f�������W_5u������r��9s���?l�	��`����2������+W�t������r�r��y����pQ����={J����%��\���z���E�m�(��Z�j�.��4�R�s�������~����.[���c��vm����8�����oM������1r��P��+e��2p�+r��Q9w��yY���/��m�6�o�~Q�E~������@@@@@@@@@�U���d�gq�_�w���:��%mV}����@*�x�@����s�.&�g��q���D��5*T���}��DX��)o��!�V�4�`+�����o�_��$�����@S�VM6�}Yf��$E�<e�l���Cj��)�y��l��%���>��Y�v��1Y��qpY��X��{9~��9I�����h�����D�2��/%O�<�]�/���������/��\�������d�-H�kV@�f���4i�H�5���F� )-Z�4���j���AO��|�2s�v�#�lg�����2o50��w�5�����=��u
"����[9t��mh�?��~�pST"� � � � � � � � � �@�
����,�@��C��
�]�v����lCg���g*y ��$[���'���N�"E
�5kf���o��r��y��)�Oi���W��k�$00P�W�no�ea�l''O������fm��r�E�5�ld4�\9sXMD�C��$�}LM{��;6i@}�zj��;w����[��d����L�n�8z��u�S����3AxZ�=���������T�w�����G��2�=s6�P�|���l�X�������M%5�[�&�Ei_`ek�x������U,�z�)P��	([ge{� � � � � � � � � � �����}�c�����#���qc�$�I��;g_+8���$���B|�<��M��5+����0����p��E���W_R�Nm_�\�r&��,^���J�,i�m�������][4k�f�Y�f��m���4`�Kr������"��@�}���#����2e�`^�3I�R���W_5���3f����V���g��T�X��>�)*��e���Q�h0����3u��������i�&�~�������m���(K�,�qV[@S�'��t��E9��?n���
zm���������-+�$�A@@@@@@@@@���*�7�����@
�p��%�=4(����{Gd�7��f4�������������e����!444G��
M���N1:���\��2DV�Z-��L3�g���"�Z���:��P����}�����ti��x=T������k���A��}I�Nyi��3�6�u��)����z��#��o�.]�F��������gs:�l�M������u�l�h)S��	�1b�4�_OB��+�7�S����y}����7��4��{��cy�Y���}��1�w��iSw����a������M?�D � � � � � � � � ��[���x�1�

������&NL��e�����.�O�5Y$a@S�h1+��>Y�t2�v��2e��tO����g�H�YOo�+�-��d����W_�%7�_/�.]rky�d����;��4i�D���Kr��l����u�9���/Mv���>j���cr��-���l��������H��%���*�0_�|�e�6Y�p�����I�Z�$M�4�w�^5j�T�TQ�[�S�T4��fV�b����?o����3gN�S���#7o�D����E��~�t@@@@@@@@@@��q{�;�[�>}���M�2�<���%$$DR�Je�9���������y�g��f*Wf4���8��LC��>}:Ol/��8w���={�D[C����~�n������Z�m��eq�G�6m��������g�<�W��>��'�:�����89�����MMv��3�g ���;y�����i�����mg�,;u��V����s��2�9+��E�9�������#d��5r�2�8q�d��E4����_r8��+��mg��b�r{@��o���V�Z�`��%G��{�����7�@@@@���L�r
��+HwwH����H7�\%����������^Q@�����������NE�{�o�qv���l���������|�;1��9�}@@@@@�%@�R������#P�T)y�������2�<�oL_�.[���g���>�/�����m������������v��K��ie��E���l����u��������S�-[v�6�Py��u9|��YJ�
�}�$��2x���!5j�4mB]��]P�d����4�m�`j�����M�=�������n�&Mg��g�D���5w�U��)R$7Uz����H���%.�c;_\�+V�d�m�}v���$-%K��j*�L��V#G�2��o����y5`��&����_w�ch� ��y��~��7+�T��m_�v�[3-����J���~�_~�������]������{���e"@@@@@@@@@���K�qeT�R�{��f��������W�a���i�_�s��{�n�x���g���~�?�&����O/�>��h���'�n�d�R�Y��,[������M}�|�$S&�l)��\�u��W�O�j�}2��;����f�Z�k���N�:�����L@���Y�ZN�:���f����s<O�<��%���NA|���1U�Z�D�m4�0<<�VP�����k��]H��p��ir��
��Q+���g��Z������=~�k�H�w��m�`�T���7�������uM,�E3�9~S����}���-��u��`Z�3�m�x��1��}���x����'���e���2o�\cQ�p�P���`M�4���Z�y����m�4�.����^��y��7�E��^�� � � � � � � � � ���K�zfXW�hv����;?���Y����>��[��}��e���V���x���OK�������L3���O�z����?��Qe�0 IDAT�\�z���4K����n�����R�W�����@���+W#����W��!��|�2xBm��� 7w��g4j��L7d�`����M��'�O�~�d����x�.]<.��um�����.8A�9���u���SY�~�9\�L�����R�����#�R�t��b��n���[��}�Z�����o��������2�,��'O�^�g�����0y����d�b��K��n�O���"X�c�n��u7_��z��� ��'��Y������|��3GY# �M��u��Gd-�g�S�[�m�����#���y�9t���]���_�~f��{�J�6m���E��>��}3�#�]�K2d0;�f*Y�����[��{�
}&�=1b��i�F�\�%�����3cj�#
6�WqdX
[%������KzL�=G6*}F?����k�.�r�[��i��9y��GL`'@@@@@@@@@�F�~o�������t���2o����Y��G����Fm���c���O�����.G�PL������S'�F��1�����U��L%�R���s�C��1Y���r���h�F�)�q��_|!M�6���Qq�
r�����m�4C���mW4����8yJ�f�j����s��Q�xq�V���9f��&2v�89��Q�����6������J���\�Q���z���UG���o�(X0Z�aC��~<�	&J�v��6���,s�sg�AVn���i��N��%s�����#���.\���V��|a]��qW�������p���
�1W�6m������1�o��2�<l��][I�$"�\k�u�.�	i��S�ke�����s'Y�(Trd���{���d�����6|�hP�>�J�(.Y�d����������U�F
yc�ym�Y�`�|���H����7���_���	${����G3_i���:�)RT�|��h}5��_M��T���]z����r4��#�R�J�����-Z���V�������s�`H�
�l��H�>�������+\�Z���)[]���?��v^�����:h����l������S��r��Ejy��?�|4���]��I]���lU�A������A@@@@@@@@@H2/%#� p�h�������#S����zh���;wN�XZ���*U��mHi�={��H�/����;�W�re0��Z��AC�5{�|����`	��%��
6���M�@++��E+A�j��8�
��]���z�g�������qi�h��f���jf�T�RI���M�������)S����cy���1����M+m����Z
�Y�*�
bi`2��L�RJ�.-��������F=��
������A*��'7�m���V1
B_-O<������������4������/�
7�9s��_�U��Z�j�m����c��m���//����/_�����8��l����i�f�q0j��BD��9v��i����x�B�!���W�����Z�9��}��h�n�r���H��[�N����3�����k�%� ���yjn���6k�����C=,����B�
K-�������������������j�E@@@@@@@@@?	�g�?�������iv�> ����
�<v��_�R%K��S�d�����e|]4SV�6��4k�����_O� ���d��0H����LFC��-C���+`J@���l����d2Gjp&@@@@@@@@@ p�8"eJ
���� �R@����+�&M��#���C��������A���
�u���&�${���YVF����K��}xt�Cp'p��I�������f�#� � � � � � � � � �@	�D'��"p�
�n�Z*V�(_�D6n���m���K�$Id���>�+!'�u'����>l���}[F�~SR�J��i�����N��O7�2e��� � � � � � � � � � p7���U����v�> ���e�>@@@@@@@@@@@@�+�=�H�E�jK�{W��K���g� � � � � � � � � � � � ��T��%��28 � � � � � � � � � � � ����K���g� � � � � � � � � � � � ��T��%��28 � � � � � � � � � � � ����K���g� � � � � � � � � � � � ��T��%��28 � � � � � � � � � � � ����K���g� � � � � � � � � � � � ��T��%��28 � � � � � � � � � � � ����K���g� � � � � � � � � � � � ��T��%��28 � � � � � � � � � � � ����K���g� � � � � � � � � � � � ��T��%��28 � � � � � � � � � � � ����K���g� � � � � � � � � � � � ��T��%��28 � � � � � � � � � � � ����K���g� � � � � � � � � � � � ��T��%��28x#���K�*�K��e��M�t���|�������_������*�j���~�m�*j�h�����h�t�<�sEkK�{�Z5k�aC��o��#��^�%@@@@@@@@@@ �^
�s�
\`���2n�X����<R���J��������}���/����|��H�2x�������E-�O�v��?^��	����?�-[�H��OJHH���o��%�����w��gZ��
p�S��\�xQ-
��_{M4�/��eu���`��]�H��e��	�s�N�ou��A�5�+[����|�zu�y���ti�H�
J��U��~�j�J�6�(}z�6�����s������3g���^�:�}����^�#�����}�T)���#�s�3B��������R�����u�j;�����m��?o�&�����3J�����9rx�����/R��E��o|^�|���J�:�	������~K.]�����{��+#�x#Q�c�����z
�8q"1��� � � � � � � � � � �������L��]&P�Nm�~�zP������l�R+��a����_��z��>��:4hGa��L�:E�e'O�\,]�v�>}z[�my���m���P�E��{�n9t��.R��0�N��&V��]�"��z�l��Y���e��������n��-����Q�G�}��g��������3�un��\�r���G
R�2y�W{N�4i�������^��U����K.\� �}���h@�WC��G����7��r���jc�����{f��
�RV0_lK�4i��2��w�� � � � � � � � � � �d^
�s�
\@�9�E�={��)S�L����w['N��g������y�]g��Y�����~2��q_�6u����/R�J)Y�d���K�Nj��)���y����>P���K�4���9RF��f����U+��)��Y�Z������t��w�8�_4�M�f��������,-�73�K���7Ai�����W�����L�H�~��x�V�������/�Yb���"���y)�>�L�,���[�j��y��L�<����M�X{�[K0��1b��'�s��Y���
��}{��~��5M�k�[�)S���V@�/��m�iW�R%3�~4�� � � � � � � � � � �d^
�s�
\����&��L���_V�5�?�.�[��%m���z��b�d�"��c��er��!�#1�f����M����GM�K�$�w��g/���_u�o��51���A�)�y�2��Oe���b�,��.�T�[����[O���Ydebz����s�����m���Y�fG
�K�2�T�\�|pY�2d�iO�k-E��^�W�Y�%��f}����y[#_T:����>�z��}�X{���������E�-�_
����	���O>�X�;&_}�����) � � � � � � � � � ��@pE�4k�k\��i���|��������q��%����]+���$��%��w2�xZ������Ok��1
:J���eD ���s����	5��q4PIK�z��N�:�l��QN�>m�o����^��<e�J�:�d���v�`�����Y�8+���%�bE)]��=rD��zI������5l�@���%����
�g�������8V\�|��yIi����u�zu���Cb�t�_0��2m���v+6l�6���B�ti�H�\9�~�z2}�t��g��^����<R��d���|z�Ai������\�p���������q������m�����S�~��;vx>�x����l���������m{��3g���!}:�r���vz};��A�v����]���?$3�����J��U����'����]�@@@@@@@@@@\^�r@������w�}2m�T�q���%�/[f����t���}�`������P�n��5kV�|'N�0�%���K��b4�e��E���������k�l;���5���;D�L�Y�w�a�;���)=_�Z������u��e��2
N[�`���]K�|s��m$��=.,����<��\�r9�>��}�Y��h��S�$M�4&8g�����B��@Pw5[�n�����8���������{��IY�b������s%k�lR�Z5�'}����fW��CE��A�Zz��H�:v�B����r��;������)�7��i���;�v����m���j����w����d���r���E�����p�����Os�=CA@@@@@@@@@p/@��{� p�.R���S��x����~�����f���J~�;X'�L_e��1�_m+���.\h�(od����]����%tQDF&���h0�
���1f���=A����`�`
z��lV�/K���H�.]���~����������9sf	[���xS�~�-Y��+��u+���������������O�f�Y�|���s�n��=j���d��)�.4[���M�SO=-��l���s�e���&�I�n�1�v��_��	*,Y��l��Y._�*����/IX�j����	\�+\�|�J�G������/R�2�n��T�c��ve�����o���]�hu�R��&M��zG�R�F���,�?�T���L�<�d�J�4�������/\�K����$�h�e�y���vu~�����'}9Q�v� � � � � � � � � � p	�t�L��@\z����2n���Z�2O�>���f����K�Q��W����yd������#@�^���%������p�z�j�%4l��T�P������R�x1�����d��������/��u�M���|6i����=_�:J��)��E���3���9�l�o��	~7v\����yS>���L���:��A�M�-9s��I��H��e����z���]I�=�[O���3����w�#G����-V��|>c�������K���[������c����aK�id�8���EV�\Y�����A�����PZ�z�lC��.\�mK�;{��	Nj��E���]i���N�����+W.�]��=�D#�D���3G:m|������K�C���-�m*@@@@@@@@@@��M�������b)�/�*\Xv��)����e��7?w��h��,Y#2��}�{�g�,��|s��EY��pd[Ri
L��>�n��o��&��.Zl��h&�#?�,~��<���,�_*�/'c�|d23��E�T�x�c4q��n����&I�$����E0<�o��7���t��=ZS�s��,R�]�FkhU$�����u�o��?���|�_�.?������S������IO=��sh��6Z4�L3�D-]�u5U:�#������t����]�^(�j�����cG�%�}��3�|�Y�����#�B+���K�$]�t��GO[.��T�`AP��Lx���@@@@@@@@@����$�D|)��%]�F��>��K����1������d�L�Rl�3g�l�k�/��%K�K��R�|y�T�R�N�}��M��d��I�L�&?��O�z�mi��Ig�
������X/�;v���]Q��g/���&N4��*x�d���X3>�����v�2�5�����^Q;�s9��vE�����=���n=�\?x� I�&��d��I*V(o�
�����s��f�r��{�:��r���]�X�HQ��!���z����Y��96x� ym����7n�qW��^M�53{�3wN��i`a����e�V���q�g]�'J��ul?��'-'N��6 � � � � � � � � � �/q% ���o���N�Z4���S��.�/�S������P�(
T���R�^}�u���3(iV��_~E���'�O���;�7�5�����J�vm#�{7})S������{�����jk�����)��~�9����G����qc=��t1"�B���cG�l��9��x������g����:W�E����J�*��a�d��?H�r�"����	�Q�g���D%��-���x����6���#����y�m�S��d��!��)-��+�	�I����_~����|�2�YI�\3\9�9}��y��5Yk�u��r��iw7�9��@@@@@@@@@���Kq��w���4��U+��c��	~�Zl"��� �����Y|U�E��+W�����+������3"8F� ��Vy������LL�F�6}6l� ���n-�{�4[�gV3��N��R�����zV�����5XN3��Tr��
��iO�8>��7���o������/V���5ke��A&�Y\����\���O6m�"������^��U�J���e��=����I���d���q�: �=��c���n��-p�(sf�6>���.]:�k����r�'������o��v � � � � � � � � � ����K�����#��g/���I����s��Y���;Z.�������	�	�_8oV����+�;3����_&������[N��;�b����3������M��j��Y3��#��_��� ��M��
��� IDAT��,V�
\����i>v���K�2g2m.\� z���������)�]�Hu���5������9�|�� ����������g���v�|�1����P����/o����X�JN[�&L�2�f���O�.A���3-�K7o��%K��:
��+9r�0�'N�;L � � � � � � � � � �@,^�M��J�*%�?���>}:Rv
_�9i��R�lY3|bd����l���|.^���m�d��?�h�-_��O��A�	H��,vYF����C��K/6YMbS�%K�l~��Ic�5��jV��;�5���_���]{I�6�,^��mF�%��40m��]�������D��m\+��s�4i����=m\]���#)R�0����m��*R�H��z���4vB/V���sS��m���<`���,qncZC��)�m�v2r�(�t������W�=�ee��Wi�lD���M�����&pI��e��Q4hh����J���~�_~�����*O�:�����S@@@@@@@@@@�` x)���E���{�4��?����3t��5��M�6�e>�I�w�&�W~�|�.]����:�t|����{����:��~ZA_��iS�vm�m���k��={V���;g�}�~2��������	��4V������2��_��kW���������=g2*M�8�v���T1w��?.Z
J�8q���\���y)"SS��Q*��������\�fm�!�O�����`�
�8�~�)��7y��3����o����1M�h�S�J%5j�4�O��3��4j?.���:uj��P#�a�<:��ip�f��U��!���3+V\y�sm��;������ME���J�&MLp�:4����N��|��������=:"����8� � � � � � � � � ���KvBXN�	\�vM��?�����f�_���	���u�K�/;�~����z��}���%w��r��!o���M����?Z���^�.�C�$������7nF�w���E&�4���+W#2���W�,)��bz^3��������		�T3���k���j���v����K����qG�&���u�T~��4l�@�M�*�b��hF�;v�K/�h2�48�h����Pt��������i�����^/7O�<����L ��3����������_|��Eb40B3�h�,l;<�D��@���v���K�f��%7o�4���9sd�0�X�����f�������
�q7�f���=�9��_?+������^��o?���{�J�6m������^[|����������f*���^��%�������L�|Z�d����i��Q�;=|��r�"2�M��
����$6��l�}i����lYD�j��u6�����F5s�Ly��g#e'��d��o�M���Q+0J) � � � � � � � � � ��/��P���={t��yr;?6l0}W��G�<8"X���ch�:g�����}���4oxXX#�sX��t������mX�jU)V��	��7w�W��)�h��9:�52R����<��A*��?~�m�{P�w\�W����C>�d�H�.\��q�/���oje��%���q=�(�t��#���s;L�$I���L0C:����~��^{]�v��%JH��%G�l�X��,"��P&M��v��8��y�H�����f����T?j��X-�{��j�P��/.�b����i��I3��a�$g���+gy�`���/M���^��
"��]�7{�����K����o�V�d�d���mZ��Q�K��j:����oo�}�u��%����|^����$K�LF�m�,��}�N}��u��iL_�^���1b�~���R�p!s��g�*0�4(�5���h�z�+[F2e� ������I3�y���E��7�z;Z��7�Z�~v��e���9#�1
BsWz����Dv��)^�a)a]���G��k�^�zF���.m��A�H�����<�LK�Q�����`J
��Z������S���[�u�(o^e���i����eer�k�|���5����WA8� � � � � � � � � ��Q �
�8v��}�;w���|���t��]^y�e�>}�t���S��s�d��=f.
�R��_���$���~'�N|����������&Mj��YW�n=�7o���g�AK�H4xb��M�p�|��z���hP����5kV)U��,_���18r/�jV�D�R�d���~�n��=e��5n��,^��LG�]F����y��29r����J��W����f�,�rU�	����;�1���������:��o�������"V��ir���r����������m��
�J+����9G���
�vOv��Z��*W~\>3��iF��i��{���ZK�v�l���9s�������p��q��8q��M�:�1ob�h��4i�D��������fW4{R�J��U�PA��X)����l����+G�j��G�b�����_Q�[�.RU����-���g���>-Z<c��b*���qc;v��Y��r;n��
*,���Vp`�f�m�c���kV�6M3e�d��/x��v � � � � � � � � � �@��g����0����c�)^��]�C��@��_�.�J��S�N��-[���.s�@
���e��uV�F���L��'O�dt7�$���H�1@ p4�N3�iae|���o�.��!� � � � � � � � ���{�2%���{g����9��X�Db-�Y>����o������aa�L�������[�n����Lv���{?.�� �@�	����k���={��Y. � � � � � � � � � !@�W$�@����b�����Kd���>_Oxx�$I�D�
���j��&��c��S��R�T���q@X <<"xi����:u�^)KC@@@@@@@@@����U��HB	��}@�-�P�1 � � � � � � � � � � � ��{�2%�&��<������"� � � � � � � � � � � � �/�ic� � � � � � � � � � � � ���K��X! � � � � � � � � � � � �A)@�RP�6� � � � � � � � � � � � �@�����"� � � � � � � � � � � � �/�ic� � � � � � � � � � � � ���K��X! � � � � � � � � � � � �A)@�RP�6� � � � � � � � � � � � �@�����"� � � � � � � � � � � � �/�ic� � � � � � � � � � � � ���K��X! � � � � � � � � � � � �A)@�RP�6� � � � � � � � � � � � �@�����"� � � � � � � � � � � � �/�ic� � � � � � � � � � � � ���K��X! � � � � � � � � � � � �A)@�RP�6��.���K�*�K��e��M����j��\�����v�H<�?����KQ?yr��jQ�j���W���{�W�i$2l�Pc���,��>l�*N�\ � � � � � � � � ���K}zX\0l��]��+�;u�GJ��T)S�f�|����_�j�����u��g����6����m�P�4yR���+������������[�Fk?��Ol_���rv��	�P�n��0d��H�_�l��_�T)���#���z�t�������������e��-�����v������m��9)V�a��!�d��AJ/.��w�~��m��<p��I����}�@��.m��5�T
�(C_]N�>�����[�����`���m����<�A�z��������l���Gj�����G�������eJ��-�7�����a��I��Ie��r��MOM}rl��AN�re�x5��[�d��	��A}��'���
=PP���_?Y�r�h_�>�{���}�(+�7u3g���2�������R�=#�xC>�x����gL����k��}���l���o��I�<c��V"/�����{(��}��'�+Wv~�}0VC��~����/���m���]����&{��R�|9�������&`���;���/
�5&����K��@@@@@@@@@�� x��9���Gu��6�.`��>��Mm��=k�\�x1�S����L��/��={����'_~��T�VU>�81�cC���o����u����kCD_p6|���<�`Q�/T�|����Xr��A�2y�T~��D
��8�����������X�\~�����?���k�����[o�)eJ?*�������M����-�[� �������g��c��������]����9�'��0s��A�k8u����5�D�%
��L�7o�,��������r�
��$���>�b�[5xi�/}��y=Fb�Wc?��^50,|��3�
��M���>r��r�}0dl��o[
��z�����S���H��-�6,�s%T��V���>$�������4x��7/^�~�������'u�4q�N � � � � � � � � ���/��g�=�U@_�/W�����S&O�*e�x�1$���,�'O��p�>�L&|�����uk��{�\�zM����d{�������^�m��9������8y*��m���M������3f�g ����4�3w^�9���g�4m�,R��(����5e�d�Xe���&��J�*R�dI�������sK��}�����}���.+����S�@���\i���(E��?��Sy�5z��]�^�Y6m�"��2Z�M�V.]�$��[����@Yv�u��dl�����k��f�c>��������#��9rH�f��z��5��u����K��Oo����|���9{�~������%.�������������������5k�������4��f��x'P�~s?�������
<��w+ ����n]���/P�/�(?Z�VS�N��5pM��O�J��:7�!� � � � � � � � � �/��amA!p��q���
V��M��t���m��
6s}j"����
v��Z�V�*?�$���)RHY+����J��9MP��EeGI�2�d��5�'�U�E�
�����*2d�4G�$��)�G�O�:��)�L3U��2L%Vqd~j�&"���:>�h���@F�%�j�6KE����{N�/_a7�|���������V����Kd��������b���'Oy��GM@�$+c��@����c�,K�,�1cF�w�>t(��w�a=W=��	.��=�paD�]��u�~��u��LLv��aa���YVf���B�S��� L
����>�P����Z�gw�.��������?%m����%K��v��y_9�����vmTF��W��������7���&EKk��'~�f}�� � � � � � � � � � �@0	�Lg����f^J�b�.]Z�9be�Y��2���[9u��i��W/t�Z��GP���+���+^�,��v�j�:n\�d�Y�v��=�'�����0���]����])P����]�����(E��XA(�J�&�
d������%Z�����m;������d\��#�&n����z����l�X�#P�n��R�N����7����m���m����O�~4�"[�l�c$fe\������a��i��z���K�Fr��)����������oDJ+������_1�ip�k��o
,L�������?ot���+����zke��6>|`��z�Z�*^��
�z�iqd=��i��vb{}����[o�)�W~L�e�b�o���W�*��2����]9����\�f
�������E��`�|sl�d�����}&�W^y9Z[��j�����a�SY�aV����m���f�l�M�2����3gd��q�|���m���Q+�����E�Q@@@@@@@@@���,��!��{�{�X��q��v�s�*U���\�������l�����Q#��h���/X��,_��L�Ag	��+[�����I��{+��/[�����I���8����{w�7m�T�q����	�q������*�#��9q�����K��I���3�c�-�V�MZ�]�&�&Kl���=j M��M �@�I����Y�Z�t�$������=�f��V���S�ps\�\���y�X�U������I�>��%�����Z����r}:6���<��}�u�L���L�2�Lp��@�Q�F������^������,��)���>�h���F+;�])be�t��������sK���M��sf��������wO=�t�v�V��GJ��w�}Gv��e����S��>���P�������Q� � � � � � � � � ���^��8�!��-[����3��������8��}m��O�6#I������?�?�1��A���H�.]�������K_�:��b��!���5"MH��/�������~����J!q��}
[/���WO._�,_�����i��������o����]����.\h��y��Y���.
��_���h��:����.
��V��B�
9�.U����v'���b����4s��������������r��y5z�	��`��#FD�Z1��X������x�<y"�;��J�*R������U�=�6&N� ��WBm������KK��#�?���c���{O~�i���O�X�yW�^�c�O��K��{+g��a&���h�H�k���Z�5�VW�~�H��V�f�4h�0�������fx���m�Y�m"��V-[�Z}F
8t4�3{���A���{t-�w������ 2}l�����t��l��E�T�"g���g�i!���[���/�}��J% � � � � � � � � �6/��P�@0	�K���?o
�����X/�jqd������R�(g������CG�qd��r���mO_���OZJ�,�yW,_n�Shq#�{P?�/���u�d��k7PK�Y����.�Y��#��J�:����uKDp\l��M{G��8������r���h�5l��T�P������R�x1�����.���OGk���_|I��[/���w�����N�b*�}v�xo���y�+VL>�1C�X�GZ4���m%� IDAT���]���?c�f&rI��J��4@������MP\"���~%�-MK�;��c���>�!�k�Z�|��82�iP�������{A��"�n��dT������=if��K�1��z6"��u��}���Tj���_Z���&��~}�Q�7����K�Z�f�g��]M|�c��R� � � � � � � � � ����K6(T!l��u3/�~��t���_=.�����x��)��s���xn	�����3����'�m����sf���5K���������1�7o.�E3s|���f�#G�r�E#���.
YY�v��)����%�m
Y�\�g��6��������#��nR�4�����|�����5�!t�biee����#?�,~��<���,�_*�/'c�|�6��� c�(6�n
R�`.-;u2�����������s���-j������U���c��[�q9�$����������O:u�h��st������LeNj9w'��|���fR��A������444�dL�LTQ�5O3nj����yF-:~��uMuXXD��m�� � � � � � � � � ���^��4� �C��<`^��%3>���L�BrL�����1���={�2��l�D�r�?������d���%}I�U�g����&������c����������g�w�����t�E���]#�A���$����ks\�g��;_�%K���A
5+��h`D�:u��EV6%��)S&�2u����>y����q�'��rY�4��O��be�9v��]������{����gU�r�X�n�H���Zv��{���������V�f�*kV���{�D]�]4�O�4��'}��R�D	4p�	�N�,�|��X���Q��t��������:��%���w�n<A-[�4��g��7"m������2�"]����_
 ������]���sd��4_@@@@@@@@@���K~�f*|)��GDF�q�<g�H�6�Y�o���v9����(i��q�.��)SFBBB���S��W_�}+���-����-���
LV�E��H�;���}��=z���@4�T�F�����P��^R[�@.\h���*���>}��EVf-��K��n������K=fP*P�����+2�
x8~��l�������~�i��o�6������g�%+K��d��e��l������io�.1��r_�����2E�h��,��VR�H!:Dd���/i�����M�6�k3GC��)a0���S�l�*�w�i���>_|�%i����s+�Y���7On)Z��H�E\vb������Lf%�����_;W�Y�V�Zi�?���h�w���~�z���v���50*��T � � � � � � � � � �c��|���K�N��R���V6���:<�����d&9w���6����m%{����6��{�4��WVGV�������u���s+Y�b����_��f����+�����f|h���������/�0�%�P4�OK�\�M�0����$���1�I�&���:���x^�ba�2���+��s�����E������^��Vy������LL�F�6}4�O31j�������x��z��y{_���o]+���3g�0�
�S���9���a�'���o9?��`�m�w�|(?\,���t}�����_��M�e�k�Y�O��l���iS�J��5d����i�[ ������82-�����?��Cr��)�k�p;��K������m�'S���8� � � � � � � � � ��^�!.C#�O����{73���>��i�/m�=k�t��!�������r��!����
Y�fu�\8��%}���s�Y��H��ye���R�@��?5���~�z����R�fM�3g�h��`*={�2��4�3�2�]I�*���]@�_��l�*e*�a�����3{�>[�����@�F���~4X�QB�dh��bZ�x��|��}������>�3e��\�����F]�#�4S�LQ�wo�+���m�4��?�}i��f�����=g rds�w]';s�L���gc��q���]�_JB^��K��!C^�VVD������x��m����\�r%�����j��L�l�Rg@��9�M]��-L�]��#GNSu��e�v�Z��|G@@@@@@@@@ �^
�S����@�v�%m���x�"9q���@����_�~�m������d��I���6wCe����c�Nf+c�~��-��e��5��&XJ���i�Z-
�<y����
��z5�h��m�s���X��m�_~��.:tP�U�.��/�T�b���>��/^��e��}�R�������O[{�g;^���d(�nE����e�f�$ ��_�.�G0��P�gkZt' �j��n�,^:���d�b����/G����/��f,_����]�X1g��m[m�t��g`G��%m�h�#�/���X����Wk��#"���q��]������Z����=x��WKL�"�i��Vl�k�g\��v���O���u
@V�V-�r�,S��4���J���������j���~�M4PSk��]k�����J���������Y����o���w'�R�@@@@@@@@@ �^
������@����Y+;�f��8q�m�*V��f�2��O�����f����S��d���v����s�.&��_|ae/���mU�^���i�F������m����_I���e���R�H��Fm�����x���g��QQ'�w}�Z��/��U���Z(�S���(6�u������K���k������k�ehWto�G��e���5��+V8�K�,e�&*�n�b�!��Z��>Y�^�_���V��n��g����w�9�����l���m?=��U�D��&�Ao����AZ&}���a���8Z�zt<k�����<��>����/�b��|1����0l������n�)t'Ht��5�����^Y�zu�z���y��j
N�,t�)���[i��1]�����~m�����v��[���z�����t��O�H��������aI����e���&XSS*T�`�O3�U�Q�>l��$��\�t�m�Mw}bS�e�f�ot��c��� � � � � � � � � ����K���f���������;?��o���������N���C�S��Zuh���['�;um������;����%�1G_���kQ�'��+W�D2udb���[��53��E35i�/��A���R�~}3��?�((��hI��me����)S&�1�+�,S���^c��L�i��;s��	\�����K����_��:������<���&x��}�{������������f�����h�X�>����u�H�����vE�vV�uz���[�"�v�xz�]�\w'#[�2e$[6�d���"�,Z�k�����+_��h��G�&�������X%i���L�:�Xk`�>#�9��K/��A�L?
�*Z�A�w ������~}��-h�
j<y�������/c�|d��X2d0��r�"2��u��;oGb���z-]�|��������������*j�����[w3��{��������^^�~���L77n�g��8����j9�q/���l����e�y�O�o��y��w������� ����Q�����[��_o�gGQ��]:��������&��#U�l9S��(o��b1�Kaa�Lp��Vn�.9�{��wM6C
��]����Z�F���M�6��,*�v�L�e2 � � � � � � � � �q x)�ttD B�g���7On�g��
��j+��k���/����x��R���l)�{��v������1C�/&����*����~k^����'��E����5{;~���"�?~�t�?^��Q#Gz;�i��*U��W��C_,�7w��i5�J��E�|j��i�����SF�+W�8���
�*����ej-����8u�����QxZ��8�/��i
���S'OM��^����gZ4�YI+�O��i$��&�F��~���-��tw�
:����m��Y���-[c����m_G��/#������v�9�(�t��n��3I�$��w�
-]������������k�.�:c���#{6��`1
�{��Gd����Y���z���L+o�a��A�E
�\9sH�lYe��&�F$_{�u��.R��4j���>l��fB*V0a��y�f����p�����}���t��9��xs_y;Vl���C5�����3�H�RY��~�-��+���5�F�F�v�X�4��LA#G�6�Y��^���3�zu��9�6|��M����(Q\�������i
�8��S��4�N�Z�%s&��7�d��A�z�Lkj0y��-���������3g�&�v��vL�����-ZH��yM�����I�"���E���u�g���
D(k����E:��WD�h�X�aI3-��
v��m��l�����N�os��5��~�A�x�����C����U5�(���|U��o_��q@@@@@@@@@�#@�����
����Y]������d�_H��u%k���<yr�YF_�^������w�~��b�j��9_P��y��82~L�>-�c�fG	��������hm��;'{��1����U�TI��h0�!�+h3�z�~��&0$G��%{��S�R%y��we��	#W�\��H�z
�<p`������g}�G���k�`IO�n�z����6��h�����d��A��o��9��q<���o ����o��`�K������ke_Z.M�63{��8
�P���_I��)c���V����C�`�&XI�4@D?����}��u�Y�6m=�����,��;t0�s�)�@��&{��Ua^9;&hkK}ij��^���N?��*���ma�����F&��������q����\�S�L�!C^3�@����_
���{��l�^�Z��\?��3K�1��x��[r�Uk=�
4���B3�E-��4�f�t��V�#��wX�����iI3�=��C���c�o�]���L�zm�I��d���=��c��+�6��Y�V�c����5k�]��BA@@@@@@@@@�N�>����o��%�����x��	;(�!�@P
\�~]J�,!�N���[���0�.��f��2��L��O__O� ���3G��im��������A�:<�^����Ex
"� � �I�Q��0�mQ�JCCyj�1@@@@@@@@�K�8"eJ�Kw��J��K	%�8 �����?o�0��
�e��53h���={�o0?�[efk��I�|��w��ee���?�������1< �@��<y�.iF������a� � � � � � � � � �> x�����h���T�XQ��z�l���]���^0`��N�:����@����$I6|������>l���}[F�~SR�Ju�{� �Y@��<�tS)S����E@@@@@@@@�����*����6�c�)^���fc@@@@@@@@@@@@��{�2%��vFz2/�)d � � � � � � � � � � � ���K�y^X � � � � � � � � � � � �A/@�R��B6� � � � � � � � � � � � �@`
����U!� � � � � � � � � � � � �/�)d � � � � � � � � � � � ���K�y^X � � � � � � � � � � � �A/@�R��B6� � � � � � � � � � � � �@`
����U!� � � � � � � � � � � � �/�)d ���;:��{����������"XPJ�n�	�+]T@Q����i��K�����J�����s���&��l�&�
���9d���������"� � � � � � � � � � � ��)@��o^V� � � � � � � � � � � � ��������
 � � � � � � � � � � � � ��/��uaU � � � � � � � � � � � ����K~	� � � � � � � � � � � � ��)@��o^V� � � � � � � � � � � � ��������
 � � � � � � � � � � � � ��/��uaU ������^���M�Z�n���w�����+���k��mz!�@��Y����Q����1����;���8yr���/
��S��q<hP��8^{��@@@@@@@@@xp^zp�=;����]�d��Q���/���KK��i�K�O>��K3D�F�j���t���uf��Y�6���N���-���zR��}H2e�B�����;��5r���������7�����80��W,_n��>]Z9q�x���	�~���_�i�7ON�:U�o�.M�>)!!!.��~��h��m��������$K`f)Y��t��E~��G�}����S��������%c@	�&�C*��w��3g�����^~Y�( ����={�����
�/[�{s��9��X�l���j%�4��Z�T�(/�����=[.]���8�m���~K�(n���W/sN�+���+�{V�ST������7on�j�|V����g��W�z4�?>���������7#=;�M��t�=^1���-��>.'3J�*U�G�9<&Y�d��)R����hX�b�Hnj�������b�����/���T>9�g�}j���x�&��zO�>�L��e��?y�db,�9@@@@@@@@@H2/%�K�FK�~��&�EL:�����\���3�������g���E��
�}��h����~+5kT�����zL�p��]3fL�.��?��w�~K����C��]K��EL`��9s�����A���9��|3q�Ty��|��p�c$t�O?�$�������+�������K�]�&?���|���R��c�n�Z�KK�:�|s�������w/�m��2la�V��������F���][y��������������L���)S�]�6����'�*�;�|��D�����2t��d�/yc���<�����5�+o������5k����O<�Q?m�"E�H}����}�����wTz��r��/WN\���b;n�|��h�bd]����3sO�5x)}�f^=���� � � � � � � � � ����~. IDAT�K��g�^��}9�[��2��IR�lY/���0�2q���k5a�x����S�6md���r��5���[L�
y����s�N���^xAN�:�h���i�5k�hu�~���������s�F�#o��f�g�}.��7�d^�:�7�L4A@�U&O�dz�U�&�J�r�
���;����[�,Y*����������Dz���/�u�W�~'���#�>��|0l�l��I�=&[�m�w�,&�P���u�!�E��P��%��_�N�n��`[tV�����w�����H3��K�/���l��U�����.��]���O?��%K&��2������-Q���� .�noAkv=��F�L�a�Fr��Us����
��gY+8���[�����w�^�K�V�L�,?Y�V=z�L��+W�l��C�( � � � � � � � � � ��
���^{v�%���&���f+����uk��1��F�y���
�F_[�Hl�I�`����z��2n�)T���I�F�Y$��@r��i�b�Z/g�J��i%(((���:�E6��g���>����9s�Hs$O�K�&u�����w9��i���V���*��Om�F~�[��_��C���>�:u����������?/+V�����}'�R�9d����m�y��^R�R%��'�<��c��o?+�j���f����2��es+C��1�.�f��-r����%�������5&{����G�[_��d����z}���AK={�*;v������l�D=�-[6	��S����#��O'���A\�������6��Q#cjJ�=����@=�~.^��y���8���#0�@@@@@@@@@�7������^���K�UB���2e�������<�=Z���/�O�6m5�B�����jV�Z)W�\�h\i��sg�T[�IB�{��
V���%U�T��s��8}�L[g%��R�n=S���	�W�X��_��r�z�i�`-�������U�P���9sL�YB��aaf��
��+���V�/_�tz����ZZ�l������M�|�hPF�v���������^�����m�����$c@��+�4l�@�L��2��X�"��
<��|�3�.T�~�V���-�O��A\���{������M���O�����,<<�~M3�9vnP��i�����3���p���p�s������_�GK��,���Q�XQi���|���p��S�y��F����4�i{���_z1R?��/t�m����9�\�2���������I������v+W�p�L4[YP�����o�q����~��V&�G)&��3I�� �Q����?�3�iG/����a���g��h�B/��0 � � � � � � � � ����K�
��.��k7#0j�gYi��~�]�Z��N��Y/�j����d���&)�&M���E�w�}�<���{�/t��,]����R�H��[��������)S��q�����o��������
��/5l����a#�o��������\�t�i_?��kW\5y�$�q��������R�VM�A2d0A����
�hn�����Z�F
s�/_�^b?o���5"���Ey�01��}v��Wo[���`y��5�0a��R4s%�A�Z�������c�T�P^F[���4����q��)Y�r�������0����{G��4b�b�"�K�2��\��#����:%)_���mi+����;wn�Q��i:k�,�]4�Q3����3��Ek����HH��2y�$9~�������m��O��R�n�|�r�~�<�s�NY�t�9�Yk� � � � � � � � � � �@��K|�s�V���5kVY�z�y�9�r�`D}�988"�%j�B�
�O:|(j�_N�,�����f�G�L���[���R�+s��^p7�U��x^YT�hp���G��;$��"���l���<�����.�E���_L�������X��,[��QE-���������k��Em���d�*T��2����o��
4p\T���M�)}�����W3��9`�i�Yh�=&g���s����a�L0��?th���L�&+V�2��c����M�a?o��O���|����@���x�v�n>�;V����h�����#i	���~�U�7�c�#�l��u�\�rU~���\�xI��]'��t����;]�,���W������7R?����_����I��Yk����?��cgM����a/l�����i����o�F���6�`�L�h�~i o������~��\�|E���o2�m��]^�����zR���yd��3]?�h]v�@@@@@@@@@b x)F" ������:���G��q�g��3ml�o�u��
�r�
DHj�S�$m��2�z�����	�=
��OZ<}����V�X!;w�4Mz�p�B��1�n�g�� �"��]OJ�{<vX/��w	[`�x�J{v�*U����^�*��F�9�C{��iNi��"�I��/���S�pV�^]6l�$�g��/�g�W�9}�����[D&���=������gO���e��i�'O3�f_z��^��k���/��/��z����v���`�
V���~�M.����kZ`eb;y��Yk��#��~��fr�lAZ��r4S��h0g������0A<I�4{�Y�QI3X�X�<��4�k����|h��H��]i�����M���{�+W.�Y�|��&��)" s���r�HD�l�A��'L4�K
��`>��*�;�|F@@@@@@@@@�/9w�,~%�����<yr+Pb��K������Mu��i\6���m%��\����e�-[��q��&�J��?o�r�-(�}��AW]�Fd�h���4n��}��P�5���7�����3gN����	#!��4��[�%�[�0��U��_p/��|p(���;����^4y�$y�������P��e������3Q���g
�(he^��g�l��������O{ �/�h�<���s����u��c�:�v�D�L���n56�no{w��6j�g�j�pi|fJ
��s��9�w��_������/�`����]�y����V�=H�n��?w�����fR�c��5+�v��������Y#���-�����OL���*u
��_��	���~������n���u-|F@@@@@@@@@�A x�A���9�	x�a���f6�fezqW�����c�d�����/��w��{��q����(����i�f�{�������:u�dp=���X�}�q��_�����w���t�i��-�i�`�YN�8!?�����a�F��j�����x�"�{�n�eh��o�#G������M�6&H�^+
�z����v��h}}�����;G�5���8`�w�����m��ED������i_8���wl����nip�La������k��?��#S�)U���9`�	����#G�c�=f_��^+}���]��7p����[o��M����>k����
me�Y�xq�����~��9��l��������A�zN��V��[��H��@@@@@@@@@�U���x�epN�[��,�G����! �,���[.��
lE��$�R�lY			���O�w�}��[�$����n��%-Z4���7�����K��k�������������&M����cS���9����a�K����t����7������n��r���@i�����0Q��? ����O?���\�rEB���\�H:t�����f3���U�t���*{�`W�$88���x���.'RE\������iR;=N?��N<}v{�[3�t��9(�g_����]T}�����u�.�w����:E����V�1�<�4@��O>�zu�H��Y�l8����z����O<��dV�LmK�,�/����Y�z���:�u���=s���v��hv?W�>�$� �h@�@@@@@@@@@@�^������@����H��V��n�Z�Cf�28���6���f���#"��ec?�����Y}Lf����{�:���b=������Ce����/_>Y�t����+��$t�r��QC���~O���!)S���2l�/�����1�
������K�L#�K�������M�5����,[(�QE_��9�[O�&J�,Y�H+�{����{�k���z��~�`=}v{z!b����e+E�2}�4���~JB�����q�'�����#�
���k��M�y���qV�]��y���m�%�zn���kR�zuI�:��_��L*V(/;����T4��fV�b�����7O���/��3���U����~��H����9���G��
@@@@@@@@@������QHp
������]�����6����s���9b_Q+ *����{Nr��!�6m�={���65��-h�Bx������6�?oe�X,=��,_�B����k��	4sO�
����R�vm�={�h�������K|/]�pA���{3�h����m�aa�b�����K�B�M����k�����3��	�M����%kV��s��
x����%k��U>�9���g�}�e�D�<�������� H����}�L��r�tg+����vg�:�=q�8�Oz�Zy�lo]+u��o���\�Z�X�c�����3� ��}z{�$�i�*��u��e���Y�g�s���0�vQK��9���'�Z�g@@@@@@@@@���|�B��!��}	�E��|����U�Sm������6n2�S�J%�BB��I
'5��/�h�2j��x���t]�\93Ol��4N�6md��0��'�	\z�`�X�W�v��i�'N��l;h�"
\:r��Q����7_��K�a"�~���[�b�8�����E�D34����+NSV�^c��=�����a#�I�*"�T���<����C����j��r�����u:Z�����;w:���/�M���R�J9GO�H�c}��$���q��<����8w�n���1���3E���!����sg�V� ?OGl���o\�6NL'��Im�\���1������V���]������������5��~l�B'�=�A��a����V��0���a���f�sVBB*��?�������%�gs��� � � � � � � � � �@l^��m�q�L�2Ik+;�`�7��j�U�n�
i5rd��5#��iSM}�z�%00��8I��K/�l�!};c�\�v5��U�f-3���[<�K���m+|'�s���+VH���{<����c�H�*��c�����c;�����s
\:|����QC��n��O������i`�?�`�������,X��]�
�qdU�re��1�i���Vt�����v?�X���C8`N��q���w���L?���8+j��Z&�/�]�Z4 F�^{�w?j��9�����N�t�$A�%����)O����v��]��h���Ce���N�5�H3�i��>"����������N�F=i���?��_����=����������~������{���n��m�4�H3w�W����%`F#��fX�2{�,�;w����u]�>��S��*����P�����$��l|��q@@@@@@@@@����C�1(�k��Ixx���������_��	�)������G�8�������7n��^|A��_���[�=���\�/����N�H��������r��[�#���%z��f2z������	���A����'+����+�{�v�LPL�,Yd����Y"�����1�����&pI�!��)#c��7��k��}�����u�V���53���r�@����W�u��u�R��Z�"vZYAlE���VV�re������{I�
���	����O���M�K�AAA��s����W*�5kf�\=Kt�}��5���,
�;u�����������_�0����9sf����+W.3�����(�NRx8Z��������z
�t�jN���u��3m��+3g�4�m�/g��-oZ#��Ii���i���>��#�Ao����u��g7�}��5������V�[T�TI���l�u���x�":�=��&M��������8i�$���_�u.��m���Ym#������u���e��>}�<�������>�~O�-[je0|^{�Q�MA@@@@@@@@@�� x)a��-	
t��U���~l����r��������o&��K�(!5b�N��[7i���Y��i��D���9SFy�r�|���&p������/_>A���$-�?����~3]������������z$T�ne��,'�2w������7-�S�V�H�t�~��1e"�r��}�|�����~*W�^-�l���I��q��
�^�w7����0��>��d���]�8��X��ds�R�nD��������%
���<yrsh���{)8(�d	�,�K���4�P�?s�l��h��Z/���+s�f�Z�����o
�+\�����C�����M������;n����^�����|y2�`U�l}.E-I�y��'O����v���$S�Q�>}L�1
L����d��E3g��������Iy�
�����A��J�|y��N��R���?f�Y�0Lrd��mP��}������~����G�re�sD�	��~�z^�xQ
."~�q�%o��E�����L�>-Z���*���i2�8~\JDJZ�������D�����=����E7j���F��E��fX�LK�;��[ZZ��r��������H������-Y���G�<����~s5p)>�U%���[*@@@@@@@@@�A��|���$�W�{��n��w��z�L�1C���o2�hV�|��eKY�������n�HJ�5j����K'��lYN�L��`s�D���3�i�W^���s�u2}�����^V�����_���Z��b
��o�3��Z��O/��?�D�x���/P@��Mk^���5�T�RE
,?��G�V�j��������#�J+���5k����$g����H@@��}5z�+��;cSy���M�.�Q7
��k�9�\�Sw��'���q�1=����������m;��,�j���I���T�����2j�hy���L��;wD���q���lt:G;+��[+��������fs���k����y���<T�B����%}�T�TI�Z�[�m�g+s����d��
�[�?����]"5^�r�4m��y�?~�~O���d4�����8��={�m4��c���G��w<��i�l��R�h1���R�wZk����+��	R����I+���w��������*��;_�� � � � � � � � � ���@2++�?�����}��D��?3 ���\�~���SRN�>-����D�E_���&Z���������^��	���n���V�X��1@o�����@@@@@@@@<����K��E����X	�y)V\4F�_ C�V���f��������f��J3zt���=�����e��L���>��b �����Y[�4 � � � � � � � � �^ x�����,��M�T��,Y�X�l�s��l�vmD�R��$}���9Z�t7v�������K/I���fRfA@ ��;�m�@@@@@@@@@�8	$��*q�I�X	��wXJ)�>4F@@@@@���� IDAT@@@@@@|U`���R�d_]��2/���` � � � � � � � � � � � �$5����e? � � � � � � � � � � � ����K>r!X � � � � � � � � � � � �IM����vE� � � � � � � � � � � � �>"@���\�� � � � � � � � � � � � �@R x)�]Q�� � � � � � � � � � � � �����#�e � � � � � � � � � � � � ��^JjW�� � � � � � � � � � � � � �#/���` � � � � � � � � � � � �$5����e? � � � � � � � � � � � ����K>r!X � � � � � � � � � � � �IM����vE� � � � � � � � � � � � �>"@���\�� � � � � � � � � � � � �@R x)�]Q�� � � � � � � � � � � � �����#�e � � � � � � � � � � � � ��^JjW�� � � � � � � � � � � � � �#/���`�+p��m7v�4j�P��[2d�����I��}e��U�m����zI�4�=:F��_������~Q��������=�S��#{p���>o��U�v�"%K��lY�H���b����g��}�����#=�����'����J@@@@@@@@@@@H�)�����	�>}Z��l�������c��m���~!����'�h���~���������._�#���O�kp��={d��_����$00�v�@@@@@@@@@@@@��^��+�zT@xZ4�.e��I��2)5o�\z(���uK���'��.�I��q��2��C���	p[����yG�t���{��������L?��k��������*U�2�����-&D�k�N/� -�vQ����d��)�5kV�iO�0m�:u��]�� � � � � � � � � � � ���K��f����Y#;w�4�3g���u���M�V�T�b�������r�lPP�����L�>��v��������+�
iy!!!�G��=E���zD-i��K�,Y��u,>#� � � � � � � � � � � �@� x)i]OvK�;w����u
���D�����~��Yv���E37�*ZOA@@@@@@@@@@@�*�<���@R�����6�]�&w��I
[�qg���
���v-[����S��� � � � � � � � � � � � �@\^��}��@�2e�^n��%��Dw��M2{s��;���*?^�U3�#� � � � � � � � � � � ��-@��}2�?4n��T�X�l���>�%�K�~�$,l�h�"O����%m��n���/{:\��
������{��4���G��,��h� � � � � � � � � � � ��F����h�6�	�H�B�.���PI�,�?vL���si�����O*V(/_~9�dfJ*������dL*�b � � � � � � � � � � � ��)}pM,	���%�|3i���|��;��a�l��E��?/{���\4n�8+�i�������2d� vZg;�9sf��q�|��w�K��.��K�.R�?����- � � � � � � � � � � � ��7^��&c��@����^7�������o�����R~���th�N��[�r�AAA.���"}����3�D����si�� � � � � � � � � � � ��@�|�l�%J���>�X>6����y���������o�������� � � � � � � � � � � �>,@��_��-Z��/��������XE�
���l�r#�@@@@@@@@@@@p/@��{j�T�R�R�L��"�r���U��}��5Sn����{b � � � � � � � � � � � ��/��uaU	$p����k�.��M�2�^_�dI�m���?o�a�z��	y��w].��_%��� � � � � � � � � � � � �@��P�@R8r��<�����SGZ���*U��C��[�n���Ge��	2n�XCP�n])R��K���p�uZ�&M��1��6��_���k_#j�q�F�}�d�")R��5�i�'�m��2u�T������_O�+=z�g%K�L~��g�7w��3Z�rDR�NuZ>#� � � � � � � � � � � �1
�#
��@����5kDW��G�	&��
>z(On��Z����2��o��<h�����;N��o��fNr�=I;����&9��c��)S��o���3g��� � � � � � � � � � � �xS��%oj2��	4h�P6o�*a���o�C���L���� )]�Q+�������J�����n�)���1VS�M��M�6��3g�>���+�\��� ������@@@@@@@@@@@p)�������k���E
xm<B@@@@@@@@@@@S`���R�d��\s��@r?X#KD@@@@@@@@@@@@? x�/KF@@@@@@@@@@@@�^����@@@@@@@@@@@@�C������d@@@@@@@@@@@@�A��%�J�@@@@@@@@@@@@? x�/KF@@@@@@@@@@@@�^����@@@@@@@@@@@@�C������d@@@@@@@@@@@@�A��%�J�@@@@@@@@@@@@? x�/KF@@@@@@@@@@@@�^����@@@@@@@@@@@@�C������d@@@@@@@@@@@@�A��%�J�@@@@@@@@@@@@? x�/KF@@@@@@@@@@@@�^����@@@@@@@@@@@@�C������d@@@@@@@@@@@@�A��%�J�@@@@@@@@@@@@? x�/KF@@@@@@@@@@@@�^����H�����T�VU��I-[�nM��e{� ����>��;����;w���d�#O�\��N�Z���X�����?�O����Y�:��� � � � � � � � � � �@^�#�P�������S�m���x�G$0s&��YJ�(!]�v��1�����������#�����/��:5p(j9s�����ys�V{��n��]�6}RBBB\���mY�v�|�����Ey�@~�:�����/���a���oK�F
%{p�}���U�z5��t���v��Y�6����6�F��������d�b{��;wFj��9��9������w���9���s���)R������?����7���t/����
}��9yw���xe���)�<�H1�����a�k�.���K�J+�������/_�_��'O���s+�y_y���y��/]��i����G�WL�re�8����d��I�*U�G�"Ec5L����}+T������s�g?q�;g���{�h���t��>q}��FY0 � � � � � � � � �x,����4D�h����
[�#G~=�L�,C��
>x#Z__8�k\�|���8����XA=o���?�
�pW���c1��L���	���2k�L6�C��5��n!��~�����uk�8|�g2p�[�#�N�>-;v����S��-�����G\�
��[�
�.Djr��1�C��$�.J@@��a��|b>�F��J��i� nL�f�:�\(�B��������������
z��[
�Zykqg��4�<����	��m�{�h�b�[�b��� � � � � � � � � � �@��y)�/�g�k��I����W���d�R9x�����O&L�F�( ���	Z	[��m�<uZl�����������Z_�N�s�9�m}|WN�4I~��w�V���*U*��2f�(�j��~����y�bl�+
r��%O=��	f�����,�����&N��Q����s��f;_�����4XI3�=����7o^�@�����O�:%�=��	\*T����0Q�rD�^�CN���|�`����A��M�s����cd�Y�(�$�o��+��������G���}ga�@@@@@@@@@�P��KB�g#F|)��^R�J��p�"R�jU�X��\�zU>>��x����ne/����X�j�l�����+���#G�`�B�����1c�����m�<�=���=w^�'������_��}K���K���~?���k����J�*I�b�XA�?��o�5YS�,����a#�(��7��*T��t���{H)53�:��lo�#G�YM�A��\�??�l���Q#�b��N�
'�����	 � � � � � � � � � �@��W@��0#n4�I��%[����K�����~���8�Q�YX��ko2��=:1� 6l0�!j��s�����)S�e�L�4ib���6�x��)#'����-��e���Z��2c��u���8����e�u_h����4�-��I����;LU�Z�#.Em�'O�{()��|�u��Q���3g��?�#���pI�&�9\e�jP���k�@����F�{���=kL*�/'A��J�������J�~�D��
m������]�e�"��V�Y�f��f�������h6�3fH�����r������X�"�������<e�d��:���Y��81�y�����LJ���Z���~���N����O������~+W�p�N��������7N����O������#����I���d�����[����$ � � � � � � � � � �J��%W2�G���#2��H���y��]�J�d�d��Ir��
�O��+�/7-48&c��1��:��v�f�5jTb-!���V���{��]���b�,Y"���<je���K���k��~���:t����^������'����
����K
��0a|Rg����z�V�Z%��.%�~�����W���#w��5��_|���r���?:]�f.k����Z�R48P����wK�vme���N��N������c����f�WO�8a���S[�m�xV�F
�a�0�3g�H��M�r��������^=�9�������sK��5��Y�g�l���X5���f���S��Je��Ir��1����m�&}z��zu�K
 � � � � � � � � � ���K�J��8���%����
q��]
Y/Gkv}	y���^�����[k������'{x��

��Y����h��C�
�����l�������{�4hh���)�T���s:���������E�:m�'K�.-��,]�AAf*5��z�w���|�u����w�������7����k���7N�\�"�<�Lv��A.^�l�]����K�j����s��e�y�f$#
�{��W����Qc9��9s���<uZ:v�$����4C���K/����L���$��E9u�wyg� �w��d��%��i����X��~T�^��7j�8�ym��W��z��io�tYD������mj��g��I�g��X�e�9s�H�jv(�p�A�}���c�O�=�����%_�|�}�vy�g��I����EQ� � � � � � � � � ��*@�R��3yRX�b�����l�G�/�&�A�nYuF�N��:���f��R�T��f`~7����:����F�i�����O/2��="1�v��+W�0�k������6E��G���%K�����	�F�j&�b���&[JB��&����L0�����Y����t����z�ip�����oV��������?��k��Oo���?��'��V��%JH������c���y�M�������3#�|��g&����eu IDAT|k��������2r�(���]���&�H���������e�7�h2oi�>m��a�������A
�Z�"z���k�d���fM��#�l��������
�w�{��j�1�x��L��<{�l9z���k��y�tQ�D@@@@@@@@@�D x)Q��<�
�={V�v�b���ysi��	���f�(X�����G6n��`�<��=SI��l	6/�M�K�.&X`��)	��z�W������g�?����V�����K���������0i����OG[�f�^��d9��m�62x��i������
8h,|�_R:�X�15��5"t���
����k�Aa��MK��}%Y�d��������o��Y���h��E����;H��i#���Y���"�����|�m*������5�>��k�=kV�uh7
���nQ�o����t��%��v/�X��9��@�����FA@@@@@@@@@< x�%� �����:u�d=��X�N���rv������G�L��������������D~����U�6ujG��n���9+�.>�h�S���J��>�f���',�h�B�K�l4��h�����R�F
��Q�uF�?Z�li���o;���'�9�n--��� Yor8���)�}���V[�l���M+#P������7�N�<io�_�x�|.W�����e�9?��������oH��${p��O�V��Im�~V@���V6#_*�B[��,^�Xn��ii�����y&Z@��-��m�XA���/[NZ�#M�@@@@@@@@@@ ��K|%����[��E���y�f��h������g�:�@
�p��%~f�wT
����@�nfF��n�����$����������e��%f�
4��e[f�aN��;Q�bE<d��X�J��;o�m��IS����:�UW�?������fD��������#M�4����}R���A��N�O�<�c3O��c��M�6��
�'N�0s;�\�p������N���}����B����W_���{%K��&���Q�p����$�K��'���J��m�����O��V�^e��:�u�%�=s���fc����W�\1��FE� � � � � � � � � � ��=���* �%�h�:4TV�\)�����K��l)�P�d�"�����sG��� K��s���/�'��L'
�)R���]���[��������%E�.���
��3��w�����
��e#�����2F:fL�n��3�/_�hz���s���0�7�dpJ�%1�c6����u�=�>m��Nv?%�^G��^+m�������o�&GGW����U���W^�n��=�L39��A9x���[�����{w�-_�fi�������iI��?o��O��9�f�Z��Yy��gb�����G9��9@@@@@@@@@@ �@��0��� ��2p����2,��zH�/_!����+���_1��0a��O|��� I�2���B8�K�����5�K�.f(wf4����z�_3
�J�ti���x#���3{��6�f=���4������Z�n����^G��-M�Fs���X����}�}���i<t8V[���&M���!S���@�,�x8Nv���X�������*��]���Z�'�*G��fL
��l@�)Y�,I�r��s��V&)We�w�E��5�g��)N���9��{��mj��|�2{@��������[�`��%G��g����E��3 � � � � � � � � � p_/�����m�6�pa�����.=\�����.]Z�V�*�2��ys�}���t�r��<{������Np��A��s�9.^���g?'����� �h�Bq��{p��j]���S�k��=��i_8y��u9z��YJ���mI��e���\���]��	st�tA�RE
j{[���}��]B?�m�u�f>�=�e&�2���;w6������6N�&�9�����4i�����l�s���kb�j���+�
����i�&-��wV~����is��_#x��(!�SGXGm�~�����~N�"����Bt���'�y��W7o����0���q�3�fZtVBB*��?���������$�9
V��F���/��e"@@@@@@@@@������Q
\j���,X�����[��X!�
���w����}��1	���5k�y�n�� �9N��K�Z�qs,[�,��������L�2Ik+��f�7n��m�*UZ4K�����;m��^ B��y�N&�������~j��/��mP�8q��]�n]�s��W���X��$���u�����.�i�����L�X:f�q���+�9f��]��/^\4�p���N5hH��i��>"����������N�F=��Cy�)�.;z4j�����R���m�����ZiR�Z���b2[�*�.]�s�"gXj���i>u�T�E���}1y�$W�I``��;��/��,�~7�n������������N����k�%-�g���s����w�P��R�bE�S>��Sf����op��v��_��s���������[�h�a/�!� � � � � � � � � ���
���W�u�������];�?�	��6}���o	wz�K��,��\�|�>�V��������i�5kf�����4�q�86l������O?���W=E�$9�����F:�Eu���F�]q\���W�3]�r%R��P����� 7W�
�h�����[����2Y?���}���+��O7�/�����^�����)�yW��f����f�qW6n�h���-+���f�r�'�u�LJ3f�J�*��^�~S��Z�z�����K�D�G�S�V��r��)���k���'�l*�/2�_������Q��c�n]�t5]�ZW�^��qce��������5{�ly�
�AO�f���="kY_���L5�
l�[7"��O>1:�Q<�����O%]�tr���R�NmY�z�	����
 ����+ZD�F���F��&���c�L�����M?
�����?�������_�W_�)����j���I��M��%s��.�;V�/W�|��Gl�P��ai���2a�x3m���KZ���������g���[���{�g-�[�l��m�yy��G�u�� � � � � � � � � � � @�_�(������ysMo��P�VMy(On�Gl3c��,��*�����w�Hk��O������/z����U�^�d*�������xe�<i�N|�~���-t;�+h�V4�G|�P�x�Z4�7���8�]�p��Rr��R�D	�Q�}�Q�G������������I��R�Dq���0C7k�������
����ln�Y����A�b�;�
qWf~Q��K�����S�i��N�R�r�\=s��a�,����}�3f���-ZH��K���/�C��q#Y�r����
D������WJRx�9Z��Zc
>����h���th�N�e�"��3Y�5mLV�2e�xty�����L���$G�`��/�9��Lr7��!C$  @��T�d	��;����&D��7G���g�1�~��Gy����%0�Y����Q]��r�	��e|��]�U��n>j�D})\Hr��)#G~%oZ����o������^2���,s�r�0����l����R�`A�������?�[��uj k��
��<^�/��)Z�����z
mG�F����_����^y%"cb�A��aI3-�o��}�L�V���5���=�7t�$O����B�r�5K���� y���e��{m�H�v���t������X&]@@@@@@@@@@�C��<����i�����-S��)��=���4�����M}�Z��Z�j.��R�/��{w�/���f)�����_�W�T�b2�h���o�����5Kf|��9��e���r��!�Y-�
����zlAu��q;�W��[��Y�x�=���w��2.-�����f���jf�VS�P!�ie���2��I>��v���L���my��m;��-\���Z��
bid���Mk�F�c���m�����`�o�<
RI�:��={���*���=k�������uh�����lf1��zO�U���e������o��f���d�L��?������^j��~u������d��~�U�ti��y��6�%k]����_��Q��|���:i�Y�"E�:�o�hdf����g���u��I�(`�w��e�D�s��Q�`ei�7Fd���{��R�u��1��LK�A�h�b����>}��Nk\�+V����:�3H�9�������*����=p�[�5
�"� � � � � � � � � �@	$��*	4�=��}��D���G�������t��r��i��}����e���&��}=$$$�������n�l>�����f��
o��v"��)@ >�n�j27i�n����&M�����c!������
��L
 � � � � � � � � ���
�?|\��,��de>!@�%��,�W@�]���P0x���X�f���i�'�&pI����N����I�/3��6����^�z{yt�C_X�l�Y����W$b
�N�2�K��i��w}ga�@@@@@@@@@�,@�R�����h���T�TI�,Y,[�l���.�Y�v�$O�\���/V���}�2�5
<D���+�P��KSs�@�G>��7v�����W�IG'O�$�>������>��sY�[��Y�g�l��&�F@@@@@@@@@ �	$�^��'���'��{�a)Q��O��E!� �IQ�uh���?�l-{���-[69q����q��{������?N�[gO � � � � � � � � �$���������wPR�m��\��RJ$���$%����[B��AR:U@@@@JJ�[���>�2�������������v�������s�E�2��_�d�w��@@�:t�����
�����w�^			�5jJ����~��;s@@@@@@@@@@�+/y��A@@�M�v�:�
 � � � � � � � � � �@��njfF@@@@@@@@@@@@��,@�RB>��
@@@@@@@@@@@@�
�@|�F@@@@@@@@@@@@ !����.{C@@@@@@@@@@@@ �/��@@@@@@@@@@@@H�/%����@@@@@@@@@@@@��K�gj@@@@@@@@@@@@��K	���7@@@@@@@@@@@@(@�R��@@@@@@@@@@@@��,@�RB>��
@@@@@@@@@@@@�
�@|�F@@@@@@@@@@@@ !����.{C@@@@@@@@@@@@ �/��@@@@@@@@@@@@H�/%�����'����T����L�\��_OV��e������/�wbfC �/[f�����[��v��n���O���+g�}ix���^�%@@@@@@@@@@ �^
�s�
�X����2a�i���+v�d��^2e� %���]����[}���/����x��kx����/��:5p(r9q������3"��w5��a�4j����������r�
�����Y��rO���uj]��s�����s��7�����I��Y���4X�c�N��@1|�l����[}�_?����-���z�t���<�sI��i��=�Z�*��woY�t�h_�^={���}�(+�7u�}���)���m�����(|����&u��r��A�9�/U��{��m���R=sw���v��S�:��9s��ML+��3J��������{�����+B�"E�z�7�
u���no�4�y��w���><+�s����{���#�C;@@@@@@@@@@ ^$���g�X���E�.`��?D?������_�����R��u��-��K�7�C��+W����E
���������0���;F^��7N�N�<����5��������:o��4^L;��3�t�u���C����*\��0����m$��o��F����/��_|.3g��Gi�r��x����a���������S����HHH�_������+'�W�t�Q��������&M�������z�Q���7���>4H��=+�RV0_LK�4i�h�{M7��� � � � � � � � � � �������� �|�����Kz��%� �w���V`���cL����o���9sf{}G��g��_����'�z=^�fM�s<��q_7v�?~\�T�"%K��v�t����5jH�>}e������9s���{��
���X-�y��)S&Y�r�x��)VE��s���w���6�76Gg���5��i��&p)}��&(M��/��S�M�H��}�x�V�M�����7�Y�SO5�P�/R����3f�\�~=r���_�vMF���y�&�����y�����5V�TI~�Y���h@@@@@@@@@@�� x)��+b����Zv��+� 5k�2K���-[���KL����>������%�8>�2ft��6MZg�����m���9�d��-^�H���g�����FK��m���t��&�e��E���w�a�F��	�������i���I�H���b��)RH��MM�aC�t6{vX�]�:u���,]s�db������e��M���)S�o�W�}�2eJ��!�T�\Y�y�]��k�T�P�n�������[I���L�H�<B}���]�Q3��;wN�L����/��Z���[�2�@���{��\�<W��c!� � � � � � � � � � ���K�(�m��s�?~�U����e�#�ZI��i+����:4 Y�z���j�1|�NFwI�,�8�I���ct����y3����M��?�#P�N�zR�vms��[''N���~����^���e����Y����+;w�l�?���� IDAT��f:_h��������Lp�cD���I�&I��%w���>]Z��@~y������?F;Vl�|��Ii����y��uj���G��*r�`��s�{;y��1)_��d�"�2f����/}��1�����VI�F
%G�l�9$�Ty��L�:U�9�<;�Li���~�����OH)+K^H���5Kfy�
*�������+�:vp��������Y�g��P��t�v�l������n��kn��Y���&C�tr��E����v\��y��7�����w���1Cz��5�T�ZE���K����]��@@@@@@@@@@�0�����@�la�I�&��,��k��r�]w��qc������@���x�"�S.��K�QW��V��C��qCV�Z���k@��h��.i@R�r�L����sm��y����|������	��a��&����e���~�Q����|C�x��K�W�����g��f��p��h`����5Sj��)|0��>�g����9W��eK����J�'�|,��o7��f��@��?�L*�/'[�n�����#�^���t�s�5pT���mZ����m�8*�4il��~�a�����yi���];MPS����c�K�{��j��9?����{��P�m
,���^�|yg�R�J���\��Q#I�6�Y�7���M�j�����+�X�Z���;V8 ��+W��/��"���e��� � � � � � � � � � �� x��
G�����ahB+U��X��P��R�n]��������n�\�r�9�>n����'�2e���W�\��U��=��Q�
��9������I���s��F.��E��z�MX�����d��Ch���e��|Y���D:u�d�:�}@�������"��-�={v{4�G}(�go����[r��i9q��8xHZX�iy��_�x����g��
��9W�I��4��O<)�n�"��_��.��_6H�*U���S��YS�~�z
2z��L�a��
d���y>r��<������������[��{MV����w��I�x������4�2��|mZ������Wz��%K��2�y����^�t���v
���p�����l�D�L�*�<��c��������e����Z�G�2f�h��J�{��c��3g�����5K���'6l��.rW����
~���#�eG � � � � � � � � � �	H���t2�Jp	�����F�s��~�9����-,S����gj�����q����d���2��Q�N����K��.������t>��+W��K�.EYB��H�
L��A�H����o�>V���&��?����`�,4��QF�m�4`����g�K��)��E��s�rn
�h���2t��h��v��|����]�Lp�f���#G5z��-[�|������*�����{}L�����Wz���G}L&M�l�[�MV4��.]Zf��%9s��C��)S"4H4���L��������)�<�d�sW���g����h�>
�=f�����d$r<��_�Z�x�L��|g���2�>�4�K���4i�����W����;��kl�h��Gi(&��N�6M���e|������K�C���5,;�mG*@@@@@@@@@@�$@�R:�l%xN�<)]��e�h���h0G���Q�P!��m��Y��o�<}��h���Y�2��m�x>Q��a���:�e9w���x��pd[��40I����qC~���(K�@�9V��f��������&��6���I�������2��j�,UM�53F#F��6�X�k4�e���&��]���M�5-]�t��T���1,�����FihUr�v��u19W�6A8Z^����[��f5�]���^�<�����y���m��3�u����g�y6B]�/v�9�hF������v��,�W��}��f�Z�-[6�u��3�R�y�N�j���YS�g�a	���s����t��I�n�m���\�0�����g�*@@@@@@@@@@�x @�R<8I,1~	hV������GMF����
�
���;w6k:d���z���\!!/�>$s�i�`�,���7/�kPJ����Si�C������V6%���\��'�v��?�H5z��eD�z��)�������]�Q��{���#FG���#��Y�&N��v��;����I����^�;�w��ok���{���j=�^�s�n�:�v�Y����m�Y�j�iw��g{�[���-�I�y��e�d��\��O=�����2>�d�()S$w~����t9j66wc��X�d��������O�0�:�D5o�"�2��[��k�H[k=�'-���F � � � � � � � � � ��^J�����f�i����]��d3�;o��M�����`�v�����S�f�8v��fp?�f��x.�/��s��Ei��,�/u��3_.\�6��f%y���d��r��Q�u��]�
v��)����0nB�R�L	

5�������f��! $|p���=Cu����:t��>���^h�Z�s���5kV����u;^l��v� >��su��	��f�Z�z�����C��_��l���-k�l��Y�k�U�gN���+�g���Vp���;�T�RE�U�f>��������	H�#0i��u��q�/^d2+�J�J�x��(k;y",�����m��/^4}�{G�
@@@@@@@@@@ ����/��=���t��t���/����B��3��&��H�%���v�3b�p����1	������$���eP���>�[���.]b��>}�dH�.��G����+W�����<�����E31
8���@?���PK�n������L��]��)RTv��)+W��o�`9��]�������|y<��J����������ej���
^��O�2�d���o�����6+��e�e������CU��`;g>��h����G4��Q�M�j�|��G$]�t���<���Z�����#w�; � � � � � � � � � ��������M+�D��-e����'OY�h�����#�o���{��F�)�_�,Y���;Z��q����k�o��9{�,���KK�,vf�}�������z�2�N���86m���|���1���6n�X�g�.�)�� ���j�2PB�XyZ4��K�.���!��/e
�d�hf=�v�����M�e�b�$B��{,�j��'OE;_���\e���l������bRBB�;o�O���w�#�=����Ey^�
I�>}�&r��Y��pE�f��
K��]�����:
��+�sd7�G��;L � � � � � � � � � �@^�M��lE�[���s�H���M��=�5
��R�JY�3�^@?!;���4iR)[�����o�c����i�&�9w.,������x�~��]�B_M!s�$U�Z�e0��o�e��?o��j�r��w;�'K�4&]�U����K���������m�N��M+���u�Q�DI�&
L�ne��+�6ntV�(Q��I�:O��&Mg�S�NFW��i�H�)L��]�2Nt)R$�{5�}���������P3�f6���������3��l������>�����<`������e��c�+�������������������C�L��f���1�����v���L���[����f;v��{��� � � � � � � � � � ��M����v�XoP	h�R���e���%W�\�h�b)T�pP�1&�����i>l���t�u���6}��_�1b��k�.�P��g�������4��$P�zu��������5k�r9G��u��S�N��?��l�{�.���_]�����s�$ ��`A~�c�N&���I���9���Z�����N��1�v���T�2�c��
��F��F�n�+W�����0R�'{��#�T�e���Q�?n�3�W���*������������4�~����?&]����s�H�~������&��U9���/���
��&L�����N����j8��e��,i}�����d�6�a?f4*V�����f���Osf`z���D����c�=f�������j��Y��{c|��0��o��d�����b��� � � � � � � � � � �@P���E�G
h�����5���?��I�������3���f���$�<�/\p6�r�J��o���P��O>��	���o��}���n�z��oV&�K�<��,I������_�"�G~9?.��k_�V�������!/YK��.�B3�����{G�W\���������j�����{���%$$�|wdj���Y�O�+I��e����/�k`�fg�lewy����`�~��G)R��E��|8�����������x������7�8�����N@��{:U�T���/���9R40��Y��?��3�O��^�s��a��HM�2E�]�f��i��I?+`D�z<)���7�4+�G}hN<-�.[�l�y�������v�j����N������3
�U��,_���W}����W��ro�"�}���{�g/Dw��t{��is\���/��6s��Y��h�����]�{E��A�>q�E�R�\X�������?�2:E�������4~�x+CbX�j��auv������a�B�}���|�����:Y��+�bK)mF�s�� � � � � � � � � � `/@����D+�A3g�0�4�E���K���\~���#�\�B+:��J�^��b��h��h�/�������qmX�jU)V��y~���
W������4`�������v<
Rq�h����;��W�&M��=�h����=�v)�'O2���2�d���m���3w���YG��+�r�$I�H�5���sf;�%K�����^����d��1Cz��-�<X)T4��i&�Q�F�?�6i�|>|�,C����p����hy]�u�Q{o5.^��T�&CW�>}�Q�G����~[rd�&9sd�{
����'����xC���tm����W^�t����vm�H��L�Zi������x4�^Km��3m�z�M��9D���k>oZkwW���ny�@�d�u��u��[����=wc���'�J�9m�tson��Uy��d��Ar��i��W�*_��	����",C�����L�f,�?�)\Hr��!�#�^{��>r�=�3�B�����a���!_�<&pI�������{<��	�:t��/v����������G.=zt=�O�>��M����>[\�f���]�v�`J
��Z������C����{��>��P�
�
������f�'���4�.E6s;p�x���U�Fs@@@@@@@@@@�#��<b��G�c�N�/���t���L5~�8Mi2�����f��?,U�T���q�H��8��������\�udQ��NI�&u��������\4�����v�zy��~R�
��#���4[�h���C��O?�5�CQ�R�Jd���ww;����V��#G��A3�h��������?!�/��_wd7�'{.\��,]��\:o��)M��^_|����.��*�������y�����s�r�Y��XY�&[Y�*T�`�SG_�,��������SG������z��Ic�E������K/�O��X)5j�����]�X���f��~��N��IV�Z������X����-_!�}K}5�Gv*U�$����o�e.W���K���9��v����K?G��m�U�����l�Qj��5����?JGE��y#<��6mf�]y�����Z���{�}&HI��
,d2����a������������+�a����d@@@@@@@@@@ �	���U�����z7��+����Kg��T����R�d	9v����a�����2�
���.ZV�^#������+��5J�u�j2�h@	������M�&
4<s���H��[C3N4�N3�iy������+q�� � � � � � � � � �x_����L�"���@�����]6��&�=�y�=����z�/�[�|��G3����7n���Lv�A�>��� �@�X�p���>	\
���|�r��R��{��Y+A@@@@@@@@@b @�R�h��h���T�XQ,�/�����$�F]�b�$I�D�����syk������):v�R�JykX�A�D$��'�>K��9���&�7v�|�YXP��/���D��+V�/�����N�:��
@@@@@@@@@@����V�������w���E
xyT�C@<x�E�5k�i�-[6��9�:tH���/S���/��}��`�B@@@@@@@@@,����2%�`��[�dn�r@@ At��A�gH/7l�������{%$$Dj��)�:w���$�}�	@@@@@@@@@@�� x)���A@|"P�N�@@@@@@@@@@
$��d�� � � � � � � � � � � � ��G����s��) � � � � � � � � � � � �~ x���L� � � � � � � � � � � � �@� x)��kv� � � � � � � � � � � � ��_^�+7�!� � � � � � � � � � � � �x^J<���"� � � � � � � � � � � � �W�����d � � � � � � � � � � � �$����f� � � � � � � � � � � � ��U��%�r3 � � � � � � � � � � � ��G����s��) � � � � � � � � � � � �~ x���L� � � � � � � � � � � � �@� x)��kv� � � � � � � � � � � � ��_^�+7�!� � � � � � � � � � � � �x^J<���"�@	����R��C�2ErY�~}���$V�����q������}#��[�n�{)�'w���_���Q��X;v���?�'��/_�,paf@@@@@@@@@�L��� ;!,'~	\�zU&L� �[��b�����K���D����k��u�O6T�j���]�t��c����6g���m3g�ly��G%_�<�>]Z)T�y�][��qc��C$I�" IDAT�}�:�����?�h�(c���n������^�0��E���R�J)��]���J�v/����qoV�u�a�i��Q	

u9t��1������G���?=���/�����Y2K������o��'<����q\�zk�Y���v��9s���8����+W�\q����O#4�{�����������l�L��M��m��������I���}���k��5������s�+[��9n��!#�����I����uV�����>�{���KE��������W���R�ByS��w��N��g���1��g�{��+�|�����gt�����%.�����ix��u���k�8q�M+����a��=��r�]wI�����"E��h���o�����c�7.�u���fo��>}��7�������r��<��r#,
@@@@@@@@@ �^
�S��Y���E�c���/���_�ei}���?d���R��J9H����:e��;w.��>��s��iS��O�:e^������'K�jUe��13>t���d��a]�������/��������5�v�6��7�u���G�,^,����7o����e��-���H�J��+lzG����-���i��WL�~�i���?��O�i����3g���<yX��}��v
��3�X
>�kI��:��_~�E���si��Y�t��qu0��no�w�/���K�xc8���}5d����A��W�t~^��bR���+g��S��!c2^l��\�f���3C���{c��y�R����|R�I�1�� � � � � � � � � �@B x)!�U��7
���+����K,�Av��#��,�F���
����M�p����R�G�����F����~k��j�Jv��].^�,?�]g�=��_x�y��i�s�g���#G�E��i���			�rL�O�h��$F��x�����7�9��S�#����y)�\c��6�f�*���5=U�T��%K�]F0\cnhsP��[�n����/��k~�}���_6�;VF��i������I��9b3BpT
<$8��Ut������W_�5��������{${����qc���n������~�o�.���7A����p���<u�~������%6��@�%����_�K���O"<k���v����4��f��x.�s��
������m��T�T)���@@@@@@@@@��K�g��!��W_��={���f�Z&`�p�"��eKY�x�y�^�g�~��
,T������/�{R40I�
h�Z���9J
.,)R���e����gK�9L�{V����L�R�d����������;����2D�#I��GX��#��N���,j����X�U��Z��r��@_c����X+`d����������=�b���;wn)]��	(ee%���At��
D}���%c���=�H����%lN=W��{�	.��=2{vX�g�:u�^�f�s�db��X�|�3�r����o�W��W�S��� L
���k�T�P�n�������[���g��GI�&m�cw�}��Ry_9��l�6*#
�\q.@@@@@@@@@@ a
��0�+���@�v���������Z�j��l���'+
�
x�9t����i�Gs���Or��1��{�&�(|��A5K�.��/z4n|i��sg���C�Ug���V��]��y�N�wv�������1
��m��*�=�����Z6o���Y��5�M������Z�����#P7o��L=|xXv6���T�n=�]��h`��u������o����k@��L?��5kV�1Y�gw���]�VZ�j)�) ����\9sH�zue���������
�t|�����p�����z���z��gL���������o�l���g�� k���V���c���q=W'O���������,�C$S�R�����O�c����c��R >��>��,QBx_n��)��3�CG
B;{��L�4I�i����3Gv��!��[����������E�f��i����l#�������K/Fi�}�/[f7�����N���[�x��v��M
���1cl����v@*@@@@@@@@@���K>@eHY���4�4iR��t����=d�g�8?���s-U�T�]W�;/b�������T6lh2dm��Y4��e��EfJ
:K�.]����5�E��5k6S�,i2��������	�7n����_�_�W�x.����1
����9b�(i��.i@R�r�L����sm��g����/��[�l�{eL����h M����@
�H�&�	2]�r�t��A�XA���w��k��j��9?�
6�5H%|��o_�f����%�4��2j��`�4�b}�=W��.��K��O>�X�o�n�O��A����T(_N�n�j�G}�T�XA&L�`�'O.��)���/mZ�����|��w��g��d+��c�d����C�L]��5���oG#��)0�=��-��2��Q��NiW
[�+m5��'%W�\R�zu�t���.�h`�j��O>�]\��F � � � � � � � � �> x�������a�AB+�����!��E			1���={vG;���am��O�2#I�B������'�1�S�$w%�N�:�%5{����r�
3Eh�w�	\c�69�����/��R�����x�������+.\�I�}��1�� ���}�_��V�^��e��=����:2r��20i�3w�����E�t�z�M�lC��X��@~+���,X�9j�R�L]�;�����[���m�^}���O������Sr��0p�	��`���{/����x�R�����3�s�����&U�T�{�K ������m�>\n����-%�qbs�v��!M�46�tz}��y��;A�_�(�� U�T�S�NI�fM������^n���\�tI4�n��5r��Y9s��|���2g�l9��K�4��H��e��y��p�=z�����[������D�n�z���U����4�ro|�����{�yg��(�\h�-��0��9���l��i�����f�_���'���� � � � � � � � � �n^r��!�"�d�b�MD��E�������d���3&�`�����9�OZ/kqd������R�(����Zy���&���Y�����~���0����,Y2������B#
���Ar��
�yJ��`-���e5:���f�����+u��V@NX��
a�1#&�JD�(��W�Xa�"�
�
*��A�>����I�>}L��fl�Gy��d���w�>��F�m�4�-��g����G�g}�b�d�����
>����^~�����|����n�`�K��+
*����[.�Aq�	��cz�^y��\�vM}�1�de;*^��������K����$g��r��A�:eJ��N�:U���g�N�6�
�
l�������	�G�����������u?��{3ft6���~�^3���|g�7�R�|�)�QI��/�����.��,���a�N��o�8q}��%�@@@@@@@@@~������x(�1]�v1+o�������,]�t1/�N�0^�\��v���^5�S�L��]�����r� >�/37m����1�o+=}��3�G�,��4����8-6\g���g����� �&X�f�(he!��m��Y�&X���ue�s}�<��@�s����wl��tC�����������o4i��VV�y���<���8 ���4k�T
��'�������e6���b��<�5(D�������d��\:w�l��Z�yG���m�=��U��a�C�$��������+
��Z^�������f�]���^�<������s�����D���Z�|�(u�+�����`��w�O��O�C��L���"�9s��U�)3��#��y.�#� � � � � � � � � �k��|-���N@_0o���=z�d�:�[�����f(�8a����e.pt�&���N��w�aV7r��u��_Vz���<!!�^
�5�
�}�!�Z>m���k'����`.z�w�2t��`^�����>OYw�,���7��jVG�`���k��s�lJv%S�L2f�8��k�|��G����VF���qp��gO	�������v���.&���;w:�U���g~#�
���}����c�E��jf�f��EV�\);w�yi|�$�s�n�:g�~����uj�~V�Ze�9r$�l��o3���-�������I��j�F�w���/�,+��lY�H�T)%e�����
��r��fL�y��f9�,����",����O�l��K\����� � � � � � � � � �$���yf�~�����i�&�v�Z��e����6mZ����[XF��C�g�Hsg=����r]�_�w�4i��l��)SFB�L��������[�$��nQ������i��C����E�O5l�Hv�z:����k���N�Zf��m�o�`
t\��^�\+��
T�����N�z�����fP�_�����K2}�9|����y�����v��)����0n�}���}��R�(���i��%k�l��������d]l���^z���H����h���"E
y���>	=����w
���q�<6��\������?�f����o����:g��fuqm��H�]�S�r���o�6�{���m���j�����i�u���!R��#
Mf%���`��4+��eK���[<emq��2  � � � � � � � � ��X��%3|��q����iY�d����O~�a�����o����"E�Z�$v��+\���Nf���O�ls���V�e{�e�x|�k��f������
�s�;w6�r���b��;4�F���L�N��4������}�[��f1|��%'Ir��cv�&MjW4u��������4xa��%f����K���"|zt��r��,_���%/^�db0p�������)X���nO����3O�c������o\�:Y�����n�D��0.%�A�q���}cz�����oD��y���tO�\���=��M+0��'���V6������U�e������{��}��3������82-���f�4���#�T�a�V��ol��D � � � � � � � � �> x����8��V-[Z�����'OY�h���������]�v1s��(Q��{M}i��)��}��9�^�
�J��q���={v�,�n��%�3h����/�5��@���[W��/��!��M�~�J��=�rG�i^&�+�S�vV�z9�����6�R��&h����>�e���5-Y���}Em4�X���9��;�b���M�9����;&]����g�f�q�S��0��XG�i��L��wO������/lbv���}ip�f������g r���w�Ov��������{�*��M��1Z�'�*{�f�.����c4�6��U���k[���M����~���B}��o���'N�u
���[�u,Z��P7u�TS��ISl���;�x|G@@@@@@@@@��/�Z����fdi�����;Gr��m��)X0 �n����M�V���+G��]C�+;��q�m���h����n�j�&!T&O�\���`�2d�`�oI_@.[���'&�R���4�h��M�s��!������&pi��?�Z��2s�,I�*�A;{��v����s>_w�	J�*%=�����3g��|�|����eW����������5	���W����a��+������	H�Z��� �7�z��?�<���b�}~9J�dQ_���`>n����X�b� �M�6����?�������%K���JG0�m��+P����Wk��-,����������S-�N�����v����H������>�36�c:�]{O�U��+h��&���_�~�e���l����fk�+����N1+������U�V�UG�K�4�������^
��~��h�����Y���M3����z���:�ms��b����~ � � � � � � � � �	\���~���o4��M��2{���+W.Y�x�*\����=}�����J�D�1��e+P@�
i2xp��5#��������H��m�I(�;u2��&O�de����mU����c��u���k��a��������<�?����k
\��w�T�VM��~��N�_v�����K��.\��^k��[w3�0�����

��-Zd�D�.Y��/U��m�`���a�y�hF�j���dIz]/X���]�V-�s�3H�f�������v��%�����~z |V�%J�m���<�5�O���9R�0r�`-z=:�5����w��z���c��u��W��S��Q��h0���X���4�"�^�*J�]�v���+���U����Tkp�f��I	�2n�I��t����1������+�hU��������o2[�*�������Q�F��OV&D��#�1��D�r~w�;e�Lf�%k����~�z���p������7i0�fX�2m�T�1c�	����
*�NWo�AcY���_���M�6��(tC@@@@@@@@H�/%�3��|&�/��m�Ff��)�2e���M�}2��3gl?1���w�d�_X����h�N�����5k�H��E������y�fy���E3�������F����E��:L���F�zW�����{�q��A���R�^=3�o��&(���5�n�z����&pIx�>b����7�%��P�|�I�����=t���lE�����D����y�����c�z�4�k��-2���bg�N�W�r�F�{�nwA:��;���)#Y��&C�fqd��U���VL]���E�7�825����gV�+I��e����ZC����^x^^�������"E�����D�����~������;M����G�w��>��S�����w+C��o�R�\X8��>���(A�v}�_K�/\p6�r�J��U�yO�'���c��]�.]Mw�t�;�s[�l�7��C�f5���u��i+#N�t�<�V3�e����w��V��e��i#�-v�#��h�N �'����?1��4��V��|�2gp�^@��gO��h��m[�m4k�\
�s�	>j���l������	&�W_}i�A������i��w�O}&���U��n���c�+[�|�g���ivk�i�#�����Lp��.�.9���wL�G{@@@@@@@@@�*@�R\��h4�e��f��Q����'w.���f[�-l����Zu��R�v�&m��3SL�8Q�/&���+��O?�d^����/�\���xc�o�k��q����)�<�����1�Z=�U�Z��4����=c�t��z��x��s>������za��9C_���]���Q�[��8�/��n
���CwM������V�3-������']�4�/o�B�
�w_1++Z����{���\z9�N�b�}�������K/��uTN�6v��������9s����1��s&I�$R�N���sf;�L�4��{�����s'c�1Cz��-�y�i��=���2j���,�o}=yvkf�w�{��Ig*(9sd�lY���}���
�x��7���p�"��aX���o�m����L@�~�]���{�RhE��Wz��p��9��xr_y:VL�����5�����Y3)U*,K�G}(�r�0������ ��������4���M������i�|y��n��{�q���_��Mk��J�(.�s�t�wF�����\��6m�ts_o��Uy��d����W������;
���n�K��)�liL@�f����{
�7�d��� IDATY%�������R�J��cG3�H+���z�f���<4�V����4i�T���c�����+E
r��?e}��9t|�P��}���p�G��~Q�*4��fZ�����4i���]Sg]\�������E�Es@@@@@@@@@�  x)�N�A����~AV����v�|7i���SG�d�"��'7�e�e�U���L�|���=zs�j��9_P�����rd�?~��&>�wd��La=z<��9�=�������7�j�F�*U�=���i0���:���=Ff��eC�g�.���f����?��Yge��3��s�����ke��=&�\�������,J��?l�%��:u���0��h���u���W����9r�0����W��:L~�y�9_Jt�n��+V��e�W�SO56{��8
lQ���Y���DW&X������S�+i�����j>����}��u�Y��m������3�>k��)RH��L�����{�����,5�
:� �N5C�~4�UtE���Xi54Wg��u��WVG]�'�J�M�}��&s��5M�4&��������^���K��5�l[��_��	Uo
���5�������v\�i�s�|��72d�P���f#+R��Y���&]Z��d���O�y�������g�����e������������.��f��rW�gZ��wE�����9�h����U��-��BA@@@@@@@@@�N�.��������+�y�^)^��we4��W�^�R%K��c���
Mv_}[�|hy��L���+���+�O�6M��ne���CCC�2.��<�L;�d5������}#j@?h�V��!&(i���&�����h�E
*�3gnp,�U � � � � � � � � ��_~�{P��(��9�,�	�y)��3V��\@3Q���{fo���_v�|�r3�fj����_���$��/3�4j�(�K�u3�����+3L�|��g�^nZr���j+��.�J�J��/���������GM��f������8� � � � � � � � � ��K\ �@Z�j%+V����u�|��+�����}UR�N����5��+$I�$�v����q\���hv�?0@��s������{�D������������;H��i��,�r#���Z�|�))S����B@@@@@@@@H�w�k������o��W�)����@@�x%0d�`���^2kN�.����GN�<)���3uU�T�9s����xuX, � � � � � � � � K����2%���7������f� � ��@��5��^�
*��?���d�{�����/��?,$p)H��B@@@@@@@@@ :�d�5�8 � � �K���+&}��/�`l@@@@@@@@@����� � � � � � � � � � � � �$t���f � � � � � � � � � � � �H����3- � � � � � � � � � � � �	]����~�� � � � � � � � � � � � � x)@�L� � � � � � � � � � � � �@B x)��a�� � � � � � � � � � � � �@�^
<�"� � � � � � � � � � � � ��^J�g��!� � � � � � � � � � � �  ���� � � � � � � � � � � � �$t���f � � � � � � � � � � � �H����3- � � � � � � � � � � � �	]����~�� � � � � � � � � � � � � x)@�L� � � � � � � � � � � � �@B x)��a�� � � � � � � � � � � � �@�^
<�"�@�����j��$e���~�����b���������.ZP��.�|�2sG�<��E�K�u�V�~:N�\9��K���?�z.) � � � � � � � � � �x^J����{A����2a�i���+v�d��^2e� %���]����[�0K�!�U��|��K��QX5S�Nu�9s��m�9sf�c�=*�������J����3�������2x��K��_H����GE+�u���h
���Z�)/Z���:UJ9t����/U��{��m�{�R��
6H�F�Jhh���u��\���=*�������@~I�6�d��Y*�V���|SN�8�H;u��
����e��m���v�EF�nN�:��� -�7���
��J-B+V�N;��i�������Fz?��[�x1g�^={�:}��W��>�4�.r�s�h3s������]m�{�]��t��Gc��������kt������'���s=L��e�=��3J��������{<�]w��o�"E=����ro�uq�?h�'����7.��m���������3C\�p�y�9r$���@@@@@@@@@,�������E�H��e���r`�~���]�&���!cF���V��>�43D�u��)r����Fj����I��ME{4p����'�'O������#b<f|���?���a���+W���o�.�b�����]K0\cnhs���~]w�>}d���r��q�y��\�|Y�l�"~���y���\����U��'����&�o��^�z�m���s��1��:���?o��it�m���'\��~����z_�={�2�?^��n%~���quP�[�-���O�����������K�Xh ��}v{c�C��a<�\�r�|�J���#�x�O%M�4B�W�����7����>b:����{2��K�����E�5��� � � � � � � � � � �@� x)��{v�
���+����K,�Av��#�w��Q����1t�j���Q|U4Xj��Q1~���2��oM�V�Z�����K�����L�]�/</�6mr��l��r���(�6m��6!!!Q�i���2�h�.O�>#�y��5-�z�q��~�2/En���&�,Pe���&��J�*R�dI���k��m�5y��-����e����z���o�Y��y����6mZ�}�I��E���y��)S&Y�r��_��f6�T�V�����d�l���fj��g��~�d���r��9w��l�u�|��'R�D	�,�K�<�K#�~���<����[��]O3�Q<�O�����m�J�*�oV�<�h @@@@@@@@@��K����s/|����{�^y��Y��	X*\���l�R/^"���7�|��o�/,T��������
L�L
Z�V�*#F��B�K�)�l��2����#G���h�()S��,Y�D�����h���q��s�8��!C�s$I�K�"y����S��E�4S�+�T��#�S��a�_���k���\��=���7_~��Q^~��T�XQr��-�K�����X�}�MW�@��s5�^�M�aZ�
�_`��u�����/_>y����+V,7���������}_��VP�2e�3@�G
Zz��d��_�����p���a��T)�Q��&(�	V,�X�@��KbObMQ�����&�)
HTD�Q�6�4X�};s��-{+�^�.�<�>����3��9��>�w'����U��S�N�}���u��������/�=yc^j�vW���z�s�}EUU��4�{�� @� @� @� @� @��M@�R����4*���8"4k�,g�7�p���L��|���uVvc�LPH��}��y�2��fT���z(���[�n��AG%K����uW�����nc�4b����l�IC������d�z>]7�p@��_��X��Q!�
4(���M{��O
���'���^v��a��?o���x�e��i�4�N�W1C�g�}��������g��X:4g��1�o1 *�JN<�����_��7���{?�p8�������(�m�:t��n2dp����+��t���e&�0��m�U�9{���x{vu���v|U��Y�K��6����<�������W�l��%�sR2#_�����d�TV��X�pa2�����s���C�va�LV���:+�}�����/���{�u��:u�v�a���-f����f�=�-1���K�o�}C�����C���s��7@���OO�r���=�����;��jGud�{2�?W�z�������l|�����Z-�qw��YQ���E�X���#g����a�������ih�n���K�0`�������5:��u���}r���n�^G�j� @� @� @� @�4~�K�� ��t��z��I�z�����R��GW/+�C=X��w�)g�v�<�����d�)���^{�YO<�D�
]f�~�Agm��]��7�5�����@�.]���M���[zS���-�/_����*��E�i+�����2d���iSo��|�W������Y'�7�92W]w�����?�vw/�����.;�`����u��x����q`&H/�U��8�H�~�����������������jV\��AM����j��=�K�.��sr�5WWSj��V�{��Y��}����KBp�<1Kb`����<|o�~������{��W��Yw�����?�?��0����fx�)H������}9���|��9)�i�-�H���M6������i������.wOn���eO��m�Mq�>}���Svc������wN�'M�Tvw���3������~��E����^���k��W_
��������p��~�`�dY����O���j�
 @� @� @� @� P$ x��@����z�m����><t��1�������/Ty�_(����k�.]������g��M/��b������k��;��4�1�+�>z����f����k�!���v��=��2��a��U6��y���VE�y����w�A���,������
�d`���;�HATeK���}��7��uX�lY�*���C��!���o��6�h����@������W�4�����o�$v�9������_����a��Ea��%�w��}
������r�]��0��Y����W�w����������*�����he�KN��Q'��W�����rscCi���1#R"��|����O�w�{?������'����a��Ea������~Z��1���S~�2������������7�
GuT���K+����lq��{^������^�0|�tYx���R�Z<�a�Z.��g�Y����c9������#�?>g�f���}{�E���k����M��3�13y��th4��-��?�����*��y�Y��y���w�M��r�-)��������O�u��-[���K���}\���lm��A� @� @� @� @�T) x�J"�N���3���?�>�����]����Zk�#�82=�<f��*�[�yX:�l��\t�d���E���u���e������.l��� ��9#����������g��/���3O�k�:��+2x<�y�����iS�)��~���X���C����K������G <������q�w��a����
7�^j���v�)+�8~|q�N>�'i[|��:e���Lnc�T/���_����6�,�0n\��	��%f_:����x�Xb��h��eU�5]��]]y�`�m2r^��0}��|����SM��3��Y���O��~�w?aB�|����k��^[n�e�y�-�[�na��ya�����{if����b�������_?����C����!f���L�~[�����
����1����6���z)#Q��������J1�k��;�u+��q��i��/�?���s�N�b��o.� ����s��2�SQ@�����+s��gK5�ys�5O�e���M�6�}|U�]�
�	 @� @� @� @� @�����r��J`�b@���EY	<����{�T{U||&B| ���O$WV>�����e�V��gKU�U�H����S8h��@s�Uc���/.�r��s��:oC_c+����1�_~Y�����.�����j�s��L
l�}�?�m)v0fa�e�]S_��n*����|��;1{�u�^�=���'��s�o�s2�K,XP���z3�l������O�x������l ���S�y��A#���~�Yw�Y�*mt�\U�AjM����>~dQ�����T[S�W������b6�X�8�����l����6��]T7[g�m��~�)��d���GyT�me��:_�N�d����l/���X��U�>zD�X&O�T���MK�b������f��bF�`:jEV��
���
7�([�g��7�>�lyze�7���{ @� @� @� @� �:
^Zg���U >`>|�����o��:c��[��/6��������M�e2�TV���U��u*{��v�y�	'���w�UW�/���A��d����t�X���Uq�����_����}�G��������:��1�>������O>�N1d���N5d���>|��W���
�=��0��W���W�C9$������}�=�g�;6_6��}�����1����[s��)�w���&g�^�z���3�<��N>l\�AwM�����	����s�6g�s�0
y�����<�H�X��d<h`���������������}���~�~[o/�������d�<u����d2>u��>�l���5cFQp��e��
m��ai3f��q��g���w�r]�<�pq����#�u���3N���.uo @� @� @� @� @��z�To�^>���p�A��~8-L�mFh��M�P�U�Ec����h�^��O?���~�����b�j��B����[o�n���bu��rujU^c��S�m1(h�=vO�G{���p��_�e���W�v�z?}��T�{���O�>��^��'=���6��}�p�������{x��9��y��/�4�|��ax����l6��vq���U�V!f3��GE��q��]*��t�����NQ@F�W����S��\* �dp��y��=����u���E�p�QG�~z�������~�a��1�\�W\c)���;�_;�{����9�=����O<!��	��0aB&p�����za�wH�.LP�� IDAT]���/>���fV��=��+eV�������!s�}������\�o,L��-[��9k��X�F�k� @� @� @� @� @��/�9�WW����g�f�uW�`�
�����u��`
�{o���1'�{�=������/^Ta�%K��n�u����
+7�#G��z_U���b�������~��zu�_��Xu�Y�^�r���C�k���uz����i��e�U�>���k�^��2;��������mK��|�;�}�����+v�u���NS�M1;S|�~��	�9t�����C�Y�b�����]�>d��=�[C�Y��������x�����I�p��q)s����
0\�>���5�7b�O?[^��_���:��:RQ�8qb�(�������o��3Y�f�=;��kVz����i��Y��-C��K6�R��-S���3�V���n�y�]��\e�}���:��.�(��� @� @� @� @� @��(P����xRM(4��P�!��0#���z��;g�
7��A��y|:geY46�t�T'>��hQ���s��}�L@T��8 ���:!f�x����}�1�N6h��%5^��k�6@1s��������v�u�0y�M!f|�iY���tH}/��'=�P:O|�?f�*���{���M5G�~�B����!/��BMm��'�pb:�5�\��r�;o^������u���:v(�+���t=��*��p���=������mc&�?�0\�u��d���_~������?OrVn��u5W����7�Yg�4���?e�I�X���(�x����0W�3��b��<?��/R&��e����n�����
O}���;��&M���x�A)��lYg�u��7�x��.�	 @� @� @� @� @��<��'��W f'9��C����B�=R���6�x�����m��	��6���x��n���=��9�������5���?g�B���y�p������}E�)>t���[���$X����H����������}�1{Q\�;��0`����)����Z�V�}��K�m�������4���B���U���A�����$�8�g�}�:�����YQ���Mj�y��'Z��������CX�`Af�n���f�mVH���������/�LS�|����Y'nl����#_f��UQz=(9����u�]���F�Jo�se��xZ�n]|��E�MO��n�H6x���?*�NUZ�h��|�Q�������������f������m:��e1cS,q��U�|��\����_-���V}s�����O>�s_���@���'c�k�������$����?u-f��U���6m~���R��UY�svU���	 @� @� @� @� @�@M/�DK]ebP�a��N�5t��=�9sf���(�����~��0�����]�q��R��XF_qE���cF�q�nH���o���B�x�q��lH���d�XZ���y�]�9}��j��.���]ye�a�������]��_�J������K/��[o�Z�jU��b`D�a��3AP�U�N����>�SQ����n��m����>[bo�eJ����B��=�X�3gN�TY O�cV��G�:!����u��D�h�5W_��Z����X��g���u��v��Yg^��\Ud[C��AUg��K������[��Q/��B���{r:����U0���+
$)Y�����q�c�n������Wz��=.�_o���������R���v�e���_���)�UE����+�q���J�o����|��R�����������?�_� ���]���S����
��(L�K�L�4)�|�M����JY��WA���{�������=������hX_�!?g�k�%@� @� @� @� @��! x�>T��Z���;,,�,	�n�yx�CX�dI�W|��!�������t1P�����}�����b�|�D&��~���2����_�lcUm�#J�fM?�ly���}�>�#f��{�}���
��a��!���LB1P�����Xe}��.\��b0D��}����N������~U��GM���8��T�Ne�c&��������?��j�v��(`gz&+H�|������� [g��\v���^Z�lY���OR��xI���J�w��9���#_v���~)(���$���3�L��AY1���7�L��|_~�e�/�sz��v����*��uK�����.�Vf�BXJZT�v��u�]v�?~d�T�\�`��T������'�k;���'O�fFbVu��!��j1���_�3���vb���]���g�yf��VE���q�%LA�/��|��n���w�]<��^�u�g?�i�t������.5����T;��W�}�x���?�W?=��J3'e?c�]5vl���%����{n���?Vz/��H�~E�������kE�Ju���d3,��}w
��exY���x����E�7�xc8��?�<�Lq��ur��g�d��b��� @� @� @� @� @�
+ x�a����b���)7���]w�9���{���������Ud�9jT8��#R���6�|��n��a�m���z(.�������_�����<�������������~���;z4T�)��*f9���|�M�������~P|��������������I������mV<_Y_&L�v�����S�N�U����3�,�F��iT���A1@)`����k�W�9��s����s���}�����
??���N��O�4�Qd4��GsLEi{�.s����@�^=7��]'t��9�s��)X+S����������SOMuf��-l��z)l���M��.�-���Su����.y�C3��U�q�)�X�9���B��B�vkg�kI�b�bu�����������s��a�
�O�_V0��Y�����>�f��ia��]��<����:}�n���q��'������z*���i=���[r�y�N)�/�����N���.�<m��6�p���W�������+����'�R��O<)�E�=���9������g�K�SN<��D5����f����+{OfK�s��'�8��Yg7�:{�>�������3,�LK�s��g�M��
VQ����c�MkQ\��w�����C���h�}�	7e>sc�RY�J�������a�T'@� @� @� @� @��\@��*� P�'�pB���w����������A�R&���&f>:th���LF������B�9`����O�R6����_�`��'���{��b����{c(1�K6�k���b���iS��fcpQUA�2�L���XZ�j^x��p�%�d��
n�Qh��ez��c��a������W���=v�a������{\�#��32����}O&��������?�0�i�&��j��+3AM�&���)����tE����������_��u�������j��u����y�|z�a����;��{v���b�S��x��9���5)�G�	��������/R���Z���lt��e�&d�
�����=6fj�R�{#~�>��s)�a�o���S���Y��v��SO=-������n��������d�3��W��w�}7}N��0!|�!�����%����Yg��|c0O��v�m���W��������w�
?����:6o�������Q��'2�����_�z�DF������W^y���%7�����V[�M6����qg�7��!�m���S����~6��g�-�Q����M&���]_�1~����v	 @� @� @� @� @�@I�52Y�FR�O<�R���F�"g @ �>���L6�����z+��?������K|�?f6���Lf������>e����k�	�F�L��f���N������>�27���%��Z�h���S0}o���3B� @� @� @� @��*x��ya���^e�w��! �R��'�$@��bf��\pa���?�AF6{��t����Nl�s��I�/_~����,�^z��6�x���w������Ky4���s6��t� @� @� @� @�
\@�R�O�� ���rH���������G��N�sOQ���g�Z�jU����\5vlx����1����SMj��B���$�5p��%����R����p��E��'��'�b,�K'����27�I� @� @� @� @��^`����_��n~�x���y��
�FH� �R?><�r���F��]C�N����������r�����/^�s8� @� @� @� @����s/�[}�w]4��hZ�c34 @��N��c�	k�[;<������~;���K�c��a�]w��8.����nL:L� @� @� @� @�����V��7r @��<8hP�/� @� @� @� @� Pk� �� @� @� @� @� @� @�����s�G @� @� @� @� @� @�
B@�RAL�A @� @� @� @� @� @��?�K�7'zD� @� @� @� @� @� @� /�4 @� @� @� @� @� @�����s�G @� @� @� @� @� @�
B@�RAL�A @� @� @� @� @� @��?�K�7'zD� @� @� @� @� @� @� /�4 @� @� @� @� @� @�����s�G @� @� @� @� @� @�
B@�RAL�A @� @� @� @� @� @��?�K�7'zD� @� @� @� @� @� @� /�4 @� @� @� @� @� @�����s�G @� @� @� @� @� @�
B@�RAL�A @� @� @� @� @� @��?�K�7'zD� @� @� @� @� @� @� /�4 @� @� @� @� @� @�����s�G @� @� @� @� @� @�
B@�RAL�A @� @� @� @� @� @��?�K�7'zD� @� @� @� @� @� @� /�4 @� @� @� @� @� @�����s�G @� @� @� @� @� @�
B@�RAL�A @� @� @� @� @� @��?�K�7'zD� @� @� @� @� @� @� /�4 @� @� @� @� @� @�����s�G @� @� @� @� @� @�
B@�RAL�A @� @� @� @� @� @��?�K�7'zD� @� @� @� @� @� @� /�4 @� @� @� @� @� @�����s�G @� @� @� @� @� @�
B@�RAL�A @� @� @� @� @� @��?�K�7'zD� @� @� @� @� @� @� /�4 @� @� @� @� @� @�����s�G @� @� @� @� @� @�
B@�RAL�A @� @� @� @� @� @��?�K�7'zD� @� @� @� @� @� @� /�4 @� @� @� @� @� @�����s�G @� @� @� @� @� @�
B@�RAL�A @� @� @� @� @� @��?�K�7'zD� @� @� @� @� @� @� /�4 @� @� @� @� @� @�����s�G @� @� @� @� @� @�
B@�RAL�A @� @� @� @� @� @��?�K�7'zD� @� @� @� @� @� @� /�4 @� @� @� @� @� @�����s�G @� @� @� @� @� @�
B@�RAL�A @� @� @� @� @� @��?�K�7'zD� @� @� @� @� @� @� /�4 @� @� @� @� @� @�����s�G @� @� @� @� @� @�
B@�RAL�A @� @� @� @� @� @��?�K�7'zD� @� @� @� @� @� @� /�4 @� @� @� @� @� @�����s�G @� @� @�4�� IDAT @� @� @�
B@�RAL�A @� @� @� @� @� @��?�K�7'zD� @� @� @� @� @� @� /�4 @� @� @� @� @� @�����s�G @� @� @� @� @� @�
B@�RM��k�����:�� @� @� @� @� @� @��O �H����w-�����������������4 @� @� @� @� @� @��������y�f�w-������vm[���.k��9
 @� @� @� @� @� @���{���n�6�w-������.��g��>_|�e��i @� @� @� @� @� @�u/���/��?
]3�
��/U%TG��5m�[�Kx����g�?��V5C� @� @� @� @� @�h8�O?[^}���~���i�&
wbgj�k|�)������1���o/
k�n:ul�5u�6�i�e @� @� @� @� @� �Z	�D.���A���O�=�
���Z��o���T{�Z���_���
���4|��W�n�� @� @� @� @� @� @���h�f���}��c��a�5�l�S:G�^*��4 @� @� @� @� @� @��& �-�fD @� @� @� @� @� @������H� @� @� @� @� @� @� �o���mF�� @� @� @� @� @� @�@�^*��4 @� @� @� @� @� @��& x)�fD @� @� @� @� @� @������H� @� @� @� @� @� @� �o���mF�� @� @� @� @� @� @�@�^*��4 @� @� @� @� @� @��& x)�fD @� @� @� @� @� @������H� @� @� @� @� @� @� �o���mF�� @� @� @� @� @� @�@�^*��4 @� @� @� @� @� @��& x)�fD @� @� @� @� @� @������H� @� @� @� @� @� @� �o���mF�� @� @� @� @� @� @�@�^*��4 @� @� @� @� @� @��& x)�fD @� @� @� @� @� @������H� @� @� @� @� @� @� �o���mF�� @� @� @� @� @� @�@�^*��4 @� @� @� @� @� @��& x)�fD @� @� @� @� @� @������H� @� @� @� @� @� @� �o���mF�� @� @� @� @� @� @�@�^*��4 @� @� @� @� @� @��& x)�fD @� @� @� @� @� @������H� @� @� @� @� @� @� �o���mF�� @� @� @� @� @� @�@�4-�q4�a|��Wa������~>�����_6���, @� @� @� @� @� ��4m�$���Eh�V���s��dM�tV��_����u��|3Z����>
���0�o�&t��.4k�$|e
��� @� @� @� @� @� �
b��%���}�I���:a�6�VA/��1
^j�Y{������KB�
{�5E6��S @� @� @� @� @� @�u!��g���7��vm[�E��(py�h�?�D��������.5��� @� @� @� @� @� @�u+��E���[�0����������V���hZ��^��~���i�:�� @� @� @� @� @� @��^��Z-B�V-�����}�Z,8�K
4�K?�(t�/) @� @� @� @� @� @���.����a���0��/5r<�'�.�d]j�@gs @� @� @� @� @� @�@�	�h�,�J(��T��� @� @� @� @� @� @���6i���K*��T%�
 @� @� @� @� @� @��F@�Rm�C� @� @� @� @� @� @�@����$R� @� @� @� @� @� @���^���c @� @� @� @� @� @��R@�R�D* @� @� @� @� @� @� P�K�Qs @� @� @� @� @� @�U
^��H @� @� @� @� @� @�j# x�6j�!@� @� @� @� @� @� @�J�KU�@� @� @� @� @� @� @�@m/�F�1 @� @� @� @� @� @�T) x�J" @� @� @� @� @� @��������9� @� @� @� @� @� @��*/UI� @� @� @� @� @� @���T5� @� @� @� @� @� @� P����*�T @� @� @� @� @� @� @�6��j�� @� @� @� @� @� @���T%�
 @� @� @� @� @� @��F@�Rm�C� @� @� @� @� @� @�@����$R� @� @� @� @� @� @���^���c @� @� @� @� @� @��R@�R�D* @� @� @� @� @� @� P�K�Qs @� @� @� @� @� @�U
^��H @� @� @� @� @� @�j# x�6j�!@� @� @� @� @� @� @�J�KU�@� @� @� @� @� @� @�@m/�F�14�����-[4/�����U���/�(w\l�G�nU�B����o2����j�@�����~t����Z���.�����\O��VU�����<v�WTu����2��������h�}���H����|������7�l������������2�X~I4���z�)�4���K @� @� @� @�/��&WO��K�����)~0��[���;�,_��Z������}��z����*����o�}�k�u��v�k��F�c{������L�?��O���z����m�w��z��`����p�����/9�`c�
X���������W|�|g����_]n,XP\'>�^W����-�m��65jv�
6(��l��F����AXl��[�l&z�n�Vq��
<���?���������V��s�-��~[oUe����������e+d�C���SO=Uvw������zP3�B�]���1~��s����O?��x��k��q�r^:'�tb�����������^S�1�����}M�<9gS?����u�������F @� @� @� @�@�^�V�����~{X�|yh��y���S�����
W^ye���_�~a�=����s�j��I�&��='�0wC��u��7�;m|xo��9������b���1x��u���rXr�����s_w�yG=�^��?����������W�d���Sj-���G%��g�/<�3�d��I��/�����h��K/Mk���z�N'�6mZ�o�n���}���9�*:���f����y5��5Y���8W
���>F_�p��W�w��|���{b���������\w���N�b��H��N� @� @� @��{�Kuo���T`��[��O8�����������?������R�@���m������&��{��Uy#�6*�A�N��+F7�	����LEkQ���C�n���t����9���^z1���8 ��:�����e������]
u���ag���1��R�@\�b����_���Yw�%K���T5� @� @� @� @��F# x��L�����g�}�y������#G�^�z������|��J�m��=������7+�X���e����(=�����������C�v�#�}e�w(p��gx�����N�:������3�,uo5\����n����u'�?���������Z�j\���
���9h��0d�=R��+21UxP#�a=���Yj���k[n�o�X�����N���4t����x��E$;��o�a��5���: @� @� @� @�@I�K�u 0{����?�{o6�������S��e8�2����E���c�T��;�C����5th�.�<`�p������e��1���_sM��%7l�m�T��O��^mv�1"6fL�3�����_�?�x��40���y����X76<u}R&h [x���������\3�r�a2��i��v�~��������	n�~�{��q���������y����g<>�<�������oE%9�|�M��k�t�.�;�]v.����VY�����g����M����SO=��_X������zP�����E�!��*^W���6�|�p��'�y��Zic10���O�8c����n�������~�����x��?
)��k�����^{-<����c?a|����E�T.��v���If}�����C�4_}��2����C\sr���=�����;��jGud��(����^�{�9�������%�m�:l��W8��#�=�gWvh�W���*j$��J�	L�3�<�HX�`A#A��i=�����z��k�����5���y�!������{�u������>�����y���E����n
�/���W��H���_h��y�8ib����e�m��z���w�����)v,�q�#���|���(~���������,���9����]�����o�tl�����/<_�qv @� @� @� @��@����h���*��5�!C��d�{�����[T����[�w�}�}��bp�'�|}����a���u���m�pP�/T������&�3�<�x���������^mw���^a��6J�(�|m�+��~�yp�s��a��o��8qB��J������}��;������Z�n.\ff�}s�Q)�)^3%K�LP���_={�J����%�g���I�R�g�������!�O��~���*����/�H����?��������K?Xv�q���wyx#x���[o���k��3A�T�h�
����7A1UM��o���n�p�/���x}�Xc�L\��z�p��Y�6���������vU*��7�J<$<i����c�0hPQ�m�<���t���s�����?�������[�}e�&�nZj�i��i�����.�m���e/~?a��L��w�e�]�z�����i�&���a���a�=v��!��|�V��F�#��������O�~��w����P���f3k=��{w�D�����f�.�����.;�����5~��������{�����J��]�+�\s��U�}�@�v�2�5vO���M,�3�S}�Q^�F��G1@i�L�����6}7����{��9s�����08����r����O?-�n��kb���{k�]wM��B� @� @� @�(4�K�6��������������4`��S�H|�(�5��J|���3�������E����`��3�
��wO����/�~����m1�)>8�����b���O�f�mrUY�mk��f8���RcF_�Rm��������s���>���p��)�W�����WT�Cp{��W������s_	���Ax{��t��m������+�&s��,���n�y����I'��vw�����l���Z�\����0|������ IDAT���@������7�
.J�x2@p|&p���Q����^��-���+|�����7�L����bpV!�A����3�w���������L����-^����B��}S0���Ri����z�A�lw����7�XH�S��e�L��84���C�������9���5kV�9��q�����x�x�`���������c���=����lCg�qf�5�]�!�X�:��rk�����y��35�sl�����{�Kk`\��r�
�R�������s6W;�i���SSw���N���g20�2-�`t��A�f�zP���5S������?����S��X��w�0��W����Y����>K���3�o/����9�(��Uc���Z�r�H�n���21��<��
\���b�.��o���X�<���o�9a�;��ke��������.���k<p�+�n|f���T<v��1��X�Ry�e��:�6 @� @� @� @�@�����O��A�_��WX�hQ��;e2��R���+�k�`3l��p�Yg��Pw|`)?]p�o�!1�Dl�d�������b��EAJ%��6'L�6�G����b�1H��[n)��z���w������?b���3�1���J�.�����o������[o�b�������I�n�q\��������C|�3��o�!�v�����m���f����?��/�c�����&M.����K�����LP���B*����1sW�+�����	��@�f�b�-2���)��{���v���^&�F�J���]i=;��f����=�g��c�b}��h����/�??����K|�8��=�9��?�0T��WQ�m����vZ
�������a�L��l�d��t�A�G������7kd��j�9[Q��l���!c������{���K�Pj�O�A���U���h���T����_�a7�l�p��q���iBc���O�i8���l�1�`e�h������g���L:J�1�o�<�Y!c��]w�;f2����S��U�i�����K.N]����1W��{�,�b�#�w����.�����;���]��o���?^cG}t8��CR�B��T!� @� @� @� @��j% xi��n������1p�d��l��+�Tv��#��/Yg�LS����+��f_�A+���������L�.?>��r���������C�����UW���f�������&M�&d�������������O�.�dc�d���r�����v�i�����T�t��]+����{�����R�c��NvJ�r]�6�vX��d3�u��1��-1���{��6�v����K���Y|h����<�@�u���j�Cr��Y��u6��"��������-���}��*j�V�c���*�.�0�s�*1�->�\Q���lEm������� �m)��{��^��[�������}�����ft��"���w�L5j[�����O>	1�3���9&���e���G�M}�Q�����e�d��������+2�n���?���Bl��b��a+��Ttle�K�1��)~���c�Q���T�)~���.[v�y����W����= @� @� @� @��^j�Sh�Z ������n��}��K/����Si7{��]n�������e�����,�Vb�R�r��EA'���_���C�c�r�	'��������Q��y
���������j����C��}���~�����3]����������6�[��-���v�/�F*��U�$G�G3�2h��{��)�����n��@�k�z-�g-�A���g�y&Mb���*��TvV�e����s���;�xo�Q�@���WTT��1[R�~�2�no��VZ����*C��� p����l�y���}�:��3nK�.]V�}}�h�6��	��m��U�9[�s���f���>�c�q���-q���N�6uUw���o=������zP�������z0g����2��}�v�k�^�S��X��c*���)�;wNY&��y��j���"�e�]�����*mV�o�GS���~���m�*�����2�!W�\�� ��B� @� @� @�($�K�4��������R J,�LK�Nl����g*������l)�0S�����o�_�P����������;�(��p�QG�m������[���l@�q�S�q%wn�	<��������[�}\c�8e��9����y��5���yqN�������z*l�E�p�/����f��e2�ld2}�W��������*�/������������v��%��M�4I�s]�9h�!�d=x��w��v������t)��1�
�;��#C\O�z��B.��zJ��h�M��V�����W�Z���_�O<!����lM��o�z�X/�lr�����y��u(�}���i��u�0���1f���s��v�u��i�R�b�R���A���}w�qG�����nK�,�ym�����+
��N����� ��b=���zP�y/��.[�V��5��~7y��o����Z�h���
=�R]��JA���I���\��V�o�x���n����-�������Hq{!�N*;N�	 @� @� @� @���S@���9�F]G�2�g�6�,��n[�����iw�zeO�"xm�QG�`���)���o�g�Xz��v��4D9��t���x�/��;N;��p�q��a��W:�hq����E���6�,�w�a����C�z8��kVz���o�m����\�����N�A����zP����
><eM�j����B��^Z��8x��ai:��SKA��&N�������_�"�����L��Yw�.^�v�a��?���vr���n������Yw���t�M����x���/���}wcf���TIT����f^�����h��r=�-f?����r\&+dF�q��*����������>�d�
\pa�nr�i�Uz��H���I� @� @� @��[�Ky;5:��N�&�P�`P���k��?���g�>������_�KU��"X@��T�`�K�4�X����hb�OLl`�K,Q�v����0b4E� ��o�
���l�����=g���w����}����>���:R��b�
6L��������;v�aae�����a���T����������+t��1L�<9������]v���g�7{��������d�
Vi���^;�.^t������N�\���2���j��?�I��z���W+�Y�������u�
�U�VI]|��:���+���p��A�v��sR��U���-;w�[u�U+�V~��c�K����� ���*��._�:�
l�����C����N����;wN��K.�t�e�N������~��sB���+��5+7kQ�N������Be�7*t��<���b�^+^�|��7�:-���!q���j������R��Z��z�af���&5���]����Xj���_��k�n�������]v�5	����w�+�{��Z�G��\�l���U���)v�c�NI�>���*��$ @� @� @� @������#�P`�{���L�01���_��Z�h���p�>|��I���|Kx����>��>�z���!)��I�0r�.Pc�\SiU1 &���)�)j���!�?��!��M�&E~����*;��i����_��:sq<4��|��6�����>���������8��m�4Xj��	�)�|���M}��A�=�zj��,(���_N*���wX�����h}��
�o�y�5kV����*�V�7g��u+f�1#�����P,���I�������:�b�s�:����/c3_|�Ex���3�[�`u�����6c@����[�:�WH_kl����Kb������zd����.FH�Anf�z��\�Z��A�_wg��]N���^y���c�y���^L�]��X��c�v��v����NX��H5����u��c�����#
L���_������a�� @� @� @� Pt���nJ
��|�����4x�������H=@S:���8x�����;��N>�����v�9t�T������ZE�8��$h��;�L=�5/c���n��%��{��C�q����+X�`��w�~��+��[�5�S�-
���_�e����m�&}�;����w+����>
7�p}����i[VW��;ue��pqG��~��"�~�i��J���`���f=�i���B����?���[���]��;����.�Wv��c�MN]{���e	=z�H�M�6-|���O��v��q��]�D��.
���M��U�e3u[�l-�I�j7V�m���|�l'�����K��4��f���A�������~R������9h��b�k��?��g!��k���>�t}����t�o�CrnNj�����.�d=������i.j������W�4o�<l��6�t�t����cRL��o����j���v���n�O?�t�2u{�T����^�d\��i��H�{c�����JG��R' @� @� @� @���T�o��x���������T�X�;�=$<y���!��N���Z�}���j����%�=���nf��u��5����'������v�o���A7w�}w�������c��Yg�Z�n]Y�����c������^zI�+�h�M6	k��Fr���Nk���w>j��]��#���1#�{��%�����#��z��6I�����K�
��w�}��a��rx`���/_�=�}��3����$yJ9Y���l��!�������'x��������=�([O���G}t�o�=��3t��%c�_��� q�F�����Q#C�9+��g�p@�����j/����vek��~����hV�S�F��d������O<�m�z�7|i?��}���'�1��;7�}�Y����/�i�&�~���[n�%����^i����������^|�����#��uq�)��y(L�����N+��H3�������e��n���!>�Se�BF�8�U�|��g��O�}��UU6���]���NQ�OXjLW��r=�/���l���N=-���|�A����?�������G����2y}L*P:��{1�QG�]�d�2���T��{�������&=�\���=�Zk�N]�^���+R���������c��	�w(�F����	 @� @� @� @��" x�PfJ?�@����^H��]����/
�Y���z0#G�*��c��a�w��&����c�Yi�SO=5�����C��rp���]h��u�������~������a��7�Z�u�����:�ku_3�9��s����?�a��o/J���:��zy����Y�V����>yh?�����:u\#�������8\u�5U�5}�g�^a�]vM^����C��]������C'?1�l�`��������J�<�8����K���S���m��Q�>�����8�b���z�y�Yn�i\���y������/Y�X}�0p�M�����.��z[���s�F2���?r����YB|�4���	��Z�l�_�0y������6S����O}�~�V�B�����I�E+X5����w�d��]v�9{����>���|<�����9��q��?�!����.��xx*�2�t��'$��@��n����^����X��� ��^i��Yx�����[
K���s�d=�w�}Bx�i��Z�C^�0`@���6Kw�lW����s\���A+mc���,�� ���J���� K�jd�T+�Y�r=��(���l�����:\p����������H�{���3�8#	��|���=��:���~AC]�#��>�6�5�1�M�|�#�������k����tS�zn���j���5�u
'�vD��� @� @� @� @���/y7���#��������UY�����uK��wg��@
N�����1p������Hq��}�V�tTx����op��,����C�c�^���+�,���1c��__pA���f������?o��^�z����."�m�Yh��Iy��������{lB��d���w��������U{/;����#�}�/S}�`�7�x#���������+�:tH����?�]w�-t��),\�0	@��*>��J9Y2�~6���k�^H��s^*�.�q���rk��Nu���W^M���MGqd��V�.O�oc�=�]7YV_}���^�[*�i���.w.=��3a��wI��O>��|=Y��218k��O$�T1@k����ec@SCI-[�O>�t8��3��6��5c������o�]w}�]�kns\O��?3g�W�}�������7��N9��C�q��z���=��{��
D�[/�y���>��Ei���1�����e�fq���U��zP��k=�[�\��������Y��:��O~�Wr��`��$H9^�����sr�R��t��U��{������������|�#�k�����������C	���Q���~8������Q�� @� @� @� P��R�����P�m��������Y�,8�_|1�r�����R6�`�������)S��M�����'�~��&\���7%:D ����p��'��v�9<��?!@���%<��N� @� @� @�(R���g��}z������TW��!�G�+�P���[l!p)���i
A�z�fA @� @� @� @� @�H^�^ P���~{�����Qw��>�'@�6����)K� @� @� @� @� @�@.��Ru �[��_=���=��y�����������c��6�v�����M� @� @� @� @� @� ���������_�������]���O>%�}�=�Q�F8]&@�6����)K� @� @� @� @� @�@����ka�����A������A��$@����6c�K� @� @� @� @� @��-I��r~F�����w�����V	 @� @� @� @� @� @�u,0u����O�:�Uu�&�J�
�x @� @� @� @� @� @�h���<� @� @� @� @� @� @����TtSj@ @� @� @� @� @� @������1zA� @� @� @� @� @� @��/�� @� @� @� @� @� @���! x�a��^ @� @� @� @� @� @�(:�KE7�D� @� @� @� @� @� @�a^j�� @� @� @� @� @� @��N@�R�M� @� @� @� @� @� @�h���<� @� @� @� @� @� @����TtSj@ @� @� @� @� @� @������1zA� @� @� @� @���` IDAT @� @��/�� @� @� @� @� @� @���! x�a��^ @� @� @� @� @� @�(:�KE7�D� @� @� @� @� @� @�a^j�� @� @� @� @� @� @��N@�R�M� @� @� @� @� @� @�h���<��@��3�Z��}7�(����	�~���Zt��GdW@.�V�zP�Sk` @� @� @� @�T!���sN @����n�wa���a��E=�'@������d-����{ zO�@���&T @� @� @� @�(`���4]&@� @� @� @� @� @� P��
a��� @� @� @� @� @� @�@
^*�I�e @� @� @� @� @� @�� ��:�� @`e���_��r�>������%K���s+T��e���y�
� @�@M>�������/W|�����|�M���m���qc��55W�@C�4���/ @� @� @� @��[��K�-��+�I�~�Y�&~�<b�J�|�I'V(�Z�^+-{���e,��?sf��c0F�>�c��zk�e��|��P�������g�������u����V��L>����p.�;vL��I�>�|��k������d�v[V�,������&�+���Q�����OO�4a�c�����7���������*�~�s�������@��k����)��*��X�O�� @� @� @� @����T?�Z!@� @� @� @� @� @� Pr���R��:~m������yhY�(]�w�y;�h��C�6m��9�.�� �W����.�p��a��~�t��y���	���� ��Z'@� @� @� @��{���g��}z�}�j,*;/�t @� @� @� @� @� @���# x����� @� @� @� @� @� @�(*�KE5�C� @� @� @� @� @� @��^j8s�' @� @� @� @� @� @��J���T*�5���6ez��k��;�"@� @� @� @� @� @�TO`�����^�+$w�	�y�����	 @� @� @� @� @� @�������q�
 @� @� @� @� @� @����TrSn� @� @� @� @� @� @��G@�R�8k� @� @� @� @� @� @�@�	^*�)7` @� @� @� @� @� @��# x�~��B� @� @� @� @� @� @��/���0 @� @� @� @� @� @����T?�Z!@� @� @� @� @� @� Pr��Jn�
� @� @� @� @� @� @�@�^�g� @� @� @� @� @� @�(9�K%7�L� @� @� @� @� @� @�~/���V @� @� @� @� @� @��������r&@� @� @� @� @� @� P?����Y+ @� @� @� @� @� @�JN@�R�M� @� @� @� @� @� @���K��� @� @� @� @� @� @�%' x�����	 @� @� @� @� @� @�������q�
 @� @� @� @� @� @����TrSn� @� @� @� @� @� @��G@�R�8k�� 0e����i���}�<��I�	����d-�s�=� P���> @� @� @� @��h\��6lu.p������M������[���B
G�zP8s�� @���������d�??����u�b�� @� @� @� @� ������&Dw
W��T���^��_���s�D�zP'�*!@��@���?N�S���y���FU @� @� @� @� @�z����%7 @� @� @� @� @� @�Y
^�J6 @� @� @� @� @� @��' x�z^r(���[C��M�x�������-w<�:d09�X�zP��kh @��_�W�=��M������=*��<��#8B]&@� @� @� @� @��Rg��@C���c6lXy��N����:u��[o����k��
i�B�@���7T Pwk��VR����+����=h����i��j��C�5�& @� @� @� @�d���!�1"��t���B�}i��v
c�^�M� P$��"�H� @�E"p��w��d��)!����3t���HFi @� @� @� @���*��Q�$@� @� @� @� @� @� @��/�|�- @� @� @� @� @� @����T0S�� @� @� @� @� @� @�
K@�Ra��� @� @� @� @� @� @�(�K3U:J� @� @� @� @� @� @��/�|�- @� @� @� @� @� @����T0S��
]�?(�8-�����U�#@ ������Z }]�W��MF @� @� @� @��P@�Rb�����m�|����
a���7 �P��)�O��q��PfE? @� @� @� @��������o�����M$�Oz����3���%U ���
}�����@���C�.]�_>ztX�pa��H	 @� @� @� @�h���4�D1���>�[�na���a����W�u��!���Q#/�!Y
X������O:)i��G���kv���W~������K4B� @� @� @� @�@�
4.��9��h��ux��g�o�����O��~�Q������ P����&�$@�%#p��'���;�����z��0m���d��d�_|�y�8( @� @� @� @����w��@������������X��%/ �k��>8�� @� @� @� @��-�J}7�= @� @� @� @� @� @�JC@�Ri��Q @� @� @� @� @� @��w�K�N�A @� @� @� @� @� @��! x�4��(	 @� @� @� @� @� @������z'�  @� @� @� @� @� @���h�$�Jc���kS������o'�N� @� @� @� @� @��#���g��}z�Qm�)V;/�� @� @� @� @� @� @��<^��h� @� @� @� @� @� @�@�
^*��5. @� @� @� @� @� @�y���	�< @� @� @� @� @� @��b�T�3k\ @� @� @� @� @� @��, x)��y @� @� @� @� @� @��* x�Xg�� @� @� @� @� @� @��Y@�R�'@� @� @� @� @� @� @��U@�R���q @� @� @� @� @� @������<O��	 @� @� @� @� @� @�����b�Y�"@� @� @� @� @� @� �g�Ky�� @� @� @� @� @� @�(V�K�:��E� @� @� @� @� @� @ ����<�o�g�qFh��I���.m��,��-Z�(��c���m������(t� @� @� @� @� @�X�����	9_�3fLW_}U���S8����4x��W��1c��F����
��5M��v�m�*����f�����:;|��W��3�(e
c'@� @� @� @� @� @�E-���Ggpj(p����o��&�~��E�U�������V�����vX�l�e����G=�\6lX�L� @� @� @� @� @� @�-`����>����[o�}����e�p�!����&M���c�=6����������!�����#G&����H @� @� @� @� @� @��"��RN�!�N`��1I{��Gh���J+{�����N�n�q�ed(8���y���x��0c����g/4 @� @� @� @� @� @�@	�y��&�Pj/�p��p���T��~�gU���KY��L�}�]h��I�3q��__}�Ua����j��N���\sM�V�,Y������N;��]:����
���V�������+���s���������L���[����U���K����a!���}e2r� @� @� @� @� @�����B�=}�s��SA;1��?�A2th����
�[�]�{���/N9%���a�����?���J�����k��o�
�������
O?�T��E�a��Y����o�m�����+3d����K/���0^~��$_�6mB���+-��[$�&N�Pi' @� @� @� @� @� @����T����9x��g�����Z�j��VrS���c����9&<��s�_������F��<t[s�����K���99v�y���s>�f�	��|?���~���S��8����!e�\/��e��K/'e
VY���f���I��S��9s���� @� @� @� @� @� @��*�((���j�w�h���]6�&N���������!Nu��%l����������@y�����p�W$�G��:���@�N�:����6�d���%�\\^n���'�]������������ ��+��j��}�*�,Y��%�,���:'@� @� @� @� @� @�
K@�Ra����X`���I:�������!C���9$c��7.?�������?O^u����]��8�����e��M�n�:|���IS:�����V�5����\]��\�4t��MZz�C���f/��,�� @� @� @� @� @� @�@a	^*�������q�B��s�R�W����U�oMy+���i��2��nZ~����������%�_z�����8��=;<��#!����3f�O>�$���?�n�Yy�L�<1(*�9����1 @� @� @� @� @� @�@/���vn�,Y��rP{�=����O?K���b@R���������O����;����/%�c�R��i�u�	�-
�'MJ���t��~���-Z$��Ji�F�U��9 @� @� @� @� @� @��2G.� t�@]	���IU�~�i]UYo��h�� �l;�l���EC�M�x�����I�=������_�:4i�$L�819���i���W����~�����[c��J�@� @� @� @� @� @�������&��/���:&M}����j���i����1~/^����s�7�v����8hPh��q�1cz���O�O<�6mv�u���[��<����i�����26����m���,x���� @� @� @� ��,� IDAT@� @� @��# x�p�JO�A`�f�V�|��zh-?Ml�g����c�[o������r��>}�����e����'�_~��T������[�x|�wo�=-�;cFx����<C���T^A�?���?���i� @� @� @� @� @� @��* x�PgN�s"��V[%�N�:5��7/'m����CR�6m�n\{��
������
7\�:thh��l��t��C7O������M#F�H^����F_>:	�Zw���c���������������{�5���R%L @� @� @� @� @� @����T���������U�V!�����f��������s������\�����fU_�35o�<�p���fn���p�E�
,H^��5+�<������&�O?�����i��!���o�-��ZZ�
�:=z��n�59>ti��Ei��I���������� @� @� @� @� @� P`��
l�t7�-[��p@��]w��Uc�st���K��/���{����;~��geU_}d:��������4�����:�:w��Y{����J����s����)-����K�|�MX{�u�z��_~:�������l�������I�B�F���#F�x�k @� @� @� @� @� @��/��~�s��I�>�`�7o^�7�jl��I��O
7�xS�j��C������:v�v�}�0q�����<'cO;w��-���u)�q�w*/���)c%K�q���.W�m�}��k���:G� @� @� @� @� @��@�%�T��.�.�6ez��k���w�vx���
��?.=:w������q����o������K���m�UN�S9 @� @� @� @� @������3C�>���R������nJ
�..���w'�4���/���*�������%�K{��.y{ @� @� @� @� @� @����T��jT�X�g�p��'���g�������)����E���_�7o~{��+��� @� @� @� @� @�(�FKR�H���������w��tu� @� @� @� @� @� �����3C�>���._�
�y�D'��	 @� @� @� @� @� @��Z@�R���O� @� @� @� @� @� @�D/���6 @� @� @� @� @� @��\^����	 @� @� @� @� @� @�������x�&@� @� @� @� @� @� �k�K�V? @� @� @� @� @� @���T�o� @� @� @� @� @� @�r- x)���'@� @� @� @� @� @� P���Jt�
� @� @� @� @� @� @�@�/�ZX� @� @� @� @� @� @�JT@�R�N�a @� @� @� @� @� @������\�� @� @� @� @� @� @�@�
^*��7l @� @� @� @� @� @����ka� @� @� @� @� @� @�(Q�K%:��M� @� @� @� @� @� @ ���r-�~ @� @� @� @� @� @�%* x�D'��	 @� @� @� @� @� @��Z@�R���O� @� @� @� @� @� @�D/���6 @� @� @� @� @� @��\^����	 @� @� @� @� @� @�������x�&@� @� @� @� @� @� �k�K�V? @� @� @� @� @� @���T�o� @� @� @� @� @� @�r- x)���'@� @� @� @� @� @� P���Jt�
� @� @� @� @� @� @�@�/�ZX� @� @� @� @� @� @�JT@�R�N�a @� @� @� @� @� @������\�� @� @� @� @� @� @�@�
^*��7l @� @� @� @� @� @����ka� @� @� @� @� @� @�(Q�K%:��M� @� @� @� @� @� @ ���r-�~ @� @� @� @� @� @�%* x�D'��	 @� @� @� @� @� @��Z@�R���O� @� @� @� @� @� @�D/���6 @� @� @� @� @� @��\^����	 @� @� @� @� @� @�������x�&@� @� @� @� @� @� �k�K�V? @� @� @� @� @� @���T�o� @� @� @� @� @� @�r- x)���'@� @� @� @� @� @� P���Jt�
� @� @� @� @� @� @�@�/�ZX� @� @� @� @� @� @�JT@�R�N�a @� @� @� @� @� @������\�� @� @� @� @� @� @�@�
^*��7l @� @� @� @� @� @����ka� @� @� @� @� @� @�(Q�K%:��M� @� @� @� @� @� @ ���r-�~ @� @� @� @� @� @�%* x�D'��	 @� @� @� @� @� @��Z@�R���O� @� @� @� @� @� @�D/���6 @� @� @� @� @� @��\^����	 @� @� @� @� @� @�������x�&@� @� @� @� @� @� �k�K�V?u"���O�fM�T����VZ�w�}W�\��k��+-+Ca	��}�\wh�.�s�5I_��c���E
_������l�q�2eJ��A����s����W^���50��9k���������^Y������v�a	�t��
�(�+����/�����Mm>W��>h�(
�c�Y��U��t�!���`x�$@� @� @� @�5�Tc:	,/0o���z�V�t>���EG4q�����h�,�?sf�1n��o�/>�XW�M��a����?;v���F�-W�W���.[����������~���{���<O|��.�>{�]^��6�8c��f�
-[4/����:/�����\�|����p�n�>���9�I����������.c�����%K*�,�������H�-*�3�}�wd�����K�m��_��59X�ul����^C7�t��t�Fe�5W
i
���{�5p���kd�P�&<�X��4^���3��
����o�Qe�O.,v��W�x:g��y=��{�����5k��8ks-�u#2�s��������N8>C�B�kD��U������9��P���,R���b��y=����l�6���^T������}N>����c�8W
e
�oe��+�@;M� @� @� @��A@�R= k�4�����o��&4i�$�C>X��������^[oc0`@x��g�v�y�����~�\�3S��H��}w���O���w�y;����=a���9����.^(x)��Kx������Zw�yw���j:/�����0a�cyi{�5W�[��]������u������~/�P��*�k�}1x)��?>/����C�o
��*��{}_��5j�k�.]�f����\��d��>��e�s�}����������Z�P�������u(�^�s�
~��G���_.�/|8um�)�:]�6���^T�|
��>������c�>W�\���=i
?�� @� @� @� @��:�T���*m���sp���%�c0���~[�(7�<.�o���������q7e���r��n����@��)>,��e���s�Oy]���M
���3�����k�d>T���q�c����&���Kyi�P�����;�f�^6X��c�M*y�����]�U�����;�E�|�Ix��'������������D��*�V�m����k�>������������������{'�c�����#�	 @� @� @� @�@�
^*��5�z����SNH�<���C���B|��g���~�gc=�]7�E�>�-�>�����WL�]w]�W�W2dp���{��,-���q7���������hQ_��N������a��;%��h�5u��!�m�6L�8!���w�u�����1��k���X���X������o�[�5kV���'��T���O�������(�z�z����{�}�M:z�=��?p�����?��O�7��@:p|�����'}-���|��DWk`�>
��+k`��In @� @� @� P����uf��^�z���`�����za�u�	��>�V��'��_h��I���]��	�=F�:u\#�k�&l5l���c�0��n,�����]|���;����*TV�?�����c�f�����s����W^y%c��w�>9�����x�P80���/�?sfx��G�=�^x!t���:k�U[�]:wJ�/��v[��P�5
���o����b�t�]w&�t��*�K������{��n�Qh��mX}����~~q�)�X2�#�U>�q.�N1�<�����sg�~z�*��}����3��n:��z2��z��vhx����,Of��ZiE�!�`��G����>���*!�0eC���d^.�|t���/�9�`��C�U[%���N:1	�\1��W�J����n���G��k��Y��@]�f����>$	�;vl�����*6t�a���M��{��7|���Y�]�k`���6k`\�����p����Ml:w���i�_�Wr�����8���z�rk�����y��
k��T�iUi�����+����n]�$k��������p����t�����9����Z�C�������
������V�~����8<t��5l����l�y��'����zl�k�L����&.
������d�N�3���k�N;��v����\g�����k���'W���G���f���R�q��t��c?����?�I���������u�a����'���m�E���K�{�L)�M���M��g��n�
k���Mc~��#C�����������p������|'S���b��5W_n�iR6��������w���\����L��{.�~\*�/,�]�js�S��U4�V�������G���zs,7 @� @� @�h������[��w;1bD�����?�����v��c�����<��j����~���I���i�UW
�,����oW��[o�^{��������4_MO���.a���N�X6(����B���>&��1�|��1�d���J�$>�����e�$�$�_b���{��<�]Y�w���/�m���}Oh��}�a��o��Tv���J�����G����H5b;�a����m��[1����a��a�?�7N������y��l�����+4�'�}Yx��7��E�V������U=0[��Ue}(���%������j��$kP\�V��}1/l��I`������D|��M�_�L�O+�v���'m��'�x���o������T@U�n�*�W�q���r����/��2�jj��Z}���^K?{7�tc���r�|�UM��.�u(���?����q={����c�m�M����W���;.����bL�:��
�Y���7��B���������N=5<�z���>� >?a�c��Q#�-7�\i�WS���o�����������x�9�TZ��O�����w=�c����\����������p��k���~�K]O������Ej����WP�~�m��_T��e��(^���������&%�b���}���� �-��<��7�I���L��������g9&����X4L����x=�N�
���o��B�x ���J���rKr=��7i�$L�6-\y����2�M�����rr���k����~(l��6�x�-=���I`��o:w���v�$@-^?Wu�Z�5������5����|�UM��8:����c% @� @� @� @�@C��PgF�
F >���#e;���Y{�V[���D| /~SyU)>L|�i���S�����q�<@0q���K�.����[���#G%U��� \�0��oj��M7�4S�Z[��*������ IDAT#�L�;��Z�U*��.G1`��'�������z�y(�=��3�������s������^tQ��-�7^X)��R;%������/,^�8����I�{��������.�]+�:������������5;|1o~�2ej��h��p�A���g/W����&>�D�O�6m����q�r�c��uT��c0L��)�1t����3�&����8��n�#��,�dJ5�\e����=������C����c�PL�^Y� 7k�4L~��a��/��'�
�)(���M��w�/}`��[n�X}|�:����#�������3�� >}���Uuu���
}L��v7\}������\�t
l��eu�����'���s?	s?�4�����s�;/�E��B��T ��k��[K����N�������3^?�x�]�]��\s����n/�|�Y��������'�L>�����3�<#�������g���7S�����b�A�1���R������6�l�-}]�X*<dcr=V�Y���w8zpi\���k��.�7�����],�O|��J;����$�?1�<�T������;w�}yx��H���:?�O>�t *:��
���Rz-��������;+�E�g�.���b�A�S�NK��x-6����.�8�n]v�W���&=��pg*�3�=�3fl�9������XAK_����Z�n�����`%���}N]|����LH��5W5]��V1�N @� @� @� @���T`��
O���k�3gNh��y�2��BL���~�������D��~F�A�a��t���I���b����M�1()�[n.RZ�|�����L�b��t[�����T`Y�?�.���C=,y�|l���lR|�/��p�
��w����b��/�r�/�	'�<ywB�7o^�U���}����O=�N=@�O��i������~|@7����K1�`��0.�����,X� ����U�S���A��O>9y�7�����a��!��1��?{�&Uu7��FPD��
,`Cl�vM�-�L4��������n{���c7����Q?A����e�ewfvvvgwg�=�3���r�9������������~��T��=2g�)���k;�����8�.���x����G�>��q������;wNe��4����Iu����e����n�2;��5���d�1��~�k��
���c+��]sM~Y�����g���b	�v���B�����Ss�UIp���/_��;cg,�����.��wn�����������'���%f�z�������{�������nHe>���q����G_�\r�$+���}-���g��T�k�P��T�V�?~>�y���cu����1[���U�6,����H,1����[�xQ����c���,<����?����~,fo�m����3�������#�@���P��c0�
7���3/N��N�z
Y��.���d�x�y�5����X�����_�����h���}�E������;���_�L�;tpE�U�{������x/5qbE[�����gnN$u���P�U40��Lh��*d�=���n�kk @� @� @� ��/5�����H?�F��K�����#���c*�������ty���jX��/�r��!jT-=�`�t>���j��P������0j�u
Um����T������17%�?�J|�/��u|X6>�^����_$�����z=������d�Lr��w$����v��L���g+K/�t�p�����'O��YA�cF��*�s�=/�ce*��������r]e������g�~:ij������n�i��+^�=�P�����.��j�-�M<W��u�,�<����%n�LW��2�T/�p�rh��������m�T����,��j��*��E���W�8��]���������8^�m�y2l
=�����4r�q�g��YO�.]�d]w�/�J���x����+Y��{�f��W���d����`�!C�I���(���V[����&Ts}]��g�y&����GWd$�Zc��>�"�3U��y��\\.��������]w�5	�)���n�T�����z.����;Fl_:�\�v����=����
����C�E-mz����=y�������7�ycf��Z��=�!�+s`�����B�@�I�>�� @� @� @� @��U@�Rs�*�t����d;��O��2����w������{�X���9sj��AI1X*ff��JU��7T�
�^{�:v�Xc��\0b������F��j��������������7���[o��v�i���d�v�5{'�b�4iR�m���-�����[nI��w��*�?�N���~M���}��	+t\>�i�t�k�������d�����l��������U*�H������c5�~���K����f��.������>y�@-�g���u��=�?�<�=��d�
7�-��.���z�9.�#�YuU��j��/*�������7�u���1�Le�y���r����mM1V���1��oN<1l��&�K�C�e�T��'�tR2��3|F�g�c��y��*b��BK�k�����9�h=nS�3����k��w�i�����7vl�����cu����������Y(��O�����\�c{���cP�E�)�b���������1x��w���+tXn������7g���}�z;����>�l^5�Y]��������|�}���\_-���b�m�K2M���nb���Mul*[eK-u�����U�4���j��*d�=���n�kk @� @� @� �\/5�������O{�����LK�������YLre_��~q���~��]~����{������P���g������r��C+�g�g�~-��c:0����2m�qY�~�����1 ��{���MKYx��we��nL��w7�=�"��5�����E*�N�t��9k��;Wd������g�8> �>�j{X6>\9r���������t[����B�+����*Je����+���T���,3��H���}�YC�=N��U��7������I1P),U-;��S����N2$e+���c��-���X��Gb�PTJ����K�\�Av����3�^W7�X��m���?��$�-����4�ufO��-=�R��U]��xn��o�T���W^��vLe�l��*���y��s������*������q��gC���]���/��<P1�����Kv\\>}��3�5��P�U9���p��?7�^+�gM�q������/��c�p���t��{��~������}�Q�v�1���W���i�/��"l3dp*@��0~��I`cLL����� �b�E���b���_d�h���������?(Q�{al��;��4��f�k��9
w]E�r�Ky��:�N��g=m#@� @� @� @�u�Tw3{��?��|����/�W}�'�	 ���U���Z�Zd��b�Xn����]*�d�5�[�hl�r��#�����$����Zz�/���V*K������ww�f��K����0��������Xv�L
�����lZ��~��?~�H=������	I^[n�U��9�Ym��\������<21i���������r_�ux��G�v�P���X#2$�7�})�A��vk���Z�(�6��+���??��$C�������57����{���Bn���$�Z}Js�����L�6�X�e���1�3��{��Wx���a���'�|�r1������Y��t�1k����Y�|�I�9p���V6?��Xs�c>�k����zN�cP�m�5w�v��	�������da�UN;�����/�����17�>����K/�R9���e�]6��9�[m��^j��}���c�v�����~�SO>����R�^��m��9U��|�%s`���l�TcU�9�w�����	 @� @� @� @�@s���GH����}���i(f4��J����/�>����K����:�&��|����t��#�<"�������ka��j��5:�n5����>�k�����C{o��F���U�>�:y�2c���7�e{��O
��_�^��nc���9:�>W����#]>�������Y���
�nWt��=\q����.��]\y{*�R,{��g8��3�r�-Wc���?���!t��5���O�/d;O�8-���'$�b�^���Tv��E�����
O���M<���K���!.�1W\q�������m���G��,����I�I����U<����~��]C������J},����x����x�t��-�x�M�g��5N�����k�n��~����8D�����?�>�l����{�9�j��b���m�����c�>c����W1����?g�����)u:l�sw��*�k���A+�;�x���A1[R��L�J�q�w$������}��7T�����7E�I�E��\������v�=H��(~_�%�{���,����8[5�����-
u]E�r�K}������N�8��� @� @� @� @�����X����bV�t����2>D���9�m��I�(R���C�L���o7�W_}5iS|���C���}(�j��EY������U�k��r���Vd���q|�����{P�u����s���z�l+Z������s��o�:�����O~E����y�u�M������/e<���S�W_}��[o��2nS��?�O��F�6��{<�k���q]���>|���������l���E1 ��������j��e����8��3�:+�k���!T���{��G����5+���o��9��C�6m�P9�Z��S��1�������m���c���pu�5�f�~��s`��Xz��@M56�Xe<1�-��?�E����53��O>�OU�y��v;�90���&���1�y�8����x^��W���50�w���|������X�v�����g�7u����Z/�T��X��ry7��
�����[q�S'��Pf*/���}Z��?f���m��bv�9s�$�o�Q���=���y}����XI�s�f�o������aa"��c9���3�C�~l�6�$����~�U��I����=��U���e���c��i�;i�R�#@� @� @� @��! x�4�I+���}����*>`���[��*PKz���c���<�;y�;��'����.?M�E4f����n������3:�s��WN�=�d����5*�A&cU�����;Y������$��C����^����<f2:�����G���X�,�L�C����d��^b�D,�<<xH����sb����������|J�u}�g`�[l�Zk���3�<#�~������=_2����s��L���v�e����������O�?R!7t����(�K/�8��p��GTW6��r�w��#���^[qmT��X��6�nb`���=9<������o�9��yl�TV�t ��o���������*�����wSA�2���������SU��h>�0��?��O��8 �����|�A��|��Y����t������x}g*�se�e�MVU���i�R_�������^����z�F��r�55�e[��*sQ!sI}�����������Le:���CR��lbP��Q�%�����;f�m�A��LK���������o^��������ExPr����s��z��\�%��Dz��}?�}B5a��������
�?h�q��{N���F�}�m��I�5V��o����d @� @� @� P:��Jg����	�1;'U�bQ��;�P4���l'1�I,���?���qx�f�}�=������|��'Y�������<o�����7�$�)w�yg8���	�a�|�N;��l����3�d�g��7]�tIV�t�IM�k��.
�x��w�55�����uo��v8��C���������D�����}�+�`m���e��vJj�c4����w�}���9sf8��S�E�)�����q��
7������N��,e�%�_|q�_x�����;%�����=b��On���!�k�Y�j��cf�����v�V�No��&!��R�,pC�
M������q��6J^�]��k���J+�����>�������Ps`}���
-}�\x��!�4Ei������90�Y���/C��K��15�|�A����O�����O<Q����g�qf�9���v�&����1`!N�|����S���\bP���>�l�#�3`R��$��U�;~��ze�^��k��.���s?��k��0���x>��*�o��{n*5��_;-�_�������T�E�}���\���g������_�*�*����_�u�>f�z���W^I��|�)���(108����s�N����P��;�y���{H���wO>c�$u��O���={��.�����R���,����g��k��:��C����p(�:��c��f�Ud����v�1Y\u���]}����djK��j��S����������Xc����;i>J�!@� @� @� @��# x�t�JK��@�^��s�%-���l\���`��R�+C����k��a��wi�C�U�1�[�v���o��1���
�V����\*0��$Q��l�A8��� ���<3��i��s�U���g���1������6<p���s����f�>}����s�u��!����K�������k��w��t^1��)�$�����H4d9��d,�C��72t\�CX��Ja�UVN����;V<�Y�qG�����?�6-�Yw��7����H^����ul�
�}�_C�6m���>���a������������Z�jU}��z���%�*y���b �6�T<�_�,pk��N�*��"]?��LM)��x�
���������9��Z0j��<vv*�F��1u����o��c����`1m3�CS�U��T]3�><Y4:�/��q��b���_b���Ssp>e��|3�����v�1�^s��9p�����b��c��URYm>���p��&��q����m�d*�9�j��\�q���cU3�T�w�!�\����}�Y9��u��
n�����9��.iJ���S���
��vIs.�����9l���gbp��~����$}?����r�S�{���qe>s�I'�v�u���s�>;����j�z��n�-Y~z��s��+��������������x�
�_?L�8!\~���|��'��l6n���~n�~U�E�^+S�������b������z�d������#����������X
��s����]-�t��L�������A���,��9���s��<f�j?�|'��� @� @� @� @��/��hik�7vl����n��]���'yh9���r������A����tp(�e��Aa�������k��<�X������cpJ����k���|Y�]k����k��Rb�18l���k���5�����T��m���7�t��>�oc?�9b���M��>�����=��{���[����c�A��n��so����]�v�1c���_�������������>\4�0�������g����L����e������oLz3�x�oB|00�Sz[c�5�����
<�Zk������t������M'WI������O��Qv_�.f����y�9|�Q9�������!����
9�g�?����?�Y2�����`��29;V����|�{E*�#~����8����w��I���O=�m�l>�$����#�={�J��s`����l�����������$00~���?fP��b��A���h����U�:u�5�9�	3�����\���?����[n	1KK<�c`������Oq]�%f������:*97���S9�������>�r�����|��xrG*������x���x=�@�=��3L�01�~z�����)�m���s�q���1[ilK�v:��G�4�CZ IDAT�	��Q���[n�|W��Oz.�����r�����t�E����	�vX��+�s����>�����W������7�|3����Ly�J8M������%���J}����djO��j��S���1��hS�y�����s�w����'@� @� @� @��%�*��cai5�4[���SB���J��Z��^x��0h���'���_a�u�m�m�@-]����
���	a�]~�����������[�0~|�/�i��17�E�u����8f�����80L�����L�����Mql @� @� @� @�@�xk����o��?k���Q-�T��?_�?ff���C���V����
'LH�?l���u�q @� @� @� @� @���� P�c��	w�uW����W���|JQ`����c�	1�c��}��m�)�nh3 @� @� @� @� @�EX�u���"���ka���
�g�s��I���N;�=����GV=~z����1x��~K-�T��e�#"@� @� @� @� @� @�@���KN%(������?�8|����G����>1�~��U�V%�M&@�T>�93|��'�M�6a���
=<>�� @� @� @� @� @� @ - ��s�@	
l���a��J���L�@Kx���-�;�B� @� @� @� @� @�@Z-L�"���j��9%���� @� @� @� @� @� @�E�5eZ���w���NO`��U�f @� @� @� @� @� @��Y@�R9��� @� @� @� @� @� @�(����"��� @� @� @� @� @� @�@9^*���w @� @� @� @� @� @�E�TD\U @� @� @� @� @� @�(g�K�<��N� @� @� @� @� @� @�������j @� @� @� @� @� @��, x��G_�	 @� @� @� @� @� @�Q@�RqUM� @� @� @� @� @� @��/����; @� @� @� @� @� @��"
^*"��	 @� @� @� @� @� @������r}}'@� @� @� @� @� @� PD�KE�U5 @� @� @� @� @� @��r�T���� @� @� @� @� @� @��( x����&@� @� @� @� @� @� P����y��� @� @� @� @� @� @�@/W� @� @� @� @� @� @��Y@�R9��� @�@���z��J8���E;��	 �\���ud��@y	w���~�������zK� @� @� @� @��	^jf�9 �2��7/��1#|���-�CzA��:���eS�&���_&�cs��-�1TL� @� @� @� @�@���j7� @� @� @� @� @� @�^*�. @� @� @� @� @� @��. x�v#[ @� @� @� @� @� @� P��R�c @����Y��?�����ys��,3g�����������1\�JN�XrC��Z���������Z���d���sk���j�*t����> @� @� @� @� ��2/5��KT`�~�6����:j��Z{t�	���/���Z�k�������o���i�r�"2�9.���s�W6U�K��M9V����b_W�\�6�0��c��^��|rr
��p�uq���_5���<���w��w44�X2T���e�j����T�XS���r�5���|����bG��|0u����[��wor��}�Y5���{��bqA�^W���R����{>�~a��9V�9�z��'@� @� @� @��Q@�Rsm"@� @� @� @� @� @� �Z-L���f��W���������� �0���/���<.���������a*UJD�X"��Z��������p�����/�U��� @� @� @� @��F��)�B�������Z22/��Pi( @� @� @� @� @� @����TZ��� @� @� @� @� @� @�JF@�R��� @� @� @� @� @� @�(-�K�5^ZK� @� @� @� @� @� @�dZ-L��im	7��7��>�{�p4� @� @� @� @� @� ���[S��~}{#!�S@���<V @� @� @� @� @� @� P����B��G� @� @� @� @� @� @�@N�K9y�$@� @� @� @� @� @� @�P�K���� @� @� @� @� @� @�����r�XI� @� @� @� @� @� @�@���
�� @� @� @� @� @� @�9/���� @� @� @� @� @� @��B/*g? @� @� @� @� @� @�r
^��c% @� @� @� @� @� @��
^*T�~ @� @� @� @� @� @������J @� @� @� @� @� @�
�T��� @� @� @� @� @� @��) x)'�� @� @� @� @� @� @�* x�P9� @� @� @� @� @� @� �S@�RN+	 @� @� @� @� @� @�(T@�R�r�#@� @� @� @� @� @� @ �����<V @� @� @� @� @� @� P����B��G� @� @� @� @� @� @�@N�K9y�$@� @� @� @� @� @� @�P�K���������B��K����3�V�Y5o��p��g���[/tXn���������j%@�@5���cSn����V[�V�X9v���8 Pfp@2\r�����>� 64���j�]�e*���/������ @� @� @� @��Z`��n�� @�
+p����T��S��c�����u���R�����^N9���e������zh��UXn�e�ak5���(��W_����&|��Ga�%�]�v
��m�tu����.� @� @� @� @�����r�XI�JK`��w*���|K�W���@�%@���^rIR��#F�?������K��N @�.w�~{���C�������������%@� @� @� @� ���hq=�! P��&MJz��\*�A�	���g�}�O�����C�T���nhj�IoV��
������'@� @� @� @�h����0hh�y��I*j��}�T�����y�*[��}�j�� ���s�y�%��� @� @� @� @��G@�R}��K��X`����M��+_G
��h���-������M�Z�'@�@�l�o���n��zW`�
6Xl���s�\�H	�}�]��77�xc�r��w������� @� @� @� @�(;�����:L�Z��O~��0h���M�>#����C\>`���z��o��s]!@�@�@�M6	+��b�f�����^H��$��m���L���HW��T`�;/v?6y��$��s��a�u�]�X=z�h�c�� @� @� @� @�@)^*�Q�F �E�C�a��G*��_�?���a�VXly��-&@�@�\w���>|0mZX{�������>��:%�? @���@���c1�M7��nss��� @� @� @� @�(��E�_� @� @� @� @� @� @������2x�&@� @� @� @� @� @� Pl�K�V? @� @� @� @� @� @��2�T��� @� @� @� @� @� @��- x����'@� @� @� @� @� @� P����t�u� @� @� @� @� @� @�@�/[X� @� @� @� @� @� @��T@�R��n @� @� @� @� @� @�(����b�� @� @� @� @� @� @�@�
^*���m @� @� @� @� @� @���Tla� @� @� @� @� @� @�(S�Ke:��M�-S�����]>���-��zE��={�J���Z{�urli�'p����<t����w5 @� @� @� @�(!�K%4X�J� @� @� @� @� @� @��/��hi+ @� @� @� @� @� @���TB��� @� @� @� @� @� @�JI@�R)��� @� @� @� @� @� @�(!�K%4X�J� @� @� @� @� @� @��Z-L�Rjp����7��>�{�j��� @� @� @� @� @� ���[S��~}{S!�S@���<V @� @� @� @� @� @� P����B��G� @� @� @� @� @� @�@N�K9y�$@� @� @� @� @� @� @�P�K���� @� @� @� @� @� @�����r�XI� @� @� @� @� @� @�@���
�� @� @� @� @� @� @�9/���� @� @� @� @� @� @��B/*g? @� @� @� @� @� @�r
^��c% @� @� @� @� @� @��
^*T�~ @� @� @� @� @� @������J @� @� @� @� @� @�
�T��� @� @� @� @� @� @��) x)'���,�?����^:\x���P����??���j����|P�c�� @� @� @� @� @�hz�KM?Z��N�������[�0r�q9[��+��k��:64l���a�6�����v�5�~���M�6��SO�|�M8�N)g
}'@� @� @� @� @� @�-Z`��;�#P��I�=),X� �|�)�m��9k�a�����ssnceM���8"\t�E����
G?�T4hP��,!@� @� @� @� @� @�JZ@���>�/���I��������vX��Xz��C�����#F�������_�Z��AK-�T:thBq�� !@� @� @� @� @��� IDAT @�Z���K-pPu�~�\suR��{���o_ke����������uTt����3��L��N��\�7 @� @� @� @� @� @�	����SW�/0w��p�-�$p��yUX5p)�p������M�������C|��W��7�4��i���k���������q���[o�5������J��r�����<����3������k$�����j���`����m���2��VZ)l=hP�m=J�W&#� @� @� @� @� @� @�@)^*����x6���\r�0`����������}��'�����������_�/��2���������������p���<����c�%��m�6L�>=�s��a���
���g����_x!�n�����v:t}�����V[m���0a|�m� @� @� @� @� @� @�JS@�Ri��VI��'�Hj���oh��}��R�j����$��c�
O<�Tx��i��T��_V^e��z������7Yv�Yg��~���4�?��T����g��O�0�r�*��^|1���_J��|�-�Kd�j��|�d���z+|������ @� @� @� @� @� P��#
J�oz@���lA���^��m�&����/��K��H���Ja�u�
#F�w�}Oe�����p�e�%��N=���@�n����������'��?����
�r�����i��������� ���d�Zo���*.\��U���N�	 @� @� @� @� @� @����TZ���E�>}Fr�N�V,�����C;,c�K-�T��g�y&|�������>���1K���G%������� ���[.|���IS�\}�U������:p��^~�"i���M5�hA�N�*W�X��m[�	 @� @� @� @� @� @����TZ���E�9���+tZ��Gj��w�}��*����d���[������d����&Ul��6�|�d��/�P�����3f�q�����)�w�N
��y��O~6�t��m3���AQ�|����6�� @� @� @� @� @�(Q�K%:p�]\���E�}��W���/f}�l3���L�s����g�������)��^z1���b&�^������y��d����.m��F�m����\%���U�\�YG� @� @� @� @� @���@������h(����$U��|VCU�h��]�� �|S5x�j@���*^x�"x����
�~�m8������^:L�0!Y���4p�������s��I�������l@� @� @� @� @� @�������&�l,����&������u�F?N�:.��������x��3���+Tn�������Z*L�:%��5+<��#�u��a�]w
[n�U�8qb�m:3�����2d�������"x,��� @� @� @� @� @� @��# x�t�JKA`�M7K���o4������]/9p��4i����x���*�������v���
6� y���/���&����:��;��sx�����S���^{-�f��LM�d����_�\���&��� @� @� @� @� @�(U�K�:r�]���'����[a���E9FSW3$u��!i���^S�9?��C5��d���C������e������~����N;%�c�R,_rq��k��]+2Y%+����>Y��O�����KY�,&@� @� @� @� @� @�%) x�$�M��%0p�-C���C�y����0s��	3g��|}��w�~�o��s�����bo��2��_��W�a�=:���_�u�~���a��G�W^y%y���$��$o��tS�7�������V_=�t�������K��(O?�t�v�+��rlj @� @� @� @� @� Pb��Jl�4�����tPr��n�5���8���r��*_�=�\���?����N;5��c��N>9���n���9����k���[��Z���~��,?��3�N��)UmS:���B��Vk��v����).�%�]�}����G�g�~:�j�*>��j�	 @� @� @� @� @� @���T���
/p��#�J����0{���?@3�q���w�yg5��0x����r�%���v���c�0a��p��gdli������X�Y�����.���34e�d���o�d��n��C��k���: @� @� @� @� @� @�Z-L�lw�5��7��>�{�\�������O;��p����#�+W����������^����I������z<� @� @� @� @� @� @�@�
�5eZ���w�V��' �R�Rj���??��D����7�!�TG5�����I��>�@1�KN @� @� @� @� @� �2/��q��z
�������~f������z�f��������2�,~��?V_�= @� @� @� @� @� �BZ-L���f��W���������q @� @� @� @� @� @��|��2-���;��mW�2/����6 @� @� @� @� @� @��b^*���	 @� @� @� @� @� @������2x�&@� @� @� @� @� @� Pl�K�V? @� @� @� @� @� @��2�T��� @� @� @� @� @� @��- x����'@� @� @� @� @� @� P����t�u� @� @� @� @� @� @�@�/[X� @� @� @� @� @� @��T@�R��n @� @� @� @� @� @�(����b�� @� @� @� @� @� @�@�
^*���m @� @� @� @� @� @���Tla� @� @� @� @� @� @�(S�Ke:��M� @� @� @� @� @� @�����-�~ @� @� @� @� @� @�e* x�L^�	 @� @� @� @� @� @�[@�R���O� @� @� @� @� @� @�L/����6 @� @� @� @� @� @��b^*���	 @� @� @� @� @� @������2x�&@� @� @� @� @� @� Pl�K�V? @� @� @� @� @� @��2�T��� @� @� @� @� @� @��- x����'@� @� @� @� @� @� P����t�u� @� @� @� @� @� @�@�/[X� @� @� @� @� @� @��T@�R��n @� @� @� @� @� @�(����b�� @� @� @� @� @� @�@�
^*���m @� @� @� @� @� @���Tla� @� @� @� @� @� @�(S�Ke:��M� @� @� @� @� @� @�����-�~ @� @� @� @� @� @�e* x�L^�	 @� @� @� @� @� @�[@�R���O� @� @� @� @� @� @�L/����6 @� @� @� @� @� @��b^*���	 @� @� @� @� @� @������2x�&@� @� @� @� @� @� Pl�K�V? @� @� @� @� @� @��2�T��� @� @� @� @� @� @��- x����'@� @� @� @� @� @� P����t�u� @� @� @� @� @� @�@�/[X� @� @� @� @� @� @��T@�R��n @� @� @� @� @� @�(����b�� @� @� @� @� @� @�@�
^*���m @� @� @� @� @� @���Tla� @� @� @� @� @� @�(S�Ke:��M� @� @� @� @� @� @�����-�~ @� @� @� @� @� @�e* x�L^�	 @� @� @� @� @� @�[@�R���O� @� @� @� @� @� @�L/����6 @� @� @� @� @� @��b^*���	 @� @� @� @� @� @������2x�&@� @� @� @� @� @� Pl�K�V? @� @� @� @� @� @��2�T��� @� @� @� @� @� @��- x����'@�R����
mZ/]�u�UW��������/�u����
*����VF��,���v�!�y�&=V<��9���{6i;���g�z�V�G{����t����)����a��P���0���������#�=��o��x�(�#5��\z�b�����x�������e�l�����s��9�RS�����]� �� @� @� @�e$ x��[W^��s��� d��#m��b�?�b��|��w�q#��6��Q���,<���*���O��p���L�>�r�������B����a�����6m��]U���_l��]���o}7����2��r�������}�0f��������P�r�O?�4�s=�f���,�X���>�d{?a�����r>��b��G���Cx�wTn3s�����ua4H��2m���e�b���O�;���3�/da}��V�Z-6���V!M(h�/��2����2!>\L�����_|QP����E�)��x��RhnY��)����/��br�\y�y�g���/�>w7�<�Tsw}���Rsz�t�M6�{�b�����d�CW��|��g�p������|�!�,������\c�>�,�W��j�������9[�����C]�_�s�\����r��������	 @� @� @� @��/����q3���+��U��;5��p�{��a�����|���G������b�������o�6\�`A���O��������&|��W�:\����������m�vy���g����K/�^�/��y����4�y
4�|PU���o�f�jt�~�!\{���v����K.��bs���zj��;��b��������3�8#���_x����m����c�/���d,4x)����7�C)�@S�c/����9r���{O���X��k����s�e�]^9��v��9�X��y��{��n������;����Ukh�����+/����c���x�����xM��4�������4U�����X}���;B��*����{����1w���� @� @� @�Z�����>��WT�S������W������T���c	� �(b��Q@E@���b{/�F����Fc��'*XQl� v1���DPQ�H�`C���.3n�]f������y�a��s�=��3g���o�}��7=��+�\a����_c?�����)��+G4�iK���<�X���g�������?����<�����aC�vlq���I����l����'�pbz�n���m)'+?=����a_t��������F�������0j��5��P;o�aT�����p�9�9��3�O>9��r>�����^{�gS��q�����J��j���j�n�y�)���x7�1m� ��=d���7�������i��92\�����h�{������pM�����j�������MS������5w7�k�Y	 @� @� @� P�������[�,��2a����>Z�n��y�����}����e���N��qe�u
��S�Na�����?������@�V��RK-�>:w�b0���
�z�J����|�_cjh ���P��}�)m���0��'?�y���2s��W_���7f������d�P�Xr�%�s`h�cN IDAT��Y�����0t������{/�u�]�5��h�y��������T�XS��u�.��2����5�\32$���a�e�M���?����-P�����������1���z���8sw��;+ @� @� @�4?�K���Q�	v�a!=���Y�f5Z����>$,X� �L~�=�r��'��Z�
{��{�C&<�X�?>ZJ6������~����s?f�� }������6�VX>	k�.���^8����w��iY~�O<:���������m��+,6X�p�A��n�-|���9��\��5��������~f���t�^�>�����nk����i���f�={v�z��6[oU�y�G����-j�w��L����[��\����p�W�m��:tYy��,�������j��-�y]��������a��6
�N�r��j:G����?x��a�.+��y�5V�'�����M�s�1��#G���n��;��^���m?�������in;N<��l�>�L����Z5�x�QGV��>���tLq�<��:|x���
�{mT�n<�����Y?n3fLzL�v��O?���z����Gu���{O�	k������e��I�#���k�����m��w�w{��������\#�����n������q�*�Z��/ON��������}@!J]����G]������K/���s����o�����7��K���[:��S��A��K��t={�H�!��d�M7	�~���?�\����=��������;�������>;���o�<���r7�]�=p�����o5��{����@3����Kg��w9������~�����O����;J�y��9���1#���������w�:,�>���|�5�R���u��������s}�]���>�����W����u��=��=hC�������% @� @� @�4W�%�����@����
a�dq��������0|�������;.\~�_���7���������	��K������c&��;�����Ub�Z|���q��7'���m��.���I2����Li��]����)S��.v�~���;�K�n������1x`������|�iP���y��/������o����c�NU��~2��;�%���B�E����x�I�����X#�!c�1�������[�B�x����<�����%�X",���a��������o#��:t�A9�n��r>���wl1bD�e�]�����O
w�]��'^������>
q�t|�y��SSm{;��sz��^z)���~��U[���V]m�����O?�[�r}�US�����n�9��'�L���]��I��+�o������g�����'�|^{�����o�e�]B��m�@�{��'	2>8�1c���n�su&[F��W_}O��������s#`����8����W4n���i��u��b �oN���+f��c�=�h��s��p[�����_�$����|�zkj��,^��%�Q�(M9��e�.�Ashs�������sC���������� ��Y��W^y%}�r�-����={�V�#�=[o�Ux���{�p���?����~k�'s�e��_����������'O1j��V
���N��t��<�s���Q�6^~����g�U�c�
�
�/
�3vL��9�T��>��G'LH����������p��gH�{:~�� �����[����6�p�������~'��������/x]�\�����:w�g>�����W���b��c��r��5���{mi� @� @� @��U@���ze����:,����\Sm�Bh�$�e�vs�E��%AJ�bpN�,�a�

���{\���oM����dn�9kvx�����3_~�eHs`tQ��k��_�o�y�}�
S�z;=vz�Hz��Y�������]��d�9�������>��������,��w�5�f�u���e�g�o�Y�_�o��}�zp`���|>`���ZK\x��L�4)������d�)_b�U�^�~��B��=|����xNx��w��1a���BlG�Q�)��x�b��,���ks��d��L21���G3f�w���,|]�
�_mS�/�x8�����#G4�@�j^����n6�r�U�JU�k�Ts��}J�9,�i�O\2s_��c�=6��5����s���Syc��d`�(U�3��`�X*��q������K+��B�U��0k����F|\t��ip�u�^��s4�R�ylB�p�o��w�}���"�%�����K?_cV�?V
����_'�Pd�e�U��Fb�xmQ�r���]�����i?f�\���sh:<0��+�H�.=��S�{:�K������3�vhY6�����Oi�R�����~�yx�����/'�O�;��4�(W�����Uxl�EY���WyoTD�����O���S�,F�YM�}�j&����C�G�����Vh���_{��W���_z9�����<�\�|�����3�{�}�e���|'���������5��:u����g]�����~����B��)��;��.��
q_c���u� @� @� @�Z�����|���h�/�o�dhx����������:thz��#G4�y���b0�UW���O���?���i��X������{��f�%�����4�U�����*{\����G_�u���K/]�v���Qw�u�pG���S�����4V�"��M)�1I��\%��g��a�
6�P�/�s���1c�?�.J�Y�bY%YP������������LJE������C=,
~9���Ru�'f�������>��#�i��6�VK\xw��B�����\p~�ou����H�9����4�R7��/�<{���l���������n���S��*W.�>�H�x>~����>v�b1�\��r��;�a��f$�%~f�x�/�g��>�����*�����v��uq�Yo�������~V���M��?����,�+��<��/M��T�Xm����)�s�����{o�����:�^���k��Y��{�q�{�O�>i��_<�Tx�� �����o��O<�>= �T�3���~��?]/��7�����|[��w�D��|V�}���u{��O��������s+Z�lk1`,Z�G�����W^9�z���V
$��cm����{N�:W���sCv��sw}��L���
s��
�[1w7��� @� @� @� P�����
�_�8��� �#7�(r��"���Z�8qb����@�/��`�����'<�X�i�����^J����^>�����O��_��'Y$Y�t��%�e��������t��)�f��|x�|��$�J� W�LF�\Gn����$f�����^{��n~���s�n���r>86�^�|�M��/���:<���i��X�=��*uc;GU�Q��ru�TL6���}��f1���k�_&�\c���~�!;�Lg���j8��aa���U1�c��w������%��1�r�WL�3��_��.��z�mB���+\�n�>��2�+_�L���I���S�T�]��k3�� �K����s�1���z������"*M9��f�."�&�J�2�;}��06�������b9���+�-s9h��a�5�����}3pw�}�U���Cg%�-�d����#����%���X�[��)�?��D������3�i�F�����u~��n����om����{N���f�
�����������]�+i���W]j����� @� @� @��������fz�L�M�/����������Fe���c�)[�;r���F;y	�h����m�I�tY9]p:a��t$�����|6i��t�F�ze�����$Y�b�<yr�E�1;Sfq�{�����K����Zb6��U)�1c�T���?�~��tA�~34e*��9���v�����v�~����$������
1M�Q�)���(;|��g���o���Lz��}��u�*��2f�W�y�}X]����-���k��{����f�oO;-;v��!l���!���51���1cC�E�L���j�s`��s��R�L�f�3��s����������*[��F�yR�x�QGf���������Q�y��7�����gM,o��[�bY�\���M5��f�nJ�b8w���C����V8����w�I�3�
6�BW3��>�e\�<��z���l_f�-_g���K��q���#���_�={v�f����3L}����'��0��c���W�u��f�U��	j�O��������b��g����;i}���_m���}���]���|����_Isw�V��i����c	 @� @� @� P:��J�Z�i3���?��t��f_���j�*������;����2I�����~�a���b��O>)����t��p~�����VZ)l��a������M�����O������
����
+��b@R�(_��in���4;L\�z��6I�.��c�f�����^b���V��o�tHcn��t����n���_X}�5*;/eJ\���r=b��X����hW�O�24��j���t#G�����9��#����e)WY��{n���sU�n�����7����������������w�M����}����;�������A��K}�UK�3�I�y,Zf����O>�$
+��*�����?c�\�_f[���_}Y�r5�����>�S�������������
�.�XC�����fV�����Q�9�|P`����q �����@z/��2%�f2���^1W�+,|��I2�V.'������`��������3t]�K��m�����f!�|\)?�A�[m�u:�13�e����R)�R���?��1kcush�Z��_6���6�I��='s]������|_b>�w�n�������U0wW~U4�ssw��;3 @� @� @�S ������s �8:��)��[n��RH���|�!C���k���^��!��<��S��o�M�1/L{��p���������R���_��ik�m�	����p�����l��F!f�x��'�oN=5�K>������h���J���o��f��%:������8R~0�=�B�:e�W���m[�M����j;����>t��N�}����#����
������qC��]�7]s��;���{������hF���������,�Z��90h���~�!;�E�1������Na�e����O�\����N;W�F)�h�y,���]LN
5��vL���k��b��1���|2���>��a�M7�mfH*?�|?Ojz}�Ln��z[x��g��g��)��c���oL�����b��u���?=��q��Y6�N�^~��t�~C���s5��\����=�0�]�6J}[C~']�g|�X5��k;�|����*���]Y$�sswn�Bl5wBU� @� @� @�(.�K�u=������ja��wIe����9i����vq���R+�a��O�_�ua������be���?|�����3sn/���]�9�bpP!J��fg��Um��g���L�[��l<���W������N9ex6���d�zs*1�R��Kf�~����������{Wn���L�>��*�m�_ �� �bC��b`����6[S�;�u>N�L|�}��(f�����0�!�13E|
��Y&`.G�l����[>X���z��{��s���+g3k��6��jis`��o�L�����)����O/K8�U:w^)�<=��h�%�y�C����h5s��?�3��b��w������|��x�L��j���?fQ,F�_z9�z���5xwcP|&�z�����g�*��+�z����~��g�;����O� ����=z�H$�?�����tK-�T���?���)��f����~�[�Ge���l��;wn������oI��N�P�s��6�1��kC����
9d�`��6������c���u=�� @� @� @���TUm�����C���J�T����z�.{�l>���
Y*��]D9#����������Z�U�}9/�C��Z�n]�ck}�z�����G���K�Y����i���4��wQ���k����>���V}���6u\]�/����'���d�+�;&=��1e���v��_������$�|��n�k!��|P�&��z�!��������$X-w��=��W�|�M�4iR��3����g��9����*���8��t��WV[�m��l]_�u�yS�N����;�7.�?��~����B>/����m�90�/fE��1��!��(=��3��w�M�bp�r�-v�qp���w�����G��-ic>��z�����/T�9�k2�
3�����5R���c��k������<?�G���wm���s`�2�g^����#_H2J�*����/����������5cF��.����/����*�����?��d2�����q�������?��-�?��C�/G����w����Ssh>c.��w��x7�|PJsw����s!�]um�Z5���������^Q� @� @� @� @��^j>��H��@\L���?��<�H��������]u�U��w���J��E����������Q��=������Z�����w-�y��]�:�~��F
�Zd�*U��N��9s�$�7e�&�W�������tSf�e��5e������,K�O��I����������~����J���,��������w���z���W���>8�w�
7��_��z�%AX�]�z�|�������v����8 
����ks64`��C����}W]5�J��I��k�I����?t�P���J�J�:���5���nK�.|��zf�;'Lx�J��s��J���7���1���_���V�0������&���k\��13H���M�83Y���s�:�*\�uqr������x���������^:l���)���]�gC���cYf�e��[nUyw�y�$�,����jl���c
|���|��X/3���?�|����������]�>vL2n�i�&=�u����
T)s���N�Vc��|�n�i�=g�J5���{�X?fu)T��7�2�%z��w�^x!��3���0�]����;[n�U�����N�E�+�|�I��-w^u����|����{Ny�����|M�s�c�y>sw}��\}-��;��>����_�m��V�4w7�}���P�J� @� @� @� @�8/�u����T>{���#f�%.�/�=������c�K����[�� ���c���K��u��q�GyDv!���������s����A��u�������3��b�A�vL��l^xA�.������L������w��f`z��W���<��Q��q�qe��|{c��
�n�uu������B3\v������J�����5u�^�V^y��u���\�hY
VXa��,�r�I�H������v������'����	_}�U�������� �����b��/�(��~�p��7V�N��(?�|R�=���/*�E5-��<�|����4���)��c���'�"=]88��s�����#?,�D�b���S���*��������1�0WYk�����8O9�����@�8���dC�M������{�+��b�������\�n�m��V�0F�>}z��q�x����3�!���7e�)
��,#S�Nl��a���Kw��d�Y��?�V���8/n�����c���D����<v��OI�>��l H�l���K����%���L�d.��k$�]t��yVb��g��������;�c���OO���/�3�8#
��z1Hy�!CB���O��3�d�/.����V-2������s��G�N�:%����=��#���k��}��q���+�����W�
�?�x������9���i|�l����m��}z�I��8aB��i
q���.�_������e��<	~^u��'�:�E]������fz�����������g~�\w��a�k��j�Ym[�w��~�)�U�����=<�����Au/�R��c��s�\���������� IDAT�(��������iKswC(j� @� @� @��+�d�vM���%�S8��?T�h\�u��`��s�M7
&>^�^uJ���y����rg�����n�G�8��t~ue��W�������0���O�n��$f��d��?���P����E=1� f��y���_��c1rd�LD�b6�C=4�N����3�y���]T|������0��:�����~T���a��)�����Z*�����q�����1H�r�z�x���K��m��?������]w�-~��
W'�b��L�me����T�F�}�u�W\Y�����N>9O$�B��V��� �#��.�S0`@��8���v����$�-�I�&��/H�T���	�m�Y���'q�~�6����.�d�%�: .z���{���uut�0��c�I����L�a<6�5�R~�)?�_�������{��7��0hpQc�g>XTu���G�0p�-����f6��y�����"f��<��t�{\��y���,����jS�:4�wG���}���!�zn9p�������t_>�>s`����s�Gud���'t^q��bYw�u���j�O�Z�>��X���O81�O����c��&s��gN����'$���84�?��n�Y:2e���*�?{��O8��@��!����6��4��@�-�V8a�'#�LA�����c`_|���dW>�H�y���J}{>�X����d�8��������3�����Jq�<#����t��=���%���s���K�Y"����~${��i�swl;�y����u_>s����.K��^K?b�y|d�#c@�1��/��w<������+�7���G ��K/����CY~����7���{���������H��bYc�5����9�kb@s����Z����@��x_9j�
��g����r{��O8��?��I��A�vH��2�W1�l�O._b ��g�^a[����[o	O>YvO��pwro���P��x��{��1]�>r��?������1c�A^y������4+U4��q���tY�����|'���������ls�-5w�w>��:���]�{���_����Vu���X����5��B���I� @� @� @���' x��]S#jq!�A����F�QG.8��tQdu��K/KP�t�Maz�
(.��n�������fB�����q��Yg�.��}!fL����u���1bd���[�4:L��N�1cFZ���7����e��E�O%1������+Y(;5
���M��v�����U��\r����k��><�������A#.���>7�h�p���Y6r-�|������W�s��h�|)��=W��N:9Y��)Yz}�3TdD>��b���������[y��9�:e�-fY���������BR������3�����������W1p�C���6����Na���jj��D ���PP��
�1x).J�}��d!���\4:��1��s���o����{��P�-1S�l�.������K,�x�������\��&�$�����&������'���.�6�G�of�sr1��\�b�7I�o������}���3'��}��������_��_�����+l��0+I�z�y����B2�����a��kN���[o�-
0=��4S���3���(���?
�o�}�c�=s���m�g�u�}�����/O=�d��.���@�80|�!� ���n���pq��'@���;i�C��z�������<�������������H�S����=M����}����c�����q����<������D���L�Y�����J/��R�$	�z�����|����3f��I'��5��
I@m�&L��_�{�xl�b��x�j��V������}��1���G	�M�e�g�|�x_X�^1S'f���������C�O��b���=������<�.�'�>9�9"<���)S����2$�{��~��d��_����!������S��������g��:w>sw}����]*sw}��k2h�}��Vu����4�U��swC���G� @� @� @���)�X����T�s�E1��^�zt_�(�� Px�W^~���� �;��5�-I������ ���tY9
�{���B�>}�y� @� @� @� @�T`��i�W��
�����@�?����kD @� @� @� @� @� @�4����F�v @� @� @� @� @� @�-M@�RK���K� @� @� @� @� @� @��/5�� @� @� @� @� @� @�hi��Z�7^ @� @� @� @� @� @��$����4��Z�i^z}J��}�m`� @� @� @� @� @� @�@��<eZ���{���D@����j� @� @� @� @� @� @��K^ @� @� @� @� @� @�D@�RAX5J� @� @� @� @� @� @���%� @� @� @� @� @� @�
" x� �%@� @� @� @� @� @� @@��� @� @� @� @� @� @��TV� @� @� @� @� @� @�  x�k� @� @� @� @� @� @���^*�F	 @� @� @� @� @� @���5@� @� @� @� @� @� @�@A/�U� @� @� @� @� @� @�^� @� @� @� @� @� @� @� ��
��Q @� @� @� @� @� @�/y
 @� @� @� @� @� @� P�Ka�( @� @� @� @� @� @���� @� @� @� @� @� @�(������j� @� @� @� @� @� @��K^ @�7�|sX}�U��GU��5I���0���;�[`�>������'wG�� @� @� @� @�@�����R��F��/�3f�s?�[���%@�@�06��h4���Y�������7Q�� @� @� @� @�@�
^jXO� @� @� @� @� @� @� �P@��� @� @� @� @� @� @��TV� @� @� @� @� @� @� �$ @�~s��	?��C�F�}9/}�������gW9�r�-�\��p(9s`�]2&@�H������_T����m���[�>�U�V�]�vU��� @� @� @� @�@1��T�WG�U�w���R�[Uy}������'�T������t_��������x�����x|���������k<6�l�1�j���Zy����,���.��^m�����������������X��W^��m������^c����w��2�c��k�Ps`}�M5�5���R^c���2T��T��H-e>���*�C��3g�L_�;��}���rH�{���|�����|k4��{�?���Q��GU�k��Ug+ @� @� @����K�6 @� @� @� @� @� @��-������
,R�������Xd= @�y\s����O���[3vl��Q @ Os`�P� @ �����f���y�������a @� @� @� @�x&O�z��^<����y�(/�N @� @� @� @� @� @�(}�K�
�� @� @� @� @� @� @�@Q
^*���S @� @� @� @� @� @�J_@�R�_C# @� @� @� @� @� @� P��-HJQ���u�������hf�2 @� @� @� @� @� @��
L�2-���������y)O(� @� @� @� @� @� @�������y�M� @� @� @� @� @� @�@�����R� @� @� @� @� @� @���	^���� @� @� @� @� @� @��) x)O(� @� @� @� @� @� @�������y�M� @� @� @� @� @� @�@�����R� @� @� @� @� @� @���	^���� @� @� @� @� @� @��) x)O(� @� @� @� @� @� @�������y�M� @� @� @� @� @� @�@�����R� @� @� @� @� @� @���	^���� @� @� @� @� @� @��) x)O(� @� @� @� @� @� @�������y�M� @� @� @� @� @� @�@�����R� @� @� @� @� @� @���	^���� @� @� @� @� @� @��) x)O(� @� @� @� @� @� @�������y�M� @� @� @� @� @� @�@�����R� @� @� @� @� @� @���	^���� @� @� @� @� @� @��) x)O(� @�@mF\yeX�u�������0u	 �,����2M$�J�����^x��z�� @� @� @� @�V`��mNkZ����c��o�6��Q�e�][.�� �d3g�W_uUz�_�tRh��]����	 @�JG�������C����O(���) @� @� @� @�@I��T�I'KA��$x��s�����R��> �f����C���g�5� @�@!�O���=�W\Q���I� @� @� @� ��/���� @� @� @� @� @� @�(����B�j� @� @� @� @� @� @�@���_�_w��F�K�n�}�y����F���=���o������A`�u�g��>�{ekv[{�*s��_CKv @���w�M�p���_�������r��~��-��8	 @� @� @� @�
 �d��$�!��s�0p���X'O�f��VZi���:�T0�^�y�2HE`�M7
���zz�y���^x!��o���u�����c�F��� @��@�����}��>o�55,�l�����K,Qy�� @� @� @� @����7��*
�0hP��L����/�8xp9�*\h��n�%{��_=d�/�r�m�k����'!@�(-�����g��#��2��K]VY������ @� @� @� @������1�"@� @� @� @� @� @� @��/����{ @� @� @� @� @� @�E+ x�h/�� @� @� @� @� @� @�(m�K�}��� @� @� @� @� @� @�@�
^*�K�c @� @� @� @� @� @�J[@�Ri_?�'@� @� @� @� @� @� P�������X�	,�D������+���/�D 3������E5 @�@#,���Y�C6�S @� @� @� @�Z����x�
�0��[.m����s� @`����C��E@�M� PA �}���>
��A� @� @� @� @�������k�}z�I?q�������\#'@��V^y���K����^rI�7o^����	 @�JG�O��ig����p�E��N��� @� @� @� @��/�%��R�{�}B��]���
�!t��v��o��q����0���8������}a�U����6��EO<�D��N�	 @�
!��[������M�}�Y��*]B�M7��G~��W�8�6	 @� @� @� @�Z���-d��I�����?�h8��?�Gy$�������_������ IDAT:��t���c�N��Q��I�&�7�x#����~: @���7�rK�����]w��y����+�d���P @� @� @� @��U@�R]�G ��j��F��*�� �x|p�� @�@�K/�t8��3��B� @� @� @� @�!o���E� @� @� @� @� @� @�����%� @� @� @� @� @� @�
" x� �%@� @� @� @� @� @� @@��� @� @� @� @� @� @��TV� @� @� @� @� @� @� ����`(��K�O	=��Q�9 @� @� @� @� @� @�&O�z���gr�R�y����� @� @� @� @� @� @�(b�KE|qt� @� @� @� @� @� @�@)^*���� @� @� @� @� @� @��X@�R_]#@� @� @� @� @� @� P���J���; @� @� @� @� @� @��"�T�G� @� @� @� @� @� @������R�z�N� @� @� @� @� @� @��/���5 @� @� @� @� @� @��, x����� @� @� @� @� @� @�(b�KE|qt� @� @� @� @� @� @�@)^*���� @� @� @� @� @� @��X@�R_]#@� @� @� @� @� @� P���J���{A~s��a����E]X�����������Zk������nK$0f @� @� @� @� @� �"/���l���:uJ�����J+��?������#�QG~��a��Z�AO���K�����K-�T8�������*���S[2�� @� @� @� @� @� @��f-�d������)�>%|���a��S�2�,Sc+�o�m�7o^�u��*p�a��?]��p�w�c'L�Z� @� @� @� @� @� @��d^*������4iRx���C�6m�����S�j�*���'6,������W�E�BK.�d8��#R��.�	 @� @� @� @� @� �d^j����'0r�����w�=�m�v������!0e����[�1*�	p���wg����Ca��)�[��h @� @� @� @� @� @��f$ �R3���R�y����n�5mh����j�|�R^4`����.,��U����!>����C�M7	�w�V��b��_q��U��`��p�m����w�tY9�[�mXs����C����J����N��������\f����[�f��t��%l1p`�}��ZA_��l#@� @� @� @� @� @��, x�����7��I�N`Zb�%B�����B6��������+���'���+��/�s��
/��B����+�z���a�~���;4<���i�e�Y&|��G��;�����&��y����_���g��k�?�\Z�}���G������������:v @� @� @� @� @� @��) x�4��^H��GM[���gh��m��R�fG��7thx��	��w���� �K.�4t]u�
'�����w��n;�w�3f�
�����n�qjH���d�C��g����,�����^z������m_���f�����&O�f���=�? @� @� @� @� @� @����>����fj-����������>`������:\v�������.]����t�0�����qwf���W_�������#�<2�v�o��Z+��R�~�
�w����.8?{\���cV�o��6���?�]�����`���$Y����k�v @� @� @� @� @� @��/�����|�����:-_�35|����rH���\r���'<��;7}~���U��$u�������� 	2j��]���o��Lq��a��V
���^x�,����MUN�pC�N���f,����� @� @� @� @� @� @�@i	^*�����={Vz���:�L
������W��^���k��u�I�J��7�n�4��~j��o�t�s�>���}��3f����?��N��5uj�����O~����&�d���#��AQ���53W� @� @� @� @� @� @���T�N�+�`���������Zy����O�z1�QH�UVXa���9s>���;��������`���i�5�_�ux|��t�s�.m��Fa�e�I��T2��-�XM��#@� @� @� @� @� @�JL w�B�
Bw	4��
+��65��9
�d��������3�������?m��g���&N�����p����Z�
���O�g23��?`���?~�����z+.�_�A* @� @� @� @� @� @�%! x�$.�N6�@��:�������u�F?O����������<���?��C���:����\r�0u��0g�����3�n�:���.a�����z(������Y���'Y����V�\<VS}� @� @� @� @� @� @����T:�JOA`�M6M���k�5������\?=q��4i����x�����{�����M�6�g?�Y�����K�������"��;��cx��7�[S���_~9��oa��l9�x��W�[���8G
� @� @� @� @� @� @��R�T�WN�"���[��N�<9|��g9GS73$�o�>��UW����~�!\{�5�������25e*��? �����
o��F4hP�</�r�����Qk��-t�\��*�QMy��g�==z�+�(�R5L6 @� @� @� @� @� @����T��M�%�����m�x�z���N�������gg���O�����>o����+t���^:�x�/��\�u����
_|�E����>
G~Xx���������[����/}z�M7��f���]��a���
7��n���^���2�����v(����] @� @� @� @� @� @�@�	^*����h��M����������u�aC�]W��}<��S�q�>�H�����iy���N><�������>���R���+uk��z2����O?��0ha6��}�d^���o�k��Yg�����)n�%S������>}zx|����b��#�:��n�	 @� @� @� @� @� @���T�P�^`��ai�w�}w�����E�b�V���c��k��>l��V�]�vi����;���|�0~�C��������W^9
Z�%�u)Sq�����d24�ld��[n�9�r��v��������} @� @� @� @� @� @�@	
,� )%�����K�O	=��Qr�n��{���}���t�%���Oh����������N,5p�-z>� @� @� @� @� @� @�@�
L�2-����a�Z��y��]Rj�.� ��D&�~���
��6*	�0jT��W(&p��� @� @� @� @� @�4O�K���U=���-�p��a������R��^Y������^Xz������_y�� @� @� @� @� @� @�@3XlAR��X�z/�>%���FQ�Q� @� @� @� @� @� @��
L�2-���=����P��Z��7l @� @� @� @� @� @���Tha� @� @� @� @� @� @�h���Z��7l @� @� @� @� @� @���Tha� @� @� @� @� @� @�h���Z��7l @� @� @� @� @� @���Tha� @� @� @� @� @� @�h���Z��7l @� @� @� @� @� @���Tha� @� @� @� @� @� @�h���Z��7l @� @� @� @� @� @���Tha� @� @� @� @� @� @�h���Z��7l @� @� @� @� @� @���Tha� @� @� @� @� @� @�h���Z��7l @� @� @� @� @� @���Tha� @� @� @� @� @� @�h���Z��7l @� @� @� @� @� @���Tha� @� @� @� @� @� @�h���Z��7l @� @� @� @� @� @���Tha� @� @� @� @� @� @�h���Z��7l @� @� @� @� @� @���Tha� @� @� @� @� @� @�h���Z��7l @� @� @� @� @� @���Tha� @� @� @� @� @� @�h���Z��7l @� @� @� @� @� @���Tha� @� @� @� @� @� @�h���Z��7l @� @� @� @� @� @���Tha� @� @� @� @� @� @����L��|�����c;F�^b��bb+��b�&&�5��5
������-V4���Xb��-v����2�-��3�;�;��y�}dn9����������tS�K�t�u� @� @� @� @� @� @�@�$/UZX� @� @� @� @� @� @������n:��M� @� @� @� @� @� @����*-�~ @� @� @� @� @� @��T@�R7x�&@� @� @� @� @� @� Pi�K�V? @� @� @� @� @� @��n* y���n @� @� @� @� @� @������J�� @� @� @� @� @� @�@7���M^�	 @� @� @� @� @� @�TZ@�R���O� @� @� @� @� @� @��
H^���� @� @� @� @� @� @�*- y����'@� @� @� @� @� @� �M$/u���m @� @� @� @� @� @����Tia� @� @� @� @� @� @���������6 @� @� @� @� @� @��JH^����	 @� @� @� @� @� @�tS�K�t�u� @� @� @� @� @� @�@�$/UZX� @� @� @� @� @� @������n:��M� @� @� @� @� @� @����*-�~ @� @� @� @� @� @��T@�R7x�&@� @� @� @� @� @� Pi�K�V? @� @� @� @� @� @��n* y���n @� @� @� @� @� N
�D IDAT@������J�� @� @� @� @� @� @�@7���M^�	 @� @� @� @� @� @�TZ@�R���O� @� @� @� @� @� @��
H^���� @� @� @� @� @� @�*- y����'@� ����<�������s�iV����jp^�������������f�n���i��}��7w�����2�]�51��/�([t���m��	�����E���~}lm���b���=�\�u��Z,����.%>����:ujw��~vA�����<;wA���Rw��U7HL� @� @� @��v�����.��N>���!�O��h�
�t��O>�s�W\Q�;�9<;n�5�(��%z�q�k6,}��W
�y���
�L�t}��-����K���[����W�������s�R���9�#��5�n�sg����^�����-�VW	��9���2yr�+vd<���o�!�\T��k�-3k������1�����^��i��V����f�q����o���������N:t��4�E�t�X���:�w��m�y��
]A�-��8V���?�xv��}�J�Jc�������#�XG�����Ur1=����k�<F�=�#���mo��������q�-7�U��i#���=����j�����Zcwk��[�6���jM�����<�����E� @� @� @�]S@�R�W��2�����!-��?^N�'��n�3vl���{�.�X��1bD�s��v���m�;j�����5s��t������_K��
�VXa����)��������\�f����0��������n�mM�g�y����{l���3�U�t��EO���������}�d10�"	C��@G��'"y)w��}v�>��w��x��x��gb���\[���Z;r��iZEw_�K���-�������c��x�T*'���sZ�9�R���sG���|�nm�n��sK����u�X�oK{�n����=G�� @� @� @� P���c����
��G?Jo�����{���t�E����[nm�O<�D�_���2���q���fG�U������|7�5�b���\Z����m��y��B;O��o���M7���>tT<�����E]�d�*����/J���R�@G�Ui-��G�92���y��	tTkI��*vwT�����[���������<�TN����t�������C5V���s�!vw��� @� @� @�t�K�a��jz���
T����g��������~��5��e�[.�7a�9�S�L���OS�LN���?*q�.WgG�U����6�������o��ub�|��W�����?���)~��=K\;V|�������U{����E��v��8��N�6v�u;*����zG�U�-uFw���9��=\���w��]]��� @� @� @� ��$/u����n �����Hz�������3����z�J���o������	J��G|?���#}s����s�}�e�����f��������n����^j�4�>i�EI;��C���?��o�1����z�F��O�,<$���N��'�LW^yefu�/q^��u��'�-��yZq��i����EY8m����SOI��������c��8b�5�,����������pe�Y�f58.��l�M�^/�����Nv��m��q���/��V�|v�/�~�i:������m��7�ms�����k����������[w�u�k��^�6-����F��UW]���f��=����K��F�N>�`S�f�>����&����I�g���6Z��1e��F������o��>����J+���H
�����:3�{���1�����ao��v���!��������.����\���q�_|Q���8q����~���{��F���;���[����E;������~8���o�e�Y:��������2]v�eE+#f��~��#2����H�n�����-�c��f���x�_�q��E�q�I'e~�Zi�X���f�+������?#��2|x����?�<
�r�=���?�q/>c��o�������������z���Ct����y�p�����/���{#�m���gm���/~��b�����j�5~���6y��[o�7v�E��>}z��q�e�4p@Z��uG��}]���{N��SN�M5r�4xP�2r�I�[�\�_������-g[k�\�u���x��k���N>|���:��]������>(v��6��I��;[3V����o�=�s�����b|GZj�%���p�WT��F�.z�H� @� @� @��$/�t���A�������dr���kk=��4�\s�K/�$}��G�z�j�XK����?N���3���n��[nNo��V�����bRh$7��������%�I�1�r����d��Ob����_�t����'�(z^l��7�`���_��x�����o��}��w�}7=��c����,Eb�+��g�:��%�l��F���#
��]w�����68?V�����.���
�)�a�=Gg�}���+��&�G�c�=�{�v��F��N���M���=z�7�x#K�����_~ycUw��=���}�����b�u����t��wg�u�
��b��76�,��7�nr<��n����K���z*E����@K�*j��oO�&�^z�%�D�y��7K��Xt����W�a��Q1p�W����QV\q�1p�e���������.����=������>���o������'N�6�w���j�����i��U���q,i�35����O�>�g�}���b�}$�O���K��9��r�gJ�DU{{����3OE;2��4T�
*m�X���&�����x����xz�����'����{�&�N:���3������>�l�x���W_��E��	��E�:�R�=+�EYx�\���g���\k����A��G��]`��W�����6M���9���x�G��+��Y�����3���*��V���2��/�-���g���="=�������m-�����+�l=*��������>�,��"������k��k�i������,�uK�\�u���x?��&�������S|��g��'�}=2�]-��M��)���Z:V�o�����N;fI�S�N��g��&b_���������K[<���
�[ @� @� @� @����%w�N p�a5�+��w^���/��E�-�|�b�-�	�W��:��Z2V���n���4x���
/�����N3f���N��o����~���_�W�#�&��G���>#�{����j�_�?�����R�u�hs��g��s+��������>�����������m{���u\v�i�wf<����+����=��������_�:�}�[
�����
���~!�����1������N�3��N�����&c��^x��������w�K�������W���&��;��lB��?���1�Hw�uW���_,iXb��?������s+1L�13{o�2��4z�}+4�1eJ���=�������O�p��FO��;Z2V�b�H�8����1��d�7'�pC���U���[��~��x��G��a��}�1
b���R�����r�3'O9��������������	7L�Y��~�c[��S�Z���%q��\��?�I���w�f�Y�$>���_g	��*�/O>�G$b��7��������.�X�{$���V�tdkI<��A�����j�sM$��3�����"������A#����wf��g���g��}����o�%{O�������>w�����J�����-����{`�
7��o��6
�g�]��7�j��VYe�:�h���9I��$������$����\�����9����K���k6�?���O�%�~�������Ol�A�1cF.y~�.��l@��{��\"D<�E�������+��c�?���?��a$��.m�9[l|����>�{�b��$�S|;�B`��4,���C~8{_��u�_�=KGBS��Vle�|;��b#�����UG�����;m��v��K/K/���Y���[������m������;�d���-�k����#{ @� @� @� @�F@��;�@'�����������&6��B%�z�a5+�L�P��'�hG��Y�X�j.�|��}����������1�����^�Y�����vZ���1���9�v���t��'��	��N�.K|j��/�?��ci���g���D�(�@IB�\zi�:~�9~M�3��$�)E�xm��"����>|��T5���:3�K��s��)������(��&��$����&�U���V�P�
tT<�I����6�r��	�K�R�Yg��7f��t���e��D��w^tq���kVs8���4Y����G7��h������X]�'?9&�4AN<����"�d�{���M���������b��|��10�>z�^A$��D����{��&�G,�m����n�gN��T��r�X$B�����+���+���(�J����s:��g�!K�����X���3��w����<�\�{�������k��%�I���z���i2���_�2{n�:����2p���s7V��re�}�YJ�D��Q}���r�n��O�������?�V#�a��U���"A$��o��W����3,VT���k:K����~�y��G����y��.���}6E��t��������N�����Y;���r����.7\p��i����w�I�{1�:n���o�C�'j~#���R��bw1����;V�w�i������P����:�wb�	'��m��J���Q�� @� @� @�*! y���$��C�I"?�}��"�#&�=��3��hA���)����_�m��f��������c��_~��;V��"��7\�#&On�����+���+�����bi���\y+��$���O]�'�"S�G.�������N��x��k.,��w�]lw���������51����/K���Ty�����r��
�z<�fE�k���������{d	m���p��b�t�m�������l�r$m6g���~1q8#���9�����#�r���V����T���9��se��!u8[��S\��u9q,�",J$B�Od��rp�?VQ����c�
��td+'t"�kJ�c����[n�9�g�	�����c�o��:��*��I��L��������I������u���k��H�����JS����H�r�QGe���/�
�7��"�|��5��?��_��=��[o����������E]����-����������s[���x���j�����,��)�m�}!��[ni�����I�;��j����
��S
:���@wI @� @� @�t����@wI���M���r�W�_x��b�Td[L�;�������S�kt�J��G�� �����-��F���[ z��7
����|Yk����k�Y]�������~i.�g�wL�.�t�����W����*���AcU���XM)?�6Vb�]�x��l��o���BS~L��'{]}�UE�c�:��e�����N_~�e���3_�#�AL�����'����&��}��l��S����#r���K$�4U��;<�}���g��i�r���G.T����4��|7����7��H��e��&�d�<b$���K�R�}lk�gN����r��/�Px�����Q�`����HX��\,�H���c������L�.u�Z�\���5��k�U�r��VN�KS%V��������i���R���*<C�K������2�?
����_�J=�P��]w��,Q6���#G���Oj����Vl����������yU��*Q���|L\c�5+.��~�y���w���d����������Xj<����G�]�=���{�Y�������4������;~8 V��l�M�b�.����]���F���=�L+J����{� @� @� @� @�+	���:�/�Y &�p��t�i��X}��3�j�;�f�J�/�h���;�������W�~���N<��+d������']�q����"�[-��R����o����_�XM��VVU��{�5W>����!o�=+�wL,���o�S
Tt{l�IK;��}z����c�����ZgE��~8}������_g*{��g�������NL���B��������F��Vj�]b�X��2�<&���������hI<h��Uv�a���nM&�O��pE��0�3�&�%~��x5x�������v�#�fn����$}��t��7�&>�����IU�3V���^{m��/�������e����j���&�����UW���Gb``DbR|V=�3�D�Xi/��)����;��s��|�4���7����=�����_������J���^������LG�nIk�x��Fmq���\#EF���>����������K��>�����ep#�v$:��hcI8�]zi7���91>k�Xr�4l����G���7��w�bhg{���6�t�t��w�����6�p��8��#G�[u)����w���\��y��������9��S���U��?�Drx$J����V��s���g<�����1-����~��g�8����b���m�9V�c����.��1#��^8�����O�>���]�� Q:S���!Q @� @� @� ���n�B�:���V@�_
���+��Wp\p����������;�U���J�c���OO�|�Y��n�]�/o�K+�%n���wl���9�_qez�_o�'�>���qg�o������l��J����)�U�1&ZG)��H�cNy����Z�xH\��V����
koz�7��"�`�Bn������������}O7��Ws�a���v���^j�������v�����oN9����#A3VE�U*�q/`&^{m������|�.6�-��)VO�nk�8V�����*����r�AS�w�Z�X����������i���?|\������L/���	���w�r������8f�G�$��0iRa��H���_���~{�����0�G)�����j�U��r��4��r��������������xP�����}�}bw�#�R)cU�����1����w�����+��� M{�����.��	�����R����Zv���27g @� @� @� @��$/U�hik�X2����m�}����]vi��4hP���J]u)�q���y��d+s�U6����E�>�~������W���U��](u��Y8;����(�����_G�����?s����c�{~��	'���$3��u��U��}����w��XUi���Y3���_�����Y'~�9_�x��U�:��������|��}IF�zHVm�@�XYp�����s�*����cQ�L�/.8���
�w�u��P�g���b'�'z7v����^������.���1Q��jfM�����p���%����~�=j&��c`��[o�5�H8.VZ��S��j�VJ[p��b���?O�`����|���.���|��;�u���3���bgt~����������S)c�����U���l���I��?+k{�p�
���>�V�����R�PZ���V�����w���2]�^����3�=w��5��9�w���j�I��43?��8V�����9���9��J>~��{SI����^�K�s���g<�o��
?�0cf��:�lf��y����V���V��\+v�(v�����O��������^vy��l��VnE��Z���:2�E� @� @� @������v�j"�&�vXV���m��pV]u��������X{������T3cz���������=zd�~�Q��������g��m��r��2V�^6
 IDAT���04y���T��+�e���E���SO�^{��k�Y��x [���2�<����2�:W{���J���]r���G6��)�����+�D�<yr��^�!Pj<(����w�������rs.Y�x�*�W�����O���>[���O<Q�>|�������#����m?��F����o���O>)�B��/�����w�.����$6��V%^�2V��[�����O��9Y������U��g�WM����>�^}��,q)��������z��C�����V��R�X�J���S�3jw;�k�{��l�*����b,q��oG�q��ym���x���sd�������=[������������:J��>���j�s��'�?C��H�/V^���w�a�R��X���{�mn�-����3�d���^;�����5���%�'�GR�wLi�������9���GK��?�
��K�����!����J�����n�{jn��b%��'������������bw��5���Y����������kY7"���g�������v�{R�.ihD� @� @� @�����T����]Q`��6�����/��s�=���C�]��s�m���.�l���^�~��v��.���F���c�%��������j����/�������I^�V�X�����)�����M�W��������P.�������=#���m���`{l��������b��/�>0&��W�,zn�����/lz=��Q{�X])���?��y��t��I��G��W�M�g�}�}�\|qz���=��\V��4.PJ<h����Y`��^��V6	�����Q��l�����]��s'4�X$���y����[/-�`�JM
�����������*����E����y��
'���H{�V����X?#�����R�j�w��m�=w��?i�"�I"1�6_:K�������$�5�����A"�+L��%q�W`��.�4�L����6�S��\�����6�t��^pAv��/�L�w��i��7�����_�>�I���i��6�QJk�Kf����|-?����}��[R�_��1p@n��>}�d�y���%5���J��<�l���Y+��(���k���/��������Q��K�-��2���S$V�R����|��v�@o���R�@|w��f����]����;o�I���_��%�6V�y���9�+�R��l�������s?2P�V�$��o���lS>��1�������R�\���z]J<�{��bL{��������_s�k���A�6TS�������9�R��2V��|o��/����A��|���w�;�m��������� @� @� @��- y���O�;X ~�|��Y��X$JL���=����6��C�-6���:Zr�7�������6y������c��)L�zu����\�A��Sj�j���C����t��w�zZv�V[m��7V�8��S:l�psc����=��3k�����M��E�IC���.�����&�C9��=��G���l��W_�~��_e��D�:��[����>�^�/����	�'���l2p>) ��v����O>�j�>P����EY$�/��q����J����S�����/K������X������]!}���i�-��l?������������/QO�\rIc�T������Z���|��:�(&��ZJ���U�q��I�l,F��w�����H8��F~�q$�9`����r����|��[,w���D��*A�.�\ZfN�QG�M�����N>���V�jM\k���B-��-�Q�>/��mp`sc�b��_eW���+sqk�:�eE�o�������VZ=��S{�|g����#���q���j~�>�P��_!��K/��[5+����fE�b�n�gN���}[)q��#����
���wa�w��3�8=��ge��^�'Ms��#�|t�i���X]��]J+�����\<�kl��-�K��/I���gY�C<�D��^�G�Xu����+���/N;��,A�#J)c����=r���"e��=s	;��
�{���_��:��lu�be�9����������9��\�v.f7�~�]���Fd/����������m�B]$a�����jV�� �����O(V�i��6�3F${m�������*|��g������~�V\ahz��g�U���5�=g��Qi��6�����~'�p�����_������k��b9���mc@�~�v�������cL�����K�w��������R�.���w�RK����Ok��K�h��R���b�:����h���-|��������j�-KZy9Z�\��])���R�C� @� @� @�����T�c���@����.-�����k��6kULz��}���+��{�V��	��]b��1c�6y���Z*��
G�2yrZi�S�>���+��|���$�&+��3&`
6,K��n�m�B����\"����[��"V��w���c~~��i���sc2l{�R�j|n��]v�5��I�.�t������,�T:����?�%+�/1���H|Zd�!i���MC�_.=��S��#~��R�����#�c���L,���ZnE�;�������l)��G���\b����k��F���z��:UD���[|����W^�g���	��������%V���P����|��7g�UL
��^t��S������������������7#�]���#��:�����.�;����++����6�����:�����CvL�7�Pv�{*����4���&����j�<���	�M�	'f�#�j��6����~������M�Zg_kb`L8���~��w��7e�y>~�{��J)c5���I'����{�4i��i�\"���g�q��v��,t]#��/;K<�;��V��D�a+������|�'��6�d������kd��m�����?6��a�&�"M|VF"��s&�76����i��j�^J��V�����36o���c���H��Y�Y�����Cs�25+�DL����:_/�'��X�T"v�5J�c����K�{��G�U��D�y|>���O�d����������X�Zq�	�*��������b�.R���P�^���j�sM�^��e�]�%�E����a~`�b��%r�
E�{G��"vG� �
b�'�~<h`n��V�::��(�����)VL�������c����x.����O�����������H��9��%��g��q\|��8�����������MZ������o��3?b�������AG���R��\p�E)�_�Db|����u��v���Ks	��cM�r?g�����i.4(�xxE�](V���QX����U�~��,a��K.-�������g����r�57V���>N?���3w����|��(����=��53���sJ�n��5bwI�"@� @� @� @�@�����o�Q &S���>��<��_a�7�������&��
$110V��'�p�������V,��1�m�wf�P1�-V��>}z��_a�������N��tk��������~S����R�*&]y�U���nN���[���������W^9���7���ID���A�b����	h�%D������?�0[y��{�K+�����g���W��I�M���t�x��2w�yW!���y�^��G���� ������X�"V��������VLN�?������+������f�~��%�m��R��K>���r;b��#�>��9g|n��o����V���k����?]�K4����6U�}9�R�A�����d�q/_;qb:��S$D�g��4d����N;�)S�H?�i�����@~b}c
���W�V��?brxLP�"�K��O��b_���10��W_sM���������3���47V��#s��L����s+����J������.�\�l���	'���{��,.�.�%�q|^E�����i�b�������\_k��gj�������������
�y+�������MHm���3��z�u_)q,�����'K4^x���X��&��o������\���+�q��47Yxx�`$?�?+k�*�\=��_Jk�5;��xIG����i���u���RK�c��I����Kr�_�510&��}����������������I{�R��5�5��=}+�����5x�B��s������sd<{����#�q��n��%�w�����V�
���1_j��3���"�'��x.�����Q�y�����[{���P}�{���k��5x��-�H��>�����"�����P�p@����m\�J6��='>��%��w�x���	�]���7u��Yhs������k��R�����;��x���O>��d����]<D�]<�>����}��Zbwk���ui��R���b�^�UNo�}r���D����}8~������j5	������r�k��RDC� @� @� @�s�~M�+�x������KW�B�@�@�8��S��~�����f	IJ��9�?8"m�����o�<
�]H@���)v���2!IZ�GLl��K��D`���jO�T���������> @� @� @� @��
<���������y��I����N�H� @����o�=����?�Vta1��� PQ����/K\��LF��vE��rh��m�B� @� @� @�# y�c�]�%~����?��>����91����8=����O�>i���%��@T��XM���t&��o�)��W�L/���:������=��l��1cS��};S����Z@������ @� @� @����v�������7��.8��4��s�%�X"�7_�4m�+��/�H=z�H���-���]���@���b`C[ P�����N<���o������O��f��������N>���C��$ v��� @� @� @� @�@�H^jwr$@�@y���	����J}��iFn������M>�x���G� 
6��
M��*�h�4��N%��f���}�������^{�����/g+v����i�=�L��%�+ �y���3ZB� @� @� @�m+ y�m=�F��68���S�)��b`wu}&@�-VZi�t�i��EU� @��v��	�e @� @� @� @����*W������O=�R6t�n�s]&@� @� @� @� @� @�����/MKk���Om(0w��* @� @� @� @� @� @�$/� @� @� @� @� @� @���������� @� @� @� @� @� @��K� @� @� @� @� @� @�*" y�"�*%@� @� @� @� @� @� @@��{� @� @� @� @� @� @���H^��J	 @� @� @� @� @� @���� @� @� @� @� @� @� @�"��*��R @� @� @� @� @� @�$/� @� @� @� @� @� @���������� @� @� @� @� @� @��K� @� @� @� @� @� @�*" y�"�*%@� @� @� @� @� @� @@��{� @� @� @� @� @� @���H^��J	 @� @� @� @� @� @���� @� @� @� @� @� @� @�"��*��R @� @� @� @� @� @�$/� @�@.������K��:�����[@����utn��G��=G>������ZG� @� @� @� @�D�K%B9��#��G�����w�y���K��.! v�a�	:H`����s����A-pY @� @� @� @�m+ y�m=�F� @� @� @� @� @� @���Kn @� @� @� @� @� @�*" y�"�*%@� @� @� @� @� @� @`^ @�@�f������������>�^��gi��Y
.���4��>���@�@�	��U7dL�@'���O����������m���n���=z�X��96 @� @� @� @���V^����m�*���k�^={4�;�������#�����k��6{��I�=7�u��&����bm�m�]zi������s���#��=���f��W-yo����i����w��Gg����oo�/�}����G;���km�o�Zj����X�Ul�{���XG���r�u���xP�{R��#u�x���?C��3fd���[n�`�~����26������o�����~nt��G���*~��J� @� @� @��$/S�� @� @� @� @� @� @��V��U���4+��s/�aC�n�8 @�@�8��L���w�;��&^w]���^ @�D1�D(� @���RK.��O��}������9�& @� @� @� @�@�x��ii��C;O���S
Xy�S�F @� @� @� @� @� @��~�K�?�z@� @� @� @� @� @� @�S
H^����Q @� @� @� @� @� @��_@�R��� @� @� @� @� @� @���s}�+��e]�QO=�R6t�.�+�!@� @� @� @� @� @�����/MKk�]���%
Xy�D(� @� @� @� @� @� @� P������M� @� @� @� @� @� @�@���J�r @� @� @� @� @� @��	H^*��� @� @� @� @� @� @��( y�D(� @� @� @� @� @� @� P������M� @� @� @� @� @� @���
� IDAT@���J�r @� @� @� @� @� @��	H^*��� @� @� @� @� @� @��( y�D(� @� @� @� @� @� @� P������M� @� @� @� @� @� @�@���J�r @� @� @� @� @� @��	H^*��� @� @� @� @� @� @��( y�D(� @� @� @� @� @� @� P������M� @� @� @� @� @� @�@���J�r @� @� @� @� @� @��	H^*��� @� @� @� @� @� @��( y�D(� @� @� @� @� @� @� P������M� @� @� @� @� @� @�@���J�r @� @� @� @� @� @��	H^*��� @�$�����z�������%��}��G����V]e��o���v��������Q�����������X��,4����A���$����d�k������W_}58vLZn�eR��_+����:����� @� @� @� @�]G`���=!@�B`�o;�v������b�/��{�E��� @�+���g�c�>:�b�>}�2�.���k�����w�n�Z-��{���7�4���i���NC�I_��;������_ @� @� @� @��W@�R�{='@��.(���+$.]~��i7�-u�Q�%���gd�7.����K��3OS��G�s����,q�_�~���JC���� @� @� @� @�@���&�����>�l��XmD�R�� @�f����z����{�����v�w)�_���j�#�[o}�K�?�z@� @� @� @��T��:�phh��G}�U��o��U�lT��G}Thu��}���L�����P������	 @� @� @� @�]U@�RWY�"@��n!0k����g���A���=}��:����w��[��$�K`�5�(��WZ�����V'Yhp���[4#0i��u��e�^��1q����g�uf3��M� @� @� @� @�q�y�e ����o���F���[�����b���F�������w��h����i��A�y�|�Iz���������w�B}}�X��l\' ��
\�9��_���V^y�:}_l������ @� @� @� @�TV@�Re}�N�**��_�4��;��_�?�����l�h#TN��8���Wu�����+d�/�����W����4:�@$��~��</�����&���.��s7^� @� @� @� @��J`��j�� @� @� @� @� @� @� P5���f�4� @� @� @� @� @� @�@u	H^����Z @� @� @� @� @� @�U# y�j�JC	 @� @� @� @� @� @�T�����/�%@� @� @� @� @� @� P5���f�4� @� @� @� @� @� @�@u	H^����Z @� @� @� @� @� @�U# y�j�JC	 @� @� @� @� @� @�T�����/�%@� @� @� @� @� @� P5���f�4� @� @� @� @� @� @�@u	H^����Z @� @� @� @� @� @�U# y�j�JC	 @�@����o������������ @�@Xj���+��R��� @����A?/����^H� @� @� @� @��N@�R�r&@� @� @� @� @� @� �>�����U @� @� @� @� @� @�t;�K�n�u� @� @� @� @� @� @�@�H^jgW!@� @� @� @� @� @� ��$/u�!�a @� @� @� @� @� @��#0�W��>���Wy������Kwo�'@� @� @� @� @� @�����/MKk�e��#���Re\�J� @� @� @� @� @� @��H^��� @� @� @� @� @� @����TW� @� @� @� @� @� @�������-� @� @� @� @� @� @�@e$/U�U� @� @� @� @� @� @������n @� @� @� @� @� @� P�K�qU+ @� @� @� @� @� @��n/ y��� @� @� @� @� @� @�TF@�Re\�J� @� @� @� @� @� @��H^��� @� @� @� @� @� @����TW� @� @� @� @� @� @�������-� @� @� @� @� @� @�@e$/U�U�]@�'��z���N;��.�����O>�$-��2i����������5 @� @� @� @� @� @�@�	H^j3Ju%��_~)�}���/�?�;Mv��'�L��O��V[u���^=���v�������^�z�c�=.}��������)�� @� @� @� @� @�ti�y�t�t�@�:����g����>&�����Z������?l�;
�����w��.]������Om�Q��l!@� @� @� @� @� @��Z��KU=|_	�g�}6�v���O�>i�}�m�=z�H#F�H���.������k6{�R�w�y��1c2��N;	 @� @� @� @� @� ����U�Z'0a�����w�9������^}��	L�r��4{�j���o��|���;��/���_~( @� @� @� @� @� @�	Xy�
���^��?LW]yeV���{�Ta����Nh��������g��o���)^�}����|=
8 -<d���z���s�ip����*]u�Ui�m�N�-�HZ`��i���J{��|���]~��:W_}u�}�6��5���X��XYt�E��m��-�/����m @� @� @� @� @� @��$/U��i{�<�K���y��'�Zo�6���~��i�]wM?����O?������w�}7M�:5�w��\���?O���3��~���������wz����
7LJ��|�������9�F��^?��c%u��'�����_6lX��l����)S&7z� @� @� @� @� @� @�@u
H^��q��
	�{��Y���O}����U*S��	��C;,�{�����LK�%1�~�i�%��s�SO=%��O7f�������3�[�g�W���[qjt����wL�R8o���d��/1y��'�s�92�=w��f��#�����4c������ @� @� @� @� @��~��3
��oz@�l��jA���J��v�	S&ON���������42�0������VZ9�;��4i�
��}�����3��^�;6{�q�D��^8]x��i������r�o
�������cU��>�����<6'�i�fV�Ze�U�*�����*Q5	O��i; @� @� @� @� @� P]���k����o�5=�����*|���~��Qi�}�-Z����[�����w�}7{}�!�68>VI:������:v�\��,�>���,�)_��sNZj�%����W���>Q������\h���vM������ @� @� @� @� @� @��% y���Kk+,0k���
������v���J�}�����={�HH*VF��va����IM���n����+��������������bU�(�x�����o����/�����-��8&�����9��!� @� @� @� @� @� @�U* y�JN�++��W_U��}�e�-��wf��+EBR�2x�������.�;Vw����g��d�X�i�e�I�|�Iz������Yui�5�H�{���5U��s�5WS��G� @� @� @� @� @�T�@���*���h+��������������������JmL����	E��Z/����j����������N81���#M�2%��_�i���o����y���������I @� @� @� @� @� @��B@�RU�F������d�z��Y�u�v���������_~Y���f���.8�p�:�����w����/���g�;��3���3m���i�
6Hw�qGvl~e�Q����T�"s6���BCj���:�> @� @� @� @� @� @�z$/U�Xii;���u��<��3�p����*��{wcUy������C�����������
C���&��M]�����ei*$v#��tQ5mDSR7����`$D��"�`I���Z�/������	��x���y'!s�9�>������w7NL:z������C�W�X1����-V�\Y|?�����������F����k��w��_�{/�9R��j����W�������{�=_��n @� @� @� @� @� @�U^�����D�����{������I���.�8!i��9E�>���kgdd$v��Mq���+��/��4�bW����+{_������5k����R����E0j��%��q�$����\,�,_�<��u���0�M� @� @� @� @� @�*) �T��i:�@���1k��hx���������s��M�.~��{�����I�K�Rkkkl���b��v���[��������3g����n>|���i�O���^��V__����;ZZ����p�����������/W�����x��CPWy�# @� @� @� @� @� @�b�K�v�
����w}�Xd���Mj����0�x���8P��O���?��|����7/�x��x�����~��S1�cn���|���=���[������.�i������X�pa,]�l�q�����5���������������V��c?x���� @� @� @� @� @� @�^����|���/����7zzz��@	*�����_~9v�z.���/f��]������<�������y��+v:��"����O]���N�f���+���K/�\}�����s��^�� @� @� @� @� @���@m�~U������;'by�����k��^�.^}���;��'6���t����q�]w���'���7�����8 @� @� @� @� @�4W���Sq����Um�	8yi�����!�}��h�N�������f�T�2��>�|\ZW�	.��A� @� @� @� @� @���������]}F��K���
������3������r������mk�����[�]��w @� @� @� @� @� @`��F��4�K����;'by��R��9 @� @� @� @� @� @��d��8w�������T��K���	 @� @� @� @� @� @��^J-�> @� @� @� @� @� @��L��2�m @� @� @� @� @� @�H- ��ZX} @� @� @� @� @� @��
/e:x�&@� @� @� @� @� @� �Z@x)��� @� @� @� @� @� @�2^�t��M� @� @� @� @� @� @ ���Rja�	 @� @� @� @� @� @�d* ����m� @� @� @� @����|IDAT� @� @�@j����� @� @� @� @� @� @��T@x)���6 @� @� @� @� @� @����K���'@� @� @� @� @� @� ����R���m @� @� @� @� @� @����R�O� @� @� @� @� @� @ S��Lo� @� @� @� @� @� @�R/�V� @� @� @� @� @� @�@��K���	 @� @� @� @� @� @��^J-�> @� @� @� @� @� @��L��2�m @� @� @� @� @� @�H- ��ZX} @� @� @� @� @� @��
/e:x�&@� @� @� @� @� @� �Z@x)��� @� @� @� @� @� @�2^�t��M� @� @� @� @� @� @ ���Rja�	 @� @� @� @� @� @�d* ����m� @� @� @� @� @� @�@j����� @� @� @� @� @� @��T@x)���6 @� @� @� @� @� @����K���'@� @� @� @� @� @� ����R���m @� @� @� @� @� @����R�O� @� @� @� @� @� @ S��Lo� @� @� @� @� @� @�R/�V� @� @� @� @� @� @�@��K���	 @� @� @� @� @� @��^J-�> @� @� @� @� @� @��L��2�m @� @� @� @� @� @�H- ��ZX} @� @� @� @� @� @��
/e:x�&@� @� @� @� @� @� �Z@x)��� @� @� @� @� @� @�2^�t��M� @� @� @� @� @� @ ���Rja�	 @� @� @� @� @� @�d* ����m� @� @� @� @� @� @�@j����� @� @� @� @� @� @��T@x)���6 @� @� @� @� @� @����K���'@� @� @� @� @� @� ����R���m @� @� @� @� @� @����R�O� @� @� @� @� @� @ S��Lo� @� @� @� @� @� @�R/�V� @� @� @� @� @� @�@��K���	 @� @� @� @� @� @��^J-�> @� @� @� @� @� @��L��2�m @� @� @� @� @� @�H- ��ZX} @� @� @� @� @� @��
/e:x�&@� @� @� @� @� @� �Z@x)��� @� @� @� @� @� @�2^�t��M� @� @� @� @� @� @ ���Rja�	 @� @� @� @� @� @�d* ����m� @� @� @� @� @� @�@j����� @� @� @� @� @� @��T@x)���6 @� @� @� @� @� @����K���'@� @� @� @� @� @� ����R���m @� @� @� @� @� @����R����j12::E�Y� @� @� @� @� @� �N`dd4Y	�k	/]K�I�oh�����TM @� @� @� @� @� @���<?7��\��\��)�-7���|�3E�Y� @� @� @� @� @� �N��?��9��-���^��Q�v����?}�S��e @� @� @� @� @� @�����8��G����/���^����j�X�����?�}��� @� @� @� @� @� P5���������/��FV�E�Z���u��<o�@����{?Zo�1nm�--3c���	�D� @� @� @� @� @�4S�����$�}�Q|<x�~���h����K�5�����pGFF����������B4�� @� @� @� @� @� @�eh�2����/��w���~����8���$�T���� @� @� @� @� @� @�@�fT�� @� @� @� @� @� @� PR���F[ @� @� @� @� @� @��. �T�	�� @� @� @� @� @� @�@I��J:m @� @� @� @� @� @�����R�'� @� @� @� @� @� @�%^*�`�E� @� @� @� @� @� @���KU���	 @� @� @� @� @� @��T@x���� @� @� @� @� @� @���/U}��'@� @� @� @� @� @� PR���F[ @� @� @� @� @� @��. �T�	�� @� @� @� @� @� @�@I��J:m @� @� @� @� @� @�����R�'� @� @� @� @� @� @�%^*�`�E� @� @� @� @� @� @���KU���	 @� @� @� @� @� @��T@x���� @� @� @� @� @� @���/U}��'@� @� @� @� @� @� PR���F[ @� @� @� @� @� @��. �T�	�� @� @� @� @� @� @�@I��J:m @� @� @� @� @� @�����R�'� @� @� @� @� @� @�%^*�`�E� @� @� @� @� @� @���KU���	 @� @� @� @� @� @��T@x���� @� @� @� @� @� @���/U}��'@� @� @� @� @� @� PR���F[ @� @� @� @� @� @��. �T�	�� @� @� @� @� @� @�@I�����>r�IEND�B`�
#29Marcos Pegoraro
marcos@f10.com.br
In reply to: David G. Johnston (#27)
Re: Document NULL

About JSONB_PATH, you said that "JSON null value is considered equal to
other JSON null values", but didn't say anything about IS DISTINCT FROM at
jsonb_path level. Wouldn't be good to mention something about it ?

select '{1,2}'::integer[] is distinct from null::integer[]
select jsonb_path_exists('[null]', '$[*] ? (@ == null)')

regards
Marcos

#30David G. Johnston
david.g.johnston@gmail.com
In reply to: Marcos Pegoraro (#29)
Re: Document NULL

On Thu, Nov 21, 2024 at 6:50 AM Marcos Pegoraro <marcos@f10.com.br> wrote:

About JSONB_PATH, you said that "JSON null value is considered equal to
other JSON null values", but didn't say anything about IS DISTINCT FROM
at jsonb_path level. Wouldn't be good to mention something about it ?

select '{1,2}'::integer[] is distinct from null::integer[]
select jsonb_path_exists('[null]', '$[*] ? (@ == null)')

I'm not following your train of thought here. Since null == null in
json-land there isn't a need for or concept of "is distinct from". We tend
to not expend space on pointing out things that don't exist, and while I'm
actually one to want to violate that principle more often than not this
doesn't seem like a place for an exception. Especially without being
motivated by end-user questions.

I'm glad they did it for semantics but the need for the path operator "@ is
unknown" is redundant with just saying (@ == null). Pointing that out
seems a bit superfluous though. The nulls equals each other is the key
point to remember and then everything else works just as one would expect
under that condition.

I may end up calling out this dynamic though (not related to json_path
though possibly has an equivalent there, will need to look or be pointed to
the relevant section).

UPDATE statements may use subscripting in the SET clause to modify jsonb
values. Subscript paths must be traversable for all affected values insofar
as they exist. For instance, the path val['a']['b']['c'] can be traversed
all the way to c if every val, val['a'], and val['a']['b'] is an object. If
any val['a'] or val['a']['b'] is not defined, it will be created as an
empty object and filled as necessary. However, if any val itself or one of
the intermediary values is defined as a non-object such as a string,
number, or jsonb null, traversal cannot proceed so an error is raised and
the transaction aborted.

David J.

#31Marcos Pegoraro
marcos@f10.com.br
In reply to: David G. Johnston (#30)
Re: Document NULL

Em qui., 21 de nov. de 2024 às 11:42, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

I'm not following your train of thought here. Since null == null in
json-land there isn't a need for or concept of "is distinct from". We tend
to not expend space on pointing out things that don't exist.

But you said previously in this document about IS DISTINCT, so it's related
to NULL. I thought it would be better to mention that here, for JSON PATH,
that way doesn't exist.

"JSON null value is considered equal to other JSON null values, so here we
don't have the IS DISTINCT operator"

regards
Marcos

#32David G. Johnston
david.g.johnston@gmail.com
In reply to: jian he (#28)
Re: Document NULL

On Wed, Nov 20, 2024 at 7:24 PM jian he <jian.universality@gmail.com> wrote:

On Wed, Nov 20, 2024 at 11:57 PM David G. Johnston
<david.g.johnston@gmail.com> wrote:

-------------------------------------------------------------
in doc/src/sgml/nullvalues.sgml
see the attached for one example output

in doc/src/sgml/nullvalues.sgml we have
one_whitespace<programlisting>
two_whitespace<programlisting>
three_whitespace<programlisting>
four_whitespace<programlisting>

i think you need zero whitespace for tag <programlisting>. like
<programlisting>
</programlisting>

https://tdg.docbook.org/tdg/4.5/programlisting
says whitespaces are significant.

Did you not apply patch 0002? The indentation in 0001 exists because it

was much easier to deal with collapse-all related viewing in my editor. I
removed it in 0002 since the final commit would indeed not be so indented.
The tag itself doesn't actually care but its content does indeed get
undesirably indented if the markup is nested in the typical manner.

i didn't apply patch 0002, 0001 is already too much.

attached image.png for
5.2.7.2. Array Elements and IN Bag Members
the example is too overwhelming, one or two should be enough?

5.2.7.3. Single-Column Subquery Rows.
two examples, can be reduced to one.

Yeah, examples will be there own pass for cleanup as the patch gets closer
to acceptance.

typo:
There are none. During initializion all settings are assigned a non-null
value.
5.2.16. Null Values in Partiton Keys
As noted in the synatx chapter, a null value literal is written using
the NULL keyword. Its type is the pseudo-type unknown but can be cast
to any concrete data type.

Sorry, not seeing the typo. Can you point it out or supply the fix?

""
At present this is typically a non-issue as PostgreSQL does not
support a primary key that does not include partition key columns, and
all columns in a primary key are forced to be have not null
constraints.
""
"does not support...does not include" double negation, can we make it
"positive".
"not null constraints." should be "not-null constraints"?

Yeah, I will clean that up.

David J.

#33David G. Johnston
david.g.johnston@gmail.com
In reply to: David G. Johnston (#25)
Re: Document NULL

On Fri, Jun 28, 2024 at 1:39 PM David G. Johnston <
david.g.johnston@gmail.com> wrote:

The attached are complete and ready for review. I did some file structure
reformatting at the end and left that as the second patch. The first
contains all of the content.

To help manage this fairly large patch I've created a wiki page listing the
sect2 titles (might need to add the handful of sect3s too).

My goal is to use it as a WIP tracker for changes as well as a convenient
place for getting confirmation that specific sections have been looked at
and deemed ready-to-commit. No one person needs to look at everything but
so long as each has one or more someones who has reviewed it the whole
patch can then be marked ready-to-commit.

https://wiki.postgresql.org/wiki/Documenting_NULL

David J.

#34Marcos Pegoraro
marcos@f10.com.br
In reply to: Marcos Pegoraro (#31)
Re: Document NULL

Em qui., 21 de nov. de 2024 às 12:02, Marcos Pegoraro <marcos@f10.com.br>
escreveu:

Well, all comparisons with JSONs runs differently with null values, so
maybe an example would help

select f1 = f2 "JS Object Equal - Right",
f1->'a' = f2->'a' "JS Value Equal - Right",
f1->>'a' = f2->>'a' "Text Equal - Wrong",
f1->>'a' IS NOT DISTINCT FROM f2->>'a' "Text Distinct - Right"
from (Values ('{"a": 5}'::jsonb, '{"a": null}'::jsonb)) x(f1,f2)

"JSON values, independently if null or not, are compared using Equal and
not Equal operators, so here we don't have the IS DISTINCT operator"

regards
Marcos

#35Jeff Davis
pgsql@j-davis.com
In reply to: David G. Johnston (#25)
Re: Document NULL

On Fri, 2024-06-28 at 13:39 -0700, David G. Johnston wrote:

The attached are complete and ready for review.  I did some file
structure reformatting at the end and left that as the second patch. 
The first contains all of the content.

I read through v4-0001. Thank you for working on this!

I really like the overall feel of the document: outlines the various
interpretations, behaviors, nuances and rationales; practical and not
philosophical.

Comments:

1.

One idea is to have a brief guidance section to help users know how to
use nulls in their data model effectively. For instance, if you allow
nulls for middle_name to mean "no middle name", then you have to be
careful when concatenating it as part of a larger string (otherwise it
will make the entire result null). Using COALESCE() can be a good
strategy here.

2.

It would be helpful to go through a combined example that shows how
these varous behaviors interact. For instance:

SELECT r.a, SUM(s.b)
FROM r LEFT JOIN s ON r.id = s.id
GROUP BY r.a HAVING SUM(s.b) < 123;

Assume that there are no null values in r or s, and there's one record
in r with no match in s. First, a null value comes into existence from
the outer join when there's no match. Then, the GROUP BY creates a
group with a single null value. Then the SUM aggregates it and returns
null. Then the less-than expression evaluates to null (due to 3VL),
then the HAVING clause excludes the record because it's distinct from
true. That's probably not what the user intended -- the sum of no
records is intuitively less than 123.

3. "...more formally, the Law of the Excluded Middle does not hold:
i.e., p OR NOT(p) != true; for all p."

Switching to formal language here is confusing (and wrong, I think). I
suggest rewording and I don't think you need formal language here: what
you are highlighting is that, when p is the null value, the expression
"p OR NOT p" evaluates to null, which is surprising to someone who is
used to thinking in 2VL.

4. COUNT() with no input is a special case that returns zero, and I
think that's worth mentioning somewhere.

Regards,
Jeff Davis

#36Marcos Pegoraro
marcos@f10.com.br
In reply to: David G. Johnston (#32)
Re: Document NULL

Em qui., 21 de nov. de 2024 às 12:04, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

Typo in NuLl, mixed upper and lower case.

SELECT
NULL AS "Literal Null Value",
pg_typeof(null) AS "Type of Null",
pg_typeof(NuLl::text) AS "Type of Cast null",
cast(null as text) AS "Cast null value";

should be
pg_typeof(null::text) AS "Type of Cast Null",

#37jian he
jian.universality@gmail.com
In reply to: David G. Johnston (#32)
1 attachment(s)
Re: Document NULL

typo:
There are none. During initializion all settings are assigned a non-null value.
5.2.16. Null Values in Partiton Keys
As noted in the synatx chapter, a null value literal is written using
the NULL keyword. Its type is the pseudo-type unknown but can be cast
to any concrete data type.

Sorry, not seeing the typo. Can you point it out or supply the fix?

typo and other whitespace changes that i think make sense.
please check attached.

Attachments:

typo_and_programlisting_whitespace_fix.nocfbotapplication/octet-stream; name=typo_and_programlisting_whitespace_fix.nocfbotDownload
diff --git a/doc/src/sgml/nullvalues.sgml b/doc/src/sgml/nullvalues.sgml
index 6c7aaed37a..1a9e698a55 100644
--- a/doc/src/sgml/nullvalues.sgml
+++ b/doc/src/sgml/nullvalues.sgml
@@ -12,14 +12,14 @@
   can be executed so long as the following table and rows are created first.
  </para>
 
- <programlisting>
-  CREATE TABLE null_examples (
-    id bigint PRIMARY KEY,
-    value integer NULL
-  );
-  INSERT INTO null_examples
-  VALUES (1, 1), (2, NULL), (3, 4);
- </programlisting>
+<programlisting>
+CREATE TABLE null_examples (
+  id bigint PRIMARY KEY,
+  value integer NULL
+);
+INSERT INTO null_examples
+VALUES (1, 1), (2, NULL), (3, 4);
+</programlisting>
 
  <sect2 id="nullvalues-model">
   <title>Meaning</title>
@@ -38,7 +38,7 @@
    A null value, like all values, must have a data type, and is valid for all data types.
   </para>
   <para>
-   As noted in the <link linkend="sql-syntax-constants-nullvalue">synatx chapter</link>,
+   As noted in the <link linkend="sql-syntax-constants-nullvalue">syntax chapter</link>,
    a null value literal is written using the <literal>NULL</literal> keyword.
    Its type is the <link linkend="datatype-pseudo">pseudo-type unknown</link>
    but can be cast to any concrete data type.
@@ -60,11 +60,11 @@
   </para>
   <para>
 <programlisting>
- SELECT text NULL;
+SELECT text NULL;
 </programlisting>
 <screen>
- ERROR:  column "text" does not exist
- LINE 1: select text NUll;
+ERROR:  column "text" does not exist
+LINE 1: select text NUll;
 </screen>
   </para>
   <para>
@@ -267,28 +267,28 @@
    the value will be null.  The common way this happens is by including the domain column's table
    on the right side of a left join.
 <programlisting>
- BEGIN;
- CREATE DOMAIN domain_example AS integer NOT NULL;
- CREATE TABLE domain_examples (de_id bigint PRIMARY KEY, de_value domain_example);
- INSERT INTO domain_examples VALUES (1, 1), (2, 2);
- SELECT *, pg_typeof(de_value)
- FROM null_examples AS ne
- LEFT JOIN domain_examples AS de ON ne.id = de.de_id;
- ROLLBACK;
-</programlisting>
-<screen>
- BEGIN
- CREATE DOMAIN
- CREATE TABLE
- INSERT 0 2
-  id | value | de_id | de_value |   pg_typeof
- ----+-------+-------+----------+----------------
-   1 |     1 |     1 |        1 | domain_example
-   2 |       |     2 |        2 | domain_example
-   3 |     4 |       |          | domain_example
- (3 rows)
-
- ROLLBACK
+BEGIN;
+CREATE DOMAIN domain_example AS integer NOT NULL;
+CREATE TABLE domain_examples (de_id bigint PRIMARY KEY, de_value domain_example);
+INSERT INTO domain_examples VALUES (1, 1), (2, 2);
+SELECT *, pg_typeof(de_value)
+FROM null_examples AS ne
+LEFT JOIN domain_examples AS de ON ne.id = de.de_id;
+ROLLBACK;
+</programlisting>
+<screen>
+BEGIN
+CREATE DOMAIN
+CREATE TABLE
+INSERT 0 2
+ id | value | de_id | de_value |   pg_typeof
+----+-------+-------+----------+----------------
+  1 |     1 |     1 |        1 | domain_example
+  2 |       |     2 |        2 | domain_example
+  3 |     4 |       |          | domain_example
+(3 rows)
+
+ROLLBACK
 </screen>
    Please see the details in the <link linkend="sql-createdomain-notes">
    notes on the create domain page</link> for another example, as well as
@@ -698,24 +698,24 @@
    when an expression evaulates to a null value, is to allow the row to be inserted
    - the same as a true result.
 <programlisting>
- BEGIN;
- ALTER TABLE null_examples ADD CONSTRAINT value_not_1 CHECK (value != 1);
- ROLLBACK;
+BEGIN;
+ALTER TABLE null_examples ADD CONSTRAINT value_not_1 CHECK (value != 1);
+ROLLBACK;
 </programlisting>
 <screen>
- BEGIN
- ERROR:  check constraint "value_not_1" of relation "null_examples" is violated by some row
- ROLLBACK
+BEGIN
+ERROR:  check constraint "value_not_1" of relation "null_examples" is violated by some row
+ROLLBACK
 </screen>
 <programlisting>
- BEGIN;
- ALTER TABLE null_examples ADD CONSTRAINT value_not_10 CHECK (value != 10);
- ROLLBACK;
+BEGIN;
+ALTER TABLE null_examples ADD CONSTRAINT value_not_10 CHECK (value != 10);
+ROLLBACK;
 </programlisting>
 <screen>
- BEGIN
- ALTER TABLE
- ROLLBACK
+BEGIN
+ALTER TABLE
+ROLLBACK
 </screen>
    We are using a transaction (begin and rollback) and the alter table command to add two
    constraints to our null_examples table.  The first constraint prohibits rows with a value
@@ -817,31 +817,31 @@
   </para>
   <para>
 <programlisting>
- BEGIN;
- CREATE UNIQUE INDEX value_nulls_distinct_implicit ON null_examples (value);
- CREATE UNIQUE INDEX value_nulls_distinct_explicit ON null_examples (value) NULLS DISTINCT;
- INSERT INTO null_examples VALUES (4, NULL);
- ROLLBACK;
+BEGIN;
+CREATE UNIQUE INDEX value_nulls_distinct_implicit ON null_examples (value);
+CREATE UNIQUE INDEX value_nulls_distinct_explicit ON null_examples (value) NULLS DISTINCT;
+INSERT INTO null_examples VALUES (4, NULL);
+ROLLBACK;
 </programlisting>
 <screen>
- BEGIN
- CREATE INDEX
- CREATE INDEX
- INSERT 0 1
- ROLLBACK
+BEGIN
+CREATE INDEX
+CREATE INDEX
+INSERT 0 1
+ROLLBACK
 </screen>
 <programlisting>
- BEGIN;
- CREATE UNIQUE INDEX value_nulls_not_distinct_explicit ON null_examples (value) NULLS NOT DISTINCT;
- INSERT INTO null_examples VALUES (4, NULL);
- ROLLBACK;
+BEGIN;
+CREATE UNIQUE INDEX value_nulls_not_distinct_explicit ON null_examples (value) NULLS NOT DISTINCT;
+INSERT INTO null_examples VALUES (4, NULL);
+ROLLBACK;
 </programlisting>
 <screen>
- BEGIN
- CREATE INDEX
- ERROR:  duplicate key value violates unique constraint "value_nulls_not_distinct_explicit"
- DETAIL:  Key (value)=(null) already exists.
- ROLLBACK
+BEGIN
+CREATE INDEX
+ERROR:  duplicate key value violates unique constraint "value_nulls_not_distinct_explicit"
+DETAIL:  Key (value)=(null) already exists.
+ROLLBACK
 </screen>
   </para>
   <para>
@@ -859,7 +859,7 @@
  </sect2>
 
  <sect2 id="nullvalues-partitionkeys">
-  <title>Null Values in Partiton Keys</title>
+  <title>Null Values in Partition Keys</title>
   <para>
    At present this is typically a non-issue as <productname>PostgreSQL</productname>
    does not support a primary key that does not include partition key columns, and
@@ -876,7 +876,7 @@
  <sect2 id="nullvalues-settings">
   <title>Null-Valued Settings</title>
   <para>
-   There are none.  During initializion all settings are assigned a non-null value.
+   There are none. During initialization all settings are assigned a non-null value.
   </para>
   <para>
    This is mostly meaningful for <link linkend="runtime-config-custom">custom settings</link>,
#38David G. Johnston
david.g.johnston@gmail.com
In reply to: Marcos Pegoraro (#36)
Re: Document NULL

On Sat, Nov 23, 2024 at 5:30 AM Marcos Pegoraro <marcos@f10.com.br> wrote:

Em qui., 21 de nov. de 2024 às 12:04, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

Typo in NuLl, mixed upper and lower case.

SELECT
NULL AS "Literal Null Value",
pg_typeof(null) AS "Type of Null",
pg_typeof(NuLl::text) AS "Type of Cast null",
cast(null as text) AS "Cast null value";

should be
pg_typeof(null::text) AS "Type of Cast Null",

That was not a typo. I'm intentionally showing an example demonstrating
that the SQL NULL is fully case-insensitive. But I suppose showing both
all-upper and all-lower cases fulfills that goal sufficiently. Changed.
Went with NULL so there are two of each. Made all of the column headers
Title Case.

Thanks!

David J.

#39David G. Johnston
david.g.johnston@gmail.com
In reply to: jian he (#37)
Re: Document NULL

On Mon, Dec 2, 2024 at 12:18 AM jian he <jian.universality@gmail.com> wrote:

typo:
There are none. During initializion all settings are assigned a

non-null value.

5.2.16. Null Values in Partiton Keys
As noted in the synatx chapter, a null value literal is written using
the NULL keyword. Its type is the pseudo-type unknown but can be cast
to any concrete data type.

Sorry, not seeing the typo. Can you point it out or supply the fix?

typo and other whitespace changes that i think make sense.
please check attached.

I fixed the 3 spelling typos. I left the full-stop-double-space alone
consistent with elsewhere on the page. The indentation changes I've set
aside until later, though they are incomplete as provided. 0002 has the
correct indentation for the v4 patch series. My plan is to put forth a
v5-0001 patch this week and once a review is willing to indicate
ready-to-commit I'll put out a v6 with the indenting applied.

David J.

#40David G. Johnston
david.g.johnston@gmail.com
In reply to: Marcos Pegoraro (#31)
Re: Document NULL

On Thu, Nov 21, 2024 at 8:03 AM Marcos Pegoraro <marcos@f10.com.br> wrote:

Em qui., 21 de nov. de 2024 às 11:42, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

I'm not following your train of thought here. Since null == null in
json-land there isn't a need for or concept of "is distinct from". We tend
to not expend space on pointing out things that don't exist.

But you said previously in this document about IS DISTINCT, so it's
related to NULL. I thought it would be better to mention that here, for
JSON PATH, that way doesn't exist.

"JSON null value is considered equal to other JSON null values, so here we
don't have the IS DISTINCT operator"

I added this to "Overview"

<para>
Throughout this section the discussion of null values will be limited to
the SQL language unless otherwise noted. The JSON-related data types,
and the
non-SQL procedural languages, have their own behaviors documented in their
respective areas.
</para>

And added this to "Distinctness..."

<para>
On the other hand, the SQL specification is largely alone in taking this
approach to comparing
values to the null value. Specifically, when working within the JSON
data types the use of equals
produces true or false and so the concept of distinctness is neither
present nor required. Please
consult the documentation for the non-SQL procedural language of choice
to learn about its behavior.
</para>

I'm OK with adding more cross-references (links or just brief comparative
verbiage like the above) to non-SQL null value treatment but this document,
for this patch, is going to focus solely on SQL NULL.

David J.

#41Marcos Pegoraro
marcos@f10.com.br
In reply to: David G. Johnston (#40)
Re: Document NULL

Em seg., 9 de dez. de 2024 às 13:31, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

I'm OK with adding more cross-references (links or just brief comparative
verbiage like the above) to non-SQL null value treatment but this document,
for this patch, is going to focus solely on SQL NULL.

If you briefly mention JSON NULLs, it might be interesting to also
briefly mention that in other places NULL can be seen differently,
including changing its name. A SQL NULL passed as argument to a PL/Python
function will be named None or PL/Perl will be undefined.

regards,
Marcos

#42David G. Johnston
david.g.johnston@gmail.com
In reply to: jian he (#28)
Re: Document NULL

On Wed, Nov 20, 2024 at 7:24 PM jian he <jian.universality@gmail.com> wrote:

attached image.png for
5.2.7.2. Array Elements and IN Bag Members
the example is too overwhelming, one or two should be enough?

Agreed, fixed in the upcoming v5. The four outputs are actually two
equivalent pairs so I framed them up as such and removed two of the results.

5.2.7.3. Single-Column Subquery Rows.
two examples, can be reduced to one.

Disagree, the fact that the two outputs are different is precisely the
point of having the two queries. I could see an argument for removing
both, given the pair outputs are indeed the same pair in the previous
sect3. But since they are separate sect3s I'm inclined to keep this intact.

"does not support...does not include" double negation, can we make it
"positive".
"not null constraints." should be "not-null constraints"?

I've also reworked this for v5

David J.

#43David G. Johnston
david.g.johnston@gmail.com
In reply to: Jeff Davis (#35)
Re: Document NULL

Thank you for the review. Changes noted below will be part of v5.

On Fri, Nov 22, 2024 at 12:00 PM Jeff Davis <pgsql@j-davis.com> wrote:

One idea is to have a brief guidance section to help users know how to
use nulls in their data model effectively. For instance, if you allow
nulls for middle_name to mean "no middle name", then you have to be
careful when concatenating it as part of a larger string (otherwise it
will make the entire result null).

I haven't explicitly included such an example but have expanded in this
direction a bit.

Using COALESCE() can be a good

strategy here.

I have now mentioned coalesce and nullif.

<para>
When dealing with null values it is often useful to explicitly to
convert
data to and from a null value given a known non-null representation
(e.g., the empty string, the numbers 0 or 1, or boolean false).
The <link>COALESCE</link> and <link>NULLIF</link> functions are useful
for this purpose.
</para>

2.

It would be helpful to go through a combined example that shows how
these varous behaviors interact.

I have not done this. This is already a large patch and this kind of
example doesn't seem like our norm. I'm not opposed to more content like
this but for now would leave considering it as something an interested
party can propose once this goes in.

3. "...more formally, the Law of the Excluded Middle does not hold:
i.e., p OR NOT(p) != true; for all p."

Switching to formal language here is confusing (and wrong, I think). I
suggest rewording and I don't think you need formal language here:

Agreed. This isn't the place for that presentation and material.

<para>
The presence of null values in the system results in three-valued logic.
In conventional two-valued (binary) logic every outcome is either true
or false.
In three-valued logic the concept of unknown, represented using the
null value, is
also an outcome. This results in falsifying the common-sense notion
that "p OR NOT p" is always true.
</para>

4. COUNT() with no input is a special case that returns zero, and I
think that's worth mentioning somewhere.

I added a parenthetical to the following sentence to address this point:

When executing an aggregate or window function the state tracking component
(which may be initialized to a non-null value, e.g., 0 for the count
function)
will remain unchanged even if the underlying processing
function returns a null value, whether from being defined strict
or it simply returns a null value upon execution.

I'm hesitant to add an example for it though...the implication of the note
seems sufficiently clear - if there are zero rows providing non-null inputs
to an aggregate its concept of initialized non-null value will be
returned. Since count doesn't have an input function to check the only way
to see zero such rows is if the underlying thing being counted is empty.

David J.

#44Jeff Davis
pgsql@j-davis.com
In reply to: David G. Johnston (#43)
Re: Document NULL

On Mon, 2024-12-09 at 15:27 -0700, David G. Johnston wrote:

I have not done this.  This is already a large patch and this kind of
example doesn't seem like our norm.  I'm not opposed to more content
like this but for now would leave considering it as something an
interested party can propose once this goes in.

Fair enough

Though I think it's a great example and I'd like to find some place to
put it.

   <para>
    The presence of null values in the system results in three-valued
logic.
    In conventional two-valued (binary) logic every outcome is either
true or false.
    In three-valued logic the concept of unknown, represented using
the null value, is
    also an outcome.  This results in falsifying the common-sense
notion
    that "p OR NOT p" is always true.
   </para>

Thank you.

I might reword the final sentence as more of an example, like: "Unknown
values can lead to surprising behavior, for instance "NULL OR NOT NULL"
evaluates to the null value."

When executing an aggregate or window function the state tracking
component
   (which may be initialized to a non-null value, e.g., 0 for the
count function)
   will remain unchanged even if the underlying processing
   function returns a null value, whether from being defined strict
   or it simply returns a null value upon execution.

Thank you.

Since count doesn't have an input function to check the only way to
see zero such rows is if the underlying thing being counted is empty.

While true for COUNT(*), technically that's incorrect for COUNT(x),
which counts the rows for which x is non-null. That doesn't invalidate
your point, though: the initial state is unchanged either way.

Regards,
Jeff Davis

#45David G. Johnston
david.g.johnston@gmail.com
In reply to: Jeff Davis (#44)
2 attachment(s)
Re: Document NULL

v5 Attached, v5-0001 is just v4-0001 rebased; v5-0002 is the rework over
v4-0001. There is no formatting-only patch this round.

Wiki tracker: https://wiki.postgresql.org/wiki/Documenting_NULL#ToDo_Note

On Tue, Dec 10, 2024 at 11:52 AM Jeff Davis <pgsql@j-davis.com> wrote:

On Mon, 2024-12-09 at 15:27 -0700, David G. Johnston wrote:
This results in falsifying the common-sense

notion
that "p OR NOT p" is always true.
</para>

Thank you.

I might reword the final sentence as more of an example, like: "Unknown
values can lead to surprising behavior, for instance "NULL OR NOT NULL"
evaluates to the null value."

I went with an example instead.

I got rid of the row counts on the examples and did \pset null NULL for the
newly added example. Then I wrote the part about sometimes NULL is the
empty string and sometimes it is NULL. When I finalize the examples I'm
probably going to \pset null <NULL>.

I'm a bit hung up on the "section" terminology. The automatic naming calls
everything a Section but I'm calling the sect1 the Section, sect2s
Sub-Sections and am rewording things to avoid having to make a choice for
sect3s. Am I overthinking this? Related, right now I have a mix of
Section links and "natural language" links. I'm inclined to make a pass
converting probably everything to "natural language" links - or maybe those
pointing within the same sect1 but leaving outbound links more formal.

David J.

Attachments:

v5-0002-v5-changes-over-v4.patchtext/x-patch; charset=US-ASCII; name=v5-0002-v5-changes-over-v4.patchDownload
From c453d82a425f4d0655233e410dd9a864e3e3fa6d Mon Sep 17 00:00:00 2001
From: "David G. Johnston" <David.G.Johnston@Gmail.com>
Date: Mon, 9 Dec 2024 09:58:33 -0700
Subject: [PATCH 2/2] v5 - changes over v4

---
 doc/src/sgml/nullvalues.sgml | 371 +++++++++++++++++++++--------------
 1 file changed, 223 insertions(+), 148 deletions(-)

diff --git a/doc/src/sgml/nullvalues.sgml b/doc/src/sgml/nullvalues.sgml
index 6c4c29e305..8750404ce1 100644
--- a/doc/src/sgml/nullvalues.sgml
+++ b/doc/src/sgml/nullvalues.sgml
@@ -12,6 +12,13 @@
   can be executed so long as the following table and rows are created first.
  </para>
 
+ <para>
+  Throughout this section the discussion of null values will be limited to
+  the SQL language unless otherwise noted.  The JSON-related data types, and the
+  non-SQL procedural languages, have their own behaviors documented in their
+  respective areas.
+ </para>
+
  <programlisting>
   CREATE TABLE null_examples (
     id bigint PRIMARY KEY,
@@ -30,58 +37,175 @@
    even possible.  The null value also takes on a literal meaning of "not found"
    when produced as the result of an outer join.
   </para>
+  <para>
+   In different programming languages, some of which are accessible in the server
+   as procedural languages, the null value is represented in other ways.
+   Of those included in <productname>PostgreSQL</productname>,
+   these are:
+   <literal>None</literal> in <productname>Python</productname>,
+   <literal>undefined</literal> in <productname>Perl</productname>,
+   and the empty string in <productname>TCL</productname>.
+  </para>
  </sect2>
 
  <sect2 id="nullvalues-usage">
   <title>Usage</title>
   <para>
    A null value, like all values, must have a data type, and is valid for all data types.
+   It must also be printed as text.  This section discusses null values at the boundaries
+   of the system as well as how they can come into existence due to the design of a query.
   </para>
-  <para>
-   As noted in the <link linkend="sql-syntax-constants-nullvalue">synatx chapter</link>,
-   a null value literal is written using the <literal>NULL</literal> keyword.
-   Its type is the <link linkend="datatype-pseudo">pseudo-type unknown</link>
-   but can be cast to any concrete data type.
-  </para>
-  <para>
-   <programlisting>
-   SELECT
-    NULL AS "Literal Null Value",
-    pg_typeof(null) AS "Type of Null",
-    pg_typeof(NuLl::text) AS "Type of Cast null",
-    cast(null as text) AS "Cast null value";
-   </programlisting>
-   <screen>
-     Literal Null Value | Type of Null | Type of Cast null | Cast null value
-    --------------------+--------------+-------------------+-----------------
-                        | unknown      | text              |
-    (1 row)
-   </screen>
-  </para>
-  <para>
-   <programlisting>
-   SELECT text NULL;
-   </programlisting>
-   <screen>
-   ERROR:  column "text" does not exist
-   LINE 1: select text NUll;
-   </screen>
-  </para>
-  <para>
-   The presence of null values in the system results in three-valued logic.
-   In binary logic every outcome is either true or false.  In
-   three-valued logic unknown, represented using a null value, is
-   also an outcome.  Put a bit more formally, the
-   Law of the Excluded Middle does not hold: i.e.,
-   p OR NOT(p) != true; for all p.
-  </para>
-  <para>
-   Aspects of the system that branch based upon
-   whether a condition variable is true or false must therefore
-   decide how to behave when the condition is a null value.
-   The remaining sub-sections summarize these decisions, as well
-   as other behaviors.
-  </para>
+  <sect3 id="nullvalues-usage-input">
+   <title>Null Value Input</title>
+   <para>
+    A null value can be used as input to any function, operator, or expression.
+    The system will then decide how to behave based on the rules described in the
+    rest of this section.  The system will also decide how to behave when a null value
+    is used as a parameter to a function that does not accept null values.
+   </para>
+   <para>
+    As noted in the <link linkend="sql-syntax-constants-nullvalue">syntax chapter</link>,
+    a null value literal is written using the <literal>NULL</literal> keyword.
+    Its type is the <link linkend="datatype-pseudo">pseudo-type unknown</link>
+    but can be cast to any concrete data type.
+   </para>
+   <para>
+    <programlisting>
+    SELECT
+     NULL AS "Literal Null Value",
+     pg_typeof(null) AS "Type of Null",
+     pg_typeof(NULL::text) AS "Type of Cast Null",
+     cast(null as text) AS "Cast Null Value";
+    </programlisting>
+    <screen>
+      Literal Null Value | Type of Null | Type of Cast Null | Cast Null Value
+     --------------------+--------------+-------------------+-----------------
+                         | unknown      | text              |
+    </screen>
+   </para>
+   <para>
+    <programlisting>
+    SELECT text NULL;
+    </programlisting>
+    <screen>
+    ERROR:  column "text" does not exist
+    LINE 1: select text NUll;
+    </screen>
+   </para>
+   <para>
+    The <link linkend="sql-copy"><command>COPY ... FROM</command></link> command,
+    including its psql counter-part meta-command
+    <link linkend="app-psql-meta-commands-copy"><command>\copy</command></link>,
+    must deal with input files containing textual representations of the null value.
+    The lack of consistency in real world data requires having a few options to the
+    command related to null handling.  See the documentation
+    <link linkend="sql-copy">here</link> for more information.
+    But, in short, for CSV input it expects text to be quoted and interprets an unquoted
+    empty string as the null value.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-tables">
+   <title>Null Values in Tables</title>
+   <para>
+    Whether via the copy method above, or by inserting literal null values,
+    most usage concerns for null values results from their presence in a table
+    column that lacks a <link linkend="nullvalues-table-constraints">not-null constraint</link>.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-derived">
+   <title>Derived Null Values</title>
+   <para>
+    Even if all data stored in tables are known to be non-null, null values can still
+    be produced while executing a query.  The most common way this happens is by
+    introducing a (left) outer join to the query and having data missing optional related
+    data on the right side of the join.
+    <programlisting>
+     SELECT
+      countries.country,
+      flagships.flagship
+     FROM (
+      VALUES ('Spain'), ('Switzerland')
+     ) as countries (country)
+     LEFT JOIN (
+      VALUES ('Spain', 'Ship')
+     ) as flagships (country, flagship)
+     ON countries.country = flagships.country;
+    </programlisting>
+    <screen>
+        country   | flagship 
+     -------------+----------
+      Spain       | Ship
+      Switzerland | NULL
+    </screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-output">
+   <title>Null Value Output</title>
+   <para>
+    As evidenced above, the "absence of value" aspect of the null value results
+    in its secondary textual representation being an empty string
+    (its primary representation is just NULL).
+    This can be problematic if the empty string is expected to also be a valid value.
+    Therefore, places that deal with possible null values as input and text as
+    output need some means to give the user a way to specify how to print
+    the null value.
+   </para>
+   <para>
+    Generally, the primary representation is used when the value is part of a multi-element value.
+    If the value is being displayed by itself the secondary (blank) representation is used.  The settings
+    discussed herein typically control the secondary representation.  The null value representation when it
+    is within a container type (composite, array, etc...) is controlled by the input and output rules of the
+    container type.  It is when the container value itself is the null value that these generalities then apply.
+   </para>
+   <para>
+    No matter how the null value got into the result when presenting results to the user it is
+    necessary to present null values using text.  This is the responsibility of the client application.
+    The <command>psql</command> client program has the <link linkend="app-psql-meta-command-pset-null">
+    <literal>\pset null</literal> meta-command</link> to specify the textual output of null values
+    it encounters in query results.
+   </para>
+   <para>
+    When the final output of the result is a text file instead of a user additional
+    considerations come into play.  While the option to simply take the user presentation
+    and send it to a text file always exists <productname>PostgreSQL</productname> also
+    provides a facility to output a structured text file.
+    The <link linkend="sql-copy"><command>COPY ... TO</command></link> command,
+    including its psql counter-part meta-command
+    <link linkend="app-psql-meta-commands-copy"><command>\copy</command></link>,
+    has the <literal>NULL</literal> option (and some modifier options) to specify
+    the string to print to the output for null values it encounters in the query result.
+    As with input file processing, for the CSV format it will, by default,
+    produce an unquoted empty string for the null value.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-handling">
+   <title>Null Value Handling</title>
+   <para>
+    The presence of null values in the system results in three-valued logic.
+    In conventional two-valued (binary) logic every outcome is either true or false.
+    In three-valued logic the concept of unknown, represented using the null value, is
+    also an outcome.  This results in falsifying the common-sense notion
+    that "p OR NOT p" is always true.
+    <programlisting>
+     SELECT
+      NULL OR NOT NULL AS "N OR !N";
+    </programlisting>
+    <screen>
+      N OR !N 
+     ---------
+      NULL
+    </screen>
+    (See <link linkend="nullvalues-operands">below</link> for more explanation.)
+   </para>
+   <para>
+    When dealing with null values it is often useful to explicitly to convert
+    data to and from a null value given a known non-null representation
+    (e.g., the empty string, the numbers 0 or 1, or boolean false).
+    The <link linkend="functions-coalesce-nvl-ifnull">COALESCE</link> and
+    <link linkend="functions-nullif">NULLIF</link> functions are useful
+    for this purpose.
+   </para>
+  </sect3>
  </sect2>
 
  <sect2 id="nullvalues-cardinalrule">
@@ -105,11 +229,10 @@
      N = N | N != N | 1 = N | 1 != N | 1 = 1 | 1 != 1
     -------+--------+-------+--------+-------+--------
            |        |       |        | t     | f
-    (1 row)
    </screen>
    However, as with many rules, there are exceptions, which are
-   <link linkend="nullvalues-multielementcomparison">noted below</link>.  Specifically,
-   when the two compared values are part of a larger multi-element value.
+   <link linkend="nullvalues-multielementcomparison">noted below</link>.
+   Particularly, when the two compared values are part of a larger multi-element value.
    <programlisting>
     SELECT
      array[1,2]=array[1,null] AS "Array Equals";
@@ -118,7 +241,6 @@
      Array Equals
     --------------
      f
-    (1 row)
    </screen>
   </para>
   <para>
@@ -141,9 +263,15 @@
       1 |     1 | f    | f    | f
       2 |       | t    | t    |
       3 |     4 | f    | t    | t
-    (3 rows)
    </screen>
   </para>
+  <para>
+   On the other hand, the SQL specification is largely alone in taking this approach to comparing
+   values to the null value.  For example, when working within the JSON data types the use of equals
+   produces true or false and so the concept of distinctness is neither present nor required.
+   Additional details and links are provided later in <link linkend="nullvalues-json">this section</link>.
+   For the non-SQL procedural languages, please consult the appropriate documentation.
+  </para>
   <para>
    There is also a cardinal warning: when dealing with
    <link linkend="rowtypes">composite types</link> in
@@ -170,10 +298,9 @@
      (1,1) | f      | t          | t          | f             | t
      (2,)  | f      | t          | f          | t             | f
      (3,4) | f      | t          | t          | f             | t
-    (3 rows)
    </screen>
-   See the <link linkend="nullvalues-multielement">multi-element
-   testing section</link> below for an explanation.
+   See <link linkend="nullvalues-multielement">multi-element
+   testing</link> below for an explanation.
   </para>
  </sect2>
 
@@ -191,7 +318,6 @@
      Add | Concatenate
     -----+-------------
          |
-    (1 row)
    </screen>
    Operators that behave otherwise should document their deviation from this norm.
   </para>
@@ -201,7 +327,7 @@
    <programlisting>
     SELECT
      1 IN (1, null) AS "In Present",
-     1 IN (2, null) AS "In MIssing",
+     1 IN (2, null) AS "In Missing",
      null IN (1, 2) AS "N In Non-N",
      null IN (null, 2) AS "N In N";
    </programlisting>
@@ -209,7 +335,6 @@
      In Present | In Missing | N In Non-N | N In N
     ------------+------------+------------+--------
      t          |            |            |
-    (1 row)
    </screen>
    This is just an extension of the multi-element testing behavior described
    <link linkend="nullvalues-multielement">below</link>.
@@ -236,13 +361,12 @@
       1 |     1 | Equal     | Equal     | Equal       | Equal
       2 |       | Not Equal | Equal     | Null        | Null
       3 |     4 | Not Equal | Not Equal | Not Equal   | Not Equal
-    (3 rows)
    </screen>
   </para>
   <para>
    The boolean operators <literal>AND</literal> and <literal>OR</literal>
    will ignore the null value input if the other input is sufficient to
-   to determine the outcome.
+   determine the outcome.
    <programlisting>
     SELECT
      true OR null AS "T or N",
@@ -254,7 +378,6 @@
      T or N | F or N | T and N | F and N
     --------+--------+---------+---------
      t      |        |         | f
-    (1 row)
    </screen>
   </para>
  </sect2>
@@ -263,9 +386,9 @@
   <title>Null Values in Domains</title>
   <para>
    A domain is a user-defined data type that can have a <literal>NOT NULL</literal> constraint.
-   However, some usages of domains will cause the resultant column to have the domain type but
-   the value will be null.  The common way this happens is by including the domain column's table
-   on the right side of a left join.
+   However, some usages of domains will cause the resultant output column (not table column)
+   to have the domain type but the value will be null.
+   The common way this happens is by including the domain column's table on the right side of a left join.
    <programlisting>
     BEGIN;
     CREATE DOMAIN domain_example AS integer NOT NULL;
@@ -286,7 +409,6 @@
       1 |     1 |     1 |        1 | domain_example
       2 |       |     2 |        2 | domain_example
       3 |     4 |       |          | domain_example
-    (3 rows)
 
     ROLLBACK
    </screen>
@@ -297,7 +419,7 @@
  </sect2>
 
  <sect2 id="nullvalues-multielement">
-  <title>Testing Multi-Element Values with Null Elements</title>
+  <title>Testing Multi-Element Values with Null-Valued Elements</title>
   <para>
    Arrays and composite types are multi-element types.  Here we also consider non-empty
    <link linkend="functions-subquery">subquery results</link>
@@ -330,9 +452,9 @@
   </para>
   <para>
    The SQL specification requires that non-exhaustive
-   (e.g., <literal>IN</literal> and <literal>ANY</literal>) subquery tests
+   (i.e., <literal>IN</literal> and <literal>ANY</literal>) subquery tests
    return false when there are no rows in the subquery result, and return true
-   for the exhaustive tests (i.e., <literal>ALL</literal>).
+   for the exhaustive tests (i.e., <literal>NOT IN</literal> and <literal>ALL</literal>).
   </para>
   <para>
    Note that the <link linkend="nullvalues-cardinalrule">cardinal warning</link>
@@ -378,13 +500,12 @@
       Row Is Null | Row Is Not Null | Row Is Null | Row Is Not Null
      -------------+-----------------+-------------+-----------------
       f           | t               | f           | f
-     (1 row)
     </screen>
    </para>
    <para>
     Please read <xref linkend="composite-type-comparison"/> for a complete treatment
     on how <productname>PostgreSQL</productname> handles row-wise comparison.  The
-    next two multi-element parts of this section discuss those comparisons in the
+    next two multi-element related items in this sub-section discuss those comparisons in the
     presence of null-valued fields, and also in terms of the SQL specification.
    </para>
   </sect3>
@@ -393,7 +514,10 @@
    <para>
     Examples of applying the behavior discussed in <xref linkend="nullvalues-multielement"/>
     to arrays, and <literal>IN</literal> and <literal>NOT IN</literal> bags, using the
-    operators defined in <xref linkend="functions-comparisons"/>.
+    operators defined in <xref linkend="functions-comparisons"/>.  The following examples produce
+    the same results when swapping <literal>IN</literal>/<literal>ANY</literal>
+    and also <literal>NOT IN</literal>/<literal>ALL</literal>, plus transforming the bag/array format.
+    I.e., the exhaustive and non-exhaustive pairs noted <link linkend="nullvalues-multielement">above</link>.
    </para>
    <para>
     <programlisting>
@@ -402,16 +526,6 @@
       1 = ANY(array[1, 1]) AS "Any-NoNull-Match",
       1 = ALL(array[1, 1, NULL]) AS "ALL-Null-Match",
       1 = ALL(array[1, 1]) AS "All-NoNull-Match";
-     SELECT
-      2 = ANY(array[1, 1, NULL]) AS "Any-Null-NoMatch",
-      2 = ANY(array[1, 1]) AS "Any-NoNull-NoMatch",
-      2 = ALL(array[1, 1, NULL]) AS "ALL-Null-NoMatch",
-      2 = ALL(array[1, 1]) AS "All-NoNull-NoMatch";
-     SELECT
-      1 IN (1, 1, NULL) AS "IN-Null-Positive",
-      1 IN (1, 1) AS "IN-NoNull-Positive",
-      1 NOT IN (2, 2, NULL) AS "NotIN-Null-Positive",
-      1 NOT IN (2, 2) AS "NotIN-NoNull-Positive";
      SELECT
       2 IN (1, 1, NULL) AS "IN-Null-Negative",
       2 IN (1, 1) AS "IN-NoNull-Negative",
@@ -422,22 +536,10 @@
       Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
      ----------------+------------------+----------------+------------------
       t              | t                |                | t
-     (1 row)
-
-      Any-Null-NoMatch | Any-NoNull-NoMatch | ALL-Null-NoMatch | All-NoNull-NoMatch
-     ------------------+--------------------+------------------+--------------------
-                       | f                  | f                | f
-     (1 row)
-
-      IN-Null-Positive | IN-NoNull-Positive | NotIN-Null-Positive | NotIN-NoNull-Positive
-     ------------------+--------------------+---------------------+-----------------------
-      t                | t                  |                     | t
-     (1 row)
 
       IN-Null-Negative | IN-NoNull-Negative | NotIN-Null-Negative | NotIN-NoNull-Negative
      ------------------+--------------------+---------------------+-----------------------
                        | f                  | f                   | f
-     (1 row)
     </screen>
    </para>
   </sect3>
@@ -445,12 +547,11 @@
    <title>Single-Column Subquery Rows</title>
    <para>
     Examples of applying the behavior discussed in <xref linkend="nullvalues-multielement"/>
-    to subqueries using the operators defined in <xref linkend="functions-subquery"/>.  Note that
-    this section covers the multiple elements being checked are rows, each having one column.  If
-    the column itself is multi-element then the thing being searched for must be a compatible
+    to subqueries using the operators defined in <xref linkend="functions-subquery"/>.  Here we
+    covers the case were the multiple elements being checked are rows, each having one column.
+    If the column itself is multi-element then the thing being searched for must be a compatible
     multi-element value, and the corresponding comparison behavior described in
     <xref linkend="nullvalues-multielementcomparison"/> will also be applied.
-
    </para>
    <para>
     <programlisting>
@@ -469,12 +570,10 @@
       Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
      ----------------+------------------+----------------+------------------
       t              | t                |                | t
-     (1 row)
 
       Any-Null-NoMatch | Any-NoNull-NoMatch | ALL-Null-NoMatch | All-NoNull-NoMatch
      ------------------+--------------------+------------------+--------------------
                        | f                  | f                | f
-     (1 row)
     </screen>
    </para>
   </sect3>
@@ -483,9 +582,9 @@
  <sect2 id="nullvalues-multielementcomparison">
   <title>Multi-Element Comparisons</title>
   <para>
-   The <link linkend="nullvalues-multielementpredicates">prior section</link> discussed applying
+   The <link linkend="nullvalues-multielementpredicates">prior sub-section</link> discussed applying
    a predicate or a scalar value check element-wise across a multi-element value.
-   This section moves the discussion over to comparing two multi-element values to each other.
+   This sub-section moves the discussion over to comparing two multi-element values to each other.
    As both array and composite typed values
    can be stored within an index, and comparing two values in that context must not produce
    a null-valued result, considerations are made to adhere to the SQL specification where
@@ -522,7 +621,6 @@
       Constructors |   s   |    t     | Stored Equality | Stored Ordering
      --------------+-------+----------+-----------------+-----------------
       f            | {1,2} | {1,NULL} | f               | t
-     (1 row)
     </screen>
    </para>
   </sect3>
@@ -539,7 +637,6 @@
       NonNull=Null | Null=Null
      --------------+-----------
                    |
-     (1 row)
     </screen>
    </para>
   </sect3>
@@ -562,7 +659,6 @@
        s   |  t   | Stored Equals Stored | Stored LT Constructor | Stored Equals Constructor
     -------+------+----------------------+-----------------------+---------------------------
      (1,2) | (1,) | f                    | f                     | t
-    (1 row)
    </screen>
   </sect3>
   <sect3 id="nullvalues-multielementcomparison-sqlconformance">
@@ -608,7 +704,6 @@
      Lower | Left | || Text Op | concat Text Func | append([], null) | [] || null | [] || null[]
     -------+------+------------+------------------+------------------+------------+--------------
            |      |            | one              | {1,NULL}         | {1,NULL}   | {1}
-    (1 row)
    </screen>
    In short, please read the documentation for the functions you use if they may receive null inputs
    to understand how they will behave.  Send a documentation comment pointing out any functions
@@ -620,8 +715,9 @@
  <sect2 id="nullvalues-aggregates">
   <title>Null-Valued Arguments in Aggregate and Window Functions</title>
   <para>
-   When executing an aggregate or window function the state tracking
-   component will remain unchanged even if the underlying processing
+   When executing an aggregate or window function the state tracking component
+   (which may be initialized to a non-null value, e.g., 0 for the count function)
+   will remain unchanged even if the underlying processing
    function returns a null value, whether from being defined strict
    or it simply returns a null value upon execution.  The aggregation
    routine will usually ignore the null value and continue processing,
@@ -638,7 +734,6 @@
      Count | Count Value | Count Composite | Count Row
     -------+-------------+-----------------+-----------
          3 |           2 |               3 |         3
-    (1 row)
    </screen>
    Notice the "Count Row" outcome, though.  While we noted in the cardinal warning
    that a composite whose fields are all null values is indistinguishable from
@@ -649,8 +744,8 @@
   </para>
  </sect2>
 
- <sect2 id="nullvalues-where">
-  <title>Null Values in Where</title>
+ <sect2 id="nullvalues-filtering">
+  <title>Null Values When Filtering</title>
   <para>
    A <literal>WHERE</literal> clause that evaluates to a null value for a given row will exclude that row.
    <programlisting>
@@ -666,12 +761,10 @@
      id | Equals 1
     ----+----------
       1 |        1
-    (1 row)
 
      id | Not Equal to 1
     ----+----------------
       3 |              4
-    (1 row)
    </screen>
   </para>
  </sect2>
@@ -683,7 +776,7 @@
    <link linkend="ddl-constraints-check-constraints">check constraint</link>
    expressions on tables to ensure only values passing those expressions are inserted.
    While this seems like it would behave the same as a where clause, the choice here,
-   when an expression evaulates to a null value, is to allow the row to be inserted
+   when an expression evaluates to a null value, is to allow the row to be inserted
    - the same as a true result.
    <programlisting>
     BEGIN;
@@ -741,7 +834,6 @@
          1 |     2
          2 |     1
            |     2
-    (3 rows)
    </screen>
    <programlisting>
     WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
@@ -755,7 +847,6 @@
 
          1
          2
-    (3 rows)
    </screen>
   </para>
  </sect2>
@@ -781,7 +872,6 @@
          2
          1
          1
-    (5 rows)
    </screen>
   </para>
   <para>
@@ -847,11 +937,12 @@
  </sect2>
 
  <sect2 id="nullvalues-partitionkeys">
-  <title>Null Values in Partiton Keys</title>
+  <title>Null Values in Partition Keys</title>
   <para>
-   At present this is typically a non-issue as <productname>PostgreSQL</productname>
-   does not support a primary key that does not include partition key columns, and
-   all columns in a primary key are forced to be have not null constraints.
+   Presently, PostgreSQL requires that all the columns of a partition key be included
+   in the primary key.  Furthermore, all columns used in a primary key have a not-null
+   column constraint applied to them.  Therefore, any partitioned table with a primary key
+   will only have non-null values in the partition key columns.
   </para>
   <para>
    However, should you setup a situation where a partition key column can both: have a null value
@@ -864,11 +955,11 @@
  <sect2 id="nullvalues-settings">
   <title>Null-Valued Settings</title>
   <para>
-   There are none.  During initializion all settings are assigned a non-null value.
+   There are none.  During initialization all settings are assigned a non-null value.
   </para>
   <para>
    This is mostly meaningful for <link linkend="runtime-config-custom">custom settings</link>,
-   thus this section focuses on <link linkend="config-setting-sql">SQL interaction</link>.
+   thus this sub-section focuses on <link linkend="config-setting-sql">SQL interaction</link>.
    Unlike settings created by extensions, custom settings can only be textual and the default
    value for text here is the empty string.
    <programlisting>
@@ -887,24 +978,20 @@
      set_config
     ------------
 
-    (1 row)
 
      Setting Is Null
     -----------------
      f
-    (1 row)
 
     ROLLBACK
      example.string
     ----------------
 
-    (1 row)
 
     RESET
      example.string
     ----------------
 
-    (1 row)
    </screen>
    Notice two important behaviors: first, even though we passed in a null value to
    to the <literal>set_config</literal> function, the <literal>current_setting</literal>
@@ -922,8 +1009,11 @@
  <sect2 id="nullvalues-json">
   <title>Null Values in JSON</title>
   <para>
-   As noted in <xref linkend="json-type-mapping-table"/>, JSON has a null value
-   that does not get exposed at the SQL level.
+   As noted in <xref linkend="json-type-mapping-table"/>, the JSON specification's
+   null value is assigned its own type unlike in SQL.  This introduces an inconsistency
+   since the JSON null type's value is itself non-null.  It is also comparable to any
+   other JSON type, returning false for equality, and itself, returning true for equality.
+   But an SQL value of json or jsonb type having a JSON null value is considered non-null in SQL.
    <programlisting>
     SELECT 'null'::json IS NULL AS "JSON null is NULL";
    </programlisting>
@@ -931,11 +1021,10 @@
      JSON null is NULL
     -------------------
      f
-    (1 row)
    </screen>
    Additionally, the SQL operators and functions involving JSON key or array element selection,
-   or construction from literals, require that a number or text value be supplied as an operand
-   and so JSON null values cannot be targeted by those operators and functions.
+   or construction from literals, require that a valid number or text value be supplied as an operand
+   and so an SQL null value cannot be targeted by those operators and functions.
    <programlisting>
     SELECT to_json(null::text);
    </programlisting>
@@ -943,9 +1032,8 @@
      to_json
     ---------
 
-    (1 row)
    </screen>
-   That all said, the system will convert from SQL null values to JSON null values when in a
+   That all said, the system will convert an SQL null value to a JSON null value when in a
    composite type context.
    <programlisting>
     SELECT json_build_object('value', value)
@@ -957,7 +1045,6 @@
      {"value" : 1}
      {"value" : null}
      {"value" : 4}
-    (3 rows)
    </screen>
    And vice versa.
    <programlisting>
@@ -970,25 +1057,13 @@
          1
 
          4
-    (3 rows)
    </screen>
   </para>
   <para>
-   A more versatile way to process JSON is to use jsonpath.  Within this context, as noted in
-   <xref linkend="functions-sqljson-filter-ex-table"/>, the JSON null value is considered equal
-   to other JSON null values.  However, while equaltiy works as expected, ordering is not implemented.
-   <programlisting>
-    SELECT
-     jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ &gt; null)') AS "GT",
-     jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ &lt; null)') AS "LT",
-     jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ &lt;&gt; null)') AS "NE";
-   </programlisting>
-   <screen>
-     GT | LT |    NE
-    ----+----+-----------
-     [] | [] | [1, 2, 3]
-    (1 row)
-   </screen>
+   Aspects of null value handling within the internals of the JSON-related types are discussed
+   <link linkend="datatype-json">in the JSON type section</link> of the documentation,
+   particularly in its <link linkend="datatype-jsonpath">JSONPath sub-section</link>.
+   This sub-section is focused on how SQL null values are related to JSON null values.
   </para>
  </sect2>
 </sect1>
-- 
2.34.1

v5-0001-v4-rebase.patchtext/x-patch; charset=US-ASCII; name=v5-0001-v4-rebase.patchDownload
From d693de3716ecd1ef567df55e22f756d5f5e2c540 Mon Sep 17 00:00:00 2001
From: "David G. Johnston" <David.G.Johnston@Gmail.com>
Date: Mon, 9 Dec 2024 09:41:07 -0700
Subject: [PATCH 1/2] v4-rebase

---
 doc/src/sgml/datatype.sgml          |   2 +-
 doc/src/sgml/ddl.sgml               |   2 +
 doc/src/sgml/filelist.sgml          |   1 +
 doc/src/sgml/func.sgml              | 273 ++++----
 doc/src/sgml/json.sgml              |   7 +-
 doc/src/sgml/nullvalues.sgml        | 994 ++++++++++++++++++++++++++++
 doc/src/sgml/ref/create_domain.sgml |   7 +-
 doc/src/sgml/syntax.sgml            |  23 +-
 8 files changed, 1149 insertions(+), 160 deletions(-)
 create mode 100644 doc/src/sgml/nullvalues.sgml

diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml
index e0d33f12e1..7029fac847 100644
--- a/doc/src/sgml/datatype.sgml
+++ b/doc/src/sgml/datatype.sgml
@@ -5365,7 +5365,7 @@ WHERE ...
        <row>
         <entry><type>unknown</type></entry>
         <entry>Identifies a not-yet-resolved type, e.g., of an undecorated
-         string literal.</entry>
+         string literal.  Also, the <link linkend="nullvalues-usage">null value.</link></entry>
        </row>
       </tbody>
      </tgroup>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index dea04d64db..4f6c15e77f 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -168,6 +168,8 @@ DROP TABLE products;
   </para>
  </sect1>
 
+ &nullvalues;
+
  <sect1 id="ddl-default">
   <title>Default Values</title>
 
diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml
index 66e6dccd4c..8162159c1a 100644
--- a/doc/src/sgml/filelist.sgml
+++ b/doc/src/sgml/filelist.sgml
@@ -21,6 +21,7 @@
 <!ENTITY indices    SYSTEM "indices.sgml">
 <!ENTITY json       SYSTEM "json.sgml">
 <!ENTITY mvcc       SYSTEM "mvcc.sgml">
+<!ENTITY nullvalues SYSTEM "nullvalues.sgml">
 <!ENTITY parallel   SYSTEM "parallel.sgml">
 <!ENTITY perform    SYSTEM "perform.sgml">
 <!ENTITY queries    SYSTEM "queries.sgml">
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 8b81106fa2..aa04bc2d31 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -23493,7 +23493,8 @@ MERGE INTO products p
    This section describes the <acronym>SQL</acronym>-compliant subquery
    expressions available in <productname>PostgreSQL</productname>.
    All of the expression forms documented in this section return
-   Boolean (true/false) results.
+   <link linkend="nullvalues">three-valued</link> typed
+   results (true, false, or null).
   </para>
 
   <sect2 id="functions-subquery-exists">
@@ -23555,19 +23556,17 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>IN</token>
+   is <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result.
-   The result of <token>IN</token> is <quote>true</quote> if any equal subquery row is found.
-   The result is <quote>false</quote> if no equal row is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any equal subquery row is found.
+   The result is <quote>false</quote> if no equal row is found.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>IN</token> construct will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.
   </para>
 
   <para>
@@ -23584,21 +23583,18 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.
+   The result of <token>IN</token> is <quote>false</quote> if the subquery returns no rows,
+   otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result.
-   The result of <token>IN</token> is <quote>true</quote> if any equal subquery row is found.
-   The result is <quote>false</quote> if no equal row is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any equal subquery row is found.
+   The result is <quote>false</quote> if no equal row is found.
   </para>
 
   <para>
-   As usual, null values in the rows are combined per
-   the normal rules of SQL Boolean expressions.  Two rows are considered
-   equal if all their corresponding members are non-null and equal; the rows
-   are unequal if any corresponding members are non-null and unequal;
-   otherwise the result of that row comparison is unknown (null).
-   If all the per-row results are either unequal or null, with at least one
-   null, then the result of <token>IN</token> is null.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -23610,20 +23606,17 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 </synopsis>
 
   <para>
-   The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
-   is evaluated and compared to each row of the subquery result.
-   The result of <token>NOT IN</token> is <quote>true</quote> if only unequal subquery rows
-   are found (including the case where the subquery returns no rows).
+   The right-hand side is a parenthesized subquery, which must return exactly one column.
+   The result of <token>NOT IN</token> is <quote>true</quote> if the subquery returns no rows,
+   otherwise the left-hand expression is evaluated and compared to each row of the subquery result.
+   The result is <quote>true</quote> if only unequal subquery rows are found.
    The result is <quote>false</quote> if any equal row is found.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>NOT IN</token> construct will be null, not true.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
+   tests are OR'd together.
   </para>
 
   <para>
@@ -23640,21 +23633,18 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.
+   The result of <token>NOT IN</token> is <quote>true</quote> if the subquery returns no rows,
+   otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result.
-   The result of <token>NOT IN</token> is <quote>true</quote> if only unequal subquery rows
-   are found (including the case where the subquery returns no rows).
+   The result is <quote>true</quote> if only unequal subquery rows are found.
    The result is <quote>false</quote> if any equal row is found.
   </para>
 
   <para>
-   As usual, null values in the rows are combined per
-   the normal rules of SQL Boolean expressions.  Two rows are considered
-   equal if all their corresponding members are non-null and equal; the rows
-   are unequal if any corresponding members are non-null and unequal;
-   otherwise the result of that row comparison is unknown (null).
-   If all the per-row results are either unequal or null, with at least one
-   null, then the result of <token>NOT IN</token> is null.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -23668,13 +23658,13 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>ANY</token> is
+   <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ANY</token> is <quote>true</quote> if any true result is obtained.
-   The result is <quote>false</quote> if no true result is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any true result is obtained.
+   The result is <quote>false</quote> if no true result is found.
   </para>
 
   <para>
@@ -23683,11 +23673,10 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   </para>
 
   <para>
-   Note that if there are no successes and at least one right-hand row yields
-   null for the operator's result, the result of the <token>ANY</token> construct
-   will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -23705,16 +23694,19 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.  The result of <token>ANY</token> is
+   <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result,
    using the given <replaceable>operator</replaceable>.
-   The result of <token>ANY</token> is <quote>true</quote> if the comparison
-   returns true for any subquery row.
-   The result is <quote>false</quote> if the comparison returns false for every
-   subquery row (including the case where the subquery returns no
-   rows).
-   The result is NULL if no comparison with a subquery row returns true,
-   and at least one comparison returns NULL.
+   The result is <quote>true</quote> if the comparison returns true for any subquery row.
+   The result is <quote>false</quote> if the comparison returns false for every subquery row.
+  </para>
+
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are OR'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -23732,15 +23724,20 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>ALL</token> is
+   <quote>true</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ALL</token> is <quote>true</quote> if all rows yield true
-   (including the case where the subquery returns no rows).
+   The result is <quote>true</quote> if all rows yield true.
    The result is <quote>false</quote> if any false result is found.
-   The result is NULL if no comparison with a subquery row returns false,
-   and at least one comparison returns NULL.
+  </para>
+
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -23761,22 +23758,21 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.  The result of <token>ALL</token> is
+   <quote>true</quote> if the subquery returns no rows, otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result,
    using the given <replaceable>operator</replaceable>.
-   The result of <token>ALL</token> is <quote>true</quote> if the comparison
-   returns true for all subquery rows (including the
-   case where the subquery returns no rows).
-   The result is <quote>false</quote> if the comparison returns false for any
-   subquery row.
-   The result is NULL if no comparison with a subquery row returns false,
-   and at least one comparison returns NULL.
+   The result is <quote>true</quote> if the comparison returns true for all subquery rows.
+   The result is <quote>false</quote> if the comparison returns false for any subquery row.
   </para>
 
   <para>
-   See <xref linkend="row-wise-comparison"/> for details about the meaning
-   of a row constructor comparison.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
+
   </sect2>
 
   <sect2 id="functions-subquery-single-row-comp">
@@ -23801,6 +23797,14 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    compared row-wise to the single subquery result row.
   </para>
 
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, the result cannot be <quote>true</quote> in the
+   presence of null valued fields in either the row constructor or the subquery result row, as
+   the individual field tests are AND'd together.
+   Note that <literal>IS DISTINCT FROM</literal> is not an operator.
+  </para>
+
   <para>
    See <xref linkend="row-wise-comparison"/> for details about the meaning
    of a row constructor comparison.
@@ -23868,7 +23872,8 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    <productname>PostgreSQL</productname> extensions; the rest are
    <acronym>SQL</acronym>-compliant.
    All of the expression forms documented in this section return
-   Boolean (true/false) results.
+   <link linkend="nullvalues">three-valued</link> boolean typed
+   results (true, false, or null).
   </para>
 
   <sect2 id="functions-comparisons-in-scalar">
@@ -23881,24 +23886,13 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   <para>
    The right-hand side is a parenthesized list
    of expressions.  The result is <quote>true</quote> if the left-hand expression's
-   result is equal to any of the right-hand expressions.  This is a shorthand
-   notation for
-
-<synopsis>
-<replaceable>expression</replaceable> = <replaceable>value1</replaceable>
-OR
-<replaceable>expression</replaceable> = <replaceable>value2</replaceable>
-OR
-...
-</synopsis>
+   result is equal to any of the right-hand expressions.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand expression yields
-   null, the result of the <token>IN</token> construct will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence null values since the multiple equality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -23912,35 +23906,15 @@ OR
   <para>
    The right-hand side is a parenthesized list
    of expressions.  The result is <quote>true</quote> if the left-hand expression's
-   result is unequal to all of the right-hand expressions.  This is a shorthand
-   notation for
-
-<synopsis>
-<replaceable>expression</replaceable> &lt;&gt; <replaceable>value1</replaceable>
-AND
-<replaceable>expression</replaceable> &lt;&gt; <replaceable>value2</replaceable>
-AND
-...
-</synopsis>
+   result is unequal to all of the right-hand expressions.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand expression yields
-   null, the result of the <token>NOT IN</token> construct will be null, not true
-   as one might naively expect.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of null values since the multiple inequality
+   tests are OR'd together.
   </para>
 
-  <tip>
-  <para>
-   <literal>x NOT IN y</literal> is equivalent to <literal>NOT (x IN y)</literal> in all
-   cases.  However, null values are much more likely to trip up the novice when
-   working with <token>NOT IN</token> than when working with <token>IN</token>.
-   It is best to express your condition positively if possible.
-  </para>
-  </tip>
   </sect2>
 
   <sect2 id="functions-comparisons-any-some">
@@ -23953,30 +23927,26 @@ AND
 
   <para>
    The right-hand side is a parenthesized expression, which must yield an
-   array value.
-   The left-hand expression
+   array value. The result of <token>ANY</token> is
+   <quote>false</quote> if the array has zero element, otherwise
+   the left-hand expression
    is evaluated and compared to each element of the array using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ANY</token> is <quote>true</quote> if any true result is obtained.
-   The result is <quote>false</quote> if no true result is found (including the
-   case where the array has zero elements).
+   The result is <quote>true</quote> if any true result is obtained.
+   The result is <quote>false</quote> if no true result is found.
   </para>
 
   <para>
-   If the array expression yields a null array, the result of
-   <token>ANY</token> will be null.  If the left-hand expression yields null,
-   the result of <token>ANY</token> is ordinarily null (though a non-strict
-   comparison operator could possibly yield a different result).
-   Also, if the right-hand array contains any null elements and no true
-   comparison result is obtained, the result of <token>ANY</token>
-   will be null, not false (again, assuming a strict comparison operator).
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both elements and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
    <token>SOME</token> is a synonym for <token>ANY</token>.
+   <token>IN</token> is equivalent to <literal>= ANY</literal>.
   </para>
   </sect2>
 
@@ -23990,26 +23960,27 @@ AND
   <para>
    The right-hand side is a parenthesized expression, which must yield an
    array value.
-   The left-hand expression
+   The result of <token>ALL</token> is
+   <quote>true</quote> if the array has zero elements, otherwise
+   the left-hand expression
    is evaluated and compared to each element of the array using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ALL</token> is <quote>true</quote> if all comparisons yield true
-   (including the case where the array has zero elements).
+   The result is <quote>true</quote> if all comparisons yield true.
    The result is <quote>false</quote> if any false result is found.
   </para>
 
   <para>
-   If the array expression yields a null array, the result of
-   <token>ALL</token> will be null.  If the left-hand expression yields null,
-   the result of <token>ALL</token> is ordinarily null (though a non-strict
-   comparison operator could possibly yield a different result).
-   Also, if the right-hand array contains any null elements and no false
-   comparison result is obtained, the result of <token>ALL</token>
-   will be null, not true (again, assuming a strict comparison operator).
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both elements and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
+
+  <para>
+   <token>NOT IN</token> is equivalent to <literal>&lt;&gt; ALL</literal>.
+  </para>
+
   </sect2>
 
   <sect2 id="row-wise-comparison">
@@ -24060,6 +24031,11 @@ AND
    considered.
   </para>
 
+  <para>
+   See <xref linkend="nullvalues-multielementcomparison-rowconstructor"/>
+   and surrounding content for additional details and examples.
+  </para>
+
 <synopsis>
 <replaceable>row_constructor</replaceable> IS DISTINCT FROM <replaceable>row_constructor</replaceable>
 </synopsis>
@@ -24094,20 +24070,11 @@ AND
 </synopsis>
 
   <para>
-   The SQL specification requires row-wise comparison to return NULL if the
-   result depends on comparing two NULL values or a NULL and a non-NULL.
-   <productname>PostgreSQL</productname> does this only when comparing the
-   results of two row constructors (as in
-   <xref linkend="row-wise-comparison"/>) or comparing a row constructor
-   to the output of a subquery (as in <xref linkend="functions-subquery"/>).
-   In other contexts where two composite-type values are compared, two
-   NULL field values are considered equal, and a NULL is considered larger
-   than a non-NULL.  This is necessary in order to have consistent sorting
-   and indexing behavior for composite types.
-  </para>
-
-  <para>
-   Each side is evaluated and they are compared row-wise.  Composite type
+   Each side is evaluated and they are compared row-wise.
+   As discussed and shown in <xref linkend="nullvalues-multielementcomparison-composite"/>,
+   null values are treated as being equal to other null values and greater
+   than all non-null values.
+   Composite type
    comparisons are allowed when the <replaceable>operator</replaceable> is
    <literal>=</literal>,
    <literal>&lt;&gt;</literal>,
diff --git a/doc/src/sgml/json.sgml b/doc/src/sgml/json.sgml
index 54648c459c..140f94e8e3 100644
--- a/doc/src/sgml/json.sgml
+++ b/doc/src/sgml/json.sgml
@@ -129,6 +129,11 @@
   the corresponding <productname>PostgreSQL</productname> types.
  </para>
 
+ <indexterm>
+  <primary>null value</primary>
+  <secondary sortas="json">within JSON</secondary>
+ </indexterm>
+
   <table id="json-type-mapping-table">
      <title>JSON Primitive Types and Corresponding <productname>PostgreSQL</productname> Types</title>
      <tgroup cols="3">
@@ -162,7 +167,7 @@
        <row>
         <entry><type>null</type></entry>
         <entry>(none)</entry>
-        <entry>SQL <literal>NULL</literal> is a different concept</entry>
+        <entry>An SQL null value is similar, but see <xref linkend="nullvalues-json"/> for differences.</entry>
        </row>
       </tbody>
      </tgroup>
diff --git a/doc/src/sgml/nullvalues.sgml b/doc/src/sgml/nullvalues.sgml
new file mode 100644
index 0000000000..6c4c29e305
--- /dev/null
+++ b/doc/src/sgml/nullvalues.sgml
@@ -0,0 +1,994 @@
+<sect1 id="nullvalues">
+ <title>Null Values Overview</title>
+
+ <indexterm>
+  <primary>null value</primary>
+ </indexterm>
+
+ <para>
+  This section first introduces the concept of null values and then goes
+  on to explain how different parts of the system behave when provided
+  one or more null value inputs.  Examples throughout this section
+  can be executed so long as the following table and rows are created first.
+ </para>
+
+ <programlisting>
+  CREATE TABLE null_examples (
+    id bigint PRIMARY KEY,
+    value integer NULL
+  );
+  INSERT INTO null_examples
+  VALUES (1, 1), (2, NULL), (3, 4);
+ </programlisting>
+
+ <sect2 id="nullvalues-model">
+  <title>Meaning</title>
+  <para>
+   Generally, a null value is assumed to mean "unknown", but other interpretations
+   are common.  A data model design may state that a null value
+   is to be used to represent "not applicable" - i.e., that a value is not
+   even possible.  The null value also takes on a literal meaning of "not found"
+   when produced as the result of an outer join.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-usage">
+  <title>Usage</title>
+  <para>
+   A null value, like all values, must have a data type, and is valid for all data types.
+  </para>
+  <para>
+   As noted in the <link linkend="sql-syntax-constants-nullvalue">synatx chapter</link>,
+   a null value literal is written using the <literal>NULL</literal> keyword.
+   Its type is the <link linkend="datatype-pseudo">pseudo-type unknown</link>
+   but can be cast to any concrete data type.
+  </para>
+  <para>
+   <programlisting>
+   SELECT
+    NULL AS "Literal Null Value",
+    pg_typeof(null) AS "Type of Null",
+    pg_typeof(NuLl::text) AS "Type of Cast null",
+    cast(null as text) AS "Cast null value";
+   </programlisting>
+   <screen>
+     Literal Null Value | Type of Null | Type of Cast null | Cast null value
+    --------------------+--------------+-------------------+-----------------
+                        | unknown      | text              |
+    (1 row)
+   </screen>
+  </para>
+  <para>
+   <programlisting>
+   SELECT text NULL;
+   </programlisting>
+   <screen>
+   ERROR:  column "text" does not exist
+   LINE 1: select text NUll;
+   </screen>
+  </para>
+  <para>
+   The presence of null values in the system results in three-valued logic.
+   In binary logic every outcome is either true or false.  In
+   three-valued logic unknown, represented using a null value, is
+   also an outcome.  Put a bit more formally, the
+   Law of the Excluded Middle does not hold: i.e.,
+   p OR NOT(p) != true; for all p.
+  </para>
+  <para>
+   Aspects of the system that branch based upon
+   whether a condition variable is true or false must therefore
+   decide how to behave when the condition is a null value.
+   The remaining sub-sections summarize these decisions, as well
+   as other behaviors.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-cardinalrule">
+  <title>Distinctness - Overcoming the Cardinal Rule of Null Values</title>
+  <para>
+   The cardinal rule, a null value is
+   <link linkend="functions-comparison-op-table">
+    neither equal nor unequal
+   </link>
+   to any value, including other null values.
+   <programlisting>
+    SELECT
+     NULL = NULL AS "N = N",
+     NULL != NULL AS "N != N",
+     1 = NULL AS "1 = N",
+     1 != NULL AS "1 != N",
+     1 = 1 AS "1 = 1",
+     1 != 1 AS "1 != 1";
+   </programlisting>
+   <screen>
+     N = N | N != N | 1 = N | 1 != N | 1 = 1 | 1 != 1
+    -------+--------+-------+--------+-------+--------
+           |        |       |        | t     | f
+    (1 row)
+   </screen>
+   However, as with many rules, there are exceptions, which are
+   <link linkend="nullvalues-multielementcomparison">noted below</link>.  Specifically,
+   when the two compared values are part of a larger multi-element value.
+   <programlisting>
+    SELECT
+     array[1,2]=array[1,null] AS "Array Equals";
+   </programlisting>
+   <screen>
+     Array Equals
+    --------------
+     f
+    (1 row)
+   </screen>
+  </para>
+  <para>
+   Because of this SQL specification mandated rule, checking for a null value has an
+   explicit <literal>IS NULL</literal> predicate, and additionally there comparison
+   predicates that consider a null value equal to other null values but unequal
+   to any other value (e.g., <literal>IS DISTINCT</literal>, and <literal>IS TRUE</literal>.)
+   These, and other predicates, are described in
+   <xref linkend="functions-comparison-pred-table"/>
+   <programlisting>
+    SELECT id, value,
+     value IS NULL AS "IS N",
+     value IS DISTINCT FROM id AS "IS D",
+     value != id AS "IS !="
+    FROM null_examples;
+   </programlisting>
+   <screen>
+     id | value | IS N | IS D | IS !=
+    ----+-------+------+------+-------
+      1 |     1 | f    | f    | f
+      2 |       | t    | t    |
+      3 |     4 | f    | t    | t
+    (3 rows)
+   </screen>
+  </para>
+  <para>
+   There is also a cardinal warning: when dealing with
+   <link linkend="rowtypes">composite types</link> in
+   expressions; <literal>composite IS NULL</literal>
+   and <literal>composite IS NOT NUll</literal>
+   are not the opposites of each other in the case where some,
+   but not all, of the composite's fields are null values.
+   (The case where all fields are null is indistinguishable
+   from the composite as a whole being null.)
+   Write <literal>NOT(composite IS NULL)</literal> instead.
+   <programlisting>
+    SELECT
+     c,
+     c IS NULL AS "c IS N",
+     NOT(c IS NULL) AS "NOT c IS N",
+     c IS NOT NULL AS "c IS NOT N",
+     ROW(value, value) IS NULL AS "ROW(v,v) IS N",
+     ROW(value, value) IS NOT NULL AS "ROW(v,v) IS NOT N"
+    FROM null_examples AS c;
+   </programlisting>
+   <screen>
+       c   | c IS N | NOT c IS N | c IS NOT N | ROW(v,v) IS N | ROW(v,v) IS NOT N
+    -------+--------+------------+------------+---------------+-------------------
+     (1,1) | f      | t          | t          | f             | t
+     (2,)  | f      | t          | f          | t             | f
+     (3,4) | f      | t          | t          | f             | t
+    (3 rows)
+   </screen>
+   See the <link linkend="nullvalues-multielement">multi-element
+   testing section</link> below for an explanation.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-operands">
+  <title>Null-Valued Operands</title>
+  <para>
+   As a general expectation, operator invocation expressions where one of inputs
+   is a null value will result in a null-valued output.
+   <programlisting>
+    SELECT
+     1 + null AS "Add",
+     'text' || null AS "Concatenate";
+   </programlisting>
+   <screen>
+     Add | Concatenate
+    -----+-------------
+         |
+    (1 row)
+   </screen>
+   Operators that behave otherwise should document their deviation from this norm.
+  </para>
+  <para>
+   A notable example of this is the <literal>IN</literal> operator, which
+   uses equality, not distinctness, for testing.
+   <programlisting>
+    SELECT
+     1 IN (1, null) AS "In Present",
+     1 IN (2, null) AS "In MIssing",
+     null IN (1, 2) AS "N In Non-N",
+     null IN (null, 2) AS "N In N";
+   </programlisting>
+   <screen>
+     In Present | In Missing | N In Non-N | N In N
+    ------------+------------+------------+--------
+     t          |            |            |
+    (1 row)
+   </screen>
+   This is just an extension of the multi-element testing behavior described
+   <link linkend="nullvalues-multielement">below</link>.
+  </para>
+  <para>
+   Experience shows that <literal>CASE</literal> expressions are also prone
+   to bugs since their format encourages binary logic thinking while a
+   <literal>WHEN</literal> test will not consider a null value to be a match.
+   <programlisting>
+    SELECT id, value,
+     CASE WHEN id = value THEN 'Equal' ELSE 'Not Equal' END AS "Affirm",
+     CASE WHEN id != value THEN 'Not Equal' ELSE 'Equal' END AS "Negate",
+     CASE WHEN value IS NULL THEN 'Null'
+          WHEN id = value THEN 'Equal'
+          ELSE 'Not Equal' END AS "Safe Affirm",
+     CASE WHEN value IS NULL THEN 'Null'
+          WHEN id != value THEN 'Not Equal'
+          ELSE 'Equal' END AS "Safe Negate"
+    FROM null_examples;
+   </programlisting>
+   <screen>
+     id | value |  Affirm   |  Negate   | Safe Affirm | Safe Negate
+    ----+-------+-----------+-----------+-------------+-------------
+      1 |     1 | Equal     | Equal     | Equal       | Equal
+      2 |       | Not Equal | Equal     | Null        | Null
+      3 |     4 | Not Equal | Not Equal | Not Equal   | Not Equal
+    (3 rows)
+   </screen>
+  </para>
+  <para>
+   The boolean operators <literal>AND</literal> and <literal>OR</literal>
+   will ignore the null value input if the other input is sufficient to
+   to determine the outcome.
+   <programlisting>
+    SELECT
+     true OR null AS "T or N",
+     false OR null AS "F or N",
+     true AND null AS "T and N",
+     false AND null AS "F and N";
+   </programlisting>
+   <screen>
+     T or N | F or N | T and N | F and N
+    --------+--------+---------+---------
+     t      |        |         | f
+    (1 row)
+   </screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-domains">
+  <title>Null Values in Domains</title>
+  <para>
+   A domain is a user-defined data type that can have a <literal>NOT NULL</literal> constraint.
+   However, some usages of domains will cause the resultant column to have the domain type but
+   the value will be null.  The common way this happens is by including the domain column's table
+   on the right side of a left join.
+   <programlisting>
+    BEGIN;
+    CREATE DOMAIN domain_example AS integer NOT NULL;
+    CREATE TABLE domain_examples (de_id bigint PRIMARY KEY, de_value domain_example);
+    INSERT INTO domain_examples VALUES (1, 1), (2, 2);
+    SELECT *, pg_typeof(de_value)
+    FROM null_examples AS ne
+    LEFT JOIN domain_examples AS de ON ne.id = de.de_id;
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    CREATE DOMAIN
+    CREATE TABLE
+    INSERT 0 2
+     id | value | de_id | de_value |   pg_typeof
+    ----+-------+-------+----------+----------------
+      1 |     1 |     1 |        1 | domain_example
+      2 |       |     2 |        2 | domain_example
+      3 |     4 |       |          | domain_example
+    (3 rows)
+
+    ROLLBACK
+   </screen>
+   Please see the details in the <link linkend="sql-createdomain-notes">
+   notes on the create domain page</link> for another example, as well as
+   commentary why this non-standard behavior exists.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-multielement">
+  <title>Testing Multi-Element Values with Null Elements</title>
+  <para>
+   Arrays and composite types are multi-element types.  Here we also consider non-empty
+   <link linkend="functions-subquery">subquery results</link>
+   and the list of values specified in the
+   <link linkend="functions-comparisons-in-scalar">IN test</link>.
+  </para>
+  <para>
+   When a test is performed on one of these multi-element values
+   the system will iterate over each element, or pair of elements if the test is
+   <link linkend="row-wise-comparison">comparing two row constructors</link> to each other,
+   left-to-right, combining the results using the boolean operations
+   <link linkend="nullvalues-operands">discussed above</link>. For tests that
+   require an exhaustive search, (e.g., <literal>ALL</literal>, <literal>NOT IN</literal>)
+   the search effectively ends when a false result is found (<literal>AND</literal> combiners).
+   For tests that simply require a true result, (e.g., <literal>ANY</literal>,
+   <literal>IN</literal>) the search effectively ends when a true result is found
+   (<literal>OR</literal> combiners). Therefore:
+   <simplelist>
+    <member>
+     <literal>IN</literal> and <literal>ANY</literal>
+     (<literal>OR</literal>) cannot produce a false result in the presence of null, and
+    </member>
+    <member>
+     <literal>NOT IN</literal> and <literal>ALL</literal>
+     (<literal>AND</literal>) cannot produce a true result in the presence of null.
+    </member>
+   </simplelist>
+   This is because any exhaustive search will produce at least one null value result
+   that cannot be ignored.
+  </para>
+  <para>
+   The SQL specification requires that non-exhaustive
+   (e.g., <literal>IN</literal> and <literal>ANY</literal>) subquery tests
+   return false when there are no rows in the subquery result, and return true
+   for the exhaustive tests (i.e., <literal>ALL</literal>).
+  </para>
+  <para>
+   Note that the <link linkend="nullvalues-cardinalrule">cardinal warning</link>
+   noted above is just the application of this behavior to the
+   <literal>IS NULL</literal> and <literal>IS NOT NULL</literal>
+   tests, which are both exhaustive search tests guaranteed to produce at least one false result
+   when the composite has a mix of null and non-null values.
+  </para>
+  <para>
+   The rules above, in situations where a predicate or a scalar value
+   are being compared to a multi-element value, are discussed
+   <link linkend="nullvalues-multielementpredicates">next</link>.
+   Then the rules when two multi-element values are compared
+   to each other are discussed <link linkend="nullvalues-multielementcomparison">here</link>
+   (including the two row constructor comparison case.)
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-multielementpredicates">
+  <title>Multi-Element Predicates and Scalars</title>
+  <sect3 id="nullvalues-multielementpredicates-composites">
+   <title>Composite Fields</title>
+   <para>
+    When a composite typed valued is created a null value can be assigned to any
+    of its fields (see <xref linkend="rowtypes-constructing"/> for how to do this).
+    So long as at least one field is non-null the composite value
+    as whole exists and an <literal>IS NULL</literal> predicate will return false.
+   </para>
+   <para>
+    Applying the <literal>IS NOT NULL</literal> predicate to a composite value performs
+    checks whether all fields of the composite have non-null values.  This is not the same
+    as a non-null composite value.  Specifically, if the composite value has
+    a null-valued field then both the <literal>IS NOT NULL</literal> predicate and the
+    <literal>IS NULL</literal> predicate will return false.
+    <programlisting>
+     SELECT
+      ROW(1,2) IS NULL AS "Row Is Null",
+      ROW(1,2) IS NOT NULL AS "Row Is Not Null",
+      ROW(1,NULL) IS NULL AS "Row Is Null",
+      ROW(1,NULL) IS NOT NULL AS "Row Is Not Null";
+    </programlisting>
+    <screen>
+      Row Is Null | Row Is Not Null | Row Is Null | Row Is Not Null
+     -------------+-----------------+-------------+-----------------
+      f           | t               | f           | f
+     (1 row)
+    </screen>
+   </para>
+   <para>
+    Please read <xref linkend="composite-type-comparison"/> for a complete treatment
+    on how <productname>PostgreSQL</productname> handles row-wise comparison.  The
+    next two multi-element parts of this section discuss those comparisons in the
+    presence of null-valued fields, and also in terms of the SQL specification.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementpredicates-arrays">
+   <title>Array Elements and IN Bag Members</title>
+   <para>
+    Examples of applying the behavior discussed in <xref linkend="nullvalues-multielement"/>
+    to arrays, and <literal>IN</literal> and <literal>NOT IN</literal> bags, using the
+    operators defined in <xref linkend="functions-comparisons"/>.
+   </para>
+   <para>
+    <programlisting>
+     SELECT
+      1 = ANY(array[1, 1, NULL]) AS "Any-Null-Match",
+      1 = ANY(array[1, 1]) AS "Any-NoNull-Match",
+      1 = ALL(array[1, 1, NULL]) AS "ALL-Null-Match",
+      1 = ALL(array[1, 1]) AS "All-NoNull-Match";
+     SELECT
+      2 = ANY(array[1, 1, NULL]) AS "Any-Null-NoMatch",
+      2 = ANY(array[1, 1]) AS "Any-NoNull-NoMatch",
+      2 = ALL(array[1, 1, NULL]) AS "ALL-Null-NoMatch",
+      2 = ALL(array[1, 1]) AS "All-NoNull-NoMatch";
+     SELECT
+      1 IN (1, 1, NULL) AS "IN-Null-Positive",
+      1 IN (1, 1) AS "IN-NoNull-Positive",
+      1 NOT IN (2, 2, NULL) AS "NotIN-Null-Positive",
+      1 NOT IN (2, 2) AS "NotIN-NoNull-Positive";
+     SELECT
+      2 IN (1, 1, NULL) AS "IN-Null-Negative",
+      2 IN (1, 1) AS "IN-NoNull-Negative",
+      2 NOT IN (2, 2, NULL) AS "NotIN-Null-Negative",
+      2 NOT IN (2, 2) AS "NotIN-NoNull-Negative";
+    </programlisting>
+    <screen>
+      Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+     ----------------+------------------+----------------+------------------
+      t              | t                |                | t
+     (1 row)
+
+      Any-Null-NoMatch | Any-NoNull-NoMatch | ALL-Null-NoMatch | All-NoNull-NoMatch
+     ------------------+--------------------+------------------+--------------------
+                       | f                  | f                | f
+     (1 row)
+
+      IN-Null-Positive | IN-NoNull-Positive | NotIN-Null-Positive | NotIN-NoNull-Positive
+     ------------------+--------------------+---------------------+-----------------------
+      t                | t                  |                     | t
+     (1 row)
+
+      IN-Null-Negative | IN-NoNull-Negative | NotIN-Null-Negative | NotIN-NoNull-Negative
+     ------------------+--------------------+---------------------+-----------------------
+                       | f                  | f                   | f
+     (1 row)
+    </screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementpredicates-subqueries">
+   <title>Single-Column Subquery Rows</title>
+   <para>
+    Examples of applying the behavior discussed in <xref linkend="nullvalues-multielement"/>
+    to subqueries using the operators defined in <xref linkend="functions-subquery"/>.  Note that
+    this section covers the multiple elements being checked are rows, each having one column.  If
+    the column itself is multi-element then the thing being searched for must be a compatible
+    multi-element value, and the corresponding comparison behavior described in
+    <xref linkend="nullvalues-multielementcomparison"/> will also be applied.
+
+   </para>
+   <para>
+    <programlisting>
+     SELECT
+      1 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-Match",
+      1 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-Match",
+      1 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-Match",
+      1 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-Match";
+     SELECT
+      2 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-NoMatch",
+      2 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-NoMatch",
+      2 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-NoMatch",
+      2 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-NoMatch";
+    </programlisting>
+    <screen>
+      Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+     ----------------+------------------+----------------+------------------
+      t              | t                |                | t
+     (1 row)
+
+      Any-Null-NoMatch | Any-NoNull-NoMatch | ALL-Null-NoMatch | All-NoNull-NoMatch
+     ------------------+--------------------+------------------+--------------------
+                       | f                  | f                | f
+     (1 row)
+    </screen>
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-multielementcomparison">
+  <title>Multi-Element Comparisons</title>
+  <para>
+   The <link linkend="nullvalues-multielementpredicates">prior section</link> discussed applying
+   a predicate or a scalar value check element-wise across a multi-element value.
+   This section moves the discussion over to comparing two multi-element values to each other.
+   As both array and composite typed values
+   can be stored within an index, and comparing two values in that context must not produce
+   a null-valued result, considerations are made to adhere to the SQL specification where
+   possible while still making indexes, which the specification is silent on, functional.
+   Specifically, except when comparing two row constructors, null values are considered
+   equal to other null values and greater than all non-null values.
+  </para>
+  <para>
+   There are five pair-wise comparison situations to consider:
+   element-wise when the inputs are arrays, and row-wise when the inputs can be either
+   row constructors or composite typed values.  While these four later combinations seem similar,
+   the fact that row constructors are query literals, while composite typed values can be stored,
+   brings about important differences in how they are treated.  Please read
+   <xref linkend="composite-type-comparison"/> for a fuller treatment of this topic.  Here
+   we briefly recap the five different situations in the presence of null values.
+  </para>
+  <sect3 id="nullvalues-multielementcomparison-array">
+   <title>Element-wise Comparisons</title>
+   <para>
+    First situation, null values within an array compare as equal to each other and greater than all
+    non-null values, regardless of whether the comparison involves
+    <link linkend="sql-syntax-array-constructors">array constructors</link> or array typed values.
+    <programlisting>
+     SELECT
+      array[1,2]=array[1,null] AS "Constructors",
+      s, t,
+      s = t AS "Stored Equality",
+      t &gt; s AS "Stored Ordering"
+     FROM
+     (values (array[1,2])) AS sv (s),
+     (values (array[1,null::integer])) AS st (t);
+    </programlisting>
+    <screen>
+      Constructors |   s   |    t     | Stored Equality | Stored Ordering
+     --------------+-------+----------+-----------------+-----------------
+      f            | {1,2} | {1,NULL} | f               | t
+     (1 row)
+    </screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-rowconstructor">
+   <title>Row-wise Mutual Row Constructor Comparisons</title>
+   <para>
+    In this situation null values produce unknown when compared to all values.
+    <programlisting>
+     SELECT
+      (1,2)=(1,null) AS "NonNull=Null",
+      (1,null::integer)=(1,null) AS "Null=Null";
+    </programlisting>
+    <screen>
+      NonNull=Null | Null=Null
+     --------------+-----------
+                   |
+     (1 row)
+    </screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-composite">
+   <title>Row-wise Composite Involved Comparisons</title>
+   <para>
+    In these three situations null values are considered equal to each other and greater than
+    all non-null value.
+   </para>
+   <programlisting>
+    SELECT s, t,
+     s = t AS "Stored Equals Stored",
+     t &lt; (1,2) AS "Stored LT Constructor",
+     t = (1,null::integer) AS "Stored Equals Constructor"
+    FROM
+     (values (1,2)) AS s,
+     (values (1,null::integer)) AS t;
+   </programlisting>
+   <screen>
+       s   |  t   | Stored Equals Stored | Stored LT Constructor | Stored Equals Constructor
+    -------+------+----------------------+-----------------------+---------------------------
+     (1,2) | (1,) | f                    | f                     | t
+    (1 row)
+   </screen>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-sqlconformance">
+   <title>SQL Specification Conformance</title>
+   <para>
+    The SQL specification requires row-wise comparison to return NULL if the
+    result depends on comparing two NULL values or a NULL and a non-NULL.
+    <productname>PostgreSQL</productname> does this only when comparing the
+    results of two row constructors (as in
+    <xref linkend="row-wise-comparison"/>) or comparing a row constructor
+    to the output of a subquery (as in <xref linkend="functions-subquery"/>).
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-functions">
+  <title>Null-Valued Arguments in Normal Function Calls</title>
+  <para>
+   <link linkend="sql-createfunction">Function specifications</link>
+   have a "strictness" attribute (<literal>pg_proc.proisstrict</literal>) that,
+   when set to "strict" (true) will tell the executor to return a null value for any
+   function call having at least one null-valued input, without executing the
+   function.
+  </para>
+  <para>
+   Most functions, especially single argument functions, are defined with strict because without
+   non-null values to act upon they cannot produce a meaningful result.  However, for multi-argument
+   functions, especially <link linkend="xfunc-sql-variadic-functions">variadic functions</link>
+   like concatenate, null values often are simply ignored.
+   This can be different than the choice made by a binary operator performing the same function,
+   like for concatenating text, but not always, like concatenating an element onto an array.
+   <programlisting>
+    SELECT
+     lower(null::text) AS "Lower",
+     left('text', null) AS "Left",
+     'one' || null AS "|| Text Op",
+     concat('one', null) AS "concat Text Func",
+     array_append(array[1], null) AS "append([], null)",
+     array[1]::integer[] || null::integer AS "[] || null",
+     array[1]::integer[] || null::integer[] AS "[] || null[]";
+   </programlisting>
+   <screen>
+     Lower | Left | || Text Op | concat Text Func | append([], null) | [] || null | [] || null[]
+    -------+------+------------+------------------+------------------+------------+--------------
+           |      |            | one              | {1,NULL}         | {1,NULL}   | {1}
+    (1 row)
+   </screen>
+   In short, please read the documentation for the functions you use if they may receive null inputs
+   to understand how they will behave.  Send a documentation comment pointing out any functions
+   that do not behave strictly but whose actual behavior in the presence of null-valued input
+   is not described or readily inferred.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-aggregates">
+  <title>Null-Valued Arguments in Aggregate and Window Functions</title>
+  <para>
+   When executing an aggregate or window function the state tracking
+   component will remain unchanged even if the underlying processing
+   function returns a null value, whether from being defined strict
+   or it simply returns a null value upon execution.  The aggregation
+   routine will usually ignore the null value and continue processing,
+   as demonstrated in <literal>count(value)</literal> below.
+   <programlisting>
+    SELECT
+     count(*) AS "Count",
+     count(value) AS "Count Value",
+     count(null_examples) AS "Count Composite",
+     count(row(value, value)) AS "Count Row"
+    FROM null_examples;
+   </programlisting>
+   <screen>
+     Count | Count Value | Count Composite | Count Row
+    -------+-------------+-----------------+-----------
+         3 |           2 |               3 |         3
+    (1 row)
+   </screen>
+   Notice the "Count Row" outcome, though.  While we noted in the cardinal warning
+   that a composite whose fields are all null values is indistinguishable from
+   a null value of composite type, the count aggregate does indeed distinguish them,
+   recognizing and counting the non-null composite value produced by the
+   <link linkend="sql-syntax-row-constructors">row constructor</link>
+   <literal>row(null, null)</literal>.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-where">
+  <title>Null Values in Where</title>
+  <para>
+   A <literal>WHERE</literal> clause that evaluates to a null value for a given row will exclude that row.
+   <programlisting>
+    SELECT id, value AS "Equals 1"
+    FROM null_examples
+    WHERE value = 1;
+
+    SELECT id, value AS "Not Equal to 1"
+    FROM null_examples
+    WHERE value != 1;
+   </programlisting>
+   <screen>
+     id | Equals 1
+    ----+----------
+      1 |        1
+    (1 row)
+
+     id | Not Equal to 1
+    ----+----------------
+      3 |              4
+    (1 row)
+   </screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-table-constraints">
+  <title>Null Values in Table Constraints</title>
+  <para>
+   It is possible to define
+   <link linkend="ddl-constraints-check-constraints">check constraint</link>
+   expressions on tables to ensure only values passing those expressions are inserted.
+   While this seems like it would behave the same as a where clause, the choice here,
+   when an expression evaulates to a null value, is to allow the row to be inserted
+   - the same as a true result.
+   <programlisting>
+    BEGIN;
+    ALTER TABLE null_examples ADD CONSTRAINT value_not_1 CHECK (value != 1);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    ERROR:  check constraint "value_not_1" of relation "null_examples" is violated by some row
+    ROLLBACK
+   </screen>
+   <programlisting>
+    BEGIN;
+    ALTER TABLE null_examples ADD CONSTRAINT value_not_10 CHECK (value != 10);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    ALTER TABLE
+    ROLLBACK
+   </screen>
+   We are using a transaction (begin and rollback) and the alter table command to add two
+   constraints to our null_examples table.  The first constraint prohibits rows with a value
+   of 1, which our row with an id of 1 violates.  Prohibiting the value 10 definitely allows
+   rows with ids 1 and 3 to exist, and since we are not told that some row violates our
+   constraint the null value in the row with id 2 is being accepted as well.
+  </para>
+  <para>
+   The <link linkend="ddl-constraints-not-null"><literal>NOT NULL</literal> column constraint</link>
+   produces the same answer as a <literal>column IS NOT NULL</literal> check constraint but is
+   more concise to write.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-grouping">
+  <title>Null Values When Grouping</title>
+  <para>
+   In the context of both <literal>DISTINCT</literal> and <literal>GROUP BY</literal>
+   it is necessary that all inputs resolve to being either equal to or not equal to all
+   other values.  These features use <link linkend="nullvalues-cardinalrule">distinctness</link>
+   instead of simple equality in order to handle a null value like a definite value equal to
+   another null vale and unequal to all other values.
+   <programlisting>
+    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+    SELECT
+     value,
+     count(*) AS "Count"
+    FROM vals
+    GROUP BY value
+    ORDER BY value;
+   </programlisting>
+   <screen>
+     value | Count
+    -------+-------
+         1 |     2
+         2 |     1
+           |     2
+    (3 rows)
+   </screen>
+   <programlisting>
+    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+    SELECT DISTINCT value
+    FROM vals
+    ORDER BY value NULLS FIRST;
+   </programlisting>
+   <screen>
+     value
+    -------
+
+         1
+         2
+    (3 rows)
+   </screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-ordering">
+  <title>Null Values When Ordering</title>
+  <para>
+   In the context of <literal>ORDER BY</literal>, distinctness rules also apply,
+   though this is insufficient since it must be determined whether or not to
+   present null values before or after all non-null values.  To handle
+   this, the <literal>ORDER BY</literal> clause will let you specify either
+   <literal>NULLS FIRST</literal> or <literal>NULLS LAST</literal>.
+   <programlisting>
+    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+    SELECT value FROM vals
+    ORDER BY value DESC NULLS FIRST;
+   </programlisting>
+   <screen>
+     value
+    -------
+
+
+         2
+         1
+         1
+    (5 rows)
+   </screen>
+  </para>
+  <para>
+   Note that when dealing with multi-element values the comparison behavior
+   <link linkend="nullvalues-multielementcomparison">described above</link> applies,
+   if the comparison determination rests upon comparing a null value to a non-null value
+   the multi-element value with the null-valued component will sort greater than the one
+   with a non-null component.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-indexed">
+  <title>Null Values in Indexes</title>
+  <para>
+   The uniqueness and relative ordering rules applied to null values
+   are defined when creating an index.  For the default
+   <literal>NULLS DISTINCT</literal> uniqueness, equality rules are applied.
+   Specifying <literal>NULLS NOT DISTINCT</literal> will result in
+   <literal>IS DISTINCT FROM</literal> rules being applied whereby all null
+   values are equal to each other.  This setting applies to all columns in the index.
+  </para>
+  <para>
+   <programlisting>
+    BEGIN;
+    CREATE UNIQUE INDEX value_nulls_distinct_implicit ON null_examples (value);
+    CREATE UNIQUE INDEX value_nulls_distinct_explicit ON null_examples (value) NULLS DISTINCT;
+    INSERT INTO null_examples VALUES (4, NULL);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    CREATE INDEX
+    CREATE INDEX
+    INSERT 0 1
+    ROLLBACK
+   </screen>
+   <programlisting>
+    BEGIN;
+    CREATE UNIQUE INDEX value_nulls_not_distinct_explicit ON null_examples (value) NULLS NOT DISTINCT;
+    INSERT INTO null_examples VALUES (4, NULL);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    CREATE INDEX
+    ERROR:  duplicate key value violates unique constraint "value_nulls_not_distinct_explicit"
+    DETAIL:  Key (value)=(null) already exists.
+    ROLLBACK
+   </screen>
+  </para>
+  <para>
+   For ordering, each column in the index gets its own specification of
+   direction and null value placement similar to that found in the
+   <literal>ORDER BY</literal> clause.
+  </para>
+  <para>
+   Note that when dealing with multi-element values the comparison behavior
+   <link linkend="nullvalues-multielementcomparison">described above</link> applies,
+   if the comparison determination rests upon comparing a null value to a non-null value
+   the multi-element value with the null-valued component will sort greater than the one
+   with a non-null component.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-partitionkeys">
+  <title>Null Values in Partiton Keys</title>
+  <para>
+   At present this is typically a non-issue as <productname>PostgreSQL</productname>
+   does not support a primary key that does not include partition key columns, and
+   all columns in a primary key are forced to be have not null constraints.
+  </para>
+  <para>
+   However, should you setup a situation where a partition key column can both: have a null value
+   and, null values in that key go to a specific partition, list-based routing will work as expected.
+   There is presently no way to direct rows having null values in partition keys away from the
+   default partition for range and hash partitioning.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-settings">
+  <title>Null-Valued Settings</title>
+  <para>
+   There are none.  During initializion all settings are assigned a non-null value.
+  </para>
+  <para>
+   This is mostly meaningful for <link linkend="runtime-config-custom">custom settings</link>,
+   thus this section focuses on <link linkend="config-setting-sql">SQL interaction</link>.
+   Unlike settings created by extensions, custom settings can only be textual and the default
+   value for text here is the empty string.
+   <programlisting>
+    SHOW example.string;
+    BEGIN;
+    SELECT set_config('example.string', NULL, true);
+    SELECT current_setting('example.string') IS NULL AS "Setting Is Null";
+    ROLLBACK;
+    SHOW example.string;
+    RESET example.string;
+    SHOW example.string;
+   </programlisting>
+   <screen>
+    ERROR:  unrecognized configuration parameter "example.string"
+    BEGIN
+     set_config
+    ------------
+
+    (1 row)
+
+     Setting Is Null
+    -----------------
+     f
+    (1 row)
+
+    ROLLBACK
+     example.string
+    ----------------
+
+    (1 row)
+
+    RESET
+     example.string
+    ----------------
+
+    (1 row)
+   </screen>
+   Notice two important behaviors: first, even though we passed in a null value to
+   to the <literal>set_config</literal> function, the <literal>current_setting</literal>
+   function returned a non-null value, specifically the empty string.  Second, after ROLLBACK the
+   setting is still present (i.e., the error seen before creating the setting no longer appears),
+   and in fact will remain so until the session ends
+   (i.e., RESET does not restore the non-existence state.)
+  </para>
+  <para>
+    The other ways to specify settings do not have a means to specify null values,
+    a specific non-null value is required as part of the specification of the setting.
+   </para>
+ </sect2>
+
+ <sect2 id="nullvalues-json">
+  <title>Null Values in JSON</title>
+  <para>
+   As noted in <xref linkend="json-type-mapping-table"/>, JSON has a null value
+   that does not get exposed at the SQL level.
+   <programlisting>
+    SELECT 'null'::json IS NULL AS "JSON null is NULL";
+   </programlisting>
+   <screen>
+     JSON null is NULL
+    -------------------
+     f
+    (1 row)
+   </screen>
+   Additionally, the SQL operators and functions involving JSON key or array element selection,
+   or construction from literals, require that a number or text value be supplied as an operand
+   and so JSON null values cannot be targeted by those operators and functions.
+   <programlisting>
+    SELECT to_json(null::text);
+   </programlisting>
+   <screen>
+     to_json
+    ---------
+
+    (1 row)
+   </screen>
+   That all said, the system will convert from SQL null values to JSON null values when in a
+   composite type context.
+   <programlisting>
+    SELECT json_build_object('value', value)
+    FROM null_examples;
+   </programlisting>
+   <screen>
+     json_build_object
+    -------------------
+     {"value" : 1}
+     {"value" : null}
+     {"value" : 4}
+    (3 rows)
+   </screen>
+   And vice versa.
+   <programlisting>
+    SELECT *
+    FROM jsonb_to_recordset('[{"value":1},{"value":null},{"value":4}]'::jsonb) AS jtr (value integer);
+   </programlisting>
+   <screen>
+     value
+    -------
+         1
+
+         4
+    (3 rows)
+   </screen>
+  </para>
+  <para>
+   A more versatile way to process JSON is to use jsonpath.  Within this context, as noted in
+   <xref linkend="functions-sqljson-filter-ex-table"/>, the JSON null value is considered equal
+   to other JSON null values.  However, while equaltiy works as expected, ordering is not implemented.
+   <programlisting>
+    SELECT
+     jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ &gt; null)') AS "GT",
+     jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ &lt; null)') AS "LT",
+     jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ &lt;&gt; null)') AS "NE";
+   </programlisting>
+   <screen>
+     GT | LT |    NE
+    ----+----+-----------
+     [] | [] | [1, 2, 3]
+    (1 row)
+   </screen>
+  </para>
+ </sect2>
+</sect1>
diff --git a/doc/src/sgml/ref/create_domain.sgml b/doc/src/sgml/ref/create_domain.sgml
index ce55520348..027a145f2c 100644
--- a/doc/src/sgml/ref/create_domain.sgml
+++ b/doc/src/sgml/ref/create_domain.sgml
@@ -197,9 +197,10 @@ CREATE DOMAIN <replaceable class="parameter">name</replaceable> [ AS ] <replacea
    Domain constraints, particularly <literal>NOT NULL</literal>, are checked when
    converting a value to the domain type.  It is possible for a column that
    is nominally of the domain type to read as null despite there being such
-   a constraint.  For example, this can happen in an outer-join query, if
-   the domain column is on the nullable side of the outer join.  A more
-   subtle example is
+   a constraint.  For example, this can happen in
+   <link linkend="nullvalues-domains">an outer-join query</link>, if
+   the domain column is on the nullable side of the outer join.
+   A more subtle example is
 <programlisting>
 INSERT INTO tab (domcol) VALUES ((SELECT domcol FROM tab WHERE false));
 </programlisting>
diff --git a/doc/src/sgml/syntax.sgml b/doc/src/sgml/syntax.sgml
index 916189a7d6..c41687b224 100644
--- a/doc/src/sgml/syntax.sgml
+++ b/doc/src/sgml/syntax.sgml
@@ -281,9 +281,9 @@ U&amp;"d!0061t!+000061" UESCAPE '!'
    </indexterm>
 
    <para>
-    There are three kinds of <firstterm>implicitly-typed
+    There are four kinds of <firstterm>implicitly-typed
     constants</firstterm> in <productname>PostgreSQL</productname>:
-    strings, bit strings, and numbers.
+    strings, bit strings, numbers, and the null value.
     Constants can also be specified with explicit types, which can
     enable more accurate representation and more efficient handling by
     the system. These alternatives are discussed in the following
@@ -834,6 +834,25 @@ CAST ( '<replaceable>string</replaceable>' AS <replaceable>type</replaceable> )
      usage, as is the function-call syntax.
     </para>
    </sect3>
+
+   <sect3 id="sql-syntax-constants-nullvalue">
+    <title>The Null Value Constant</title>
+    <indexterm>
+     <primary>null value</primary>
+     <secondary>constant</secondary>
+    </indexterm>
+    <para>
+     The null value represents an unknown value and its constant, the keyword <literal>NULL</literal>,
+     when evaluated in an expression, likewise yields a value of <literal>unknown</literal> type.
+     See <xref linkend="nullvalues"/> for an overview of how the system behaves in the presence
+     of a null value in various contexts.
+    </para>
+    <para>
+     Due to the typing of a null value as <literal>unknown</literal> it is often necessary to use
+     a cast, as described in the previous section, to convert it to the specific type needed.
+     However, implicit casting is performed when contextual information is available.
+    </para>
+   </sect3>
   </sect2>
 
   <sect2 id="sql-syntax-operators">
-- 
2.34.1

#46Marcos Pegoraro
marcos@f10.com.br
In reply to: David G. Johnston (#45)
Re: Document NULL

Em ter., 10 de dez. de 2024 às 20:00, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

I got rid of the row counts on the examples.

Cool, I would love to get rid all of them, like I proposed on [1]/messages/by-id/CAB-JLwYaauh-QRjnqN-DLfgZ8xFmy_uyGe545tiuejtiX0-T+Q@mail.gmail.com.

When I finalize the examples I'm probably going to \pset null <NULL>.

Yes, much better than an empty space in the examples, but you need to show
what PSET you did, maybe
<literal>\pset null</literal> meta-command</link> to specify the
textual output of null values
it encounters in query results. To get same results as you are seeing
on this page, do "\pset null <NULL>"

typo in func.sgml
<link linkend="nullvalues">three-valued</link> typed
results (true, false, or null).
should remove that comma, right ?
results (true, false or null).

Would be good to mention on nullvalues-json section that nulls on JSON
values are case sensitive, so NULL or Null won't work

[1]: /messages/by-id/CAB-JLwYaauh-QRjnqN-DLfgZ8xFmy_uyGe545tiuejtiX0-T+Q@mail.gmail.com
/messages/by-id/CAB-JLwYaauh-QRjnqN-DLfgZ8xFmy_uyGe545tiuejtiX0-T+Q@mail.gmail.com

regards
Marcos

#47Marcos Pegoraro
marcos@f10.com.br
In reply to: Marcos Pegoraro (#46)
Re: Document NULL

Em ter., 10 de dez. de 2024 às 20:00, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

Section nullvalues-filtering you are showing filtering with equal and not
equal. Wouldn't it be better if you show just one of them and the other
using DISTINCT FROM, which would get different results ?

regards
Marcos

#48David G. Johnston
david.g.johnston@gmail.com
In reply to: Marcos Pegoraro (#47)
Re: Document NULL

On Wed, Dec 11, 2024 at 11:46 AM Marcos Pegoraro <marcos@f10.com.br> wrote:

Em ter., 10 de dez. de 2024 às 20:00, David G. Johnston <

david.g.johnston@gmail.com> escreveu:

Section nullvalues-filtering you are showing filtering with equal and not
equal. Wouldn't it be better if you show just one of them and the other
using DISTINCT FROM, which would get different results ?

I'm demonstrating the sentence written there -

A WHERE clause that evaluates to a null value for a given row will exclude
that row.

While I can do that with a single example my intent here was to also
show that if one writes seemingly mutually exclusive expressions in a where
clause it is possible neither expression will find a row, in this case with
id=2. "p OR !p" again. I'll give this some more thought though.

In any case I do need to add a few more words framing up the examples.
Probably pointing back to the cardinal rule sub-section.

David J.

#49David G. Johnston
david.g.johnston@gmail.com
In reply to: Marcos Pegoraro (#46)
Re: Document NULL

On Wed, Dec 11, 2024 at 8:09 AM Marcos Pegoraro <marcos@f10.com.br> wrote:

Em ter., 10 de dez. de 2024 às 20:00, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

When I finalize the examples I'm probably going to \pset null <NULL>.

Yes, much better than an empty space in the examples, but you need to show
what PSET you did, maybe
<literal>\pset null</literal> meta-command</link> to specify the
textual output of null values
it encounters in query results. To get same results as you are seeing
on this page, do "\pset null <NULL>"

Yes, I will be doing this in some form. My indecision at the moment is
that this ideally belongs in the preamble material for the section but
wants the reader to have seen the usage output sub-section.

typo in func.sgml
<link linkend="nullvalues">three-valued</link> typed
results (true, false, or null).
should remove that comma, right ?
results (true, false or null).

I include the Oxford commas unless I'm forbidden to. There isn't any
forbiddance here that I am aware of. But now I'm questioning whether it
should read "true, false, and null" instead of "true, false, or
null"...though I'm confident that any of the four options is going to be
understood by the reader and this is basically purely stylistic in an area
we haven't codified. Any specific arguments or prior-art to consider for
choosing one over the others?

Would be good to mention on nullvalues-json section that nulls on JSON
values are case sensitive, so NULL or Null won't work

[1] -
/messages/by-id/CAB-JLwYaauh-QRjnqN-DLfgZ8xFmy_uyGe545tiuejtiX0-T+Q@mail.gmail.com

Agreed.

David J.

#50jian he
jian.universality@gmail.com
In reply to: David G. Johnston (#45)
1 attachment(s)
Re: Document NULL

On Wed, Dec 11, 2024 at 7:00 AM David G. Johnston
<david.g.johnston@gmail.com> wrote:

v5 Attached, v5-0001 is just v4-0001 rebased; v5-0002 is the rework over v4-0001. There is no formatting-only patch this round.

Wiki tracker: https://wiki.postgresql.org/wiki/Documenting_NULL#ToDo_Note

please see attached png file.
As you can see, many of the <screen> </screen> are not fully
left-aligned, and also have an extra empty new line.

[1]: https://www.oreilly.com/openbook/docbook/book/screen.html
linebreaks within this element are significant.
Screens are usually displayed in a fixed width font."
also see [2]https://www.oreilly.com/openbook/docbook/book/programlisting.html for programlisting

space is scarce, i think empty new lines are not good. to avoid extra
empty new line,
in doc/src/sgml/nullvalues.sgml
all the <programlisting> </programlisting>, <screen>, </screen>
should be completely left-aligned.
----------------------------------------------------------------------------

+  <para>
+   As a general expectation, operator invocation expressions where
one of inputs
+   is a null value will result in a null-valued output.

I think the following description is more simple and concise.
+Typically, when one of the inputs in an operator invocation
expression is a null value, the output is expected to also be null.

+    The <link linkend="sql-copy"><command>COPY ... TO</command></link> command,
+    including its psql counter-part meta-command
+    <link linkend="app-psql-meta-commands-copy"><command>\copy</command></link>,
+    has the <literal>NULL</literal> option (and some modifier
options) to specify
+    the string to print to the output for null values it encounters
in the query result.
+    As with input file processing, for the CSV format it will, by default,
+    produce an unquoted empty string for the null value.
+   </para>

I think the following make more sense:

+   The <link linkend="sql-copy"><command>COPY ... TO</command></link>
command and
+   <application>psql</application> meta-command
+   <link linkend="app-psql-meta-commands-copy"><command>\copy</command></link>,
+  has the <literal>NULL</literal> option to specify
+  the string that represents a null value. The default is
+  <literal>\N</literal> (backslash-N) in text format, and an unquoted empty
+  string in <literal>CSV</literal> format.
+   </para>

also psql should decorated as <application>psql</application>
----------------------------------------------------------------------------

+   It is possible to define
+   <link linkend="ddl-constraints-check-constraints">check constraint</link>
+   expressions on tables to ensure only values passing those
expressions are inserted.
+   While this seems like it would behave the same as a where clause,
the choice here,
+   when an expression evaulates to a null value, is to allow the row
to be inserted
+   - the same as a true result.

i think in ddl.sgml,
we already have """
It should be noted that a check constraint is satisfied if the
check expression evaluates to true or the null value.
"""
it is more concise, IMO, we can just try to copy it here.

[1]: https://www.oreilly.com/openbook/docbook/book/screen.html
[2]: https://www.oreilly.com/openbook/docbook/book/programlisting.html

Attachments:

image.pngimage/png; name=image.pngDownload
�PNG


IHDR
���sBIT|d� IDATx^�������Wz/R��tQ�fo`��5�Fc�-��h4&����h�������T)��A����M27�;�{w�������<����3�|f�������V��Q@@@@@@@@@@@@@��@��I� � � � � � � � � � � � � �x��# � � � � � � � � � � � � �dL� ���R1 � � � � � � � � � � � � �Al� � � � � � � � � � � � � � �-c�T� � � � � � � � � � � � � @� � � � � � � � � � � � � �@�b�-#� � � � � � � � � � � � ���>� � � � � � � � � � � � � �1��2FK� � � � � � � � � � � � � ��� � � � � � � � � � � � � �dL� ���R1 � � � � � � � � � � � � �Al� � � � � � � � � � � � � � �-c�T� � � � � � � � � � � � � @� � � � � � � � � � � � � �@�b�-#� � � � � � � � � � � � ���>� � � � � � � � � � � � � �1��2FK� � � � � � � � � � � � � ��� � � � � � � � � � � � � �dL� ���R1 � � � � � � � � � � � � �@%@����cg�S�O�Uk7X�=�U'��^�ZdbU����j3����CW�`}��.�+�N�����	s�V�����z�6i������A{��������3�������6EQ���3�S�F� � � � � � � � � � � �����@�.���5v��#m���l���6{��v�co������.*D@@@@@@@@@@@�� [noZ!�h�Z;���Jd���O���5-Q��UP`g/�1�,�o\6�����
?o��;vZ���m�u�K��6�G[���U����y��`����o���+~�
����[�[�*��Q����y;�kk;�WG�U�J���m��6���Kl��e6g�j[�q������l�n5�U�:5�Y�f
�k�&v�~�e�zi[wI*Z��Ov��N��j���������VM�[����O�V��yC�m���(�3�\���!U���_�����e�e�z�#{g��@����n�n;�������	a��I��MgZ��y���_�����^Te=����R���x�s{~���z{ula�_sR���Q@@@@@@@@@@(;���m��-]�qsNlsAj�>���p��^�)���>5�e�������
���9����2t�tL�|�B��;��Xae�(R�,��d�|S@�'��S��H����+�p���y�sWLt������e�������7�Z��m����L0[�e��-�v�������.Po��o�YZ4�k'�������\���������������u��C�����=,+����pA�����q���j�7k��w�[q�D?�jn`���t
Lc � � � � � � � � � � ��O���
y%��Z�Z����u�������
`k�2���7�a�zw|��%���e5�����j�/^[�
�%���F����i;v�
��X����d7��}���W���xl�*�r�";����4�,ef���t�B'����;nv�iwqz`���n���U�����:�����/��)��gx-�Y}�J��}�:���[$1a����j���9+���Op=IT�, � � � � � � � � � � �@�b�81+H������,8/}2���k�-Z���]������l�*f/�3n�>sY��[�~���x���.X��O�����A�LPV�k{��Z�`����?�l�>=�nv�mw���c�V��=w��v�/��+����/=����c3���<��F����'i
`-�>��:����6z�S&������1rYe��]�jq�c@@@@@@@@@@@ ��2�V�@���db;����}��I��y��I��h�+0�� ��Y��hg{�kj
����v�%����������T{���M�
��|��e^S����=}������F�jY�jU�,>�O_h�������7�s����Y%-����\l3�*�J&tmm�jk{6k`�kV����k���e�z�����zE���w��>���r����!&_�(�����L����?�Ws�E�=��
`��y����AVa7	��R�rE�)_�,?�Y��G{����W��/?��������;D����l�1.���=�L���� �����(��	 � � � � � � � � � � �@)	�VJ��6u�� ��}�x�b�.
8����������^��[���.�����n�*F'9��>?����������E5WY��v�L����8���l������3������S�a�8f����b�	����%v���6�E�����%��R�
������x��v�Q���~��~������lw������VF�����~�jur(�P�=������.���&�f��d�|{l�X�|H�DU�Yx��	v���E�~���2��3�����Q�1in�Al
�U6��R�&�wA�@@@@@@@@@@@ W�#mr���'�v����2��V�^��=p����~m;z�N6������z���)����z{��b��9Kc'����<��vkm�[5�o>��>e@h�����r�w}��<�;����KCi���=�2����_x�zal���U���v���5�=�jW�J���������R��7���_����{���w���>�Y��ib�jE�n����|��l6#o���Dl�l�S s*��I�f?d��E�b � � � � � � � � � � �E2�e�U�L`��`[��5JVi	�V�K<�j�����m��%Qk�n�O%l���Xa7����^0]lF�x+Q��G����X�����dM����XJ�����TJ+������D���e[*��������{.lW>���*�_�����7������R{��Yo#&~k�\f�+~��6m���U���o�=��#{u�.�'U�2�
����y������Q�.t���t;s���q�m������>�N��p������.���{/*�g���v���F���v����,�ly��q����f���������/l]f/��_�����{�����������y��������^��k���7��LL�^���z��#��?k��?a��;t��v�v����Y������YR�����Q�����������E�a�&�m�����T�����uH��;v��Q.{cl9�Or�j��l�7�m���m��5^p�����$�;���{m���y����SKS�u&J.���9���6m�
[�j��P��n���nm��o�wniG�c@���[kLV����Uc�&W���;M��:��4��4F�qA�{���*���@@@@@@@@@@��Al�}����fb�����~�����@�nOg�V%�C�I������T�X1$3U�z�	�K�-��_��N=��
55��I�.�o�2e�*��s�'�����?~N �G��s�Sp�s}�e����C�E��EU����.H��hRp���k����8Y��������E����,��tN��
��-
�W����;_��[~��g�?}��w�y�FY�4�e�l���s~{�L/�&����g.��M������������2�eVK6�m��%���F{�:�����.�w��3l�����x��/g�q��O�[�f
����H:6^��6�[�w�K�l������e�����?���9�N����/���/f,�^�<*P1r%
��?g��}��I�16�Og������:�d � � � � � � � � � �eT�Bm7��C��@u�8A3����=�[���,�Y�V��(�vmr��������������������UTQ���`������2�����LY�R-K\������^�EX��,���L�a��>�8'�f*���Y*��G��l��s��~u���l�mR@��O~h���l�����e�S���C������
�"���]B�������L�]2Eo�E�4+$H�����������b����~|�������>.��4n�w���laR�;���P[����Y
�����z���l�������7eF� � � � � � � � � � � P�b+�[���MA����>S����������i�����N
K5�\:�����m�N�'���kU���{%�g���m@���j���00-r�����������+�T�Z�:�h���n
�����m��K�,^��>��
�kX�F*���1m���
Z�W�!Y����o��d�O)�?8����Jy�e���pe*��x���
bk���]pT�@}������[����(b��l��v����%>��F����R[��/Q2���������7Mo��^�������g��[GY�������O��W���]Z7�6M�[���L��V��+~3n������~��0�(���;����v�ln���%�C��i � � � � � � � � � ��9����e�48~v�z�?��rYQ~��wm��m��M�y��
��V��5�k�\������*V�-g�F~5/����
L����!�J�M����������G(�E��d�%��:�K+5y~�:(�e��V%84+�
�z�$Y��i��:���gav77���������:���o{�#{��3fn�����g��9���V�h�[5v�5\@�N[����i�(��S�F� �h�NN�W�*���B2Sw`��r������l��M��+�����1Wr����s����]�!/�c[�������^�x�Y����'���g�ft�	I	����X�*j^��e%��i����1&c�|��((��#���^��4���u����Z��
������L�:����an8��}�&�?[�v�7�������N�o��_�l�aL����>�
Z�����g��60����@�J,^�����ZG?+�n��C?�4��|���>	�
��	 � � � � � � � � � ��q�`�D��/��Y��K[�\h��|~Z���v��`���~{�;t�=Kg���^�"�����}��M�o��X�	����k����HT����[��M_���rm���
x����V�*�jB�������h��^�Xly{������~-{����aLVBe�Q�����n���r��l,6�esJ�x�8�l�&t�	� �S%���;�KT��������������R}�����l�)8�����n��j�y����^���:���c]�_�d�8���,���m���>�.����5(p����_
�?�k����������`M�������(���pAO�����c'��}�A=����:�w�����O�e��;�A��Y���>�Y\v���4�w�;�uq���w
����������{yV�eV�y]����#��������m���7o�y����s[ � � � � � � � � � � !P
��������LG��el�w��Q�e�]a1Tv�{_X��������*����,����};4�H�t���G�t��v�MO���
�G\�Ad�k�8��=w���i�����*m����.RXy�eG�-��yH �-r�)(%��=6�;O����7�\F.w�3�M�Qf�J�OG���b��@����J���l���0#3X�m
(���A���vkO6�0��%�{��]Q�T�:��c���M�e���N��b
(�r��-����s�����1r~6mA`�G���6�z��	�"�99$bl�u�:ru�2����mT��v��G�����!��C��ZN�IY�b��-�r��v�������s�f��L@@@@@@@@@@@�<
��/���Oe^��f�U�@������o�-5�;����Z��6M���.����_��w���Z}eg}�iK�I�z�� �kNh���K���%Qv�Rmh	V^3NV��lAZ��
k������^{�-���dujDS(����h�5)���K��1��,��G�jV�!}�hRt�Id�
�����z���50-[~��[���)��r���5KF>���k#��c��m;v��/~����k�a�F$����9On��41e�Lw�q������a:��b5y^����������$8aV�8o��b���;!���y�@@@@@@@@@@�| �-��v�k�
��?�o'��j�]�����n9�p{�����N��\��'�;��x��v��]�F��~����D�����K<�f� &kT�*���_J�	&�
����~it`7��^-�L����6�}�~f��������es�YYWl�1���[��vY�$��cr�������G-�`�?l�o�)�e{4����L?��`�YX�#eg-�u1��nl��5�'~

��tu`�G���6�[��^�f�����Mm�����f�w���d�
����qAT
�,
.�����GL��W3U��-n����u�������^[$�����[����4]��%������ic��o@@@@@@@@@@�A �	�|�1},����
�%*=�7���:����������fW��0���xp�j���+�o�L IDAT��p�u���#�}�`�M`�L��p�]��w,6`���{x~�R��Yo/~<�^�d��yXO�bH�R�K��2���H�g~L6M[����!���z�������7��6��}��MN�����x��~p���l���M�A�Nfi;>$������c3ei��]pZ2e���:����v9�_7{g�,�2yTSP��m��Lm�pJ�
��w;����sW�}���<p���6m�fcf,��&�#���T�G�3�u-Z��4����[�'�1� ���)�dp��n��-���vaA����oG�+���1��H�n�<5%j��gs����{���w���.����Z�� � � � � � � � � � �@>
���[=�\�Vu���A���_��s�1����6Q&�L��_~c��<:��kOh�g!0(�b7a���������.�!��=��vP�"i���~-�����un���\�f�&[�+&�Zb#\��F\�e�za�d�=�'�����<��l��%��V�*��+C��)�K��[�l��������q����Y�
��1.���}U��.�����5m��gFM�5�r��v���B��
�
������T2�5k�\Pa`Ei�����s����bTp�2$>4�����
�X��S�'pt�NQAl��#�q-6�m���}>����2�`��n�y�e!U@ul=�ky�ZJ�����h�-:g)�Pc�_t�q��{�;��e�[�z�=��������,|����};$�M���d9@@@@@@@@@@rM�B�5�� �.�J*��'�T���}�&0=���r��������N�kg�3vrV�V�ox�6�p��6v����z(?+
r+Q�Q���l�f
�����>�>��B���������o�����g���B�o��n`����Y�3�0��`$U�Y�rv������b�Q�A*���ZEf��,~C���c��wX�D�g��v{�n��o`
��2���Ub%;�o����Y�����Dd#�g����y���9��h�9����y��lJ�!1)�3Xp����
��l;b�q���k�}��\���
�_��j �>��|� � � � � � � � � � �@9 ��lD�_�G�=�v���V�����	
���s#U^z�����{�gc����l{��{.l��+E�S��w���U�I���3��	S���T�n�{����]�IY��`�lN)$�,^�.�q.,�����mfV��1-V!"SS��E|P%K����E�\8��5o���>�;��Sf��
�Rf��P4����}������8?sITwT�l^E���w�U��e��	f"k����}���8{�����;.�w��e���!!�Z_�>Oe�����N
���c<Se�Kt^�9���{���FA@@@@@@@@@@ *�C'�c�
���Y�z���2��f�g���G��;m��QJ�f,Ze�?��m���Jc����,��J��5.&�c���^���.X�,��3���K����Z��P}���J+�_l����q}��LpY>�0�:�l�M�y�v�b�������[�mF6���~��TJlv�T�����*W���<��|����������+����M�h��V\Y���~g�����d:gD�O&�������}]��"����F��E6���S-,��.����H8��CE�/[3��Tt��������Ed��E��5�����_e��:��rA��>���&T����vY�.>�O��C� � � � � � � � � � ���@�R��BoiC^
l�	�B�$��5t��@�<n>��R`��`�]�@0�����_.<:a Cq������5�2�I/l���6e�rSf����xaE�����g�]_��>��(�$�|����??����a*�>��)X%^��_X��-�v��M[�5+0}����
,��	}��6���'��`�V��&W�Rt@U���'�}?�c���}�@�E�~����.b����6a��o��uoc�����q���c,PQ&djh\�f�����v�]�48����^�����qc��m��M���@@@@@@@@@@�r%@[���t&V@�V�<��{��YK���O�{�~U�k�������[��/N��.��n��N=���r��V!,�WqV��e�f���v'�����}sL`n��c`�&��c�����W���	ujT���n�e0Z�����2?�Md&*��k�����;�i���������?$=o6g�����V�*Q���z���x���
�p��;F�������}T&�k(S6���1b���^v�	��D}��C������iH���[�E�Y_*�dsh6~�@�l���}���n:��:�`�;v�rc���t& � � � � � � � � � � P�b+O[��>�4�Y�V�ha�Na��#���^�,j�J+���PH���:��ev���m���Q���~v��[Y��2��P�&!��Bg���s�)�0�{@kX�F�d��^�[�O_���~�.0�<L8�o0(M��1���Q]�����iZ?a������C��v����,r�#&�\���7P/�|��������
�z������9V=�Ll�B2a.Z�6P��/gDo��y�����D����f.�9K�d�;��j_+�l��#4�E������M�6|�-j��|��}`�N�������
Riq�U0�9G���`]
 � � � � � � � � � ��Y��'��s��[���y[�m]�q�������������W���U�l��o�`U���D{��/�fS����g���������
��T�&��5?�\�2
.���o��m�������!��\>��m��	�(3��M,��q=�_�z`�&l���,1(�Z@�v�����F��N
�]��.>���tB������wd������LY������Q��Q]�8g�M[�"�U0,�-�����,���Y���`6��6�dj�������{Y�6MmR���m�����b&4�_+0��S��bg�1��|�������50��,�,�I�_l������w���L���������??����tO��>p�>�YG06tT�s�[5����30�	 � � � � � � � � � ��'�����,�}|���@�y���T/5�e�ek��?����i��{�~j'������v�;�O���+����w��c.�Vd���=|��v`��q�K�������oz��{�]��?����g��V1��]��[�,<W�2�.�;�r�|�J����K��{��5�g�Y�v��{���*�{`��I��s���!|�.h�����������:o6'*x���3����d�}��n8���Y�����~�f:u�������3�w�X^=-�o����lE��Do�V2�)H�H��*��
���3�)���x�6���x���������8'�k��t��V��nQ�Y�l�	��\����-�N���xE��W?��7(6^��2=6��,~:mAT����m=�7K���B2V~<9~f@�>�c��B&�l�{4�mG�'r}U&�d��'��M���|��-Z�\6AU0i��@=��	Lc � � � � � � � � � ��I�Ry�})�����������}�7�N�Y��u�N�jV�bS��e��e�R�]!��������<j�����,
�P��'�;%����kO�710}��-����y�R-�2Sp���"3�msAQ���g6�Og���"��y�n
��,��7��.[���R-
&R�_Rm��7��o����iR�zuna��7�6M�[�Z��f�*�>m�y�-\��MpY�F��s�Y��~e�:#N��o�d�R���>�L�$Se��%V��~����?�`���6���+l�����(3^2�X
�R��_U��.��26�}�>��s+k�W\����a�VX���^����@�	.pB����d�����l�.QY�����Y���jU��6jz6�����>��0j�
�=�U���/�w�����l�����L�S&��x� ��G3$&��;�2T����[���/+���;Y37�kX�����/t�C3�89SiWi��k��1&�	
��,G��V�v�������O�E�>t��Y���{�~����]��k���;?d#�M
��>p����K7Ff�S����]��;y�^^�`m�SE��������q\�V�Z4��wl9?������h�]gti�$0>��a�=3b���:L�,�@@@@@@@@@@��@nG1�gy�Vle���w��J������9,�2���ae��`��)����iye������ 6=D�����@$(8�/z������;w���e�K6�]��z�?2�-�6���h�Z���e����cL�����
��|7=�Al���P�)�+U���~��4�{R�+�]
�_����Y��}��:������[�'Uo�������5����~F�%[����z
`�
�RvAez�W�����M��o���~�q�����fIL�=��������gn�"������/��i��`�x�H�����'���-����R)C�����V_������ev�������(��P�����TV�������i��z�]�2���#��*��lp���@�d;������{�YB��ukV�
*��*�>�(��u�za1
@@@@@@@@@@�r#���A��Kt��@o����kN�:������~�a�m�:���}�=t	&��U�=P�z'�]Vx8?A���(�6{%1*���W
��.�'^��v����l���8Q��O]Z�l~���NY;�l?��2��6�o��5^7]N-�y.�{������e��lW�e�Su��z�v�!{��o�|����;��7�fP�����J.��_e'�f�J��\�W�aG-��/r���_�'tV�)v��^�����K��2�e�d{P0�#W������������������������)(�����&>@@@@@@@@@@@���V^�d9��/������x�o���9������(�J��M,,����{&Z,��)K�][��U���3�yB�m������Z�)�\@�n�����l�{`�v�U�vA��th�^*��>�����x/�s�F�j�26=s��v���V/A0FX���5�OgS6��P������ae�]�x���O�������RTi��,�O(���n_��ZT5Y�\����_I��}�������mR�(K�cW�C���:��IjE�8���)P/��'~�[�������K\��x�F.�1�������f��e�����R�@�N-��?�k'���e]K��w����Vz��#�cWc�yG�g������^���4@@@@@@@@@@��@��d(��1�����.re&�]n�,�����.���
���S�w�t�9�]�Z5k���uu�#vm�RP���A��a_�7�WY��U�8pq�L6�pD���H����l�7���������]}��l�>t=�����z��i�M���f:������m����l����j�J^�a�u�c����;�[��AL�
;��}�}����l�����Uc���~��m��{�buk����iZ�z�����)�.E�����c�M[h�f.�9KW��5?����\N��������lW�\@����P�HY):&���}0aN����%0-�	�����`=}���������l����f�&��2=)����W[S?��LE�G���m�����J����3�����(�������8�:�}��\����2Z�����8j�2vi���{�A=�b�i��Us�wd�R�H���!�o���1[�O�����"/�� ���Y6��GV��w����8��k�<�}����
��K�N-����c/v%��4��+�e'��QS������z�F���C*8�zc�������]ZZ��-�R�� ��^x��������E�:�;/�����}�Uq�������������uoS����x�, � � � � � � � � � ��)���)(��n@@@@@@@@@@@@@��+�R�����!� � � � � � � � � � � � �dQ� �,b�*@@@@@@@@@@@@@ �b��-N@@@@@@@@@@@@@�,
��ElV� � � � � � � � � � � � ���Al����/ � � � � � � � � � � � � �E������@@@@@@@@@@@@@�| �-��8�E@@@@@@@@@@@@�(@[�Y � � � � � � � � � � � � �o����� � � � � � � � � � � � � �@b�"6�B@@@@@@@@@@@@�M� �|���@@@@@@@@@@@@��AlY�fU � � � � � � � � � � � � �@�	��o[��"� � � � � � � � � � � � �Y �-���
@@@@@@@@@@@@�7���m��_@@@@@@@@@@@@@ ��e�U!� � � � � � � � � � � � ��&@[�mq�� � � � � � � � � � � � �dQ� �,b�*@@@@@@@@@@@@@ �b��-N@@@@@@@@@@@@@�,
��ElV� � � � � � � � � � � � ���Al����/ � � � � � � � � � � � � �E������@@@@@@@@@�,�M IDAT@@@@�| �-��8�E@@@@@@@@@@@@�(@[�Y � � � � � � � � � � � � �o����� � � � � � � � � � � � � �@b�"6�B@@@@@@@@@@@@�M� �|���@@@@@@@@@@@@��AlY�fU � � � � � � � � � � � � �@�	��o[��"� � � � � � � � � � � � �Y �-���
@@@@@@@@@@@@�7���m��_@@@@@@@@@@@@@ ��e�U!� � � � � � � � � � � � ��&@[�mq�� � � � � � � � � � � � �dQ� �,b�*@@@@@@@@@@@@@ �b��-N@@@@@@@@@@@@@�,
��ElV� � � � � � � � � � � � ���Al����/ � � � � � � � � � � � � �E������@@@@@@@@@@@@@�| �-��8�E@@@@@@@@@@@@�(@[�Y � � � � � � � � � � � � �o����� � � � � � � � � � � � � �@b�"6�B��	�_�����.����5n���U�f�Z��C9�������]�� � � � � � � � � � �@N	��;����������W�j��e:t�O<���Sm�1 ��-@[~oz�@�f��e�����x��6a�[�z�m����.]j�G���?���u�t�3f�n�������hu���`�&~���m�2eJ�j��/P�R%o_�[Jf"���>8m++��.m��P����s�\x��G
�s���?�B�h	�9W&3O������If���t�)��#G�,�����
4l��p?��cG��	]0f"��(��y��������(�*�^��{8��O�W�f�gn���l��u!�dH�k��R- PJ��G6�"��ds������4����y~�lo�\k}i�:l�0�y�����f��iJP�i�&�7o�����6{��\#�= �y,@[o���u�Gx?8)�����ke�����g�}����o{���-Y�$n;�o�ng�y�-\���GY�.��2�C����o��lg�qF����O ��%�d�1 � � P�6l�X�����;�,��@����*! �[@/��s�=�i��6b��b����w�8/��z��o��I����!����9�qhZF���2�2����*�
(��cZ7j���}��T�x�e+W�l��]T���m
ZSQ&��������?z�;u�d��zjH�O������V�X�F��xf>-��9�p-]fw�@�b+1! P~��n�:�6m�=��q;������S����icz���js����c�=f����.~)�'��7�x���}�Y�5.�-��2�U�PJ_ ����[��������^��`� �@�cT(@@ ������}/N��"�7�x������q�����m����d@�l��{QeC�V��}������U�L�&) �����>3+I��=�\y����������~���q8|���x��j�k��T�''�
�fK�������z�j�<�����7�h�z��n�M���������=�{�]wy��=��S^6�t�/��w�}��m��v��e��{�����	ZQ�?J��`Y�(���k�����^�'P)}UQ�8���^Y�����7�g�"�R�J�������~�;k��Q�y� ��~�i����f�l8p���j\�[3z�h����������;/��S]���/�������'��������n���tVM] �@��JLH ����8�&��?�Z�j������t��B�}��@ ������G���@������qHN`����o�[���?.|O��(�G�R�~�x1=����<��t��r�y��R�l�\Nt�0�$z���t9����T�'g�$%�}����2��5k��K.����-7�tSZ�MW%����y��^��D%���f�����A��w�}�=W��	R�?��>?+���k�\�#h� �-;��%�z�%�
n���o-[���/�8�
-ZT���w>>�=�#F�^�2��|�k��Zm��KZW�be�Q|��E~�O�ZfG�"��F*A@ o�6����:��2�N9��2e�wo(����+bF@ G������E��}�����3fx�9db+���Z��^H����;��9s�yy�����=0L�i��@��\����F/��5k��TZ�Gq�����
��i���K�]O�����D5���n�:o�����V�Z�$���,�/�VV�N���k��z�s�1�g���k�.�k�=z$\Gy�0���e���9�p-]����@�bK�%5!P��;�8�����,��
5;�����U�l���9���7#WnZg��ec
��/������g� P�cTQB|� ��}�����+i������&=?3"��.P�E��!���@���;t�`_~�%| �Y���>�@�*(S�^�e�s\�eJ�zs]��[n1���O�4MS����^SSI��_���U�����wo��m��g����Y�S/R��y���d��-����mGu������{�������YE�\wfJ�4���3�U������M�� �k[�n-lR�
#��}����_����x���z������U��Lf���>� �+I�v�����<��1*r��T��@��l���^{���T�#�pM�#�f �y&P�������� �����g�nb��@\��K����S������X���?���8Q���+�b���g.�ORy������Gi;v�z������J����J���;kE��/@�I�������������n��^�z�����{.��;��]Vg�u��k���W���
���}���7Uf��Q��Q�F�>f������5jx���ic'�|��PR*o�N��SN9�p��G�.�U�o���]r�%��u��l^-[�,\F�M�6M��"?�:u���
��m����W96o�������G��#���fX�h��t�M��>�����nU�V5�|?��l��a�Ad�|���a��G�_����^{yo��\����W�K�|�����)SB{�m�7�t��������y���?Fm7���7o^h=��-��z�����sO/�t�*U�Q�F��_?���[m����w������Ym�[��U�T�[o��������G}4�N�z�G�1�t�~�"���O$l������2�z�~�����~�}��w	��?l���������p��~��3S�����JT��}V{j��������q��SO�����j�?���_���������������'����������ey��B�~4����+����o�J}�qq����V[�gs�g���We������9����t�];�2r�H;����mU�fM���Xp�����9s���$�k��p��w�a������7�p�]q���M:�c;v�0Y�������7i���_�k������}/?�����?2~��'v��'Z���M7���E]�Y7~�|�I�U�5n�-�vj��Y��.��������s�~���Ue�:d���������s��Y]oi����������{}�vX�zu�Y���&M�:�5�'*|�n��E���ctP�t��<��r�!�}Q�z��m7�x�-Y�$����,]c�V���Z������tM��������]Oj<������w�ik��M�jK�XU�����5�
:�N;�4o��yYc��#5���x���������5��p�Bo��o����m]�q������7�Y2uN����^u�UI59r��WV
��-�ka�_w�u��L��B�a-�}_?4���|�������=����u�������c�-\��/�Hj�����W2m�4�w�>}
�u�&U?=�P���7�|�T���I/^y�����.���u�������.��b��.��c��	���$��8�+W�4}�o��UT������jF��k��>8�9��w&�)�u������������]v�u���j���]�^��&���t�w(�uz��o������~�>�k]��zY�Do�UI���L��s����V5�o�[�2w�qGR����o�����w��6�F�^������D%��������W_Z�{kQ%�V��-[�$\D�����}>^�<*?���w?A�������G�/��U��UTa�gk��\���o��_��O��~�������.�xE��}{�)���W��|�/���D�$m�����#J�}<������J����u�Q�����N�:y�S�m����_~yXs�������V1��_z�%S�E}��x��������F�;��N�������G|��={��:M��ZN�f2%��?�i\��,t?����=d�//���w��[�7%[�;��\����],g�S�U�{�s�=�}���Z�'���o4�Y���}���v_J�����w^�u����u���	R���ZH�,u?N��r����sM���>��!t}���t���;���tM��]����jg�~�L����FL��v�9D����������W��56��c�why��_���
��~��N��q�=���{'*a�%���ui������:u��~���*5��7��/�>�g+t�R�����6��O��~�Gc�>��+�k=��3����J�e�a}S;2��F.\���Y�l�c��<��H�w�d�����8�@�r,��W�)�y=k����9�V�c���K�{�_wI����e�>I���D�=�������c6�5��S��/���
%�����^�+���s�����_NeQo�dL��;`I�'G����C��:)\��z~/[����3������)�{���~N+���Kz�AE��u�%����-����K���m����C�u_�����?�����h��~o�J���s��`�MI�)G�:��E������������,���X[g���d����g������7d@��P(�	�0�RHy��S�
���na�&MR����
�q��:�-_���=�U8���������p`y�����p7�\��wqUd�,X�fM�z���(���.6v��"������NvuQ�M�0��~%�w���]��]O���a?t�d�	]0�D�PN��Q a�C:�Fh�I'�T8�������n���	���{���=��Gu�����vQuh�rc�KM������6mHu���Y��(r}~��C���P�/�3caE���G]d=��W�{H��]�US8��������i��C��
��~4-p_|ui�r?�z�8Q������A`��	����2a]��.��k�?n��$%��Y��?\�.�������j����=\Q�v��v`Zd�����&Sc�������.�y#�vw_@n���@�"'�2��ss_ ����6m����	����g�y���(���wt?�z��x%r?tx��{h>�n��h5:o��C����c���.��������.�~�j�{00o��C���yMo�v/(p���	.�����W_
������������}
��v�,�8�1\e���A���Y��?�[J:Fi��>�%�����=8P��n���moMw?��	��� �cU2+���7n\�TN�##�o���"��_{��-��q��[���U
��E����:�������U�).8�p�x�d2��d�I�=���aP*r[�C���K����ot�-%��Y_�5�{�M����#����yb'<���a�����N��	}op/�H���|u�.iq��.�=�x�o�o��6��L]f���������D��>�3���_o�8������<�����i�d�����2}M���%��D����Et�v?z'�f�
*p?�&\E:�;��:=����BE~O�wA]��':h?+�����7�x#l���{���p�?�����#'�����q<�����3��t_�f���������#Qq�eQ��@N4{����[8�{�\�����6v�F�#a��=tY��2�3�{Q�e+	�����7������$+\�J�{�.n������� ����������	�O�W�����Kr-��1�$��#�_��"�|�����t]�C�;EM+j��������x��������o�����{��[��x�j|+����t]�lqA7�r��UTI�q��q���^�Q;6�}q/�(����[�$[�;������M��T��o�~�]���G_w�uW��kQ��t�s�'�;C���Eu�������������^dTX��O�7�.���A����g����
��>Q���\�E�{H�kcI�,��3��1�����������$���{�{�~�rAc	���2{���T��5�h���D�����9��S���'a�������x
r�$��{	jAQ�I�'	�Ci^���Y�l�c����>�<@��{$s�W�g ���D���v��JE������c4�s+�'�Kd��vf�>I����������1��;����c.^��3����qY���c��U$S���_F�_����,5O�}�x����w���OV�r��d������:%��L��~&�oJ�D:���w�EN�=7��.��t*�'�����7
����^QP��]&�%����w�t�t^����A�&]��#�-����>�9�b��7M2c�_i�����K�Z:��RS�bH�@r��sg6
e]@o������Q�Y.2;A��E��Po��}���������u_���[z�;a{�V�N���iz;�����$*����w�~Wo#�����KoO���?����������������,�g���/\^o���~��hz��_�f���Y����[+�Ff�e]�z�_w�����zK������ySsq���2z���v��
�z����n�����v��6�d�h���?��2���E�M�r�>����@��A��[n1�	��SO-l����o;��g��6�M�@7�����M����Y������7�i�Z����m��b���VZoq�,�2��F���_�xR���X�C�i��3��/�����O��+���OUd-����q�������������������4e3�1�LB�l���E�M]�V�)n��U^s�Y��2VV�����<z�YEo��ul���Oz�����qBo�[���S���B>����XY)�
8s_������z+gX�����9M�P���^���&F��X�>������7�k{�Z�F(?�����M�A�ul���-��?F�E IDAT�vH�����hi,�9F�����To���Loe�[�KR������|s��Ye���7�m;�YR���V�6���-z[���*��.��74]�]�7U��F�U_��*:n�e�T���cF���v�i�W�$�-�z��{��{���)C��P����������Cm������F�}0l�������Go���2�o�������	R�_:w*3��E�E�	?�����=[�����E�����Df����I���MmW�K���9��u��NoQ�x��@o@v�z��TKI��L�������+�i�yP�a��O]��J�:�t��u���+����#��Ll{�������/u�S�X�1CF/4���)[mQEo���������27����%]���5��]c(��������sz:��kua��-��w�;�[o����#�c��n����f`��~�
TX��yBo��|���o��Y����Ec���t�V��FI����"�N*���C}W�vR�V�WY5��"��k�l�%����aM����=���/�,��Q�J��)�y����������r��}]c������{��������w]?%*���������)K��G�;Q�5���u=��9���u���k�T2l&2(�g�~��&�~���%m�+�w*}_�}0��
�����l���w�k����C}���|��@�("��k%:���t�M��W�eej�=)�stU�BoQ�w-}�����V����@��L��3����n(�������4�o5Fh�����^��Ya�|�Vf���OYt�8�:J�a�^��D�jl
+�j�_w:���Y�i%�>��z�y���!e��k�}ue4�oK:����72���/�u������S�����Dm�=b�k�U����)���1C���O�~�L��j��U�*3�Y��5X��g�q��H*����N*:������uOP�T�����x����+���=8������^��k�w��_��$��G5��/t�S+��M��=���T5�6���V��6V�mG�[�9R�Uq3z��u���)_���;��m��K�Y�Y��O�������>��#}���K���������K�_�w���=8\��jI��������F�����V}w�9K�g���qP�N:��������E4��{�zJ��5�<u��7�*;u�V���g�L��+��?H�%!B�$dK�
��HH*��-�-JQ�R�T�iSD��(Z�$�eO��%����s4�|��,s�������5������s���y�������pn��?k���4���<c<u��6�� {X��6}9���~�G���;�Q����
��i��:����20������Y7��B�s���Ms.�B��I�1����0����2uu��:���^����y��	�����h+����������T��k�$G������S�=M��U}W�MZf��c�}D��W����1�@�z@�+o�y�=�����tb��8L��<�}�\�{���k�s�.�L9���D.9�:���](�X?�z��%��^����_�1�
?s��Z���q��H������~9�l}C��|�<����?�kO�>�u��	��c��x�=��i�^���W�;�^jU��&"0A�����d&z���*{�^X��_L���m���nl�{�*[���Se+��?��T�P��[n����JV~����,���B�Sv�S�Th�Z���z���(��P�|{v�U����r��'6����(��W,��G������&�V���S��V<���AdU4w-���f}:LOgX�$�U�$���Y�\S�L�������]�����*�T&S�n�<n�$M��T<W������nR��������-����f��FX�jX����){��y<Ja1����a�w8���xx��bgU���������=��>+)x/,�2�a���`��
���u��-�Q�.!G��=�PW�����P_�P��1�n������>�x����*��o�U?,����9�Q#�������A�F��}_M���U�F����������S"�`�&By��J���vV����R$
����V�w�G~�!_���>"�<�*��[u�;�����*<��`�}�S�]��B:E���#^����F��b�y}�	�UH�f��������qC�>*��S����o>U�4��!w��q��}��T}UL9|�\�����*�N?���r�.�m�>�j]���s�.�2���c>m��U+�Q~}��aH9�/VOlb��jh�.��j}Z�'^U��U���k�����'�T�x>��g��!>�x�f~�7�C�9��UF�y�*Xe��e�]Vu�y�1'L�+3\L�>� ����,�sA��u��3���y����K?��sN��������\���8M�T�9�
���w����g�!�<�g����.�XW����`����M��f+�Z��5{�\/�(Q�=8�<u{8������5�U��k-��B���uR9�������jla��^�O+�_N�����3M����g�����=I�l�.��s{�&����gV�o^�p��uZ]H��s������w]�w��r�Z�����{Y�)��~io�������X%��N�a�{h
�g���q���������[�v�q~b��F<j�hV��`p�QGU!�s�*6�����	�����o_��0����c+���K+�W�V�N=���(�~k����Y��y{��;\p���	{������
��=o�.�Cb�Sr�3�^Z���^��rY�W���?�*k��>+.��#��o��u�oh���ya9��(���������s���<��3�I�������3��y�5p1����k��H�����}(��������9��R>����d8+=�1w-���Ds�������\�<�����G ���m��J�����>c�;���~��Xc��:������/���IR���>.������k���0i������h���*����6��5������qR�v�O&C���%���[�9g��~����� �{�����Yx��)�Ik`���I�g����(��\�-�i�>�p
���o�1��� \R�)�u���3�Z�#���
1}	����e��*��?�z����L���U����7�@')��x���UL��E��< ��7>�����k-������MQ���^����x���e��Jy#��N;�T�a��v���.b�I/�[L^QZ��d��w�|$fA�2����r���S������MJl���~��?1%�*� ��Ub��
(�<�jk�#�qD��X�	�qb.���pP�jk{�b�ZyY+�Y7�(�FmTy�T~�vP�J��!�Q���Y�����@'�>��^6/Nx�Z6���9i%6���R��%y� 
_&��qBW��.���wQ&�a�!����U��zI��RL���!x����DW��i]����!Z��/��p�N���<��/;��)��cu���y/��e%6�OXf�{�6�s�C��6���_56X��,����>���per��d�J�>=�qU�V��8��C8O"-�<��@����n�hJ#�����5����������������BU!e_U�~��\��Zq,�l-M�>*��z()��j��p�AiS\@���S�m���^��u ���X���>b��������X�4��D��$��V�c�\aQ5~��\��)�'�G��_@)?w�C�X��}����`[�R��z{@�3�Tb�/L5�H�^��ix�<F���1���h����}�r��)��X�!��umy�5i%�p������!�<uZ{8��w��������[��*�#U��N(��w�}�E)����{d^X�5f�R/�����uJl��3��X����%��~�"n�z
&��i"��=��g�S�7�#o)�CRib�{�5Sx�����w�X&b�a1y�����LPg���R����K�Pr)��h7�����&�r���-�����C
%���4{�a�{���V5�x_�����o���.`L 4�F�8�����:���}���c��Z�w����J��1���\g�)������1�q�)``-�9��3tG:�����.�%pFYe����YaX����x�>>F���&Tv��\S �1���_�l�����\��Yx�M`cLy�r��j��6�K%����mg(�63Gh�G[}��Ob��3�T�/�������s�i��r����@y|L�����6��������~I�X[f��E]�r�ik����]���_������5O�%���\'��3f_?��f�{1rZu��_��Wh�HJ�������s�-'���Q�7ZO`m+����i0��r��
��TBo���������d�<�O����n���I���3S��#`'��
j�����j���pP�����}�����KGy�����(�o��j�&��m���O|��q������X���x�m�]q�z�j��n>���,�a�^$k����`�+Li�yc��a����q�����Z�,���i�p��C���N&�RW�:�U��=k��l��&�+�e��Bkv�0����*��������k��XE��g�{��gq�.���VS��l���N�*���^�����V����@�k�u�������3���2V��E������nS��{������qmo���;��o[��n^��N:������zqk|�n���������Cc�>7�Wc���V ��MCR�C��%c7��k�OY���Y���
�q�2���Va�]�k!��/}i�}.�����/o������]<���2���]\�JUd�\�:�S�O���UIe�6�q-6���M���z�)�0��m�!W_U~O��T��
{h�^�XG=gm���)c�h�(���9���{�n���
���X3��a��U�i����B���?�3b�_�V0�X����@w#��5}����!�����k"�|�
���������m��~�9�4�`n�cA�������K,������w��x�,��m�x]�r����_��/m�Z+XM����>�������z�:�=�thV\qEW~�b�`�<�UY��5�1gO2�Z�
	�����{�=2��[��6g�F�a����>��e
��}�}���@`=������5���k��r����W��X!;��:]�7�:o������s
�[��3���)�%���G���n�����)o���U��z�(.SwWYe��h�5�e�XO��qr�L�n��
���u��s�s��J��9K��:����j��M���	��aSR��U�h�F�
�Z������
��L_�v&i=o���SN7�>�5�Q�?��N�w�9b��v��u�UkD����l�}��M��1u��B�"��F�r����b�g�Vi���p��7�������_�}�{�Q���N���"�'f�����1s����Myl���1fZk��z��-��{����zF��_�[3c��m�����IR���8��S�v�u����k��K�}D�>X�ME,����|�i�mL�������i�KA~���3)��]�I��������[��`����bk���V��g��7�pCU��k����f$c��{�VI�X��K0?�I�q����J�����uUD`��%�'��K&H�XD��J@��p`�|9�@�<��������"��m�Z)�X��m�M�^�!����d-2�o/��^Q���
���uak
�5K��mk��������}���\<f�E�N�����:s��W��8��i{��V��W�w�y�����������;U/j�_��%�n��V�J�>�u�*�U����zU���Y���Q6�J^����jv�#��S�7���c]��ve�2\��8�D��t��}��Rf�^z���n.
��m������f���j�p�H�t��c�����_��Znm(��nq(���������9���c�`���g8�F��oQ/9l*�pn���f�f5���c�����������27
���g�>���k�i^��}���#/����kh�1/,��
�����%E���GL;�������e
�bP������lb����B3^��%��^�ZxoU�J#��u��^����'�~�}�{��^�RfwNZ�c]�<��k�'=�I�����-'�'�>;��/H5�H�^�3f�G������B�}��t�s 0B��]�Z�j�7s�>�cMi��c��
`X~}B�y�4�p��X��z����k�Y����>U����:��[S@��xm!�/�w�����O���Z�hC}�C]9QF�3�������1�g����~��a���5�����4��2M�w����RX��&�`Dd���o�y"����2E���I���a�/v��{�8�S��r^�C�������0���Z�z�(�����
��>0������Zk�b��������5SPjn2��#1��z�h�f�����?����=s��7�������24����9����������	����VNf���:Q�0J�M�<��1}r�F���!_����A���@���"}��Z��j�s�i����!��dfm����cZ2|����F���c��V_����<�u�$U����S�=M�����4eR�#b��,{M�g���
a=-sI�;f��}��4�}�����~�Ts�����b�M��f��A���q`�"am9N9X/��}���I���)�8�NbO�u���=�I�qc���K�y�����% %��|�z&o��Uy`���{�B��U�q�` ����
+��r��W�8��	a7�tS�#X�i��H����*������������2�b�����[U���!r�0.)��������`��*V��)���W`��(N�)���o��������j�J�I�������q�-���/N���>u5F��-_}�#����!��]�c�>j�����)u}��=���/�#(b^s�5mE�~��wXw�u�W��p�W�r�b����K�hx||�[���O���L�U���S�CPj���� _g�u�^7���a2^����M���.0X�%l����_o��!���V�(�����Q����~����p�)�g������\K���o;�$�K|������o]�1�����|9���:���:��uk�CRw�GL�N���x��P���� ��aH�:c�r�^%C�����|�o9�68I�M��x/��"u{��*�<��OyN\���}�\��p���#������>�e�Y�
k����i�����BC5������W���y](��=vW4y�t��8���n����o4��i�9�PFa��z�=��A���:�Y��Mc.�X�)�L5���m���Z�p/�{�n}h�]�aU�����~�+w��b��i�5�3u�)s��y���=���=0��
��XO��������6����0��/��5����u��U��k�q���*�"c{��������)�������v�xGjtd~��lUu��� ���I3<{�1z��n��_MuNRfV�{�s��|��m����1���6n�����d9Cm���-�>I�ts��b�s���FL�����4eb�{��$���i���<�S?�wk���Rh�I����N����Kr���������e�b���0^���b��@�����p�CY[���d��=�&��i��1)Y��<���{O����0w�������sHc_�������j�L��I�����^Y�����r{x=������~T��G7�m���6��1J+>~�y���#/rX��=���yM��0�y�1�x#_�$�� ��2][�mV�����=�����d2���?���c������A���b-o�e�u�ab��2��VT����]v��)a���n�bW[:]��x���#]�#����JmB������+����������?�i�����.�4�\]������#�i��9�����e������o������>�1���wa�F�w�'�|r�M������a�+�( a��+z�6�f
����6�s���~+��r�!�+�|�r~9�E���>�t�IQJ���b� ��vX������+���W�O�>��p�6��0���z����vN^�E���C�L���K����������3�>jR�Z������~�K�����}UmFn���}�QS���v���v�ik�MMs�y�*�b4�] IDAT�&�s�6��f�m�.2��������)}q����\�����c�}�v8�z�;���i(^x������Y.���ah�k:>~�9�������e<��R�)r��>Lb��Q���U��]������{���H��������!
i~S����[[����;���b�g?��9U���k����ZkZ}F�^�|��1�����9���h���v����	������yK���9K�R�5�v������y������g��)��������cX./��p|����<�]K�n����y!Mo�	e�*CO(
���Y��Z����;���c������2���������g��
��[�12��?:��C[�����k�cS��v�,������~��.!e����;FS��s���Ns.�B`���TcD����y�Q����-�>I�ts���7mk�i���7��4dxo�w'n��$��=����q�|a�@����;)��.�5O���F���VL1����b�i7�o���CN��'�'> #8n��r�r���!��t���e��e.���r�)���X\�r�����3�k�7�y��HK@Jliy*�!���[��g�}v���g�����'���o������u������1)��u�����|�+��O|�S^;����2
LLt�,AN:�U��B��Uq�k1��z�%Bb_���8��o����[n1��D�<���w�p����?m�.Ox(�}�;�1o{������w�qf�UWu�)��sNR���bsW�������X����q��[�c��U<�B����;������������ps��V�9G}c!��w���Q1�t��������	K����_��*K���x��nse_��8�F`��������Y��c����1�G��`yh����5��j�9�WoY�oL]��^pr���.��#��Jl]+S����c���=��a�T���m�<�hg��}�o�e�A�S�Khx�j�kR��k�[h��p�

��=������<�a�U�{�����U�#�7�f_y��]���Z���VZ�ym�ca1,c��{�kN8�68)�}��4��������+PZ�no}b�0}�"��i>�g��4'��<�}��}0y)��>S�� ���l0�^ o^>l��&�PT��u�[���$��q�o���f5�{�S1��w�������YL����5����d?n���*J��z]�@����k<0�<�*�X~���� ��<�]K�n����wn���E��zj99s�Yg�?x�������l��9�7$��cB��pnX���z�bu���7�>�,!�����b�����f�b�-Lh��.�����rr�v�(��F�$}7�g�e���1��xjY�YcR��zS�{2�%e9S���U�}�T��;h���o�U�����e|���d-��S����)*�l�C������U(�]KYw��dl�w'M�x��4���s�>�,Uy���KN��g�1��	��;��F��RU����z�G��o?���.�8������ql;N����f��������e�o����]�����Xs� ���.��<���-J���|��4��V5���UX!��m�,���b	����?4}��e��zk��w�
Q$�-L��?�*G�1.6����� /���
�	�z����K/]�p ��~0��Q�~����'?����	�x0@�����R�(��|�<���������w!��@1�V/P9�{CE���ya_�v�Zxh�o�&m��h�^y�l5�o]�M���2c^��>0g�[W�~�>J�9��������~��7�����B�w6��M�~���n���7�Y����~���>�x�!n�|��}���QlB�.6t�!�����N1�K��U]�)��
�X����$�8�"�]B�6��e�A�����e�(�S�/;�=,�ci����Y}���g|��W���OU�)����5]�QS����R�T���7�2��\����Q9����W�Yb8��Wc�x���P� v���!������J[=��?A�0!�@�����^�~���8�+Gu����>Txs�.A�������������7�����n�9E���Xr��������=�����E�g�|���C�>Y���m�g�>(�<�/�T{8����������x
�p��e�5�X�	����;�p������Y'w�_m��)��c�����������B�k�
�8m9��������~[Q�\��)�x:@���7� l��7��)���n������# ����qB�yXU�B^]��\c
yl�K��M�K�����t�M�w����7��s�u�$<�^��)�w~w�#M��1�7���^����������=��x�!�b�?�x��d��y0����.=��cMWe�rYb��rs�e�F�(s�V`��K]�v��3C(�$��9dfi�I5F��M��I�@��T��Q_BV��IR��9��S����kMu2������q?��azxc�@/%d�|`��s
2^�-�\qo�I]w��s,�\����i���m��s�>�+e���DN9�*�a�[��������l�c��p~�V�����\���U����*��Z��s�C���me(���w���;e?�>��G@Jl��*����%6��C%���;�ZU!TYa��+_���h��B��1�y6�Gyd�fZ�����};<0�bY%���#���p&���{��jAI#u�e�]
66�>��O6Z�jS���?6�v�i'���g�^�8�w(�2�S��Tg�(t��=���������@��q=�t���)����~�;�
�j�rn��l��������}Wh���sh������,�s���{W[m5�h��3����EU�������;����c���8�&�I�� ������hB�Xd�f�m������� ����m�?��p�(���t�u������s��(U{!M/I�|�p�����^���K/u��Dr�CN�]����&�Wu-�8��~����r�,�F��������X�I�i��������$�w�a����[>E����
a�U�S���o�{�����
��(`�p!J���k`��C���nHs���o���}���v?��b��y(����w8������)_�;!���H�}�r�c���)����i�� 8��M�����`LYI��Jl(�����D�]��(���8\��+u�r��M��%�q��*e����Ol�="����}����on���$e�R���l�����N�9��27~��_�5z��<q���]���1��p_�������z����������n7�/���~{�xV���z���0���/�����<��;�HvAG�1��
�\��r���>�������o���\��|�#��:��gs�c����f1��aL�E`?����/K�zf���\<�,����Z4)������Q_�7��'I��P������b
����(sI����e��Lg�:�Jl��:��r���\����/9��4�=��rZU<��A������P��!��Lu�._�\>��������S���w�����=�����}�83<Zai������o����9N`������+��^����������#��d
*���_N���u��(d���o��1��'�X���`�Ssa��%6��xiS�H��2���Z�)��9ot�����[���w��9�
���oo?,@�	{lU��� $�v^�F�Z��
���O9���;w�����4���"������|���.l����N0��h��������j���.���;����F"9��!�>B���x���a4�9��t`.�-�����v�����x�,�x��I��x��.��]c�({oE�O�?������P7�s7g(i\K��M�����������$�>�w�|�k�i�{H�^HC������)��u�������
&9y�C����yeq���������9�����v5�9a����}���H;��b��y^��������"J��^]����}��c�>qr��)����>S��<�iO+�����PJ#��\���8���J<���%>�0�16,z���7�y������<��p�g�V��������r���x}��ho|�*E8=���u������
Mc�"��yK(�������n7������������(6�3	���l����w��3a�'q~�1kM��G/��B�I'�4)��\���������C�_��\<�,���n�(�D�����Y_�[s���Jw����/V}gHu-��@����}����}��p��1�M`_����1��N �<��~���}�v��cLr"��V���\
y����W�-�\>��NU�h���
��������o��E@Jl��{��,����/uWB�5m������������X�M1Q]���k�-��Do��P[.�O|����FE���_��I9>�;��<b������?�d3�M�<c��	Ox���g?k�K�/�p�����:�{��={����C�?��V����9�������
����W��SW��Y��b�������O~��(�_����x���j�3a���-(5!,���;���7������w?��m��������0��
������'����f�k��	�'�{"���%x�Yc�5�/����P*��x�2_U����!_o��F����k��o�����M[�}�6����@A����o~�������`���4����&��B�(���P��)OyJ�c&^h�,v����YHY�G��,M�^�����n������
��0�����}���|0� ���?�e� \���C
iNT�l�M�>[3%�jN1��R�$v)T*�������k��i�!�b������mP�+�b���+�<���Tc�!��{�f��E]tQ�x�Z�������8~�n!����g��cx��^��m�g���}�)���~�+_Y�*>z���yK1 {9������5���������m���N�'�s�k�K�0�6�y}�Wdc��������5Z�z����$"�xo
�V�+2^��u�qB��r����v����o��9���T)�c���b}�����1�_,q������9e4��k�9d ��d�S9��[�}�T�q>7�K�]R]K%3P.y�}�0]���p�g���o�
�n���f���*gE�+��'��p��w�M~�?�u�s�S�o�9��M���� &%c��;A���������C�'T�k*{x/�\�k[%Omg�e
�MkO�O^c���w��_�D@&)�-���RE��u���:�x�N��x;���xI
��G�^�,R}��Z�t�y��/M��z��W�a�:���?�i'�_B&Xl�LGX��W�Z�\q=\4�r�-���~��Rxk�Tp+��B0���<���dq����?�����|�#QY	�}j�J�@�q����Ha]��jM������|�A���cU�6�����'?���S� Y_����5��G���/U���;����z����i�b7�����
[��~z!��P�4�+�2v���xx����e6a�{(�[���=��Qz����r�r���G
i\CH.F(!/0�8���+��8��j^F\`\^v�e]Jl�z����Q�
�s6�t����^hE/�m�y����w��_h��������.9Xb|�
��\U�*_��
b�/���`|���}�sm�Qa��+��3�L�4',�-���]�����*�Ts�i��2�W�����������9������}�v1�J�vL�o]�OD��0��G>����~P9����C��	
�����Z�=��
P(�����G��Z���\)���i�a����7�7.+���r�Kf��V2�z��??^������u����:o)��5G�tY��q��u�3b��@((����+������N�W���1�r��0�
��b�����S���r����r�h�^�W@f���
+�&�(���g�����r�{R�s��g��L"�!��N;m��A����^���6
��RJ�3��>��x�1��,�$����;|g�������P�\�$���9�8�ahu�m��Z�T���{�~���%/_����B�b<�~5�<)����]�b�����]�G��C���#�U��,|�{�+���{k�q��~���x{�}�����wm�1g�#w����r�
���}w��+���$ %��QU�xx�V��x���?�Z}���c������c�������^V�_�n�j��o}�[�%����=��^c�	�|��]X�D��M����>�)���=�YX� ~���^{��1N�������Pu���[o�����on,S����N�kY�!,+^yb����������C]�Q0��C|3������������SO+y<Oz�O��m������b
}�H���]�z����[���B����W�s�{��[9����WJ6���.cJQ9��^����E��u�������������#���M����|���NNY������TU�?�|�;�[M�sX���������������@��$!��f�`���g���KE~�4���)p������B��
�����2�5w�yg�J7����<���;�g"PF�������o�g��m���1��b=�.dna�������xU������Bx��}s�������]���k-�&1aZ������A�w�m���m�dHs��o�*N��s�T���N�9���K�������q����/�:��[l�Ec��7s��9��E�Y��j
|��}'�l�b��)]�I���>��T[�e�]�(x`������~�y��pB�p��zj�%����
���#���a�0+_���4������*�T(#1>�XKx��U��B��w����
�u�>���b.�\}i����������� ��G��K]��<,��g�����e�6��<�~�?�p��>���$�u���(��n7���p��������cr��O���|�3��c�_���o������Y�0�}�i�{R�s��g����+����`���4�����7���$���e�cb�Ky��t��MbZy�]_(W�}�T���o�Z]k���3�>�7k��u��7:���(12���>��3�\���'�����%��N�9�4���� R��zhp��\�0���8�=�7
�ta�k.?���i�)w�}������C���,Rb[8�R%�I�[C���h�:����%�J
�o~E9���@������E=s��-�"���WU�����=��.>��=�qJjU�7�R~��_lPx����l���E�(TY���5��G6������>�uM�G���������~�U�k����g8E��<����w~��_�F��������d�Je��@����r�o�7�t��T)�!����~�l����+�8��B��6�o������p������]�Q����u�{9y�`�+`U`1��:��C=�������wM�A1����$�.y�$U��c���+6)m
�M|R�76l���}>P>���g}��������l<��#]����*��&����yA��y����W������}B��9�M�p?����k���Z����W���_��lJ^�]Pb���{��?���Zn��
�x���O��W��]�(�?�q��s�1{��ge��|����7��}�B���*�I_�^)_|��[0�*���{o��w���B���c�)G[�i�x� 0����bF�#�����`����7�����.���4,�����K.)�I�mM�c���p?��\��R��#�X1�8����'�l���7T���2�p�	�a��T`��
n\z��O�Xr�
\?��C\�����U�����}8w8��c�/~���l6^�9E������n�����`��O:��9kx��u�����=x��(R��%/1����?��O��������}2��C�7��"H���
{�1�'k�G=�Q.��X����*�D�W68�z�:�=���1���u����3Ga�������uxm}{�(�z�d����� 
{E��������?��qh_���Q�1�N��s IDAT�a:9�6�\����#H��z<�5���gSx���WL��i��6�d��xF�P���;a��32����.����c��*�O���ld�?G�)���o���[���y���4���Gn���+Fw���75E_�R���%�>#���O?������S(�����}va�b��k���=.�����y��Ug{�����<<H�
mC�4��xnY�q�����G 6���R�@��Wlz��K�}����8��C�k���������_��Wkf���x�6�lS{.]���^��~r�yR�=�W�s�s�i��I�ALBN���}n������
CX[����M�!L�+�s�!�NcO��7�?W��5�/"�p,�p���,&M��e�{+\�{�f1��������w�3�5,12IF�!\�CH��I�I,���q��+�������jN��]Xq����k�����T��u�]��(!,���P�>�}��.K(|q����JnA�!d�u�+oT��Aa���tX��A���k�q�N��GA6������<]p�.D���������
����;�0�>�����r������R� ���8��O��(��������&4�F��|��w�pC�-���@B����=f�ZB~]g�u�;�0'���
V���r���D��W�s��8A�����~��
�&r��
���6\P��Q�N|;6���A�^�>|3X�u��Mz&!�u��W;e8��p=�[^)�*��t
���/���?n�a�b#}�W��wz������v�"(��9�"�B;��@����<e������8�U|�h7�5����B��AS�l�S���KQ`��U�@��{1��
fl.�N�����*>�����'�(B��������FP�e\������l��o���/�{��'6��#��0�����#��|�^�o��-0�@��4�#�v����{a#��+��Q��C��'Q�b<c.���=�����w�b:���rJ!,[�
S�UUiO�s]�z� �
: |���q�1�~��������>�������
VxqB�������:1P���z�VOw)�?s��
_�G��'�!3�S.<\x��n|��s�rM!����}��Na��:������+ ,�������O0?l��'�������+����F
X�N������o4�-����_���xH��x��(�"D���}o�������	����;%{��S��;����,<YCz��]�8������K�o��������a�`��>C������\��9���1e��6��>
�c�m�@ ��5F�w�~��q�`E���oP�a��sJ�N~�l�e�qs��=�2�i�Vg�
yc/�u���3&c<�s���d�tR�S���C��YK��7�?2�e�c/��%1L?��oN���N2G@��9k����?x����c�7�C{*���#����GX�}�p�k�_e�&e����s���G�v��8�M#<�!q�%�W�{b���E���/�������;[@�����i�����IY�� D����q�3>��W�6X_�4M~�J��_���Z��0{F�"��h�������u��n7u��z�q��A	����4��}�S�kJc���g�A�}F�����	cF���0d���6���{�{���<���g�����Ts���.�X�q9�c���Z��d��x�~������=9�N>��3���~�����\|�}��.��<@��S�M)�*O]��]_r���Nw����{��MRf�\�S�#��1��^	�\�v�A�r���{���9�I9���^��uR�9�U�&��[N��#�Z�l�}O���.~��i�-�i���0��o��������S������'?zVD`�	��/�	v�nd�[����:��|vB5']+T��L�n�������E��.l+������@�2N�E��
�W�����[�������rQ�
�����a�Gvb���n$��E>��k_�Z�|T���=���2��S�`�E�1>�������#��=-�Y���T����
�4�gJ#�x4��E<+XP����n���~w+T4���q��y��9"��(���>�zk|_�<�q�����������
k��Y+�������2��Z	�L#�hw�<��������J:#���-KXF����Z�Y������h�}�uY�n.��*g������z2,�U�}�/��}�3V@�|��o+�S���/������
���&hm~�.�9��)t��R�7+�7�����u�xvs�)����b��*�6��q�
V���;x���T�vX���*����zc��vk��*�s1���	MV�8u�����>�y�&�T]��u�_�a���`|�����
h|�����g�K��]1�X��V��x��(����K�O=��d��#+�2b����#+8���/��iL�n��rll{i�oo��GV���m�D1
�me���?|��������=�[!�m��/�B�#�����[�O���1q�W�"O��m�J-@{c�2lbRw�
�������`������z��V��6���@Uc������zj��oSH�?a�U����?�a�S+�8b_��m�{����sN8��Ij�Vp�q-2����qc�����s��%�>��B���n?�m��~�*P5�&��t����U��G>��n�
Ym�*����y`7��1b��}K�^��M!vNFz����z�:�=_���;nN�����q�9�X���GF���1�v��t���Y��U�����
�s�[##���������	}k�v����y+�;�\��r�]��1s��8e>����������k�]�1;��OH=���+��XV�]�m�xV��h
�!~Y��k�7�X��t����f�-�j7�k���p�����*{�>�w����/l}�k��Z��*eF?��}����}[�b��0
����4���3���F��r��m�0�_V��qN������7S�I6�|�k�����:��`L����XX=v�>��b��zt���5�2�_���9�i���S6��J^�3��\��,�,@�1����\�*��O��1�<m�2�D
�9�s���/��IR��x����s��!��I���G��?��g��|/e�i�1q�y�=����;��/�Z~���<�g�3w��S�3����Lz"��VU���ByH��B�y�>���3i?�e?#&tm����?��������������P�}S�)w�[1���k?1�5n�|�\~���V=�k" �!pG;x)���'���0�����=�u�����d,�c%�x���VS���/���bV����xa)��X]��:��_�������9���,;�3{����J.�X���g����*H}������w3�K`���X��>�1����g�D���om�8X�Bx�3V��j�5:�kb9�,�b��:k7��Uk��'(+d�,������M�]hGX�����{V��H}����0�R�r����g��@�#�'�x��W0"�0�7����������=�g����
�XyOoU���[<&a1�X}��9��������>N>�dg}������,B�����]a�w4V��r�!�1u5UY�����C�����>
K�\C��K��O�?V|h�x��������5���9UHQ����x����7������`��>��|�X������3�{y���J>�����}U[�� ��k�@��D���z�CXW�����$���}���-'�~�A��w��(�s���������W�a���_,�����6�������8���C�>��e����~�<���F�������w�9��q�ex �	)����L*�/������g��}?����vbM*��z���PC���K�?/b-��xy��0�D`�V����a��D[	�i���r��b����q���"Ke�������M��q���������`�E�i�/1�!}���@�������1��0�307b��0�a�o�d������*�w���Uel���=B���+P�XO�
�D����-����kN�����`�\{b?����Y{�.��3��O��`�'�>y(?�c�N?�(��b�����aM�>�����c~�����������?�'�'����J��0O`]���z���V��y�b��[�G�nX��i���l�y���p�`�6�����^���:�n�8��3�~�>$^���0S��#�p�m�}��~��� ����n�9��M�>������HU��[9�q�������/�o�;��f������\�=�i�����p�	n`����YZ8n�������1��w����2WgN�>V����G�q��|=u��-SS���`O<����s�C?/�����r/�x?K\R�3�6O;�4�gY���m�}��sF�����D�w�.g�]y��#�����eY���3�s2^���~���z�\��sn3+����������3�t��}���#E��2)��'���%�>I�t�z�wR]��������}����G�a�xa����~r�yRj�=��<�I5�,*���3�=�\rZM��_rFE��O�)����}�;k8������"e7���mpZ{��~���s��m��}��G���-�b�D" " " " " " " "09���I�����������x�[���������D@D@D 9Y�`�Z�6��3��!��p���?��Q��^�������2��~�;���J�(Q<����	|�pF8	�!��D@D@D �1)(.�4r���Jw�~	����0���X����M
"��,�=Ca���!�=��s�}rW^�1"N�@�7&�(a,�Bc���`<�h
" "���N�sV�" " " " " " " ��|	X�/{p]��WE@D@:@�@AD@D@R�+�W`�+�W������;/�e�i�+x*�s����_x�������W_�*KJg��|��En�'������,Hc�g�R�\�$���A����}�sNq���e)���gS&X�{�����,����3R�����^Z(�=�iO��b�*���d  %�P�����������������!�a��W^�
��f��e�Yf�^%�*�SO=�y`#������ZLXb�%��k�YD�������, 7�p����+\�������.���(" " �$�1f���n�\>���I�D.�Jw���*��b��n;�i~��,�����E~�;����������d  %�P�����������������!p���/����;/����" " " " " S'p��7yx���)?��=����"�>,�����;�~�T���3�O����$"p��7����.5�N�{����dD`�,�=��:����ww�������7Fn���/�K.��������u�]w����	���Zj�!fQyX����?��$" " " " " " "09_�������G�
6�`r/��D@D@D@D@D@=�{�����|�;�<�&��2���}��+�������	'��
�7�m��vaL��:�1S����@o{���?��O�2��|�;gx����X�{(�w�q�1�y���>��� ���v��e�]\J����������*����/~Qdi���Z���J@Jl���X" " " " " " " �!��n���hd����N��z������������N`��7.Xp�����nd�u��O?�������o|��0�-��7�t�y�^`F#���������*�J#" "0c��]/�L�o%�=��#�����b������_�r�q?�ps�5��C%��~��g�����;������Ns�l
����|Q���^{aP�,�;X!��`s����������������������������-���J����,��3^"e_D@D`(PD�p�
���^���`�Fmd�_}��
+�%�\����v����^k���/�_���E���zks�)���j���K#�[la�>���Z��r{�����o6K-���������OrqN��POD@D@D�+�1]�)�'�k�$W��r����~�3s�G8E����o��_�����+�;��n.��f�- *��hBUBf�����-�w�G=�Q� ^x��/$��nw3?���D@D 7���&��E@D@D@D@D@D@D@D@D@D@D@D@D@D ��>��O�W�����3�t��@��)<�A2�����a����� ���9��3�$����9�����6��.������KJ�D@f�����j������.��>�h)��#����� �Wy��n��|����W�;��N��R`��FD@2�[&�JVD@D@D@D@D@D@D@D@D@D@D@D@D@r��=�a�8���7��|�c3�_~�����?������v���Yf���+��?�����~�y���.���f ����x�[z��]=�j���.��b�r��$�������,�3�_Myh"p�{��<�	Op�������_�<�iO3����Yc�5��=X4��h>�
�	0���������3(n/��rf���2{���Yo��`�U$�������fN��mw���+�" " " " " " " " " " " " " " " " " " " " " " " " " " C& %�!�MD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@f����f�*�" " " " " " " " " " " " " " " " " " " " " " " " " "0dRb��Q�D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D`�	H�m�?��/" " " " " " " " " " " " " " " " " " " " " " " " " C& %�!�MD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@f����f�*�" " " " " " " " " " " " " " " " " " " " " " " " " "0dRb��Q�D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D`�	H�m�?��/" " " " " " " " " " " " " " " " " " " " " " " " " C& %�!�MD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@f����f�*�" " " " " " " " " " " " " " " " " " " " " " " " " "0dRb��Q�D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D`�	H�m�?��/" " " " " " " " " " " " " " " " " " " " " " " " " C& %�!�MD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@f����f�*�" " " " " " " " " " " ��C� IDAT" " " " " " " " " " " " " " "0dRb��Q�D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D`�	H�m�?��/" " " " " " " " " "�_�\r��f�m���p���K�{������}��n������-a�)�M	�^+e/z����p�������x���gm��k����u�]W����NG._��W�:��f�-���$" "0!�����/��[������+������y_6��O{]b�%������5�$��\�6�E�=�����E_�[1�|�����>�)�����7��l�����������m��f���?������|���w��>$']�-" " " " " " " " " " " " " "0���6�_P������?���[����0�vX����L��)��b�]vY��������g�{q�7����6�Gf��
��'" "0EYi�����/o.���)�da�Z��~���:�~��E�������{�m^���'=�If���N����4�*j�b�h" " " " " " " " " " " " " �������������5p�A0x�w����K/�t��<����#p���<���/1������?�)2"�����t�A��0�����?��\{����Of&o�����?��\�9�,����W�t��m��~>������p����L/e����?��c���cs��7�z�zj=Xh��]OB�#�8�|�s�s}/��<�Ls�UW9u]�P�N�2��;����F����D@D@D@D@D@D@D@D@D@D@D@D@D@D`���6����.��s������'���+%6Uc�Y"p�;����K,a�xGM���n��V����K�-����x�%��xbzQ����>��]���T�b(�p	t���-���J���6�o��y?�m<j=Xh����4O����6_���]bx�k���$<����p-�Ls�����qt[D@D@D@D@D@D@D@D@D@D@D@D@D@f��3�oe{����f�����������d#������E/2�\s��{��
�l
� ��������6w���������#�t���~��i���Sc���y\����f��
��r�F�k�lKO�����o���o�I\��P;iET�
ox������G����m��`�q��L������x�Zk��� �P��$�Ns���1�/�w�����������������������������	H2}�����fIh���o6����{�T������,��R�����^��Z�4�bB7�����f!��
�+um{�T��O_9l#��~����y|�s�3����$�T	hm������+�l.����8�rs��`!q�v}���~Wd�>��O����$)`K"�\��m�|��%p������`��{��������O7��hf��������\>���;���,@�6]��@Ej ���g@�������>{@9Z\Y��|q}������YX�������ly��,�:������������������������������L�@����C9X�>��O��7��<�IO*J������w��w��'�R����m�8����[��VZ�,���f�%�4|��s����|���o�}>��2������8���{����~��J����&�}�-��b?�p��z��{���E��^{ms�A������iT�@��C��+��s�;�����w7�����_�z���~������q������Gx������Ys�5���j~����?�Y�r�^��U��o������^�|����.�y�3�Y�]��7���9��C�S���}�%�p�>��Ov��.m�2�W�����S��Ts�{����	'���$��t�;�_��m����g�"��w�9��r�?������������S?���������k������������~q��[o5G}��p�
�tI���2o~����~��y�4]��O~b��w_��j���r����������s�)Ha�:��I�_���+^�
���?�`�������R�K_��9�������-s���
+���i>�Ar�����7��v�����|'�E�B�)6��}{z��P<v�u��7�`����8p����/7�~���#�HW�����-���	ow�@r�UW�����j�[n9���o�������+6�|s���<���O|�����&�����%��n�����g_��W��@�'�����*Yl��6�~U'U�5]��}�������������m�����,q�J���x^r(f��u�3�}�c�2�,��m��/y�G���K.�d^����|�3�����.�|��#����?�����57�tS�4s���~�#������������n��f�1����+��_��W��������~�s�$�	�:���M�����q��]������e�8��K������E������,g��wU����][[c�5\�����_�l��F��c�1�bC��B������=���_0�m����~��a�j�������_����G���O���U�KP��8���&
�[m���c�z������o����a]B�q46�Cv�qG7�%c}9�(�
������=�X7�����|_B�d��#~��_���)B%6�v�����0N�����r
��o*�Gk��	��y|`?�����>�XO��	C���Vi
�����e�W,����^���y�
7�=��{����"����{���_��������/������w������/t����v7�t�e�ukk��g�y����rZ]8�,�}���mX�1��'1g�7��O�����������������N2���������}����}s��G�g<��e/{Y��^����������������U�Ls���� �~�;����m�6�:�z�:�1�y������+�Y�o�I��f
"0XV�wfQV`��_���FV��5
+�3:���+�����o~��aY~���I�
F��g+�:��H�iZ��G?��������
�5�g�|G�vXTz1����h��Wo|�UBYa:���rqaQ�������2��X-��BM���/XE���j��U�]x���G������\4����~�+_Y����;������M+�3��{�s��'���#+�[����R?� }�+|�����w�E�h[M��
K�>���4��oZa������{#+ 6��HE<�g���o�H���~��
�I�./V9���)\y��#���X������6���s����y��6�~�+(8��X�"ZX^��X��(�C��
v#+��Z��=�i#�4R���hG�y�kFV��5�2{����v�M�L9��������SN9et������dm�)�/���Y��*��K�<�K�������������u�ZT��U$Y!���o�
s��V��2�U
Y�����|��Y��y��Hc��9�:���n���?�����������\��#��?��p�i[���p�Lw�9hL��/���~5blij#���g#�H��TS����V��=������������d����e�Z�]!��|s��;������������#�y������"s�|_���w�t�M�[��O�u��Ozk>�R������h�;�}�@2����ea^�xDa�k8��+V��u<��|��������7�����a")�0/S�R��s�MUE���T�y�_s�v�i�c�5�2g��Y��*���Pk� ������������+��o��GV9�1m�`:�Z��[j����KGV	�1��V�nd
K�K6�3Z�N�c��q�*���?j
�����s��~������}�T!E_c
_5�9,�5<��q��B���Y�x�9��u}P�~�g��F�pCk�x�k_�:���,�$" " " " " " " " " " " " " "����0_AK�*8/x�y�����%����m��zk�7�����el����E~����f�
�����/<�t
X�X�1+�hN>�d�<)`���f]��c�8����3�9��x_�����l��t<����`9�s �U|1Vh�yn��C�����<g��bV
�!XE�=�w(��u��;^��
��#�8��z�wx[��
x��:.��c�]}�d�M����o�������/6xY!`%}�UVq��n��h���w���{<��<yo|X|'�}��{/����{�C��������G?���)�}��A=�6F`��	<�P����{��x����x�����!+����-�m��B}���W�X��K�UbtI�_�a�O������d����G�����{nm6��a��},�c=O9�{��s�;���,�?���78���xThxO���������o��!�@�����<��Q�|�;�q�[!Og���.`��s���������y��W<�u�Y�������
����Z�~c�p���?u������ &����������?��r�#E9��C9�����k������S7���XF��[^�h�Gu���A��m��o��fW�|�����s���<���{���{N���h��g�Qg���h4�U)��������r��R80.z��x��������]�����+����
3&�>�<�������?�y},��a�9h[��wG���r�P���'3g�>c=s%<����
�:O(m�6v�G�	���	x&cn�X�xiW��=��VA�yI�9�u��s�9l��E���,i�x�*�i�����'�$���{���Uqc'�~r���r!�0n��=�=�	��)} ����w�������C���O&U!�8Z���5�/�I8���3�����u�R��X_�������Nh#�m2&���37f,f�����o���>�y*�i��O�b>���C�<�����s
��o�*���UT��@��IS��E����_�V?]}������	�#<��2W���U2)�p�u<e����[�R������
����h��O�*}��4�Ga�C�zPUz�&V������E���1����5�w��w�����I�B�L`|c�M�
�`������������,k\�����a���I����0�b��w�W��S����y�[����~������z�w1!e�Y�{1�r��c�@�dO��-���q����0W�������a~� " " " " " " " " " " " " " "0a�����L�@h9��Y�;
6l�rx��V9Xa��U�+�Y!���W_]���whu��1!���W�����`��FV���3^���Y��4���/L��������	�5l<�UY���m��z��EU����*�����������w���g�G��
���b4�����*��p��G`��6__c<�`9����J=�E.��r�����F���zF
��X���x\,�c,������,����
/]u�<�V������r��[ap�%��C�7���i����/<�T<�y�:S�}��Gx��x��h;V����V�|N<<����{a���n�^z�ci��	^��P�����*�
��i�T4��oU��7"F���[��G"<8V�WX�9u��i��}�|��L��R�!����^3��x����4�@��*U�����?�W�Ax���E|�W��6OX����t��Sm��c�<Y�y�J��.�6��K�<��>o"���a�.�^|[y��_^9��Jr#��O��V��2�>s������[k��v���>�9 �y�U��o�U�A~����	�=��^����k����bw�3e���U,j,O�9r�'����/n]�w����i<-��k�@XY�>����Z���U��d�g5<��xV��2\�9�������|au���V>B}�
&.��#�����R���5Y�i��r]=�Z�u��]O��y�W\�����7Uc����6�V�����e<X6�a�����<������6��^|]��(��������Nh��}@���>�����E����'c{U���#<���#�3{Y�'����W�
�
��p=�����W�6�>����t_�����cw��.?W�;W_c
�y�e�^��z��S�������
@s���������k�H|�-���������E��rZ�=�KDD@D@D@D@D@D@D@D@D@D@D@D@D@D@�&�eq<�>��|�+����l���">
b��q�\B`�)X+�NH�b"DYv�m��\�"qU��B�^(�zh��t��y�Sl�iXK�E|���u�,�g����x#��|\���2n(�D\c�����"x�z������z�zm)�c��i���V�a���/��P�5��F<���2���b*J3>M�M��FZp����J�����0��D���g���{�Q�z��w?������G���0���q<�*!�0��v���#�RU�8���(���b��LU����vS�A�*e�0
�G�������~��}_�F_%��y�I������?�����(U��9k���E����Dd=iX��UI�^K�/Ylm��J[�}�%M�q�zS*�W��S(�J��3I����PA�z���F�9h[��E�coQ&���P������o�8�?���eP����z��d��b��B�7�yo��S���q>��s�X%��r�z�-���BZ�X��y�9����U�H�i�(�PG��z���i��(�c���2/�����@�[cb��D���!�]����Jl�	7b��V�5�4����6/����MJ�a=iS�B��)�"������h+(�������q�0��'��dG}�Amb��x�#��M�����t�8���X�#AM��_^��)��L��Qlg��.0���y���z]������!*���m_d��{1k�I��c��`���:�R*&m�D�3/R�,�;�C[Xp��jc�r]��P�9��c��m,��0����s�e��	�1~��VI�������x�h���g�8V@�X��y���s�I'��V�X�����b��=�]�B��
�7���i���^��W�UVY�.��n��-�1N��V��\{�������B/���g�}��g�yfc\&VH�1��r��@���5������D��'?���z0�����UD1��z��UJiM�
���&��b�
c��o�T�������zv�'�`�[���@�M�?��)l����m�I�)j�=���\��
���~���i^p��
��8m��Y~������{���U2i�j��������a�K[������m����^�}$�h�_��J��zAh���f����^����`�
5�O����:�o���U�4��^q���u�c�[��1���H��������W�b|{�+^a�7���3NX��"s��p�a�5���z�����H�zZ4V�=&�$q��M�������Z�<��&��g����Jp���t�M�S����xV1����wwq�KZ���m7�����r���6�#�i����%W�l�%�lXo��*��fk��V2V������'>1/�4����>�XO�.O����c�_���(��Y�����j��9����������z`-���y���`��
Q���~�v�c'�
����i~mW�_����:����{�������>���z���}-{WM���5�������5r��o=i���c|�Ou�g�Em�>���1�����*t���W��|�5��W+��7��p��no��Y]HC@Jli8*��������%��W\�5����%/)��w�y���2sn� IDAT���>��m�Z.���7�����/6�C��n�����^z^���~}����Z���m���|{�o��� �8�~����e��Xy����������?nU�{����������V��{ZO"��x%M"�8�$�*�x%��d�D��m�N�z��%����#i=p��S������/%�#���6�f�����R�s(�5	Q��;(A�����������d��B�;��������mL[Bx3u��}����Z�<4)#R��$|�ak�^��g�^(�6j��ce��R���}a�Yns��~Q��c
��s<�E��1��W��8�D)�+%3�|���o}&E���\}��.����n&�{�z�-^3O�I�z.3���KE��
����|1�h3����������a��`=����Z�5K��z����h�n����|�s������_{���B�<Lj
=����'���y���;{��w9~���s��u���c�A���)�I��� J`p�k��/��a\�.���rq�{X{�o������	m��������L"�B�C��Mb~_���5�~W_}���y�c�&�=�" " " " " " " " " " " " " " �H�-J%4$^0�<�y�����?�����)F��������Qa�\s�����+��Bq���n���t!p/���GlYbM��;����b�2|�C�SO=��X(h�{�����K.i��r��x�/�=}h������QY��=�Y��3J9���c�3��x�:�10F��Q/H]�6����=���h�76��|�S�r����m�+������"z�w�y������_���5>Pq(/J��]w��X�/����������+1���|
�J~��zR����Ue���6��0�i�����,�9�;n��W<���Yg����P4�Jix
���k������p���n�K;����'mF|�x)��|W]uU�����G�m�p��������|���yJ�i�����5�~�W^yeQob�I��`��h�9b�1|�u>�G)��������b�]U��������,��Rs����w���mN�g���}�r���k���5�QG����R+��}�j������09�ra�'H�DHD����}�UA�"�""���eQ�EAQ@A�"���D$,�"e�f�@X�������������gz�=�3��S��y���z8_}���<���.���Y���s�T�VYv�eK�"���(�o����X���Y��`}vi��}���i��<cR� @� @� @�CQ@�P<���}���By��Z4���X����]���
�)Nd��W�(�����v�d��j�|��(m�Hv�xKx�D�O���jNy��U��?���"���Q�����r;���j����N;�&`O�4)�����m{����b&��[b�%��S����v��gf��������I��'�tR]���
�:�#cM���yn�9���YU��Y�>2�Df�C9$m��V���(� ������Y������+��_�`Y0��[���=����/��l����:&�K���J���[��|�R�������_}��>���������S���/O�-�X������S�NMq����x`iBo����F���Z�����g���@����g�b�b����+��M��I��4����8��D@{���y��Z�����y�����@=�[��\>�����KSd�`��.Z�.��ke�l��|�?���s=��g�������j�l���{x�����K�w\��u��VJq���7����~�I��������s����T�<���������}�	�8Vy2e�5+v��A_���^#�����;�z�m��&��/,��Ad#�k�7��������k�Zm����g>�'D��{�u����[�8��H��W�W��5������:��5��Y���+����N������	 @� @� @� �-����Hw�8�3'��!(����d�<��S�<+M��}�):�����9s���2��xs��c�h&��:���V;�s<cR�'>��l�f��/�|��(�.�W1���xo����������{��7��1#� ����cZ�Y���Y�/7�g�y�n������kf�k�����`����i�	�y��:1����(2�����Fy��=��3o�U�5��x�����o��2�E��w���+2�����{ �>��y|{�=�����Oy�\OPS����������?}��YPB���q�i�5��>OW\qE�	��h�Z+����\��g�P�3Z=����*�z�k�C3��V>/T:�YV�=���~�����f�����'�z����Y-�Z�y�5{�����W#���</����������@s�1�W��U��0����V���ow�6�s}�q7������u���T�W�?�����f��������V]u���Gy$��U*o��f*Y�n��V��|�����v�����{�z����8��#�l�����<���e#���O��Z���G#3j����Vl��������c�����m�{����Z�|���'@� @� @� @����l�n��@{�'&�3��<hd����xD�f���t�AY�L=%���[��Oll=�hU�BL��U���:����������zUwQ�V���o�g>��t�i�e������b���_�����1���@i]����Fd����(����\����������EY��)-=�9����)?roT�b����>�������(2�E����gg�chq���"#K�s��D��A��f����k��O�>=�x����1�r��7��T�u�:���]w�5}�;����L��"�����6�t�lfL�����L%>[��g2z����j���4�j�C�y~Tk���sv�����?<��'?I?���_�����,�k�l�.���,P�RiF���kY3M���k��,,�yF+^W�2,_^^����<�W��.�f�+�~^�d���z���9�t�QG�N8�4�-��"p�@�	&d�]�g����.�����P��M����n��7���`��V�G�D��F���j��������'�|2�[dA�g�xv�LV�Z��u�������Y��^���>�Q��M����V�����S>�z���L����N���(���oz���������KY�����y��[n������~��y�/]sU�J�B���??�8���������SOe�W^ye�&���<������K�9�?������8v����i������h��t
�D�������T���N����� @� @� @���3TE�kP�D�by���r�)�OKy�d�'�[���c����|RV��k������U���y�VN�����2;
d��>1�/y&O�����fAMQ����,SG����h�Nl��������~����w���Y��JL��R~NE�����,^y�oe��X��^{��>��t�)��9Q�|�t�~�d�C9$k�g?�Y����]
B�,{����4{k�~�]���I��6�l�x��t�=�dYP*������?���hi�����[�8C���@��@����/�������[?���SBG0[d���1!����6�j�U����k��,�_�3Z=��������i�C#}��M�</T�{_��9�%�LD1����/����*���R�~���y7�E�SZu�����G�g�<X"��W_���8������]�x���'��F�M�\�����q�ii<�G��<�M'�xb�S����Y�?�a+�;X�-��������^�/���w�9�\�es������zJ�����d\��{O�;&���R�����F�g�����s�V @� @� @��t���L����?�2�w����b�P�R^�4�w��X�����{[����K���Wy����_����F�n��;N�[��m#��X.�����##D����[�<�
_-�-*�@��~����o}ki�#�<�{u��?���}�����/R����+�}�������bv��ZA��R~����M���cR}���J�����np��R~nE��<�c���V�z�:�POS���_?.�@��J%>�_��Wsw�m��Y?+��3�����y��TO�q=�h��Iyh�����-��ry6�w�F�S�M���/����z�B�</�s`������+e�������X���r�����S#��q=/�j�{_q��L�Q�z/����c5P}h��T����w7�>��v�q����O������#;Yt�����C`a|����>�}���+R1�(�?q���G���.vR�;K�9��"s^;�kMc���������lE� @� @� @��Q@�`<*��o���R,����s������T7&ZuzYo��JC�����2�e�Y�41-2��w�}��������Y����y'������@8������������G�y���g�����i�
7��L��_��T��?|��>�]�7POY�;n`��k�Y�*��������C��: u���������T+���7���(O?�t)@������v7���<�a������SO=��72&>������n����&L���7&m��j�����V�W������}��"+�u�]�b�u������6��z��H�v~�^x���:�d������~{�.G����������k��V����+"ked�*�5�X�j��Z��b��;����a�V�7�|s�J�Q��Q��<�;�y!�x�u�������N;��n=�����_���\,q��}����V�G��_���<#����w�b�[<3�z���{|F�9��e���;t3���m
�ug�^�f���_�:������� EF�n�����[����K����bp����;g�]������k]�d!��7j]���+���s����(��t�iLw�^C��|���� @� @� @� @`0
T�5?{�O])0f����g��Q�`�M7M�/�xV/�����m�8/���R�~����W]Wo�6����n�m)*&��}���h-�����~�����0&aE�@�R��)S����b"�������-��Y2"j�Kd|�	oQb�Zd��	ol��Y�b�m�����e�z����;�(m�����X~���d�L���~��,@b��r��Z�f7�����u�"[1;Ol�#@1+�`��c8�������y�5��x�������������b��U���Z[�&M��:����-q�����J��Pm�Cq]de-f�F�+�h������E�n��g��6��z���kN��>}z�����R���q�����t�G�N[m�U��xV���z�����;��c�:�^�I���} ����.����x�=?�~�YQ"x;�g��m+����W�����8�w�<���9V��C-���]�������}��n �;y���:��+�_����L�������.����wfA�����O���`���.u?���z�5�E�eAQ�{��t�
7��2��q\�������r�g�U���;�Z3��N9�`�������'�� @� @� @� @`@�
(���(^��<�@����,����:7>�����9�����l��)��4Z��[�����#�v���O}�Tu����w��<��k��J��M��9�Z����eY�UV_}�R�UL���i+���c��j6m��v������z�<�L6�n0�x[}�����L�����
K{��G�����b�a���/}�K���k�un��w�+m���V1I8>��J���N�Ve��-����>�s�=U�s���������+#k��>���Zd`� ����*�=&����n�������UVY�4Y��*�^�������.�������:���[Z���8Cpe\s"�H�0-f��g��h����[�������/EW��<�g�����>���K����/T�6����>�j��J,�W�_���t���� ���r���g��J�F w������jm4������@<#�s]���</�h��<��CJT�9����V�|u[q�o'},�g�b���np��W�Q����z/��V��S��Z���3g��|�+��+�k���>���@����F��c��>�l7��<��o��7�7�|��6����<(��E��[����u����eA���q�W��U�6��/U�g��.��Z�MY�i���<w���5�]��M9s6K���g/�f� @� @� @� @�@��5�RK-�	�����_N1��V�	����(7�xc��G?��m����Y�����N=��lUL�������Z]�����i���n���\Y���A�c�v���,o���t}���u��g�#�8��*5��������p��������m�B&N����D�Ze��qi��6����1q��1�	]qc�x�7���:���Jr1Ae�]w�|����=}��_��=���*��,-�}*��7��������������vy�m�����tP�t������������+o���w�����;������J���M���8�#�k��b��_��m��F�b��?��-����W��{y��h���Y��l.���}n7V�X��5�������l�I���D��x�"EXF0p�s�U���=':��2���a:pa��������z���G&�8���.���f������������{�I'e#�}G��b�m�a��OJ1!���3��y&��d��o~���2��.S�NM�q�8�|���Jq�Ty��N�eq���G>�-����'Wz�A<�\|���sl�|���Nc����d�~����z���\������%�aO9����S����N������9*f��U�� ����/�`����{}+���������5^VR,1�<��V*�R�xqE�;�}?�������(�=#�UV��@��}��^��X���O;�����J��������w�<�k�N�7o���m�?��~0d5���V��,q�%�d���D���?�������}m�{y\�_|�l�]w������^�]-��=;�w�3�<��w��8��"(�X"09����*�x.���������}�n�t����N�n�~v���v<���K��E@g����/L���g���
 @� @� @�4G`ds��
��DV�6���o}+���#cZL���9n�a�g�}J����_~y����a�(U+��b6�'�t]w�u�	�#F������-:0a��,����u������bBbLp����;,���z����1	32x������6�h�,�X�?&B�D�3fd�0#CLL����
������h72����f��62�D�@��81�*OV�8���o��M��c���;�UW]5��Bo���,�ILb�����������b�p�Sq�����pVq>�D��h�`��O<��j��k]�?L"�Xd���%���Q=��l�o���a�c"[L>��_��W���u�Y'� ��(q>����}�{��cBq��l���Y����o�����yL��e����&��g ��5~�3�Z����������`���~�e�)q=\y����>����_���������<}����&�o�����o�/G�"�8&�����N���RL,l�D���~�����(�Sq|�Xc�,�KLb����]�>����R�L��w��o��y��8�\s�l�1�?�Mq���[���c���~��,�-��q��Z����-�p��n��_1�-���<��y���6�_�?s1���Y��:�E;��s�l�q��,H�Y����$],q���<%&�F ������_�"����x��g�.��3ILN-N��~���������s�I�>�h�<�����g������d{�����"��D�.�Y:�y��v?#�3]<��=%~����q��{v|w��y��q���[<�V+���?���R;G�dz������_�b��/���[d+�>�g1>/�L=�����h�}T�=�-"�c|7��I|����K�#��;{�� IDAT���'1���{����^���N�3g1�#���~�)�&��D�}�3����;�G?����s.���O<k��r�-�����l���C���
�w�<�k�N�7o���m�;�b�-�]3����VZi�y^���8��|������K������� ���}:�/����k���^z�l��7��G1 ,�o���3����sC�])^����P��������(���Oq���g>Ss7��/����D;���|'���w��&��5�~����3���I�
�t�i��S�W�~��]��g�����K3���yy��k��K!@� @� @� @��&&^):B���S� )z*�}*��0Y���Qq����_~������m4��0��g�V�s��	G�4[�Q��{]_�/��)Lh��Z��09��0i����v-KTm/��B�ZOa�n�}z
�:=��p�zaQ�zz��S��������0�+�[��P��l]aZO!��j�E��d����;�b����0��b�<�zb?�}&����l��N! ������x��0��0��T�0i�b��>���z
U�������BpD�^!X�b�,,L>,�Sv��IV���mW���M!H��hTu,q����m�����Y�B�M��z/<����i���SX�]m����7O��.,�e��z
��U]z_�
����(�����jU�[���Sx{6��$��n!���P{Zu|~}������>Tp��B�M���������R�<�����R���U*��E�l=}:�>�
��=q?�]��F������N������3�+dd�=zt�cQ��)��&OWbiY!Kg��BPzO�K���U���b!��j����g�Z�_�c\1�g�s���p
�Z���_�����
AKw�����<'���$��}���Y��y�R~��g�j��p�S�����[���0�=?�
��R!����W�k��Zi�}���z�+d~����\�y��_�j�i�9#���J!�#�\Vk/>������[x�E�n<3�U�;O!�t���o��>��������U�������n�n^�Q �������Z_o�
A�=����g'�E���T*�<W�=*��|Y!����so���2s���M�u���{x-�UVY%{v-�p���SO=������S��z�*S<�Tz>���
+�}�	�b?|����z��z��=����{H��������)Z2�����K�*���9��*�,�b=	 @� @� @� @�~��
�'Z���~�3
AC��#s@�
:2UD�xKt����m���#���[�#KW���e��,��k�=��3�@�vk-��P��x�udB��.���x3wd��� �,a"�Sd&	�xSwd��7�GV�xcz�}��v�Wf���
!�Ad9��f�l��x�w��8����0�$7Gd-�~N�81�X��"�A!�';�m����of%�Ls��x�|�
�8n�������*��o@�}D����T~��l�u���U���j���Y%�G�ed��,f�u(��x�wd���]�!'2�D��:<��[�#kPd����G����Y�6�`���"G�8�s	�x�w�Q��K/�2F�����T��2~���#cA��fXO��}��/�uQ������\"#Qa�y������<�s��q"��E]�
�jY�����8����#�QbY�}�V�� ���3�������5��?��C_c���q��,�q�D��8�"cFd��x>�kJ�O��*�Xg3�h������#�n<��]d*��od��c��BpU�}�������Y+2��{��Y6��l�8���|���V��V<>�>��9����^��"#\\�"gdm����D�,�\d�*>��i��u:�y�����9�������N���<��#����a�����p�l{q^D�{���J��gdA��X|�Y=��E��B�E�59����x�kad��V�}������;@dP��9�9��H�}/Jd��r�-��>���{_�Z��������F���_��W*��!�������U;�3Z\�����'�����'����"�O�Y^Z��yvR����]�K�Z��y���nYR��4���-Q7���� 2���4�<����q�u�e��� �F%�/�Y���}o6���7���j"�����o\�w���N������f���o<��>�[��������;,�6�	�_}v��c�'�:����E��x>�lj�-�r�i���_�v>����V=�������g���S��[�����L!@� @� @� @�������4�4.p��7gL�Dp[�)��m�����(1Q�����P���[�����bGuT8��c�e�D�Q���B��Tx�z)P���n*]G����h��P���q�������Q�F�
6m @����������D�g��!�E�_�r|��������lD�l��6�,�U��X������B� @� @� @��# [�lK�����YF�(�m�V�wG�Z"[cl1]df�+KJd������~�c"[@������j������s��#e @`p
D��b�~���e�T"�Wd6�����n�9?���U8�[)�m��,#@� @� @� @��|���?# @����ll%2�E�B`�	�p�
������������Vi�m�Qi��/�X��e���sJ @�����J��+_��T�-���Y���<k�����H� @� @� @� ����:�CX����*�n�}��#5�nx��GK�_a���(��F����k[�	t���\�y�&@��(>KD���_>w��g�N��O���=:�;6��* �~�7�|���Q�F���H� @� @� @�CN@��;�D��P��O�����l8[n�ez���=T�f�Xb�%J�����u"��9��S����[��VE�,�3��G��	 @�@���s��MS�L���i������������ME&0u������7`��c @� @� @�:�����4����������lD��
K'�x����W�}�{_1bD����/O'N�It�w�M6�$3�m���i�5����
��3�, @��#��v��6���?��}������93s�1��#��������^u+	X���v��g�:��l��� @� @� @�����!1
� @�@�t�A�-oyK�����%��W�Jo��F6�Xg�P�`��*0~����/9}��H===)&�F��v�!���Ji�EI���j��k�����nK��w_��5�X#���U�a%���s6 @�������.���4m����?�1����i��vJ���nZz���g��^z)=������s���~�^~��l��v�����7��?]�-M���{��G�V]u������>�����=z����.�4y��#@� @� @� @��n���G��	t_|q�1c�|���'?�N9����[@`�	�p�	i��Q)�����g���S�Dp��?��,�CL�S�/�3��JM @`^���<yr���?�����4k���i��Z� ��~����W�f /����k��s��q�)>�
 @� @� @���� ��
��MX���7���93-���)2K���~i��wnB�� ���a���J�\rI���o�[�>}zz�����/����������V[-m��V��@Z|��;cpzI`
��
���K @�C"[�]w������t�UWe�~���J�����Zj�,���k��v�q�,S�B���Xf�e���z�7n\��U}��_L�n�����^ @� @� @� @�@�	�)���� @� @� @� @� @� @� @�@G��^�$ @� @� @� @� @� @�t�� ��<l:M� @� @� @� @� @� @������I/	 @� @� @� @� @� @� ����:���4 @� @� @� @� @� @�:C@[g'�$@� @� @� @� @� @� @�@G
b����� @� @� @� @� @� @��Al�q��� @� @� @� @� @� @�) ��#�N @� @� @� @� @� @� @�3�u�q�K @� @� @� @� @� @�t�� ��<l:M� @� @� @� @� @� @������I/	 @� @� @� @� @� @� ����:���4 @� @� @� @� @� @�:C@[g'�$@� @� @� @� @� @� @�@G
b����� @� @� @� @� @� @��Al�q��� @� @� @� @� @� @�) ��#�N @� @� @� @� @� @� @�3�u�q�K @� @� @� @� @� @�t�� ��<l:M� @� @� @� @� @� @������I/	 @� @� @� @� @� @� ����:���4 @� @� @� @� @� @�:C@[g'�$@� @� @� @� @� @� @�@G
b����� @� @� @� @� @� @��Al�q��� @� @� @� @� @� @�) ��#�N @� @� @� @� @� @� @�3�u�q�K @� @� @� @� @� @�t�� ��<l:M� @� @� @� @� @� @������I/	 @� @� @� @� @� @� ����:���4 @� @� @� @� @� @�:C@[g'�$@� @� @� @� @� @� @�@G
b����� @� @� @� @� @� @��Al�q��� @� @� @� @� @� @�) ��#�N @� @� @� @� @� @� @�3�u�q�K @� @� @� @� @� @�t�� ��<l:M� @� @� @� @� @� @������I/	 @� @� @� @� @� @� ����:���4 @� @� @� @� @� @�:C@[g'�$@� @� @� @� @� @� @�@G
b����� @� @� @� @� @� @��Al�q��� @� @� @� @� @� @�) ��#�N @� @� @� @� @� @� @�3�u�q�K @� @� @� @� @� @�t�� ��<l:M� @� @� @� @� @� @������I/	 @� @� @� @� @� @� ��#;��:�����R������k���s�Hs���z @� @� @� @� @� @�@m�������5*-:f���bcko���S(�j���(0��W�O=��) @� @� @� @� @� @���
,��i�	oMcG/���lO�@�����x�	<����i�e9rDZt��,�y�����V @� @� @� @� @� @������^{}N����i�K��7�|3�d�e�Jo]r�Z�[O�@��@�I��l��+�"�y��w�	 @� @� @� @� @� @��!'0��Y��g�������e��qK�e�������U}�������Ad`6lXz�r��S� @� @� @� @� @��+�����o[&�>��ii�+���T=r
b�	���������l�
i9Zp����� @� @� @� @� @� @�CV`����2������'��0dk`@@���e~��^���x��,xm�1��o�& @� @� @� @� @� @����F��^�='����ul�*����~@���;���s @� @� @� @� @� @`h6,-���� _|i����h�� �6��]}��6;�`��E��Pm @� @� @� @� @� @�@�c����x�����Ru�	b��c�����YF�1�}� @� @� @� @� @� @`h,����g��3�jt�, ����vW�@O���GJN� @� @� @� @� @� �J�#�j��������	t�� ��;�L�p�t IDAT @� @� @� @� @� @���	bk��= @� @� @� @� @� @� @���u�!7` @� @� @� @� @� @��O@[���� @� @� @� @� @� @�]' ���� @� @� @� @� @� @� @�}���gmO @� @� @� @� @� @��:Al]w�
� @� @� @� @� @� @����>k{"@� @� @� @� @� @� @�@�	b��Cn� @� @� @� @� @� @�h�� ��Y� @� @� @� @� @� @��N@[�r&@� @� @� @� @� @� @�@������ @� @� @� @� @� @� �u�����0 @� @� @� @� @� @��' ��}��D� @� @� @� @� @� @�����u���	 @� @� @� @� @� @� �>Al���' @� @� @� @� @� @�t�� ��;�L� @� @� @� @� @� @���	bk��= @� @� @� @� @� @� @���u�!7` @� @� @� @� @� @��O@[���� @� @� @� @� @� @�]' ���� @� @� @� @� @� @� @�}���gmO @� @� @� @� @� @��:Al]w�
� @� @� @� @� @� @����>k{"@� @� @� @� @� @� @�@�	b��Cn� @� @� @� @� @� @�h�� ��Y� @� @� @� @� @� @��N@[�r&@� @� @� @� @� @� @�@������ @� @� @� @� @� @� �u�����0 @� @� @� @� @� @��' ��}��D� @� @� @� @� @� @�����u���	 @� @� @� @� @� @� �>Al���' @� @� @� @� @� @�t�� ��;�L� @� @� @� @� @� @���	bk��= @� @� @� @� @� @� @���u�!7` @� @� @� @� @� @��O@[���� @� @� @� @� @� @�]' ���� @� @� @� @� @� @� @�}#��+{"@���
<�����/L��:9=�������O#F�HK.�dZy�U�:k��6�l���[��Z������k�-�-���Z+=��t�7�Q��b��M���z�������8����p�M�����?��I������n�|k�mo���t��I����>��O��^x�4a��i���L������;���G������3f��O��������2���f= @� @� @� @� @� �Alm@�V`��Y���M�O�����;_g�N����w7��N9��4v��t�I�N���g��kAe�{��7|��m��6_�9s���3g���~����%�X"]v�i�M6��� @� @� @� @� @� @����6��� P&�S�m�M�����qYp��RK-�-�la�g�.�����?�������m�����X w���8l��c�[�e�+�q�u���~t�R���Q�F�q���^x!�i�<��s�����<AlQ���"�<�Z��O�S!@� @� @� @� @� @��@�����_� @�@]����<l�l�m:�K���6����Q�I��oH^pa����k�vx�������@U�h���M���i����[�	`�����? �b��������O����6�y���)S�����<:����m�t�UWf��]v�T�~���$@� @� @� @� @� @��* ����vF�@;����t��W�vy��_H'�r�|]>|xZc�5��/�����4}����Y0��+�����o�R���v�5�H�m��|T�-�\�g�}�g��'���s���c��c @� @� @� @� @� 04�
��jT���?l&LH�<��\.;���\����w�����#������*��;
6,dS @� @� @� @� @� @����=C5R�M�����4�M7�4-���F�������i���J�������{����i� @� @� @� @� @��\Al�{����/<�|�F])����7�'�|������+
���<a- @� @� @� @� @� @���# �`�K#!@����E--���w'�l�;E&O�<Oc�o�}�� @� @� @� @� @� 0��
��i0����:�_y��t����$���|W����G��VZ�I-k� @� @� @� @� @�j����5J{~j�4b����'|�v�m�W\�^z�%R�x`����+��R6lX?Z�) @� @� @� @� @� 0��
��kl�\`�UVMGs�<
���������/�t�d���!������4s��������������o4���nx�����g�������.���������X�B @� @� @� @� @� @�@bs 0��8������Hc���g�Hv�]w���<3�����e'�O�����������9s����Zjj�"����6 @� @� @� @� @� @��!* �m�X�"@�?���o����QG�����i"0���.���}��#���s+���p�H�G���3l��J��e����s�3�4r����5{��y�U�3�F @� @� @� @� @� @�]+0tB�R8CY`��q��#���<��Ci�����?��n�������(
=�����S�K/��~��3s�|�K���{l��]i�
7L7���~u#��"����+���= @� @� @� @� @� @�C[@&��}|���
+��R�k����g�(�{�}�����>������j���s��o��������.Z��5�e( @� @� @� @� @� @��>��Ic�"Am�:����_�2����?����BP�8��_�����{{ @� @� @� @� @� @��# ��{��� PC`�-�H���k��m��Vc��]��Zk�?u��4k����0r @� @� @� @� @� @��� ��<V �m�l�����}�����ovA�����:�z===i��[rm� @� @� @� @� @� �}�����1UZh���a��U����v�����g��I�
b� @� @� @� @� @� @�@��������n�2eJi�K-�T1bD72���WX!m���z�\|q�:uj��T @� @� @� @� @� @��O@[�s#&�5�����m���{�3f�H]ta��Fm�{�n���#�\�������w���o��x��W�c�>Z��
 @� @� @� @� @� @����64��Q PA����O��j����vJ7��7����B�/z���v�>M�6�Tg�O��g}+R�b�-�'���Dq�o�v�y���3�T�	�k���6X�t�wT�c! @� @� @� @� @� 0�F�!����_��?~|z�{��������-5.
><=��3����H�����d�~���;�O.��O�v:�������_�������Y�y���.�Of��*\s�/��[l�g�;
�c�-:����V���������J�
��^z��G������������k�~���N�����<�n���������� @� @� @� @� @� @����6t����z�R+/O?�t������je���K_rI�*��{��7S��-�g���j��F�����^=��K����n��1iR!p��{��&M�:���W_MW^yE�� @� @� @� @� @� @�����A��!$p�A����:����i����9�u�]7�7��,��"�,R��
�=zt������'MJ�l�I������WL��pB!���}U�� @� @� @� @� @�b�
Yyz���g	�}���hV[y�!4*C(��z(My`J����4���Y7[t��������Z;�?~��6��;m����?���y��4��i��Qi��e�k�'������X
� @� @� @� @� @���'������+����6@�v�O@[>'� @� @� @� @� @� @���bk��V��A� @� @� @� @� @� @�Z% ��U��%@� @� @� @� @� @� @��$��I@� @� @� @� @� @� @�-��2Z
 @� @� @� @� @� @� @�� 6� @� @� @� @� @� @��L@[�h5L� @� @� @� @� @� @���� @� @� @� @� @� @� �2Al-��0 @� @� @� @� @� @�bs @� @� @� @� @� @� @�@����V� @� @� @� @� @� @�  ��9@� @� @� @� @� @� @�-��2Z
 @� @� @� @� @� @� @�� 6� @� @� @� @� @� @��L@[�h5L� @� @� @� @� @� @���� @� @� @� @� @� @� �2Al-��0 @� @� @� @� @� @�bs @� @� @� @� @� @� @�@����V� @� @� @� @� @� @�  ��9@� @� @� @� @� @� @�-��2Z
 @� @� @� @� @� @� @�� 6� @� @� @� @� @� @��L@[�h5L� @� @� @� @� @� @���� @� @� @� @� @� @� �2Al-��0 @� @� @� @� @� @�bs @� @� @� @� @� @� @�@����V� ��K.�x�����o���[�� @� @� @� @� @�d��� @� @� @� @� @� @� �2Al-��0�W��{�)e4��f/��r��=e�~�#�����8�
 @� @� @� @� @w0R� IDAT�Z" ��%�%@� @� @� @� @� @� @����h��#�>�zzz�F������F� @� @� @� @� @�:L@[�0�%@���/��b�
�N�! @� @� @� @� @�h���6��n @� @� @� @� @� @� @��u�A7dZ#���oN�~�Ki�
�Oo_~�4v����qK���[7t�R��[zzz��IW����TZ}������L��e���*+����k�����9sr5��Zk�Q-�����U����^+�����+��>}�<�����z�=�h��W���Y{���[��%�X<��1G�^x���m�z�w�i3��������RK.1_���&�w^���+W|�;Jm\r�%�m&O������i��WJ����/�tZk�5�g?��t���NqL*������o����f��=��������~�V���X!����g����<2=�����*V|����	'���f��\]l��Y���m���{7I������Lq>����~���x�����	���>ca����L�{lz��)������	i��7K+���;��b�����$��Az
��T�	���Q�GDQ������^��t��	M!���zB��fy��.k��d'!�y������Y��V������'��V��9tW�<x������.V���YQ������y�7���[�J��]�����sZ���w���G������h��.]�����o�v��W��'���c6k�={V�L�M�o�7��3���Kyz�]��w�������X�e��l��9w����Im\����@@@@@@@@@@@ ����8 ��8 ����-[�8��
����_����G)��o�-_!�3gv�k�8u��t��_��c���S�N��,Y�X���K�<e�T�h�r��K�����_{M"""lvT>�3k�LY�z�����K'�lNS���c��\p��}�v�������3�J�UI�.�g���,�>l��p�}�,<<\�G���[���
z��]���:d���w�a����E}v������/.!��8��v�
"
8P��a����������I�V�d�����l����
�EFF���@��(W���Wo�B{��%K�r=o>~�X�|��|��(���������-x�`�BI�&�7���*���YS�7�n�.]�Q�6��-[����u�?~�]��B�j^��Y��9s�QV��������5L@@@@@@@@@@@�� ���������k�H��m���[�]��K��E%�T��}[N�8!W�^��U����p�!6���U��T/R���T�Vu)E�r��a=d���cG�a�����������}���l�"}����#i����ZP����r��a#P�*_u��A6l�$>>>G�R��|��G6�*���?}��/)R�p�Vu�+_���]���7a�x�i)S�b����Y]3���<��l0k������RcX�+VL�h��k�����>�����������_�-g�� ��Z����E�����X�>�Z0��^�����*��*t���+��w�P�B�[��B����un*��>�|��S���$�V�-\{����uT�p�������2c�,�g�%v,�5���l��9���
�Z��?���y#>��twv�����kT��R����W��Z�~w�����zue��}6S��c�7�,Y��?���?�*���[����gs����<9�S�-@@@@@@@@@@�����^@fx6T��:���[�
,��u�27��]��m��ZE'UQ�U����`S���Y*�����_���g������Z@N���t�,�v�s\�Wc�#*���_J���%u���V����=^�5�W��U�/�3�� �}O_�Cloi�b�Z��]z�1e��E����T�TI�C�}���#�g��)�';�{���c�F�t9Lr��<�l:t��>�D.Y��@���C����.U]���5�A���+�`��!c�j���� y������[�b����d�v�j����Q����*j��'O�����I�y��;w�������O?5B�fG��a���F�T���~�$e��5��PX_������?�����t���lI���Jf�>�Dr���U'u��5Bu!!!��};9��e�����!����o;�ww�n#�V���b�<;\���c��6U�O����eK=��*U*�y��VAn�������
�����_����NubSgUp��:ki � � � � � � � � � � �0|�18 ��z��iT`S��+V��o�c`Sw���+����E���I�%u�^�w�j�JY�v��=T�������TU�;��i��y'���'�/���*L���I�C3���r������HV�z��-^���gs���	�EU��:m�L�1S^�U�����
�}����}�=t����V�b����s��&�������Jac��=��C>�
���u���

���e�V]�>����G�5�g�'Y�����x��
n�����O�6n���
�lj�
H5o�B�i�����9=����3*��gs��U66u�
�����&P������n�2���V�Z�@�+��*���������������Q�e�&��j����a�2e�wI���o �����	��1����[W�khh����CWM/-�z��Z�����3� � � � � � � � � � �^ ��El�B�gG`����q�F��>6�������o��48��N�*
YZ�\���j�e��WI�:u���*���#��THO�����j��EKch�V�)�����V�Z�<R�"EEU��F5j��M�r�d�U%2��?�d�t������f���3FwN����h6_�e����P���`�%t�����Lu{����@�����+Z��A�9]O��>��
Z��+Wd��%��z��o�~�/~��T��d���XB{�&i�]U��U+Q���p����@��M�:�a��CU���U����]�pN/b@@@@@@@@@@�&@��k�l�������b��
u��=���v�����5w�6e�A�6m�.U�����S���Y��.�R��,����.�zs���O�0��[��+<<\��^m�����l�n�](/�T���q��4QU�,��h�}������i����[O�������js-ZF+��}��$o�|���F��f���/z�XT`1���n��U�J����Ms:���o�z&TX��-^�Xn����w�Y�ff��C@@@@@@@@@@�x �O�l��[`��M�
��*��N�:F7t2,L�]�f�Q���n�{�n��=��^WJ�,�r��LA���[�\���`�:u�����[��k������cN�z�\��ZW�rV��T���Z����.�;��K�<Z���TIU���F���{��1�(R��d����������gw��_*����AA���[�N@�i�dM�65~+U�o�����O3�[�i#i��1�G' � � � � � � � � � ���@TY����]@�D)p��a���������Ze,�V�`!�K���_|}}�������g���Y��������'����J(�L��U����8t���d��)��q�<�bW�.c^������+WN*W�,��m���.]"+V,����I�5�b��R�lY��%�����<z���\�}c����R�Z���
�*hi]I������ �ce�����T�RI�v�e����k�N�"�����^�6k�*�u������� � � � � � � � � � �� ��gvA�gH@��"##�;��)s������6kxP,Y�d�6mZ�T6�q�F�����H�8��$K��lY�_
�
���l��a��InjU���i�gH������P}���e��u��������i"��xCr���l�8��f���)����n|K��ei�U�K����FU����"E���:��f����]�u3Bl7lU�2o�|��f��n�UX�L��N�1" � � � � � � � � � � ��>��- �^�{���~)�JA1m����{ZQ��,���{1=F���O&����2��}���[���!_�-�K��ia'N���~#eJ��+��G�w��Y��w���+E�����'O��G����/��Xpp�^EP5�L�6��d����w��%����#� � � � � � � � � �<������[C��H�>��*h�f]��iwL�.���Z#22���""��xt��I�P��c,v��T5����G��e�6��I��.������v��s�e��E���H��U��7���}[��k'*��������T�4�Q���EZ�7����z����f�?W���=~����>7��u7fXW^��e�=zD�����m��Y�a@@@@@@@@@@�Bl���� ��T�%K�,�=?~<���!cF�5.���v�k���uU�����X��U��y���tzG k���FW�\��M����A��2d�P����zH^}���odd��7.��a�A�lQj,V��Q�����/���{������q�����]�{ ��E�uO�>-���~���QU��7o.*lHC@@@@@@@@@@��'@�-��&��@����Sn��9�'.Z��M��]�~N���M�Q��,�v�m�9����� ���<u���P4�Op�+V�z���=+/^�����+s����u��n����gP�,XH2Z;�l��3k<x��g������x���Kmp���*���������	�����]������S���;2�<c��]�FwY�#� � � � � � � � � � ����y	�m@���U��qC�v�����;F7�6mZ)V������+���r�
cN����D���e2����L�X:7lX�r����4�v��uo����.]Z2e���f�����-�5h�����m��G��^�J�,Yl|BC�Ms������K��r������T�X��������USU	�l�
�Z_o}]�T�$]�tF��wl��m�>�.]�;v�F�~��v�f�,Y�D&O�$������U�>������[��S/�� � � � � � � � � � � � @����@��@���W��o��
y����U'22�t^��-��5kV�}�5��Tpc��IFW��M%e�����*o���������M���F*��Z���%y����BB\�����,�*V�=�KG�)�"�����{N_O�P��ND��o���k����<[>3g�����wo��.����{���k�L���r}���7���z��<K��qcm�s�Z�r:��[�z��y*��~�:���1��s��mC����|�{�)SF��+�w�g}�������:��x�~�M�4il����\� � � � � � � � � � �6��x @��H�>��;h�q��M�����U���T�����%g��6�N�:�����
�u�o{Q�����w�K�����U={E~����Y��
;qB��c?E>|(}z�U�(!5UaNW,��O?5�;!�36���O��#�������/��dv��%5j�-R�iH�k-��V��r��Q����w�L�2����KQ�\^����W����*�}���2r��.Cz+W���/�3=����t����?�L?�t�
����3cL�
,d:Wu��Q��3{�����a�����S�.��p�:������
�M���{a�ho��[w���P5�l����^�@@@@@@@@@@@�{Q�m��';!���@��o��M�e�����Y�p�l��QST~��d��Y"n����0Y�z�����*h�z\6l���V}=\*_��P�%�W�)R������9|��>G��{�����
�������H�\���^�yG�o�&�4j,����������S��o�7��K��/���wMv������K��E���jI�Z��dQ�5�R����!�ob��}�t�����gi�g��;v8l_�P!i���CPP�L�6]^i�@�v���X��V!�?R�^=��'�������_:��y�lX��m%�������O���E=e��+[�������X�j���;W<x��+s��������U���K�N���0��d��Y�Zs+U���������t�[���H��Y�w���������x���Z�JZ�n��W����+d��i��
�~���N�T���A���k��Vv/��+�����w@�}{���?�$*�����:u�J��y�����Y{��!?�0N{6�I����>���!C�����[
��DDDG�[��d����u�� � � � � � � � � � �@R ��u�bE@U@�=g����[���B**�"�<��
������Z��
[�����5k������P���F��6Z�C���g��y���*TX���:	-��I�:�a�z����T�y��D�o���j�m�b>|��1���*s��
����\U�l����o�J�����#=$�>��T�K}\5Z�7�d�����8S�����K�����p��C�>��������-��
h��k��%�j�����`�"��/�������`��@_��������H-������L�����9!�c��'�iZh�Y�W�*�*��>�-g��	"��~X���A�p�v��
�%r���%�@@@@@@@@@@�|�@xz��ZE����~[&��U__�?�*�V�J=�V�p���S-8�PT(�Y{����jI?���3���������W���)��Tbi��6n�$*4�����4y�,Z�X?g�EU�R��rS�����;�t��(�~���-[��
j��W�6�={J�����4i�H��e���^
:;����n�;v�,X��4I�*�����E���Q*��u�v����W���	���;�@�'��/��+��1  @�h�;��&��*������j����	��H(g/Q��q�7KU��i��a����78�Kr= � � � � � � � � � �X	�hy� �@B�s��~��By�96����e�f�p��\�~MR�N-y���J����n;z������K���c��)��*]ZJk��	q��sG��[+G���J�\��!����G�h���������+��e]�{��I��V!,��(QR�sE�4.\������'O���z��H�"R�B�A�hmG��N��;wj�.��[��?��-,�� ����vU����%,,LwPk���Sj��)���4U���?���g�����y�J�Z�����i����U^0*�����Q�Lfy����lY��zTS��}�����4@@@@@@@@@H����o�lq�E��w���b{z;����� IDAT�!6/ � ��D`���R�FTu�=Z��X���~��u�����5&O�*m�����\� � � � � � � � � ��[�[���8}��M���T � ��
|���F��"��Zl����������uk�@@@@@@@@@@@ ����z,� � �@�
<~�XF��JV�Zi����7be��k�4����������X�e@@@@@@@@@@���8 � �$8�9s���y����{r(4TN�>m����/J��Mb|��7o��]��u��-+����1^�@@@@@@@@@@@�Q���	= � ��,��kK�.q8E��%e�������0�������� � � � � � � � � � �� �M0�#� �xW m���?~i������O��I��� � � � � � � � � � ��H����b�#�{�W.�7wai@@@@@@@@@@@@�_��GO��([�$ K���� � � � � � � � � � � � � � � @����@@@@@@@@@@@@@�� �[��� � � � � � � � � � � � � � @����@@@@@@@@@@@@@�� �[��� � � � � � � � � � � � � � @����@@@@@@@@@@@@@�� �[��� � � � � � � � � � � � � � @����@@@@@@@@@@@@@�� �[��� � � � � � � � � � � � � � @����@@@@@@@@@@@@@�� �[��� � � � � � � � � � � � � � @����@@@@@@@@@@@@@�� �[��� � � � � � � � � � � � � � @����@@@@@@@@@@@@@�� �[��� � � � � � � � � � � � � � @����@@@@@@@@@@@@@�� �[��� � � � � � � � � � � � � � @����@@@@@@@@@@@@@�� �[��� � � � � � � � � � � � � � @����@ f������{I���%SPFI�*��g��}�d���a���#F|fz����-c�N�0��1��1����U�b���,_�L��n-�����F�Gf����s�~��Kcv}\�r�����C\��SBBBl��{���/�� � � � � � � � � � � ���^��M@�$"0y�$����<|�0��1���w^�5�6u�w7e7@@@@@@@@@@@�	b�#�Q'��	��N�Z*U�$3����110 ����[o��;��f��)�O�6�O'IM`���6�L�2I��e%}��E��~�,+V�A���;}����5�t>� � � � � � � � � � � ��'@�-�,Y	���
�X*�e��E���)��g�X�>`�.��e3!6����L�<����j�����H��)=����+��X�
��b�H�I � � � � � � � � � � �@������@C`W�.������V�
�gK�D�Iy���~S���{�n.�&$$���_�~����le������1VVU/i � � � � � � � � � � ���%����!�@"�n�6�s���9jl���I~����{�n�;���$o�T�%K&���I���o@@@@@@@@@@��o�<5�F����S%�M�O��H�����d�!� � � � � � � � � � �$Bl��w�� ���\�"�S�t�����8e��o:�[���o������{�j�Jy�`�_�e)�?�d�����k��.�������>[dd�|��7�b��3Gv}���b��g���0n��Q�b��x���,]�D:w�(�J��,�3IZ�4�)(��fM���Q#�����g?����������[���,�),=z��5������V�o����	+u���
dc������J�lY%(c)Y����o<�ov��i>|���[G��~N�w�����\9�=���+.��|����<�`�|��'[�,6��/W�a�r��%s,�����^�*s���>}z����L�.������q�F��w���K�<[�j�����[�l��)H���w��^�6m���h��~N���������~���8t�\�~��3nX���w�~��+�y��z�-����/�%�w��������z���_�'?M�(�JO�` � � � � � � � � � ��
$@���7o����KTh���;wN�g������K������???��6}*���Mk	;q�������>�f����~p����S�NI�vme��]�Cr��m�sL�?&��/��_fk���M�9�u���z-[�p8���'e��)2{�,�3w�4l���%����i����l|��Q���I���y����I�"*�h�._�,��s�NQa����K��=���n'0��w���Y�I��gV=[kV��a�|��^o���#G����������>S�L��z�����~���'����DDD��{����z���?����p�{���G���U8P}��['?�������(X0��f=@@@@@@@@@@��!�$�Ss� [i����
H�m��?����n~�X����{�l�L���3,��M����W
((��jN)S��+Zh���#r��}Q��T����Y�h��I�����;*�^i���,-C�R�X1y������_r�������i���:�*��* �*N�����$"2BT)��;w��/��{��pi���p��$K�L
,$��
^��UUN5e�I���������0����5b�<| ���1ly���<y�J�V
��������ZU�J�<����@�[�g���Qs|||��SE�9��������������V.>����]���'�>�8N��}$�I����S{���	��3*TH2d�(O�w���r��q���u����[��p6|���.Z�P�v������;wn��/�\�*��0�z��jA���~���~�l��W�S�V/�kA��-����;v�
7�z�5���?��'����h���U{�TcS�[I��a��)%44TTu=��sC�o�����=���LF@@@@@@@@@@ 		bKB?6���#��]fU�.X`�����+�z���
caUU�e�V��y�R��,�n7o��~���T�DU5r�:����z�4l)R����})�������*�
����>m��u��������Bvc���v����3��������Jo_���zh�2d�d��I_V��&_}5J����3�m���YPv�bS��'{�������V���
u��Iv��������WIpp�1��*�6d�F�Z��J�
	Y7U�j���2}�4��}��Zq���u����_�	�u��]6&��3gNi���4m�LJ�.��
��
^~��`#05r��R�N������pE*����}�g`����������k��.Z�m����z�����^����N�;�%Xx��y���u�"�j����k�H�z��]7������X�Yl]�v���/$  @?�����&Z*��Jz�y[�M���� � � � � � � � � � � ��s_�C� �<��7�#G�������}�M�������� <�}����'�
P�+V,��7]�G-���1lj@�A~�q���N[��o���}�I�lj��h����o�V��e�������;#��.V��O�
j
44�Z�x�����D�Z�x�M�M�U�pY��7=��������;=��
D�US���3g9���
��QCL���w��1%0h�{z����S)_��C�M�T��N�.5j�4.�8q�SF��TS�0�[[���
��K��s�=�t�o<��y�$=(j]/G�2{���5�q��K��k���X������0�o��&��o��$
@@@@@@@@@@�/@�-�f\�$*��%K���\^UR�4U����#���M���V�h1QU�������n6�����3�X�%�����UPP��y�	�*��a���Y�lei��U�*>[[�
���e�T��o�e-_��>���v��+�d���~���,Y�8���(PU�n��f��z^��1�:j}�
$��5����U�S��YS���o�c6d�����J�*�\��h���K'-Z�4��k!��l�����^u��|��M�n������5�#� � � � � � � � � � ���!6Gz@�$+�*$e������g�:X<y�D��#�BW��-DA��b��%88���C��<fi�BC�c�Q�N]����V�tc����r��9gS����*�c��uX�����a�z�i6���jA���o���3n�-jlp��%Q��}S������j��~�������
�y�����z�5o��(e�D�cg�:��qyq,V�PA����tUUI��+��k��v:�@@@@@@@@@@p.�p>�@�gD@��B�`��!��r��-y�����=x���~��
�;?~����y���T�������������M��*UZ,�����N*V�(�5�8�c��Ug�R�\N	���Y�[��7�U��k��9sJ�9���y����K^}���=������S]:w�1c��T�r���h��sG���/���~��U��!�=2��v�����]R��������*���V�����;wn9u���i��7��R%��cQ�����l=��U�BE�<i�~�����CO*���}�7 � � � � � � � � � �	M�[B�E8 ���2���d���F@��m���
�Y��;k[�,_~�U�,��������9�z�������V���-ZH�\��v�:�B����+V���H���5�'ZW�3[��R�7��ev]\�e��A��]��?�b;u����r��I���e��m����Kd���R�Z5�Q����N��eE�h�8�U�6�Y0~����=_��E�c��e???�R��'!6o<��BjfO�,�~����5q���@~�K����T���������vA& � � � � � � � � � � ��%��[F��%p��Ii����8~<�7�*��7��l�������=}z�s,��WO>��3��b�_Uf�:e��Q-M�4z��K�.��y��\u<m����q5��������n����g���3�I��r�P�>���CY�n����|Z`�I�&���7�� �����+�]���~���w�FTDO�/�dz�C��q��H�x������w,����oXU���� � � � � � � � � � �$Q�$z��6 �$T��&M��d��I�d���r"����%w�������3�m|||����o��m��}��`�R�~_�F��k'M_}U���,6��U���:�w��=�Ss��-�w���F����K���v��|��7R�t)�R����cG�U��F�M=���;H��[/��_���;6���]/���f����x�d�+/���_��s���]O � � � � � � � � � ��$�R�Z ���>m�>|H�N�5/^"���q���[�\��U.�}[����wk�]�BV?O��Wc����e����u�Y�z�\�t��D�|G��~��2�����H��U,}�t.�I�*����W�������5�]�n�Z�w�Q�����zH0$d���l4s�a�|"�P�
������'��d������Y7�}��]��u�����s����H���}����]�c��|G@@@@@@@@@@*�� ������K��k����
������Y�\����N��<y���9�&���J�R��k�n2����
r�&O��3�L�4I�\��l�D���ey������c��`������ i���:T��s����W_mj\�|���n�$;�~������}���.l
����n���!^�xQ������K��������?�D�f��������	 � � � � � � � � � � �b�A@�@�����=�� �'=q��qM����^�k�<y����
����1g��.����!!n�x:!Y�d�N�6o�����:���<x ��uy[���;f�)\��|W�y���9s����m����D=f�~�@�����B����jU���\U�s���-kLQ��.7��:��S��-��xRz���u	�����es{
@@@@@@@@@@@�V�O �����j�9{&�'�{��q��V��]�=g��)���#�j�6���u�����#����n����*U�H``�q�����]"Q�_�f��sn��Y������W��r�'�
4�r���E��^�J�,Yl|BCFw	��
���u�L����V��	��
 IDAT���1H����5Uy0k����_~q}��E�\����s6�����	����n������c��JH��Y@@@@@@@@@@����D��N�> ����1����wQ������0�v�ty���-3g�p9�2��s'c��C�2����^7t�P�c1��7oKd��=&�%�k��8�e���4��*hU�X1��v",�5{�]_{���j�����13�g����/`SUp����&s�,�ku���4q���z���'��
�7�2m�T�AP��52Z��trL�O���yW�\�9s�8=����q�Fc�E�N�2� � � � � � � � � � ���9�a�w��4��^�L������o��z|���ksUf������ji��5�8$��AC�^���V��o�
�<z����{������,Z�P�x�^���^����{N/y���|�mQ��Z����B,T s�a<=zD�y�m�J[3�����������x^�������������C6��32e�d����^r9?1�Z����[>|������[J�6��+W��?��O���k��/]�D=m��<��Wb���4i�H6�_os�����y39u�������/������������[W��S��f���O�; � � � � � � � � � �x �y������ ���;�
��6^���h�B	.^�&���K����a�Z��1��
�DFFJ����G��R�FuQ��.]�(k����S����*U�������Kk�w������5EU2R����G�
�DJ�.���Bv�����K�4i�[���9<i{���N;H@@�4l�P���.\X�����^���l+Z�5`��J����cm��}�d��%��)K�={�����a^�B��M�6�����r��7n���'�:w��Z����+�x�"�={�1�h�b�o���z�#�u��|��R�v)[���<y�D��=+�W������3g���_s���0���AZp��|��e��|%)[��d
2n/@�f��ez��������*�J��7��`���$�v��'d�����oK�9M�6����e��)S&;n��o�N���;'������"R�`A�q���\���X�b���-[���u�s�d�b���1Tx��y���|��_�:u��^pi�����*��^�z����)S������1c���S������K���z"� � � � � � � � � � ���!6sz@�#0z��z�b��u��T��>d�P��f�����a~��_���T������?�-_��2}�L=��I+X����l��m�F����j�\kV�6.W�I�'���>O�f�
�
iY�����`�k6�}�������9;��f�.��f]�JP��}W6m���Z�9��w�$E�f�}!!!�>�Z``�������jnbS���Z���UAN=�igdh�����[����AUSA������_��|������|x�y�d��Do�����*�YW
S���9s���>��U��K���
�N�>��/g�����Ci��ub2d�|��(9}������1k�oL��m���C@@@@@@@@@@|=��@�xP��/_!?���^%H����:t� �/�"E��^�/����m�%g���s�u�)SFv�
����B*U���Tp�@����{w��u���{���D`������=ZT%����������$Y�d��&��7��/��sfA*___i�����M�����>_m�TTe>U��US��y��g�V�yWS���W_m*!�wk��n���!0��?��/G�4���U���a�d�VE1�o��U�
��G�zk�^qM�=P�J�,)"��lU���]�w������6��7k��M����M�g�<e����@@@@@@@@@@@��|��<O��r�D n�8�o\(o�n��$��^U^���u�^�*���%g��R�������7�|����kW=���=x�@���/����x����sG��M+�:Y��e�P����H��'L�~���gWU��k��*a��������z9r��_|Q�����p������<yR�]�&>>>��H�
��-����y�:|H���9Sf�����i�SO��E����Be��������'U���s�'�sF5�i�gH�V�t�c���V-x��E	���Zh�Z�j���4@@@@@@@@@HZ���o�l�BI���[�P y��� �	H@�*h%��v��m��e���<�^�~��+�h�Wk��a�Pd��]�������"�>�l�n��[V�X���yl�
,$�CC@@@@@@@@@@����D���" �����;d��mz�
b���> �&��+��V�ti)P�`,��R � � � � � � � � � � �@�����@�$)p2,L5zE���#��_75��u��k������d���t.� `+0w�\y�{7��������<�?��S��'l����@�yt � � � � � � � � � � ��-�<��� ��S���G���5�'y��R�D	)V��J����o�>���qsE��#>O�7�������>}��I�6��-[V�( ~~~~��^����3����o/-[�����% � � � � � � � � � � �Z��kF@<x������W����u���i�%]�tf��!���-��i�&�c��%K&}����F���; � � � � � � � � � � � �%���C ��O _���i���q�l��I��N��:���W��Z�����*U�U�V��K/%�����@��m%w���;�Q�n�*�������h�*���Wj��)��t�B�
��i�@@@@@@@@@@p.��Dk��A ~�8� �P��=�#� � � � � � � � � � � �@�8x��~�e�J��M"�
_ol� � � � � � � � � � � � � �IS�[����k@@@@@@@@@@@@@�+�����& � � � � � � � � � � � � �@� ��4w�@@@@@@@@@@@@��!6�0�	 � � � � � � � � � � � � �4�%����F@@@@@@@@@@@@�"@��+�l� � � � � � � � � � � � �$MBlI�w��@@@@@@@@@@@@@�b�
3� � � � � � � � � � � � � �IS�[����k@@@@@@@@@@@@@�+�����& � � � � � � � � � � � � �@� ��4w�@@@@@@@@@@@@��!6�0�	 � � � � � � � � � � � � �4�%����F@@@@@@@@@@@@�"@��+�l� � � � � � � � � � � � �$MBlI�w��@@@@@@@@@@@@@�b�
3� � � � � � � � � � � � � �IS�[����k@@@@@@@@@@@@@�+�����& � � � � � � � � � � � � �@� ��4w�H����&�S��?��h���#� � � � � � � � � � � �T�%�_��D �
>|�<Y�O������9���K�tM5�#{6)]��t��Q�O�.���kx����?�G�����f�,A3H��`i�����?O>|�r�
�;�s���.��r���K�gs]���\^���;w����-3f�(�����@@@@@@@@@@@�B��S�q	 �L���Gr��UQ��9s��k��I��d��Y�.q�WA���Z�
�M�2E_���!����H�v����5����������_\
�������\.�������w���oJ```��� � � � � � � � � � � � SBl1�zHT��'�T�Ry�I��������I��Y�O�L�D�a�����k�����_�\K
��mM7�������!�d����o��]R�n]9}���u-~��������:����8�~�����+}���W��� � � � � � � � � � � � ��bC�5@ ��9Jn��������]�[�N����3�����r��M��i��m�����C����[]�7`�[�{�ncN�F�e�_��������r"������x��V��v�
�)�w�*f;w�4�"������7�cE�3���c�|/*��Z���$   >��� � � � � � � � � � � � ��!6���x*�*�U�XQ&O�*����l����.s��Q�6u�1��AC���_�p�"F_�9��o��7��o��P�}�6�M���g��~�����<�J�������W�7on�D�~�{��L?�8C�����<l� � � � � � � � � � � ��b���� �@�x[
(h\�~�:���4]g��q���#}���G���k=Pf�>��c	

2���c6��K�*�4i�D�>�<y����|K��Z�j�-[6�����7o����?���+'����q�@@@@@@@@@@@�!`����LEp.�Bh���6&��wON�>ez��������K�|�L�����SK��-����7��k���W-Z�;���s��[��'d��]zW���\��3fL7�m��Y|�=@@@@@@@@@@@@�)�=%�!��
d���f��k�.=~���3��U��0���z����v���Sl���S��������������%K&�6m�ro^�|Y6�_ol[�~o��@@@@@@@@@@@@ ��b��� ��'��������.;z���t��s�;��-c�j?��{�������D�,���s����K�9�m����^\�j�<~�X�)((HJ�(��]�@@@@@@@@@@@bK�[lI� �D`��������.\�a��#Gl�r�z�a�}G���l��=j?��{�-����G��[��;T�8p@��e\��@��������PA|||��8 � � � � � � � � � � �x"@��%� �O)0g���o�qu���%E���;{��/k��s�;��I#F��s�k��W�k��)��e��~����s�������W_5�,^�Bv�2�/Y�d����@@@@@@@@@@@@ ����o� ����SR�J���:|�[~���>|H�4H�w�j\�#G��c�N�l��8������]�.��3���%B���Z�T�.-�D��-��b��}��G��������{g����O3���oy�{����~|e��An��|����2���|0}�������p���'O�\�?��yj���r��M�3g��{��
$K�,����n��-�U��)(Kc � � � � � � � � � � � ���=>�� ������R��7�:s���p��\�~��w���e����3gN7��\q
��N��m?�����]�u�M�o��I7v��;wN�
*�a[�j�<|��~��1�u����<y�$��X � � � � � � � � � � �DO�[����A.p�=�H�)|��V-��]�rE���%K�LZ�n-m�zJBC�U�<�[�n;��u��������u�����U�&��w�=zT�b�K�&�<��c>]��N�>�0]�,Y�sz�B@@@@@@@@@@@?xNT�ap�@M`�������>=J�.�������`���cG���M�����7��F;��Y�-}�t>]���-Z�}mU�6l$3f�����t��B]��i�sz�B@@@@@@@@@@@?b�"C �@�����\�~�z?qRV�Y+��57Q�^�*�
�^�zzEJ�>���k��y�o;y��]��io�z�I��-[���=`�i0�� � � � � � � � � � � ��%@�-��/V�.�5kV�^����=[^y�Uk�'L�eK�z\}�L���={�c_�	
t�={����ioT�P����B���+�4�&M�x��`��;�4HC@@@@@@@@@@@�� �\��E� ���R�lYk�������u���)�p���n��<u����y�:T�h�(���0}�LY�d�,Z��8���5Pv��=�����E���pZ�F@@@@@@@@@@@?
b�#&C!��)R��#GY�< _}��[����9?x���~�#""�s#��ke�I IDAT�C�|���{��Vz���A�j�� � � � � � � � � � � ����x= �q(P�fM�[��5���C���.3�+WNR�Li�������p�>+Ur���k�x���>��{A�A6� � � � � � � � � � � �@ ���d��	+��O_k���|��.
		��y�:�t��u��K?�aaa���s��
*x��'+T�h-}�/{�u�@@@@@@@@@@@�$+@�-�>�l�K�V��R�Jk���������EK����'e���.�����0�M�,����|�f�Z���w����7����@@@@@@@@@@@Hr����S��@ !^������������.�h�������:�����m�6�~G����[a�4i�H��^s��X4l�P�'��qu��Y��{wb��@@@@@@@@@@@@ IbKO3�D��x���R�dIk����J�J>=�
l�;wN���c�����>�I'J���b��$"��5V�$O�<	��8�?G�R�Vd5��K���\� � � � � � � � � � � �� ��SFD\�%K&��Y����c2���]�5m���9�
���ySf��-����`� ������u�.�z��2Nb;��]{kK�������~@@@@@@@@@@@H�������@ ��|�I)T����#�����]��R�n�z�Z�\���9��xPf�����C�}��-ZH��9�-���S�������^@@@@@@@@@@@H���5Z��!�j���4�_�X����G ���]�n�&'O����oK�\��l��R�T�������`4p��~�@�T|A���p@@@@@@@@@@�T`�������,�;`��!��{NX��!6^ `8��<�@q9w��d��Q����3� � � � � � � � � � ��U��_9S 9 ����^���\��d��q��l�� � � � � � � � � � � �@� ���_ ��#��{)X����O>�X�:
@@@@@@@@@@@[�[`??�@�N m��2j�(����ge��a� � � � � � � � � � � � �@����cy �8<�hS�v�* � � � � � � � � � � � $Tb�'�e"� � � � � � � � � � � � ��(@�-�5�� � � � � � � � � � � � ��!� y�X& � � � � � � � � � � � � �����Yc� � � � � � � � � � � � � �@�b�'�e"� � � � � � � � � � � � ��(@�-�5�� � � � � � � � � � � � ��!� y�X& � � � � � � � � � � � � �����Yc� � � � � � � � � � � � � �@�b�'�e"� � � � � � � � � � � � ��(@�-�5�� � � � � � � � � � � � ��!� y�X& � � � � � � � � � � � � �����Yc� � � � � � � � � � � � � �@�b�'�e"� � � � � � � � � � � � ��(@�-�5�� � � � � � � � � � � � ��!� y�X& � � � � � � � � � � � � �����Yc� � � � � � � � � � � � � �@�b�'�e"� � � � � � � � � � � � ��(@�-�5�� � � � � � � � � � � � ��!� y�X& � � � � � � � � � � � � �����Yc� � � � � � � � � � � � � �@�b�'�e"� � � � � � � � � � � � ��(@�-�5�� ����~��I��|���[I�"�7�-k�yZ�lY /�ok;����1$���&M�m��0����%G�l�M�GN[J�=���[�/5�v�Z�����
�j���y�}V����q#����k�U�T1�|n��-e��1�r_��r���[#� � � � � � � � �$NBl��yeW 3g�t�b����:>��u��<.]���[�nu�2�S�Fy�}�#�;�q���h]��s�<�Zc�{���..���Kk]��WO��z@�>�_x�����~;tH���'������37Y2g��E
�~�����6�q��u�kL��W�^���{����5����O���)c�e������g���J�J�����I�lY�d����'d��a�m�6���c�f.����^�^x�\��U�d����_l������r��Es��]����w��������s1�@�_��)R��AM�S�N����[@@@@@@@@@$�{i1�d��
�~�W+Uh[�r�<�hS���f��o��5%C�Q^�(,��O�q����s9���/_��_M4x������}�Y�ZF�!!!!2l�p����K��<0f�'�������K2g����1���<�|'��s����Kr�P����y���o�|+*Tp����@�O��2e�d�2��o�)M�>&�R�J;���l�"s��1�W����Q#������rO��h�����p�z�"C�
���Ij��c��%��q���I
&H6���5�r���O?�$�&N�.]��<$�g� � � � � � � � � ��.@�-��!��#�U��V�*�6m2���;�����+'N���7i���K5�fk��%3+X�^�J�\�"����i�`��2eJI�����2t�.\� 
C���;Nk�&{������O��7��Z1�����K�c����G�2���1�����	���{�������s���>}z��-��Z={��Cp��?�����}E��<p+�+W.i���L�0A�>,S&O��/���oR9����X[��z��'��,���a��h������
"����^3�Q��}��G� 3g�
���2@@@@@@@@@���=T�b� �@�4�����O4��K[�j�C�&���ED�C�V��U������We���%�_,X(�\���C+�k]:wv�5
�e����3g�������\������| ��?�n�?���cD�l���� �2eJ�5i@��������t�*�?�4m��c������+�g�^�#G�]s|N�����m>����S'�\=z�����
o����kJ��_�^���L�2��<����&�{�V������i��IHR�F �4o�\���g�g���D�! � � � � � � � � �� ��E�@�$#��)|�k5���"��i@�P��Q��Wa��U���������wv��!����8z�xY���A��fkZ��l�����k���]2k�l)Z�h�0^�v��lek�����k?~�����:�R�Vk�����d���������5k����%��o���!F%��
����3g�l>��'i�-V�~�Q����a�9s��y@�������:uz>���X��������4�����:tx�L+�����Q@@@@@@@@@��!�$��#���Z��Y�*�����
w��h�&v���]�(,�:��������/���o{��s�	��`��'����5k�\��_��K�o��V���os��zH|�D���m{��������������S�����Gy$��tn��m��60q����LW��Y�d�yu��)����c8��.K,�D��08�m��:4k�L������; � � � � � � � � �� �m2.@��.��qc�`��5Qrl��U.]�d�k�C����S��?��hE��u�I�R�$o����3g��������"�v���2�I��M������O<[��{���z���mM�&N�4�S��2�K��j%��>�Tj<����;�d��EJ���=_�={��<����e�����[oI�F
�H�B�%s&��1���V�2��h����������-�y��Q���*��>�Z�/t����,QB2g�hZ��S[�,����=��U�n��-q0Z�������JF�j��#Y�dI�m����������j��1����k�ti������Z�n]��1�G������^
��p��G�]����}�[�����k�����f
���G��a��J�zu�p���1$���s��s���o�o�y[��s�/�zf��a���a�<����_��9��s��++�w�h4m�o����A������C�vR�b��+�dH��\W)�h���6m������P�r���>�M[c�|b~��/���P�������r����k��z����U�n�/_^�����H�.���34Z��C��E�H�2e����5���@@@@@@@@@���=���@��&��Qc?n���'N�/��"Z��S[�*�Z[����z����Z�������c�^�J����o�@����g����,�w����Y-��}��g5��![kd��]�r�!$���h�Ds��+2���?x����2y����;���oye�jv�^�������)����D��o/�G$����:n|������G��0��4���y��3�o�I��i�cIQ��-[6�T���U�7�x3��S��G�F�bk��'V�^����I5�����;�qJh@������E�}v��A�}�C3Xd�4����~�I>��cy���������z�6X����r��\��o�;}��d��!^�4T��gwM��
�~��72x� ��i`T��N��q�V-���~s�������_3����������F9��?�,O?��:��W���t����>�r�����q�s����J�N�j)�� � � � � � � � � �H�%�'�m �@�	h5���������IW�^�=�f���F��{����5��/`�?�Bla��d������ �)$cFk�?��iV���v���U�l�F
iU��nT��v7o�4��}�vy�sg�/����F���E�
H�������w�^�
��[���i��z��>�����9��'O.E��9�K�����<p��hHC���v�.��� �`N?c~�6������F�a�r��aVe����#G����^-�!C��cJ��Q�Vm+��t��X�j���x��?�0C��V�f�x���T��'/���=I�S�>�i�c}	j;�n�����jn����w~�i�|��	�C��������g��������<��2�}����j����{w�\�}��l��������%s9o@+��}�iYd|���^���J�\�������M���V�;��6����Nj�Kg�T�R��y�>.�k@��e��U
��LF��������<y��r����	#����Gm��r��=#�5}��
����E�Ij�"h�Q)P������p�����;��q5L���&�!t[��3�Q������Va���=�K�f�=���'j��e��m4*�iU��
,&���@@@@@@@@@ ��NR������@j#�R�N]����W�6������\�pAv�U�i�C��d�j�Jk���������7�X�A����
��E%��� ���fC�| ���nP)�[��Zo���;DgsM�65��7��&M�/��D���e��m�53�O7mEC��l��5��{�L�����W����_����4�i�M�
Z��S��j��|RZ�h)�~���7}��7�K�l�����#F�����iH���*pz�sP�� N�?^
(���7�"�5+2�/�������f`C������o�%Qm������y��+W�l�n�4��l�|Mb�}�]�D}�y���=+VL{�q���e�F�r��V�&���\�#���q��U��Z�T����1}�;��|����5��?��h��*W��2��h�L_�e��9S>�t�5JwG�:����C��]�v��@3�jk&���=�<i�y���FK���D+jE���L�8����l�R:v�$�*W6LzO�����3���S�3�_��+WN�2�|M�{}��E]������`��4$��Q=����DoQ�Q#G����s�.����I����K��2��g���}>��S4x��!�c�l���U=��W���{���|gV���q_N��~�m|}��5�aq}�7o�$�
#�&�v-�@@@@@@@@@p'���A�!�xh����a���V5*��4|�UQ�i�'��U�����V\z����K2�F*_*�����Q
����������~=4�������e�`h(����J�u��g��9�~k>�����s���ljT�y�SGYo�wl�������VX��`�C�M��qY�H4��M��Jd��K��	&�U����4������[o[�L�2����i��<��4<�l�rs���*T� �������K�.��rb�:�6Y��e�����KRi����[
��g���Vn��o_x��h
��{b������+���(
�W��^-r<_��~{���n/u���A�V�Zy�����e����y�?M�<�!��'�*���~�P~�z� IDAT��w��8��'N0?7���k�z�t�S��U�K��U�R��},[�������-0>�l�&={�r`�u��H�/^b���b��s���D[����?�lz�V}���i\�`��1�.]"��e��V�u�����Ve�f��k���q_O��~�m���)X���e��=��u�C@@@@@@@@@�����M�i�#��P�q���&�.]��[�����U�����o[U���;f��_��K�-
���"�����sM�4�4�S���[���mj���~��i���Q������a#���+�d���D�pZ�����e)R$`��Ue���h�l��ifH0w��F5�����Wo
���i���e�W����+��j
�x��r��Y�S�.]����^l:y��<��<�v��C
.�v
���lm��?������>������_b	2��}��y�}��{�}��mF�=����_�o>�;�|Zv��-��]3�k �>4��9�����j����#�<"C�����#GX�5�Ue���V�����-[�x�����_{�uy�X��V���2eJo]�z��J��ki
�l���f�y����s�Z�DD��C�����+��ux6�:������������t��'�� � � � � � � � � ��H�["z2�
��@�<y�\�r��kV�v;��U����on;���#K/�N7m��5��Xxx�����.}8�(������T���}����;V��n-y��+��iP��4�a_�,O�<�������V:w��ReJ��k����C��������>��.�nk��s�"�E����7n�����Ew
���r��*���cG]�7.���'Z��:�������^����<y�ZS9r$��O��>l��'O�A�-�nb�+V�(Z�K������O;lq���R�L�Q�v-���Wo���tL���_�dT�:t(�����������v��Y�|�u���=]����jU�:u�Z�}
q�.�0���{;T�?`��l�]x��f��o Z��S+W6��>�{��q���-�{�}�L���r\ 7���g-9)����'~G@@@@@@@@����oL�g|FA�@��M���~2��z�*��(���~������QZ���������K�
4p�F�.���CN�:%����-�;wv��h'
J����Wu�S_����ys�8q�L�>]~;t���V��3g���;W^6���r�(�8B�d��3Fo���S��"�;w�q����o�u[	���s��'������O?�6m��<Q%�K��Z^#$��������v��-��5�v��JYZ���N������[��W����?^����p)Q���)�e�n��x�����}2k�,����}���-�����6����%k��X��9�uO�{�V�U���c�Q���5���+���=jVd��T����ok������
��|��"s�Z�Ll�s������7����jW�����J����nu���\����sZq�g�o�������+W�~��H��?����AKo-�Q������j�S���Z�J�
i��\��
����o����i��V�� � � � � � � � � ����9b� �ZYM���m���r���
�W��V�?~�/�G���Y]��/o���������'�f�2O�-
K�!�y�����^�������1�""d��
���d�����X�h����F��K�����k��s��e����M�q��"
Yi�;
����S6n� [�l5�kf�4,�l���r|	�e1P���.\�
�9r�c�+W����F�_L_���`7n��8f\���@�*5����o���K���Z����8���5P�u�������_�D��f����p��\����[�b�C�-�Tb[i�{��A���a������U��~��V�������;�ng��WtZ�����s]|�����������o�4�����Y������Z����a5�[�B�����^�HQ�c�r �����u � � � � � � � � ��M�[b{F���@%�rF��9����[�d��u���c��Z���5��J�m����j���c��9[�m���.:�r�(R�������3�i�m��I2v�gF`����L�,O�zRj��0r�yfQvI�<�h�@}H��'4t0��e��V��{t����"S�L^��1����CB2Z�����c9|X7i��
���j�1��Vl
������
��������w%5�mkZ-��4�]���]�FV�X)���0�i���_�V,��L��e�k�G��Fx�vi���t����-�=@�����#�p>
`t��c%2�x9s��u�x������ `t�Ow������{����3z��S���!�����k���� � � � � � � � � ���'�-�c@�?Z�a�F�`�W��~�/��1��okM��mQ����9T�6�ky������_��5�R��������5���"y��\'�j�C+���-r�j5q��8���A��O�������^0��U�&���#�������g����I�[��>|p��u�q�}����[�)RH�v��`]����a���E�v���#o��.�p ����tN����<W�W0
��mt��Z���v����^��n���K���kv�����w���;vX���F0�!�@{�\�vM�j�Z��9c.�d��2v�x��i���7��
����i�d���V�M��}��h����:}F�^��p�
c7d1>t��c�N��m��
{�����;P��� � � � � � � � ��@�R��{���R@+I��~Y�����#����k��i�V���9O?���9�:v���������C����U��4�?��6h����������U�Z�je]�i���\�����gw�����<~�,��c�X���og�1��^�e�p��e�_H�.�|��WF����q}�ixm��)������GR�N�r�V���^���)P+<�~��#d���:x��9�Ar��{bc�E�3w�a-�g��U+�c����H�"W�\�6o6�o��U���'I����U�.c��2��o�9��m��3g�N�+W�%l��u����x�"���?���w�u60^O�F����u�R�J��+�����K	s���XU���z��]���U��>��ik��v���^�!� � � � � � � � �$Bl��yd �@
�Z�c�����i����}��N��f�-���)�U��K�.����>�}�����_.���W����}��}~�kH
#��}��S�<^�|�*������ZG�~V�jUkY'N��r��N������B�:`��Y]����}��W��K��.]Bl^�|>y�x�k�@�>_�,hm�����
��'_����W�������m��U�C62?+��P��+����~����[�|��b�Ts[�����V����j;[;}:2P�����_xx����:~��g�&M�[;q<�����d�l��<i���iH_>=]���'��w\�2> � � � � � � � � �T�%�g�}#��_���V��5[56��lM�4�r��'O��m��~3f��������������~}����C�l�!���oD9��7�>��%k�(�I��U�������4�U�xqk�����^�_�sW������8�����u���R�DI������u����K���!_�������#G����E����Mbu*Q��������tO����c�v9p�W���{X��B��52MV�Xn�w���t�*v��xM�:m��}
^��J/k��_�#�=�x��V�re����/[K�&���M����6���V��%k{mEw������������nPo�������=w�`��oR�'(:�#� � � � � � � � ��X�["~r���@�������^%���a�u���yO+Z���V`&y��R�vO]��e����9sZ��-
��u�����QW;9�_�:���%�@n�_(��=���b�*V�������X�������0�m[�&O}6o�$W�^�N�{�^�y>������53�.��A`���V/
v�/_����wY�f�,_��z
�`g�
����{��}5J�;����*�m�&+W�47R�ae�r7����yl����s�N����2g�����!������j-Z1��6��g�z����1S?��s��f���q��lY#��5�x�m�����������d|.$D����J�������n=Z�������J�c.\�#�[��hwOK���@@@@@@@@@����[�A�-�����M�&�
l�e�+W�����)#����r1aa���zH�f��t��b�\S�n]��"�1<]�����a4�U�d�w���u������8��/��9sF���+k�j��{:����Y��+�*�M�8���Q�l0��;�
g�V��o��O���o{~�����J�J�\�������g��>m������-[��*a���#�B���m�>-�?����iT��V�fMkY���U ���'/��d�v7���O?��eK����k��~�4��i���C�X�������"��z��i��b��E�T�4���W_��c�4���s���#F�Vd��i%��P�-W�Z���4��f�������_y�����L�=�h��Z������EO�4����m�y�N�*���4�X � � � � � � � � ���1�6����H�E��b��7�y��I3f���&v7O�/_�5kV[����������
B�cG�5+��G{���%M�4�T�n����j#:�������[�BC��s7VL����/R�ni����X���x�n�����h��r��)��3��q�5^�54��g��5�B[��j��=�G�Q��O����.]:i��	��q��y����>w�����ys�q�t�"�tn5jD����K����v�������r��Mw�9M�u��ZW�R�2��tw
/i`����_���{����T�j����k��V[����������.��BX�J�*�z4p��������������w���N�Zf���PI��q����������<�A���E�����#����[������k���m���]�}���V�&)S�4�k ��7��
6��~��'s���u�8���}��!�9��;v|��Z�m������A��d
�t���{���<"!!!��1@@@@@@@@@���=Ix�l��@���E�6�-����Khc�����m�^�z>��~}���Vc�/�{k��/����9���t�2����g��o�a��v��%�/'����V\	�"���he��k�X�jpi`4�����=��5O�m+��EV��_��%�E��{�<b|�T���#{s���4*�� �V�4Cy���qy���]L��@�9�f�Z����K�*����Z�MZ����HQ#��-k63v����z�*	wX��F�������3�_�;�3���g���sR�C�9sZ��/�U�x�A������:��O?cV��J�5�uju�5kH����}N��+��/�0C�����C�������?K���n����3s���m�K����I�6m\�'�������:Qb��/{��L��t�R��O_��w���'V�^M4��M�������3IC��F�t�V7BJ����v��������ie�{�q�_�z��d5/���_����Ja��t�l|����Fu�����x�����w�u�����'X���w�L�<�|D�
.,}��u�M+�}iTs����W���J+��'���R�@IiT�����6m�$����
�n'����9�������:�3l��E�/VT��l��i�Y~�ay��7]V�)S&i���L�<�<7c�s�]��$������b����_�e
T����]����s�������9���k�J���z�����W.A�U�U���F��:}�t|,-Zs�=��Z���.�A�� � � � � � � � � �����7=�A��@�&M��O>v�N�G��/-G�4xfk���#�6��t�R��*XaFe,�����_��N����~�\+��7��������_�wM�H_~���-[��i���[
����Y�
f�	N�8aVi��RK���n|Q>PZ�v���w��y;��z�'s,�����E��>�x��W�u��i���|x�o_��q��p�47�����8����gc���/<o�g42f�'���2�$_O�n��j�����QW������A��b�p�-D��B[���L��������V<����32h�@�5��^���5k�]n\��+�i���2bu#���.\0�sL�s����<}��_3t��C��������2�bO4ofU	���>�[��y�������C�"�0l��u9�������Q��,^�T��~�<�{������`h�<���5�~8�\�V���a�������{:t�l7�������jTts�� 9s�L����g�^��~��������+��rY���<�����kx��s<������w5�KC@@@@@@@@@ ���>��h\�$Q����^Z)��i����3�~	}��%��5jJ*��JtZ��Vw�R���Lt��I_
&|���2��a=
=���F������n�E���p��!W�\QN_�bE�|��pa�h�0PZ�-��F�v��){��M��}=m�L�0Q6l$�����
�4m���^�V4`����+2q�$�jD�M�cj���-R�P!����k��5,4+��k�S��v��U���Uh��6-2���K��
���Z�N+���>�O��@m�l��Qsy��f��_j\���i�j��������8Z����m����{�*U$���f\��i�,O�X���xZE��]���������Q�HQ���e���!Cd%9_���>���A<�����)R��y�������^��w�e�!��}��y���8�N��g�������2�k+W���i"��9�K���}=����Q-T+�@@@@@@@@@��@2�Z@d�������Y`�/�K+����-p����u��<y����9Sf)R��T�Z���(�PD����O�=&.���)c&�/�}R��Cr����R]�������N��u�.�>���OB��y���3*��j�.]�$
S�b��/�����u0i�D#|�������]�w�?k���W��������+�k�6+9E���>�����������1$����Wj���F������o����WuQ���z��_�@���m��)���@nZm�A������K�����`�'d</���;��O?�/Fu�3gN��G��,T���ZZ����+������
�E���ph�\��d����C��"�1��q��uF5�r��E���V�Z��?�P�h9~���K
v�/
@@@@@@@@��&���as��KKj[g���!�8�e`b��"c �@b8��<�@q9w��;p0"QVG�bK,�cR�G�n/������~��hy�[7�l[�`
����F�':��������h[�t���S'�p	 �������
7k�\f@���53 � � � � � � � � �*@����#�V yl�z@����3���{��]�pA��FP�6 IDAT?3�8y��L��k��
��/���=w�
�Z������/(l���Y�>b��MrH`�Q#G�+H�<����/�W�� � � � � � � � � ��I�[bz6� �@�����,T���',Z���@ 	6L�_�n.���H�T����M7��7����)#-Z�����1H��U�U�V�T�W����������*0�w�k�.���|�����@@@@@@@@@�(�EID@G m��2j�(sAg��
�����.�'O2�S�n]i������f�k,���,Y2��
>BBBB���z�����9@�n��-���[y-{��2`�@���# � � � � � � � � ��$��h�t�	!������%�L���@ &M�(=zt7g�����k��XS"� � � � � � � � � �$U���[/_�XR%`��]�Jl~'e@@@@@@@@@@@@@@�!6^ � P/���\�~�|P�-��� � � � � � � � � � ��H�[���@@@@@@@@@@@@@�Bl�(�@@@@@@@@@@@@@ F��b��E � � � � � � � � � � � � ��b�E�> � � � � � � � � � � � � �1 �#6.B@@@@@@@@@@@@�E��/J�A@@@@@@@@@@@@��!��q � � � � � � � � � � � � ��/��|Q� � � � � � � � � � � � � �@������@@@@@@@@@@@@@| ���}@@@@@@@@@@@@@b$@�-Fl\� � � � � � � � � � � � � ��!6_��� � � � � � � � � � � � � #Bl1b�"@@@@@@@@@@@@@_���D@@@@@@@@@@@@@�	b�!� � � � � � � � � � � � ��"@��%� � � � � � � � � � � � � ��H�[���@@@@@@@@@@@@@�Bl�(�@@@@@@@@@@@@@ F��b��E � � � � � � � � � � � � ��b�E�> ��o���e�H�����|y���sA�'6�@R7�����k��A�����;�p�j�q�lY������9�_f��i�����e�C@@@@@@@@@Bl�$��{�)R��A��N�:%���I�2�)�'��������3g� ��M�m����e��[>l�����y��
@@@@@@@@@HT�����f@������L��+gv�4q�����[w�!��Z�liU4z�o�D�W6�������o�,Y�g�^�]H�x�����^�t)�����%K&������+W��{���b
 � � � � � � � � � �>b��. �x^{������o������	 K��?�HN�>m���K�$C���������6�%J���=[�����I@@@@@@@@@@�����N�� ���7�|���K�?�;��wo /��!����VR<����#M�4��I@�����9Z��)�s�.~�a���Vc����9����+C>x��0 � � � � � � � � � �@�b�VE�@H�"�t����<���'�|�Ke] �$�����3[��'0e�d�����q��3��g$�,�d��V�������#G�<�!� � � � � � � � � ��[���E^�m���g��i7~�,�#�	&X#�}��8��a��@HH���v��m�2y�f@@@@@@@@@@�8 �g���*P�H)S����k����o�
���v��L?^:�o'�*V���rJ��������T�����32m�4�~�z��������$�A})��>��1D2�d������<,=zt����g�J�y����5K���Q��[�{sKH���7��R�n8`�������=zT����US
�o��/o�Z�������w�^��:}���I��z���~��-_��������ys�~���?� �:>'%K����2����uj�������-k������Z�|��h����)\�����Cc;v�<�k�1c�<�XS�u���/�~�o_�������~�:�k��-6�S���/����.UJr��a��_���~�I�5w���k�vp����WO�^���Z��n����h���@�}���a�Y	2P������~3��1cF�W��_��n�Zy�wo����\���9�K�J�g��E����k��������@���L����'[�����R�^�K{�|9����oM_c����[�����~p�����J�����1}/����{O��?�v,����?tyT�\����������w���{�vR���k��jk�:}�C{�=��z�)_��y/^�d��kx�����>�������.m]���W}Z�vj����w��1z��<@@@@@@@@@@b-pO�G`@ 7n"�v�2W���o�c�N��Z5k�����s�D��o�1�hc>#
BC}Z��$��������S�D��o7CQ%��\��;}7.;ih�O�>r��a�i��9#�6m2C�| O��/������
ki����+�4��
T�S��/����%E�^���������Q#��p������<#x8o�w�6m��X��shH����������_��^�~�l�a��c������Kg����5�AO}�k�C�|��YR�h�(��P�K]�����]���uK4��
��1\�������K��80���Z�:u%u���Z�/��"=�w3_��M�Mz����u5P���%�#G������og�w�m������#����p�=;��/�R%����E�t@]_|��|�������3����+�P����"������?��S�n��a~����R�>sV2d�`����Y4p��k]?K��~�4k2�4��-[���_���u��������H��)�����u������� � � � � � � � � � �@`b���U �@<��UK�r���F��K�.Y_����8L�\�*k��R�`A��9�\7BK���N�<i^�~�0B�f��Gm�u��k��l-Y�dR��r�Q)y��r��i��-�u5*�����_?�j?�(V���q��Y���_��q�XEU'k��!NE��<F�3F�M���h��O?#'N�i�g�Z%d9r�`��O��y� �wlm���f8o����i��������6{�l���?<�!�2WL�Mc��F�������T�R�������}���N�8qB&N������V�\)�[?i��mM�g��7C�FE9�{L�V����U�VGd����2w�\kL
��2*����Sn��!�����[U��^���������K�)j
c�V�X!O=�F.^�h
��<��d7^��
w���5�������3Cl`���V�O���@	�����Tm�m���,�~�T�R�<�Pm������Kfu����Ka#�v��-3�e������F���6���T����{@���������[oK�T)�n��
����V�s~�E����;�4i��&���_�b������h�P�3��t����E[Xr��%��|�� � � � � � � � � � ����)@ �*U�l�4�����F����
~a�
��+'O=��45�i�*@i5��{t7�Xi���*r���'�q�4�����X����'���
	�7
oi�,
l��Z����qul��9������( �0D�q�0��ih���������,���~�z+�������)�K�����
�nT�Z�|�yLIu�N�N�?�n�x9�����Q�����Hc�~�V�%<<\��}�3j;�3y����]��w��\��c��V��r�*���o������>���iu�n��K�V���4�|]�p��l���&�aAwM�s�5����5���t�w#<�+[���{��G������$O���L_]��j��@[�����5k=V���}��g�^��Q�0$$�a)Z�k���<y�����u��q}����U�T9��i��>���-}Mv���d���WC\Z5k�Q9m���^��lT�����������h�I�V��9c�q����jx�9#P�cG����qt�O���{��a�����J�4i���?.�;�h�g������H5������}��U�b���?��c�Y�S�[�li��;�~^��Y��g��!_L��2]�N��������	������o�{��=���U�l����b[�v���8� � � � � � � � � � ������@ �4\R�P!k��;�kj��,X�P�2
�������@����X�5��ep�`�����6
M7��9���VK�Y��L2�E+�jU	�4�������|��q����i
H�h��4�����%����VE�<y�����lz����������=���y�8�'�_�n>g��-7C.�U�*U����5�k_Q+�S���	��Vg�hT�l�5��{��A�F���FPp��I����4e{/��@+`5o��C�M�R���WX���[�Z�ws}�h�uX+C
3�Y�6���.}/5^t7T����������wxU����B(��(H�AE�(�t���`�BST,`E����#	z�^C� �@�����l����$��<����{����,�������g
2:��k]�p�����l*�*T����=[&��������+����q�������)�N��4???����L��������������<�]�M��'���
���s7}�)^����9�u/���,6~�8�����&��)S�U���{�~UQ��1ce�VLmz�M����K������(z��)VV����9s���K���t�Q���NV�Q�8�
�Ta7@@@@@@@@@@�7(b�����@�+V4V��k�V��D�V��i!!!zg+���^iu�����s�BC��X�X�X1K�=rL��
�T����L{���;��������[T�#�x�����SEi��L���s1�b^O|����|�
�S�l��W7�m��8|e�b���%{EQ��w�G�����+Vk}���F���
T�~T9��0a��0������s��{����\|b��=FF�5K�g�B���hc��#�t���g���jU����)��o���������m��5�-u
������"=U`ki��f�<����k��*<|�NAY�*����5���o�~��I�-9L��|��g�
?-�3?f���*�=x���)�G@@@@@@@@@��El^�gY���*�0��G�zCN�����4N�8au��Td�imW�^��'~��7c�����22�-[fLW����,�m��Q�.}�����<v�k�n6�2�9q"�`��$�l����n��+9��������+�*z�7:w�b��]�F�.ei��c{���,����#G�[R]��;�����`y����������u��-M'������qH��>}:u���;��Z������[(  @^y��t/��_?������d���X���(�������f�����*�����w���$@@@@@@@@@�"��
Y���@�Q������bc����.���[%&&F.^�(�����;w����u��t���}��Y�8���(��"����F�/nu��N����s�����/4����[�!U�T��������
4�#��������0�W�QU�V��NHH���+�S���kW�����U������shy�.r��]�bDu�J=�;6m�4���u���F�]�����:�����=g�)��w���^��8�V����kW�_\\���a����6�7J�e��R��v��#�F�6��	1�_�r�f�'O�m�N�����d���%,��,Z�P�1q�/����S�N���$����k����M�C}O�{���[�7�@@@@@@@@@@��(@[v��\3����i�k*�2��]+�F}(����j���{ML������N�:z��*�Q#"b�,\�@�4m*��7����K����X�bVsx��*�36�5�����cZ�9��T��Ci��lu�s(Y�T1�y�/K���'�L���c�j�������w�qJ=g#G����x����������/X���g/���b*&1|��3FZ�n��gM�N��RS+t+P�����<x->��/_�|����}����~oUbG����+�]�L�!'�{��Y���"5K�~���'�*.��Q�v�:_��x��'�"�Y3g���!���Oq�S&O1����?���/_�g���.O�E1@@@@@@@@@���e��e!��}��f��=�:8��g��t���6�v9I+���C�w�=���[�b�r�c�+T�b:��/� ����R��x��}�|-��e,�_�|��Z��c���9����wO��ST�u+V�g����%$$��k�RQg����;-ZTf��Uz�x�(d��=w�g���P�U�j��G{L$��o���;����1�Aa���[*Z$�������V%.�@w�\�r��R��f���/w����;w������f���c��x%����r��U�c���� IDAT,����A�f����~�{�<yD�2@@@@@@@@@@��@���\! `Y�������T]b,�p��)S����d*$�X����f���%��y�~#An$$������
�)SF�o� �}���*G�i�>tH��#�j��;�yc$$&�����gx�]��,
��;��������o>'H�y���b^���}�w	L��U���}�Ny���D�o��������o�!����C�����f������Dg6s�����~oUr��]�(�4\u���������Pu���;�hm��_R�L�<�����K���u�L��Wq�����8� � � � � � � � � � �~���o�L�����3����I��CI���������f�����}V���>	LSxv�������=��sZ1�F9q���9{���4i�D�e�sN���OTQ��G���R,��Sz���L#^�������u��T��H�{����G��Lqgj���B���0ek/^\>��C�s@�z�O&O�*�=���s��)�<x@y����}�V:��+R4��a�N��n@�c��i�w?t4G������:o�N��5���������
3�;+��������Z�J��/W���9���������s���D���<C�d@@@@@@@@@@ �P���o0���N�:e�,[���@���y��<yR_IL}��7�7o^�+�>u��y['U�������{����(��g�t����/�~���n9w�]�S�=��nU������O;ffn[(8������{��._v�����L���WE�$k��MY����v&�+_^�w�.�~��l��M�TA�i���[,�o'��O�+W�X��7����oV�b��).yo'��*�#�wqqqb��P!�������3��'P�BQ�	Mc��������/_��T�#�1��K���-�����s
�A@@@@@@@@@��El��Ns� �F &���0�D�j������Cf]���)#��m���e[,�����Wi����s���.��h�J�*Ka���5��8:�j\��U�s�p�^��
��{�1�ZU��F@@@�5�^���Mu���a^����/�=={�_�~c������"CsT���-��f]��]�����l�~�9sFT'��s�5kV�'E�9��sO���v%�������f�w����z����� ��~�s��������9O<���j��)z�����-fS'�����.����n�+Vr���� � � � � � � � � � �b��\J:����#G����[���q���~�����;&�Wg�P$�E�����[��:�3�UG��-[S�O�&�����H[�~��=w��l�d��I=k�l���'W
0>|8���V�\i���O(��X�����^����i��Xs��
���;���k]�5jl,g�����k����S�9���f]��;�s�NG�Z���?��{����E�Y�3?�h�B���di���<.$$�+���v��u=P@s1/�����S'�hSu����dyT������s�{��0��;�5k����sg8'	@@@@@@@@@@�#`�R�=�������������#�'�xcc��7�=v���={��6����$%%��I�������*Q"=)2<����?#�������#�g1�}�d�����L�����s�>���x�-�4�,Yl5N��X���yo�(]����f;�}����������iccce��N-��������u�]N�����c�
��7nH�2={���s_z�������T���-�=���q|��%6�T���?�d�w��E�o��a�����_VK�=W�W�4���������^�*����������k��m�����PGSY�[�>��a�-��q@@@@@@@@@@���y��������u�4mj�xa+��
52:������|�b�:��{�������V����^y�e9p ����[��/��l��j����D�l���t������?���?�Zh��_�h�thfq'��_���Y�d��qcU���?4���J�*[�U�7oa��1}�l��1M�*�����������
60VQEv���|�=����PV��������&#��[�nY��z��3��kW=�������|������i��a�9�U��6�=u�C��R+W��c�*|��7�<�V��^={�*.�6���-m������Y������lj�{��WOQ�S�7nH�~���q�3�������hn:|��|����C�����{FT�K_��\�Z��-}��v�;o���'�0�W��4�����m]�v-Eg�f�D3�� � � � � � � � � � �.Hn����$D|W`��������7�
l���+~�Q���i�D=�bT��n��c��}��_D��"�N��9sf������DuS��u�J�6m�v��r�]%���;r��	Y�x�����r��M=_��E��������	Z�����Q�+�����L�L��Cj������q�Q����y�f1�f�z_����ne�������������%K���e���2y�$�xP��;6u��{��-c�|��e�>����V��P���u�L��������:ID�\��<y�m�vR�\99z�����A�������:R c+�
�w�}��[��s���m���y����>5*EW*��6m�J#�04�x����z�j��Q=�|0R�N�*=�!u������r]�
���
ZG�%�3r��I=M����U�t��Q��j�ZT!�}��'!!E$^+�Q��Zg�Y���k����$�>=����������._%			�����6^~��w��y��?��CV����q�w�H��r��U9|��,Y�D��:J�ws�����+/��v��-u���A�<#����w������}���}z�@i� �H3����@�L�g5^<X��['<����R@<(�&N�;���{���~�7��=q���r�=UDD�(�ui���?��k]$m9�vq����������F���`���/�����P�����gx � � � � � � � � � ��L�"6�Q�2���H����P]m�=��"6���>�X6n� �(A
��g���9�:l�+Z��"6����K}l
U�4s�R�pa[an="Q�WH�G��U,�H(=�@�2o�|��u�9~���B���mR�T]���s��+_>����V�*�>��|�����x�j��1�'���]�i����T����L�4Y�v�ltr��m����(U�����Ta����m���}4�bL��-����_�M��5e�}����Z��mT����M}l
U�6q�$[!=�T�FY�bE9�o��i��Tx�A���|����������
8U���q:�>���}VN�:%�~:Z�~��Y6t��d�]������W'T��g��/>�3����3����\�n����T|���W�-Y�r�^����g�
��U���"6���O<���M��H����?���O�P��K��9S��@@@@@@@@@@�����>t3�
xF`���W�j���*����
�"���SH�<y,nIU���y��7-��t�s�.2p� �H����/����G����'
T��+V�7�|+�*Y����!T�������<�����v�z����VKCv�\6l��92>��<�u�0&�P���
��L����O|W]�6��E�c�&M�NYE,^�Ol�E�P���~�y���*��U� a�����?������+�H���u?[CuT]�V�^#�����s��e�1uJ��W����?��Uo�7���T�.[c�hE��*��6J�.�u�^�,����=�pg��qZ�g�w�1��*z�*��^H��^���~���=g����+������PE���_����*���������K�N�T�s�@@@@@@@@@@��9��w���H���]1������?	30�}��T�TQ����*��U�-�s��i�kV���G���[R��]�>�����-�>}Zvh��9"q����BI�*U�n�z�:���8|��l��Q����+W�HP`�V�r���b9��������h9�u�R*W��R��y�t5��S���r��q��P�r��u�6�
��+p��yY�f��>uZTVQ���=��#5j��ZPj�����'{���;���T=!�C�����f���
�|q��V�XA.]���8xH��)�����U�/��-+���@T���#&f�^d��?g%))I�)*54We��".�[�|y������������%J8�5����������g�;�a�&+��?n������Ux<m�t�'� � � � � � � � � ���c��Q��Yo��@B@�L�"6�����oO������*}������s��}g ���9BF��S���y���aA C���zq���<_~��<m��/=����F-�hq���z��z��Q�1@@@@@@@@@p�El��$�
��N�}:Z���9s��C)��N��kE�/���)RD���o�Nr2"��#S�������3�N�1W/`S�{���eX� � � � � � � � � � ��g(b��3� ������l��]��S���V��]�@�7�����������f������L)�l�|0r���~��KPPP��Eua3u��/����?C��� � � � � � � � � � �v��?���UX�t
l����Z�\:30
�n��-uj�����NC;v����`x@�����Y�&�y�fQ��v��+����;v������z��=";w�4�/^\6l�$����O�����)�:T�z����c. � � � � � � � � �Vv�����V�j'@�9����"���y��@@�t��k;���Y�pa�9�i��q�s@@@@@@@@@@�W(b��;��2��_f�<{G@@���'��

������/K�2e|k��@@@@@@@@@@���y��@@�Z����	�Y���@@@@@@@@@@�	�tY&!� � � � � � � � � � � � � �J�"6	@@@@@@@@@@@@@�	P��6Z#� � � � � � � � � � � � �P��3� � � � � � � � � � � � � �6���FKb@@@@@@@@@@@@@��x@@@@@@@@@@@@@�&@��hI� � � � � � � � � � � � � @� � � � � � � � � � � � � ���(bs-�@@@@@@@@@@@@@(b�@@@@@@@@@@@@@p�Eln�%1 � � � � � � � � � � � � �El< � � � � � � � � � � � � �n���m�$F@@@@@@@@@@@@���g@@@@@@@@@@@@@�m����� � � � � � � � � � � � � ��� � � � � � � � � � � � � ��M�"6���@@@@@@@@@@@@@�"6�@@@@@@@@@@@@@�	P��6Z#� � � � � � � � � � � � �P��3� �n8u��-"y��H��M���@@@@@@@@@@@|W�"6��7�\ 0z�'z���s���g�q�F������;C�X�C�^=���q��F����6�y,]�s�=ku��:�m�6������o#66V��r��m�Z*V(/A��l����q#1|�:x��\������A-�1w��4�~��'���C
�F���n�'�x}�\�rE_��Qyri�B@@@@@@@@@@���|�F�
@���5Sj��.�,�V���'OJbb��={V6o�,|0Rj��%�~:Z�����
9���q�;��!������]�\��m�Y�f��Qv� � � � � � � � � � � �V?�f'9 �
r��%~~�������a�t������
�T��i�xu��3{�����9s��z
�n����o;�RS���+Eq����������Eu�S#!!AT��+���0�3���7o�4�����L��}p�s����~�zi��A��|��{��cl������v� � � � � � � � � � � �����p�H�dv��Zq��a�\~!!!r���t�����>���]��n�������Z�?���p��^��\�
�,��#F���#,��x����2��'���� ������������d��E��/��c����4l�P��;Z����'6����?�w�I.���{������s��x�+b[�r���5j��-[:s��"� � � � � � � � � � �d!��Y�Z�@,
|��H�����6gn����������b����R�P!#������s���n<h��6s�L9w��Wr}�1_|a$}���\�@@@@@@@@@@@2�El��V�Q@�������3��={��F���C� IDATYL�:����������K���,Np������+$$$�����y5��?z��,\�@O�;wn��@@@@@@@@@@@ �
P��}�=W�d�E������k���������zJ�9�������w���O<)~~~�?���$%%�s9���:u����e�V���$B@@@@@@@@@@�|�e�{��@��\�����������������b�,]��f�;O�*YR|�!}�#���%�����r��9����C��% � � � � � � � � � � �@���-s�7v� ��������{��G���kwf�����������Nvq�����������Ow��1��k���y��_�� � � � � � � � � � � ��J�"�Lu��, ��3w���SBCK;4�T�P#����z4o�V�[K�*���/^�H�9���8���+�����V��C�B@@@@@@@@@@���e�{��!��^ ..N�]�f8���C&w��+E���'����O�S'%%�?���e\�w��MFU��3'�S�%�$A@@@@@@@@@@2���<�<���!��G�$��?�n�rh����w8g�Gq(gv2/`S�^ ���Ow->���.������fjL���$$$�x����g���b���KL&@@@@@@@@@@@�L+@[��ul@��@|��3{S��yR�]���"���c=z�{����Y�f9t�:r���l������D@@@@@@@@@@�1��|����|�s�����;���#�������������)����).7W�\]���_���7o:4��A�=c�?�{w.�����";�.��\LF@@@@@@@@@@�)��~��&�������&C�
s��!!!r��i���N	�����r�����q��84��A5k��
����e��u�m�6Q�|m���[��/��m�� � � � � � � � � � � �xA�Nl^@gI@�h�����-����- e���!�������|��i�w��q�)@@@@@@@@@@@2�El����_@�
,(9r�0�/�?���s����+X��C����#�H�"E�e~�1C.]���%���������N�g � � � � � � � � � � �@���-��S����;|��i���|��I��%
���O;d�:�R�J�sw�������O_���k2e�dw/�t�"E�s�.�9=�	 � � � � � � � � � � �YO�����z��!�d!������o��*U�l�����g~����W��,88��y�0`��������%�Z�\�rF��S'��K0 � � � � � � � � � � �@���-k�W�
���/�7�O���������W�8w��9q���XuBuy����FL=��6'z�d���%,�����}{eyT��Vvl��U�������&
@@@@@@@@@@@ +
P���*��dB�[�n9������+V�9�Cxx��s���������8#�c��6��qr��������V7��u�{��{�$%%y��5@@@@@@@@@@@|H�"6�l�����![�n�K��?�������5k����Q#	

5b���;IHH�:g��1�9y�S'���:��}Q���;w������7on,y��u��s����z � � � � � � � � � � �>&@�����dW��H�fM��W^��g�ZdP��^|�1����K�����r��7�x�����<����a:��'�������� %J����'s��)O=�����p�����[�L�V������+��$�@@@@@@@@@@@|\������@�
T���S�5n,�-�9g��O��/>�c~�L�����T���o��q����M�H�&M�"2???9|����5KT��iT�ZUTW2{�_��2u�Y�n�:e���z��uS]�b����9sRtx+[������6S/VTn���"����)�W�zo�}������:�qg���_F�S]�L����#�k�.���E�����w���E@@@@@@@@@@�b�e��� ��m������&:���R.�Z$1��=�������b��:��\�B�XE��_&N������s��3gIX���g�=���9r���w�u���=[���*`��LY:��M[i:����[7�6m�C������^`w��Y%.\���{r�� � � � � � � � � � � �C�>�)�� ��,\$�%u���9rXPi�?���^�Vj��a5.���E��Z������&�
J}Z��/_>Q]����U�����_:���A��c/e����������~��'���@@@@@@@@@@@<#�C��r�3K�
�l��O�Z�������V 66V�o�&���.�Em�
J�J�����K```��-11QVEG��#G���sR�`!	-*����
d(7����|��m��^��l��@@@@@@@@@@2����#�>kW��)��&��e�����H[6��\:dz���v�r�
�:-Z,-[����� � � � � � � � � � �d}����=�
=/���K�" �d���G����O��%s� � � � � � � � � � � �(b���!@��@��
�{��z��e�$:::�I�� � � � � � � � � � � ��(b�t��
#� �y>�d��~��73���) � � � � � � � � � � ����\��D � �@*��%KJ���� � � � � � � � � � � �dc:�e����#� � � � � � � � � � � � ��������G@@@@@@@@@@@@��El���s� � � � � � � � � � � � � ���(bs�0�@@@@@@@@@@@@@�l,@[6��\: � � � � � � � � � � � � �n���-L~@@@@@@@@@@@@@ P���o>�� � � � � � � � � � � � ��[�"6w�@@@@@@@@@@@@���e����#� � � � � � � � � � � � ��������G@@@@@@@@@@@@��El���s� � � � � � � � � � � � � ���(bs�0�@@@@@@@@@@@@@�l,@[6��\: � � � � � � � � � � � � �n���-L~@@@@@@@@@@@@@ P���o>�� � � � � � � � � � � � ��[�"6w�@@@@@@@@@@@@���e����#� � � � � � � � � � � � ��������G@@@@@@@@@@@@��El���s� � � � � � � � � � � � � ���(bs�0�@@@@@@@@@@@@@�l,@[6��\: � � � � � � � � � � � � �n���-L~@\,0�<���G�y�mg'��B
�i����JK�l$����g�l��n��.�;��3d�����n��-5k����th)�����m�@@@@@@@@@@ �	P���n)���>}�����?vW�D��'��3���W����~��k�u��g���F��$E�3g�85�Rp��%���{����X��|���^z1�yu@������_G
�<(C�_��i-�(D���B�R�
�AT������`q��>x��uy��W�m.\X��z��T0(�0����j�*y������E=#�H���R�jU����|����a��s�N���d���9p��<������g��=����^0W�\2|�p}~ll�64���� � � � � � � � � � `]���)� ���o�^�?vW][�X��2y��F���2b�5o.
�;w^DD���X������m�k�������E�IIIi�O�8!�)�~:Z���?�'�|2M�7|���r��a}/���*T�����V�y��'E���X���r�����T�R���3�n������@��]������;K�Z�d�������2h� ���{3���k@@@@@@@@@@�G����7�m!���	��W
646�;9:v��-�O�6�;v���TU�f9r����L�������r��-���T���q��e���O&�(`��'��,YR��?��+W�����-�����/���}���Z<������s�4j�0M[����L�2R�H��3���8y���=����^�x6����B�~^�oWKU�>l���}1�@@@@@@@@@�A:���MaK ���Z������
���GT1��*eo,[�W����������PC�Q���e���������_K�S���-�����3WZ�i���4p�l�����.,L^{�5i���Q�������C��4q����7���:��_%��M�>}�J��]��S�T1e�.�%..N���<����T�ZUL��7n��
6��y�d�����:�5���#r��}��t^�����E/,�
����S�����-��7o���]�t���P�#����*>W�c@@@@@@@@@@����5�dA�l"�����nl�����U�r���P���y6Ut�}L#b�\��	�W`��M������A""�I��-St_S��j��)�j�m��o���*�*U�FU6~�8c?O>����������c��}����3f��1c�Z�jF�:��a�7o.��8xH>5J�$��<O��"�B�
�??�<a��5����:(����V���p����?B����/�z�qb]@@@@@@@@@@ K
P��%o+��P�9e��3�GE.����j�����ussd���0�T[XX{�����������1�J.`+Y��^@������<5`�#���9s����?�Zu���{��~� s�.]�:����_^y�Ui���G�XO�.xB��k����Xd���r��%�/�
 � � � � � � � � � �@6��-��h.\'n$�����x���r��U#.��"���XY�v�>Gu�i����w�}R�T)�����e��5v�&@d���C�f�$w����e������t����c�cm��q��~?^����?5�W���Nt�|��4k�DJ�U\B
Ku��x��d������� �-�!o�-:����Kp��R0(P�s���d���N�T���k��K/vx�*Pu4�*[��1W�.<�D�V��*�[�n�R���N�4�]���M��9k���s���!���x|���)��9sF��=�O���!)_�����]�������h�B�y�y�B��R�F
}�7g�V<�@@@@@@@@@@p�El�q$d#���El�O��]�v����e���
*$�7��N.�:�%%%�q
45O������U��S�q�?��g��E>��q���ut0{�\������*3
w�?~\�7k*����l��Q��{z��5���/���^6�_F������nveJ���w��>�T�kE�'O�����������NU�������u��0���*�k���L�:U<��(U�������>�_���|2�s������Kz<���"N���z��;&����~X?�k�lxxr����(b����j � � � � � � � � � ��(b��w�kC��l�J���o���L.R�����vZ�������"""������?���9b^r����8 0(�����l����k ������+��G�|�Rt���i�[�t��M���=d��;��-[V��h!��U�9r�k��uK��6z�'6�p��!�t���3gN�\�n��T���5O�<�y�=��_�K��������c�esS�����z��E��Z�j��0Q��2|�03�*O�j��|���������*�b�w��-�����O�n5i�D���/�����K�*d3���l�$j���������T3���x�) IDAT� � � � � � � � � � �@���-�? ������j����,�j���/��M�����k:���,[�����s�6m%W�\��C��gw�lP�N]�*��#�|�e��������go�b�>��<�P'��7o^�S����k����`������C���k%J�����1�d�R��������S�XR�������o�~1Ob���;wJd�rY�h�l����8yJ�
.��M������G���N����i>�s��;����/�mOe����}��	Y�~�n�z�Z)W�����o�����H�s��:��^O��~z������X���n�������3V�=&�"�$z�j��jm�X�x��4a���V�\����Y�����M����olbb��Y��Z(�@@@@@@@@@@����	,B@�@xx���Rn��iG�.Qj���Nj'hU[||�~Zu\2/�)T�����{����k-
������Q���1B��d���r���L������}�]�������3g��|93����}��<�����O��+����|�bU���s�J�6mR���Qs��.U���z�lu"��!\���q����ph�Q��8H����o��o1��0�G�v�JHH��W-^�D�����`��ue��i�^U��E�����!#���k�z\F<�.x�9p�==�S��3)�6��~��ZgR�>|����;w1~�<������0t���Bt�-B"@@@@@@@@@@ 
P��
o:�����Hr��UY�~�����-3�7h�@�)b1��`DD���m��i�n�"��gk7q&��1\���q���UK�W�
��{���T�U���OJ�U\�4n$/������g�:XY\��Uq�����������m���W��'w
TEdS�L���*^L:th/C5{�m����=<����5-wZR�����b�Y�`�\�p�b����;����E1g������{`1��>���R�B���B6um��}�6�qt�������T���Y+.S��#G~`����G�.]���df�����v99�p@@@@@@@@@@K�YR� `G�d��R�V-#**2����e����,k���d����va�B��af�6o�,'O������	��Z_}���;�C])����Vz<���*YBz��)[�l��'N��PT�TI��[�\����g��A��N��Cw.����>���)*�,� ������6�t���q>11QV�\a3���������'��pd��b�v�f3������m�r���z2�s��K�]0S��g�b�J���K�������Pc��G�zm,� � � � � � � � � �d%������Z@�������"#�;��6������g��c���o����:���:��k�.��u�h����;w���y���d�y������;��`��UG��{�����'�C���������zw�7�xC/*��8w�\�-'Vy{oj};�K���o���y���������/�J�����3��z����_�T)Q����c���������Kj/c����B��������]�|�nNw���I��Um�	I��x��U���t�����������]����1;vl�����f�����zjY�A@@@@@@@@@���_��:.p����6j���
7n���/KPP��b�����2e��}��gw7�""����k�j�Uq[�6m�B��y����vsg��?��SZk�������yG�<p@���e����f����o,�
����B�\�"�|����OW�k�����/_�t�q�$Ud�����6��n��hY�n��_Sa����+W�_�>�vz��aw[����>�F�
���Sz���G��������}&�����BSGGb�MGC]�~WT��a~>�f��P��Y�]�Bf{*T�\,l�o�K�����S����!= � � � � � � � � � �e���eo-���_��+VL_���[�r��K�wg���v��uUkouN;�s+�/���	T�TI���/����;wj]�v�K/�,y��1M��GQ��4T�=_9s��-��_�i�����'$j�
�����~�����%����
t�r�H/]��>=rD����w]s��Mm��]�r����A�%��w!�=�E���L`P�q���ky\}��g]}��C@@@@@@@@@<!@�'�Y�������C��"�EV�>**���Q��fo���'E7�)S&K���,~>�`��.11Q�,Yb/�K������\9sed�[�����>�X""���z5~�8���h������~���S}&�Q�F������C�{R��3�"7{�/��d���>	�	i����S�Nr��A�\�\��w��2wn�:|D.]�"7S|J�*�&��@F����������=�xo������Z��w6 �o����� � � � � � � � � � �@f�XBf�z��dP ���Zddr�N�����g������-Z�])"""E���{�n�S!�iB��9v��2 ��)np�~����eK����1e����Lwyl�"ER������5<������2e����������vcT���kF\`�i�L�4I����W��*^���	����,YR������r�J�c@��y\��'s8��^�f��&we��>-�u��9�p��E-�p@@@@@@@@@@�I���#0h�.��$�:��<yR?�l�_FX�V��B6{c^�"6{���-Z$7o�tfJ�b�����s����$#,uw1G�{2�I���r������\>�Z���):��:y�k{�����Y��
�4�O���266�!��+U	�N���H�g�^��m�41��^�*��$�d��.d`9�L=}���u�9��������M�N%���-[�M��@@@@@@@@@�^�e����"�����1M�53�����we�����U��9#6l0��M�.7m~��O��t��D�\iwW��$$h��7���-�p��)^=o��+G�^��*v�R����xu?]�R�3[9Uq��1�B���[ZL�K�����:t�8���H1M�6o������q�+�����u�5o��=v����F�ji�[�	����S������%- � � � � � � � � � ���<��" ���������\&�`kUt�q���yk��7
fr��)-[��j�Y��+V��1/��W�w�9s�~7�S�u�3�_�LWm�-y��_)RDT!�7G�z���w�����dxms����;�o���6���^-��_7b��Lo�H>�C{����3�����m�������������^���.d&!{��zg��Yc\R�zu}��._�,G�1�R�n���Ol�M � � � � � � � � � ��T��������@O	<��c)��M�����x�X�5$44��V""�����#�'w:�6Yuk���qz�Yks\u������l�"�t���?�x���,
X�`�����������'��5vt����7oa���a?�����@�V��I�pf�;f;��qr��m�����{�\�r��~��ib��6m�]L�s�N�:eJ�pN��Q��S�������r.A&������HD��9|���'���Q|��^�����XO���~��\�<y���)O���@@@@@@@@@@��(@[f�k�|J�b�JR�������9#_}�����fn�6}��5���4N�i��Zh��m����?.�������'y�����u��<�xQ�[��a���������Y���c�v��6�[I���e��%F�;K���:�Kll�q�W�^�B=z�}���:��q����c�G�������Z�fuy���D~����G�!��KW[S�s11�e�k�Y�wS�b�?��e�4HTAL���Ys����e����C�������i����7-�� �<�.XZ�W������#W�^M�E����{��;t��*�����+V�6i�T��
�D@@@@@@@@@���_��".��@xx��B5��K���A;no,]�����0�����7����)%
** 

J)!
�	P�W�	I���FBP�Y��	�n����������vgv��u����<�9�����^������;V��U�z��Z_��c�M���*U���O,�q��J�B�b�����O/�z���i�v����J�FP�D���2EJ9��9��t��^mm����8������^�
o��d��q�&2fLXU.�m�/_&���%�<k�=��dH������F�M���?��<[�Q����U��]?�>2d���?oY�X���������U������������F�3]�tf���c�u�����:L�O���5kV��bVk�����k�Ni����6��]�xA-\(�g���(T��t�������p��Q#���{f����<��k/�U~N2g�"��k`��U�����*��������\�g[�s�NY�x��>�/[�={�l��5\��
H��
�-gA�	<�{�_"W�\�Qvak�q<h��q���y�(q"�����������Y�re�C�R������v�Z�9��h�[�O<!C��:^tu��	[�_�~t��� � � � � � � � � � ��^�[�?� D�@��5e���v������{���lMC^*V����C����X�bV�%Fe,
yj��H��������c���]�~]�O�n~\5
#M�6MJ�(�j��e����E�,[3���9#���������f����K��k���b[0����+Z��jg��9t=p`���S���s�����n�:
��j�Jz��%���7?�����D��Z-�r������w��1+�i�f�����iE��3f�A7om�b8�{0�>lg?�%ck�����|9s�������^��U#���5�q�F��sK�<�O!�Q�GK��M���#������1���U��Z�4�V��U��j���b���@@@@@@@@@@ v8��<vG�D��3Fe�T�R9��e#��r������`����=WY'N�����/�T�Z���������O��Z.Z�1��!���U�~
�Dw{�����7�2e��u�e���I�����KDC������'3f4��c���wo�Om��2n�xy��WD�-�Z��	���j�/��O����5���]����$]�t���=�67m��y��[o����Y�h�Y1�UK�$�4m�L6o�"��es��e>
hHp���V�	HO#�[[t���W�BE����n����K��k�J����a��>���[F����S��� � � � � � � � � � ���j$��A0��+�c�A����{�#C �?~\�l�"g���[�nI�T�%_�|�t�
�U��>tH���'�N��k����J�Jr��!�J��,Y��T������������:u������S�j��}��Jl�k�����0�-P���,Y���`�����Kg�P
|Rv��m�[�����r��a��Z�����^�H���>����c�v�t�����l������.��q�&�n�:y�ZUk��'L�'��y/�Va,Q��5�c�OX���M�d���[���Q��h��ux*/�?��>}��W��7��c2 � � � � � � � � �@,�{��y�����G��!}�����=EB�[$��b���+W�p�'����f ����be� w!�X{bc��i�RC������x����!y
��w�}'��55���ud��7
@@@@@@@@@ �
b����#|����� ��H�:�t������k2v��X�M`��_��Z�jE��o����l?~|���O�n@@@@@@@@@���������@�Q�s�.V h��_�Vg�!H7n���~���R��I�W���4=��@8����]���m���������@@@@@@@@@@��	b��[#� �O<��:����K���A��u��o����������y��d����&�G �>|(�����Z����_��16v� � � � � � � � � ��f�����86@b�����&w������1��W^����c\9�	���Ua�+��q"� � � � � � � � � �1!@%��Pg� � � � � � � � � � � � � �@�������r�A(�c�As�E
���3e@@@@@@@@@@@6����S.U�@�M��"�Tb�S��@@@@@@@@@@@@@�� ����#@@@@@@@@@@@@@V�[��&� � � � � � � � � � � � ��!��?� � � � � � � � � � � � � �����01@@@@@@@@@@@@@ ���9�@@@@@@@@@@@@@�� �����!� � � � � � � � � � � � ��/@�-��!G� � � � � � � � � � � � ��!��=5L@@@@@@@@@@@@~Bl�9@@@@@@@@@@@@@ `���ab � � � � � � � � � � � � �@�b�s� � � � � � � � � � � � � �+@�-`O
C@@@@@@@@@@@@�_�[��C�@@@@@@@@@@@@XBl{j� � ���V� IDAT � � � � � � � � � � �����r � � � � � � � � � � � � �@�
b�S��@@@@@@@@@@@@@�� ����#@@@@@@@@@@@@@V�[��&� � � � � � � � � � � � ��!��?�� ���C)Q��$M�Xrd�&�/_�a+����eK��[oI��%u��|�>�2fp9��#G8���F��<�.�c�w�.8�8���FQ����;w�Da46u%���#y�RE�9}��������2����]��c�R�D	��r�>��s��Q��������������@�R%-�	��{� �=��Mc�o��?Fq4�n���=
@@@@@@@@@ �!��&,A�X(� A�?��yd����~�>��G���w�J�:ud��r��	!���7G3�N�(���{w��1c�L��"�&O�$�*V�I�~+����7n��#�p�]�w�`?��@@@@@@@@|���?Ef��G������%K����.Zm�}��R�Pa��(�U`���2m�Tk������JI�)�e��'s9�r��K��8�;q����5�e"W�_�n|��I#���5�R�qk�������w��%I�"E�����+p��a����<x��\�4iR)_���M�N���g1�N��%�J��v�<9k�L3�MC���+�S��@@@@@@@@@��9��7�j����)o7i,>�~����s�����-7e�$�P^�RE-Z,�'���*T� ��ok��!�������������C������t�9��*�Al[�M�n���d����}:�u��7b�Y���]9"Z�E@@@@@@@@��!��h��^�N�:�={v9u��,\�@���+E�	����jb�.]|��v��v|ZI�������jF4�h��#G��%J�H��*i ��m����7n��f�(�"p��1�����jE���ja � � � � � � � � �@����#B�$H�@�7oav�������	��7o��;w��d��# ��$�_@����S[���A�����N��W��X�vm�jQ4������������A%(R�Je}�%L��=�����b� � � � � � � � � �@Pb���$@��M�4���3{����>����wL\MC�
�7����o�wpFC ���%��wX����yW���$@@@@@@@@@�� �t��	#�@T���'��7��
_������~�����2n�Xi����+[F2g�()�'�,�3I��E�Y��e��r�������2p���R5��3��
I)!)SH�����g��.]:���*�Ex'Q�`��y�4Ib���}+S�T�>�M������oz��%�3g�t��Q����i�2ErI�.�<�dA�U�5����s�"�=_}���.UR2�O'3�=�~�~j���aC���=|�����=*~��9W=/���1��I��r�����v������������z������kn�}�vi���y��~�>/�\]&N� �J_��m�6���]�T��d����w��N%������_�>,���3+AJ[�~�=r��NHH�T�Z�/S[�����d�����z_�5\�\Yy���]�kS�E�J���h�"����O, o6h ��N��|��d�&��q
z��_s[�lq������o������W���O�/��}�8?3mO�4��\�����c��Y�j�N[4o&�7�'�;�T����|�2�kx��/�1��{��SOY�����yzA���u`;�v����[��n����;��x�]��+���W^yY�z�{K���o�^���?��#�s�u��|��py����-ks�"E
K����f2��o,}6��=z$K�,6�O�~���<����>���#C��?�<��p��hU��#G�����������;���i[�������}^����������G��pz����S�������3���]���@@@@@@@@@W a�N��!��O�F�������+�Z�~|;�����iw!���/�~:(��0��#����}�����o�>.�o�������o�?�.j��B���i����w�^���]6t��7���c�j�J���|d��v����:�8�����G�3e�d�7�Oc�wz���<�~z�m[�y���y��5SV�\%y���������?��[>|h
�aC�h�j��1��w��|��{��A:vh/3g�����r��)��������;�W_
�7&�9��_�"I�$��4������l��1�8z_hxE?��@��e�%C�!T������[������������_~)��L�r��^�6���t/��h`P���l�o���3�����g�/\�$)R�0�4o��|�����%K�� o�Q������BA-[���
�'0��w���mE����K���%Tl�����J�,��Ih �a�����m
��g�������8w���I�F��a����7n�����eK���>���wi�:u����[�_
�7o}M5�/���������5_u;Ft�8y����[�z������?E?�N�h�w|�����R��+G�`�@@@@@@@@@  ��i` ��?����lm��j3��g����{.������v�6mZ��;��J�Z��6�����=k��
?u�/���_}�5����H��=�>���3���Fu�������d����US��6�M�s�_���;w��/>�u��I2����4i�h����{l:�
H���cT�9}��q����_�.z�x��8��\.\ �Z��6ck9s���y��e��������3���7��k{����
��t:����K^#�v��3�b;��}3����u�E�Cw-�q�;_z����s�I���`T��Uc����Q�&q��f@G��iS�����5k�J���=���k��yV
�3��d��Q���'���v���V`��������+�*L�V�������U��QC�z��	H�B�$�T�i<k�9f3�0��K���48R�j3hk��.bT[J�(�8p@���6
�������t�<���Q9�(o��{�R�g���;&,����I���\��t�2.�{[����3�74�������
j�:e�O!����YCj�P��`n��s~n��������N��*�����s��6G�q���_���o���%���`���O���3\C\��{r��E��O�������N
4�Z�4i�p��f�q�����@
�6l���8�+�]M+e�����6����!$$���uS�������}��h<�j������������������~���0��?�x�^pu-|���x��������������V�.W�\���������{�Zk��	�������yy��+;���@@@@@@@@@�G�[��+f�~(W�������7n� �_~��{��P%K��F�?�e(�F�]:����Q������Do�������ZU�jUcT?�;�7�F��p�P��-�+����4X�\1���+!��m��?X��-[6#��X���+%J�0,n�������*\��U��_x��!h �c�V�+K�,2a�D���KV����[�)��*�/-:���=�7�`�})�[�[��������;fE:mZ�O�N����������p�_��U[�M+?}�� I�*��M��1c��*�i��������3\
c.��c��w��*US�L���V�[�|�L�8�c�����
�~��2[+W�|������z>��Ci���h���4�����/_�q����l��V�n��[��4�����u�j��5<����m�>U����(�����A<�0�V���u7*��3�jT��j�j]�~}i����*o�C�+w��!�g��)�'��i���b[��G3��/w����������-��
����[z����Bl/�r��(M��5x�M�_��Tz�3�l��]�f>5���V�2x������!th��
�i�T�����<�v��U�{DCq�������F��j5�il�/i���i`p�*c��6��:d��ig��O���>}zs3
�
0@�b��}F��5���ZP;O�Ps>4}n�G��o��$�ngko���l���\��N�c��H�w��}@@@@@@@@@G ~�L�� ��'���jek�B�E��=�i������i&_��.{�7K�-�Bk�/_v8o�n�Z��k�}��9+\�M����+W�l�V����0��B�w�d��2�����Q��9���h����Ke����M�0��h�.����Ti l��l�K��E��H�9����":��a���&���xY�f5�/s$S�L����b��<����u�!��V�M��!����wx��A���~�Vi5�AF8�9��4���+~�~���.Z���=�4����Wl��X�-_!����C�MN�=U�TI,\h\/�%i�U4*���z�����O���>v��=����4�.s��a�9����`�l&���3���5}�Ly�J+$��#
�
��l1��}b��W�z&i(z�L��O�n��EV0�^4HE�^�W^�!<$���7C��6�MHH����[����}��D�J����`�:����
��t���
��r

�;�kY�q��������H��M����V��}�n�>_����`���V�M��p�gF�5jZS��7��>����6�S��O�����}�������r��
@@@@@@@@@F�[��
&��-�/_>k�{��������/��r���t��I�
�����u�b�}��I����g(q�a��]-f���3F�
vxkz��vV7���o�?4�5k����QI����r9�V�����-:�
&�3���jZ��~��kv�.���A���w�k�n��Y3����6'O��-V�y������o�5?
<�
��<��[�lq��7�9Ws5N�&M\�j����S�M���=�s5��L�U5*���Jan7~+��^�?|�D���7���j����m{���7oa
7m��
[����_�>s�|��!����Vm��VR�5�tv���.7�?��
����������Z�v����/�Z
d����M��
�~N-Z������Z�4&�V��
�����n��[��-[j�]�w�,������ � � � � � � � � ��/@�-��3D��$��[;~��c�����"��S�N���}u�SF����n����	*v���;'����3����l��7�
��~A��uE���������q*%K���{�f=���e��u���<�V�������U�V:w�����o
s�A�8v��5�����Q���4`�����JD�_����V��m����_�yg�������7����O�="m��E����?�< 7nt9����	;�-[�r����#��4��MkM�����������sX%��
�[���#)\��)R��*�����Z����s�Z�a�a�=����r�5Z�7�����}�\�9��]����e������X� � � � � � � � � �	�}����i�~�����2��i\�tIv���Q���\�zEn��-�q[�iW�����n�_��J�����25z�C�)���g���o��]�d���r��%�y��<|�������c]�v-\���[}4��A+OM�y���S|	aF�uP�����+���U��~�����{e�r����\�r2y�$������� ����5���y�f���.�U�4�������T":�
�[�T3*�E���=*�/��3*V�:��N}v��.Y������t/����7�9rH��/�����S�N�J��f��!��!�
��_�1���z>4��o����3���;�J}�v�Z������~��Zy��e�������/�x�b@�9B��/'��V��0��}/��;,�������\y��c��e
'�>}����]���7�xcpX���::#� � � � � � � � ���!�?LbJ@+�����7cj���i�&������?���
��n��{a?,w�W�ti3 ��mK�,�����3�>+�+W
��,UJ4E���I�����e��y�r���_�Uu��9��_��f�+wn�Bl�q�MRs5��	�^;\��m�����z:o��>�8m���y����I������Gla�������K�*U���)]���0�n)R��mL/�y+���D�'"=
���}`2��0�+��?�C������dG���u?u�{���K�
�4Y�V�[Y!�ys���a_I�����1}��w��-#�+�����[�d���2e�d+ �����;�:�X�,O���K���;����CY�l��]��
���V��V�PQJ����K�D�|���}�9W�W���1�=�/������-�v��1o����w�pe � � � � � � � � �@P��Y2I@�1�W5{�GjH��T��d��?�`�=����6�v:�*T�Z���Y����a���kI���~�^={F�G���W���b��,Q\�M���y��W������^�)}bL�c?�q_�O6>$$�W��!!}��U�_�!C�3�;I�*lL�F�p�y����j�%c��R��6|�Wf�"[d���� ��eH�!��w�zX5',���p��	8��\U�r���XL����g��0s���������q�����7F�4ieC
��bF���cF��22p�����s�����X���}���K���gF`X�������N�"�����������^{U���a����"�#?lb�}�i��)����^u|�z���.����M@@@@@@@@@��'@�-��s��'`$I�T%&&�f��a��l?��/�Y�f[�v9����sW���g}����4s��)[�n���������n��G���_7CYZ���Y�������
�����i��W�����5���3r��m���g�^�Fr��s�n(��0��:���
w��u��\�b�*�k����{���M��o���zIY�Z������������U��}'r��;w�8�=q�$Q>�
G	}����([�t��<�X:�?���j���%4u�����Y������K�XJ����X����g��@�6m*�/�#G���k�����#[�l~�wD��t�����y�~l��ML��~Z�J�4n,u�x#`C�Q���l�i,��������#������� � � � � � � � � ��!@�-8��D�� p��k��F%��l\��ok
Zm$��t��I�+&Z������o\������N�:a����_�e�����G�3�<�P�D+����5�y� IDATFs/��C[HFCK[�&��e+V4C�o�
Wo����
�/��7U��o�Us�C���m}��)�u5�g�������C���>c�t����
��;|����_/B�=�8
+�U�l���K�I�O���u7�"2�s��[�n���-T����'�6v��U�)�X�$��eK�;k�����_m��77�BV�����!���������k�P�k&~+�_~Y�f�*�����_��������/�c��t����a�o'M�3g�����|3���3��i �g��]
��n��~��`n�=;S����j�@zWv5?�!� � � � � � � � ��!��:_��(p��ik�\�r�q��*�������F�-I�&�8���Wd���j��)}����Y-����7��c
w��|��7�>�o���CY�,�Z�'��o���3a��; �*7g��=���c��uq�>._g�z������]�4i�Z:���'�4h�@�*���i�gH���{���R�������s[��&Fd"����1���a?T�K������������*\��i\�}��V��eGc�5?����������Nhk���[}m�����=b�'6{��-Y���V�������y������ew��v��Q�c���|���_�/.�Z�6xZAn��)����1y�$�p!�?Z�uBA�����>��>�=��\��P�]����@@@@@@@@@ ����av ���2���H���qO��>bW�L�zyD������}`{�2�,s����G��7o�q�����. ����V[������Y����������,U�����m�<o��8q���a}^������yu�g�G�3g����Z�p�O?K����7mv�=��)R���'5��V�\yk��7Df�m
*�P!r��=^�t�S��s=Y�d�X7nz>^��N<�+<z�E`h�wm���5���3��������tE����U��$b����c��������w<���^�5���]o������k���m�:�v#�����Gc����y��!<x :������oU8twlz���V-�w�@zWvw�,G@@@@@@@@Bl�s��)�Q@+���`U�LY?������mm��,���8qB6l�zP�y?5j��E6��<f ��.�c���'OFh���K7�v�����!AoM+�d�������z�f�Q��[���>]��������V�����-�2e���H�&�T�X��[�������2v�>����`����]�-
_����n��_����p����+V��g�p�����Z�����}�t��[=��R���k��7:;�0\���+W�s��W������V��X���6����i����Y�Z������]X��ol�;�]����"��w�D��c���^�*c�*U�~s����;��?D���i2�*U���S[]�Y�i��]�j�*��n4�o��_F�{,���=,+@@@@@@@@@�B�{R"(�I"���e��A���������l��%��u��9�����"\=����[y�HX�#s�,�l�}����P-�>���e����J���x'L�Z1E��0aB��Lk
��Nu��q��!�}�n��������2g��6�Z�n���~��n�Fd���G��Q���}z������ku����I��k����*U*kU�w��kHP;��wOn���jH�����|���n����������u��}��jZ���~��'��R
h�*��>��9ak���[aJ��4y���{��������d��=J�M�4���kY�����������D����~6�c���f����;L��3g��i��-�[����'�����v}��u�.*+.^�h>l-s���>3n�8����c�ZZi�\�rb
�w�M�� � � � � � � � � �)@�- O�B��-�fMXu�g�}VR�L��w�q�
+J�D��>�=�z�r��d]�I������{�~�W_
����y
Q����2e�dk�_|��}[G�T�V-k��]�v�|Z%�t��V�������]n�d�b������{�I��U���O�Z��Z��U�9}����W��&hh�����:=�O��s�z���i��� �a����9w��ni�6�
*���4��{�n���/V��=�����+����Y���3�W����������4q�8�o�^�V���<y�y��w��-D�5m��k�v���s�s���l����jP�;tt�f�]������9"�G�
������c�������\I���>���u��oe�G������5:����y���~]�Z���	�=���������
L�;�����zu����Q��<��s�P��u
r?|��Z�����,\����0��b�����w��u5Us�>+�����M�Me�PI��cp������;����3���������o���^|�r��+�:o�!� � � � � � � � ��@X)���#3C�.�|�2kLUX��$��Q�������af��%Z����(P���c�=��S�N1h�?\�m��}���^w{��M������L�2R�j5)U��he����S�d��+���*�d��A��i�u�`��������V[:��Tx���*UJ��KgV���1s������J�fM�u�����O������?U\R�1�1����~Xb��S��,X0��X���O/���F�4nl�����K�WI
|R���/W�^��[����p���U��.�����t,^�Hv�*<}���q~���.U�U��F0�SSg
DU2��}����k�.=j�7*"�����)R�N��V�����U��c+VL��K/�n�4��9k�CQ�U�P�������Qen�q�i����f@$I�$�B�n�e��
���������j\*V���3��7�����r�JY�b��*h���Y����{�n�\���+e�gW��l��f�w��=2~�x9p`�5�w�����~�����U���������������j��r��a�UA�U��h5��>��m����ozR4�%�Q�-A��}�7������-����I��!D������/�4m���V��3�n-\�@�-��\����������|���V5���=+�����*?g��;wVV�Z%S�L1�	����zox��;c�����7�������q/���%J��|�q�^�rE�x�	i���9_��;��]}g�Y��q}W0�J���Ec_��������O������/�q�g����d����z�������s���@i����b��C��}�w�]�vJ�-%�Qm����h�B�;��
*l��.�s�2���]��e � � � � � � � � ��%@�-���E?:t��i��6������Q��/�o���m��;th�r�O����2�b� 44T����N�Z���oU��7��i�b�����F@�o����&�]���X�z�-������k� �G~������WjH���|
�i
�};i�t1~���h�j8�U�r��%����~��3�k�5x���������q���_|�rU��������+C�1+m
���q�z��%�5r�*�2
���G���i�m��i��D��g�j��9bT�]�&?���e����4\��d�Ne���O������mk��;v�dV�2d��A4�>��ugci�����C���~:l�44�a
��g������(PP��u����U���]c����9sh.j��<��<"�qe�V�Blo��>��MC+���u�au��9�u����
������W���p��4*��j�2��1�N�6�=����#G���'o^�>c�h����?�a�2���P���6��*#�jk`�4y��=s�Z��u��25�e�r5/
��3<��.#��^�5w��jv�Bl4�J��{�2�������a��F��V��UW��]��\Y� � � � � � � � � <��g�������3���2~����@h)S��_V�*m��5+B�j��gT������.��Q��h�
�xj��r���}��|�4W�{��:�}��C���;O�+��'_lT�
��f?7�����oT�I?A�������;�*T=��kZ	L+�<��S�q�>�a�&��*w����M�����u���&mZY�n����+.������������u�.
40*����5S�L��[�a�d���c��^���^fk3��Jd�>�&L�hT \*������������4P��
��3��P���#G3f�Q9q�Oa��_C�N����%L�P4���������#:�����Sd��E�<���/��'7+tb���}kaT��j��UZ��������^��~/,[������]D�g�6mj ��OrI��2}/��y�d���ewK�,iT�/
������x}����u�6�q�&3�}���wXw���5|��6uO�H�"�=2�'H��^O����]��x������>{���g8o6�o"��]9��A@@@@@@@@@���g����	�)1�v�9h�Q�@nX������@�|fem����N#1����5k�
+Zq&S���<K�.���69s���6*�;vL._�l�R�Jm���I)S����E\@�7l������2�� y��?k�
"Z�$�{�T��l7�x�4t�K���z�����R4��������V��d���;+�BRI!#4�)���i��}�����'����f02]�tR��(QB4 �M��?_^�
Gz�:|�x�d��T/^�(7n�3�����~����Z4(�v����u�o�������z�7\�62!.�w�u�<x�|�f���e��%�S���z����f�-^��l�m����/����2�k�	�
d�"'��wP+t�0�K.]�$!)C$[�l���/H�T�"7��[i%1�Z��Z�je��5�z�{�n�:��r��3��AN�NV�TI��ll���.]:�����]��6�&��a�4��^�����^0<2G�!X��#upl� � � � � � � � �@�<f�.U�@��+x�_R{�1�@�(��;�
�i�@���iE'�P������V�*�V��Ot6
�����e�r�|�=��#S��D?�h,�VY����Z	�����4*�i@d������O���T�V�(�c@�)����[�FM���)2����[�d��)��6m��������q�~k�����h��d�Ot���7Y�,_��O���������igA�I����W�we/� � � � � � � � � �D�@���{Bb^`����$���/�|��F�3�����3+�h�JT�����{�}����6f�7f%9Q�����K�Z��a�FQ��V�q[�l����e�	�<.D����[e�����5���k�E�$�c8�����@@@@@@@@@�O����0 �.�]�v�m���.\$�'����w�}'m�����I�������G2u���������{���""���>��Ss���/��_Gds�"� ���?�gZ�Z�h)!!!QV��~��\,^����W/�c2��=*������3G�\��r�M�6I�F
�u��7��3������]9��� � � � � � � � � �����@ �	<|�P>��o�5�4��_��������7e����'y��R�T)��/�$K�L.^�`V�9y��u<M�4�
��1��h���L�2YBCC��a��m�w���
�������j����c��X���)����?A���W[�j�x�����w��V�2?	&�b�������*uj�y��������
�W�B������.�xW����@@@@@@@@@�8 @�-�dD$H ;�W�
�I��h[oT��s���s�.���?w^��DJ ~���a��Hm�Fq[�����%��!�M�Vf��N4�����;�y����1<x �����q��V�&��M�)R�Z��h�]9�� � � � � � � � � G����a#��@�F�$g���n�:��y������?��h�-�Q�&w��R�����e)P�`�3C�8)�8qb��=��x��t���|����@��ye����w�ZY�n�=zD.UD/]�d���d�"+U�7�)/��b���H@@@@@@@@@����1Z7��X`���������dj � � � � � � � � � � � [�<fJ��b�!q��@��@@@@@@@@@@@@@����b����@@@@@@@@@@@@@�� ���� � � � � � � � � � � � � ��V�[�=� � � � � � � � � � � � � ���b�0@@@@@@@@@@@@@ �
b����C@@@@@@@@@@@@b^�[��f� � � � � � � � � � � � ��ZBl���r` � � � � � � � � � � � � �@�b��s�@@@@@@@@@@@@@�X+@�-��Z@@@@@@@@@@@@�yBl1� � � � � � � � � � � � � k���S��!� � � � � � � � � � � � �1/@�-��3@@@@@@@@@@@@@b�!�X{j90@@@@@@@@@@@@@ ����9` � � � � � � � � � � � � �@� �kO-� � � � � � � � � � � � ���!��?�@@@@@@@@@@@@����b����@@@@@@@@@@@@@�� ���� � � � � � � � � � � � � ��V�[�=� ������$M���|��G�7� @��-��o�%����B���>�2e��r�#G�p�g{��7y�'\n�Bc��T IDAT�.\p�=p`�����#44�aw����hl� � � � � � � � � ��S����el(������_K��U$_�<�2����C��TQ��/G�:�+W����{���ng�Q����� ���y����SG.\ 'N�L��X� � � � � � � � � ���@���9�F�K`�����sg�t���.��;'��JC��>}�J��I�x�|��������C$C�_|��A/�U�^�j���f�W���8E`����t�r�t.\�$)R���1�h�>}�L�:��k����d�R�2EJkY���\��\������N�8.�f�r��� ��?xO��"c � � � � � � � � �@0b����@�'����^�5}[������	%S�Lr��E�r���w���>����K?�2��M��2e���~O_7� �DA`��I��/V�"�-����4b�
D?�m��5��|�� � � � � � � � � � 9������@��8r���m��
������	����r��Q�t��,X�Pr��i��A_����"t�'N�G�Eh:#3f�����6?��Sb ��W��jk]�t�9��u`:�@��%��0�K�4iP���"� � � � � � � � � �������">�l�Ui-~���h�i���$I����e5j��_V�*�S���>����r�;:����;&+V,w����@����k_?��?`OC;��7oZ���8{���Q�	X�a��qq���F@@@@@@@@@ ����ar ������9s�!�4i"+Vt9d����W����]�v���k]��_��A��qc�y�O@������� 
@@@@@@@@@@ ����av �+V�����6m�q����H�x��>K�.��_WV���.\���j�J9z���m����e���R���?_^I�*D��I-E��fM������Un��y��m��{w)[��d��YBR���yrK�����!������0���?O�&Il~r��^Y���>�������}�.U��7a�x����We���|��$g���*$�<�dAi�����n������x�������V�N�}�_��=�o[9y�$k�"E���t��k�d��/��s�J��M���I�*/���C���S.���a?_��gT�VG�8a���[���k*C�t�T�b��C{Y�n]�����,Y�XZ4o&��z�<�����������:�5���Ex�Q�`����{=zH�����r�����/WV�}��D������Y�h�y��1�i�������M#H;m�Tq���������;w��-[����������m���?�@��.%�2f�ti����J�W�\q9�m�W_
w�>]���6z
8_�����������c��Y�&z��5W�@~����9��*YB��n%��/s��9h��9�g��\������Y������6���2:t�������]L�K�.�!�N�:��1z]�3@�Y}6����_��s�"<�'N�G~(z/��@�+z��>���Q����>�|i:�����>��;Q�}��s�>#]�t��G���~�Qy��Y�f���l������j�^�}�m������\���y��������Z�9�;R���J���w�����p}��^�%�������>����w�7m��p_������P�q���\�2>oGG@@@@@@@@��	���s� �~��'�%J$��~��!g��I
|Rl
�
�/=n�+��}G�w�&��`���?��u�������\g��m���>|H��?���9�L�1S�{�9�n���c���Xg������O���5*�
<�]
���<	����+���i��~����c�d��)2�����;�Y�U?�9����k��o'O��l��A��}^�4(�;������|�=9s�L���_�.�),�_����0Q�%K�������K���D����r������eKEx���H�:u��F��{���.�;�����W�Z�Q?���������e�%C�A�&����[��O}��x�"���/e�q��+��
�Q4-�7o�����h�����~f��)+W��<y�F��|���H4�3z�(�
���'�/_�}����3���K�"E
�O��-d@������
�K�� o�Q��7o���l����m���{�2�Wa']��.��W�\i^7��]��t`���\�����)S&���|����_��}����w�m���~~��7�x��E%t��p�<-����?0*���G4l�
�;F�����/~O�l�S��F�[����>/4p�
�i0�C����W���F���'�����Ju# �w�^���=x�W_y������;�������a������8��/�-�u�t@@@@@@@@@�� ����#@7�c��B�
I��I��[\��lb�<x��s�	<n�v������fXc��)���O|���A�J��|�Z��U��I�l���_�%Z�E���ge��pb����zm��RjU����*uj3\����?�n�����{��vL���.J��^5�V:���H�:��C����[��4������c��snY�f�O��7�m�_XUj7n,
t�b��F�iZm�Z�*U����/�����5o�R^�R����Y��]��q^������}��+����[�?r���-t1����^g+~\i�'q��[�k���ck���J!!�������j�����U�q��H��i�*i���hh�����Oz#�v�8�#F�F���M�l����]�M����������)���s8`U9<t��������t�<�%����y��6��4(�<yr�k<c��`^g���.�5k*k��w��i�I�J����4D2v�k~��$J����J��\E��7~�8�1'Nl>�5}Fh�U����N��S�m��i��>��s���b�r�����w���/���:��;IU�|�������{l:�
H��i���8}���8l��Y����.���=Ne����e�z��9%w�<r�x�h�F��5|K����i��W��Vw�H�a�F���������p����v+���y`��~�8_z������������������J�z�kx���V�����5k��|?�S���y��E����y����{rN�����s�o�v�R���{���q�=�U��f�[��9��s�}��;��[�h��>��K#�������7�+Q����2���|��~ � � � � � � � � ������1up/�?�P��e���}g�5��e�����d�U�		�����'?��(�y���}�_tu�j	o���!���eK�������7
��5J&}����
��C�M+}5|�d����N��i5&����W��R���� RL��C����v������>}zs*�������C����h��U�@���>w���j��~�~����g/�����a����4�9�0������~�Q#G���mA�&M����ek�Bl���s�i�j�QI��]�H@z���o��I�!@OUG�i�����F#t�j�r�cn
w���@�����>��Ci����I��������`�r����<��]�vV�M�%A�n��[U�4��U�u�j�����o���J����MHBH/���t��"�)�HO��FT�*U�PR�)*�HD��^$�PRI $�w_�����������������������y3�3_~O<��JwEo^��O�I�8��s���C���X=p��#�
T���N1���;,p��:j����S/�v\���L5�X�O&�b��h+~X�d�M�{����O?�T��6����F~��l�����J����������I��LkJ��c���@U��m|���;��V�\i��}��=��+���z�S����+pq�����X�k�����j��C���<yrR���l�-���H*Zn�����o$�y��?Vm�!���L�!�L�f�m�%_��s[�������Mi��<��/����|��f�el�*�o{v���wz��}��K.�Vh�a�Xyt���R�j�������3�g�������;��#���W�
��A3��=��=~O<�������u���~{�9X�����c�z�u�]� @� @� @� @��[�c�^�� �V>����2Z�-9p�F-u�R��n��Q�iGut����]��K*�'fb$�~���.���l�|�Lv����W�U^���{���fOm�������[ ���[�&?���xb�a��|����L����~�
���-��b����
;��K����D��	I�!��6�|�������sL��PW5�T|���IphHE�=e��4X�i1q������s1�+�]y��l�?$a�@+�����gO}��?H��0�;�*X��������;�����"3�b���w�be��[�D����o���r�U����+D�u������;Vx<��_���`�!I��Q��*z���I���_o�D��\ye���+^w��a�%������zY��*u���/K_c�F�	c��&�Z�	���p��g����P�
5;��cXv��a�����������l������e�����2�L�]�������Z�+}UdaUt����g���_I�
�0o�[�j�l������b����T����n�{�[#�o������1$cz(L�:5�_��\s��x.�/��r�48wO�nJ����^{���.���Zc����G�����]z�=��s)r?�b�����a
l�����a�;��+�z�i�k��'�	������J�1��i�G�*���b����lA��\N @� @� @� @� �# ���@�@��
������Q����{�~3f���
���}-<8�����=���E� �i���G(*����w�i���n���l�������1�����)?>����;��#�R�Z�[�n����(x��I%�L���b��jh�L���u��P���
��k��V��-�����b��W&���(���3����b?��0aBv���Y�����q����/��%:����c���}ZR��a�|����V<��5����
J+�j���wB�fZ�Ja��m��1�����+��P�>������9����KS����<��D�,V�����C��=�.X�o���X�1_�%�u�U�@o{fV+�y����r�!���������C�	�;G�C��5�����]&y�4��g�%��w���Zz���YI��P����������}ix��	��j�gX��T���\���X_��~O��G3-VI�A�B-�ce��VZy�z��B�8N� @� @� @� @��(�?q��5.0�A��a��B���T"�m��7.��9r�Q�K/��jl��wo��K��	?i��9����S���~��������=�Ti���v��^�z������=�;qb����O�H^c�U��q��*�3�����VE+���s�l�B���!�z��/�Tj�V=���"O���a�^�|x��=+�
����^J�Z3(���{]|fdZ���N���q���#:4�}��W�#�<�w���r����`_G�����.]�V�]��%�Xc�l�>� �j�
[���e�~�}�a�z��s��B�5��>g�M����Oo�eM�SK���7�8o����ce�]�������������{b�ml��ce�UW]-�����zL����c���M>���)8� @� @� @� @��!�v��J�}	���U��*M�i�?:��ce�����������w�
�
U�����=<����1��&��}�g���4���*�4Vc[z���]�~��b�[�����[t���/^���i�����(r2���}��������Ng�vh���Y���Z�*\���^v�?������o���k�=*�����eo�]R-�io��V�������J7�A���n����J���*�M�6���*��Tp��<�]v���;f��52�%�l�Zk���f��7�@q��$p9e������y�/�4��%��y��cu�.8?�~�i����U�/V��mS�N]�&��2Eb��X����[n�b]���]��9t��0Jn`�Q����n
=6�d��	a����C���+y��q�\�����3�<�^��7�`��c�������b�=:���G}4����i����9��&�Z����0k���3�<��c�� @� @� @� @����T��6kX�A�$_u�|#|1{v����w��-��X�f��a��s�	3g�c��?��������#�L��Q���!�r�'���*�*��8qb���w'4������_���626��St�f8__1�R-��W_����{��7���%�7q���@�������G������w�}��A���IHl�f���m�T\3t�����:�����&�r�*��Zr)+��RZ,VO���	�����:��_R�w�N��}����W����U��7��~��p��w�]o���$�����{�z���`3�.0�����
�	�{���O7�tS����{?��^]5�X�2V,��_a���;���6�p�4DCV����w�3l��o�-��2
l���!�����`��W*���V���C��Ya������9��0e���\0^t��a�m�M|�H�7
�%!�=z,pm�4�g��������k���|H��)����7�x#����Y��������v�9,��R��`w%@� @� @� @� @�&��jr�L��R��f��U������!�n���9��#�����I�������� ��)��>�����4�2�0��>}z6(����w�����W���<�f5H3t�����,#���f�����O�����?7y�9s����|�����ng&�_��u��w�
�F�L�b[l������$����4���qA��5d����Wc,g�i��Wc�����Sh�Xm2��2���L��(��%�w�\�_/���A���.�|;�A��I���R1rh]��Gy$[�&b�Ek[w�yg8����3���L5��L*���g�����~q��c����kx������s�_>��e��Ipk�]w?���0qSZ-=z5��L���B�gbe����!���w�A�Xi��[���������~����
#F�~��F�=��z{����&���o�)E3zT�[��
����f�bp[#@� @� @� @� @�@S:6�������{��}R��S��&<��{����%/���!V%���W_	���o�����.�.Z�-V����JX1��i
��eO��0���Kn�=�������O���w�9(��t�L}�=���<0���i��J�Y��d��*��w��x����!����F�Yo��lv�}���D���[��*!��������7`����N�ix����&N
3f~f��"���/�����_n����{,��ie�|��������.���nZ��������}n��6������,:7l������
?=���qR]4V�j��{bk�7�=��3,�j���`��7��
��s��rK�a���Yf����;5�B�H� @� @� @� @�@�bk��kq��@�f���K>T IDATgbU�����VYe��\V���#�������|}s_�����z��_	ff#����YW�����JY@����������������A�b��G�E'C���0���c�?.���$$tHXr�%�]�'����c����~�U�2�Y�c
�(��y�[Cn��|��b��;���O���X07n\����b���o�0lX�+���g�E�����j���h�=N?��lE�Z���S�c�N�����3-��W�����O�V�{z~Z#�e[4	�s���0�����&��%A��O�E�b�-�ja����p����yNU�B�kXa�g���a��*V}����jw��1W_�V�]c�5����7^���w����
�������b�59���mVXq�t����[y-7��
�i5�`�&@� @� @� @� @��Bl�v3*)���u?����!�R�����]_|���o�R�,p~�w+��Rz���=���{�����9a�7���G����{���
�m����S}���p��c�y��*{|���� Jv����X?D6������� �����vX���	o��v�����_�~�nW]ye�<�~5��T2x+-����4�{�o������
N����~r����������X��J�{;__ >�c�L=jt�?s+���@n��/�G��g]��_�����k�&�}.��e����f6"h���o�����y�]�/O9%�w����^{��g��x��/���8��a�����~�A����[�Tj��}�������??<��������N��_|1y
���0�~���f'������C�f���(:a����������< @� @� @� @�b�(�� PI�M6�${����w�}���ch�������8���68�y�G�G������?7��f�����f�|�����)S���Zk����^(9�_|�T#�����y���X���X��Tk��P�{4�|SBM�����!�B�O>Y�iF���@7�ts��s��	O>�DE�o��&u��Gy��������5�=��O��X��������j~E��]����`����W^s���gAn�!C�d��-�-\���v��1�WS+~�y�M�������Y��DR��T[�
�]�k����8����N�a}~�V��pC���2m��G}}-u|���JN���>1�7p�����+��s�}a��u���/�������b�\+�=tH�������+���gY�����[g��-�H @� @� @� @� PD@���S���N;�\o��v[��;6�jF���.��_���!CC��� ����s��S�{���f�m�����5W_]��6��. x����R+�b���?�<��P@�R�.�b��>�_�$�q�'��m+~�G��{~�Y�a��/�	7�����j���]{m�n���o�y����������w~2	��v�����hj�&��V���h9-V:\s�5�C�y��%����;�}��'��O��������z����>��������9 ��?���JO����m�����X�3V	�T����C9��c5g���rK�5����^y�q�M�s�-=V���+j��CMi�r>��u�}.�b ��$V��
�K�TT���+~����D�s���T�	��ZW5� ���������=������s������g�6�3,�E�gX��~�a�����{b����\+��^z��"c��9*\=���?:�,��$��������U�}����� @� @� @� @����]Y�R'	 P���
�N��K.	�g�.8��.�0{n�E
�&!��m�:�>���^>i��0���v����U����V�q�<��+�5����r��������n1�Q�]xQ����.b�(_[}���U'�����uK��9�^���+x"�-�Z�"X����{��^��w�yG�Mi�f�jJ��}?���0u�����������wA�o�}�'��g��<~����J����d"��1������)��������Z�5q�1,�i{��g���K�aC���i��{o�jS1$Z�}��-xp�RK�N�:e������X��t��:��l�N8>k������l*:��Xi��C�^����
�6f�X�^�'�(���W$JK��k���Na��Q��Yp�y�6f�M����u���^l�m�������/��P�
:�����y/h����z3������{��z�a������n���w�=�I\eu������]���)�������w��,����7a��v��-�w��&�b @� @� @� @�ZM@��������Xd�E�I'�4{�W_}%���C�F���s�����{�����*�G�G�8*;^s�u��)�>��������i����^p��C�#�8<��������[�
6� {���b�|���r+�u���~��{M�@��Fe�u��!��a�N9��
��������s=zT��&�r����w�!]b��sH�����]rG]w�u���nb�Bm�f_O����;7�������={����2N�9:�{�O��5���tP�p]�k_z�������	���T��X�1�b��<���B|_6l��2l�����C�������
�o��-���z����?��a������o��-pA��
s���~�ng����P����Mn �3��C���V���
y���k��g�qzx��g=��~�p�
��O?��z�]s����B66��	�_����b�u�]��W�J�'N���Wx�����=���wI���c�-�{��g���We��z��*�����s�3%~_l�b`��$���r������
�e�=l��p�����{���Kx���rl�)8fK��=�%u������;��S6p����w���6]5w!@� @� @� @� @�-	���hK���O`��a��k����O�\}u����������&n���CQ���
+�����en���i���&V�(��y�l����g�~�����/���m���~��m��.Zf��r�{���z�_���n
��O�n�i������K�7��Ex�}��z�0l���}Re�W��i��k��`[w�u����c�1��	����f_�4�8�������3����`�z���b�I����*:^%OI~����_�5�|�fa�o}+�����K���X&A�<�bS����������{���J@�<�p8������K�z���W^yU���0aBZo��������{���\+�H^S�|��$^�N��w%�_/�Z|�9�����.����W[m��+���I���W^W\^���q�b��h�{\xx���0���vs7nlZ�k��g������z��+��u1�V�-��������wl���_m�AP;:l����s����_�_vyx%���#G�H��^h��m|�'��w�}7�s�O~������k���Gx��7B������b���Zg�1`�������&,�tR�m�����&��b�X�j�����o�����o�zA�J��=/��7�|s�a��>�(�����������;��v�5�����[|n���K/�u��N�q[�k����uo&�i�����=����{���(�_|����/%�����{��v�>y&�VYe����c��/��2����!V��
�F��+,�� ���
��L�h�Z�9q�]w���8vl�}X�v�m��g��`�p�����+<�Vl���v��B��[�E��<�wt���XU����
���;������g�z��Qp��G1���SN	[o�M:�:����_<��1#���;Rn1������|O��z�~O�������X�9�	b��r� @� @� @� @���
�5VJ?jR =�z�Ma���KP����b��|m���I%�[�����N7�����QG�h�u-qA�t[�[8�����U��C}�oaZ�a����c��8V����K��|m�5���z[�)��vX5jdx��'�n1���O�wI��w��a��IUb[}�5��~wa�������������8��!�)I���k>w^�<�H�
[�0�[�0�|4<����
@��f�f��
�j��c����Z��x�I������������1�|/�=:�W�\x��B�p�n��c�	���y������S��������I����'����.H��1��n����/����j���.������\�^{�����S��������^{�V��I
~X�[�`�ZA��X@ ���92	��V�����gQ�s��@[����o�09*#��8�@(~��v��vj�Blq�x�K������c����a�/�|�:���f����[\g��6\_�>}��7���
��|K����nc�{�����&o��=����������?/
��{�9�_�?k��xcZ���}��}��5���1��D�[B�����=����g�o~sV6tC��Q�v��)�n��r���� @� @� @� @��1��ml=�C��b��������������[,:dHx��g�*&k���P�b`��=j�2/���|��h��k���������s�	|p�>��n���������;�����J%'���0v���K�j���m��=|'����Jy��B��w���q���I��+��Jb��E[n�$��;.���J��Zt����KRq�v,�7�b����,��Zk�p�U#�������+�\q���*K����7
�'b�m��7O_�14S��q������-�PV������K���W_sM��hc����F�������|���ba�Bsi���.�w|��y���*!�,��jl1����V��4��=��3�����V\����K/�,�s���?1$ZR�2���������|����
������k����������_�2<���I��5��Y��+��7����a�=�L+�����E_�9|H����Z��a���y�o�~�gY�N����0W���_�v�q��}��7�s6��%�\2��q?�Xb�R���y�[�8�������_����X������l���n'��z��r��z @� @� @� @��&�!��1�i��M�rO��Zz��V]�r7u�6-89n�����o��O}z�	�����[����S�?r4��->���42p�Ra�
7X� _�83v�Ca��Ii�����'��U��[lb�ga�k����������B������j���f�p����5�/���o���x"�B�a����{+�:�b���b���{.�6�jx��I���?OCK������X1�Z���T�{8���g����X)i�M���@g�u���c�=>����*����u�[/���5�43n�|���k���Vg4h�������RK5��/���~���:���1����O,�H.�5���z��������~&����I(.~���HZ�Z7�Yx*	��CW��?��{���;A|^�gJ��������6���~GZ~�e�*���su�o������>��������W��F,NN/*�b��X
8V��6mZ�����I��������|O��]�������a�=�Ho�[o��v��1�r�����m����!b@6�4 @� @� @� @�@5
������6X�x��j��9�V!�j��J��� @��Z�9sfXe���'�|�N����C8r��Z\�9��@I
Zf�0{��t�/��bX9	�k�
����v�@���w�����t����OR����N?��p��g���`�s�=�V�� @� @� @� @��( �V��bN�.���`� @��M��K.��b5��8���h>mP���/��b�/�6���D��?�x6�ow�G6�]x���8��`kU� @� @� @� @��!���+3%@������/�y��J3q�C��z�����b�
�p�
�����{o���/����s���#�i���=w�ON\��(%��o$�����b �[[mU�����O�b8.��]���N�i�kt @� @� @� @� @�m	tj[�� @��x�����P���������N`�%�?9Q���;���6s��0f����{��a�
6+��r���[�x��0~��0a����:�������=+"@���g�w��/��?�<�L��c����g��,�7nl���/���<rDXf�e�e\� @� @� @� @� P;Bl��WfJ� P�}�a�����Y�~��u��b�M#�\3�@��q����m�E	����Y��M�S�M���1���3,>O�;�����[����w�i�0k���$�:�� @� @� @� @����[���� @�T�@�.]�2��������c�r�-We34�Z��������c���
��>���m}��	+��B�r�o�����UW]��h�T�@�����o~����6��
fe
 @� @� @� @������VcmO��^K���+���Y @� @� @� @� @� Pu/��v:�
�^���fBjU�c�N��	 @� @� @� @� @� @� @�������� @� @� @� @� @� @�5+ �V�[g� @� @� @� @� @� @��~!���#3$@� @� @� @� @� @� @�@�
�����8 @� @� @� @� @� @��_@�����	 @� @� @� @� @� @� P�Bl5�u&N� @� @� @� @� @� @���b��=2C @� @� @� @� @� @����[�n�� @� @� @� @� @� @� @�������� @� @� @� @� @� @�5+ �V�[g� @� @� @� @� @� @��~!���#3$@� @� @� @� @� @� @�@�
�����8 @� @� @� @� @� @��_@�����	 @� @� @� @� @� @� P�Bl5�u&N� @� @� @� @� @� @���b��=2C @� @� @� @� @� @����[�n�� @� @� @� @� @� @� @�������� @� @� @� @� @�-��� IDAT @�5+ �V�[g� @� @� @� @� @� @��~!���#3$@� @� @� @� @� @� @�@�
�����8 @� @� @� @� @� @��_@�����	 @� @� @� @� @� @� P�Bl5�u&N� @� @� @� @� @� @���b��=2C @� @� @� @� @� @����[�n�� @� @� @� @� @� @� @�������� @� @� @� @� @� @�5+ �V�[g� @� @� @� @� @� @��~!���#3$@� @� @� @� @� @� @�@�
�����8 @� @� @� @� @� @��_@�����	 @� @� @� @� @� @� P�Bl5�u&N� @� @� @� @� @� @���b��=2C @� @� @� @� @� @����[�n�� @� @� @� @� @� @� @�������� @� @� @� @� @� @�5+ �V�[g� @� @� @� @� @� @��~!���#3$@� @� @� @� @� @� @�@�
�����8 @� @� @� @� @� @��_@�����	 @� @� @� @� @� @� P�Bl5�u&N� @� @� @� @� @� @���b��=2C @� @� @� @� @� @����[�n�� @� @� @� @� @� @� @�������� @� @� @� @� @� @�5+ �V�[g� @� @� @� @� @� @��~!���#3$@� @� @� @� @� @� @�@�
�����8 @� @� @� @� @� @��_@�����	 @� @� @� @� @� @� P�Bl5�u&N� @� @� @� @� @� @���b��=2C @� @� @� @� @� @����[�n�� @� @� @� @� @� @� @�������� @� @� @� @� @� @�5+ �V�[g� @� @� @� @� @� @��~!���#3$@� @� @� @� @� @� @�@�
�����8 @� @� @� @� @� @��_@�����	 @� @� @� @� @� @� P�Bl5�u&N� @� @� @� @� @� @���b��=2C @� @� @� @� @� @����[�n�� @� @� @� @� @� @� @�������� @� @� @� @� @� @�5+ �V�[g� @� @� @� @� @� @��~!���#3$@� @� @� @� @� @� @�@�
�����8 @� @� @� @� @� @��_@�����	 @� @� @� @� @� @� P�Bl5�u&N� @� @� @� @� @� @���b��=2C @� @� @� @� @� @����[�n�� @� @� @� @� @� @� @�������� @� @� @� @� @� @�5+ �V�[g� @� @� @� @� @� @��~!���#3$@� @� @� @� @� @� @�@�
�����8 @� @� @� @� @� @��_@�����	 @� @� @� @� @� @� P�Bl5�u&N� @� @� @� @� @� @���b��=2C @� @� @� @� @� @����[�n�� @� @� @� @� @� @� @�������� @� @� @� @� @� @�5+ �V�[g� @� @� @� @� @� @��~!���#3$@� @� @� @� @� @� @�@�
�����8 @� @� @� @� @� @��_@�����	 @� @� @� @� @� @� P�Bl5�u&N� @� @� @� @� @� @���b��=2C @� @� @� @� @� @����[�n�� @� @� @� @� @� @� @�������� @� @� @� @� @� @�5+ �V�[g� @� @� @� @� @� @��~!���#3$@� @� @� @� @� @� @�@�
�������w��!]���s����� @� @� @� @� @�h5�L~!�gh���1�6& ���6��-�s�N�����U[[�� @� @� @� @� @� @�U&���s�u����ff:j[@���������b]�5N�1����	 @� @� @� @� @� @�������B�����D��@bkc�����G�tI�M����f= @� @� @� @� @� @�@�	|���B�^=�lf�C����j{�������:w��H�qN�6����	 @� @� @� @� @� @����$	����UX�K��G��u6�]���[������:���^2]��>����m,�* @� @� @� @� @� @����5kvx�����,���C�L�D�!�6��m}	={tK-�?��7/�5aR�6����d�#@� @� @� @� @� @�*$0u�������w������b���h?�`����\+�e��?�$L�_��s�EB���C�-��KX��<f-��� @� @� @� @� @� @��J	|5��0{��0u��ls����:���S�i��v% ������?�;�����9��+ @� @� @� @� @� @�Z]`�.��r�,�[���	�e!����mtm�x�gS��)I���Y��_�	s��O=��%[ @� @� @� @� @� �L;v1��m�EC��C�^=�id� PH@����� @� @� @� @� @� @� P�@��G0 @� @� @� @� @� @�(  �V�a @� @� @� @� @� @�(_@��|C# @� @� @� @� @� @� @�@!�0 @� @� @� @� @� @� @�@�Bl�� @� @� @� @� @� @�
��q� @� @� @� @� @� @��b+�� @� @� @� @� @� @� P@@���� @� @� @� @� @� @� P��[��F @� @� @� @� @� @� @��Bl`&@� @� @� @� @� @� @������74 @� @� @� @� @� @�b+�0 @� @� @� @� @� @��/ �V�� @� @� @� @� @� @� @���[�	 @� @� @� @� @� @� @�|!��
�@� @� @� @� @� @� @���
�8L� @� @� @� @� @� @����oh @� @� @� @� @� @�(  �V�a @� @� @� @� @� @�(_@��|C# @� @� @� @� @� @� @�@!�0 @� @� @� @� @� @� @�@�Bl�� @� @� @� @� @� @�
��q� @� @� @� @� @� @��b+�� @� @� @� @� @� @� P@@���� @� @� @� @� @� @� P��[��F @� @� @� @� @� @� @��Bl`&@� @� @� @� @� @� @������74 @� @� @� @� @� @�b+�0 @� @� @� @� @� @��/ �V�� @� @� @� @� @� @� @���[�	 @� @� @� @� @� @� @�|!��
�@� @� @� @� @� @� @���
�8L� @� @� @� @� @� @����oh @� @� @� @� @� @�(  �V�a @� @� @� @� @� @�(_@��|C# @� @� @� @� @� @� @�@!�0 @� @� @� @� @� @� @�@�Bl�� @� @� @� @� @� @�
��q� @� @� @� @� @� @��b+�� @� @� @� @� @� @� P@�S���j�O�LS��3g�_|9'��;���kr @� @� @� @� @� @�@ut��1,��SX�k���G���w����Yh��%�
`�q� IDAT��������3�����5� @� @� @� @� @� P���]:�e�^"������\O�@!�0W���?��I:�N�	�zvO�]�t	1� @� @� @� @� @� @�J	��;7���e�:}z�:mf���W�%�\<,��o���'@`!���%���:v��|(�t�b���; @� @� @� @� @� @�mN`����&�y���A�����5Z��P���w��K
LI>b�:��]Z���� @� @� @� @� @� @�@cz��V40�����3?o��� �H!�FB��:s�����Az������v��:qW @� @� @� @� @� @��
t��h8���w���ch���0�  ��
�n�x�O>����*
�������I� @� @� @� @� @�h�@��=�"�t���2L�6�	W�J�@)!�RB���@����w�V��� @� @� @� @� @� @�m[�C��o�^�"�L���ku*, �Vap�k�����H/���[�.�� @� @� @� @� @� �D��=��W��|v����bBl�t�ku�9_�I����"�> @� @� @� @� @� @���@��]�~���m{�VG��Blw��	��7�,�� @� @� @� @� @� @�ZR`�E�Gm��;�%ocl�N@���m� @� @� @� @� @� @� @�rBl��v' @� @� @� @� @� @��;!�v��L� @� @� @� @� @� @���	�U��� @� @� @� @� @� @� �������[0 @� @� @� @� @� @�*' �V9kw"@� @� @� @� @� @� @�@�bkw[n� @� @� @� @� @� @����[���� @� @� @� @� @� @��N@���m� @� @� @� @� @� @� @�rBl��v' @� @� @� @� @� @��;!�v��L� @� @� @� @� @� @���	�U��� @� @� @� @� @� @� �������[0 @� @� @� @� @� @�*' �V9kw"@� @� @� @� @� @� @�@�bkw[n� @� @� @� @� @� @����[���� @� @� @� @� @� @��N@���m� @� @� @����}�IY]
?t�&M;`	�Ol���PcW�5�^K,c�Q�H1���b�(*RQQ)� U��w�}�2[@�uw�y�������f���� @� @� @� @��' �m�Y[� @� @� @� @� @� @��N@[���� @� @� @� @� @� @�+N@���� @� @� @� @� @� @����$�j��;0 @� @� @� @� @� @�V��$�gm% @� @� @� @� @� @�T;Il��#w` @� @� @� @� @� @��8Il+��J @� @� @� @� @� @��v����G�� @� @� @� @� @� @�Xq��V��� @� @� @� @� @� @� P�$�U����	 @� @� @� @� @� @� ��$��8k+ @� @� @� @� @� @� @��	Hb�v� @� @� @� @� @� @� @`�	Hb[q�V"@� @� @� @� @� @� @�@���V�>r&@� @� @� @� @� @� @���������D� @� @� @� @� @� @��j' ���}�L� @� @� @� @� @� @��' �m�Y[� @� @� @� @� @� @��N@[���� @� @� @� @� @� @�+N@���� @� @� @� @� @� @����$�j��;0 P�#G�����f_�;u*������|�M\����6[o�[�+�T?=Cr�[n�9�:x`���s��w�=v�����{���v���,��_��~���]|�E�r6� @� @� @� @� @�X"P @�@�1bD����b�����	 @� @� @� @� @�(Il��jR���Vm�f������=���:28s%������#�H�j���n�i����Q�V��4����y�2��:v�X`l���1d����:	 @� @� @� @� @��~����g�� @��T���_�	�g�'	l�>�\���Ne:��C��^y������ @� @� @� @� @� P}$�U����	 @�1l��T!���4	l���@�~�b��E�C��_�j�i @� @� @� @� @�*T@[��[� P�3g�L7��kV�f�^�
4���-N� @� @� @� @� PujV��9 @�@iy����Z�j�n� @� @� @� @� @�K- �m��<@���/0v�'q��W�.;�����U�4�fMW��:�QG���b���e>��a���3����lmVk�5�������s��}]L�>�Ls=���Q�^��k��J�u�E��{���b��l�M���}w6n��Yq�-7����6�Zs�h��Ql���q�	�����-v�d`����|y�M����������$�g��K�?o�_���������g~��������v�n��l��^�}��i����{�_|��:��>F�Y�����O�S�l�����9��]�����������n���+�{��^*�M�0!����8��##��n�j4l�r���Ul��c�����o,X�`���x��x���c�����W����t��>�Lv�1c��������Fr'�~�i�U�-�wb����4�������%_��d�����1�zf����N,v�a�H�����LS&�s�������uiZ��J�9������O<�x������:kg��_�}~�����/��b	 @� @� @� @� @�*�@�J��'@���H0�:��0`@���/E��0a|$�$��u���`�~�������H�N�$:����H2�W_}���7����]�I��GuT�s�����G�A�M�X`���&�����������s��V����V��}2	{�m�6e��H^o��fL�vZ\s����n��E�L��G}�}���7�P��\o����GI�z���+L�rH�L�y���k|��w����������[n�%v�u����;���$R�:hP��$4y%Il�w\�x�I���? I���I'f������~�����x��l"�I�S�p���C�}���I\����%����z+�z,����c��J+�T�<+b �������?�<����>����+s'U�^W��5 @� @� @� @� @��]@[u�8?�F I��{���T[�m�Xc��#I����/��IK��|����&�%	
���O���k�a�Z�b��6�&���'O�d��%�s�wl��3'��Q�m�������S�F������z��h�����s�f��p��L���b��1�d���M�6�����pw\{�5i��;,�[�"1IGb�,-���N;f=�Z��5#y%�_q��1���g��~��quf����+.<����O����_?��G��'�|J|;��y��������%	����9����r��g�|P`�f���:�d��e�������D���_�>�,�w�?����^�WfL����]�������:u��W^9>��{I��{���2W5��d��=��Yy-��%���-W����7����'�����[*���e^[��-c����$�%�m^K�.�������vt�����;�@��#J�����/�0�\�������n��[?����j^R�m�����'���c @� @� @� @� @�@���Vu?['#@�@*�$m���HN���g��������J��z��q����(x���H`K*��p����j���%U���T3J��%������~�����c�s�����{������O�K.�4Z�h�].I&���+��$����W^Yd;�/���"�7f*�%�I;����{%���=/�X�$��u������5�Z+���$�����q�-7��a�_tQvo3g����~:<��"q�;|�O�v�����M��o�rs��E6:c��4�m�
6���.��
��d�M�I��$��k�������n���S"IxK�k��$m����H�r�$�4[r^}�5�w<I���w�9������\S��K���O`;�����K.�F����������{��g��Q#�\�:����_ke~���v{���.������?,�D���~�mq��F���sM��;����������-����d�:u�d�p&����IK���>���Z��/����&�|� @� @� @� @� @�T]%��g�dH����c�����n�1����"	lI@R���o�W_{=�,��%I���.�i�����������:��$k�%@%Ux.�$uTd�K`������d?+��R����b�=�L��T#���)�
y�?�\l��V1���O'�������%�uGyd�5��8�����$�$�hy�O�J<�_|�^y%����W��	����O>og����\	l��[l�E<���i�Zr?=���9�4c����?�O��$�&wa�$���kg+F^��������g�y&���k\��w'�%
4�&�����q�e�7]��d+(���K����H����K&)��L�B��^E�$����NJ���$���{_6	/�]~�e%V���sX� @� @� @� @� @��Hb���f @��oZ ��s���{�w���	��$)b��w����J+�%�3��j���W��k���qF:�/<��VQm��W�+�(Z]-o?=z�H��T��;wnEm���I��$m�C��&M���$��w��Pd�W�c����$Q����_����_��m���V��T���;�P�e�7o��~��~#�s��TK���$�]}��9����O>%[���m������mT��V]u�2���r���n��9�I��N�:�c�K\��@9w&w�q��s����W.I���oc���r��$@� @� @� @� @���3�����2���r��93�8��s~���A��96�d��IS�9��C��?��s��F��_��2L����D������d�M��$�����,6vE�p����U�eZ6ID[o����&�����b���`�t�G�*>��,���;(.I���_Nc��T�\c�5��u�:ub�}�)v��@���>�������}�(q��>�k_|1��������Rd�����k�>���\a� @� @� @� @� @�����m[E� PP��!o�IT��]5�����e�n���Tck��M&!��l��#F��\�s���s��m��E�������"����W-��W�����s���'�;��"	jC��q�>��$I9Gy��Z����@��;��2��q����c��y�x��t���*���5+����?"����9c�wv��K�1y�7�8����}���o���ve�u��Q�~�2�QR`�{���h����4o����������]����1a���F�����#@� @� @� @� @�����*�h�(M`���iH�d�k[�4���Q��K*��4w���V���5kV�6��[����K�_Q�u��-5����q����K/�E���	b�����v�x�����w�}�Xm��J��8�rH+����x%SE-��X��p��"aI��S������n���k��N��b�~�q�UWE^��_7�xc���N��6[�f����3wp��
�������d���p|����*��j��]��y�?f���E�u @� @� @� @� @�T��U�(NB����nf���P��\�����3'�d����q����7j�8����ez�<����S����I�]i	,�mb�UW����'
{���7o^<���i_�cz�6�q�*�T3�q����_,s[��_/���6�C���_��a�F���Qb�&i��e<����I�%wb��O<��}v����j��U�-��o����4���]I�]i�Q�%�Aq��J��8 @� @� @� @� @�@���� IDAT���V9>'�$@��2,X� }�n�z�<O���+��.cRXRI,������P5�`�
��I{�Z����c������y�x��H�n������n���\�4	�e���o$������k���
1l���6}F��� �/X������eY��gj��Q�x��v�1>5:�:��Xk��
g�G���w^l��K�"bUmeI���������Mp. @� @� @� @� @��$��& @��4Ye�����C�������c���$����J�8E��b��W`��w�u�]7����g������I��<���U�6"�$����K��w�u��I����'�Fm����(
'����$!3����`����/�3W|��?�������Z���]uU|:n||���x�o�8��Sc�
W t���q��,U���k�����7���%wP^+�wK� @� @� @� @� @��T��*��e�Xz������6a9T�I*�5�Wl���e�����J�Vi�$�.�������/�4���[5��c�$�=z��<p��S�L��^}5���1i�?XA���/��2�>�z�mQ�~�W��U�wQ��5c��VK�����J�/�4iR�1%$	�tP�����`��xe���$����G�s�=[��vl���K����|��4m���x @� @� @� @� @��W@[�����e���i����c��Yez���:��c��))4;�p��?~|��c�������i��9sr���\Iy�.�K���S/����::�����o����D�~}#����;��Vk[������_/=����i����G�Zk�X{��K�b���J��d�M��w�{���#���4[o�u|��h��e���C�^�)*M�'\�^?�dILq/�:� @� @� @� @� @��J! ��R|L6I��e�q������������O��'7��5�c��W�Ij%�����y����7_�|����h���;wn|��7�N��7����V���6l������>Y�����M�6��{��?p����%��=z�����&��5OO:��/������52�Jk��y��������;����9dH|Q��������.u��
h��it��U���KO�]�5~�,q�>�����.�w)1�  @� @� @� @� @�@�(�_W���=��@R5���o�:��oW��_]&����.g����'���u�}9��:o���t|�5����Z�����
6� j���v���K���������������lym��a��2����^i�������7.�~�UV�}�����$�K`�M6I�'O�}�Q��b�Z�j��}>yr�	�I�E^�V,v���������J��?��}��v�]w��)S��U��}���\����\����{�����g�n/������{���k� @� @� @� @� @��Hb���� @�T��.�<j�����1cF���n1a��b��>}zw��������z��c�M7M�.���VL����^�^y%�=����f1��4h]�,��s�U���p{/S���K/)�]������L����1r��
�Sq�m��c�5����??
���G����{L?�2	$����������s����l�n��N�:��_~�%.8��H��
�d�/�^sW�o��y�y�Yi�����8��Sb��%��/^>�`��Y3��,<O��={��������{��Q�F�S��������}I%���>��m����S��}�=b��m+��� @� @� @� @� @�x��f4?n�����[nW\ye&���i>���L�&��?�1v�i�Xc���	"_~�U��������f���E�����;c�m��$Q!��q���g�^��.�D��M���?����H`���s����;g2p�QG�	q�M�[��q��'��n�Y��x����o&�$���k&��_,q�9xt&����oJM���el����z��u��M��Y&Q���[�[+�V�Z�2	&="����%��_+�$�^r��q��*�������z�c��6��+��N�$��~�jhM�4���>:����ll���c���q�I���_?��6&�����>� {�������O����2���A��;�������wG��}c��]c��V�T�����v�9��u����9��/��2�M��a�c�m���6�(�7os�1&g*�����o��z:_���+�}���q�-��\r���VdL�z�����+����['�;�������E��q���g>���s���p����1o�w�?fL��R����w���2F� @� @� @� @� P$�U�� P�3�83��q�Ygf���d�������,-���?��q���g�J^w�yg���m�����'�J�+��I�zsL61e�����)S���]T <IX�}��1�����$�
6�0n���8����I����A������C��$�d?G��W_}U6!(i����b��7/�Wo,��Ge*n%����$-
<��t
4,v�k��6�{������1�O�Tt���z�e�j�U����TL��C=$^{���ts��-�\��%���V�'���W/���-Z���JK�M�x�O��-��Y�$�+�,��Vx���z+���V��H*f�%����n���<2�d�s�9��<IGRm�_&A�]��9�u @� @� @� @� @�T��U�(NB��	$���|p$�������k���8<��RRK*������n�GRy)Wk��a�}�91x��h��M��}�k����~&����s����:1������O�9^���|�����P��\RQ*�z�[l�g*�5k�,�Z��=����J,p��W���������U���-4j�(��Z{�qQ���J��9�[o�x�����T����M�f��������u���5�\s��{�}��g��d����OK���a��3�<3:��H*�����/�$���V����%�V��-���z5���\-�����o��{��kX @� @� @� @� @�@��8�����
	�?f\�4�[�
��Q�6�����*;�&M�3gDR��u��b��6�T������6mZ���1u���3gN4o�<�g��l����&�����q����Cb��i��i�X��c�m�-6a����x���b����v&�&~6)Z�l�i9�92�o�����_��p���0k��b�����e����J��Z���;f�������������]�]��1�����������?�8[Ir����$�%w�F�:��oI�nUkc�~gw�����g��6t��3zt��nf�b^�-��~~ @� @� @� @���
|4nRvk�v\���E�"P������t�
 @�b�Jl;���r[<I~�����6_2QRe)yi�#p�m������������A �n������LK7��C�N��I�e�!I\L^��u��K#@� @� @� @� @���5�����T_���{/^808����/���!0k������t���7I7��� @� @� @� @� @�TYIlU��u0 �[`��	q�����o�q�~��s�%P��g�����b���9O7e��8��������w��!���9cu @� @� @� @� @� P�@��CD @��Y��_~�������������b����5k��k��{e>��Xj���G��/���sN�k�>:w���Z5.\����C���E���6h� ��`��� @� @� @� @� @� �l�����S @��$IlO?�T����U+z��>��a�"c:T�	�G�����k���N�:��G� @� @� @� @� @�@$��J�
I5�V�ZE�n[��O;-��r��p,g �T/�40�x���������c��i1}���S�N�h�2�l�Y������������R�
&@� @� @� @� @� �C�������T%�$	g���U�H�B�W	�k�>�W�^�~�<^"���g|! @� @� @� @� @����V,� @���	$��.�������7_�I<E� @� @� @� @� @��*" ���|��A��vZ�n_��$������ @� @� @� @� @�#P�b��* @� @� @� @� @� @�TIl��SvF @� @� @� @� @� @�T��$�
��, @� @� @� @� @� @����$���);# @� @� @� @� @� @�*H@[�[� @� @� @� @� @� @��A@[u���� @� @� @� @� @� @�$ ����-K� @� @� @� @� @� @���  ��:|��H� @� @� @� @� @� @��
��VA��%@� @� @� @� @� @� @�@u��V>eg$@� @� @� @� @� @� @�@	Hb� x� @� @� @� @� @� @� @�:Hb���3 @� @� @� @� @� @� @��$�U�e	 @� @� @� @� @� @� P$�U�O�	 @� @� @� @� @� @� PA��*�� @� @� @� @� @� @��������� @� @� @� @� @� @�� IloY @� @� @� @� @� @�TIl��SvF @� @� @� @� @� @�T��$�
��, @� @� @� @� @� @����$���);# @� @� @� @� @� @�*H@[�[� @� @� @� @� @� @��A@[u���� @� @� @� @� @� @�$ ����-K� @� @� @� @� @� @��� P�:�	 @�+R����������-[�Gq��\�Z @� @� @� @� @��M	Hb�M}6C�T�������=J���%�U�� @� @� @� @� @�Xf�����	 @� @� @� @� @� @� @�@)��J2L� @� @� @� @� @� @��. �m��<I� @� @� @� @� @� @��Hb+�0 @� @� @� @� @� @�,��$�e��$ @� @� @� @� @� @��" �� � @� @� @� @� @� @� �����QO @�����mV�9s��X�xq�?j��h��Q�������;����q @� @� @� @� @�����*�'h� @�@���??,XP��IB[Iq?-ZT� @� @� @� @� @� P�$�U�O��	X*���:�O?�T�3O=�T�o�^�1�G�Gqx����6�!o�UbL�����3n���������nq�
7�Sx�A���<��o���� ����T^����[5 @� @� @� @� @�@�����1B�@�0a|����%�j���%��7o^L�0�pw����7/q<����f�:��S���h�}"0H~$��{0c�w���&�;v��w��9�}oX���
�"0H~'��=(�7h� @� @� @� @� @�����S�� @� @� @� @� @� @����8�r�%P�����D�������(�����V�%� @� @� @� @� @�,'���M���i������!@@%6� @� @� @� @� @� @�(7Il�Fkb @� @� @� @� @� @����;@� @� @� @� @� @� @��& ���hML� @� @� @� @� @� @���| @� @� @� @� @� @� @��j���&&@�TS�v�������� @� @� @� @� @�Tb�� @� @� @� @� @� @� @��r��Vn�&&@� @� @� @� @� @� @�Il� @� @� @� @� @� @� Pn������ @� @� @� @� @� @�  ��w� @� @� @���� IDAT @� @� @��M@[���� @� @� @� @� @� @�$�� @� @� @� @� @� @� @�@�	Hb+7Z @� @� @� @� @� @� @��$6� @� @� @� @� @� @�(7Il�Fkb @� @� @� @� @� @����;@� @� @� @� @� @� @��& ���hML� @� @� @� @� @� @���| @� @� @� @� @� @� @��$����	 @� @� @� @� @� @� @@�� @� @� @� @� @� @����$�r�51 @� @� @� @� @� @�Hb� @� @� @� @� @� @� @��r��Vn�&&@� @� @� @� @� @� @�Il� @� @� @� @� @� @� Pn������ @� @� @� @� @� @�  ��w� @� @� @� @� @� @��M@[���� @� @� @� @� @� @�$�� @� @� @� @� @� @� @�@�	Hb+7Z @� @� @� @� @� @� @��$6� @� @� @� @� @� @�(7Il�Fkb @� @� @� @� @� @����;@� @� @� @� @� @� @��& ���hML� @� @� @� @� @� @���| @`�
4o�4����}�����un��,#G�L�;u�,�^�}N�>==k��;��e���
>��z���/��� @� @� @� @� @�� ����e	 Pe�?��x{�����/b��YQ�~�h��ul����[�_l����k��Q�F�9�� P�&N�}���!C��q������Z�jE���c����.�u����.~���Q�^��}X�'@� @� @� @� @� @�B$�U(��	���>�,�=��L��"��3gN��3>&L�>�Lv|��W��<�Ht���H��(��1�9����_��_~����I2n�zu������h��Q\{����1���A� @� @� @� @� @���Hb+��=zt���N��E�[�
�U����3g�,� ���_�7�|��&��?�n�����~�=��[7Z�h���>}z,\�0�={v|����g @� @� @� @� @� P�$�U���	X�I�Z���K�j���|w����C��Q�FvG����w�}7�}�����_L�6m��b�����X�xqv��
V�&�J�@N�O8�@�.��g�uvt�j�H���Tg5jT������@�;���sUT�&�l_�m�|���+j+�%@� @� @� @� @� @�����%�yw�yG|�����I�����}���P�X��v�e_�_qE�v����q�"qU��I������9O�6lX<����aO=��q]��E_�f��x�����2	nO<�xL�6�H\Eu$�����JE-o] @� @� @� @� @��A@�2�y���-���K�@���{���B����3�<�p��Xa���6m��UW_]����o�2�	"@� @� @� @� @� @�@q5��O��F�����N������w������:w���a����
n�n�u���U4o�4:m�Q�v��c���e^e����/�E^���[�k�n4]�I4i�(���o�m\���.����y�-��/��b���&U���Z{�5�g����;t�U�4�Z����������K��`�U��Q�G�v�m�N�:�J1�����.�.�m�Vm����?���K����/��o��z��LrO.MK���{�?��O��#F�����
6X?{/&1���k�����E��fz� @� @� @� @� @��P�-�.'0w��H��Zy&PM�2%��|�����d�q�>������������.,n���Gy$N��I1k���q_~�e$�w�y'����8�����n��W^9g������_������w�e�����z+�z���2�o��J+��"�f-�N����K�\�wW����>�w\����������~��Kc��m+����o��?�@B�7�|����^�;��#����D���+|�6@� @� @� @� @� @��
Hb����} P!I�TR�(�2�{����O8a��e�O���CI��^{�X{�ub�����G�������~�VO�]�v�s�������&H`�Y�f�k�>Z�lu���������~.�$i�����I�&�O<Yjb�_2�nW_uUv���z��.M`k��e�����]&g�������_vY\}�5�cIs���7N�6����I[�j�Z��}���������O4hm3�j����g�f���$�u�����!Q�F�b���{����S���w�U�3K3���OE^5����G�L��u���3g��N�T��s�=�������[/��b	 @� @� @� @� @���@M Pv�$�b�M7M���_����e�����M����^���j��s���O�e�
�~��Tf�l�����D�$����TU;�G�x��gb��1*��1�����^�a�G�_~�]~y$	nIK���������%U�
��$��������"����Z+����|o��n������:���.s����?��<�5�*+�e�.��&N�W_}U����s��&��t����WS��a����#c��������k&w�����$���s��=J|fi��z���?�����z5���g���$�����s�9{i�K� @� @� @� @� @�@>Il�XJ��={�O$��������cz��������ZRa��'��w�������A<�I�J�����T"+��������q�]wgH��H�[�L����;?.���t��{�I�&�_�,X�2��^|�����Wk���K���?�F��/��mY�@�8���
T^���+b�]w�G}$f�������u�}��	'�Iu����M�0��h��U���SO.�u�u����;��3�4i�N�$������%�^��%	o�F�Z�e<G� @� @� @� @� @�ZHb���� �,G}t���n��IY��}�� �[����[��/�&�-Z�hY��>s�a���o���-Z�g���=���1s�����:u�$�,����O�����7���<Vn1��rj���m���D��ly��L�'�����K3wS���S�g���Z�����g�qz<�������V[mp`��4l�0<��t���I����*�"����Q �.��� @� @� @� @� @� �������Ts�Z�j��?��2�$@�os����^}5����lR�Zk���sN$	aK��������I".�7�x=W�R�%��5k�>���/�������J�r�M6Y��/��k���V\���[�Q�F8�d��������|p��f�8�������_j����V������:��[��Jr{��W:>p�K�� @� @� @� @� @� @�xIl��!@�@������n�9�
I����_��������o�Nu��z���r
t�b�\�i����m��I���pT����/��c�������n�+��"[5.�+��Y?�*u��
�]�vt������7_Ran��9%�$@���������%�^m������?�p�:������;��:w�\bh������g�[��]��|�&�w��k���c�F�4� @� @� @� @� @� �t��.\4�H����FIB[R�h�������d�������I�F�����?��CJEl��i$��Z��m������M�<����s��?��>���_��e�|�p��b�,����G��VR�?�p�������/��e�������	������c��C��7��q�>MC���o�!f����v{��5_����������+:!�m����X�/�g�Z�����_�X���	 @� @� @� @� @���*�U���	X�5k��.]��i������|���z����������Y�W7k��I�6��Q�4n��r>3y���|�.��kK���L�4��r.�+:����+��(eh��}���3����5zt�Z�Gq��gD��u�)����x����4e�:%'��i���q�wm�LBm�6���w�
��e @� @� @� @� @�TJIl��c�i*�@�n��??��_����I~x(��VZ�_������^.(�T9�g�}b��	��Z�j��GO=�tL�lR��av�_���k��W/2���@��v�����O?S���w�U�J����pB��E��*�@ @� @� @� @� @����$��j:8���b���J��|sH��"����[�/W��sL�5lX$��>}b��O��I�F����{��]w�-��i���+�������� @��	�~�����J���oV9�ysK�k�q�=�4jT���r0D� @� @� @� @� @`9Hb[���#@�@a�����[n�vO�:�pH����M����H��o��&�j��Y��L%������8"v�y�"1�;�����J$2H�Z	l��6�y���7e��*���K����v�=���i��wme:�� @� @� @� @� @��Il�nM��@��g%!,Z�(��WRH���O���iL���O�81��&_2J���u6,/^\��~��@���F�U���|�q�g�8_L����u���>#� @� @� @� @� @�����|# ��'A�j��L+8�����|3�����t�|�"���/�Q��+�C������+���j��E$�%�R{��WK�.7��W�#��g���� @� @� @� @� @�(/��3�ke� @��
����c��Ie�����cX��Y^���Vez��;�*1���;�L�Y{�u�k��E���07l�{E��w�=:���[b�A*��s�=of�_��f��>�'
���lwWY��-�M�>=z��b�������<��bc
 @� @� @� @� @� P��$��m� @ ��SO?�;w�SO=%������^���xP���+���w/��tl��O����������I6{��G��O<1j��Q$n�m�K��<�@|��Eb��O?t�?-Z�s\'�_`��1���;��������n�;����b�=��i���?��#*?B��{���;�p�5kV{L��)I
�~����'@� @� @� @� @� @���#�
	,X� ��l�k�
6�m��&��o��5�&�M�Tj4��>|x�'/���h��M���7�y������~82���3��T[�1cz<��1`��t�
7�]�r��9�<!��v������c����]f�'�pbl������j��7_���������L[e��M�0!��M���:G�O?�T��d��6`@�x��w���_o�8��C��� @�����H^���Zl��6�Q�N��E��Y�f|����54^y�����������������������SO��#?,��WS�*�w��WG��E��v��w�n��y>G�-"���U&�����n�m��[7>�a�v��1y��4��k�
6,q>� @� @� @� @� @��(�/~s��%@���	��Q������D�*�%�!��{^�q��%��cI�Y�L���;/��}�jIB����:u�����^;n���8��c�����[n�9�*��m�6��/��VZ�0��v��W�V �.p�#��T>��@r�oS�N��~8�*����n����B�e,I�}��K���k����a�R��.������������u��=�������C�5�� @���o����(����t�K	(�F@���
�������(h4���-�DS�D���(�+��X��QD�DPTT��X������e2�.��\���3��=�����?�^7 @� @� @� @�@V����p�)(t��n�=������7��#����?�'�|*.���
��>y�i���]���+}*��t�����������2�K8p`<����c\y�I�&1p��x��q��s���8F��Z p�������QG;v�tG�m�]�x��1b����Y�J���	��mO?3&�{^�H��7�|K�����v���1 @� @� @� @� @���������*0�?o�K�����u��U�EEE�����:��3f|����$��U�������g�h��U���6,~��S���n�Y������.�'�S�NM;���~��m���S�NU�[<)�s?q������1��Y��e���A��u���u����e2���V�����I%�+�j���:eJ����1���1g�������
�l�l�m���zkvAk�n��7s���n��v{v�a��S����}.f���:|�����v�)

 @� @� @� @� @�@a	����t����^X�[
4����X�5j[m�U��j$��}���[��W�^$����A�����E�1����{$� @� @� @� @���?� IDAT @���/����7U� @� @� @� @� @� @��b�* @� @� @� @� @� @� @�@fBl��*L� @� @� @� @� @� @�Bl� @� @� @� @� @� @��L@�-3Z�	 @� @� @� @� @� @� @�!�'�� @����}�����L� @� @� @� @� @�@�Bl��8H�Xu��;�y���h����r% @� @� @� @� @��!���!� P�:u����u��v��j @� @� @� @� @� �����[�# @� @� @� @� @� @���[�<i�$@� @� @� @� @� @� @�@
���[ @� @� @� @� @� @� @�P��
�I�' @� @� @� @� @� @�j@@����� @� @� @� @� @� @��" �V(O�>	 @� @� @� @� @� @� PBl5��� @� @� @� @� @� @�(!�By��I� @� @� @� @� @� @��b�t�$@� @� @� @� @� @� @�@�����O @� @� @� @� @� @����[
��% @� @� @� @� @� @�
E@��P��} @� @� @� @� @� @� @���j�-	 @� @� @� @� @� @� P(Bl����� @� @� @� @� @� @�5  �V�nI� @� @� @� @� @� @��Bb+�'m� @� @� @� @� @� @��!�@wK @� @� @� @� @� @���[�<i�$@�@)�M�4N?��{.�Z"��;������������d��gGqD���_��V,���_��i�-��k� @� @� @� @� @����[M��/k���1c��S�'v��wt^�h��Y�o�6zl�y|�Aq������c��ek��m���'�}��VHn��[,Y����\z�%�k�7[�����������]����Z���v���O���n�2?��SN^������_.^�a�����\ @� @� @� @� @�VA��*\��	L{��8���Eb+=�����M��S����>�����s�s�}��W������I���g�{�������V�kMo���X���n{��w�{������~k�@�N�������h-��� @� @� @� @� @� P�Bl5����:)0y���k�=���?_a���7�v������c��Y�t����>� f����N>�5�����u�����[V����C��V� @� @� @� @� @�T( �V!��(+��p`>���A�8a��8�������G�z���,X����Gy$�NZ�|�I�b5x��;�����tM�6����55%0j���:eJt������� @� @� @� @� @��@���- @`�
\{�5��XI`m�]w�e�]=z����&��]v�%.����2����?�)Z�j�Z��m�%]���i�~�����k	�=����e���u�]W�6`� @� @� @� @� @��)!�:��,��� �����/c�����~\���4i����b��v�t�	�Z`����-Z�����[��� @� @� @� @� @��b�JV]�Z�W_}5��=���[����M�4N?g�q�*�����u���C�:���3��~%�y�����fe&N�Xn���g�/9h��r�$�<��cVV:=��w[������XU��t�z��q�	���[l��!��n�v��vX�����t��
�X���)SVX�����)K�,�;��3~���c�
:G��c�.��;lg�uV���K�Ke�}������3�=���{���u����mZG�V-��w�e����b���UZ���~����|����i�������k�mR�vm�M��o~_|�E�jOJ,��zo�+���}����.�0f��Y�Z&/h��Ey�Q��Y�f������ @� @� @� @� @��	4����X���I�x$!�o3�������1a��U.5��	�k��F�Ih�����I��Lx���"�<���q�_�_~Wt������H�Z4 �}��.I�W�'Y��O�;�>�|UK~�y��w_�����d��d�>� ���q�����
�K/�,�5kV����}1����/�\�����?�|����x�����M6����w������;wn��n������{+�cB�'�xR\7lXzr��k�gn @� @� @� @� @� @ !�,T�$@`�Xg�u�Q�FQTT��1	�
2d�������YjZ�xq4lX�?�/L(b+Q�xa�{\�p��WX��;����f�������os��J�����X�`Az��\����nZzJ�}�\�������n���)�����
�_���V�^�
�=jT~�a1o�����m��f�m
4�)�nj3f�H����+������O�R��h����o�x���WXS���cQ�\M�w�y{�[����k�n��C�h��I|��'�������Nt��|sL�6-|��H���������s��������&��ZQ���=+�n������A��g�DE���H������I������3#���<��;4�w�^���SJ�G���� 
Z����tY�����=� @� @� @� @� @���@������X����6�l���5��;����::v��Wi��o�y�n�:
}��W1y�����g�j%����k�kv�q�2�}��e��7~�Bl���^������w����Cl�zh���~e�T���'�R�iqb��Zq��U�VqL.������o��G��%{�$�����H�\�c����I'���OOR?��q���O�!������:
�%��d?������h����3'��}6��������S�[�M��z�aq���D�\x)	�������oqa.�����������/q�o~S�{�y���.�����86�6m�^�����!�#�M��\�r����W�~�����O��'���]�t�n�)v�y���$h�����n���r�9X���!'��&���
����N @� @� @� @� @� @`U�����r�k P�������,Y���_�������w�I�:#	P�P"tV��ZU�������&a�
7������y7�tS$�d$���o�!�u[y7�!��[�JF�I.�6`�A+��sI����GF�-������#J��H�@�:u�1��d���`b`KF��{�}������k00����oM��C���,`+^�Yg���sn~�7����]es�����n�!'���%�$����;v��x��K����5kV:7q{h��l�����*y��\'���~��������{���?���E\A� @� @� @� @� @��J��*r��sL���?8	��~�����^���wr��q�o������J_^�{�>}���O���[�II0��7�H?�����'���d�27ZKL�81N=���9��3��~���%]��gQ<����
�~�t��vO+7�r��s�1�9�G�^��[Tx~u��r�-�}��U*y����yI�����o�����o���V�H���rh��+�Nu��$z��w�O
4(��n���F�Q���N+���UH:�{�q��������R��"@� @� @� @� @� @�@5����e*�
�����v�J:��������|2���?���.ng�qF$A����}��O�����+.��s]������L����)Q������g�}GyD,\�0��w�=.���
wv�����]�v���������s����sc�F�����~���Gu.�Us��im����i�������>��yIG��1}z�5'O�����!+	��9���*����������k��.�p��e�_d @� @� @� @� @��!��sM%@��o�4i�_~Erb\s������+�K���I���n�+��:�8��2����>6lIG�7�x#� \���x�5j���G��z����Mx����}r�����t��8��A�����[�p�
���n��oV��1c����������p�d�/��2�Ly+6��{U�6�4����<�&&&����z����1s��H��-.Z��RJv�=gv�����[U8�]�v���=�/���
������i�cm�Qt�����h���.]��>���<�p��'s��k/2 @� @� @� @� @�XmBl��R!
Q`��7�+��*
�M�4)�������������$I`��\+��l��5����:&N�I����?w�u�t��9sb����:IG�$x�U�+[2>���xw�����-[�[l�����p����#�m%!�;������t�I0�x���[������k�	�5�� �g����5��z���Z��������%�k�|�M��Nh��e�����9�����Z���
,���E��7%�{����:��,�����]�
����������1t�P!�*��F� @� @� @� @� @�@�����d*�_�~���+���_O}�����K.�#�_�?�8%��h�h���
��������1��	��SO=�vhk��Ml����R�K��Q#�!�rs���;�PiW�nZ��<��#q���W|�%�F�J:t%��.j.�_�����p����*v"+����t�N�527	;���>������_���h����g���s��j�j������e�V+;�x��k]�v��S��c�=���~��� @� @� @� @� @� @�����:��A�e�����{o�6�A�x$���>���>}���M�<�6j�����{����_���o��%?����omS�L��w\,[�,���c���|��Z2�V�V2��!����5k��J5s8�zv��l
4�������L��s�����V�t���F[�xy���
��k��q��um�i�z����'�[Z�dI�p��U�^��6�A���r� @� @� @� @� @� P���u\6h��i�3�<+�t��_����)���[�(�]m����������{���<��gc�����I�����D���:�C���?,f�����g��q�WVyWI��$�S<����2a�������|�Z6��[o�7�|#]UK�k�]C���?�_�h��I���;���5q�e����|����ye��r���Mq�
����N:���n�������.o��QE�+=W��b��L @� @� @� @� @� @��
���Gca�-I��w�1���>����� �Fo��>}z$s��6-�N�������/z���������3O?������?�{��~����i����b�������mw�}O4m���[L\��o����'�V���i��?����?�I����W��7o^�T��m����}����|���?���sUH~�9��t���3�����%;wL�����
�7�]�+[�� @� @� @� @� @�T_@���f� @�@���tU�H�>}���nl#G�L�o�����S��_�~���^�����)Sb��Y��-��2Z�\��*=��G+U
�T�����*��NI�~�����~]W�\����}/L�:�WzNm���Dp�hQ��c����o�����v�t�I8ru<�JoT��-zl�?�`�����;��Z~h��EQrNv�R�!CN��6��J�'��.\���k�gV��Z����^c @� @� @� @� @�u[@��n??�'@��������v����U���7|��	1j���{��{���������	����]~m�����-Z��������{��8����5�=������*��c�=��=�����W_�R����]�CV�x���^����\/�l����`e��8�����������+�����w$a7c�l��v��W����1c���^���Fm��3cF�N��|��+���K�)� @� @� @� @� @� ��	T���e�|[���
�w�M�r�g�y&^�u�*+��<��������L/)�J:�%]��x��x����,����V��
7�0_1����c���q�QGFQ�����g�8��sW�\��'�]�>������_�Z�!��u���5���m��������_Ec���q���W4%�s������{�Cs��*�
w�UWe��B,^�����S)A���w;�4iR�%������?]�^�\hn���;G� @� @� @� @� @��Z  ��<D[ @`�
�xxDl�����_�I���1�������Oi��YpP�����#Z�n��{�����/��6m���;�����C�|��#����O�5���vX��[o�%^~��j�~��������?�0����l7�|s$A�U���%��]r�_����]$�Z�X�ti�������J�����?�$6����
�_z�;��K�����/��R�)��������T;$Wn�oq���O�_�����o�?��j���o�����s�����m���W�.wGyT4m�4�a�{u��G�����1����/� ��~���l���u% @� @� @� @� @�u3�� IDATB�a�X�E @��	,\�0��l�g���;��St��-��m����:�=����8q�
+?�7����_���$���a�H�o�����c�h���
����;&L����@JvA+99	�]u���������;��r;�5j�(�:��r�/}��c��+��<
���7/���1v�u����{4n�8?}�^�����*}y����^��s]����:�����[���{�8����������y6
<%�����;��#?"zm�+�]�m|5~L�>=�O���_����&����I��1p��Hh�z��i'��s���
�����O������r���_u���h������.��5����.;G�N����3b���qK.0���}����S����,SkMH��%�x��G����/��'����������{��'z���|�����O?]K+�{���:����_V��&�g�}v>���+�������>I��-Z���3{��'��'��0�NB���Fg��n�1n���*��x������V�5�mZ����k�?���
k:I� @� @� @� @� @���Bl�TS�~��X����|*I@��3�����_V4-��jI��x$����.���?�>8	�l����J�]���c�F�)=�7o^�[��������N�%K���'s���Sry��+
������3&�OUF�v�WbK:��}�=q��O��o�=-7��w���SUJ��9�\ri����i��d$��!�}s����FmW���|��i�/	�]y����H���v�i��&G�����b��I�2�=:��?;������x����>���<xpJ-�;���g����}���k�)s����n�-��7Z�j��i[o�uy��=V�w���+9�\S�H�����9�:��%@� @� @� @� @� ��
���X[wi_X���BPC��$`���*I�����Q<��Sq��V45=���������+sM�\'�:����c�2sj��	��������'�[m�U�n��L'��Z[�&M��n�Gy4v�i�H��+I��~����a�������ik�x�-�����\sm������M�j������e#������'�������s���MY�������O�)��"��������]�����O����:K����U��E/���x���b���_�u�5JC���O����A� @� @� @� @� @�@a��u�XV[���(0�?o������uq��\EEE�����:��3f|���K7�[����n={��$�c�>��>�,�}��������/>���������}�{i/��6��_�'N�I/��>��Z���t�]w�-
��1g��=zT���{ig�����{�-[����M����/���N�t����W_��k�baI��q������mZ���]��;��ob�j @� @� @� @� @��U���������}��U�@!����{b��	 @��@�����8@� @� @� @� @��CBlu�aYj��_gVj� @� @� @� @� @� @� P�����#�` @� @� @� @� @� @��!������ @� @� @� @� @� @�uN@���=2&@� @� @� @� @� @� @�@�b�;��J	 @� @� @� @� @� @� P�����#�` @� @� @� @� @� @����ug�VJ��;v���;?]l�v������ @� @� @� @� @�	�e�, P��:u����:�V�
vN� @� @� @� @� @����� @� @� @� @� @� @� @�Y	�e%�. @� @� @� @� @� @����� @� @� @� @� @� @�2b��Va @� @� @� @� @� @�b� @� @� @� @� @� @� @�@fBl��*L� @� @� @� @� @� @�Bl� @� @� @� @� @� @��L@�-3Z�	 @� @� @� @� @� @� @@��;@� @� @� @� @� @� @��	�eF�0 @� @� @� @� @� @��y @� @� @� @� @� @� @ 3!��h&@� @� @� @� @� @� @�!6� @� @� @� @� @� @�d& ���� @� @� @� @� @� @�  �� @� @� @� @� @� @� @�����2�U� @� @� @� @� @� @���� @� @� @� @� @� @� ���[f�
 @� @� @� @� @� @� @���w� @� @� @� @� @� @�2b��Va @� @� @� @� @� @�b� @� @� @� @� @� @� @�@fBl��*L� @� @� @� @� @� @�Bl� @� @� @� @� @� @��L@�-3Z�	 @� @� @� @� @� @� @@��;@� @� @� @� @� @� @��	�eF�0 @� @� @� @� @� @��y @� @� @� @� @� @� @ 3!��h&@� @� @� @� @� @� @�!6� @� @� @� @� @� @�d& ���� @� @� @� @� @� @�  �� @� @� @� @� @� @� @�����2�U� @� @� @� @� @� @���� @� @� @� @� @� @� ���[f�
 @� @� @� @� @� @� @���w� @� @� @� @� @� @�2b��Va @� @� @� @� @� @�b� @� @� @� @� @� @� @�@fBl��*L� @� @� @� @� @� @�Bl� @� @� @� @� @� @��L@�-3Z�	 @� @� @� @� @� @� @@��;@� @� @� @� @� @� @��	�eF�0 @� @� @� @� @� @��y @� @� @� @� @� @� @ 3!��h&@� @� @� @� @� @� @�!6� @� @� @� @� @� @�d& ���� @� @� @� @� @� @�  �� @� @� @� @� @� @� @�����2�U� @� @� @� @� @� @���� @� @� @� @� @� @� ���[f�
 @� @� @� @� @� @� @���w� @� @� @� @� @� @�2b��Va @� @� @� @� @� @�b� @� @� @� @� @� @� @�@fBl��*L� @� @� @� @� @� @�Bl� @� @� @� @� @� @��L@�-3Z�	 @� @� @� @� @� @� @@��;@� @� @� @� @� @� @��	�eF�0 @� @� @� @� @� @��y @� @� @� @� @� @� @ 3!��h&@� @� @� @� @� @� @�!6� @� @� @� @� @� @�d& ���� @� @� @� @� @� @�  �� @� @� @� @� @� @� @�����2�U� @� @� @� @� @� @���� @� @� @� @� @� @� ���[f�
 @� @� @� @� @� @� @���w� @� @� @� @� @� @�2b��Va @� @� @� @� @� @�b� @� @� @� @� @� @� @�@fBl��*L� @� @� @� @� @� @�Bl� @� @� @� @� @� @��L@�-3Z�	 @� @� @� @� @� @� @@��;@� @� @� @� @� @� @��	�eF�0 @� @� @� @� @� @��y @� @� @� @� @� @� @ 3!��h&@� @� @� @� @� @� @�!6� @� @� @� @� @� @�d& ���� @� @� @� @� @� @�  �� @� @� @� @� @� @� @�����2�U� @� @� @� @� @� @���� @� @� @� @� @� @� ���[f�
 @� @� @� @� @� @� @���w�V��_/]���Kk�:-� @� @� @� @� @�������<C����Bl��9X�J5l��)Z�d%3&@� @� @� @� @� @������i������� �
�yj�@�u�������Z�N�#@� @� @� @� @� @�����o���6�����H@��=K)+��E������=� @� @� @� @� @� @`5
|�M~�u����R�yj����[D�F
cQ�����j�Z-� @� @� @� @� @����r����D�����[�}�V^+��j�c��b�z���F�wL�~8��X�� @� @� @� @� @� @`�
,X�0f|�YZ�K��s���(p!����[�h�}�],[�,�y�����Wua��H� @� @� @� @� @���9s��i�g�+�`����:u`��H�n	������%[m�
��dV|�M��Q��
�IDAT���e�HnM7���1���o @� @� @� @� @� P�%K�����c��y��/Y�^��:�mS�R� PE!�*B�V;�9����Q�xq�X�U @� @� @� @� @� @�uZ�I�F��sG���S���. �V�����H�~1g^����Z�0-��K�N=��� @� @� @� @� @� @��@���#	�5[�I�j�<��j������2V� @� @� @� @� @� @��,P��7o� @� @� @� @� @� @� ���[��� @� @� @� @� @� @� @����
���< @� @� @� @� @� @��b��Wu @� @� @� @� @� @���[A?~�'@� @� @� @� @� @� @�@�Bl���N� @� @� @� @� @� @���b+��o� @� @� @� @� @� @��V@�-[_�	 @� @� @� @� @� @� P�Bl��m� @� @� @� @� @� @��
�e��: @� @� @� @� @� @�
Z@����� @� @� @� @� @� @� @ [!�l}U'@� @� @� @� @� @� @�@A����y @� @� @� @� @� @�d+ ����� @� @� @� @� @� @�(h!��~�6O� @� @� @� @� @� @��l����U� @� @� @� @� @� @�- �V����	 @� @� @� @� @� @� ���[��� @� @� @� @� @� @� @����
���< @� @� @� @� @� @��b��Wu @� @� @� @� @� @���[A?~�'@� @� @� @� @� @� @�@�Bl���N� @� @� @� @� @� @���b+��o� @� @� @� @� @� @��V@�-[_�	 @� @� @� @� @� @� P�Bl��m� @� @� @� @� @� @��
�e��: @� @� @� @� @� @�
Z@����� @� @� @� @� @� @� @ [!�l}U'@� @� @� @� @� @� @�@A����y @� @� @� @� @� @�d+ ����� @� @� @� @� @� @�(h!��~�6O� @� @� @� @� @� @��l����U� @� @� @� @� @� @�- �V����	 @� @� @� @� @� @� ���[��� @� @� @� @� @� @� @����
���< @� @� @� @� @� @��b��Wu @� @� @� @� @� @������?m��oTIEND�B`�
#51David G. Johnston
david.g.johnston@gmail.com
In reply to: jian he (#50)
Re: Document NULL

On Sun, Dec 22, 2024 at 7:27 AM jian he <jian.universality@gmail.com> wrote:

On Wed, Dec 11, 2024 at 7:00 AM David G. Johnston
<david.g.johnston@gmail.com> wrote:

v5 Attached, v5-0001 is just v4-0001 rebased; v5-0002 is the rework over

v4-0001. There is no formatting-only patch this round.

Wiki tracker:

https://wiki.postgresql.org/wiki/Documenting_NULL#ToDo_Note

please see attached png file.
As you can see, many of the <screen> </screen> are not fully
left-aligned, and also have an extra empty new line.

I'm aware, which is why I keep mentioning "formatting" in my emails.

Again, I'm choosing to indent those tags because while I edit I find it
much easier if I can "fold all" in my editor and have those tags be hidden
away under the fold.

Please use your imagination to visualize how thIngs would look without the
indentation, or un-indent the elements yourself if you find it so
bothersome to look at. I promise you I will unindent them in
the final patch that would be committed. Until then it is having no
material impact on the substance/content of the patch - which is what needs
reviewing. And since you didn't even apply my formatting 0002 patch the
first time around I figured producing it was simply unneeded busy-work.

I will try to remember to consider/fix the "extra newline" aspect of this
since simply unindenting isn't going to alter vertical space, just
horizontal.

+  <para>
+   As a general expectation, operator invocation expressions where
one of inputs
+   is a null value will result in a null-valued output.

I think the following description is more simple and concise.
+Typically, when one of the inputs in an operator invocation
expression is a null value, the output is expected to also be null.

Not sure on the "is expected" qualifier but overall that does seem better.

+    The <link linkend="sql-copy"><command>COPY ... TO</command></link>
command,
+    including its psql counter-part meta-command
+    <link
linkend="app-psql-meta-commands-copy"><command>\copy</command></link>,
+    has the <literal>NULL</literal> option (and some modifier
options) to specify
+    the string to print to the output for null values it encounters
in the query result.
+    As with input file processing, for the CSV format it will, by default,
+    produce an unquoted empty string for the null value.
+   </para>

I think the following make more sense:

+   The <link linkend="sql-copy"><command>COPY ... TO</command></link>
command and
+   <application>psql</application> meta-command
+   <link
linkend="app-psql-meta-commands-copy"><command>\copy</command></link>,
+  has the <literal>NULL</literal> option to specify
+  the string that represents a null value. The default is
+  <literal>\N</literal> (backslash-N) in text format, and an unquoted
empty
+  string in <literal>CSV</literal> format.
+   </para>

also psql should decorated as <application>psql</application>

The extra detail for text format is out-of-place in this overview document
- csv format is most commonly used so I mention it for the example. I do
not feel a need to provide commentary for other formats or provide other
examples. I do think at least alluding to the other options, so the reader
can go look for them, is a positive. I'll markup psql.

----------------------------------------------------------------------------

+   It is possible to define
+   <link linkend="ddl-constraints-check-constraints">check
constraint</link>
+   expressions on tables to ensure only values passing those
expressions are inserted.
+   While this seems like it would behave the same as a where clause,
the choice here,
+   when an expression evaulates to a null value, is to allow the row
to be inserted
+   - the same as a true result.

i think in ddl.sgml,
we already have """
It should be noted that a check constraint is satisfied if the
check expression evaluates to true or the null value.
"""
it is more concise, IMO, we can just try to copy it here.

I may have been overly verbose in a bad way but just putting that sentence
here is too concise IMO. Absent a complete suggestion to consider I'm
inclined to stick with what I have.

Thanks!

David J.

#52Marcos Pegoraro
marcos@f10.com.br
In reply to: David G. Johnston (#51)
Re: Document NULL

Em dom., 22 de dez. de 2024 às 12:02, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

You have detailed IS NULL and IS NOT NULL predicates but not mention their
counterparts ISNULL and NOTNULL, wouldn't it be good to explain that too ?
Maybe pointing to its page "functions-comparison"

regards
Marcos

#53David G. Johnston
david.g.johnston@gmail.com
In reply to: Marcos Pegoraro (#52)
Re: Document NULL

On Sun, Dec 22, 2024 at 9:45 AM Marcos Pegoraro <marcos@f10.com.br> wrote:

Em dom., 22 de dez. de 2024 às 12:02, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

You have detailed IS NULL and IS NOT NULL predicates but not mention their
counterparts ISNULL and NOTNULL, wouldn't it be good to explain that too ?
Maybe pointing to its page "functions-comparison"

I'm disinclined to mention alternative non-standard syntax here. I'm happy
leaving those indirectly mentioned ("other predicates") by the existing
sentence:

These, and other predicates, are described in Table 9.2

And pointing the reader to the table that includes these non-standard
syntax forms.

David J.

#54Marcos Pegoraro
marcos@f10.com.br
In reply to: David G. Johnston (#53)
Re: Document NULL

Em dom., 22 de dez. de 2024 às 15:07, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

On section Null-Valued Settings is not easy to understand that "show
example.string" will result in an "ERROR: unrecognized...", that BEGIN or
ROLLBACK does not return anything. So, what do you think about creating a
table with two columns and showing command and result side by side ?

regards
Marcos

#55David G. Johnston
david.g.johnston@gmail.com
In reply to: Marcos Pegoraro (#54)
Re: Document NULL

On Mon, Dec 23, 2024 at 11:39 AM Marcos Pegoraro <marcos@f10.com.br> wrote:

Em dom., 22 de dez. de 2024 às 15:07, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

On section Null-Valued Settings is not easy to understand that "show
example.string" will result in an "ERROR: unrecognized...", that BEGIN or
ROLLBACK does not return anything. So, what do you think about creating a
table with two columns and showing command and result side by side ?

I think I'll replace the use of SHOW with current_setting throughout the
entire example. That should increase the clarity and lets me return
true/false with the column indicating the test - like the existing use of
current_setting does.

David J.

p.s.
I really wish someone had gotten around to implementing \pset true 'true'
and \pset false 'false' ... however we ended up with boolean outputs being
"f" and "t" a bunch of people must have chosen to invest their life savings
in eyewear companies.

#56Marcos Pegoraro
marcos@f10.com.br
In reply to: David G. Johnston (#55)
Re: Document NULL

The word below is commonly used on DOCs, but I didn't find it as a link.
Wouldn't it be better to write what you are linking to, instead of the word
below ?

(See <link linkend="nullvalues-operands">Null-Valued Operands</link> for
more explanation.)
instead of
(See <link linkend="nullvalues-operands">below</link> for more explanation.)

<link linkend="nullvalues-multielementcomparison">Multi-Element
Comparisons</link>.
instead of
<link linkend="nullvalues-multielementcomparison">noted below</link>.

This is just an extension of the multi-element testing behavior described
<link linkend="nullvalues-multielement">Testing Multi-Element Values with
Null-Valued Elements </link>.
instead of
This is just an extension of the multi-element testing behavior described
<link linkend="nullvalues-multielement">below</link>.
regards
Marcos

#57jian he
jian.universality@gmail.com
In reply to: Marcos Pegoraro (#56)
Re: Document NULL

hi.

"SQL specification" should be "SQL standard"?

+ another null vale and unequal to all other values.
typo. should be "another null value"

other places using subsection, many places in doc/src/sgml/nullvalues.sgml
using "sub-section".

+   Notice two important behaviors: first, even though we passed in a
null value to
+   to the <literal>set_config</literal> function, the
<literal>current_setting</literal>
there is two "to to".

gmail has grammar checks, chatgpt can also help find typos.
you can give it a try.

+   <programlisting>
+    BEGIN;
+    ALTER TABLE null_examples ADD CONSTRAINT value_not_1 CHECK (value != 1);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    ERROR:  check constraint "value_not_1" of relation
"null_examples" is violated by some row
+    ROLLBACK
+   </screen>
+   <programlisting>
+    BEGIN;
+    ALTER TABLE null_examples ADD CONSTRAINT value_not_10 CHECK (value != 10);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    ALTER TABLE
+    ROLLBACK
+   </screen>

i think this part, BEGIN... ROLLBACK is not necessary.
since if we add these check constraints, it won't influence the
later(next) section.

#58David G. Johnston
david.g.johnston@gmail.com
In reply to: jian he (#57)
1 attachment(s)
Re: Document NULL

In reply to Marcos:

The word below is commonly used on DOCs, but I didn't find it as a link.

Wouldn't it be better to write what you are linking to, instead of the word
below ?

I've changed many of these links into simple xref elements for now. I may
add alternate text but since the majority of the docs seem fine with bare
xref I'm just going with that here as well.

On Sat, Dec 28, 2024 at 8:30 PM jian he <jian.universality@gmail.com> wrote:

hi.

"SQL specification" should be "SQL standard"?

+ another null vale and unequal to all other values.
typo. should be "another null value"

other places using subsection, many places in doc/src/sgml/nullvalues.sgml
using "sub-section".

Fixed all of these.

+   Notice two important behaviors: first, even though we passed in a
null value to
+   to the <literal>set_config</literal> function, the
<literal>current_setting</literal>
there is two "to to".

gmail has grammar checks, chatgpt can also help find typos.
you can give it a try.

Yeah, I did spell check but not a grammar check. These weren't spelling
errors though. Anyway, good point running the resultant web page through
chatgpt or grammar-aware program.

I still need to put together the example changes in these last couple of
suggestions. The attached v6 omits those and the indenting - and I've
consolidated it back into a single patch.

David J.

Attachments:

v6-0001-Document-NULL.patchtext/x-patch; charset=US-ASCII; name=v6-0001-Document-NULL.patchDownload
From 7086d049281410b39c7ca3e0b641006cd4b3946a Mon Sep 17 00:00:00 2001
From: "David G. Johnston" <David.G.Johnston@Gmail.com>
Date: Mon, 9 Dec 2024 09:41:07 -0700
Subject: [PATCH] v6 Document NULL

---
 doc/src/sgml/datatype.sgml          |    2 +-
 doc/src/sgml/ddl.sgml               |    2 +
 doc/src/sgml/filelist.sgml          |    1 +
 doc/src/sgml/func.sgml              |  273 +++----
 doc/src/sgml/json.sgml              |    7 +-
 doc/src/sgml/nullvalues.sgml        | 1069 +++++++++++++++++++++++++++
 doc/src/sgml/ref/create_domain.sgml |    7 +-
 doc/src/sgml/syntax.sgml            |   23 +-
 8 files changed, 1224 insertions(+), 160 deletions(-)
 create mode 100644 doc/src/sgml/nullvalues.sgml

diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml
index 3e6751d64c..1048b474e0 100644
--- a/doc/src/sgml/datatype.sgml
+++ b/doc/src/sgml/datatype.sgml
@@ -5365,7 +5365,7 @@ WHERE ...
        <row>
         <entry><type>unknown</type></entry>
         <entry>Identifies a not-yet-resolved type, e.g., of an undecorated
-         string literal.</entry>
+         string literal.  Also, the <link linkend="nullvalues-usage">null value.</link></entry>
        </row>
       </tbody>
      </tgroup>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index dea04d64db..4f6c15e77f 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -168,6 +168,8 @@ DROP TABLE products;
   </para>
  </sect1>
 
+ &nullvalues;
+
  <sect1 id="ddl-default">
   <title>Default Values</title>
 
diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml
index 66e6dccd4c..8162159c1a 100644
--- a/doc/src/sgml/filelist.sgml
+++ b/doc/src/sgml/filelist.sgml
@@ -21,6 +21,7 @@
 <!ENTITY indices    SYSTEM "indices.sgml">
 <!ENTITY json       SYSTEM "json.sgml">
 <!ENTITY mvcc       SYSTEM "mvcc.sgml">
+<!ENTITY nullvalues SYSTEM "nullvalues.sgml">
 <!ENTITY parallel   SYSTEM "parallel.sgml">
 <!ENTITY perform    SYSTEM "perform.sgml">
 <!ENTITY queries    SYSTEM "queries.sgml">
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 47370e581a..42030ffde7 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -23509,7 +23509,8 @@ MERGE INTO products p
    This section describes the <acronym>SQL</acronym>-compliant subquery
    expressions available in <productname>PostgreSQL</productname>.
    All of the expression forms documented in this section return
-   Boolean (true/false) results.
+   <link linkend="nullvalues">three-valued</link> typed
+   results (true, false, or null).
   </para>
 
   <sect2 id="functions-subquery-exists">
@@ -23571,19 +23572,17 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>IN</token>
+   is <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result.
-   The result of <token>IN</token> is <quote>true</quote> if any equal subquery row is found.
-   The result is <quote>false</quote> if no equal row is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any equal subquery row is found.
+   The result is <quote>false</quote> if no equal row is found.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>IN</token> construct will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.
   </para>
 
   <para>
@@ -23600,21 +23599,18 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.
+   The result of <token>IN</token> is <quote>false</quote> if the subquery returns no rows,
+   otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result.
-   The result of <token>IN</token> is <quote>true</quote> if any equal subquery row is found.
-   The result is <quote>false</quote> if no equal row is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any equal subquery row is found.
+   The result is <quote>false</quote> if no equal row is found.
   </para>
 
   <para>
-   As usual, null values in the rows are combined per
-   the normal rules of SQL Boolean expressions.  Two rows are considered
-   equal if all their corresponding members are non-null and equal; the rows
-   are unequal if any corresponding members are non-null and unequal;
-   otherwise the result of that row comparison is unknown (null).
-   If all the per-row results are either unequal or null, with at least one
-   null, then the result of <token>IN</token> is null.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -23626,20 +23622,17 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 </synopsis>
 
   <para>
-   The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
-   is evaluated and compared to each row of the subquery result.
-   The result of <token>NOT IN</token> is <quote>true</quote> if only unequal subquery rows
-   are found (including the case where the subquery returns no rows).
+   The right-hand side is a parenthesized subquery, which must return exactly one column.
+   The result of <token>NOT IN</token> is <quote>true</quote> if the subquery returns no rows,
+   otherwise the left-hand expression is evaluated and compared to each row of the subquery result.
+   The result is <quote>true</quote> if only unequal subquery rows are found.
    The result is <quote>false</quote> if any equal row is found.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>NOT IN</token> construct will be null, not true.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
+   tests are OR'd together.
   </para>
 
   <para>
@@ -23656,21 +23649,18 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.
+   The result of <token>NOT IN</token> is <quote>true</quote> if the subquery returns no rows,
+   otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result.
-   The result of <token>NOT IN</token> is <quote>true</quote> if only unequal subquery rows
-   are found (including the case where the subquery returns no rows).
+   The result is <quote>true</quote> if only unequal subquery rows are found.
    The result is <quote>false</quote> if any equal row is found.
   </para>
 
   <para>
-   As usual, null values in the rows are combined per
-   the normal rules of SQL Boolean expressions.  Two rows are considered
-   equal if all their corresponding members are non-null and equal; the rows
-   are unequal if any corresponding members are non-null and unequal;
-   otherwise the result of that row comparison is unknown (null).
-   If all the per-row results are either unequal or null, with at least one
-   null, then the result of <token>NOT IN</token> is null.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -23684,13 +23674,13 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>ANY</token> is
+   <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ANY</token> is <quote>true</quote> if any true result is obtained.
-   The result is <quote>false</quote> if no true result is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any true result is obtained.
+   The result is <quote>false</quote> if no true result is found.
   </para>
 
   <para>
@@ -23699,11 +23689,10 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   </para>
 
   <para>
-   Note that if there are no successes and at least one right-hand row yields
-   null for the operator's result, the result of the <token>ANY</token> construct
-   will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -23721,16 +23710,19 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.  The result of <token>ANY</token> is
+   <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result,
    using the given <replaceable>operator</replaceable>.
-   The result of <token>ANY</token> is <quote>true</quote> if the comparison
-   returns true for any subquery row.
-   The result is <quote>false</quote> if the comparison returns false for every
-   subquery row (including the case where the subquery returns no
-   rows).
-   The result is NULL if no comparison with a subquery row returns true,
-   and at least one comparison returns NULL.
+   The result is <quote>true</quote> if the comparison returns true for any subquery row.
+   The result is <quote>false</quote> if the comparison returns false for every subquery row.
+  </para>
+
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are OR'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -23748,15 +23740,20 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>ALL</token> is
+   <quote>true</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ALL</token> is <quote>true</quote> if all rows yield true
-   (including the case where the subquery returns no rows).
+   The result is <quote>true</quote> if all rows yield true.
    The result is <quote>false</quote> if any false result is found.
-   The result is NULL if no comparison with a subquery row returns false,
-   and at least one comparison returns NULL.
+  </para>
+
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -23777,22 +23774,21 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.  The result of <token>ALL</token> is
+   <quote>true</quote> if the subquery returns no rows, otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result,
    using the given <replaceable>operator</replaceable>.
-   The result of <token>ALL</token> is <quote>true</quote> if the comparison
-   returns true for all subquery rows (including the
-   case where the subquery returns no rows).
-   The result is <quote>false</quote> if the comparison returns false for any
-   subquery row.
-   The result is NULL if no comparison with a subquery row returns false,
-   and at least one comparison returns NULL.
+   The result is <quote>true</quote> if the comparison returns true for all subquery rows.
+   The result is <quote>false</quote> if the comparison returns false for any subquery row.
   </para>
 
   <para>
-   See <xref linkend="row-wise-comparison"/> for details about the meaning
-   of a row constructor comparison.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
+
   </sect2>
 
   <sect2 id="functions-subquery-single-row-comp">
@@ -23817,6 +23813,14 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    compared row-wise to the single subquery result row.
   </para>
 
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, the result cannot be <quote>true</quote> in the
+   presence of null valued fields in either the row constructor or the subquery result row, as
+   the individual field tests are AND'd together.
+   Note that <literal>IS DISTINCT FROM</literal> is not an operator.
+  </para>
+
   <para>
    See <xref linkend="row-wise-comparison"/> for details about the meaning
    of a row constructor comparison.
@@ -23884,7 +23888,8 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    <productname>PostgreSQL</productname> extensions; the rest are
    <acronym>SQL</acronym>-compliant.
    All of the expression forms documented in this section return
-   Boolean (true/false) results.
+   <link linkend="nullvalues">three-valued</link> boolean typed
+   results (true, false, or null).
   </para>
 
   <sect2 id="functions-comparisons-in-scalar">
@@ -23897,24 +23902,13 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   <para>
    The right-hand side is a parenthesized list
    of expressions.  The result is <quote>true</quote> if the left-hand expression's
-   result is equal to any of the right-hand expressions.  This is a shorthand
-   notation for
-
-<synopsis>
-<replaceable>expression</replaceable> = <replaceable>value1</replaceable>
-OR
-<replaceable>expression</replaceable> = <replaceable>value2</replaceable>
-OR
-...
-</synopsis>
+   result is equal to any of the right-hand expressions.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand expression yields
-   null, the result of the <token>IN</token> construct will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence null values since the multiple equality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -23928,35 +23922,15 @@ OR
   <para>
    The right-hand side is a parenthesized list
    of expressions.  The result is <quote>true</quote> if the left-hand expression's
-   result is unequal to all of the right-hand expressions.  This is a shorthand
-   notation for
-
-<synopsis>
-<replaceable>expression</replaceable> &lt;&gt; <replaceable>value1</replaceable>
-AND
-<replaceable>expression</replaceable> &lt;&gt; <replaceable>value2</replaceable>
-AND
-...
-</synopsis>
+   result is unequal to all of the right-hand expressions.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand expression yields
-   null, the result of the <token>NOT IN</token> construct will be null, not true
-   as one might naively expect.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of null values since the multiple inequality
+   tests are OR'd together.
   </para>
 
-  <tip>
-  <para>
-   <literal>x NOT IN y</literal> is equivalent to <literal>NOT (x IN y)</literal> in all
-   cases.  However, null values are much more likely to trip up the novice when
-   working with <token>NOT IN</token> than when working with <token>IN</token>.
-   It is best to express your condition positively if possible.
-  </para>
-  </tip>
   </sect2>
 
   <sect2 id="functions-comparisons-any-some">
@@ -23969,30 +23943,26 @@ AND
 
   <para>
    The right-hand side is a parenthesized expression, which must yield an
-   array value.
-   The left-hand expression
+   array value. The result of <token>ANY</token> is
+   <quote>false</quote> if the array has zero element, otherwise
+   the left-hand expression
    is evaluated and compared to each element of the array using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ANY</token> is <quote>true</quote> if any true result is obtained.
-   The result is <quote>false</quote> if no true result is found (including the
-   case where the array has zero elements).
+   The result is <quote>true</quote> if any true result is obtained.
+   The result is <quote>false</quote> if no true result is found.
   </para>
 
   <para>
-   If the array expression yields a null array, the result of
-   <token>ANY</token> will be null.  If the left-hand expression yields null,
-   the result of <token>ANY</token> is ordinarily null (though a non-strict
-   comparison operator could possibly yield a different result).
-   Also, if the right-hand array contains any null elements and no true
-   comparison result is obtained, the result of <token>ANY</token>
-   will be null, not false (again, assuming a strict comparison operator).
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both elements and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
    <token>SOME</token> is a synonym for <token>ANY</token>.
+   <token>IN</token> is equivalent to <literal>= ANY</literal>.
   </para>
   </sect2>
 
@@ -24006,26 +23976,27 @@ AND
   <para>
    The right-hand side is a parenthesized expression, which must yield an
    array value.
-   The left-hand expression
+   The result of <token>ALL</token> is
+   <quote>true</quote> if the array has zero elements, otherwise
+   the left-hand expression
    is evaluated and compared to each element of the array using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ALL</token> is <quote>true</quote> if all comparisons yield true
-   (including the case where the array has zero elements).
+   The result is <quote>true</quote> if all comparisons yield true.
    The result is <quote>false</quote> if any false result is found.
   </para>
 
   <para>
-   If the array expression yields a null array, the result of
-   <token>ALL</token> will be null.  If the left-hand expression yields null,
-   the result of <token>ALL</token> is ordinarily null (though a non-strict
-   comparison operator could possibly yield a different result).
-   Also, if the right-hand array contains any null elements and no false
-   comparison result is obtained, the result of <token>ALL</token>
-   will be null, not true (again, assuming a strict comparison operator).
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both elements and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
+
+  <para>
+   <token>NOT IN</token> is equivalent to <literal>&lt;&gt; ALL</literal>.
+  </para>
+
   </sect2>
 
   <sect2 id="row-wise-comparison">
@@ -24076,6 +24047,11 @@ AND
    considered.
   </para>
 
+  <para>
+   See <xref linkend="nullvalues-multielementcomparison-rowconstructor"/>
+   and surrounding content for additional details and examples.
+  </para>
+
 <synopsis>
 <replaceable>row_constructor</replaceable> IS DISTINCT FROM <replaceable>row_constructor</replaceable>
 </synopsis>
@@ -24110,20 +24086,11 @@ AND
 </synopsis>
 
   <para>
-   The SQL specification requires row-wise comparison to return NULL if the
-   result depends on comparing two NULL values or a NULL and a non-NULL.
-   <productname>PostgreSQL</productname> does this only when comparing the
-   results of two row constructors (as in
-   <xref linkend="row-wise-comparison"/>) or comparing a row constructor
-   to the output of a subquery (as in <xref linkend="functions-subquery"/>).
-   In other contexts where two composite-type values are compared, two
-   NULL field values are considered equal, and a NULL is considered larger
-   than a non-NULL.  This is necessary in order to have consistent sorting
-   and indexing behavior for composite types.
-  </para>
-
-  <para>
-   Each side is evaluated and they are compared row-wise.  Composite type
+   Each side is evaluated and they are compared row-wise.
+   As discussed and shown in <xref linkend="nullvalues-multielementcomparison-composite"/>,
+   null values are treated as being equal to other null values and greater
+   than all non-null values.
+   Composite type
    comparisons are allowed when the <replaceable>operator</replaceable> is
    <literal>=</literal>,
    <literal>&lt;&gt;</literal>,
diff --git a/doc/src/sgml/json.sgml b/doc/src/sgml/json.sgml
index 206eadb8f7..0f39d4bf21 100644
--- a/doc/src/sgml/json.sgml
+++ b/doc/src/sgml/json.sgml
@@ -129,6 +129,11 @@
   the corresponding <productname>PostgreSQL</productname> types.
  </para>
 
+ <indexterm>
+  <primary>null value</primary>
+  <secondary sortas="json">within JSON</secondary>
+ </indexterm>
+
   <table id="json-type-mapping-table">
      <title>JSON Primitive Types and Corresponding <productname>PostgreSQL</productname> Types</title>
      <tgroup cols="3">
@@ -162,7 +167,7 @@
        <row>
         <entry><type>null</type></entry>
         <entry>(none)</entry>
-        <entry>SQL <literal>NULL</literal> is a different concept</entry>
+        <entry>An SQL null value is similar, but see <xref linkend="nullvalues-json"/> for differences.</entry>
        </row>
       </tbody>
      </tgroup>
diff --git a/doc/src/sgml/nullvalues.sgml b/doc/src/sgml/nullvalues.sgml
new file mode 100644
index 0000000000..07bbc58528
--- /dev/null
+++ b/doc/src/sgml/nullvalues.sgml
@@ -0,0 +1,1069 @@
+<sect1 id="nullvalues">
+ <title>Null Values Overview</title>
+
+ <indexterm>
+  <primary>null value</primary>
+ </indexterm>
+
+ <para>
+  This section first introduces the concept of null values and then goes
+  on to explain how different parts of the system behave when provided
+  one or more null value inputs.  Examples throughout this section
+  can be executed so long as the following table and rows are created first.
+ </para>
+
+ <para>
+  Throughout this section the discussion of null values will be limited to
+  the SQL language unless otherwise noted.  The JSON-related data types, and the
+  non-SQL procedural languages, have their own behaviors documented in their
+  respective areas.
+ </para>
+
+ <programlisting>
+  CREATE TABLE null_examples (
+    id bigint PRIMARY KEY,
+    value integer NULL
+  );
+  INSERT INTO null_examples
+  VALUES (1, 1), (2, NULL), (3, 4);
+ </programlisting>
+
+ <sect2 id="nullvalues-model">
+  <title>Meaning</title>
+  <para>
+   Generally, a null value is assumed to mean "unknown", but other interpretations
+   are common.  A data model design may state that a null value
+   is to be used to represent "not applicable" - i.e., that a value is not
+   even possible.  The null value also takes on a literal meaning of "not found"
+   when produced as the result of an outer join.
+  </para>
+  <para>
+   In different programming languages, some of which are accessible in the server
+   as procedural languages, the null value is represented in other ways.
+   Of those included in <productname>PostgreSQL</productname>,
+   these are:
+   <literal>None</literal> in <productname>Python</productname>,
+   <literal>undefined</literal> in <productname>Perl</productname>,
+   and the empty string in <productname>TCL</productname>.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-usage">
+  <title>Usage</title>
+  <para>
+   A null value, like all values, must have a data type, and is valid for all data types.
+   It must also be printed as text.  This section discusses null values at the boundaries
+   of the system as well as how they can come into existence due to the design of a query.
+  </para>
+  <sect3 id="nullvalues-usage-input">
+   <title>Null Value Input</title>
+   <para>
+    A null value can be used as input to any function, operator, or expression.
+    The system will then decide how to behave based on the rules described in the
+    rest of this section.  The system will also decide how to behave when a null value
+    is used as a parameter to a function that does not accept null values.
+   </para>
+   <para>
+    As noted in <xref linkend="sql-syntax-constants-nullvalue"/>,
+    a null value literal is written using the <literal>NULL</literal> keyword.
+    Its type is the <link linkend="datatype-pseudo">pseudo-type unknown</link>
+    but can be cast to any concrete data type.
+   </para>
+   <para>
+    <programlisting>
+    SELECT
+     NULL AS "Literal Null Value",
+     pg_typeof(null) AS "Type of Null",
+     pg_typeof(NULL::text) AS "Type of Cast Null",
+     cast(null as text) AS "Cast Null Value";
+    </programlisting>
+    <screen>
+      Literal Null Value | Type of Null | Type of Cast Null | Cast Null Value
+     --------------------+--------------+-------------------+-----------------
+                         | unknown      | text              |
+    </screen>
+   </para>
+   <para>
+    <programlisting>
+    SELECT text NULL;
+    </programlisting>
+    <screen>
+    ERROR:  column "text" does not exist
+    LINE 1: select text NUll;
+    </screen>
+   </para>
+   <para>
+    The <link linkend="sql-copy"><command>COPY ... FROM</command></link> command,
+    including its psql counter-part meta-command
+    <link linkend="app-psql-meta-commands-copy"><command>\copy</command></link>,
+    must deal with input files containing textual representations of the null value.
+    The lack of consistency in real world data requires having a few options to the
+    command related to null handling.  See the documentation in
+    <xref linkend="sql-copy"/> for more information.
+    But, in short, for CSV input it expects text to be quoted and interprets an unquoted
+    empty string as the null value.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-tables">
+   <title>Null Values in Tables</title>
+   <para>
+    Whether via the copy method above, or by inserting literal null values,
+    most usage concerns for null values results from their presence in a table
+    column that lacks a <link linkend="nullvalues-table-constraints">not-null constraint</link>.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-derived">
+   <title>Derived Null Values</title>
+   <para>
+    Even if all data stored in tables are known to be non-null, null values can still
+    be produced while executing a query.  The most common way this happens is by
+    introducing a (left) outer join to the query and having data missing optional related
+    data on the right side of the join.
+    <programlisting>
+     SELECT
+      countries.country,
+      flagships.flagship
+     FROM (
+      VALUES ('Spain'), ('Switzerland')
+     ) as countries (country)
+     LEFT JOIN (
+      VALUES ('Spain', 'Ship')
+     ) as flagships (country, flagship)
+     ON countries.country = flagships.country;
+    </programlisting>
+    <screen>
+        country   | flagship 
+     -------------+----------
+      Spain       | Ship
+      Switzerland | NULL
+    </screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-output">
+   <title>Null Value Output</title>
+   <para>
+    As evidenced above, the "absence of value" aspect of the null value results
+    in its secondary textual representation being an empty string
+    (its primary representation is just NULL).
+    This can be problematic if the empty string is expected to also be a valid value.
+    Therefore, places that deal with possible null values as input and text as
+    output need some means to give the user a way to specify how to print
+    the null value.
+   </para>
+   <para>
+    Generally, the primary representation is used when the value is part of a multi-element value.
+    If the value is being displayed by itself the secondary (blank) representation is used.  The settings
+    discussed herein typically control the secondary representation.  The null value representation when it
+    is within a container type (composite, array, etc...) is controlled by the input and output rules of the
+    container type.  It is when the container value itself is the null value that these generalities then apply.
+   </para>
+   <para>
+    No matter how the null value got into the result when presenting results to the user it is
+    necessary to present null values using text.  This is the responsibility of the client application.
+    The <command>psql</command> client program has the <link linkend="app-psql-meta-command-pset-null">
+    <literal>\pset null</literal> meta-command</link> to specify the textual output of null values
+    it encounters in query results.
+   </para>
+   <para>
+    When the final output of the result is a text file instead of a user additional
+    considerations come into play.  While the option to simply take the user presentation
+    and send it to a text file always exists <productname>PostgreSQL</productname> also
+    provides a facility to output a structured text file.
+    The <link linkend="sql-copy"><command>COPY ... TO</command></link> command,
+    including its psql counter-part meta-command
+    <link linkend="app-psql-meta-commands-copy"><command>\copy</command></link>,
+    has the <literal>NULL</literal> option (and some modifier options) to specify
+    the string to print to the output for null values it encounters in the query result.
+    As with input file processing, for the CSV format it will, by default,
+    produce an unquoted empty string for the null value.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-handling">
+   <title>Null Value Handling</title>
+   <para>
+    The presence of null values in the system results in three-valued logic.
+    In conventional two-valued (binary) logic every outcome is either true or false.
+    In three-valued logic the concept of unknown, represented using the null value, is
+    also an outcome.  This results in falsifying the common-sense notion
+    that "p OR NOT p" is always true.
+    <programlisting>
+     SELECT
+      NULL OR NOT NULL AS "N OR !N";
+    </programlisting>
+    <screen>
+      N OR !N 
+     ---------
+      NULL
+    </screen>
+    (See <xref linkend="nullvalues-operands"/> for more explanation.)
+   </para>
+   <para>
+    When dealing with null values it is often useful to explicitly to convert
+    data to and from a null value given a known non-null representation
+    (e.g., the empty string, the numbers 0 or 1, or boolean false).
+    The <link linkend="functions-coalesce-nvl-ifnull">COALESCE</link> and
+    <link linkend="functions-nullif">NULLIF</link> functions are useful
+    for this purpose.
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-cardinalrule">
+  <title>Distinctness - Overcoming the Cardinal Rule of Null Values</title>
+  <para>
+   The cardinal rule, a null value is
+   <link linkend="functions-comparison-op-table">
+    neither equal nor unequal
+   </link>
+   to any value, including other null values.
+   <programlisting>
+    SELECT
+     NULL = NULL AS "N = N",
+     NULL != NULL AS "N != N",
+     1 = NULL AS "1 = N",
+     1 != NULL AS "1 != N",
+     1 = 1 AS "1 = 1",
+     1 != 1 AS "1 != 1";
+   </programlisting>
+   <screen>
+     N = N | N != N | 1 = N | 1 != N | 1 = 1 | 1 != 1
+    -------+--------+-------+--------+-------+--------
+           |        |       |        | t     | f
+   </screen>
+   However, as with many rules, there are exceptions, as noted in
+   <xref linkend="nullvalues-multielementcomparison"/>.
+   Particularly, when the two compared values are part of a larger multi-element value.
+   <programlisting>
+    SELECT
+     array[1,2]=array[1,null] AS "Array Equals";
+   </programlisting>
+   <screen>
+     Array Equals
+    --------------
+     f
+   </screen>
+  </para>
+  <para>
+   Because of this SQL standard mandated rule, checking for a null value has an
+   explicit <literal>IS NULL</literal> predicate, and additionally there comparison
+   predicates that consider a null value equal to other null values but unequal
+   to any other value (e.g., <literal>IS DISTINCT</literal>, and <literal>IS TRUE</literal>.)
+   These, and other predicates, are described in
+   <xref linkend="functions-comparison-pred-table"/>
+   <programlisting>
+    SELECT id, value,
+     value IS NULL AS "IS N",
+     value IS DISTINCT FROM id AS "IS D",
+     value != id AS "IS !="
+    FROM null_examples;
+   </programlisting>
+   <screen>
+     id | value | IS N | IS D | IS !=
+    ----+-------+------+------+-------
+      1 |     1 | f    | f    | f
+      2 |       | t    | t    |
+      3 |     4 | f    | t    | t
+   </screen>
+  </para>
+  <para>
+   On the other hand, the SQL standard is largely alone in taking this approach to comparing
+   values to the null value.  For example, when working within the JSON data types the use of equals
+   produces true or false and so the concept of distinctness is neither present nor required.
+   Additional details and links are provided in <xref linkend="nullvalues-json"/>.
+   For the non-SQL procedural languages, please consult the appropriate documentation.
+  </para>
+  <para>
+   There is also a cardinal warning: when dealing with
+   <link linkend="rowtypes">composite types</link> in
+   expressions; <literal>composite IS NULL</literal>
+   and <literal>composite IS NOT NUll</literal>
+   are not the opposites of each other in the case where some,
+   but not all, of the composite's fields are null values.
+   (The case where all fields are null is indistinguishable
+   from the composite as a whole being null.)
+   Write <literal>NOT(composite IS NULL)</literal> instead.
+   <programlisting>
+    SELECT
+     c,
+     c IS NULL AS "c IS N",
+     NOT(c IS NULL) AS "NOT c IS N",
+     c IS NOT NULL AS "c IS NOT N",
+     ROW(value, value) IS NULL AS "ROW(v,v) IS N",
+     ROW(value, value) IS NOT NULL AS "ROW(v,v) IS NOT N"
+    FROM null_examples AS c;
+   </programlisting>
+   <screen>
+       c   | c IS N | NOT c IS N | c IS NOT N | ROW(v,v) IS N | ROW(v,v) IS NOT N
+    -------+--------+------------+------------+---------------+-------------------
+     (1,1) | f      | t          | t          | f             | t
+     (2,)  | f      | t          | f          | t             | f
+     (3,4) | f      | t          | t          | f             | t
+   </screen>
+   See <xref linkend="nullvalues-multielement"/> below for an explanation.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-operands">
+  <title>Null-Valued Operands</title>
+  <para>
+   As a general expectation, operator invocation expressions where one of inputs
+   is a null value will result in a null-valued output.
+   <programlisting>
+    SELECT
+     1 + null AS "Add",
+     'text' || null AS "Concatenate";
+   </programlisting>
+   <screen>
+     Add | Concatenate
+    -----+-------------
+         |
+   </screen>
+   Operators that behave otherwise should document their deviation from this norm.
+  </para>
+  <para>
+   A notable example of this is the <literal>IN</literal> operator, which
+   uses equality, not distinctness, for testing.
+   <programlisting>
+    SELECT
+     1 IN (1, null) AS "In Present",
+     1 IN (2, null) AS "In Missing",
+     null IN (1, 2) AS "N In Non-N",
+     null IN (null, 2) AS "N In N";
+   </programlisting>
+   <screen>
+     In Present | In Missing | N In Non-N | N In N
+    ------------+------------+------------+--------
+     t          |            |            |
+   </screen>
+   This is just an extension of the multi-element testing behavior described in
+   <xref linkend="nullvalues-multielement"/>.
+  </para>
+  <para>
+   Experience shows that <literal>CASE</literal> expressions are also prone
+   to bugs since their format encourages binary logic thinking while a
+   <literal>WHEN</literal> test will not consider a null value to be a match.
+   <programlisting>
+    SELECT id, value,
+     CASE WHEN id = value THEN 'Equal' ELSE 'Not Equal' END AS "Affirm",
+     CASE WHEN id != value THEN 'Not Equal' ELSE 'Equal' END AS "Negate",
+     CASE WHEN value IS NULL THEN 'Null'
+          WHEN id = value THEN 'Equal'
+          ELSE 'Not Equal' END AS "Safe Affirm",
+     CASE WHEN value IS NULL THEN 'Null'
+          WHEN id != value THEN 'Not Equal'
+          ELSE 'Equal' END AS "Safe Negate"
+    FROM null_examples;
+   </programlisting>
+   <screen>
+     id | value |  Affirm   |  Negate   | Safe Affirm | Safe Negate
+    ----+-------+-----------+-----------+-------------+-------------
+      1 |     1 | Equal     | Equal     | Equal       | Equal
+      2 |       | Not Equal | Equal     | Null        | Null
+      3 |     4 | Not Equal | Not Equal | Not Equal   | Not Equal
+   </screen>
+  </para>
+  <para>
+   The boolean operators <literal>AND</literal> and <literal>OR</literal>
+   will ignore the null value input if the other input is sufficient to
+   determine the outcome.
+   <programlisting>
+    SELECT
+     true OR null AS "T or N",
+     false OR null AS "F or N",
+     true AND null AS "T and N",
+     false AND null AS "F and N";
+   </programlisting>
+   <screen>
+     T or N | F or N | T and N | F and N
+    --------+--------+---------+---------
+     t      |        |         | f
+   </screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-domains">
+  <title>Null Values in Domains</title>
+  <para>
+   A domain is a user-defined data type that can have a <literal>NOT NULL</literal> constraint.
+   However, some usages of domains will cause the resultant output column (not table column)
+   to have the domain type but the value will be null.
+   The common way this happens is by including the domain column's table on the right side of a left join.
+   <programlisting>
+    BEGIN;
+    CREATE DOMAIN domain_example AS integer NOT NULL;
+    CREATE TABLE domain_examples (de_id bigint PRIMARY KEY, de_value domain_example);
+    INSERT INTO domain_examples VALUES (1, 1), (2, 2);
+    SELECT *, pg_typeof(de_value)
+    FROM null_examples AS ne
+    LEFT JOIN domain_examples AS de ON ne.id = de.de_id;
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    CREATE DOMAIN
+    CREATE TABLE
+    INSERT 0 2
+     id | value | de_id | de_value |   pg_typeof
+    ----+-------+-------+----------+----------------
+      1 |     1 |     1 |        1 | domain_example
+      2 |       |     2 |        2 | domain_example
+      3 |     4 |       |          | domain_example
+
+    ROLLBACK
+   </screen>
+   Please see the details in <xref linkend="sql-createdomain-notes"/>
+   for another example, as well as commentary why this non-standard behavior exists.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-multielement">
+  <title>Testing Multi-Element Values with Null-Valued Elements</title>
+  <para>
+   Arrays and composite types are multi-element types.  Here we also consider non-empty
+   <link linkend="functions-subquery">subquery results</link>
+   and the list of values specified in the
+   <link linkend="functions-comparisons-in-scalar">IN test</link>.
+  </para>
+  <para>
+   When a test is performed on one of these multi-element values
+   the system will iterate over each element, or pair of elements if the test is
+   <link linkend="row-wise-comparison">comparing two row constructors</link> to each other,
+   left-to-right, combining the results using the boolean operations described in
+   <xref linkend="nullvalues-operands"/>. For tests that
+   require an exhaustive search, (e.g., <literal>ALL</literal>, <literal>NOT IN</literal>)
+   the search effectively ends when a false result is found (<literal>AND</literal> combiners).
+   For tests that simply require a true result, (e.g., <literal>ANY</literal>,
+   <literal>IN</literal>) the search effectively ends when a true result is found
+   (<literal>OR</literal> combiners). Therefore:
+   <simplelist>
+    <member>
+     <literal>IN</literal> and <literal>ANY</literal>
+     (<literal>OR</literal>) cannot produce a false result in the presence of null, and
+    </member>
+    <member>
+     <literal>NOT IN</literal> and <literal>ALL</literal>
+     (<literal>AND</literal>) cannot produce a true result in the presence of null.
+    </member>
+   </simplelist>
+   This is because any exhaustive search will produce at least one null value result
+   that cannot be ignored.
+  </para>
+  <para>
+   The SQL standard requires that non-exhaustive
+   (i.e., <literal>IN</literal> and <literal>ANY</literal>) subquery tests
+   return false when there are no rows in the subquery result, and return true
+   for the exhaustive tests (i.e., <literal>NOT IN</literal> and <literal>ALL</literal>).
+  </para>
+  <para>
+   Note that the cardinal warning
+   noted in <xref linkend="nullvalues-cardinalrule"/> above is just the application of this behavior to the
+   <literal>IS NULL</literal> and <literal>IS NOT NULL</literal>
+   tests, which are both exhaustive search tests guaranteed to produce at least one false result
+   when the composite has a mix of null and non-null values.
+  </para>
+  <para>
+   In the next section the rules above are discussed.
+   <xref linkend="nullvalues-multielementpredicates"/>
+   discusses situations where a predicate or a scalar value
+   are being compared to a multi-element value.
+   In <xref linkend="nullvalues-multielementcomparison"/>
+   the rules when two multi-element values are compared
+   to each other are discussed
+   (including the two row constructor comparison case.)
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-multielementpredicates">
+  <title>Multi-Element Predicates and Scalars</title>
+  <sect3 id="nullvalues-multielementpredicates-composites">
+   <title>Composite Fields</title>
+   <para>
+    When a composite typed valued is created a null value can be assigned to any
+    of its fields (see <xref linkend="rowtypes-constructing"/> for how to do this).
+    So long as at least one field is non-null the composite value
+    as whole exists and an <literal>IS NULL</literal> predicate will return false.
+   </para>
+   <para>
+    Applying the <literal>IS NOT NULL</literal> predicate to a composite value performs
+    checks whether all fields of the composite have non-null values.  This is not the same
+    as a non-null composite value.  Specifically, if the composite value has
+    a null-valued field then both the <literal>IS NOT NULL</literal> predicate and the
+    <literal>IS NULL</literal> predicate will return false.
+    <programlisting>
+     SELECT
+      ROW(1,2) IS NULL AS "Row Is Null",
+      ROW(1,2) IS NOT NULL AS "Row Is Not Null",
+      ROW(1,NULL) IS NULL AS "Row Is Null",
+      ROW(1,NULL) IS NOT NULL AS "Row Is Not Null";
+    </programlisting>
+    <screen>
+      Row Is Null | Row Is Not Null | Row Is Null | Row Is Not Null
+     -------------+-----------------+-------------+-----------------
+      f           | t               | f           | f
+    </screen>
+   </para>
+   <para>
+    Please read <xref linkend="composite-type-comparison"/> for a complete treatment
+    on how <productname>PostgreSQL</productname> handles row-wise comparison.  The
+    next two multi-element related items in this subsection discuss those comparisons in the
+    presence of null-valued fields, and also in terms of the SQL standard.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementpredicates-arrays">
+   <title>Array Elements and IN Bag Members</title>
+   <para>
+    Examples of applying the behavior discussed in <xref linkend="nullvalues-multielement"/>
+    to arrays, and <literal>IN</literal> and <literal>NOT IN</literal> bags, using the
+    operators defined in <xref linkend="functions-comparisons"/>.  The following examples produce
+    the same results when swapping <literal>IN</literal>/<literal>ANY</literal>
+    and also <literal>NOT IN</literal>/<literal>ALL</literal>, plus transforming the bag/array format.
+    I.e., the exhaustive and non-exhaustive pairs noted in <xref linkend="nullvalues-multielement"/>.
+   </para>
+   <para>
+    <programlisting>
+     SELECT
+      1 = ANY(array[1, 1, NULL]) AS "Any-Null-Match",
+      1 = ANY(array[1, 1]) AS "Any-NoNull-Match",
+      1 = ALL(array[1, 1, NULL]) AS "ALL-Null-Match",
+      1 = ALL(array[1, 1]) AS "All-NoNull-Match";
+     SELECT
+      2 IN (1, 1, NULL) AS "IN-Null-Negative",
+      2 IN (1, 1) AS "IN-NoNull-Negative",
+      2 NOT IN (2, 2, NULL) AS "NotIN-Null-Negative",
+      2 NOT IN (2, 2) AS "NotIN-NoNull-Negative";
+    </programlisting>
+    <screen>
+      Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+     ----------------+------------------+----------------+------------------
+      t              | t                |                | t
+
+      IN-Null-Negative | IN-NoNull-Negative | NotIN-Null-Negative | NotIN-NoNull-Negative
+     ------------------+--------------------+---------------------+-----------------------
+                       | f                  | f                   | f
+    </screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementpredicates-subqueries">
+   <title>Single-Column Subquery Rows</title>
+   <para>
+    Examples of applying the behavior discussed in <xref linkend="nullvalues-multielement"/>
+    to subqueries using the operators defined in <xref linkend="functions-subquery"/>.  Here we
+    covers the case were the multiple elements being checked are rows, each having one column.
+    If the column itself is multi-element then the thing being searched for must be a compatible
+    multi-element value, and the corresponding comparison behavior described in
+    <xref linkend="nullvalues-multielementcomparison"/> will also be applied.
+   </para>
+   <para>
+    <programlisting>
+     SELECT
+      1 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-Match",
+      1 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-Match",
+      1 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-Match",
+      1 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-Match";
+     SELECT
+      2 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-NoMatch",
+      2 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-NoMatch",
+      2 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-NoMatch",
+      2 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-NoMatch";
+    </programlisting>
+    <screen>
+      Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+     ----------------+------------------+----------------+------------------
+      t              | t                |                | t
+
+      Any-Null-NoMatch | Any-NoNull-NoMatch | ALL-Null-NoMatch | All-NoNull-NoMatch
+     ------------------+--------------------+------------------+--------------------
+                       | f                  | f                | f
+    </screen>
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-multielementcomparison">
+  <title>Multi-Element Comparisons</title>
+  <para>
+   The previous subsection, <xref linkend="nullvalues-multielementpredicates"/>, discussed applying
+   a predicate or a scalar value check element-wise across a multi-element value.
+   This subsection moves the discussion over to comparing two multi-element values to each other.
+   As both array and composite typed values
+   can be stored within an index, and comparing two values in that context must not produce
+   a null-valued result, considerations are made to adhere to the SQL standard where
+   possible while still making indexes, which the specification is silent on, functional.
+   Specifically, except when comparing two row constructors, null values are considered
+   equal to other null values and greater than all non-null values.
+  </para>
+  <para>
+   There are five pair-wise comparison situations to consider:
+   element-wise when the inputs are arrays, and row-wise when the inputs can be either
+   row constructors or composite typed values.  While these four later combinations seem similar,
+   the fact that row constructors are query literals, while composite typed values can be stored,
+   brings about important differences in how they are treated.  Please read
+   <xref linkend="composite-type-comparison"/> for a fuller treatment of this topic.  Here
+   we briefly recap the five different situations in the presence of null values.
+  </para>
+  <sect3 id="nullvalues-multielementcomparison-array">
+   <title>Element-wise Comparisons</title>
+   <para>
+    First situation, null values within an array compare as equal to each other and greater than all
+    non-null values, regardless of whether the comparison involves
+    <link linkend="sql-syntax-array-constructors">array constructors</link> or array typed values.
+    <programlisting>
+     SELECT
+      array[1,2]=array[1,null] AS "Constructors",
+      s, t,
+      s = t AS "Stored Equality",
+      t &gt; s AS "Stored Ordering"
+     FROM
+     (values (array[1,2])) AS sv (s),
+     (values (array[1,null::integer])) AS st (t);
+    </programlisting>
+    <screen>
+      Constructors |   s   |    t     | Stored Equality | Stored Ordering
+     --------------+-------+----------+-----------------+-----------------
+      f            | {1,2} | {1,NULL} | f               | t
+    </screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-rowconstructor">
+   <title>Row-wise Mutual Row Constructor Comparisons</title>
+   <para>
+    In this situation null values produce unknown when compared to all values.
+    <programlisting>
+     SELECT
+      (1,2)=(1,null) AS "NonNull=Null",
+      (1,null::integer)=(1,null) AS "Null=Null";
+    </programlisting>
+    <screen>
+      NonNull=Null | Null=Null
+     --------------+-----------
+                   |
+    </screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-composite">
+   <title>Row-wise Composite Involved Comparisons</title>
+   <para>
+    In these three situations null values are considered equal to each other and greater than
+    all non-null value.
+   </para>
+   <programlisting>
+    SELECT s, t,
+     s = t AS "Stored Equals Stored",
+     t &lt; (1,2) AS "Stored LT Constructor",
+     t = (1,null::integer) AS "Stored Equals Constructor"
+    FROM
+     (values (1,2)) AS s,
+     (values (1,null::integer)) AS t;
+   </programlisting>
+   <screen>
+       s   |  t   | Stored Equals Stored | Stored LT Constructor | Stored Equals Constructor
+    -------+------+----------------------+-----------------------+---------------------------
+     (1,2) | (1,) | f                    | f                     | t
+   </screen>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-sqlconformance">
+   <title>SQL Standard Conformance</title>
+   <para>
+    The SQL standard requires row-wise comparison to return NULL if the
+    result depends on comparing two NULL values or a NULL and a non-NULL.
+    <productname>PostgreSQL</productname> does this only when comparing the
+    results of two row constructors (as in
+    <xref linkend="row-wise-comparison"/>) or comparing a row constructor
+    to the output of a subquery (as in <xref linkend="functions-subquery"/>).
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-functions">
+  <title>Null-Valued Arguments in Normal Function Calls</title>
+  <para>
+   <link linkend="sql-createfunction">Function specifications</link>
+   have a "strictness" attribute (<literal>pg_proc.proisstrict</literal>) that,
+   when set to "strict" (true) will tell the executor to return a null value for any
+   function call having at least one null-valued input, without executing the
+   function.
+  </para>
+  <para>
+   Most functions, especially single argument functions, are defined with strict because without
+   non-null values to act upon they cannot produce a meaningful result.  However, for multi-argument
+   functions, especially <link linkend="xfunc-sql-variadic-functions">variadic functions</link>
+   like concatenate, null values often are simply ignored.
+   This can be different than the choice made by a binary operator performing the same function,
+   like for concatenating text, but not always, like concatenating an element onto an array.
+   <programlisting>
+    SELECT
+     lower(null::text) AS "Lower",
+     left('text', null) AS "Left",
+     'one' || null AS "|| Text Op",
+     concat('one', null) AS "concat Text Func",
+     array_append(array[1], null) AS "append([], null)",
+     array[1]::integer[] || null::integer AS "[] || null",
+     array[1]::integer[] || null::integer[] AS "[] || null[]";
+   </programlisting>
+   <screen>
+     Lower | Left | || Text Op | concat Text Func | append([], null) | [] || null | [] || null[]
+    -------+------+------------+------------------+------------------+------------+--------------
+           |      |            | one              | {1,NULL}         | {1,NULL}   | {1}
+   </screen>
+   In short, please read the documentation for the functions you use if they may receive null inputs
+   to understand how they will behave.  Send a documentation comment pointing out any functions
+   that do not behave strictly but whose actual behavior in the presence of null-valued input
+   is not described or readily inferred.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-aggregates">
+  <title>Null-Valued Arguments in Aggregate and Window Functions</title>
+  <para>
+   When executing an aggregate or window function the state tracking component
+   (which may be initialized to a non-null value, e.g., 0 for the count function)
+   will remain unchanged even if the underlying processing
+   function returns a null value, whether from being defined strict
+   or it simply returns a null value upon execution.  The aggregation
+   routine will usually ignore the null value and continue processing,
+   as demonstrated in <literal>count(value)</literal> below.
+   <programlisting>
+    SELECT
+     count(*) AS "Count",
+     count(value) AS "Count Value",
+     count(null_examples) AS "Count Composite",
+     count(row(value, value)) AS "Count Row"
+    FROM null_examples;
+   </programlisting>
+   <screen>
+     Count | Count Value | Count Composite | Count Row
+    -------+-------------+-----------------+-----------
+         3 |           2 |               3 |         3
+   </screen>
+   Notice the "Count Row" outcome, though.  While we noted in the cardinal warning
+   that a composite whose fields are all null values is indistinguishable from
+   a null value of composite type, the count aggregate does indeed distinguish them,
+   recognizing and counting the non-null composite value produced by the
+   <link linkend="sql-syntax-row-constructors">row constructor</link>
+   <literal>row(null, null)</literal>.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-filtering">
+  <title>Null Values When Filtering</title>
+  <para>
+   A <literal>WHERE</literal> clause that evaluates to a null value for a given row will exclude that row.
+   <programlisting>
+    SELECT id, value AS "Equals 1"
+    FROM null_examples
+    WHERE value = 1;
+
+    SELECT id, value AS "Not Equal to 1"
+    FROM null_examples
+    WHERE value != 1;
+   </programlisting>
+   <screen>
+     id | Equals 1
+    ----+----------
+      1 |        1
+
+     id | Not Equal to 1
+    ----+----------------
+      3 |              4
+   </screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-table-constraints">
+  <title>Null Values in Table Constraints</title>
+  <para>
+   It is possible to define
+   <link linkend="ddl-constraints-check-constraints">check constraint</link>
+   expressions on tables to ensure only values passing those expressions are inserted.
+   While this seems like it would behave the same as a where clause, the choice here,
+   when an expression evaluates to a null value, is to allow the row to be inserted
+   - the same as a true result.
+   <programlisting>
+    BEGIN;
+    ALTER TABLE null_examples ADD CONSTRAINT value_not_1 CHECK (value != 1);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    ERROR:  check constraint "value_not_1" of relation "null_examples" is violated by some row
+    ROLLBACK
+   </screen>
+   <programlisting>
+    BEGIN;
+    ALTER TABLE null_examples ADD CONSTRAINT value_not_10 CHECK (value != 10);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    ALTER TABLE
+    ROLLBACK
+   </screen>
+   We are using a transaction (begin and rollback) and the alter table command to add two
+   constraints to our null_examples table.  The first constraint prohibits rows with a value
+   of 1, which our row with an id of 1 violates.  Prohibiting the value 10 definitely allows
+   rows with ids 1 and 3 to exist, and since we are not told that some row violates our
+   constraint the null value in the row with id 2 is being accepted as well.
+  </para>
+  <para>
+   The <link linkend="ddl-constraints-not-null"><literal>NOT NULL</literal> column constraint</link>
+   produces the same answer as a <literal>column IS NOT NULL</literal> check constraint but is
+   more concise to write.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-grouping">
+  <title>Null Values When Grouping</title>
+  <para>
+   In the context of both <literal>DISTINCT</literal> and <literal>GROUP BY</literal>
+   it is necessary that all inputs resolve to being either equal to or not equal to all
+   other values.  These features use <link linkend="nullvalues-cardinalrule">distinctness</link>
+   instead of simple equality in order to handle a null value like a definite value equal to
+   another null value and unequal to all other values.
+   <programlisting>
+    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+    SELECT
+     value,
+     count(*) AS "Count"
+    FROM vals
+    GROUP BY value
+    ORDER BY value;
+   </programlisting>
+   <screen>
+     value | Count
+    -------+-------
+         1 |     2
+         2 |     1
+           |     2
+   </screen>
+   <programlisting>
+    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+    SELECT DISTINCT value
+    FROM vals
+    ORDER BY value NULLS FIRST;
+   </programlisting>
+   <screen>
+     value
+    -------
+
+         1
+         2
+   </screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-ordering">
+  <title>Null Values When Ordering</title>
+  <para>
+   In the context of <literal>ORDER BY</literal>, distinctness rules also apply,
+   though this is insufficient since it must be determined whether or not to
+   present null values before or after all non-null values.  To handle
+   this, the <literal>ORDER BY</literal> clause will let you specify either
+   <literal>NULLS FIRST</literal> or <literal>NULLS LAST</literal>.
+   <programlisting>
+    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+    SELECT value FROM vals
+    ORDER BY value DESC NULLS FIRST;
+   </programlisting>
+   <screen>
+     value
+    -------
+
+
+         2
+         1
+         1
+   </screen>
+  </para>
+  <para>
+   Note that when dealing with multi-element values the comparison behavior described in
+   <xref linkend="nullvalues-multielementcomparison"/> applies,
+   if the comparison determination rests upon comparing a null value to a non-null value
+   the multi-element value with the null-valued component will sort greater than the one
+   with a non-null component.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-indexed">
+  <title>Null Values in Indexes</title>
+  <para>
+   The uniqueness and relative ordering rules applied to null values
+   are defined when creating an index.  For the default
+   <literal>NULLS DISTINCT</literal> uniqueness, equality rules are applied.
+   Specifying <literal>NULLS NOT DISTINCT</literal> will result in
+   <literal>IS DISTINCT FROM</literal> rules being applied whereby all null
+   values are equal to each other.  This setting applies to all columns in the index.
+  </para>
+  <para>
+   <programlisting>
+    BEGIN;
+    CREATE UNIQUE INDEX value_nulls_distinct_implicit ON null_examples (value);
+    CREATE UNIQUE INDEX value_nulls_distinct_explicit ON null_examples (value) NULLS DISTINCT;
+    INSERT INTO null_examples VALUES (4, NULL);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    CREATE INDEX
+    CREATE INDEX
+    INSERT 0 1
+    ROLLBACK
+   </screen>
+   <programlisting>
+    BEGIN;
+    CREATE UNIQUE INDEX value_nulls_not_distinct_explicit ON null_examples (value) NULLS NOT DISTINCT;
+    INSERT INTO null_examples VALUES (4, NULL);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    CREATE INDEX
+    ERROR:  duplicate key value violates unique constraint "value_nulls_not_distinct_explicit"
+    DETAIL:  Key (value)=(null) already exists.
+    ROLLBACK
+   </screen>
+  </para>
+  <para>
+   For ordering, each column in the index gets its own specification of
+   direction and null value placement similar to that found in the
+   <literal>ORDER BY</literal> clause.
+  </para>
+  <para>
+   Note that when dealing with multi-element values the comparison behavior described in
+   <xref linkend="nullvalues-multielementcomparison"/> applies,
+   if the comparison determination rests upon comparing a null value to a non-null value
+   the multi-element value with the null-valued component will sort greater than the one
+   with a non-null component.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-partitionkeys">
+  <title>Null Values in Partition Keys</title>
+  <para>
+   Presently, PostgreSQL requires that all the columns of a partition key be included
+   in the primary key.  Furthermore, all columns used in a primary key have a not-null
+   column constraint applied to them.  Therefore, any partitioned table with a primary key
+   will only have non-null values in the partition key columns.
+  </para>
+  <para>
+   However, should you setup a situation where a partition key column can both: have a null value
+   and, null values in that key go to a specific partition, list-based routing will work as expected.
+   There is presently no way to direct rows having null values in partition keys away from the
+   default partition for range and hash partitioning.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-settings">
+  <title>Null-Valued Settings</title>
+  <para>
+   There are none.  During initialization all settings are assigned a non-null value.
+  </para>
+  <para>
+   This is mostly meaningful for <link linkend="runtime-config-custom">custom settings</link>,
+   thus this subsection focuses on <link linkend="config-setting-sql">SQL interaction</link>.
+   Unlike settings created by extensions, custom settings can only be textual and the default
+   value for text here is the empty string.
+   <programlisting>
+    SHOW example.string;
+    BEGIN;
+    SELECT set_config('example.string', NULL, true);
+    SELECT current_setting('example.string') IS NULL AS "Setting Is Null";
+    ROLLBACK;
+    SHOW example.string;
+    RESET example.string;
+    SHOW example.string;
+   </programlisting>
+   <screen>
+    ERROR:  unrecognized configuration parameter "example.string"
+    BEGIN
+     set_config
+    ------------
+
+
+     Setting Is Null
+    -----------------
+     f
+
+    ROLLBACK
+     example.string
+    ----------------
+
+
+    RESET
+     example.string
+    ----------------
+
+   </screen>
+   Notice two important behaviors: first, even though we passed in a null value to
+   the <literal>set_config</literal> function, the <literal>current_setting</literal>
+   function returned a non-null value, specifically the empty string.  Second, after ROLLBACK the
+   setting is still present (i.e., the error seen before creating the setting no longer appears),
+   and in fact will remain so until the session ends
+   (i.e., RESET does not restore the non-existence state.)
+  </para>
+  <para>
+    The other ways to specify settings do not have a means to specify null values,
+    a specific non-null value is required as part of the specification of the setting.
+   </para>
+ </sect2>
+
+ <sect2 id="nullvalues-json">
+  <title>Null Values in JSON</title>
+  <para>
+   As noted in <xref linkend="json-type-mapping-table"/>, the JSON specification's
+   null value is assigned its own type unlike in SQL.  This introduces an inconsistency
+   since the JSON null type's value is itself non-null.  It is also comparable to any
+   other JSON type, returning false for equality, and itself, returning true for equality.
+   But an SQL value of json or jsonb type having a JSON null value is considered non-null in SQL.
+   <programlisting>
+    SELECT 'null'::json IS NULL AS "JSON null is NULL";
+   </programlisting>
+   <screen>
+     JSON null is NULL
+    -------------------
+     f
+   </screen>
+   Additionally, the SQL operators and functions involving JSON key or array element selection,
+   or construction from literals, require that a valid number or text value be supplied as an operand
+   and so an SQL null value cannot be targeted by those operators and functions.
+   <programlisting>
+    SELECT to_json(null::text);
+   </programlisting>
+   <screen>
+     to_json
+    ---------
+
+   </screen>
+   That all said, the system will convert an SQL null value to a JSON null value when in a
+   composite type context.
+   <programlisting>
+    SELECT json_build_object('value', value)
+    FROM null_examples;
+   </programlisting>
+   <screen>
+     json_build_object
+    -------------------
+     {"value" : 1}
+     {"value" : null}
+     {"value" : 4}
+   </screen>
+   And vice versa.
+   <programlisting>
+    SELECT *
+    FROM jsonb_to_recordset('[{"value":1},{"value":null},{"value":4}]'::jsonb) AS jtr (value integer);
+   </programlisting>
+   <screen>
+     value
+    -------
+         1
+
+         4
+   </screen>
+  </para>
+  <para>
+   Aspects of null value handling within the internals of the JSON-related types are discussed
+   in <xref linkend="datatype-json"/>,
+   particularly in <xref linkend="datatype-jsonpath"/>.
+   This subsection is focused on how SQL null values are related to JSON null values.
+  </para>
+ </sect2>
+</sect1>
diff --git a/doc/src/sgml/ref/create_domain.sgml b/doc/src/sgml/ref/create_domain.sgml
index ce55520348..027a145f2c 100644
--- a/doc/src/sgml/ref/create_domain.sgml
+++ b/doc/src/sgml/ref/create_domain.sgml
@@ -197,9 +197,10 @@ CREATE DOMAIN <replaceable class="parameter">name</replaceable> [ AS ] <replacea
    Domain constraints, particularly <literal>NOT NULL</literal>, are checked when
    converting a value to the domain type.  It is possible for a column that
    is nominally of the domain type to read as null despite there being such
-   a constraint.  For example, this can happen in an outer-join query, if
-   the domain column is on the nullable side of the outer join.  A more
-   subtle example is
+   a constraint.  For example, this can happen in
+   <link linkend="nullvalues-domains">an outer-join query</link>, if
+   the domain column is on the nullable side of the outer join.
+   A more subtle example is
 <programlisting>
 INSERT INTO tab (domcol) VALUES ((SELECT domcol FROM tab WHERE false));
 </programlisting>
diff --git a/doc/src/sgml/syntax.sgml b/doc/src/sgml/syntax.sgml
index 916189a7d6..c41687b224 100644
--- a/doc/src/sgml/syntax.sgml
+++ b/doc/src/sgml/syntax.sgml
@@ -281,9 +281,9 @@ U&amp;"d!0061t!+000061" UESCAPE '!'
    </indexterm>
 
    <para>
-    There are three kinds of <firstterm>implicitly-typed
+    There are four kinds of <firstterm>implicitly-typed
     constants</firstterm> in <productname>PostgreSQL</productname>:
-    strings, bit strings, and numbers.
+    strings, bit strings, numbers, and the null value.
     Constants can also be specified with explicit types, which can
     enable more accurate representation and more efficient handling by
     the system. These alternatives are discussed in the following
@@ -834,6 +834,25 @@ CAST ( '<replaceable>string</replaceable>' AS <replaceable>type</replaceable> )
      usage, as is the function-call syntax.
     </para>
    </sect3>
+
+   <sect3 id="sql-syntax-constants-nullvalue">
+    <title>The Null Value Constant</title>
+    <indexterm>
+     <primary>null value</primary>
+     <secondary>constant</secondary>
+    </indexterm>
+    <para>
+     The null value represents an unknown value and its constant, the keyword <literal>NULL</literal>,
+     when evaluated in an expression, likewise yields a value of <literal>unknown</literal> type.
+     See <xref linkend="nullvalues"/> for an overview of how the system behaves in the presence
+     of a null value in various contexts.
+    </para>
+    <para>
+     Due to the typing of a null value as <literal>unknown</literal> it is often necessary to use
+     a cast, as described in the previous section, to convert it to the specific type needed.
+     However, implicit casting is performed when contextual information is available.
+    </para>
+   </sect3>
   </sect2>
 
   <sect2 id="sql-syntax-operators">
-- 
2.34.1

#59jian he
jian.universality@gmail.com
In reply to: David G. Johnston (#58)
Re: Document NULL

On Fri, Jan 17, 2025 at 6:41 AM David G. Johnston
<david.g.johnston@gmail.com> wrote:

Yeah, I did spell check but not a grammar check. These weren't spelling errors though. Anyway, good point running the resultant web page through chatgpt or grammar-aware program.

I still need to put together the example changes in these last couple of suggestions. The attached v6 omits those and the indenting - and I've consolidated it back into a single patch.

hi.

<title>Array Elements and IN Bag Members</title>
google "Bag Members" didn't yield any relevant results.
there are two appearances of "bag" in doc/src/sgml/nullvalues.sgml.
I am confused by this word.

<sect3 id="nullvalues-usage-tables">
<title>Null Values in Tables</title>
<para>
Whether via the copy method above, or by inserting literal null values,
most usage concerns for null values results from their presence in a table
column that lacks a <link
linkend="nullvalues-table-constraints">not-null constraint</link>.
</para>
We can simply say that, in a table,
if a specific column doesn't have a not-null constraint, null value
can exist in that column.
or maybe this part is unnecessary, we can remove it.

<para>
As noted in <xref linkend="json-type-mapping-table"/>, the JSON
specification's
null value is assigned its own type unlike in SQL. This introduces
an inconsistency
since the JSON null type's value is itself non-null. It is also
comparable to any
other JSON type, returning false for equality, and itself,
returning true for equality.
But an SQL value of json or jsonb type having a JSON null value is
considered non-null in SQL.

this part """But an SQL value of json or jsonb type having a JSON null
value is considered non-null in SQL"""
is the same as
"since the JSON null type's value is itself non-null.".
so i think removing this sentence "But an SQL value of json or jsonb
type having a JSON null value is considered non-null in SQL."
there is no meaning being lost.
(i think this is minor issue)

<sect2 id="nullvalues-settings">
<title>Null-Valued Settings</title>
<para>
There are none. During initialization all settings are assigned a
non-null value.
</para>
"There are none" kind of comes from nowhere.
I think you mean "There are no null-valued settings"?

<sect2 id="nullvalues-partitionkeys">
<title>Null Values in Partition Keys</title>
<para>
Presently, PostgreSQL requires that all the columns of a partition
key be included

here "PostgreSQL" should be decorated as <productname>PostgreSQL</productname>.

#60David G. Johnston
david.g.johnston@gmail.com
In reply to: jian he (#59)
Re: Document NULL

On Thursday, February 6, 2025, jian he <jian.universality@gmail.com> wrote:

On Fri, Jan 17, 2025 at 6:41 AM David G. Johnston
<david.g.johnston@gmail.com> wrote:

Yeah, I did spell check but not a grammar check. These weren't spelling

errors though. Anyway, good point running the resultant web page through
chatgpt or grammar-aware program.

I still need to put together the example changes in these last couple of

suggestions. The attached v6 omits those and the indenting - and I've
consolidated it back into a single patch.

hi.

<title>Array Elements and IN Bag Members</title>
google "Bag Members" didn't yield any relevant results.
there are two appearances of "bag" in doc/src/sgml/nullvalues.sgml.
I am confused by this word.

Apparently “multiset” is the more common term. I first learned it as bag
which is a synonym.

https://en.m.wikipedia.org/wiki/Multiset

<sect3 id="nullvalues-usage-tables">
<title>Null Values in Tables</title>
<para>
Whether via the copy method above, or by inserting literal null values,
most usage concerns for null values results from their presence in a
table
column that lacks a <link
linkend="nullvalues-table-constraints">not-null constraint</link>.
</para>
We can simply say that, in a table,
if a specific column doesn't have a not-null constraint, null value
can exist in that column.
or maybe this part is unnecessary, we can remove it.

Will ponder and likely change. The section seems relevant since databases
are all about tables so discussing null in that context seems needed even
if there isn’t that much to say.

<para>
As noted in <xref linkend="json-type-mapping-table"/>, the JSON
specification's
null value is assigned its own type unlike in SQL. This introduces
an inconsistency
since the JSON null type's value is itself non-null. It is also
comparable to any
other JSON type, returning false for equality, and itself,
returning true for equality.
But an SQL value of json or jsonb type having a JSON null value is
considered non-null in SQL.

this part """But an SQL value of json or jsonb type having a JSON null
value is considered non-null in SQL"""
is the same as
"since the JSON null type's value is itself non-null.".

so i think removing this sentence "But an SQL value of json or jsonb

type having a JSON null value is considered non-null in SQL."
there is no meaning being lost.
(i think this is minor issue)

I’ll try to make the whole thing less wordy. But stating the implied fact
that since json treats null like a concrete value SQL must do so also seems
warranted.

<sect2 id="nullvalues-settings">
<title>Null-Valued Settings</title>
<para>
There are none. During initialization all settings are assigned a
non-null value.
</para>
"There are none" kind of comes from nowhere.
I think you mean "There are no null-valued settings"?

Yeah, my personal style, not the documentation’s, came through there. Will
change.

<sect2 id="nullvalues-partitionkeys">
<title>Null Values in Partition Keys</title>
<para>
Presently, PostgreSQL requires that all the columns of a partition
key be included

here "PostgreSQL" should be decorated as <productname>PostgreSQL</
productname>.

Will fix.

Thanks!

David J.

#61David G. Johnston
david.g.johnston@gmail.com
In reply to: David G. Johnston (#60)
2 attachment(s)
Re: Document NULL

Version 7
https://wiki.postgresql.org/wiki/Documenting_NULL
https://commitfest.postgresql.org/patch/5086/

The only item that came up that I'm unable to address myself is discussion
comparing a NOT NULL column constraint to an equivalent check constraint.
I've left things documented as semantically equivalent. A future patch can
clear those things up. At this point I'm considering this patch content
complete.

I figure to make any last tweaks against this version 7, combine the two
patches into one and submit v8 as ready to commit should a reviewer agree.

For now I've left v6 alone and added a diff to cover these last changes.

The markup surrounding the examples is correct now and I decided \N was the
most useful representation of NULL given that the query data is single
digit numbers. I really hate the non-readability of t/f output for
booleans so I manually cleaned those up.

David J.

Attachments:

v7-0002-v7-Document-NULL-delta-from-v6.patchtext/x-patch; charset=US-ASCII; name=v7-0002-v7-Document-NULL-delta-from-v6.patchDownload
From 5b3066a3857e1e246ba812ac57d326b9dbbb3d27 Mon Sep 17 00:00:00 2001
From: "David G. Johnston" <David.G.Johnston@Gmail.com>
Date: Mon, 10 Mar 2025 20:52:25 -0700
Subject: [PATCH 2/2] v7 Document NULL (delta from v6)

---
 doc/src/sgml/nullvalues.sgml | 1143 ++++++++++++++++++----------------
 1 file changed, 599 insertions(+), 544 deletions(-)

diff --git a/doc/src/sgml/nullvalues.sgml b/doc/src/sgml/nullvalues.sgml
index 07bbc58528..29ece221ff 100644
--- a/doc/src/sgml/nullvalues.sgml
+++ b/doc/src/sgml/nullvalues.sgml
@@ -6,27 +6,45 @@
  </indexterm>
 
  <para>
-  This section first introduces the concept of null values and then goes
-  on to explain how different parts of the system behave when provided
+  This section first introduces the concept of null values and then
+  explains how different parts of the system behave when provided
   one or more null value inputs.  Examples throughout this section
   can be executed so long as the following table and rows are created first.
  </para>
 
  <para>
-  Throughout this section the discussion of null values will be limited to
+  Throughout this section, the discussion of null values will be limited to
   the SQL language unless otherwise noted.  The JSON-related data types, and the
   non-SQL procedural languages, have their own behaviors documented in their
   respective areas.
  </para>
 
- <programlisting>
-  CREATE TABLE null_examples (
-    id bigint PRIMARY KEY,
-    value integer NULL
-  );
-  INSERT INTO null_examples
-  VALUES (1, 1), (2, NULL), (3, 4);
- </programlisting>
+ <para>
+  The following <literal>CREATE TABLE</literal> and <literal>INSERT</literal>
+  SQL commands can be executed in any SQL client to create and populate
+  the persistent table used in the examples below.  The <literal>\pset</literal>
+  commands require the use of <application>psql</application> as the client program;
+  they make the resulting output a bit easier to read and do not impact any behaviors
+  described herein.  Note, the examples below have been manually edited to show
+  <literal>true</literal> and <literal>false</literal> instead of
+  <literal>t</literal> and <literal>f</literal>.  They also omit any transactional
+  command output when transactions are used.  Instead, each transaction gets its own
+  display block.
+ </para>
+
+<programlisting>
+CREATE TABLE null_examples (
+  id bigint PRIMARY KEY,
+  value integer NULL
+);
+INSERT INTO null_examples
+VALUES (1, 1), (2, NULL), (3, 4);
+
+-- This makes null values print as \N in the output instead of the empty string.
+\pset null '\\N'
+-- Removes the row count footer that prints by default.
+\pset footer off
+</programlisting>
 
  <sect2 id="nullvalues-model">
   <title>Meaning</title>
@@ -53,15 +71,14 @@
   <para>
    A null value, like all values, must have a data type, and is valid for all data types.
    It must also be printed as text.  This section discusses null values at the boundaries
-   of the system as well as how they can come into existence due to the design of a query.
+   of the system, as well as how they can come into existence due to the design of a query.
   </para>
   <sect3 id="nullvalues-usage-input">
    <title>Null Value Input</title>
    <para>
     A null value can be used as input to any function, operator, or expression.
     The system will then decide how to behave based on the rules described in the
-    rest of this section.  The system will also decide how to behave when a null value
-    is used as a parameter to a function that does not accept null values.
+    rest of this section.
    </para>
    <para>
     As noted in <xref linkend="sql-syntax-constants-nullvalue"/>,
@@ -70,34 +87,34 @@
     but can be cast to any concrete data type.
    </para>
    <para>
-    <programlisting>
-    SELECT
-     NULL AS "Literal Null Value",
-     pg_typeof(null) AS "Type of Null",
-     pg_typeof(NULL::text) AS "Type of Cast Null",
-     cast(null as text) AS "Cast Null Value";
-    </programlisting>
-    <screen>
-      Literal Null Value | Type of Null | Type of Cast Null | Cast Null Value
-     --------------------+--------------+-------------------+-----------------
-                         | unknown      | text              |
-    </screen>
+<programlisting>
+SELECT
+ NULL AS "Literal Null Value",
+ pg_typeof(null) AS "Type of Null",
+ pg_typeof(NULL::text) AS "Type of Cast Null",
+ cast(null as text) AS "Cast Null Value";
+</programlisting>
+<screen>
+ Literal Null Value | Type of Null | Type of Cast Null | Cast Null Value
+--------------------+--------------+-------------------+-----------------
+ \N                 | unknown      | text              | \N
+</screen>
    </para>
    <para>
-    <programlisting>
-    SELECT text NULL;
-    </programlisting>
-    <screen>
-    ERROR:  column "text" does not exist
-    LINE 1: select text NUll;
-    </screen>
+<programlisting>
+SELECT text NULL;
+</programlisting>
+<screen>
+ERROR:  column "text" does not exist
+LINE 1: select text NUll;
+</screen>
    </para>
    <para>
     The <link linkend="sql-copy"><command>COPY ... FROM</command></link> command,
     including its psql counter-part meta-command
     <link linkend="app-psql-meta-commands-copy"><command>\copy</command></link>,
     must deal with input files containing textual representations of the null value.
-    The lack of consistency in real world data requires having a few options to the
+    The lack of consistency in real-world data requires having a few options to the
     command related to null handling.  See the documentation in
     <xref linkend="sql-copy"/> for more information.
     But, in short, for CSV input it expects text to be quoted and interprets an unquoted
@@ -107,9 +124,13 @@
   <sect3 id="nullvalues-usage-tables">
    <title>Null Values in Tables</title>
    <para>
-    Whether via the copy method above, or by inserting literal null values,
-    most usage concerns for null values results from their presence in a table
-    column that lacks a <link linkend="nullvalues-table-constraints">not-null constraint</link>.
+    From a semantics perspective a table treats a null value like any other value.
+    However, the SQL Language recognizes its uniqueness by defining a column-scoped
+    <link linkend="nullvalues-table-constraints"><literal>NOT NULL</literal> constraint</link>
+    as syntactic sugar.  At present one would expect that a column having a
+    domain data type with a <literal>NOT NULL</literal> constraint would likewise be
+    incapable of having a null value stored.  This is not the case.  See the commentary
+    below in <xref linkend="nullvalues-domains"/> for more information.
    </para>
   </sect3>
   <sect3 id="nullvalues-usage-derived">
@@ -117,26 +138,26 @@
    <para>
     Even if all data stored in tables are known to be non-null, null values can still
     be produced while executing a query.  The most common way this happens is by
-    introducing a (left) outer join to the query and having data missing optional related
-    data on the right side of the join.
-    <programlisting>
-     SELECT
-      countries.country,
-      flagships.flagship
-     FROM (
-      VALUES ('Spain'), ('Switzerland')
-     ) as countries (country)
-     LEFT JOIN (
-      VALUES ('Spain', 'Ship')
-     ) as flagships (country, flagship)
-     ON countries.country = flagships.country;
-    </programlisting>
-    <screen>
-        country   | flagship 
-     -------------+----------
-      Spain       | Ship
-      Switzerland | NULL
-    </screen>
+    introducing a (left) outer join to the query and having left side data without
+    corresponding data on the right side of the join.
+<programlisting>
+SELECT
+ countries.country,
+ flagships.flagship
+FROM (
+ VALUES ('Spain'), ('Switzerland')
+) as countries (country)
+LEFT JOIN (
+ VALUES ('Spain', 'Ship')
+) as flagships (country, flagship)
+ON countries.country = flagships.country;
+</programlisting>
+<screen>
+   country   | flagship
+-------------+----------
+ Spain       | Ship
+ Switzerland | \N
+</screen>
    </para>
   </sect3>
   <sect3 id="nullvalues-usage-output">
@@ -145,7 +166,7 @@
     As evidenced above, the "absence of value" aspect of the null value results
     in its secondary textual representation being an empty string
     (its primary representation is just NULL).
-    This can be problematic if the empty string is expected to also be a valid value.
+    This can be problematic if the empty string is expected to be a valid value.
     Therefore, places that deal with possible null values as input and text as
     output need some means to give the user a way to specify how to print
     the null value.
@@ -166,7 +187,7 @@
    </para>
    <para>
     When the final output of the result is a text file instead of a user additional
-    considerations come into play.  While the option to simply take the user presentation
+    considerations come into play.  While the option to take the user presentation
     and send it to a text file always exists <productname>PostgreSQL</productname> also
     provides a facility to output a structured text file.
     The <link linkend="sql-copy"><command>COPY ... TO</command></link> command,
@@ -186,15 +207,15 @@
     In three-valued logic the concept of unknown, represented using the null value, is
     also an outcome.  This results in falsifying the common-sense notion
     that "p OR NOT p" is always true.
-    <programlisting>
-     SELECT
-      NULL OR NOT NULL AS "N OR !N";
-    </programlisting>
-    <screen>
-      N OR !N 
-     ---------
-      NULL
-    </screen>
+<programlisting>
+SELECT
+ NULL OR NOT NULL AS "N OR !N";
+</programlisting>
+<screen>
+ N OR !N
+---------
+ \N
+</screen>
     (See <xref linkend="nullvalues-operands"/> for more explanation.)
    </para>
    <para>
@@ -216,54 +237,54 @@
     neither equal nor unequal
    </link>
    to any value, including other null values.
-   <programlisting>
-    SELECT
-     NULL = NULL AS "N = N",
-     NULL != NULL AS "N != N",
-     1 = NULL AS "1 = N",
-     1 != NULL AS "1 != N",
-     1 = 1 AS "1 = 1",
-     1 != 1 AS "1 != 1";
-   </programlisting>
-   <screen>
-     N = N | N != N | 1 = N | 1 != N | 1 = 1 | 1 != 1
-    -------+--------+-------+--------+-------+--------
-           |        |       |        | t     | f
-   </screen>
+<programlisting>
+SELECT
+ NULL = NULL AS "N = N",
+ NULL != NULL AS "N != N",
+ 1 = NULL AS "1 = N",
+ 1 != NULL AS "1 != N",
+ 1 = 1 AS "1 = 1",
+ 1 != 1 AS "1 != 1";
+</programlisting>
+<screen>
+ N = N | N != N | 1 = N | 1 != N | 1 = 1 | 1 != 1
+-------+--------+-------+--------+-------+--------
+ \N    | \N     | \N    | \N     | true  | false
+</screen>
    However, as with many rules, there are exceptions, as noted in
    <xref linkend="nullvalues-multielementcomparison"/>.
    Particularly, when the two compared values are part of a larger multi-element value.
-   <programlisting>
-    SELECT
-     array[1,2]=array[1,null] AS "Array Equals";
-   </programlisting>
-   <screen>
-     Array Equals
-    --------------
-     f
-   </screen>
+<programlisting>
+SELECT
+ array[1,2]=array[1,null] AS "Array Equals";
+</programlisting>
+<screen>
+ Array Equals
+--------------
+ false
+</screen>
   </para>
   <para>
-   Because of this SQL standard mandated rule, checking for a null value has an
-   explicit <literal>IS NULL</literal> predicate, and additionally there comparison
+   Because of this SQL standard rule, checking for a null value has an
+   explicit <literal>IS NULL</literal> predicate.  Additionally, there are comparison
    predicates that consider a null value equal to other null values but unequal
    to any other value (e.g., <literal>IS DISTINCT</literal>, and <literal>IS TRUE</literal>.)
    These, and other predicates, are described in
    <xref linkend="functions-comparison-pred-table"/>
-   <programlisting>
-    SELECT id, value,
-     value IS NULL AS "IS N",
-     value IS DISTINCT FROM id AS "IS D",
-     value != id AS "IS !="
-    FROM null_examples;
-   </programlisting>
-   <screen>
-     id | value | IS N | IS D | IS !=
-    ----+-------+------+------+-------
-      1 |     1 | f    | f    | f
-      2 |       | t    | t    |
-      3 |     4 | f    | t    | t
-   </screen>
+<programlisting>
+SELECT id, value,
+ value IS NULL AS "IS NULL",
+ value IS DISTINCT FROM id AS "IS DIST",
+ value != id AS "IS !="
+FROM null_examples;
+</programlisting>
+<screen>
+ id | value | IS NULL | IS DIST | IS !=
+----+-------+---------+---------+-------
+  1 |     1 | false   | false   | false
+  2 |    \N | true    | true    | \N
+  3 |     4 | false   | true    | true
+</screen>
   </para>
   <para>
    On the other hand, the SQL standard is largely alone in taking this approach to comparing
@@ -275,30 +296,30 @@
   <para>
    There is also a cardinal warning: when dealing with
    <link linkend="rowtypes">composite types</link> in
-   expressions; <literal>composite IS NULL</literal>
-   and <literal>composite IS NOT NUll</literal>
+   expressions, <literal>composite IS NULL</literal>
+   and <literal>composite IS NOT NULL</literal>
    are not the opposites of each other in the case where some,
    but not all, of the composite's fields are null values.
    (The case where all fields are null is indistinguishable
    from the composite as a whole being null.)
    Write <literal>NOT(composite IS NULL)</literal> instead.
-   <programlisting>
-    SELECT
-     c,
-     c IS NULL AS "c IS N",
-     NOT(c IS NULL) AS "NOT c IS N",
-     c IS NOT NULL AS "c IS NOT N",
-     ROW(value, value) IS NULL AS "ROW(v,v) IS N",
-     ROW(value, value) IS NOT NULL AS "ROW(v,v) IS NOT N"
-    FROM null_examples AS c;
-   </programlisting>
-   <screen>
-       c   | c IS N | NOT c IS N | c IS NOT N | ROW(v,v) IS N | ROW(v,v) IS NOT N
-    -------+--------+------------+------------+---------------+-------------------
-     (1,1) | f      | t          | t          | f             | t
-     (2,)  | f      | t          | f          | t             | f
-     (3,4) | f      | t          | t          | f             | t
-   </screen>
+<programlisting>
+SELECT
+ c,
+ c IS NULL AS "c IS N",
+ NOT(c IS NULL) AS "NOT c IS N",
+ c IS NOT NULL AS "c IS NOT N",
+ ROW(value, value) IS NULL AS "ROW(v,v) IS N",
+ ROW(value, value) IS NOT NULL AS "ROW(v,v) IS NOT N"
+FROM null_examples AS c;
+</programlisting>
+<screen>
+   c   | c IS N | NOT c IS N | c IS NOT N | ROW(v,v) IS N | ROW(v,v) IS NOT N
+-------+--------+------------+------------+---------------+-------------------
+ (1,1) | false  | true       | true       | false         | true
+ (2,)  | false  | true       | false      | true          | false
+ (3,4) | false  | true       | true       | false         | true
+</screen>
    See <xref linkend="nullvalues-multielement"/> below for an explanation.
   </para>
  </sect2>
@@ -306,35 +327,35 @@
  <sect2 id="nullvalues-operands">
   <title>Null-Valued Operands</title>
   <para>
-   As a general expectation, operator invocation expressions where one of inputs
+   As a general expectation, operator invocation expressions where one of the inputs
    is a null value will result in a null-valued output.
-   <programlisting>
-    SELECT
-     1 + null AS "Add",
-     'text' || null AS "Concatenate";
-   </programlisting>
-   <screen>
-     Add | Concatenate
-    -----+-------------
-         |
-   </screen>
+<programlisting>
+SELECT
+ 1 + null AS "Add",
+ 'text' || null AS "Concatenate";
+</programlisting>
+<screen>
+ Add | Concatenate
+-----+-------------
+  \N | \N
+</screen>
    Operators that behave otherwise should document their deviation from this norm.
   </para>
   <para>
-   A notable example of this is the <literal>IN</literal> operator, which
+   A notable example is the <literal>IN</literal> operator, which
    uses equality, not distinctness, for testing.
-   <programlisting>
-    SELECT
-     1 IN (1, null) AS "In Present",
-     1 IN (2, null) AS "In Missing",
-     null IN (1, 2) AS "N In Non-N",
-     null IN (null, 2) AS "N In N";
-   </programlisting>
-   <screen>
-     In Present | In Missing | N In Non-N | N In N
-    ------------+------------+------------+--------
-     t          |            |            |
-   </screen>
+<programlisting>
+SELECT
+ 1 IN (1, null) AS "In Present",
+ 1 IN (2, null) AS "In Missing",
+ null IN (1, 2) AS "N In Non-N",
+ null IN (null, 2) AS "N In N";
+</programlisting>
+<screen>
+ In Present | In Missing | N In Non-N | N In N
+------------+------------+------------+--------
+ true       | \N         | \N         | \N
+</screen>
    This is just an extension of the multi-element testing behavior described in
    <xref linkend="nullvalues-multielement"/>.
   </para>
@@ -342,77 +363,77 @@
    Experience shows that <literal>CASE</literal> expressions are also prone
    to bugs since their format encourages binary logic thinking while a
    <literal>WHEN</literal> test will not consider a null value to be a match.
-   <programlisting>
-    SELECT id, value,
-     CASE WHEN id = value THEN 'Equal' ELSE 'Not Equal' END AS "Affirm",
-     CASE WHEN id != value THEN 'Not Equal' ELSE 'Equal' END AS "Negate",
-     CASE WHEN value IS NULL THEN 'Null'
-          WHEN id = value THEN 'Equal'
-          ELSE 'Not Equal' END AS "Safe Affirm",
-     CASE WHEN value IS NULL THEN 'Null'
-          WHEN id != value THEN 'Not Equal'
-          ELSE 'Equal' END AS "Safe Negate"
-    FROM null_examples;
-   </programlisting>
-   <screen>
-     id | value |  Affirm   |  Negate   | Safe Affirm | Safe Negate
-    ----+-------+-----------+-----------+-------------+-------------
-      1 |     1 | Equal     | Equal     | Equal       | Equal
-      2 |       | Not Equal | Equal     | Null        | Null
-      3 |     4 | Not Equal | Not Equal | Not Equal   | Not Equal
-   </screen>
+<programlisting>
+SELECT id, value,
+ CASE WHEN id = value THEN 'Equal' ELSE 'Not Equal' END AS "Affirm",
+ CASE WHEN id != value THEN 'Not Equal' ELSE 'Equal' END AS "Negate",
+ CASE WHEN value IS NULL THEN 'Null'
+      WHEN id = value THEN 'Equal'
+      ELSE 'Not Equal' END AS "Safe Affirm",
+ CASE WHEN value IS NULL THEN 'Null'
+      WHEN id != value THEN 'Not Equal'
+      ELSE 'Equal' END AS "Safe Negate"
+FROM null_examples;
+</programlisting>
+<screen>
+ id | value |  Affirm   |  Negate   | Safe Affirm | Safe Negate
+----+-------+-----------+-----------+-------------+-------------
+  1 |     1 | Equal     | Equal     | Equal       | Equal
+  2 |    \N | Not Equal | Equal     | Null        | Null
+  3 |     4 | Not Equal | Not Equal | Not Equal   | Not Equal
+</screen>
   </para>
   <para>
    The boolean operators <literal>AND</literal> and <literal>OR</literal>
    will ignore the null value input if the other input is sufficient to
    determine the outcome.
-   <programlisting>
-    SELECT
-     true OR null AS "T or N",
-     false OR null AS "F or N",
-     true AND null AS "T and N",
-     false AND null AS "F and N";
-   </programlisting>
-   <screen>
-     T or N | F or N | T and N | F and N
-    --------+--------+---------+---------
-     t      |        |         | f
-   </screen>
+<programlisting>
+SELECT
+ true OR null AS "T or N",
+ false OR null AS "F or N",
+ true AND null AS "T and N",
+ false AND null AS "F and N";
+</programlisting>
+<screen>
+ T or N | F or N | T and N | F and N
+--------+--------+---------+---------
+ true   | \N     | \N      | false
+</screen>
   </para>
  </sect2>
 
  <sect2 id="nullvalues-domains">
   <title>Null Values in Domains</title>
   <para>
-   A domain is a user-defined data type that can have a <literal>NOT NULL</literal> constraint.
-   However, some usages of domains will cause the resultant output column (not table column)
-   to have the domain type but the value will be null.
-   The common way this happens is by including the domain column's table on the right side of a left join.
-   <programlisting>
-    BEGIN;
-    CREATE DOMAIN domain_example AS integer NOT NULL;
-    CREATE TABLE domain_examples (de_id bigint PRIMARY KEY, de_value domain_example);
-    INSERT INTO domain_examples VALUES (1, 1), (2, 2);
-    SELECT *, pg_typeof(de_value)
-    FROM null_examples AS ne
-    LEFT JOIN domain_examples AS de ON ne.id = de.de_id;
-    ROLLBACK;
-   </programlisting>
-   <screen>
-    BEGIN
-    CREATE DOMAIN
-    CREATE TABLE
-    INSERT 0 2
-     id | value | de_id | de_value |   pg_typeof
-    ----+-------+-------+----------+----------------
-      1 |     1 |     1 |        1 | domain_example
-      2 |       |     2 |        2 | domain_example
-      3 |     4 |       |          | domain_example
+   A domain is a user-defined data type that can have a <literal>NOT NULL</literal>
+   constraint.  However, some usages of domains can still cause a column to be of the
+   domain type but some value may be null.  The common way this happens is by including
+   the domain column's table on the right side of a left join.
+<programlisting>
+BEGIN;
+CREATE DOMAIN domain_example AS integer NOT NULL;
+CREATE TABLE domain_examples (de_id bigint PRIMARY KEY, de_value domain_example);
+INSERT INTO domain_examples VALUES (1, 1), (2, 2);
+SELECT *, pg_typeof(de_value)
+FROM null_examples AS ne
+LEFT JOIN domain_examples AS de ON ne.id = de.de_id;
+ROLLBACK;
+</programlisting>
+<screen>
+BEGIN
+CREATE DOMAIN
+CREATE TABLE
+INSERT 0 2
+ id | value | de_id | de_value |   pg_typeof
+----+-------+-------+----------+----------------
+  1 |     1 |     1 |        1 | domain_example
+  2 |    \N |     2 |        2 | domain_example
+  3 |     4 |    \N |       \N | domain_example
 
-    ROLLBACK
-   </screen>
+ROLLBACK
+</screen>
    Please see the details in <xref linkend="sql-createdomain-notes"/>
-   for another example, as well as commentary why this non-standard behavior exists.
+   for another example, as well as commentary on why this non-standard behavior exists.
   </para>
  </sect2>
 
@@ -421,18 +442,18 @@
   <para>
    Arrays and composite types are multi-element types.  Here we also consider non-empty
    <link linkend="functions-subquery">subquery results</link>
-   and the list of values specified in the
+   and the list of values (i.e., the multiset) specified in the
    <link linkend="functions-comparisons-in-scalar">IN test</link>.
   </para>
   <para>
    When a test is performed on one of these multi-element values
-   the system will iterate over each element, or pair of elements if the test is
-   <link linkend="row-wise-comparison">comparing two row constructors</link> to each other,
+   the system will iterate over each element, (or pair of elements if the test is
+   <link linkend="row-wise-comparison">comparing two row constructors</link> to each other),
    left-to-right, combining the results using the boolean operations described in
    <xref linkend="nullvalues-operands"/>. For tests that
    require an exhaustive search, (e.g., <literal>ALL</literal>, <literal>NOT IN</literal>)
    the search effectively ends when a false result is found (<literal>AND</literal> combiners).
-   For tests that simply require a true result, (e.g., <literal>ANY</literal>,
+   For tests that require a true result, (e.g., <literal>ANY</literal>,
    <literal>IN</literal>) the search effectively ends when a true result is found
    (<literal>OR</literal> combiners). Therefore:
    <simplelist>
@@ -462,7 +483,7 @@
    when the composite has a mix of null and non-null values.
   </para>
   <para>
-   In the next section the rules above are discussed.
+   In the next section, the rules above are discussed.
    <xref linkend="nullvalues-multielementpredicates"/>
    discusses situations where a predicate or a scalar value
    are being compared to a multi-element value.
@@ -478,103 +499,104 @@
   <sect3 id="nullvalues-multielementpredicates-composites">
    <title>Composite Fields</title>
    <para>
-    When a composite typed valued is created a null value can be assigned to any
+    When a composite typed value is created, a null value can be assigned to any
     of its fields (see <xref linkend="rowtypes-constructing"/> for how to do this).
     So long as at least one field is non-null the composite value
-    as whole exists and an <literal>IS NULL</literal> predicate will return false.
+    as a whole exists and an <literal>IS NULL</literal> predicate will return false.
    </para>
    <para>
     Applying the <literal>IS NOT NULL</literal> predicate to a composite value performs
-    checks whether all fields of the composite have non-null values.  This is not the same
+    checks on whether all fields of the composite have non-null values.  This is not the same
     as a non-null composite value.  Specifically, if the composite value has
     a null-valued field then both the <literal>IS NOT NULL</literal> predicate and the
     <literal>IS NULL</literal> predicate will return false.
-    <programlisting>
-     SELECT
-      ROW(1,2) IS NULL AS "Row Is Null",
-      ROW(1,2) IS NOT NULL AS "Row Is Not Null",
-      ROW(1,NULL) IS NULL AS "Row Is Null",
-      ROW(1,NULL) IS NOT NULL AS "Row Is Not Null";
-    </programlisting>
-    <screen>
-      Row Is Null | Row Is Not Null | Row Is Null | Row Is Not Null
-     -------------+-----------------+-------------+-----------------
-      f           | t               | f           | f
-    </screen>
+<programlisting>
+SELECT
+ ROW(1,2) IS NULL AS "Row Is Null",
+ ROW(1,2) IS NOT NULL AS "Row Is Not Null",
+ ROW(1,NULL) IS NULL AS "Row Is Null",
+ ROW(1,NULL) IS NOT NULL AS "Row Is Not Null";
+</programlisting>
+<screen>
+ Row Is Null | Row Is Not Null | Row Is Null | Row Is Not Null
+-------------+-----------------+-------------+-----------------
+ false       | true            | false       | false
+</screen>
    </para>
    <para>
     Please read <xref linkend="composite-type-comparison"/> for a complete treatment
     on how <productname>PostgreSQL</productname> handles row-wise comparison.  The
-    next two multi-element related items in this subsection discuss those comparisons in the
+    next two multi-element related items in this section discuss those comparisons in the
     presence of null-valued fields, and also in terms of the SQL standard.
    </para>
   </sect3>
   <sect3 id="nullvalues-multielementpredicates-arrays">
-   <title>Array Elements and IN Bag Members</title>
+   <title>Array Elements and IN Multiset Members</title>
    <para>
     Examples of applying the behavior discussed in <xref linkend="nullvalues-multielement"/>
-    to arrays, and <literal>IN</literal> and <literal>NOT IN</literal> bags, using the
+    to arrays, and <literal>IN</literal> and <literal>NOT IN</literal> multisets, using the
     operators defined in <xref linkend="functions-comparisons"/>.  The following examples produce
     the same results when swapping <literal>IN</literal>/<literal>ANY</literal>
-    and also <literal>NOT IN</literal>/<literal>ALL</literal>, plus transforming the bag/array format.
+    and also <literal>NOT IN</literal>/<literal>ALL</literal>, plus transforming the multiset/array format.
     I.e., the exhaustive and non-exhaustive pairs noted in <xref linkend="nullvalues-multielement"/>.
    </para>
    <para>
-    <programlisting>
-     SELECT
-      1 = ANY(array[1, 1, NULL]) AS "Any-Null-Match",
-      1 = ANY(array[1, 1]) AS "Any-NoNull-Match",
-      1 = ALL(array[1, 1, NULL]) AS "ALL-Null-Match",
-      1 = ALL(array[1, 1]) AS "All-NoNull-Match";
-     SELECT
-      2 IN (1, 1, NULL) AS "IN-Null-Negative",
-      2 IN (1, 1) AS "IN-NoNull-Negative",
-      2 NOT IN (2, 2, NULL) AS "NotIN-Null-Negative",
-      2 NOT IN (2, 2) AS "NotIN-NoNull-Negative";
-    </programlisting>
-    <screen>
-      Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
-     ----------------+------------------+----------------+------------------
-      t              | t                |                | t
+<programlisting>
+SELECT
+ 1 = ANY(array[1, 1, NULL]) AS "Any-Null-Match",
+ 1 = ANY(array[1, 1]) AS "Any-NoNull-Match",
+ 1 = ALL(array[1, 1, NULL]) AS "ALL-Null-Match",
+ 1 = ALL(array[1, 1]) AS "All-NoNull-Match";
+SELECT
+ 2 IN (1, 1, NULL) AS "IN-Null-Negative",
+ 2 IN (1, 1) AS "IN-NoNull-Negative",
+ 2 NOT IN (2, 2, NULL) AS "NotIN-Null-Negative",
+ 2 NOT IN (2, 2) AS "NotIN-NoNull-Negative";
+</programlisting>
+<screen>
+ Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+----------------+------------------+----------------+------------------
+ true           | true             | \N             | true
 
-      IN-Null-Negative | IN-NoNull-Negative | NotIN-Null-Negative | NotIN-NoNull-Negative
-     ------------------+--------------------+---------------------+-----------------------
-                       | f                  | f                   | f
-    </screen>
+ IN-Null-Negative | IN-NoNull-Negative | NotIN-Null-Negative | NotIN-NoNull-Negative
+------------------+--------------------+---------------------+-----------------------
+ \N               | false              | false               | false
+</screen>
    </para>
   </sect3>
   <sect3 id="nullvalues-multielementpredicates-subqueries">
    <title>Single-Column Subquery Rows</title>
    <para>
-    Examples of applying the behavior discussed in <xref linkend="nullvalues-multielement"/>
-    to subqueries using the operators defined in <xref linkend="functions-subquery"/>.  Here we
-    covers the case were the multiple elements being checked are rows, each having one column.
+    The following examples demonstrate the behavior discussed in
+    <xref linkend="nullvalues-multielement"/>
+    applied to subqueries using the operators defined in <xref linkend="functions-subquery"/>.
+    Here we cover the case where the multiple elements being checked are rows, each having one column.
     If the column itself is multi-element then the thing being searched for must be a compatible
     multi-element value, and the corresponding comparison behavior described in
     <xref linkend="nullvalues-multielementcomparison"/> will also be applied.
    </para>
    <para>
-    <programlisting>
-     SELECT
-      1 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-Match",
-      1 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-Match",
-      1 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-Match",
-      1 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-Match";
-     SELECT
-      2 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-NoMatch",
-      2 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-NoMatch",
-      2 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-NoMatch",
-      2 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-NoMatch";
-    </programlisting>
-    <screen>
-      Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
-     ----------------+------------------+----------------+------------------
-      t              | t                |                | t
+<programlisting>
+SELECT
+ 1 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-Match",
+ 1 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-Match",
+ 1 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-Match",
+ 1 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-Match";
+SELECT
+ 2 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-NoMatch",
+ 2 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-NoMatch",
+ 2 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-NoMatch",
+ 2 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-NoMatch";
+</programlisting>
+<screen>
+ Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+----------------+------------------+----------------+------------------
+ true           | true             | \N             | true
 
-      Any-Null-NoMatch | Any-NoNull-NoMatch | ALL-Null-NoMatch | All-NoNull-NoMatch
-     ------------------+--------------------+------------------+--------------------
-                       | f                  | f                | f
-    </screen>
+ Any-Null-NoMatch | Any-NoNull-NoMatch | ALL-Null-NoMatch | All-NoNull-NoMatch
+------------------+--------------------+------------------+--------------------
+ \N               | false              | false            | false
+</screen>
    </para>
   </sect3>
  </sect2>
@@ -582,9 +604,9 @@
  <sect2 id="nullvalues-multielementcomparison">
   <title>Multi-Element Comparisons</title>
   <para>
-   The previous subsection, <xref linkend="nullvalues-multielementpredicates"/>, discussed applying
+   The previous section, <xref linkend="nullvalues-multielementpredicates"/>, discussed applying
    a predicate or a scalar value check element-wise across a multi-element value.
-   This subsection moves the discussion over to comparing two multi-element values to each other.
+   This section moves the discussion over to comparing two multi-element values to each other.
    As both array and composite typed values
    can be stored within an index, and comparing two values in that context must not produce
    a null-valued result, considerations are made to adhere to the SQL standard where
@@ -599,67 +621,67 @@
    the fact that row constructors are query literals, while composite typed values can be stored,
    brings about important differences in how they are treated.  Please read
    <xref linkend="composite-type-comparison"/> for a fuller treatment of this topic.  Here
-   we briefly recap the five different situations in the presence of null values.
+   we briefly recap the five situations in the presence of null values.
   </para>
   <sect3 id="nullvalues-multielementcomparison-array">
    <title>Element-wise Comparisons</title>
    <para>
-    First situation, null values within an array compare as equal to each other and greater than all
-    non-null values, regardless of whether the comparison involves
-    <link linkend="sql-syntax-array-constructors">array constructors</link> or array typed values.
-    <programlisting>
-     SELECT
-      array[1,2]=array[1,null] AS "Constructors",
-      s, t,
-      s = t AS "Stored Equality",
-      t &gt; s AS "Stored Ordering"
-     FROM
-     (values (array[1,2])) AS sv (s),
-     (values (array[1,null::integer])) AS st (t);
-    </programlisting>
-    <screen>
-      Constructors |   s   |    t     | Stored Equality | Stored Ordering
-     --------------+-------+----------+-----------------+-----------------
-      f            | {1,2} | {1,NULL} | f               | t
-    </screen>
+    In this first situation, null values within an array compare as equal to each other and greater
+    than all non-null values, regardless of whether the comparison involves
+    <link linkend="sql-syntax-array-constructors">array constructors</link> or array-typed values.
+<programlisting>
+SELECT
+ array[1,2]=array[1,null] AS "Constructors",
+ s, t,
+ s = t AS "Stored Equality",
+ t &gt; s AS "Stored Ordering"
+FROM
+(values (array[1,2])) AS sv (s),
+(values (array[1,null::integer])) AS st (t);
+</programlisting>
+<screen>
+ Constructors |   s   |    t     | Stored Equality | Stored Ordering
+--------------+-------+----------+-----------------+-----------------
+ false        | {1,2} | {1,NULL} | false           | true
+</screen>
    </para>
   </sect3>
   <sect3 id="nullvalues-multielementcomparison-rowconstructor">
    <title>Row-wise Mutual Row Constructor Comparisons</title>
    <para>
-    In this situation null values produce unknown when compared to all values.
-    <programlisting>
-     SELECT
-      (1,2)=(1,null) AS "NonNull=Null",
-      (1,null::integer)=(1,null) AS "Null=Null";
-    </programlisting>
-    <screen>
-      NonNull=Null | Null=Null
-     --------------+-----------
-                   |
-    </screen>
+    In this situation, null values produce unknown when compared to all values.
+<programlisting>
+SELECT
+ (1,2)=(1,null) AS "NonNull=Null",
+ (1,null::integer)=(1,null) AS "Null=Null";
+</programlisting>
+<screen>
+ NonNull=Null | Null=Null
+--------------+-----------
+ \N           | \N
+</screen>
    </para>
   </sect3>
   <sect3 id="nullvalues-multielementcomparison-composite">
    <title>Row-wise Composite Involved Comparisons</title>
    <para>
-    In these three situations null values are considered equal to each other and greater than
-    all non-null value.
+    In these three situations, null values are considered equal to each other and greater than
+    all non-null valueS.
    </para>
-   <programlisting>
-    SELECT s, t,
-     s = t AS "Stored Equals Stored",
-     t &lt; (1,2) AS "Stored LT Constructor",
-     t = (1,null::integer) AS "Stored Equals Constructor"
-    FROM
-     (values (1,2)) AS s,
-     (values (1,null::integer)) AS t;
-   </programlisting>
-   <screen>
-       s   |  t   | Stored Equals Stored | Stored LT Constructor | Stored Equals Constructor
-    -------+------+----------------------+-----------------------+---------------------------
-     (1,2) | (1,) | f                    | f                     | t
-   </screen>
+<programlisting>
+SELECT s, t,
+ s = t AS "Stored Equals Stored",
+ t &lt; (1,2) AS "Stored LT Constructor",
+ t = (1,null::integer) AS "Stored Equals Constructor"
+FROM
+ (values (1,2)) AS s,
+ (values (1,null::integer)) AS t;
+</programlisting>
+<screen>
+   s   |  t   | Stored Equals Stored | Stored LT Constructor | Stored Equals Constructor
+-------+------+----------------------+-----------------------+---------------------------
+ (1,2) | (1,) | false                | false                 | true
+</screen>
   </sect3>
   <sect3 id="nullvalues-multielementcomparison-sqlconformance">
    <title>SQL Standard Conformance</title>
@@ -687,24 +709,24 @@
    Most functions, especially single argument functions, are defined with strict because without
    non-null values to act upon they cannot produce a meaningful result.  However, for multi-argument
    functions, especially <link linkend="xfunc-sql-variadic-functions">variadic functions</link>
-   like concatenate, null values often are simply ignored.
+   like concatenate, null values often are ignored.
    This can be different than the choice made by a binary operator performing the same function,
    like for concatenating text, but not always, like concatenating an element onto an array.
-   <programlisting>
-    SELECT
-     lower(null::text) AS "Lower",
-     left('text', null) AS "Left",
-     'one' || null AS "|| Text Op",
-     concat('one', null) AS "concat Text Func",
-     array_append(array[1], null) AS "append([], null)",
-     array[1]::integer[] || null::integer AS "[] || null",
-     array[1]::integer[] || null::integer[] AS "[] || null[]";
-   </programlisting>
-   <screen>
-     Lower | Left | || Text Op | concat Text Func | append([], null) | [] || null | [] || null[]
-    -------+------+------------+------------------+------------------+------------+--------------
-           |      |            | one              | {1,NULL}         | {1,NULL}   | {1}
-   </screen>
+<programlisting>
+SELECT
+ lower(null::text) AS "Lower",
+ left('text', null) AS "Left",
+ 'one' || null AS "|| Text Op",
+ concat('one', null) AS "concat Text Func",
+ array_append(array[1], null) AS "append([], null)",
+ array[1]::integer[] || null::integer AS "[] || null",
+ array[1]::integer[] || null::integer[] AS "[] || null[]";
+</programlisting>
+<screen>
+ Lower | Left | || Text Op | concat Text Func | append([], null) | [] || null | [] || null[]
+-------+------+------------+------------------+------------------+------------+--------------
+ \N    | \N   | \N         | one              | {1,NULL}         | {1,NULL}   | {1}
+</screen>
    In short, please read the documentation for the functions you use if they may receive null inputs
    to understand how they will behave.  Send a documentation comment pointing out any functions
    that do not behave strictly but whose actual behavior in the presence of null-valued input
@@ -719,22 +741,22 @@
    (which may be initialized to a non-null value, e.g., 0 for the count function)
    will remain unchanged even if the underlying processing
    function returns a null value, whether from being defined strict
-   or it simply returns a null value upon execution.  The aggregation
+   or it returns a null value upon execution.  The aggregation
    routine will usually ignore the null value and continue processing,
    as demonstrated in <literal>count(value)</literal> below.
-   <programlisting>
-    SELECT
-     count(*) AS "Count",
-     count(value) AS "Count Value",
-     count(null_examples) AS "Count Composite",
-     count(row(value, value)) AS "Count Row"
-    FROM null_examples;
-   </programlisting>
-   <screen>
-     Count | Count Value | Count Composite | Count Row
-    -------+-------------+-----------------+-----------
-         3 |           2 |               3 |         3
-   </screen>
+<programlisting>
+SELECT
+ count(*) AS "Count",
+ count(value) AS "Count Value",
+ count(null_examples) AS "Count Composite",
+ count(row(value, value)) AS "Count Row"
+FROM null_examples;
+</programlisting>
+<screen>
+ Count | Count Value | Count Composite | Count Row
+-------+-------------+-----------------+-----------
+     3 |           2 |               3 |         3
+</screen>
    Notice the "Count Row" outcome, though.  While we noted in the cardinal warning
    that a composite whose fields are all null values is indistinguishable from
    a null value of composite type, the count aggregate does indeed distinguish them,
@@ -748,24 +770,35 @@
   <title>Null Values When Filtering</title>
   <para>
    A <literal>WHERE</literal> clause that evaluates to a null value for a given row will exclude that row.
-   <programlisting>
-    SELECT id, value AS "Equals 1"
-    FROM null_examples
-    WHERE value = 1;
+   Note below that, due to tri-valued logic described in <xref linkend="nullvalues-cardinalrule"/>,
+   the row with an id of 2 is not included in either of the first two results.  The third result, using
+   <literal>IS NULL</literal>, finds that row.
+<programlisting>
+SELECT id, value AS "Equals 1"
+FROM null_examples
+WHERE value = 1;
+
+SELECT id, value AS "Not Equal to 1"
+FROM null_examples
+WHERE value != 1;
+
+SELECT id, value AS "IS NULL"
+FROM null_examples
+WHERE value IS NULL;
+</programlisting>
+<screen>
+ id | Equals 1
+----+----------
+  1 |        1
 
-    SELECT id, value AS "Not Equal to 1"
-    FROM null_examples
-    WHERE value != 1;
-   </programlisting>
-   <screen>
-     id | Equals 1
-    ----+----------
-      1 |        1
+ id | Not Equal to 1
+----+----------------
+  3 |              4
 
-     id | Not Equal to 1
-    ----+----------------
-      3 |              4
-   </screen>
+ id | IS NULL
+----+---------
+  2 |      \N
+</screen>
   </para>
  </sect2>
 
@@ -778,31 +811,28 @@
    While this seems like it would behave the same as a where clause, the choice here,
    when an expression evaluates to a null value, is to allow the row to be inserted
    - the same as a true result.
-   <programlisting>
-    BEGIN;
-    ALTER TABLE null_examples ADD CONSTRAINT value_not_1 CHECK (value != 1);
-    ROLLBACK;
-   </programlisting>
-   <screen>
-    BEGIN
-    ERROR:  check constraint "value_not_1" of relation "null_examples" is violated by some row
-    ROLLBACK
-   </screen>
-   <programlisting>
-    BEGIN;
-    ALTER TABLE null_examples ADD CONSTRAINT value_not_10 CHECK (value != 10);
-    ROLLBACK;
-   </programlisting>
-   <screen>
-    BEGIN
-    ALTER TABLE
-    ROLLBACK
-   </screen>
-   We are using a transaction (begin and rollback) and the alter table command to add two
-   constraints to our null_examples table.  The first constraint prohibits rows with a value
-   of 1, which our row with an id of 1 violates.  Prohibiting the value 10 definitely allows
-   rows with ids 1 and 3 to exist, and since we are not told that some row violates our
-   constraint the null value in the row with id 2 is being accepted as well.
+<programlisting>
+BEGIN;
+ALTER TABLE null_examples ADD CONSTRAINT value_not_1 CHECK (value != 1);
+ROLLBACK;
+</programlisting>
+<screen>
+ERROR:  check constraint "value_not_1" of relation "null_examples" is violated by some row
+</screen>
+<programlisting>
+BEGIN;
+ALTER TABLE null_examples ADD CONSTRAINT value_not_10 CHECK (value != 10);
+ROLLBACK;
+</programlisting>
+<screen>
+ALTER TABLE
+</screen>
+   We are using a transaction (<command>BEGIN</command> and <command>ROLLBACK</command>) and
+   the <command>ALTER TABLE</command> command to add two constraints to our null_examples table.
+   The first constraint prohibits rows with a value of 1, which our row with an id of 1 violates.
+   Prohibiting the value 10 definitely allows rows with ids 1 and 3 to exist, and since we are
+   not told that some row violates our constraint the null value in the row with id 2 is being
+   accepted as well.
   </para>
   <para>
    The <link linkend="ddl-constraints-not-null"><literal>NOT NULL</literal> column constraint</link>
@@ -819,35 +849,35 @@
    other values.  These features use <link linkend="nullvalues-cardinalrule">distinctness</link>
    instead of simple equality in order to handle a null value like a definite value equal to
    another null value and unequal to all other values.
-   <programlisting>
-    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
-    SELECT
-     value,
-     count(*) AS "Count"
-    FROM vals
-    GROUP BY value
-    ORDER BY value;
-   </programlisting>
-   <screen>
-     value | Count
-    -------+-------
-         1 |     2
-         2 |     1
-           |     2
-   </screen>
-   <programlisting>
-    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
-    SELECT DISTINCT value
-    FROM vals
-    ORDER BY value NULLS FIRST;
-   </programlisting>
-   <screen>
-     value
-    -------
-
-         1
-         2
-   </screen>
+<programlisting>
+WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+SELECT
+ value,
+ count(*) AS "Count"
+FROM vals
+GROUP BY value
+ORDER BY value;
+</programlisting>
+<screen>
+ value | Count
+-------+-------
+     1 |     2
+     2 |     1
+    \N |     2
+</screen>
+<programlisting>
+WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+SELECT DISTINCT value
+FROM vals
+ORDER BY value NULLS FIRST;
+</programlisting>
+<screen>
+ value
+-------
+    \N
+     1
+     2
+</screen>
   </para>
  </sect2>
 
@@ -859,25 +889,25 @@
    present null values before or after all non-null values.  To handle
    this, the <literal>ORDER BY</literal> clause will let you specify either
    <literal>NULLS FIRST</literal> or <literal>NULLS LAST</literal>.
-   <programlisting>
-    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
-    SELECT value FROM vals
-    ORDER BY value DESC NULLS FIRST;
-   </programlisting>
-   <screen>
-     value
-    -------
-
-
-         2
-         1
-         1
-   </screen>
+<programlisting>
+WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+SELECT value FROM vals
+ORDER BY value DESC NULLS FIRST;
+</programlisting>
+<screen>
+ value
+-------
+    \N
+    \N
+     2
+     1
+     1
+</screen>
   </para>
   <para>
    Note that when dealing with multi-element values the comparison behavior described in
-   <xref linkend="nullvalues-multielementcomparison"/> applies,
-   if the comparison determination rests upon comparing a null value to a non-null value
+   <xref linkend="nullvalues-multielementcomparison"/> applies:
+   if the comparison determination rests upon comparing a null value to a non-null value,
    the multi-element value with the null-valued component will sort greater than the one
    with a non-null component.
   </para>
@@ -894,33 +924,29 @@
    values are equal to each other.  This setting applies to all columns in the index.
   </para>
   <para>
-   <programlisting>
-    BEGIN;
-    CREATE UNIQUE INDEX value_nulls_distinct_implicit ON null_examples (value);
-    CREATE UNIQUE INDEX value_nulls_distinct_explicit ON null_examples (value) NULLS DISTINCT;
-    INSERT INTO null_examples VALUES (4, NULL);
-    ROLLBACK;
-   </programlisting>
-   <screen>
-    BEGIN
-    CREATE INDEX
-    CREATE INDEX
-    INSERT 0 1
-    ROLLBACK
-   </screen>
-   <programlisting>
-    BEGIN;
-    CREATE UNIQUE INDEX value_nulls_not_distinct_explicit ON null_examples (value) NULLS NOT DISTINCT;
-    INSERT INTO null_examples VALUES (4, NULL);
-    ROLLBACK;
-   </programlisting>
-   <screen>
-    BEGIN
-    CREATE INDEX
-    ERROR:  duplicate key value violates unique constraint "value_nulls_not_distinct_explicit"
-    DETAIL:  Key (value)=(null) already exists.
-    ROLLBACK
-   </screen>
+<programlisting>
+BEGIN;
+CREATE UNIQUE INDEX value_nulls_distinct_implicit ON null_examples (value);
+CREATE UNIQUE INDEX value_nulls_distinct_explicit ON null_examples (value) NULLS DISTINCT;
+INSERT INTO null_examples VALUES (4, NULL);
+ROLLBACK;
+</programlisting>
+<screen>
+CREATE INDEX
+CREATE INDEX
+INSERT 0 1
+</screen>
+<programlisting>
+BEGIN;
+CREATE UNIQUE INDEX value_nulls_not_distinct_explicit ON null_examples (value) NULLS NOT DISTINCT;
+INSERT INTO null_examples VALUES (4, NULL);
+ROLLBACK;
+</programlisting>
+<screen>
+CREATE INDEX
+ERROR:  duplicate key value violates unique constraint "value_nulls_not_distinct_explicit"
+DETAIL:  Key (value)=(null) already exists.
+</screen>
   </para>
   <para>
    For ordering, each column in the index gets its own specification of
@@ -939,13 +965,13 @@
  <sect2 id="nullvalues-partitionkeys">
   <title>Null Values in Partition Keys</title>
   <para>
-   Presently, PostgreSQL requires that all the columns of a partition key be included
-   in the primary key.  Furthermore, all columns used in a primary key have a not-null
-   column constraint applied to them.  Therefore, any partitioned table with a primary key
-   will only have non-null values in the partition key columns.
+   Presently, <productname>PostgreSQL</productname> requires that all the columns of a
+   partition key be included in the primary key.  Furthermore, all columns used in a primary
+   key must have a not-null column constraint applied to them.  Therefore, any partitioned table
+   with a primary key will only have non-null values in the partition key columns.
   </para>
   <para>
-   However, should you setup a situation where a partition key column can both: have a null value
+   However, should you set up a situation where a partition key column can both: have a null value
    and, null values in that key go to a specific partition, list-based routing will work as expected.
    There is presently no way to direct rows having null values in partition keys away from the
    default partition for range and hash partitioning.
@@ -955,44 +981,62 @@
  <sect2 id="nullvalues-settings">
   <title>Null-Valued Settings</title>
   <para>
-   There are none.  During initialization all settings are assigned a non-null value.
+   The value of a setting known to the system will never be null.  There is a bit of confusion
+   because the <function>current_setting</function> function has an operating mode where instead
+   of provoking an error when retrieving the value of a setting not known to the system it will
+   instead return a null value.  This null value should not be considered the value of the setting
+   but an error indicator.
+<programlisting>
+SELECT current_setting('example.string', false);
+SELECT current_setting('example.string', true);
+</programlisting>
+<screen>
+unrecognized configuration parameter "example.string"
+ current_setting
+-----------------
+ \N
+</screen>
+   The next paragraph discusses the corner case behavior when this
+   suggestion is not heeded.
   </para>
   <para>
-   This is mostly meaningful for <link linkend="runtime-config-custom">custom settings</link>,
-   thus this subsection focuses on <link linkend="config-setting-sql">SQL interaction</link>.
+   The corner case mentioned above is only meaningful for
+   <link linkend="runtime-config-custom">custom settings</link>,
+   thus this section focuses on <link linkend="config-setting-sql">SQL interaction</link>.
    Unlike settings created by extensions, custom settings can only be textual and the default
    value for text here is the empty string.
-   <programlisting>
-    SHOW example.string;
-    BEGIN;
-    SELECT set_config('example.string', NULL, true);
-    SELECT current_setting('example.string') IS NULL AS "Setting Is Null";
-    ROLLBACK;
-    SHOW example.string;
-    RESET example.string;
-    SHOW example.string;
-   </programlisting>
-   <screen>
-    ERROR:  unrecognized configuration parameter "example.string"
-    BEGIN
-     set_config
-    ------------
+<programlisting>
+-- The transaction markers are left here to emphasize the rollback behavior.
+SHOW example.string;
+BEGIN;
+SELECT set_config('example.string', NULL, true);
+SELECT current_setting('example.string') IS NULL AS "Setting Is Null";
+ROLLBACK;
+SHOW example.string;
+RESET example.string;
+SHOW example.string;
+</programlisting>
+<screen>
+ERROR:  unrecognized configuration parameter "example.string"
+BEGIN
+ set_config
+------------
 
 
-     Setting Is Null
-    -----------------
-     f
+ Setting Is Null
+-----------------
+ false
 
-    ROLLBACK
-     example.string
-    ----------------
+ROLLBACK
+ example.string
+----------------
 
 
-    RESET
-     example.string
-    ----------------
+RESET
+ example.string
+----------------
 
-   </screen>
+</screen>
    Notice two important behaviors: first, even though we passed in a null value to
    the <literal>set_config</literal> function, the <literal>current_setting</literal>
    function returned a non-null value, specifically the empty string.  Second, after ROLLBACK the
@@ -1001,8 +1045,8 @@
    (i.e., RESET does not restore the non-existence state.)
   </para>
   <para>
-    The other ways to specify settings do not have a means to specify null values,
-    a specific non-null value is required as part of the specification of the setting.
+    The other ways to specify settings do allow for null values;
+    a specific non-null value is required as part of the setting specification.
    </para>
  </sect2>
 
@@ -1010,60 +1054,71 @@
   <title>Null Values in JSON</title>
   <para>
    As noted in <xref linkend="json-type-mapping-table"/>, the JSON specification's
-   null value is assigned its own type unlike in SQL.  This introduces an inconsistency
-   since the JSON null type's value is itself non-null.  It is also comparable to any
-   other JSON type, returning false for equality, and itself, returning true for equality.
-   But an SQL value of json or jsonb type having a JSON null value is considered non-null in SQL.
-   <programlisting>
-    SELECT 'null'::json IS NULL AS "JSON null is NULL";
-   </programlisting>
-   <screen>
-     JSON null is NULL
-    -------------------
-     f
-   </screen>
+   null value is assigned its own type having a single constant value which can be
+   compared to all other JSON types with the expected non-null boolean result.
+   A consequence of this definition is that an SQL json or jsonb type containing
+   a JSON null value is seen as non-null in SQL.
+   (Note, while in SQL the capitalization of NULL is unimportant -
+   all-caps is just convention - JSON requires lowercase.)
+<programlisting>
+SELECT 'null'::json IS NULL AS "JSON null is NULL";
+</programlisting>
+<screen>
+ JSON null is NULL
+-------------------
+ false
+</screen>
    Additionally, the SQL operators and functions involving JSON key or array element selection,
    or construction from literals, require that a valid number or text value be supplied as an operand
    and so an SQL null value cannot be targeted by those operators and functions.
-   <programlisting>
-    SELECT to_json(null::text);
-   </programlisting>
-   <screen>
-     to_json
-    ---------
-
-   </screen>
+<programlisting>
+ SELECT to_json(null::text);
+</programlisting>
+<screen>
+ to_json
+---------
+ \N
+</screen>
    That all said, the system will convert an SQL null value to a JSON null value when in a
    composite type context.
-   <programlisting>
-    SELECT json_build_object('value', value)
-    FROM null_examples;
-   </programlisting>
-   <screen>
-     json_build_object
-    -------------------
-     {"value" : 1}
-     {"value" : null}
-     {"value" : 4}
-   </screen>
+<programlisting>
+SELECT json_build_object('value', value)
+FROM null_examples;
+</programlisting>
+<screen>
+ json_build_object
+-------------------
+ {"value" : 1}
+ {"value" : null}
+ {"value" : 4}
+</screen>
    And vice versa.
-   <programlisting>
-    SELECT *
-    FROM jsonb_to_recordset('[{"value":1},{"value":null},{"value":4}]'::jsonb) AS jtr (value integer);
-   </programlisting>
-   <screen>
-     value
-    -------
-         1
-
-         4
-   </screen>
+<programlisting>
+SELECT *
+FROM jsonb_to_recordset('[{"value":1},{"value":null},{"value":4}]'::jsonb) AS jtr (value integer);
+</programlisting>
+<screen>
+ value
+-------
+     1
+    \N
+     4
+</screen>
+   Or when a simple scalar JSON null is cast to an SQL type.
+<programlisting>
+SELECT 'null'::jsonb::numeric IS NULL AS "Cast jsonb NULL to SQL NULL";
+</programlisting>
+<screen>
+ Cast jsonb NULL to SQL NULL
+-----------------------------
+ true
+</screen>
   </para>
   <para>
    Aspects of null value handling within the internals of the JSON-related types are discussed
    in <xref linkend="datatype-json"/>,
    particularly in <xref linkend="datatype-jsonpath"/>.
-   This subsection is focused on how SQL null values are related to JSON null values.
+   This section is focused on how SQL null values are related to JSON null values.
   </para>
  </sect2>
 </sect1>
-- 
2.34.1

v7-0001-v6-Document-NULL.patchtext/x-patch; charset=US-ASCII; name=v7-0001-v6-Document-NULL.patchDownload
From d7966807449d565340eabc460cea5a3bc8a85685 Mon Sep 17 00:00:00 2001
From: "David G. Johnston" <David.G.Johnston@Gmail.com>
Date: Mon, 9 Dec 2024 09:41:07 -0700
Subject: [PATCH 1/2] v6 Document NULL

---
 doc/src/sgml/datatype.sgml          |    2 +-
 doc/src/sgml/ddl.sgml               |    2 +
 doc/src/sgml/filelist.sgml          |    1 +
 doc/src/sgml/func.sgml              |  273 +++----
 doc/src/sgml/json.sgml              |    7 +-
 doc/src/sgml/nullvalues.sgml        | 1069 +++++++++++++++++++++++++++
 doc/src/sgml/ref/create_domain.sgml |    7 +-
 doc/src/sgml/syntax.sgml            |   23 +-
 8 files changed, 1224 insertions(+), 160 deletions(-)
 create mode 100644 doc/src/sgml/nullvalues.sgml

diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml
index 87679dc4a1..e90c380af4 100644
--- a/doc/src/sgml/datatype.sgml
+++ b/doc/src/sgml/datatype.sgml
@@ -5380,7 +5380,7 @@ WHERE ...
        <row>
         <entry><type>unknown</type></entry>
         <entry>Identifies a not-yet-resolved type, e.g., of an undecorated
-         string literal.</entry>
+         string literal.  Also, the <link linkend="nullvalues-usage">null value.</link></entry>
        </row>
       </tbody>
      </tgroup>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index ae156b6b1c..728bfdd56b 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -168,6 +168,8 @@ DROP TABLE products;
   </para>
  </sect1>
 
+ &nullvalues;
+
  <sect1 id="ddl-default">
   <title>Default Values</title>
 
diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml
index 25fb99cee6..f28a69e993 100644
--- a/doc/src/sgml/filelist.sgml
+++ b/doc/src/sgml/filelist.sgml
@@ -21,6 +21,7 @@
 <!ENTITY indices    SYSTEM "indices.sgml">
 <!ENTITY json       SYSTEM "json.sgml">
 <!ENTITY mvcc       SYSTEM "mvcc.sgml">
+<!ENTITY nullvalues SYSTEM "nullvalues.sgml">
 <!ENTITY parallel   SYSTEM "parallel.sgml">
 <!ENTITY perform    SYSTEM "perform.sgml">
 <!ENTITY queries    SYSTEM "queries.sgml">
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 7f51f02d1d..935ce3de2a 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -23565,7 +23565,8 @@ MERGE INTO products p
    This section describes the <acronym>SQL</acronym>-compliant subquery
    expressions available in <productname>PostgreSQL</productname>.
    All of the expression forms documented in this section return
-   Boolean (true/false) results.
+   <link linkend="nullvalues">three-valued</link> typed
+   results (true, false, or null).
   </para>
 
   <sect2 id="functions-subquery-exists">
@@ -23627,19 +23628,17 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>IN</token>
+   is <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result.
-   The result of <token>IN</token> is <quote>true</quote> if any equal subquery row is found.
-   The result is <quote>false</quote> if no equal row is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any equal subquery row is found.
+   The result is <quote>false</quote> if no equal row is found.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>IN</token> construct will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.
   </para>
 
   <para>
@@ -23656,21 +23655,18 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.
+   The result of <token>IN</token> is <quote>false</quote> if the subquery returns no rows,
+   otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result.
-   The result of <token>IN</token> is <quote>true</quote> if any equal subquery row is found.
-   The result is <quote>false</quote> if no equal row is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any equal subquery row is found.
+   The result is <quote>false</quote> if no equal row is found.
   </para>
 
   <para>
-   As usual, null values in the rows are combined per
-   the normal rules of SQL Boolean expressions.  Two rows are considered
-   equal if all their corresponding members are non-null and equal; the rows
-   are unequal if any corresponding members are non-null and unequal;
-   otherwise the result of that row comparison is unknown (null).
-   If all the per-row results are either unequal or null, with at least one
-   null, then the result of <token>IN</token> is null.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -23682,20 +23678,17 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 </synopsis>
 
   <para>
-   The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
-   is evaluated and compared to each row of the subquery result.
-   The result of <token>NOT IN</token> is <quote>true</quote> if only unequal subquery rows
-   are found (including the case where the subquery returns no rows).
+   The right-hand side is a parenthesized subquery, which must return exactly one column.
+   The result of <token>NOT IN</token> is <quote>true</quote> if the subquery returns no rows,
+   otherwise the left-hand expression is evaluated and compared to each row of the subquery result.
+   The result is <quote>true</quote> if only unequal subquery rows are found.
    The result is <quote>false</quote> if any equal row is found.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>NOT IN</token> construct will be null, not true.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
+   tests are OR'd together.
   </para>
 
   <para>
@@ -23712,21 +23705,18 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.
+   The result of <token>NOT IN</token> is <quote>true</quote> if the subquery returns no rows,
+   otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result.
-   The result of <token>NOT IN</token> is <quote>true</quote> if only unequal subquery rows
-   are found (including the case where the subquery returns no rows).
+   The result is <quote>true</quote> if only unequal subquery rows are found.
    The result is <quote>false</quote> if any equal row is found.
   </para>
 
   <para>
-   As usual, null values in the rows are combined per
-   the normal rules of SQL Boolean expressions.  Two rows are considered
-   equal if all their corresponding members are non-null and equal; the rows
-   are unequal if any corresponding members are non-null and unequal;
-   otherwise the result of that row comparison is unknown (null).
-   If all the per-row results are either unequal or null, with at least one
-   null, then the result of <token>NOT IN</token> is null.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -23740,13 +23730,13 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>ANY</token> is
+   <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ANY</token> is <quote>true</quote> if any true result is obtained.
-   The result is <quote>false</quote> if no true result is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any true result is obtained.
+   The result is <quote>false</quote> if no true result is found.
   </para>
 
   <para>
@@ -23755,11 +23745,10 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   </para>
 
   <para>
-   Note that if there are no successes and at least one right-hand row yields
-   null for the operator's result, the result of the <token>ANY</token> construct
-   will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -23777,16 +23766,19 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.  The result of <token>ANY</token> is
+   <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result,
    using the given <replaceable>operator</replaceable>.
-   The result of <token>ANY</token> is <quote>true</quote> if the comparison
-   returns true for any subquery row.
-   The result is <quote>false</quote> if the comparison returns false for every
-   subquery row (including the case where the subquery returns no
-   rows).
-   The result is NULL if no comparison with a subquery row returns true,
-   and at least one comparison returns NULL.
+   The result is <quote>true</quote> if the comparison returns true for any subquery row.
+   The result is <quote>false</quote> if the comparison returns false for every subquery row.
+  </para>
+
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are OR'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -23804,15 +23796,20 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>ALL</token> is
+   <quote>true</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ALL</token> is <quote>true</quote> if all rows yield true
-   (including the case where the subquery returns no rows).
+   The result is <quote>true</quote> if all rows yield true.
    The result is <quote>false</quote> if any false result is found.
-   The result is NULL if no comparison with a subquery row returns false,
-   and at least one comparison returns NULL.
+  </para>
+
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -23833,22 +23830,21 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.  The result of <token>ALL</token> is
+   <quote>true</quote> if the subquery returns no rows, otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result,
    using the given <replaceable>operator</replaceable>.
-   The result of <token>ALL</token> is <quote>true</quote> if the comparison
-   returns true for all subquery rows (including the
-   case where the subquery returns no rows).
-   The result is <quote>false</quote> if the comparison returns false for any
-   subquery row.
-   The result is NULL if no comparison with a subquery row returns false,
-   and at least one comparison returns NULL.
+   The result is <quote>true</quote> if the comparison returns true for all subquery rows.
+   The result is <quote>false</quote> if the comparison returns false for any subquery row.
   </para>
 
   <para>
-   See <xref linkend="row-wise-comparison"/> for details about the meaning
-   of a row constructor comparison.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
+
   </sect2>
 
   <sect2 id="functions-subquery-single-row-comp">
@@ -23873,6 +23869,14 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    compared row-wise to the single subquery result row.
   </para>
 
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, the result cannot be <quote>true</quote> in the
+   presence of null valued fields in either the row constructor or the subquery result row, as
+   the individual field tests are AND'd together.
+   Note that <literal>IS DISTINCT FROM</literal> is not an operator.
+  </para>
+
   <para>
    See <xref linkend="row-wise-comparison"/> for details about the meaning
    of a row constructor comparison.
@@ -23940,7 +23944,8 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    <productname>PostgreSQL</productname> extensions; the rest are
    <acronym>SQL</acronym>-compliant.
    All of the expression forms documented in this section return
-   Boolean (true/false) results.
+   <link linkend="nullvalues">three-valued</link> boolean typed
+   results (true, false, or null).
   </para>
 
   <sect2 id="functions-comparisons-in-scalar">
@@ -23953,24 +23958,13 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   <para>
    The right-hand side is a parenthesized list
    of expressions.  The result is <quote>true</quote> if the left-hand expression's
-   result is equal to any of the right-hand expressions.  This is a shorthand
-   notation for
-
-<synopsis>
-<replaceable>expression</replaceable> = <replaceable>value1</replaceable>
-OR
-<replaceable>expression</replaceable> = <replaceable>value2</replaceable>
-OR
-...
-</synopsis>
+   result is equal to any of the right-hand expressions.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand expression yields
-   null, the result of the <token>IN</token> construct will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence null values since the multiple equality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -23984,35 +23978,15 @@ OR
   <para>
    The right-hand side is a parenthesized list
    of expressions.  The result is <quote>true</quote> if the left-hand expression's
-   result is unequal to all of the right-hand expressions.  This is a shorthand
-   notation for
-
-<synopsis>
-<replaceable>expression</replaceable> &lt;&gt; <replaceable>value1</replaceable>
-AND
-<replaceable>expression</replaceable> &lt;&gt; <replaceable>value2</replaceable>
-AND
-...
-</synopsis>
+   result is unequal to all of the right-hand expressions.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand expression yields
-   null, the result of the <token>NOT IN</token> construct will be null, not true
-   as one might naively expect.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of null values since the multiple inequality
+   tests are OR'd together.
   </para>
 
-  <tip>
-  <para>
-   <literal>x NOT IN y</literal> is equivalent to <literal>NOT (x IN y)</literal> in all
-   cases.  However, null values are much more likely to trip up the novice when
-   working with <token>NOT IN</token> than when working with <token>IN</token>.
-   It is best to express your condition positively if possible.
-  </para>
-  </tip>
   </sect2>
 
   <sect2 id="functions-comparisons-any-some">
@@ -24025,30 +23999,26 @@ AND
 
   <para>
    The right-hand side is a parenthesized expression, which must yield an
-   array value.
-   The left-hand expression
+   array value. The result of <token>ANY</token> is
+   <quote>false</quote> if the array has zero element, otherwise
+   the left-hand expression
    is evaluated and compared to each element of the array using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ANY</token> is <quote>true</quote> if any true result is obtained.
-   The result is <quote>false</quote> if no true result is found (including the
-   case where the array has zero elements).
+   The result is <quote>true</quote> if any true result is obtained.
+   The result is <quote>false</quote> if no true result is found.
   </para>
 
   <para>
-   If the array expression yields a null array, the result of
-   <token>ANY</token> will be null.  If the left-hand expression yields null,
-   the result of <token>ANY</token> is ordinarily null (though a non-strict
-   comparison operator could possibly yield a different result).
-   Also, if the right-hand array contains any null elements and no true
-   comparison result is obtained, the result of <token>ANY</token>
-   will be null, not false (again, assuming a strict comparison operator).
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both elements and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
    <token>SOME</token> is a synonym for <token>ANY</token>.
+   <token>IN</token> is equivalent to <literal>= ANY</literal>.
   </para>
   </sect2>
 
@@ -24062,26 +24032,27 @@ AND
   <para>
    The right-hand side is a parenthesized expression, which must yield an
    array value.
-   The left-hand expression
+   The result of <token>ALL</token> is
+   <quote>true</quote> if the array has zero elements, otherwise
+   the left-hand expression
    is evaluated and compared to each element of the array using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ALL</token> is <quote>true</quote> if all comparisons yield true
-   (including the case where the array has zero elements).
+   The result is <quote>true</quote> if all comparisons yield true.
    The result is <quote>false</quote> if any false result is found.
   </para>
 
   <para>
-   If the array expression yields a null array, the result of
-   <token>ALL</token> will be null.  If the left-hand expression yields null,
-   the result of <token>ALL</token> is ordinarily null (though a non-strict
-   comparison operator could possibly yield a different result).
-   Also, if the right-hand array contains any null elements and no false
-   comparison result is obtained, the result of <token>ALL</token>
-   will be null, not true (again, assuming a strict comparison operator).
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both elements and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
+
+  <para>
+   <token>NOT IN</token> is equivalent to <literal>&lt;&gt; ALL</literal>.
+  </para>
+
   </sect2>
 
   <sect2 id="row-wise-comparison">
@@ -24132,6 +24103,11 @@ AND
    considered.
   </para>
 
+  <para>
+   See <xref linkend="nullvalues-multielementcomparison-rowconstructor"/>
+   and surrounding content for additional details and examples.
+  </para>
+
 <synopsis>
 <replaceable>row_constructor</replaceable> IS DISTINCT FROM <replaceable>row_constructor</replaceable>
 </synopsis>
@@ -24166,20 +24142,11 @@ AND
 </synopsis>
 
   <para>
-   The SQL specification requires row-wise comparison to return NULL if the
-   result depends on comparing two NULL values or a NULL and a non-NULL.
-   <productname>PostgreSQL</productname> does this only when comparing the
-   results of two row constructors (as in
-   <xref linkend="row-wise-comparison"/>) or comparing a row constructor
-   to the output of a subquery (as in <xref linkend="functions-subquery"/>).
-   In other contexts where two composite-type values are compared, two
-   NULL field values are considered equal, and a NULL is considered larger
-   than a non-NULL.  This is necessary in order to have consistent sorting
-   and indexing behavior for composite types.
-  </para>
-
-  <para>
-   Each side is evaluated and they are compared row-wise.  Composite type
+   Each side is evaluated and they are compared row-wise.
+   As discussed and shown in <xref linkend="nullvalues-multielementcomparison-composite"/>,
+   null values are treated as being equal to other null values and greater
+   than all non-null values.
+   Composite type
    comparisons are allowed when the <replaceable>operator</replaceable> is
    <literal>=</literal>,
    <literal>&lt;&gt;</literal>,
diff --git a/doc/src/sgml/json.sgml b/doc/src/sgml/json.sgml
index 206eadb8f7..0f39d4bf21 100644
--- a/doc/src/sgml/json.sgml
+++ b/doc/src/sgml/json.sgml
@@ -129,6 +129,11 @@
   the corresponding <productname>PostgreSQL</productname> types.
  </para>
 
+ <indexterm>
+  <primary>null value</primary>
+  <secondary sortas="json">within JSON</secondary>
+ </indexterm>
+
   <table id="json-type-mapping-table">
      <title>JSON Primitive Types and Corresponding <productname>PostgreSQL</productname> Types</title>
      <tgroup cols="3">
@@ -162,7 +167,7 @@
        <row>
         <entry><type>null</type></entry>
         <entry>(none)</entry>
-        <entry>SQL <literal>NULL</literal> is a different concept</entry>
+        <entry>An SQL null value is similar, but see <xref linkend="nullvalues-json"/> for differences.</entry>
        </row>
       </tbody>
      </tgroup>
diff --git a/doc/src/sgml/nullvalues.sgml b/doc/src/sgml/nullvalues.sgml
new file mode 100644
index 0000000000..07bbc58528
--- /dev/null
+++ b/doc/src/sgml/nullvalues.sgml
@@ -0,0 +1,1069 @@
+<sect1 id="nullvalues">
+ <title>Null Values Overview</title>
+
+ <indexterm>
+  <primary>null value</primary>
+ </indexterm>
+
+ <para>
+  This section first introduces the concept of null values and then goes
+  on to explain how different parts of the system behave when provided
+  one or more null value inputs.  Examples throughout this section
+  can be executed so long as the following table and rows are created first.
+ </para>
+
+ <para>
+  Throughout this section the discussion of null values will be limited to
+  the SQL language unless otherwise noted.  The JSON-related data types, and the
+  non-SQL procedural languages, have their own behaviors documented in their
+  respective areas.
+ </para>
+
+ <programlisting>
+  CREATE TABLE null_examples (
+    id bigint PRIMARY KEY,
+    value integer NULL
+  );
+  INSERT INTO null_examples
+  VALUES (1, 1), (2, NULL), (3, 4);
+ </programlisting>
+
+ <sect2 id="nullvalues-model">
+  <title>Meaning</title>
+  <para>
+   Generally, a null value is assumed to mean "unknown", but other interpretations
+   are common.  A data model design may state that a null value
+   is to be used to represent "not applicable" - i.e., that a value is not
+   even possible.  The null value also takes on a literal meaning of "not found"
+   when produced as the result of an outer join.
+  </para>
+  <para>
+   In different programming languages, some of which are accessible in the server
+   as procedural languages, the null value is represented in other ways.
+   Of those included in <productname>PostgreSQL</productname>,
+   these are:
+   <literal>None</literal> in <productname>Python</productname>,
+   <literal>undefined</literal> in <productname>Perl</productname>,
+   and the empty string in <productname>TCL</productname>.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-usage">
+  <title>Usage</title>
+  <para>
+   A null value, like all values, must have a data type, and is valid for all data types.
+   It must also be printed as text.  This section discusses null values at the boundaries
+   of the system as well as how they can come into existence due to the design of a query.
+  </para>
+  <sect3 id="nullvalues-usage-input">
+   <title>Null Value Input</title>
+   <para>
+    A null value can be used as input to any function, operator, or expression.
+    The system will then decide how to behave based on the rules described in the
+    rest of this section.  The system will also decide how to behave when a null value
+    is used as a parameter to a function that does not accept null values.
+   </para>
+   <para>
+    As noted in <xref linkend="sql-syntax-constants-nullvalue"/>,
+    a null value literal is written using the <literal>NULL</literal> keyword.
+    Its type is the <link linkend="datatype-pseudo">pseudo-type unknown</link>
+    but can be cast to any concrete data type.
+   </para>
+   <para>
+    <programlisting>
+    SELECT
+     NULL AS "Literal Null Value",
+     pg_typeof(null) AS "Type of Null",
+     pg_typeof(NULL::text) AS "Type of Cast Null",
+     cast(null as text) AS "Cast Null Value";
+    </programlisting>
+    <screen>
+      Literal Null Value | Type of Null | Type of Cast Null | Cast Null Value
+     --------------------+--------------+-------------------+-----------------
+                         | unknown      | text              |
+    </screen>
+   </para>
+   <para>
+    <programlisting>
+    SELECT text NULL;
+    </programlisting>
+    <screen>
+    ERROR:  column "text" does not exist
+    LINE 1: select text NUll;
+    </screen>
+   </para>
+   <para>
+    The <link linkend="sql-copy"><command>COPY ... FROM</command></link> command,
+    including its psql counter-part meta-command
+    <link linkend="app-psql-meta-commands-copy"><command>\copy</command></link>,
+    must deal with input files containing textual representations of the null value.
+    The lack of consistency in real world data requires having a few options to the
+    command related to null handling.  See the documentation in
+    <xref linkend="sql-copy"/> for more information.
+    But, in short, for CSV input it expects text to be quoted and interprets an unquoted
+    empty string as the null value.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-tables">
+   <title>Null Values in Tables</title>
+   <para>
+    Whether via the copy method above, or by inserting literal null values,
+    most usage concerns for null values results from their presence in a table
+    column that lacks a <link linkend="nullvalues-table-constraints">not-null constraint</link>.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-derived">
+   <title>Derived Null Values</title>
+   <para>
+    Even if all data stored in tables are known to be non-null, null values can still
+    be produced while executing a query.  The most common way this happens is by
+    introducing a (left) outer join to the query and having data missing optional related
+    data on the right side of the join.
+    <programlisting>
+     SELECT
+      countries.country,
+      flagships.flagship
+     FROM (
+      VALUES ('Spain'), ('Switzerland')
+     ) as countries (country)
+     LEFT JOIN (
+      VALUES ('Spain', 'Ship')
+     ) as flagships (country, flagship)
+     ON countries.country = flagships.country;
+    </programlisting>
+    <screen>
+        country   | flagship 
+     -------------+----------
+      Spain       | Ship
+      Switzerland | NULL
+    </screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-output">
+   <title>Null Value Output</title>
+   <para>
+    As evidenced above, the "absence of value" aspect of the null value results
+    in its secondary textual representation being an empty string
+    (its primary representation is just NULL).
+    This can be problematic if the empty string is expected to also be a valid value.
+    Therefore, places that deal with possible null values as input and text as
+    output need some means to give the user a way to specify how to print
+    the null value.
+   </para>
+   <para>
+    Generally, the primary representation is used when the value is part of a multi-element value.
+    If the value is being displayed by itself the secondary (blank) representation is used.  The settings
+    discussed herein typically control the secondary representation.  The null value representation when it
+    is within a container type (composite, array, etc...) is controlled by the input and output rules of the
+    container type.  It is when the container value itself is the null value that these generalities then apply.
+   </para>
+   <para>
+    No matter how the null value got into the result when presenting results to the user it is
+    necessary to present null values using text.  This is the responsibility of the client application.
+    The <command>psql</command> client program has the <link linkend="app-psql-meta-command-pset-null">
+    <literal>\pset null</literal> meta-command</link> to specify the textual output of null values
+    it encounters in query results.
+   </para>
+   <para>
+    When the final output of the result is a text file instead of a user additional
+    considerations come into play.  While the option to simply take the user presentation
+    and send it to a text file always exists <productname>PostgreSQL</productname> also
+    provides a facility to output a structured text file.
+    The <link linkend="sql-copy"><command>COPY ... TO</command></link> command,
+    including its psql counter-part meta-command
+    <link linkend="app-psql-meta-commands-copy"><command>\copy</command></link>,
+    has the <literal>NULL</literal> option (and some modifier options) to specify
+    the string to print to the output for null values it encounters in the query result.
+    As with input file processing, for the CSV format it will, by default,
+    produce an unquoted empty string for the null value.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-handling">
+   <title>Null Value Handling</title>
+   <para>
+    The presence of null values in the system results in three-valued logic.
+    In conventional two-valued (binary) logic every outcome is either true or false.
+    In three-valued logic the concept of unknown, represented using the null value, is
+    also an outcome.  This results in falsifying the common-sense notion
+    that "p OR NOT p" is always true.
+    <programlisting>
+     SELECT
+      NULL OR NOT NULL AS "N OR !N";
+    </programlisting>
+    <screen>
+      N OR !N 
+     ---------
+      NULL
+    </screen>
+    (See <xref linkend="nullvalues-operands"/> for more explanation.)
+   </para>
+   <para>
+    When dealing with null values it is often useful to explicitly to convert
+    data to and from a null value given a known non-null representation
+    (e.g., the empty string, the numbers 0 or 1, or boolean false).
+    The <link linkend="functions-coalesce-nvl-ifnull">COALESCE</link> and
+    <link linkend="functions-nullif">NULLIF</link> functions are useful
+    for this purpose.
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-cardinalrule">
+  <title>Distinctness - Overcoming the Cardinal Rule of Null Values</title>
+  <para>
+   The cardinal rule, a null value is
+   <link linkend="functions-comparison-op-table">
+    neither equal nor unequal
+   </link>
+   to any value, including other null values.
+   <programlisting>
+    SELECT
+     NULL = NULL AS "N = N",
+     NULL != NULL AS "N != N",
+     1 = NULL AS "1 = N",
+     1 != NULL AS "1 != N",
+     1 = 1 AS "1 = 1",
+     1 != 1 AS "1 != 1";
+   </programlisting>
+   <screen>
+     N = N | N != N | 1 = N | 1 != N | 1 = 1 | 1 != 1
+    -------+--------+-------+--------+-------+--------
+           |        |       |        | t     | f
+   </screen>
+   However, as with many rules, there are exceptions, as noted in
+   <xref linkend="nullvalues-multielementcomparison"/>.
+   Particularly, when the two compared values are part of a larger multi-element value.
+   <programlisting>
+    SELECT
+     array[1,2]=array[1,null] AS "Array Equals";
+   </programlisting>
+   <screen>
+     Array Equals
+    --------------
+     f
+   </screen>
+  </para>
+  <para>
+   Because of this SQL standard mandated rule, checking for a null value has an
+   explicit <literal>IS NULL</literal> predicate, and additionally there comparison
+   predicates that consider a null value equal to other null values but unequal
+   to any other value (e.g., <literal>IS DISTINCT</literal>, and <literal>IS TRUE</literal>.)
+   These, and other predicates, are described in
+   <xref linkend="functions-comparison-pred-table"/>
+   <programlisting>
+    SELECT id, value,
+     value IS NULL AS "IS N",
+     value IS DISTINCT FROM id AS "IS D",
+     value != id AS "IS !="
+    FROM null_examples;
+   </programlisting>
+   <screen>
+     id | value | IS N | IS D | IS !=
+    ----+-------+------+------+-------
+      1 |     1 | f    | f    | f
+      2 |       | t    | t    |
+      3 |     4 | f    | t    | t
+   </screen>
+  </para>
+  <para>
+   On the other hand, the SQL standard is largely alone in taking this approach to comparing
+   values to the null value.  For example, when working within the JSON data types the use of equals
+   produces true or false and so the concept of distinctness is neither present nor required.
+   Additional details and links are provided in <xref linkend="nullvalues-json"/>.
+   For the non-SQL procedural languages, please consult the appropriate documentation.
+  </para>
+  <para>
+   There is also a cardinal warning: when dealing with
+   <link linkend="rowtypes">composite types</link> in
+   expressions; <literal>composite IS NULL</literal>
+   and <literal>composite IS NOT NUll</literal>
+   are not the opposites of each other in the case where some,
+   but not all, of the composite's fields are null values.
+   (The case where all fields are null is indistinguishable
+   from the composite as a whole being null.)
+   Write <literal>NOT(composite IS NULL)</literal> instead.
+   <programlisting>
+    SELECT
+     c,
+     c IS NULL AS "c IS N",
+     NOT(c IS NULL) AS "NOT c IS N",
+     c IS NOT NULL AS "c IS NOT N",
+     ROW(value, value) IS NULL AS "ROW(v,v) IS N",
+     ROW(value, value) IS NOT NULL AS "ROW(v,v) IS NOT N"
+    FROM null_examples AS c;
+   </programlisting>
+   <screen>
+       c   | c IS N | NOT c IS N | c IS NOT N | ROW(v,v) IS N | ROW(v,v) IS NOT N
+    -------+--------+------------+------------+---------------+-------------------
+     (1,1) | f      | t          | t          | f             | t
+     (2,)  | f      | t          | f          | t             | f
+     (3,4) | f      | t          | t          | f             | t
+   </screen>
+   See <xref linkend="nullvalues-multielement"/> below for an explanation.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-operands">
+  <title>Null-Valued Operands</title>
+  <para>
+   As a general expectation, operator invocation expressions where one of inputs
+   is a null value will result in a null-valued output.
+   <programlisting>
+    SELECT
+     1 + null AS "Add",
+     'text' || null AS "Concatenate";
+   </programlisting>
+   <screen>
+     Add | Concatenate
+    -----+-------------
+         |
+   </screen>
+   Operators that behave otherwise should document their deviation from this norm.
+  </para>
+  <para>
+   A notable example of this is the <literal>IN</literal> operator, which
+   uses equality, not distinctness, for testing.
+   <programlisting>
+    SELECT
+     1 IN (1, null) AS "In Present",
+     1 IN (2, null) AS "In Missing",
+     null IN (1, 2) AS "N In Non-N",
+     null IN (null, 2) AS "N In N";
+   </programlisting>
+   <screen>
+     In Present | In Missing | N In Non-N | N In N
+    ------------+------------+------------+--------
+     t          |            |            |
+   </screen>
+   This is just an extension of the multi-element testing behavior described in
+   <xref linkend="nullvalues-multielement"/>.
+  </para>
+  <para>
+   Experience shows that <literal>CASE</literal> expressions are also prone
+   to bugs since their format encourages binary logic thinking while a
+   <literal>WHEN</literal> test will not consider a null value to be a match.
+   <programlisting>
+    SELECT id, value,
+     CASE WHEN id = value THEN 'Equal' ELSE 'Not Equal' END AS "Affirm",
+     CASE WHEN id != value THEN 'Not Equal' ELSE 'Equal' END AS "Negate",
+     CASE WHEN value IS NULL THEN 'Null'
+          WHEN id = value THEN 'Equal'
+          ELSE 'Not Equal' END AS "Safe Affirm",
+     CASE WHEN value IS NULL THEN 'Null'
+          WHEN id != value THEN 'Not Equal'
+          ELSE 'Equal' END AS "Safe Negate"
+    FROM null_examples;
+   </programlisting>
+   <screen>
+     id | value |  Affirm   |  Negate   | Safe Affirm | Safe Negate
+    ----+-------+-----------+-----------+-------------+-------------
+      1 |     1 | Equal     | Equal     | Equal       | Equal
+      2 |       | Not Equal | Equal     | Null        | Null
+      3 |     4 | Not Equal | Not Equal | Not Equal   | Not Equal
+   </screen>
+  </para>
+  <para>
+   The boolean operators <literal>AND</literal> and <literal>OR</literal>
+   will ignore the null value input if the other input is sufficient to
+   determine the outcome.
+   <programlisting>
+    SELECT
+     true OR null AS "T or N",
+     false OR null AS "F or N",
+     true AND null AS "T and N",
+     false AND null AS "F and N";
+   </programlisting>
+   <screen>
+     T or N | F or N | T and N | F and N
+    --------+--------+---------+---------
+     t      |        |         | f
+   </screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-domains">
+  <title>Null Values in Domains</title>
+  <para>
+   A domain is a user-defined data type that can have a <literal>NOT NULL</literal> constraint.
+   However, some usages of domains will cause the resultant output column (not table column)
+   to have the domain type but the value will be null.
+   The common way this happens is by including the domain column's table on the right side of a left join.
+   <programlisting>
+    BEGIN;
+    CREATE DOMAIN domain_example AS integer NOT NULL;
+    CREATE TABLE domain_examples (de_id bigint PRIMARY KEY, de_value domain_example);
+    INSERT INTO domain_examples VALUES (1, 1), (2, 2);
+    SELECT *, pg_typeof(de_value)
+    FROM null_examples AS ne
+    LEFT JOIN domain_examples AS de ON ne.id = de.de_id;
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    CREATE DOMAIN
+    CREATE TABLE
+    INSERT 0 2
+     id | value | de_id | de_value |   pg_typeof
+    ----+-------+-------+----------+----------------
+      1 |     1 |     1 |        1 | domain_example
+      2 |       |     2 |        2 | domain_example
+      3 |     4 |       |          | domain_example
+
+    ROLLBACK
+   </screen>
+   Please see the details in <xref linkend="sql-createdomain-notes"/>
+   for another example, as well as commentary why this non-standard behavior exists.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-multielement">
+  <title>Testing Multi-Element Values with Null-Valued Elements</title>
+  <para>
+   Arrays and composite types are multi-element types.  Here we also consider non-empty
+   <link linkend="functions-subquery">subquery results</link>
+   and the list of values specified in the
+   <link linkend="functions-comparisons-in-scalar">IN test</link>.
+  </para>
+  <para>
+   When a test is performed on one of these multi-element values
+   the system will iterate over each element, or pair of elements if the test is
+   <link linkend="row-wise-comparison">comparing two row constructors</link> to each other,
+   left-to-right, combining the results using the boolean operations described in
+   <xref linkend="nullvalues-operands"/>. For tests that
+   require an exhaustive search, (e.g., <literal>ALL</literal>, <literal>NOT IN</literal>)
+   the search effectively ends when a false result is found (<literal>AND</literal> combiners).
+   For tests that simply require a true result, (e.g., <literal>ANY</literal>,
+   <literal>IN</literal>) the search effectively ends when a true result is found
+   (<literal>OR</literal> combiners). Therefore:
+   <simplelist>
+    <member>
+     <literal>IN</literal> and <literal>ANY</literal>
+     (<literal>OR</literal>) cannot produce a false result in the presence of null, and
+    </member>
+    <member>
+     <literal>NOT IN</literal> and <literal>ALL</literal>
+     (<literal>AND</literal>) cannot produce a true result in the presence of null.
+    </member>
+   </simplelist>
+   This is because any exhaustive search will produce at least one null value result
+   that cannot be ignored.
+  </para>
+  <para>
+   The SQL standard requires that non-exhaustive
+   (i.e., <literal>IN</literal> and <literal>ANY</literal>) subquery tests
+   return false when there are no rows in the subquery result, and return true
+   for the exhaustive tests (i.e., <literal>NOT IN</literal> and <literal>ALL</literal>).
+  </para>
+  <para>
+   Note that the cardinal warning
+   noted in <xref linkend="nullvalues-cardinalrule"/> above is just the application of this behavior to the
+   <literal>IS NULL</literal> and <literal>IS NOT NULL</literal>
+   tests, which are both exhaustive search tests guaranteed to produce at least one false result
+   when the composite has a mix of null and non-null values.
+  </para>
+  <para>
+   In the next section the rules above are discussed.
+   <xref linkend="nullvalues-multielementpredicates"/>
+   discusses situations where a predicate or a scalar value
+   are being compared to a multi-element value.
+   In <xref linkend="nullvalues-multielementcomparison"/>
+   the rules when two multi-element values are compared
+   to each other are discussed
+   (including the two row constructor comparison case.)
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-multielementpredicates">
+  <title>Multi-Element Predicates and Scalars</title>
+  <sect3 id="nullvalues-multielementpredicates-composites">
+   <title>Composite Fields</title>
+   <para>
+    When a composite typed valued is created a null value can be assigned to any
+    of its fields (see <xref linkend="rowtypes-constructing"/> for how to do this).
+    So long as at least one field is non-null the composite value
+    as whole exists and an <literal>IS NULL</literal> predicate will return false.
+   </para>
+   <para>
+    Applying the <literal>IS NOT NULL</literal> predicate to a composite value performs
+    checks whether all fields of the composite have non-null values.  This is not the same
+    as a non-null composite value.  Specifically, if the composite value has
+    a null-valued field then both the <literal>IS NOT NULL</literal> predicate and the
+    <literal>IS NULL</literal> predicate will return false.
+    <programlisting>
+     SELECT
+      ROW(1,2) IS NULL AS "Row Is Null",
+      ROW(1,2) IS NOT NULL AS "Row Is Not Null",
+      ROW(1,NULL) IS NULL AS "Row Is Null",
+      ROW(1,NULL) IS NOT NULL AS "Row Is Not Null";
+    </programlisting>
+    <screen>
+      Row Is Null | Row Is Not Null | Row Is Null | Row Is Not Null
+     -------------+-----------------+-------------+-----------------
+      f           | t               | f           | f
+    </screen>
+   </para>
+   <para>
+    Please read <xref linkend="composite-type-comparison"/> for a complete treatment
+    on how <productname>PostgreSQL</productname> handles row-wise comparison.  The
+    next two multi-element related items in this subsection discuss those comparisons in the
+    presence of null-valued fields, and also in terms of the SQL standard.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementpredicates-arrays">
+   <title>Array Elements and IN Bag Members</title>
+   <para>
+    Examples of applying the behavior discussed in <xref linkend="nullvalues-multielement"/>
+    to arrays, and <literal>IN</literal> and <literal>NOT IN</literal> bags, using the
+    operators defined in <xref linkend="functions-comparisons"/>.  The following examples produce
+    the same results when swapping <literal>IN</literal>/<literal>ANY</literal>
+    and also <literal>NOT IN</literal>/<literal>ALL</literal>, plus transforming the bag/array format.
+    I.e., the exhaustive and non-exhaustive pairs noted in <xref linkend="nullvalues-multielement"/>.
+   </para>
+   <para>
+    <programlisting>
+     SELECT
+      1 = ANY(array[1, 1, NULL]) AS "Any-Null-Match",
+      1 = ANY(array[1, 1]) AS "Any-NoNull-Match",
+      1 = ALL(array[1, 1, NULL]) AS "ALL-Null-Match",
+      1 = ALL(array[1, 1]) AS "All-NoNull-Match";
+     SELECT
+      2 IN (1, 1, NULL) AS "IN-Null-Negative",
+      2 IN (1, 1) AS "IN-NoNull-Negative",
+      2 NOT IN (2, 2, NULL) AS "NotIN-Null-Negative",
+      2 NOT IN (2, 2) AS "NotIN-NoNull-Negative";
+    </programlisting>
+    <screen>
+      Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+     ----------------+------------------+----------------+------------------
+      t              | t                |                | t
+
+      IN-Null-Negative | IN-NoNull-Negative | NotIN-Null-Negative | NotIN-NoNull-Negative
+     ------------------+--------------------+---------------------+-----------------------
+                       | f                  | f                   | f
+    </screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementpredicates-subqueries">
+   <title>Single-Column Subquery Rows</title>
+   <para>
+    Examples of applying the behavior discussed in <xref linkend="nullvalues-multielement"/>
+    to subqueries using the operators defined in <xref linkend="functions-subquery"/>.  Here we
+    covers the case were the multiple elements being checked are rows, each having one column.
+    If the column itself is multi-element then the thing being searched for must be a compatible
+    multi-element value, and the corresponding comparison behavior described in
+    <xref linkend="nullvalues-multielementcomparison"/> will also be applied.
+   </para>
+   <para>
+    <programlisting>
+     SELECT
+      1 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-Match",
+      1 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-Match",
+      1 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-Match",
+      1 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-Match";
+     SELECT
+      2 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-NoMatch",
+      2 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-NoMatch",
+      2 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-NoMatch",
+      2 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-NoMatch";
+    </programlisting>
+    <screen>
+      Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+     ----------------+------------------+----------------+------------------
+      t              | t                |                | t
+
+      Any-Null-NoMatch | Any-NoNull-NoMatch | ALL-Null-NoMatch | All-NoNull-NoMatch
+     ------------------+--------------------+------------------+--------------------
+                       | f                  | f                | f
+    </screen>
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-multielementcomparison">
+  <title>Multi-Element Comparisons</title>
+  <para>
+   The previous subsection, <xref linkend="nullvalues-multielementpredicates"/>, discussed applying
+   a predicate or a scalar value check element-wise across a multi-element value.
+   This subsection moves the discussion over to comparing two multi-element values to each other.
+   As both array and composite typed values
+   can be stored within an index, and comparing two values in that context must not produce
+   a null-valued result, considerations are made to adhere to the SQL standard where
+   possible while still making indexes, which the specification is silent on, functional.
+   Specifically, except when comparing two row constructors, null values are considered
+   equal to other null values and greater than all non-null values.
+  </para>
+  <para>
+   There are five pair-wise comparison situations to consider:
+   element-wise when the inputs are arrays, and row-wise when the inputs can be either
+   row constructors or composite typed values.  While these four later combinations seem similar,
+   the fact that row constructors are query literals, while composite typed values can be stored,
+   brings about important differences in how they are treated.  Please read
+   <xref linkend="composite-type-comparison"/> for a fuller treatment of this topic.  Here
+   we briefly recap the five different situations in the presence of null values.
+  </para>
+  <sect3 id="nullvalues-multielementcomparison-array">
+   <title>Element-wise Comparisons</title>
+   <para>
+    First situation, null values within an array compare as equal to each other and greater than all
+    non-null values, regardless of whether the comparison involves
+    <link linkend="sql-syntax-array-constructors">array constructors</link> or array typed values.
+    <programlisting>
+     SELECT
+      array[1,2]=array[1,null] AS "Constructors",
+      s, t,
+      s = t AS "Stored Equality",
+      t &gt; s AS "Stored Ordering"
+     FROM
+     (values (array[1,2])) AS sv (s),
+     (values (array[1,null::integer])) AS st (t);
+    </programlisting>
+    <screen>
+      Constructors |   s   |    t     | Stored Equality | Stored Ordering
+     --------------+-------+----------+-----------------+-----------------
+      f            | {1,2} | {1,NULL} | f               | t
+    </screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-rowconstructor">
+   <title>Row-wise Mutual Row Constructor Comparisons</title>
+   <para>
+    In this situation null values produce unknown when compared to all values.
+    <programlisting>
+     SELECT
+      (1,2)=(1,null) AS "NonNull=Null",
+      (1,null::integer)=(1,null) AS "Null=Null";
+    </programlisting>
+    <screen>
+      NonNull=Null | Null=Null
+     --------------+-----------
+                   |
+    </screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-composite">
+   <title>Row-wise Composite Involved Comparisons</title>
+   <para>
+    In these three situations null values are considered equal to each other and greater than
+    all non-null value.
+   </para>
+   <programlisting>
+    SELECT s, t,
+     s = t AS "Stored Equals Stored",
+     t &lt; (1,2) AS "Stored LT Constructor",
+     t = (1,null::integer) AS "Stored Equals Constructor"
+    FROM
+     (values (1,2)) AS s,
+     (values (1,null::integer)) AS t;
+   </programlisting>
+   <screen>
+       s   |  t   | Stored Equals Stored | Stored LT Constructor | Stored Equals Constructor
+    -------+------+----------------------+-----------------------+---------------------------
+     (1,2) | (1,) | f                    | f                     | t
+   </screen>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-sqlconformance">
+   <title>SQL Standard Conformance</title>
+   <para>
+    The SQL standard requires row-wise comparison to return NULL if the
+    result depends on comparing two NULL values or a NULL and a non-NULL.
+    <productname>PostgreSQL</productname> does this only when comparing the
+    results of two row constructors (as in
+    <xref linkend="row-wise-comparison"/>) or comparing a row constructor
+    to the output of a subquery (as in <xref linkend="functions-subquery"/>).
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-functions">
+  <title>Null-Valued Arguments in Normal Function Calls</title>
+  <para>
+   <link linkend="sql-createfunction">Function specifications</link>
+   have a "strictness" attribute (<literal>pg_proc.proisstrict</literal>) that,
+   when set to "strict" (true) will tell the executor to return a null value for any
+   function call having at least one null-valued input, without executing the
+   function.
+  </para>
+  <para>
+   Most functions, especially single argument functions, are defined with strict because without
+   non-null values to act upon they cannot produce a meaningful result.  However, for multi-argument
+   functions, especially <link linkend="xfunc-sql-variadic-functions">variadic functions</link>
+   like concatenate, null values often are simply ignored.
+   This can be different than the choice made by a binary operator performing the same function,
+   like for concatenating text, but not always, like concatenating an element onto an array.
+   <programlisting>
+    SELECT
+     lower(null::text) AS "Lower",
+     left('text', null) AS "Left",
+     'one' || null AS "|| Text Op",
+     concat('one', null) AS "concat Text Func",
+     array_append(array[1], null) AS "append([], null)",
+     array[1]::integer[] || null::integer AS "[] || null",
+     array[1]::integer[] || null::integer[] AS "[] || null[]";
+   </programlisting>
+   <screen>
+     Lower | Left | || Text Op | concat Text Func | append([], null) | [] || null | [] || null[]
+    -------+------+------------+------------------+------------------+------------+--------------
+           |      |            | one              | {1,NULL}         | {1,NULL}   | {1}
+   </screen>
+   In short, please read the documentation for the functions you use if they may receive null inputs
+   to understand how they will behave.  Send a documentation comment pointing out any functions
+   that do not behave strictly but whose actual behavior in the presence of null-valued input
+   is not described or readily inferred.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-aggregates">
+  <title>Null-Valued Arguments in Aggregate and Window Functions</title>
+  <para>
+   When executing an aggregate or window function the state tracking component
+   (which may be initialized to a non-null value, e.g., 0 for the count function)
+   will remain unchanged even if the underlying processing
+   function returns a null value, whether from being defined strict
+   or it simply returns a null value upon execution.  The aggregation
+   routine will usually ignore the null value and continue processing,
+   as demonstrated in <literal>count(value)</literal> below.
+   <programlisting>
+    SELECT
+     count(*) AS "Count",
+     count(value) AS "Count Value",
+     count(null_examples) AS "Count Composite",
+     count(row(value, value)) AS "Count Row"
+    FROM null_examples;
+   </programlisting>
+   <screen>
+     Count | Count Value | Count Composite | Count Row
+    -------+-------------+-----------------+-----------
+         3 |           2 |               3 |         3
+   </screen>
+   Notice the "Count Row" outcome, though.  While we noted in the cardinal warning
+   that a composite whose fields are all null values is indistinguishable from
+   a null value of composite type, the count aggregate does indeed distinguish them,
+   recognizing and counting the non-null composite value produced by the
+   <link linkend="sql-syntax-row-constructors">row constructor</link>
+   <literal>row(null, null)</literal>.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-filtering">
+  <title>Null Values When Filtering</title>
+  <para>
+   A <literal>WHERE</literal> clause that evaluates to a null value for a given row will exclude that row.
+   <programlisting>
+    SELECT id, value AS "Equals 1"
+    FROM null_examples
+    WHERE value = 1;
+
+    SELECT id, value AS "Not Equal to 1"
+    FROM null_examples
+    WHERE value != 1;
+   </programlisting>
+   <screen>
+     id | Equals 1
+    ----+----------
+      1 |        1
+
+     id | Not Equal to 1
+    ----+----------------
+      3 |              4
+   </screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-table-constraints">
+  <title>Null Values in Table Constraints</title>
+  <para>
+   It is possible to define
+   <link linkend="ddl-constraints-check-constraints">check constraint</link>
+   expressions on tables to ensure only values passing those expressions are inserted.
+   While this seems like it would behave the same as a where clause, the choice here,
+   when an expression evaluates to a null value, is to allow the row to be inserted
+   - the same as a true result.
+   <programlisting>
+    BEGIN;
+    ALTER TABLE null_examples ADD CONSTRAINT value_not_1 CHECK (value != 1);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    ERROR:  check constraint "value_not_1" of relation "null_examples" is violated by some row
+    ROLLBACK
+   </screen>
+   <programlisting>
+    BEGIN;
+    ALTER TABLE null_examples ADD CONSTRAINT value_not_10 CHECK (value != 10);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    ALTER TABLE
+    ROLLBACK
+   </screen>
+   We are using a transaction (begin and rollback) and the alter table command to add two
+   constraints to our null_examples table.  The first constraint prohibits rows with a value
+   of 1, which our row with an id of 1 violates.  Prohibiting the value 10 definitely allows
+   rows with ids 1 and 3 to exist, and since we are not told that some row violates our
+   constraint the null value in the row with id 2 is being accepted as well.
+  </para>
+  <para>
+   The <link linkend="ddl-constraints-not-null"><literal>NOT NULL</literal> column constraint</link>
+   produces the same answer as a <literal>column IS NOT NULL</literal> check constraint but is
+   more concise to write.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-grouping">
+  <title>Null Values When Grouping</title>
+  <para>
+   In the context of both <literal>DISTINCT</literal> and <literal>GROUP BY</literal>
+   it is necessary that all inputs resolve to being either equal to or not equal to all
+   other values.  These features use <link linkend="nullvalues-cardinalrule">distinctness</link>
+   instead of simple equality in order to handle a null value like a definite value equal to
+   another null value and unequal to all other values.
+   <programlisting>
+    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+    SELECT
+     value,
+     count(*) AS "Count"
+    FROM vals
+    GROUP BY value
+    ORDER BY value;
+   </programlisting>
+   <screen>
+     value | Count
+    -------+-------
+         1 |     2
+         2 |     1
+           |     2
+   </screen>
+   <programlisting>
+    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+    SELECT DISTINCT value
+    FROM vals
+    ORDER BY value NULLS FIRST;
+   </programlisting>
+   <screen>
+     value
+    -------
+
+         1
+         2
+   </screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-ordering">
+  <title>Null Values When Ordering</title>
+  <para>
+   In the context of <literal>ORDER BY</literal>, distinctness rules also apply,
+   though this is insufficient since it must be determined whether or not to
+   present null values before or after all non-null values.  To handle
+   this, the <literal>ORDER BY</literal> clause will let you specify either
+   <literal>NULLS FIRST</literal> or <literal>NULLS LAST</literal>.
+   <programlisting>
+    WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+    SELECT value FROM vals
+    ORDER BY value DESC NULLS FIRST;
+   </programlisting>
+   <screen>
+     value
+    -------
+
+
+         2
+         1
+         1
+   </screen>
+  </para>
+  <para>
+   Note that when dealing with multi-element values the comparison behavior described in
+   <xref linkend="nullvalues-multielementcomparison"/> applies,
+   if the comparison determination rests upon comparing a null value to a non-null value
+   the multi-element value with the null-valued component will sort greater than the one
+   with a non-null component.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-indexed">
+  <title>Null Values in Indexes</title>
+  <para>
+   The uniqueness and relative ordering rules applied to null values
+   are defined when creating an index.  For the default
+   <literal>NULLS DISTINCT</literal> uniqueness, equality rules are applied.
+   Specifying <literal>NULLS NOT DISTINCT</literal> will result in
+   <literal>IS DISTINCT FROM</literal> rules being applied whereby all null
+   values are equal to each other.  This setting applies to all columns in the index.
+  </para>
+  <para>
+   <programlisting>
+    BEGIN;
+    CREATE UNIQUE INDEX value_nulls_distinct_implicit ON null_examples (value);
+    CREATE UNIQUE INDEX value_nulls_distinct_explicit ON null_examples (value) NULLS DISTINCT;
+    INSERT INTO null_examples VALUES (4, NULL);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    CREATE INDEX
+    CREATE INDEX
+    INSERT 0 1
+    ROLLBACK
+   </screen>
+   <programlisting>
+    BEGIN;
+    CREATE UNIQUE INDEX value_nulls_not_distinct_explicit ON null_examples (value) NULLS NOT DISTINCT;
+    INSERT INTO null_examples VALUES (4, NULL);
+    ROLLBACK;
+   </programlisting>
+   <screen>
+    BEGIN
+    CREATE INDEX
+    ERROR:  duplicate key value violates unique constraint "value_nulls_not_distinct_explicit"
+    DETAIL:  Key (value)=(null) already exists.
+    ROLLBACK
+   </screen>
+  </para>
+  <para>
+   For ordering, each column in the index gets its own specification of
+   direction and null value placement similar to that found in the
+   <literal>ORDER BY</literal> clause.
+  </para>
+  <para>
+   Note that when dealing with multi-element values the comparison behavior described in
+   <xref linkend="nullvalues-multielementcomparison"/> applies,
+   if the comparison determination rests upon comparing a null value to a non-null value
+   the multi-element value with the null-valued component will sort greater than the one
+   with a non-null component.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-partitionkeys">
+  <title>Null Values in Partition Keys</title>
+  <para>
+   Presently, PostgreSQL requires that all the columns of a partition key be included
+   in the primary key.  Furthermore, all columns used in a primary key have a not-null
+   column constraint applied to them.  Therefore, any partitioned table with a primary key
+   will only have non-null values in the partition key columns.
+  </para>
+  <para>
+   However, should you setup a situation where a partition key column can both: have a null value
+   and, null values in that key go to a specific partition, list-based routing will work as expected.
+   There is presently no way to direct rows having null values in partition keys away from the
+   default partition for range and hash partitioning.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-settings">
+  <title>Null-Valued Settings</title>
+  <para>
+   There are none.  During initialization all settings are assigned a non-null value.
+  </para>
+  <para>
+   This is mostly meaningful for <link linkend="runtime-config-custom">custom settings</link>,
+   thus this subsection focuses on <link linkend="config-setting-sql">SQL interaction</link>.
+   Unlike settings created by extensions, custom settings can only be textual and the default
+   value for text here is the empty string.
+   <programlisting>
+    SHOW example.string;
+    BEGIN;
+    SELECT set_config('example.string', NULL, true);
+    SELECT current_setting('example.string') IS NULL AS "Setting Is Null";
+    ROLLBACK;
+    SHOW example.string;
+    RESET example.string;
+    SHOW example.string;
+   </programlisting>
+   <screen>
+    ERROR:  unrecognized configuration parameter "example.string"
+    BEGIN
+     set_config
+    ------------
+
+
+     Setting Is Null
+    -----------------
+     f
+
+    ROLLBACK
+     example.string
+    ----------------
+
+
+    RESET
+     example.string
+    ----------------
+
+   </screen>
+   Notice two important behaviors: first, even though we passed in a null value to
+   the <literal>set_config</literal> function, the <literal>current_setting</literal>
+   function returned a non-null value, specifically the empty string.  Second, after ROLLBACK the
+   setting is still present (i.e., the error seen before creating the setting no longer appears),
+   and in fact will remain so until the session ends
+   (i.e., RESET does not restore the non-existence state.)
+  </para>
+  <para>
+    The other ways to specify settings do not have a means to specify null values,
+    a specific non-null value is required as part of the specification of the setting.
+   </para>
+ </sect2>
+
+ <sect2 id="nullvalues-json">
+  <title>Null Values in JSON</title>
+  <para>
+   As noted in <xref linkend="json-type-mapping-table"/>, the JSON specification's
+   null value is assigned its own type unlike in SQL.  This introduces an inconsistency
+   since the JSON null type's value is itself non-null.  It is also comparable to any
+   other JSON type, returning false for equality, and itself, returning true for equality.
+   But an SQL value of json or jsonb type having a JSON null value is considered non-null in SQL.
+   <programlisting>
+    SELECT 'null'::json IS NULL AS "JSON null is NULL";
+   </programlisting>
+   <screen>
+     JSON null is NULL
+    -------------------
+     f
+   </screen>
+   Additionally, the SQL operators and functions involving JSON key or array element selection,
+   or construction from literals, require that a valid number or text value be supplied as an operand
+   and so an SQL null value cannot be targeted by those operators and functions.
+   <programlisting>
+    SELECT to_json(null::text);
+   </programlisting>
+   <screen>
+     to_json
+    ---------
+
+   </screen>
+   That all said, the system will convert an SQL null value to a JSON null value when in a
+   composite type context.
+   <programlisting>
+    SELECT json_build_object('value', value)
+    FROM null_examples;
+   </programlisting>
+   <screen>
+     json_build_object
+    -------------------
+     {"value" : 1}
+     {"value" : null}
+     {"value" : 4}
+   </screen>
+   And vice versa.
+   <programlisting>
+    SELECT *
+    FROM jsonb_to_recordset('[{"value":1},{"value":null},{"value":4}]'::jsonb) AS jtr (value integer);
+   </programlisting>
+   <screen>
+     value
+    -------
+         1
+
+         4
+   </screen>
+  </para>
+  <para>
+   Aspects of null value handling within the internals of the JSON-related types are discussed
+   in <xref linkend="datatype-json"/>,
+   particularly in <xref linkend="datatype-jsonpath"/>.
+   This subsection is focused on how SQL null values are related to JSON null values.
+  </para>
+ </sect2>
+</sect1>
diff --git a/doc/src/sgml/ref/create_domain.sgml b/doc/src/sgml/ref/create_domain.sgml
index ce55520348..027a145f2c 100644
--- a/doc/src/sgml/ref/create_domain.sgml
+++ b/doc/src/sgml/ref/create_domain.sgml
@@ -197,9 +197,10 @@ CREATE DOMAIN <replaceable class="parameter">name</replaceable> [ AS ] <replacea
    Domain constraints, particularly <literal>NOT NULL</literal>, are checked when
    converting a value to the domain type.  It is possible for a column that
    is nominally of the domain type to read as null despite there being such
-   a constraint.  For example, this can happen in an outer-join query, if
-   the domain column is on the nullable side of the outer join.  A more
-   subtle example is
+   a constraint.  For example, this can happen in
+   <link linkend="nullvalues-domains">an outer-join query</link>, if
+   the domain column is on the nullable side of the outer join.
+   A more subtle example is
 <programlisting>
 INSERT INTO tab (domcol) VALUES ((SELECT domcol FROM tab WHERE false));
 </programlisting>
diff --git a/doc/src/sgml/syntax.sgml b/doc/src/sgml/syntax.sgml
index 916189a7d6..c41687b224 100644
--- a/doc/src/sgml/syntax.sgml
+++ b/doc/src/sgml/syntax.sgml
@@ -281,9 +281,9 @@ U&amp;"d!0061t!+000061" UESCAPE '!'
    </indexterm>
 
    <para>
-    There are three kinds of <firstterm>implicitly-typed
+    There are four kinds of <firstterm>implicitly-typed
     constants</firstterm> in <productname>PostgreSQL</productname>:
-    strings, bit strings, and numbers.
+    strings, bit strings, numbers, and the null value.
     Constants can also be specified with explicit types, which can
     enable more accurate representation and more efficient handling by
     the system. These alternatives are discussed in the following
@@ -834,6 +834,25 @@ CAST ( '<replaceable>string</replaceable>' AS <replaceable>type</replaceable> )
      usage, as is the function-call syntax.
     </para>
    </sect3>
+
+   <sect3 id="sql-syntax-constants-nullvalue">
+    <title>The Null Value Constant</title>
+    <indexterm>
+     <primary>null value</primary>
+     <secondary>constant</secondary>
+    </indexterm>
+    <para>
+     The null value represents an unknown value and its constant, the keyword <literal>NULL</literal>,
+     when evaluated in an expression, likewise yields a value of <literal>unknown</literal> type.
+     See <xref linkend="nullvalues"/> for an overview of how the system behaves in the presence
+     of a null value in various contexts.
+    </para>
+    <para>
+     Due to the typing of a null value as <literal>unknown</literal> it is often necessary to use
+     a cast, as described in the previous section, to convert it to the specific type needed.
+     However, implicit casting is performed when contextual information is available.
+    </para>
+   </sect3>
   </sect2>
 
   <sect2 id="sql-syntax-operators">
-- 
2.34.1

#62Marcos Pegoraro
marcos@f10.com.br
In reply to: David G. Johnston (#61)
Re: Document NULL

Em ter., 11 de mar. de 2025 às 12:52, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

The markup surrounding the examples is correct now and I decided \N was
the most useful representation of NULL given that the query data is single
digit numbers. I really hate the non-readability of t/f output for
booleans so I manually cleaned those up.

You defined \N to show NULL values. But then all other places in the DOCs
do not use this definition, so it can be confusing for the user.
Here we have a \N and everywhere else only spaces ?

I understand that there are many places to replace, but I think it would be
better to have a single standard everywhere, don't you think ?
On the other hand, if we replace them all, other users can be confused too,
if they do not read this page and see an \N on any other page.
What's this \N, he can think. \N is not self-explanatory.

regards
Marcos

#63David G. Johnston
david.g.johnston@gmail.com
In reply to: Marcos Pegoraro (#62)
Re: Document NULL

On Tue, Mar 11, 2025 at 12:39 PM Marcos Pegoraro <marcos@f10.com.br> wrote:

Em ter., 11 de mar. de 2025 às 12:52, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

The markup surrounding the examples is correct now and I decided \N was
the most useful representation of NULL given that the query data is single
digit numbers. I really hate the non-readability of t/f output for
booleans so I manually cleaned those up.

You defined \N to show NULL values. But then all other places in the DOCs
do not use this definition, so it can be confusing for the user.
Here we have a \N and everywhere else only spaces ?

I understand that there are many places to replace, but I think it would
be better to have a single standard everywhere, don't you think ?
On the other hand, if we replace them all, other users can be confused
too, if they do not read this page and see an \N on any other page.
What's this \N, he can think. \N is not self-explanatory.

I'm mostly indifferent and it is very simple to change. It seemed
desirable to have the main topic of this page display as something that
isn't invisible though. And NULL was unappealing since it naturally
appears in data. Since COPY uses \N I figured it was a decent choice.
<null> or <NULL> came to mind too, but there were long compared to 1, 2,
and 4 that appear along side it.

David J.

#64David G. Johnston
david.g.johnston@gmail.com
In reply to: David G. Johnston (#63)
Re: Document NULL

On Tue, Mar 11, 2025 at 12:44 PM David G. Johnston <
david.g.johnston@gmail.com> wrote:

On Tue, Mar 11, 2025 at 12:39 PM Marcos Pegoraro <marcos@f10.com.br>
wrote:

Em ter., 11 de mar. de 2025 às 12:52, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

The markup surrounding the examples is correct now and I decided \N was
the most useful representation of NULL given that the query data is single
digit numbers. I really hate the non-readability of t/f output for
booleans so I manually cleaned those up.

You defined \N to show NULL values. But then all other places in the DOCs
do not use this definition, so it can be confusing for the user.
Here we have a \N and everywhere else only spaces ?

I understand that there are many places to replace, but I think it would
be better to have a single standard everywhere, don't you think ?
On the other hand, if we replace them all, other users can be confused
too, if they do not read this page and see an \N on any other page.
What's this \N, he can think. \N is not self-explanatory.

I'm mostly indifferent and it is very simple to change. It seemed
desirable to have the main topic of this page display as something that
isn't invisible though. And NULL was unappealing since it naturally
appears in data. Since COPY uses \N I figured it was a decent choice.
<null> or <NULL> came to mind too, but there were long compared to 1, 2,
and 4 that appear along side it.

Premature reply hit...I'm not all that concerned about this page being
different than other pages. The header explains the choices made for
presentation here. And the volume of affected results, at least for NULL,
is considerably greater than anywhere else.

David J.

#65Marcos Pegoraro
marcos@f10.com.br
In reply to: David G. Johnston (#64)
Re: Document NULL

Em ter., 11 de mar. de 2025 às 16:47, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

Since COPY uses \N I figured it was a decent choice. <null> or <NULL> came

to mind too, but there were long compared to 1, 2, and 4 that appear along
side it.

Well, I would use <null>, it doesn't need any explanation and we could use

it everywhere else.
I understand that this page we have more NULL values than everywhere else
combined, but it's a good opportunity to set a standard for all
documentation

regards
Marcos

#66David G. Johnston
david.g.johnston@gmail.com
In reply to: Marcos Pegoraro (#65)
Re: Document NULL

On Tue, Mar 11, 2025 at 1:19 PM Marcos Pegoraro <marcos@f10.com.br> wrote:

Em ter., 11 de mar. de 2025 às 16:47, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

Since COPY uses \N I figured it was a decent choice. <null> or <NULL>

came to mind too, but there were long compared to 1, 2, and 4 that appear
along side it.

Well, I would use <null>, it doesn't need any explanation and we could

use it everywhere else.
I understand that this page we have more NULL values than everywhere else
combined, but it's a good opportunity to set a standard for all
documentation

If someone writes a patch to make everywhere <null> and changes this page
in the process I wouldn't complain. For now there is no such standard, we
use empty string everywhere else, and that isn't a good choice here IMO.
It is probably a good choice for elsewhere since the empty string is our
default. While specific to this page \N reads the best for these examples
IMO. But I'll concede to whatever if others think this choice is a
review/commit blocker.

David J.

#67Tom Lane
tgl@sss.pgh.pa.us
In reply to: David G. Johnston (#66)
Re: Document NULL

"David G. Johnston" <david.g.johnston@gmail.com> writes:

On Tue, Mar 11, 2025 at 1:19 PM Marcos Pegoraro <marcos@f10.com.br> wrote:

I understand that this page we have more NULL values than everywhere else
combined, but it's a good opportunity to set a standard for all
documentation

If someone writes a patch to make everywhere <null> and changes this page
in the process I wouldn't complain. For now there is no such standard, we
use empty string everywhere else, and that isn't a good choice here IMO.
It is probably a good choice for elsewhere since the empty string is our
default. While specific to this page \N reads the best for these examples
IMO. But I'll concede to whatever if others think this choice is a
review/commit blocker.

I think that idea (changing all the docs) is a complete nonstarter
because people would not understand why the results they get don't
look like what it says in the docs. Of course, we could fix that
by changing the factory default for \pset null, but that seems like
even more of a nonstarter.

We can probably get away with having one page that assumes a
different \pset null setting, as long as there's a clear <note>
about it at the top of the page.

regards, tom lane

#68Marcos Pegoraro
marcos@f10.com.br
In reply to: Tom Lane (#67)
Re: Document NULL

Em ter., 11 de mar. de 2025 às 17:43, Tom Lane <tgl@sss.pgh.pa.us> escreveu:

I think that idea (changing all the docs) is a complete nonstarter
because people would not understand why the results they get don't
look like what it says in the docs. Of course, we could fix that
by changing the factory default for \pset null, but that seems like
even more of a nonstarter.

And if we use a tag to display nulls, like <nullvalue>NULL</nullvalue>
Then all null values would be the same, and the user would understand what
it means, because it's painted differently.
And then would be an unique way of appearance, on this page and all others

regards
Marcos

#69David G. Johnston
david.g.johnston@gmail.com
In reply to: Marcos Pegoraro (#68)
Re: Document NULL

On Wednesday, March 12, 2025, Marcos Pegoraro <marcos@f10.com.br> wrote:

Em ter., 11 de mar. de 2025 às 17:43, Tom Lane <tgl@sss.pgh.pa.us>
escreveu:

I think that idea (changing all the docs) is a complete nonstarter
because people would not understand why the results they get don't
look like what it says in the docs. Of course, we could fix that
by changing the factory default for \pset null, but that seems like
even more of a nonstarter.

And if we use a tag to display nulls, like <nullvalue>NULL</nullvalue>
Then all null values would be the same, and the user would understand
what it means, because it's painted differently.
And then would be an unique way of appearance, on this page and all others

I’m not accepting this line of work as part of this patch. Please limit
this to the merits of choosing \N as the particular value for \pset null on
this page. You can start a new thread regarding a policy change for
marking up null values in the whole of the documentation. But as Tom said,
I don’t see that going anywhere.

David J.

#70Álvaro Herrera
alvherre@alvh.no-ip.org
In reply to: David G. Johnston (#69)
Re: Document NULL

On 2025-Mar-12, David G. Johnston wrote:

I’m not accepting this line of work as part of this patch. Please limit
this to the merits of choosing \N as the particular value for \pset null on
this page. You can start a new thread regarding a policy change for
marking up null values in the whole of the documentation. But as Tom said,
I don’t see that going anywhere.

I agree. I think this patch is correct to treat NULLs in a special way
in the page that describes NULLs (particularly if it describes that at
the start of the page), but leave null values in other parts of the
documentation as they are today.

--
Álvaro Herrera 48°01'N 7°57'E — https://www.EnterpriseDB.com/
"I'm impressed how quickly you are fixing this obscure issue. I came from
MS SQL and it would be hard for me to put into words how much of a better job
you all are doing on [PostgreSQL]."
Steve Midgley, http://archives.postgresql.org/pgsql-sql/2008-08/msg00000.php

#71David G. Johnston
david.g.johnston@gmail.com
In reply to: David G. Johnston (#61)
1 attachment(s)
Re: Document NULL

On Tue, Mar 11, 2025 at 8:51 AM David G. Johnston <
david.g.johnston@gmail.com> wrote:

Version 7
https://wiki.postgresql.org/wiki/Documenting_NULL
https://commitfest.postgresql.org/patch/5086/

The only item that came up that I'm unable to address myself is discussion
comparing a NOT NULL column constraint to an equivalent check constraint.
I've left things documented as semantically equivalent. A future patch can
clear those things up. At this point I'm considering this patch content
complete.

I figure to make any last tweaks against this version 7, combine the two
patches into one and submit v8 as ready to commit should a reviewer agree.

Version 8.

Marking this Ready to Commit in CF 2025-09 (CF PG19-1)

David J.

Attachments:

v8-0001-doc-Add-an-overview-of-NULL-treatment-in-PostgreSQL.patchtext/x-patch; charset=US-ASCII; name=v8-0001-doc-Add-an-overview-of-NULL-treatment-in-PostgreSQL.patchDownload
From e8f398d80966c9ea3211b336ba91e225d8e18746 Mon Sep 17 00:00:00 2001
From: "David G. Johnston" <David.G.Johnston@Gmail.com>
Date: Wed, 18 Jun 2025 10:38:24 -0700
Subject: [PATCH] doc: Add an overview of NULL treatment in PostgreSQL

The handling of NULL within PostgreSQL is broad, varied, and
unintuitive.  This new section provides a place for the reader
to go and skim over the various behaviors and stick them in
the back of their mind.

Some existing documentation is tweaked to be more in line with
the overall flow of the material presented in this overview.
The individual features do still constitute an authoritative
location for describing the behaviors - but now have a more
convenient place to put examples.
---
 doc/src/sgml/datatype.sgml          |    2 +-
 doc/src/sgml/ddl.sgml               |    2 +
 doc/src/sgml/filelist.sgml          |    1 +
 doc/src/sgml/func.sgml              |  273 +++----
 doc/src/sgml/json.sgml              |    7 +-
 doc/src/sgml/nullvalues.sgml        | 1126 +++++++++++++++++++++++++++
 doc/src/sgml/ref/create_domain.sgml |    7 +-
 doc/src/sgml/syntax.sgml            |   23 +-
 8 files changed, 1281 insertions(+), 160 deletions(-)
 create mode 100644 doc/src/sgml/nullvalues.sgml

diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml
index 09309ba0390..53fd7fe3fa1 100644
--- a/doc/src/sgml/datatype.sgml
+++ b/doc/src/sgml/datatype.sgml
@@ -5389,7 +5389,7 @@ WHERE ...
        <row>
         <entry><type>unknown</type></entry>
         <entry>Identifies a not-yet-resolved type, e.g., of an undecorated
-         string literal.</entry>
+         string literal.  Also, the <link linkend="nullvalues-usage">null value.</link></entry>
        </row>
       </tbody>
      </tgroup>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 96936bcd3ae..0f2ce1bfb88 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -168,6 +168,8 @@ DROP TABLE products;
   </para>
  </sect1>
 
+ &nullvalues;
+
  <sect1 id="ddl-default">
   <title>Default Values</title>
 
diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml
index fef9584f908..53b70f31e9b 100644
--- a/doc/src/sgml/filelist.sgml
+++ b/doc/src/sgml/filelist.sgml
@@ -21,6 +21,7 @@
 <!ENTITY indices    SYSTEM "indices.sgml">
 <!ENTITY json       SYSTEM "json.sgml">
 <!ENTITY mvcc       SYSTEM "mvcc.sgml">
+<!ENTITY nullvalues SYSTEM "nullvalues.sgml">
 <!ENTITY parallel   SYSTEM "parallel.sgml">
 <!ENTITY perform    SYSTEM "perform.sgml">
 <!ENTITY queries    SYSTEM "queries.sgml">
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index c67688cbf5f..324d6ca9fff 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -23790,7 +23790,8 @@ MERGE INTO products p
    This section describes the <acronym>SQL</acronym>-compliant subquery
    expressions available in <productname>PostgreSQL</productname>.
    All of the expression forms documented in this section return
-   Boolean (true/false) results.
+   <link linkend="nullvalues">three-valued</link> typed
+   results (true, false, or null).
   </para>
 
   <sect2 id="functions-subquery-exists">
@@ -23852,19 +23853,17 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>IN</token>
+   is <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result.
-   The result of <token>IN</token> is <quote>true</quote> if any equal subquery row is found.
-   The result is <quote>false</quote> if no equal row is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any equal subquery row is found.
+   The result is <quote>false</quote> if no equal row is found.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>IN</token> construct will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.
   </para>
 
   <para>
@@ -23881,21 +23880,18 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.
+   The result of <token>IN</token> is <quote>false</quote> if the subquery returns no rows,
+   otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result.
-   The result of <token>IN</token> is <quote>true</quote> if any equal subquery row is found.
-   The result is <quote>false</quote> if no equal row is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any equal subquery row is found.
+   The result is <quote>false</quote> if no equal row is found.
   </para>
 
   <para>
-   As usual, null values in the rows are combined per
-   the normal rules of SQL Boolean expressions.  Two rows are considered
-   equal if all their corresponding members are non-null and equal; the rows
-   are unequal if any corresponding members are non-null and unequal;
-   otherwise the result of that row comparison is unknown (null).
-   If all the per-row results are either unequal or null, with at least one
-   null, then the result of <token>IN</token> is null.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -23907,20 +23903,17 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 </synopsis>
 
   <para>
-   The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
-   is evaluated and compared to each row of the subquery result.
-   The result of <token>NOT IN</token> is <quote>true</quote> if only unequal subquery rows
-   are found (including the case where the subquery returns no rows).
+   The right-hand side is a parenthesized subquery, which must return exactly one column.
+   The result of <token>NOT IN</token> is <quote>true</quote> if the subquery returns no rows,
+   otherwise the left-hand expression is evaluated and compared to each row of the subquery result.
+   The result is <quote>true</quote> if only unequal subquery rows are found.
    The result is <quote>false</quote> if any equal row is found.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>NOT IN</token> construct will be null, not true.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
+   tests are OR'd together.
   </para>
 
   <para>
@@ -23937,21 +23930,18 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.
+   The result of <token>NOT IN</token> is <quote>true</quote> if the subquery returns no rows,
+   otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result.
-   The result of <token>NOT IN</token> is <quote>true</quote> if only unequal subquery rows
-   are found (including the case where the subquery returns no rows).
+   The result is <quote>true</quote> if only unequal subquery rows are found.
    The result is <quote>false</quote> if any equal row is found.
   </para>
 
   <para>
-   As usual, null values in the rows are combined per
-   the normal rules of SQL Boolean expressions.  Two rows are considered
-   equal if all their corresponding members are non-null and equal; the rows
-   are unequal if any corresponding members are non-null and unequal;
-   otherwise the result of that row comparison is unknown (null).
-   If all the per-row results are either unequal or null, with at least one
-   null, then the result of <token>NOT IN</token> is null.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -23965,13 +23955,13 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>ANY</token> is
+   <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ANY</token> is <quote>true</quote> if any true result is obtained.
-   The result is <quote>false</quote> if no true result is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any true result is obtained.
+   The result is <quote>false</quote> if no true result is found.
   </para>
 
   <para>
@@ -23980,11 +23970,10 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   </para>
 
   <para>
-   Note that if there are no successes and at least one right-hand row yields
-   null for the operator's result, the result of the <token>ANY</token> construct
-   will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -24002,16 +23991,19 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.  The result of <token>ANY</token> is
+   <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result,
    using the given <replaceable>operator</replaceable>.
-   The result of <token>ANY</token> is <quote>true</quote> if the comparison
-   returns true for any subquery row.
-   The result is <quote>false</quote> if the comparison returns false for every
-   subquery row (including the case where the subquery returns no
-   rows).
-   The result is NULL if no comparison with a subquery row returns true,
-   and at least one comparison returns NULL.
+   The result is <quote>true</quote> if the comparison returns true for any subquery row.
+   The result is <quote>false</quote> if the comparison returns false for every subquery row.
+  </para>
+
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are OR'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -24029,15 +24021,20 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>ALL</token> is
+   <quote>true</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ALL</token> is <quote>true</quote> if all rows yield true
-   (including the case where the subquery returns no rows).
+   The result is <quote>true</quote> if all rows yield true.
    The result is <quote>false</quote> if any false result is found.
-   The result is NULL if no comparison with a subquery row returns false,
-   and at least one comparison returns NULL.
+  </para>
+
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -24058,22 +24055,21 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.  The result of <token>ALL</token> is
+   <quote>true</quote> if the subquery returns no rows, otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result,
    using the given <replaceable>operator</replaceable>.
-   The result of <token>ALL</token> is <quote>true</quote> if the comparison
-   returns true for all subquery rows (including the
-   case where the subquery returns no rows).
-   The result is <quote>false</quote> if the comparison returns false for any
-   subquery row.
-   The result is NULL if no comparison with a subquery row returns false,
-   and at least one comparison returns NULL.
+   The result is <quote>true</quote> if the comparison returns true for all subquery rows.
+   The result is <quote>false</quote> if the comparison returns false for any subquery row.
   </para>
 
   <para>
-   See <xref linkend="row-wise-comparison"/> for details about the meaning
-   of a row constructor comparison.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
+
   </sect2>
 
   <sect2 id="functions-subquery-single-row-comp">
@@ -24098,6 +24094,14 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    compared row-wise to the single subquery result row.
   </para>
 
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, the result cannot be <quote>true</quote> in the
+   presence of null valued fields in either the row constructor or the subquery result row, as
+   the individual field tests are AND'd together.
+   Note that <literal>IS DISTINCT FROM</literal> is not an operator.
+  </para>
+
   <para>
    See <xref linkend="row-wise-comparison"/> for details about the meaning
    of a row constructor comparison.
@@ -24165,7 +24169,8 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    <productname>PostgreSQL</productname> extensions; the rest are
    <acronym>SQL</acronym>-compliant.
    All of the expression forms documented in this section return
-   Boolean (true/false) results.
+   <link linkend="nullvalues">three-valued</link> boolean typed
+   results (true, false, or null).
   </para>
 
   <sect2 id="functions-comparisons-in-scalar">
@@ -24178,24 +24183,13 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   <para>
    The right-hand side is a parenthesized list
    of expressions.  The result is <quote>true</quote> if the left-hand expression's
-   result is equal to any of the right-hand expressions.  This is a shorthand
-   notation for
-
-<synopsis>
-<replaceable>expression</replaceable> = <replaceable>value1</replaceable>
-OR
-<replaceable>expression</replaceable> = <replaceable>value2</replaceable>
-OR
-...
-</synopsis>
+   result is equal to any of the right-hand expressions.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand expression yields
-   null, the result of the <token>IN</token> construct will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence null values since the multiple equality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -24209,35 +24203,15 @@ OR
   <para>
    The right-hand side is a parenthesized list
    of expressions.  The result is <quote>true</quote> if the left-hand expression's
-   result is unequal to all of the right-hand expressions.  This is a shorthand
-   notation for
-
-<synopsis>
-<replaceable>expression</replaceable> &lt;&gt; <replaceable>value1</replaceable>
-AND
-<replaceable>expression</replaceable> &lt;&gt; <replaceable>value2</replaceable>
-AND
-...
-</synopsis>
+   result is unequal to all of the right-hand expressions.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand expression yields
-   null, the result of the <token>NOT IN</token> construct will be null, not true
-   as one might naively expect.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of null values since the multiple inequality
+   tests are OR'd together.
   </para>
 
-  <tip>
-  <para>
-   <literal>x NOT IN y</literal> is equivalent to <literal>NOT (x IN y)</literal> in all
-   cases.  However, null values are much more likely to trip up the novice when
-   working with <token>NOT IN</token> than when working with <token>IN</token>.
-   It is best to express your condition positively if possible.
-  </para>
-  </tip>
   </sect2>
 
   <sect2 id="functions-comparisons-any-some">
@@ -24250,30 +24224,26 @@ AND
 
   <para>
    The right-hand side is a parenthesized expression, which must yield an
-   array value.
-   The left-hand expression
+   array value. The result of <token>ANY</token> is
+   <quote>false</quote> if the array has zero element, otherwise
+   the left-hand expression
    is evaluated and compared to each element of the array using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ANY</token> is <quote>true</quote> if any true result is obtained.
-   The result is <quote>false</quote> if no true result is found (including the
-   case where the array has zero elements).
+   The result is <quote>true</quote> if any true result is obtained.
+   The result is <quote>false</quote> if no true result is found.
   </para>
 
   <para>
-   If the array expression yields a null array, the result of
-   <token>ANY</token> will be null.  If the left-hand expression yields null,
-   the result of <token>ANY</token> is ordinarily null (though a non-strict
-   comparison operator could possibly yield a different result).
-   Also, if the right-hand array contains any null elements and no true
-   comparison result is obtained, the result of <token>ANY</token>
-   will be null, not false (again, assuming a strict comparison operator).
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both elements and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
    <token>SOME</token> is a synonym for <token>ANY</token>.
+   <token>IN</token> is equivalent to <literal>= ANY</literal>.
   </para>
   </sect2>
 
@@ -24287,26 +24257,27 @@ AND
   <para>
    The right-hand side is a parenthesized expression, which must yield an
    array value.
-   The left-hand expression
+   The result of <token>ALL</token> is
+   <quote>true</quote> if the array has zero elements, otherwise
+   the left-hand expression
    is evaluated and compared to each element of the array using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ALL</token> is <quote>true</quote> if all comparisons yield true
-   (including the case where the array has zero elements).
+   The result is <quote>true</quote> if all comparisons yield true.
    The result is <quote>false</quote> if any false result is found.
   </para>
 
   <para>
-   If the array expression yields a null array, the result of
-   <token>ALL</token> will be null.  If the left-hand expression yields null,
-   the result of <token>ALL</token> is ordinarily null (though a non-strict
-   comparison operator could possibly yield a different result).
-   Also, if the right-hand array contains any null elements and no false
-   comparison result is obtained, the result of <token>ALL</token>
-   will be null, not true (again, assuming a strict comparison operator).
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both elements and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
+
+  <para>
+   <token>NOT IN</token> is equivalent to <literal>&lt;&gt; ALL</literal>.
+  </para>
+
   </sect2>
 
   <sect2 id="row-wise-comparison">
@@ -24357,6 +24328,11 @@ AND
    considered.
   </para>
 
+  <para>
+   See <xref linkend="nullvalues-multielementcomparison-rowconstructor"/>
+   and surrounding content for additional details and examples.
+  </para>
+
 <synopsis>
 <replaceable>row_constructor</replaceable> IS DISTINCT FROM <replaceable>row_constructor</replaceable>
 </synopsis>
@@ -24391,20 +24367,11 @@ AND
 </synopsis>
 
   <para>
-   The SQL specification requires row-wise comparison to return NULL if the
-   result depends on comparing two NULL values or a NULL and a non-NULL.
-   <productname>PostgreSQL</productname> does this only when comparing the
-   results of two row constructors (as in
-   <xref linkend="row-wise-comparison"/>) or comparing a row constructor
-   to the output of a subquery (as in <xref linkend="functions-subquery"/>).
-   In other contexts where two composite-type values are compared, two
-   NULL field values are considered equal, and a NULL is considered larger
-   than a non-NULL.  This is necessary in order to have consistent sorting
-   and indexing behavior for composite types.
-  </para>
-
-  <para>
-   Each side is evaluated and they are compared row-wise.  Composite type
+   Each side is evaluated and they are compared row-wise.
+   As discussed and shown in <xref linkend="nullvalues-multielementcomparison-composite"/>,
+   null values are treated as being equal to other null values and greater
+   than all non-null values.
+   Composite type
    comparisons are allowed when the <replaceable>operator</replaceable> is
    <literal>=</literal>,
    <literal>&lt;&gt;</literal>,
diff --git a/doc/src/sgml/json.sgml b/doc/src/sgml/json.sgml
index 206eadb8f7b..0f39d4bf21a 100644
--- a/doc/src/sgml/json.sgml
+++ b/doc/src/sgml/json.sgml
@@ -129,6 +129,11 @@
   the corresponding <productname>PostgreSQL</productname> types.
  </para>
 
+ <indexterm>
+  <primary>null value</primary>
+  <secondary sortas="json">within JSON</secondary>
+ </indexterm>
+
   <table id="json-type-mapping-table">
      <title>JSON Primitive Types and Corresponding <productname>PostgreSQL</productname> Types</title>
      <tgroup cols="3">
@@ -162,7 +167,7 @@
        <row>
         <entry><type>null</type></entry>
         <entry>(none)</entry>
-        <entry>SQL <literal>NULL</literal> is a different concept</entry>
+        <entry>An SQL null value is similar, but see <xref linkend="nullvalues-json"/> for differences.</entry>
        </row>
       </tbody>
      </tgroup>
diff --git a/doc/src/sgml/nullvalues.sgml b/doc/src/sgml/nullvalues.sgml
new file mode 100644
index 00000000000..53063f598ee
--- /dev/null
+++ b/doc/src/sgml/nullvalues.sgml
@@ -0,0 +1,1126 @@
+<!-- doc/src/sgml/nullvalues.sgml -->
+
+<sect1 id="nullvalues">
+ <title>Null Values Overview</title>
+
+ <indexterm>
+  <primary>null value</primary>
+ </indexterm>
+
+ <para>
+  This section first introduces the concept of null values and then
+  explains how different parts of the system behave when provided
+  one or more null value inputs.  Examples throughout this section
+  can be executed so long as the following table and rows are created first.
+ </para>
+
+ <para>
+  Throughout this section, the discussion of null values will be limited to
+  the SQL language unless otherwise noted.  The JSON-related data types, and the
+  non-SQL procedural languages, have their own behaviors documented in their
+  respective areas.
+ </para>
+
+ <para>
+  The following <literal>CREATE TABLE</literal> and <literal>INSERT</literal>
+  SQL commands can be executed in any SQL client to create and populate
+  the persistent table used in the examples below.  The <literal>\pset</literal>
+  commands require the use of <application>psql</application> as the client program;
+  they make the resulting output a bit easier to read and do not impact any behaviors
+  described herein.  Note, the examples below have been manually edited to show
+  <literal>true</literal> and <literal>false</literal> instead of
+  <literal>t</literal> and <literal>f</literal>.  They also omit any transactional
+  command output when transactions are used.  Instead, each transaction gets its own
+  display block.
+ </para>
+
+<programlisting>
+CREATE TABLE null_examples (
+  id bigint PRIMARY KEY,
+  value integer NULL
+);
+INSERT INTO null_examples
+VALUES (1, 1), (2, NULL), (3, 4);
+
+-- This makes null values print as \N in the output instead of the empty string.
+\pset null '\\N'
+-- Removes the row count footer that prints by default.
+\pset footer off
+</programlisting>
+
+ <sect2 id="nullvalues-model">
+  <title>Meaning</title>
+  <para>
+   Generally, a null value is assumed to mean "unknown", but other interpretations
+   are common.  A data model design may state that a null value
+   is to be used to represent "not applicable" - i.e., that a value is not
+   even possible.  The null value also takes on a literal meaning of "not found"
+   when produced as the result of an outer join.
+  </para>
+  <para>
+   In different programming languages, some of which are accessible in the server
+   as procedural languages, the null value is represented in other ways.
+   Of those included in <productname>PostgreSQL</productname>,
+   these are:
+   <literal>None</literal> in <productname>Python</productname>,
+   <literal>undefined</literal> in <productname>Perl</productname>,
+   and the empty string in <productname>TCL</productname>.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-usage">
+  <title>Usage</title>
+  <para>
+   A null value, like all values, must have a data type, and is valid for all data types.
+   It must also be printed as text.  This section discusses null values at the boundaries
+   of the system, as well as how they can come into existence due to the design of a query.
+  </para>
+  <sect3 id="nullvalues-usage-input">
+   <title>Null Value Input</title>
+   <para>
+    A null value can be used as input to any function, operator, or expression.
+    The system will then decide how to behave based on the rules described in the
+    rest of this section.
+   </para>
+   <para>
+    As noted in <xref linkend="sql-syntax-constants-nullvalue"/>,
+    a null value literal is written using the <literal>NULL</literal> keyword.
+    Its type is the <link linkend="datatype-pseudo">pseudo-type unknown</link>
+    but can be cast to any concrete data type.
+   </para>
+   <para>
+<programlisting>
+SELECT
+ NULL AS "Literal Null Value",
+ pg_typeof(null) AS "Type of Null",
+ pg_typeof(NULL::text) AS "Type of Cast Null",
+ cast(null as text) AS "Cast Null Value";
+</programlisting>
+<screen>
+ Literal Null Value | Type of Null | Type of Cast Null | Cast Null Value
+--------------------+--------------+-------------------+-----------------
+ \N                 | unknown      | text              | \N
+</screen>
+   </para>
+   <para>
+<programlisting>
+SELECT text NULL;
+</programlisting>
+<screen>
+ERROR:  column "text" does not exist
+LINE 1: select text NUll;
+</screen>
+   </para>
+   <para>
+    The <link linkend="sql-copy"><command>COPY ... FROM</command></link> command,
+    including its psql counter-part meta-command
+    <link linkend="app-psql-meta-commands-copy"><command>\copy</command></link>,
+    must deal with input files containing textual representations of the null value.
+    The lack of consistency in real-world data requires having a few options to the
+    command related to null handling.  See the documentation in
+    <xref linkend="sql-copy"/> for more information.
+    But, in short, for CSV input it expects text to be quoted and interprets an unquoted
+    empty string as the null value.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-tables">
+   <title>Null Values in Tables</title>
+   <para>
+    From a semantics perspective a table treats a null value like any other value.
+    However, the SQL Language recognizes its uniqueness by defining a column-scoped
+    <link linkend="nullvalues-table-constraints"><literal>NOT NULL</literal> constraint</link>
+    as syntactic sugar.  At present one would expect that a column having a
+    domain data type with a <literal>NOT NULL</literal> constraint would likewise be
+    incapable of having a null value stored.  This is not the case.  See the commentary
+    below in <xref linkend="nullvalues-domains"/> for more information.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-derived">
+   <title>Derived Null Values</title>
+   <para>
+    Even if all data stored in tables are known to be non-null, null values can still
+    be produced while executing a query.  The most common way this happens is by
+    introducing a (left) outer join to the query and having left side data without
+    corresponding data on the right side of the join.
+<programlisting>
+SELECT
+ countries.country,
+ flagships.flagship
+FROM (
+ VALUES ('Spain'), ('Switzerland')
+) as countries (country)
+LEFT JOIN (
+ VALUES ('Spain', 'Ship')
+) as flagships (country, flagship)
+ON countries.country = flagships.country;
+</programlisting>
+<screen>
+   country   | flagship
+-------------+----------
+ Spain       | Ship
+ Switzerland | \N
+</screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-output">
+   <title>Null Value Output</title>
+   <para>
+    As evidenced above, the "absence of value" aspect of the null value results
+    in its secondary textual representation being an empty string
+    (its primary representation is just NULL).
+    This can be problematic if the empty string is expected to be a valid value.
+    Therefore, places that deal with possible null values as input and text as
+    output need some means to give the user a way to specify how to print
+    the null value.
+   </para>
+   <para>
+    Generally, the primary representation is used when the value is part of a multi-element value.
+    If the value is being displayed by itself the secondary (blank) representation is used.  The settings
+    discussed herein typically control the secondary representation.  The null value representation when it
+    is within a container type (composite, array, etc...) is controlled by the input and output rules of the
+    container type.  It is when the container value itself is the null value that these generalities then apply.
+   </para>
+   <para>
+    No matter how the null value got into the result when presenting results to the user it is
+    necessary to present null values using text.  This is the responsibility of the client application.
+    The <command>psql</command> client program has the <link linkend="app-psql-meta-command-pset-null">
+    <literal>\pset null</literal> meta-command</link> to specify the textual output of null values
+    it encounters in query results.
+   </para>
+   <para>
+    When the final output of the result is a text file instead of a user additional
+    considerations come into play.  While the option to take the user presentation
+    and send it to a text file always exists <productname>PostgreSQL</productname> also
+    provides a facility to output a structured text file.
+    The <link linkend="sql-copy"><command>COPY ... TO</command></link> command,
+    including its psql counter-part meta-command
+    <link linkend="app-psql-meta-commands-copy"><command>\copy</command></link>,
+    has the <literal>NULL</literal> option (and some modifier options) to specify
+    the string to print to the output for null values it encounters in the query result.
+    As with input file processing, for the CSV format it will, by default,
+    produce an unquoted empty string for the null value.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-handling">
+   <title>Null Value Handling</title>
+   <para>
+    The presence of null values in the system results in three-valued logic.
+    In conventional two-valued (binary) logic every outcome is either true or false.
+    In three-valued logic the concept of unknown, represented using the null value, is
+    also an outcome.  This results in falsifying the common-sense notion
+    that "p OR NOT p" is always true.
+<programlisting>
+SELECT
+ NULL OR NOT NULL AS "N OR !N";
+</programlisting>
+<screen>
+ N OR !N
+---------
+ \N
+</screen>
+    (See <xref linkend="nullvalues-operands"/> for more explanation.)
+   </para>
+   <para>
+    When dealing with null values it is often useful to explicitly to convert
+    data to and from a null value given a known non-null representation
+    (e.g., the empty string, the numbers 0 or 1, or boolean false).
+    The <link linkend="functions-coalesce-nvl-ifnull">COALESCE</link> and
+    <link linkend="functions-nullif">NULLIF</link> functions are useful
+    for this purpose.
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-cardinalrule">
+  <title>Distinctness - Overcoming the Cardinal Rule of Null Values</title>
+  <para>
+   The cardinal rule, a null value is
+   <link linkend="functions-comparison-op-table">
+    neither equal nor unequal
+   </link>
+   to any value, including other null values.
+<programlisting>
+SELECT
+ NULL = NULL AS "N = N",
+ NULL != NULL AS "N != N",
+ 1 = NULL AS "1 = N",
+ 1 != NULL AS "1 != N",
+ 1 = 1 AS "1 = 1",
+ 1 != 1 AS "1 != 1";
+</programlisting>
+<screen>
+ N = N | N != N | 1 = N | 1 != N | 1 = 1 | 1 != 1
+-------+--------+-------+--------+-------+--------
+ \N    | \N     | \N    | \N     | true  | false
+</screen>
+   However, as with many rules, there are exceptions, as noted in
+   <xref linkend="nullvalues-multielementcomparison"/>.
+   Particularly, when the two compared values are part of a larger multi-element value.
+<programlisting>
+SELECT
+ array[1,2]=array[1,null] AS "Array Equals";
+</programlisting>
+<screen>
+ Array Equals
+--------------
+ false
+</screen>
+  </para>
+  <para>
+   Because of this SQL standard rule, checking for a null value has an
+   explicit <literal>IS NULL</literal> predicate.  Additionally, there are comparison
+   predicates that consider a null value equal to other null values but unequal
+   to any other value (e.g., <literal>IS DISTINCT</literal>, and <literal>IS TRUE</literal>.)
+   These, and other predicates, are described in
+   <xref linkend="functions-comparison-pred-table"/>
+<programlisting>
+SELECT id, value,
+ value IS NULL AS "IS NULL",
+ value IS DISTINCT FROM id AS "IS DIST",
+ value != id AS "IS !="
+FROM null_examples;
+</programlisting>
+<screen>
+ id | value | IS NULL | IS DIST | IS !=
+----+-------+---------+---------+-------
+  1 |     1 | false   | false   | false
+  2 |    \N | true    | true    | \N
+  3 |     4 | false   | true    | true
+</screen>
+  </para>
+  <para>
+   On the other hand, the SQL standard is largely alone in taking this approach to comparing
+   values to the null value.  For example, when working within the JSON data types the use of equals
+   produces true or false and so the concept of distinctness is neither present nor required.
+   Additional details and links are provided in <xref linkend="nullvalues-json"/>.
+   For the non-SQL procedural languages, please consult the appropriate documentation.
+  </para>
+  <para>
+   There is also a cardinal warning: when dealing with
+   <link linkend="rowtypes">composite types</link> in
+   expressions, <literal>composite IS NULL</literal>
+   and <literal>composite IS NOT NULL</literal>
+   are not the opposites of each other in the case where some,
+   but not all, of the composite's fields are null values.
+   (The case where all fields are null is indistinguishable
+   from the composite as a whole being null.)
+   Write <literal>NOT(composite IS NULL)</literal> instead.
+<programlisting>
+SELECT
+ c,
+ c IS NULL AS "c IS N",
+ NOT(c IS NULL) AS "NOT c IS N",
+ c IS NOT NULL AS "c IS NOT N",
+ ROW(value, value) IS NULL AS "ROW(v,v) IS N",
+ ROW(value, value) IS NOT NULL AS "ROW(v,v) IS NOT N"
+FROM null_examples AS c;
+</programlisting>
+<screen>
+   c   | c IS N | NOT c IS N | c IS NOT N | ROW(v,v) IS N | ROW(v,v) IS NOT N
+-------+--------+------------+------------+---------------+-------------------
+ (1,1) | false  | true       | true       | false         | true
+ (2,)  | false  | true       | false      | true          | false
+ (3,4) | false  | true       | true       | false         | true
+</screen>
+   See <xref linkend="nullvalues-multielement"/> below for an explanation.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-operands">
+  <title>Null-Valued Operands</title>
+  <para>
+   As a general expectation, operator invocation expressions where one of the inputs
+   is a null value will result in a null-valued output.
+<programlisting>
+SELECT
+ 1 + null AS "Add",
+ 'text' || null AS "Concatenate";
+</programlisting>
+<screen>
+ Add | Concatenate
+-----+-------------
+  \N | \N
+</screen>
+   Operators that behave otherwise should document their deviation from this norm.
+  </para>
+  <para>
+   A notable example is the <literal>IN</literal> operator, which
+   uses equality, not distinctness, for testing.
+<programlisting>
+SELECT
+ 1 IN (1, null) AS "In Present",
+ 1 IN (2, null) AS "In Missing",
+ null IN (1, 2) AS "N In Non-N",
+ null IN (null, 2) AS "N In N";
+</programlisting>
+<screen>
+ In Present | In Missing | N In Non-N | N In N
+------------+------------+------------+--------
+ true       | \N         | \N         | \N
+</screen>
+   This is just an extension of the multi-element testing behavior described in
+   <xref linkend="nullvalues-multielement"/>.
+  </para>
+  <para>
+   Experience shows that <literal>CASE</literal> expressions are also prone
+   to bugs since their format encourages binary logic thinking while a
+   <literal>WHEN</literal> test will not consider a null value to be a match.
+<programlisting>
+SELECT id, value,
+ CASE WHEN id = value THEN 'Equal' ELSE 'Not Equal' END AS "Affirm",
+ CASE WHEN id != value THEN 'Not Equal' ELSE 'Equal' END AS "Negate",
+ CASE WHEN value IS NULL THEN 'Null'
+      WHEN id = value THEN 'Equal'
+      ELSE 'Not Equal' END AS "Safe Affirm",
+ CASE WHEN value IS NULL THEN 'Null'
+      WHEN id != value THEN 'Not Equal'
+      ELSE 'Equal' END AS "Safe Negate"
+FROM null_examples;
+</programlisting>
+<screen>
+ id | value |  Affirm   |  Negate   | Safe Affirm | Safe Negate
+----+-------+-----------+-----------+-------------+-------------
+  1 |     1 | Equal     | Equal     | Equal       | Equal
+  2 |    \N | Not Equal | Equal     | Null        | Null
+  3 |     4 | Not Equal | Not Equal | Not Equal   | Not Equal
+</screen>
+  </para>
+  <para>
+   The boolean operators <literal>AND</literal> and <literal>OR</literal>
+   will ignore the null value input if the other input is sufficient to
+   determine the outcome.
+<programlisting>
+SELECT
+ true OR null AS "T or N",
+ false OR null AS "F or N",
+ true AND null AS "T and N",
+ false AND null AS "F and N";
+</programlisting>
+<screen>
+ T or N | F or N | T and N | F and N
+--------+--------+---------+---------
+ true   | \N     | \N      | false
+</screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-domains">
+  <title>Null Values in Domains</title>
+  <para>
+   A domain is a user-defined data type that can have a <literal>NOT NULL</literal>
+   constraint.  However, some usages of domains can still cause a column to be of the
+   domain type but some value may be null.  The common way this happens is by including
+   the domain column's table on the right side of a left join.
+<programlisting>
+BEGIN;
+CREATE DOMAIN domain_example AS integer NOT NULL;
+CREATE TABLE domain_examples (de_id bigint PRIMARY KEY, de_value domain_example);
+INSERT INTO domain_examples VALUES (1, 1), (2, 2);
+SELECT *, pg_typeof(de_value)
+FROM null_examples AS ne
+LEFT JOIN domain_examples AS de ON ne.id = de.de_id;
+ROLLBACK;
+</programlisting>
+<screen>
+BEGIN
+CREATE DOMAIN
+CREATE TABLE
+INSERT 0 2
+ id | value | de_id | de_value |   pg_typeof
+----+-------+-------+----------+----------------
+  1 |     1 |     1 |        1 | domain_example
+  2 |    \N |     2 |        2 | domain_example
+  3 |     4 |    \N |       \N | domain_example
+
+ROLLBACK
+</screen>
+   Please see the details in <xref linkend="sql-createdomain-notes"/>
+   for another example, as well as commentary on why this non-standard behavior exists.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-multielement">
+  <title>Testing Multi-Element Values with Null-Valued Elements</title>
+  <para>
+   Arrays and composite types are multi-element types.  Here we also consider non-empty
+   <link linkend="functions-subquery">subquery results</link>
+   and the list of values (i.e., the multiset) specified in the
+   <link linkend="functions-comparisons-in-scalar">IN test</link>.
+  </para>
+  <para>
+   When a test is performed on one of these multi-element values
+   the system will iterate over each element, (or pair of elements if the test is
+   <link linkend="row-wise-comparison">comparing two row constructors</link> to each other),
+   left-to-right, combining the results using the boolean operations described in
+   <xref linkend="nullvalues-operands"/>. For tests that
+   require an exhaustive search, (e.g., <literal>ALL</literal>, <literal>NOT IN</literal>)
+   the search effectively ends when a false result is found (<literal>AND</literal> combiners).
+   For tests that require a true result, (e.g., <literal>ANY</literal>,
+   <literal>IN</literal>) the search effectively ends when a true result is found
+   (<literal>OR</literal> combiners). Therefore:
+   <simplelist>
+    <member>
+     <literal>IN</literal> and <literal>ANY</literal>
+     (<literal>OR</literal>) cannot produce a false result in the presence of null, and
+    </member>
+    <member>
+     <literal>NOT IN</literal> and <literal>ALL</literal>
+     (<literal>AND</literal>) cannot produce a true result in the presence of null.
+    </member>
+   </simplelist>
+   This is because any exhaustive search will produce at least one null value result
+   that cannot be ignored.
+  </para>
+  <para>
+   The SQL standard requires that non-exhaustive
+   (i.e., <literal>IN</literal> and <literal>ANY</literal>) subquery tests
+   return false when there are no rows in the subquery result, and return true
+   for the exhaustive tests (i.e., <literal>NOT IN</literal> and <literal>ALL</literal>).
+  </para>
+  <para>
+   Note that the cardinal warning
+   noted in <xref linkend="nullvalues-cardinalrule"/> above is just the application of this behavior to the
+   <literal>IS NULL</literal> and <literal>IS NOT NULL</literal>
+   tests, which are both exhaustive search tests guaranteed to produce at least one false result
+   when the composite has a mix of null and non-null values.
+  </para>
+  <para>
+   In the next section, the rules above are discussed.
+   <xref linkend="nullvalues-multielementpredicates"/>
+   discusses situations where a predicate or a scalar value
+   are being compared to a multi-element value.
+   In <xref linkend="nullvalues-multielementcomparison"/>
+   the rules when two multi-element values are compared
+   to each other are discussed
+   (including the two row constructor comparison case.)
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-multielementpredicates">
+  <title>Multi-Element Predicates and Scalars</title>
+  <sect3 id="nullvalues-multielementpredicates-composites">
+   <title>Composite Fields</title>
+   <para>
+    When a composite typed value is created, a null value can be assigned to any
+    of its fields (see <xref linkend="rowtypes-constructing"/> for how to do this).
+    So long as at least one field is non-null the composite value
+    as a whole exists and an <literal>IS NULL</literal> predicate will return false.
+   </para>
+   <para>
+    Applying the <literal>IS NOT NULL</literal> predicate to a composite value performs
+    checks on whether all fields of the composite have non-null values.  This is not the same
+    as a non-null composite value.  Specifically, if the composite value has
+    a null-valued field then both the <literal>IS NOT NULL</literal> predicate and the
+    <literal>IS NULL</literal> predicate will return false.
+<programlisting>
+SELECT
+ ROW(1,2) IS NULL AS "Row Is Null",
+ ROW(1,2) IS NOT NULL AS "Row Is Not Null",
+ ROW(1,NULL) IS NULL AS "Row Is Null",
+ ROW(1,NULL) IS NOT NULL AS "Row Is Not Null";
+</programlisting>
+<screen>
+ Row Is Null | Row Is Not Null | Row Is Null | Row Is Not Null
+-------------+-----------------+-------------+-----------------
+ false       | true            | false       | false
+</screen>
+   </para>
+   <para>
+    Please read <xref linkend="composite-type-comparison"/> for a complete treatment
+    on how <productname>PostgreSQL</productname> handles row-wise comparison.  The
+    next two multi-element related items in this section discuss those comparisons in the
+    presence of null-valued fields, and also in terms of the SQL standard.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementpredicates-arrays">
+   <title>Array Elements and IN Multiset Members</title>
+   <para>
+    Examples of applying the behavior discussed in <xref linkend="nullvalues-multielement"/>
+    to arrays, and <literal>IN</literal> and <literal>NOT IN</literal> multisets, using the
+    operators defined in <xref linkend="functions-comparisons"/>.  The following examples produce
+    the same results when swapping <literal>IN</literal>/<literal>ANY</literal>
+    and also <literal>NOT IN</literal>/<literal>ALL</literal>, plus transforming the multiset/array format.
+    I.e., the exhaustive and non-exhaustive pairs noted in <xref linkend="nullvalues-multielement"/>.
+   </para>
+   <para>
+<programlisting>
+SELECT
+ 1 = ANY(array[1, 1, NULL]) AS "Any-Null-Match",
+ 1 = ANY(array[1, 1]) AS "Any-NoNull-Match",
+ 1 = ALL(array[1, 1, NULL]) AS "ALL-Null-Match",
+ 1 = ALL(array[1, 1]) AS "All-NoNull-Match";
+SELECT
+ 2 IN (1, 1, NULL) AS "IN-Null-Negative",
+ 2 IN (1, 1) AS "IN-NoNull-Negative",
+ 2 NOT IN (2, 2, NULL) AS "NotIN-Null-Negative",
+ 2 NOT IN (2, 2) AS "NotIN-NoNull-Negative";
+</programlisting>
+<screen>
+ Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+----------------+------------------+----------------+------------------
+ true           | true             | \N             | true
+
+ IN-Null-Negative | IN-NoNull-Negative | NotIN-Null-Negative | NotIN-NoNull-Negative
+------------------+--------------------+---------------------+-----------------------
+ \N               | false              | false               | false
+</screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementpredicates-subqueries">
+   <title>Single-Column Subquery Rows</title>
+   <para>
+    The following examples demonstrate the behavior discussed in
+    <xref linkend="nullvalues-multielement"/>
+    applied to subqueries using the operators defined in <xref linkend="functions-subquery"/>.
+    Here we cover the case where the multiple elements being checked are rows, each having one column.
+    If the column itself is multi-element then the thing being searched for must be a compatible
+    multi-element value, and the corresponding comparison behavior described in
+    <xref linkend="nullvalues-multielementcomparison"/> will also be applied.
+   </para>
+   <para>
+<programlisting>
+SELECT
+ 1 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-Match",
+ 1 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-Match",
+ 1 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-Match",
+ 1 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-Match";
+SELECT
+ 2 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-NoMatch",
+ 2 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-NoMatch",
+ 2 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-NoMatch",
+ 2 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-NoMatch";
+</programlisting>
+<screen>
+ Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+----------------+------------------+----------------+------------------
+ true           | true             | \N             | true
+
+ Any-Null-NoMatch | Any-NoNull-NoMatch | ALL-Null-NoMatch | All-NoNull-NoMatch
+------------------+--------------------+------------------+--------------------
+ \N               | false              | false            | false
+</screen>
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-multielementcomparison">
+  <title>Multi-Element Comparisons</title>
+  <para>
+   The previous section, <xref linkend="nullvalues-multielementpredicates"/>, discussed applying
+   a predicate or a scalar value check element-wise across a multi-element value.
+   This section moves the discussion over to comparing two multi-element values to each other.
+   As both array and composite typed values
+   can be stored within an index, and comparing two values in that context must not produce
+   a null-valued result, considerations are made to adhere to the SQL standard where
+   possible while still making indexes, which the specification is silent on, functional.
+   Specifically, except when comparing two row constructors, null values are considered
+   equal to other null values and greater than all non-null values.
+  </para>
+  <para>
+   There are five pair-wise comparison situations to consider:
+   element-wise when the inputs are arrays, and row-wise when the inputs can be either
+   row constructors or composite typed values.  While these four later combinations seem similar,
+   the fact that row constructors are query literals, while composite typed values can be stored,
+   brings about important differences in how they are treated.  Please read
+   <xref linkend="composite-type-comparison"/> for a fuller treatment of this topic.  Here
+   we briefly recap the five situations in the presence of null values.
+  </para>
+  <sect3 id="nullvalues-multielementcomparison-array">
+   <title>Element-wise Comparisons</title>
+   <para>
+    In this first situation, null values within an array compare as equal to each other and greater
+    than all non-null values, regardless of whether the comparison involves
+    <link linkend="sql-syntax-array-constructors">array constructors</link> or array-typed values.
+<programlisting>
+SELECT
+ array[1,2]=array[1,null] AS "Constructors",
+ s, t,
+ s = t AS "Stored Equality",
+ t &gt; s AS "Stored Ordering"
+FROM
+(values (array[1,2])) AS sv (s),
+(values (array[1,null::integer])) AS st (t);
+</programlisting>
+<screen>
+ Constructors |   s   |    t     | Stored Equality | Stored Ordering
+--------------+-------+----------+-----------------+-----------------
+ false        | {1,2} | {1,NULL} | false           | true
+</screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-rowconstructor">
+   <title>Row-wise Mutual Row Constructor Comparisons</title>
+   <para>
+    In this situation, null values produce unknown when compared to all values.
+<programlisting>
+SELECT
+ (1,2)=(1,null) AS "NonNull=Null",
+ (1,null::integer)=(1,null) AS "Null=Null";
+</programlisting>
+<screen>
+ NonNull=Null | Null=Null
+--------------+-----------
+ \N           | \N
+</screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-composite">
+   <title>Row-wise Composite Involved Comparisons</title>
+   <para>
+    In these three situations, null values are considered equal to each other and greater than
+    all non-null valueS.
+   </para>
+<programlisting>
+SELECT s, t,
+ s = t AS "Stored Equals Stored",
+ t &lt; (1,2) AS "Stored LT Constructor",
+ t = (1,null::integer) AS "Stored Equals Constructor"
+FROM
+ (values (1,2)) AS s,
+ (values (1,null::integer)) AS t;
+</programlisting>
+<screen>
+   s   |  t   | Stored Equals Stored | Stored LT Constructor | Stored Equals Constructor
+-------+------+----------------------+-----------------------+---------------------------
+ (1,2) | (1,) | false                | false                 | true
+</screen>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-sqlconformance">
+   <title>SQL Standard Conformance</title>
+   <para>
+    The SQL standard requires row-wise comparison to return NULL if the
+    result depends on comparing two NULL values or a NULL and a non-NULL.
+    <productname>PostgreSQL</productname> does this only when comparing the
+    results of two row constructors (as in
+    <xref linkend="row-wise-comparison"/>) or comparing a row constructor
+    to the output of a subquery (as in <xref linkend="functions-subquery"/>).
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-functions">
+  <title>Null-Valued Arguments in Normal Function Calls</title>
+  <para>
+   <link linkend="sql-createfunction">Function specifications</link>
+   have a "strictness" attribute (<literal>pg_proc.proisstrict</literal>) that,
+   when set to "strict" (true) will tell the executor to return a null value for any
+   function call having at least one null-valued input, without executing the
+   function.
+  </para>
+  <para>
+   Most functions, especially single argument functions, are defined with strict because without
+   non-null values to act upon they cannot produce a meaningful result.  However, for multi-argument
+   functions, especially <link linkend="xfunc-sql-variadic-functions">variadic functions</link>
+   like concatenate, null values often are ignored.
+   This can be different than the choice made by a binary operator performing the same function,
+   like for concatenating text, but not always, like concatenating an element onto an array.
+<programlisting>
+SELECT
+ lower(null::text) AS "Lower",
+ left('text', null) AS "Left",
+ 'one' || null AS "|| Text Op",
+ concat('one', null) AS "concat Text Func",
+ array_append(array[1], null) AS "append([], null)",
+ array[1]::integer[] || null::integer AS "[] || null",
+ array[1]::integer[] || null::integer[] AS "[] || null[]";
+</programlisting>
+<screen>
+ Lower | Left | || Text Op | concat Text Func | append([], null) | [] || null | [] || null[]
+-------+------+------------+------------------+------------------+------------+--------------
+ \N    | \N   | \N         | one              | {1,NULL}         | {1,NULL}   | {1}
+</screen>
+   In short, please read the documentation for the functions you use if they may receive null inputs
+   to understand how they will behave.  Send a documentation comment pointing out any functions
+   that do not behave strictly but whose actual behavior in the presence of null-valued input
+   is not described or readily inferred.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-aggregates">
+  <title>Null-Valued Arguments in Aggregate and Window Functions</title>
+  <para>
+   When executing an aggregate or window function the state tracking component
+   (which may be initialized to a non-null value, e.g., 0 for the count function)
+   will remain unchanged even if the underlying processing
+   function returns a null value, whether from being defined strict
+   or it returns a null value upon execution.  The aggregation
+   routine will usually ignore the null value and continue processing,
+   as demonstrated in <literal>count(value)</literal> below.
+<programlisting>
+SELECT
+ count(*) AS "Count",
+ count(value) AS "Count Value",
+ count(null_examples) AS "Count Composite",
+ count(row(value, value)) AS "Count Row"
+FROM null_examples;
+</programlisting>
+<screen>
+ Count | Count Value | Count Composite | Count Row
+-------+-------------+-----------------+-----------
+     3 |           2 |               3 |         3
+</screen>
+   Notice the "Count Row" outcome, though.  While we noted in the cardinal warning
+   that a composite whose fields are all null values is indistinguishable from
+   a null value of composite type, the count aggregate does indeed distinguish them,
+   recognizing and counting the non-null composite value produced by the
+   <link linkend="sql-syntax-row-constructors">row constructor</link>
+   <literal>row(null, null)</literal>.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-filtering">
+  <title>Null Values When Filtering</title>
+  <para>
+   A <literal>WHERE</literal> clause that evaluates to a null value for a given row will exclude that row.
+   Note below that, due to tri-valued logic described in <xref linkend="nullvalues-cardinalrule"/>,
+   the row with an id of 2 is not included in either of the first two results.  The third result, using
+   <literal>IS NULL</literal>, finds that row.
+<programlisting>
+SELECT id, value AS "Equals 1"
+FROM null_examples
+WHERE value = 1;
+
+SELECT id, value AS "Not Equal to 1"
+FROM null_examples
+WHERE value != 1;
+
+SELECT id, value AS "IS NULL"
+FROM null_examples
+WHERE value IS NULL;
+</programlisting>
+<screen>
+ id | Equals 1
+----+----------
+  1 |        1
+
+ id | Not Equal to 1
+----+----------------
+  3 |              4
+
+ id | IS NULL
+----+---------
+  2 |      \N
+</screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-table-constraints">
+  <title>Null Values in Table Constraints</title>
+  <para>
+   It is possible to define
+   <link linkend="ddl-constraints-check-constraints">check constraint</link>
+   expressions on tables to ensure only values passing those expressions are inserted.
+   While this seems like it would behave the same as a where clause, the choice here,
+   when an expression evaluates to a null value, is to allow the row to be inserted
+   - the same as a true result.
+<programlisting>
+BEGIN;
+ALTER TABLE null_examples ADD CONSTRAINT value_not_1 CHECK (value != 1);
+ROLLBACK;
+</programlisting>
+<screen>
+ERROR:  check constraint "value_not_1" of relation "null_examples" is violated by some row
+</screen>
+<programlisting>
+BEGIN;
+ALTER TABLE null_examples ADD CONSTRAINT value_not_10 CHECK (value != 10);
+ROLLBACK;
+</programlisting>
+<screen>
+ALTER TABLE
+</screen>
+   We are using a transaction (<command>BEGIN</command> and <command>ROLLBACK</command>) and
+   the <command>ALTER TABLE</command> command to add two constraints to our null_examples table.
+   The first constraint prohibits rows with a value of 1, which our row with an id of 1 violates.
+   Prohibiting the value 10 definitely allows rows with ids 1 and 3 to exist, and since we are
+   not told that some row violates our constraint the null value in the row with id 2 is being
+   accepted as well.
+  </para>
+  <para>
+   The <link linkend="ddl-constraints-not-null"><literal>NOT NULL</literal> column constraint</link>
+   produces the same answer as a <literal>column IS NOT NULL</literal> check constraint but is
+   more concise to write.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-grouping">
+  <title>Null Values When Grouping</title>
+  <para>
+   In the context of both <literal>DISTINCT</literal> and <literal>GROUP BY</literal>
+   it is necessary that all inputs resolve to being either equal to or not equal to all
+   other values.  These features use <link linkend="nullvalues-cardinalrule">distinctness</link>
+   instead of simple equality in order to handle a null value like a definite value equal to
+   another null value and unequal to all other values.
+<programlisting>
+WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+SELECT
+ value,
+ count(*) AS "Count"
+FROM vals
+GROUP BY value
+ORDER BY value;
+</programlisting>
+<screen>
+ value | Count
+-------+-------
+     1 |     2
+     2 |     1
+    \N |     2
+</screen>
+<programlisting>
+WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+SELECT DISTINCT value
+FROM vals
+ORDER BY value NULLS FIRST;
+</programlisting>
+<screen>
+ value
+-------
+    \N
+     1
+     2
+</screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-ordering">
+  <title>Null Values When Ordering</title>
+  <para>
+   In the context of <literal>ORDER BY</literal>, distinctness rules also apply,
+   though this is insufficient since it must be determined whether or not to
+   present null values before or after all non-null values.  To handle
+   this, the <literal>ORDER BY</literal> clause will let you specify either
+   <literal>NULLS FIRST</literal> or <literal>NULLS LAST</literal>.
+<programlisting>
+WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+SELECT value FROM vals
+ORDER BY value DESC NULLS FIRST;
+</programlisting>
+<screen>
+ value
+-------
+    \N
+    \N
+     2
+     1
+     1
+</screen>
+  </para>
+  <para>
+   Note that when dealing with multi-element values the comparison behavior described in
+   <xref linkend="nullvalues-multielementcomparison"/> applies:
+   if the comparison determination rests upon comparing a null value to a non-null value,
+   the multi-element value with the null-valued component will sort greater than the one
+   with a non-null component.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-indexed">
+  <title>Null Values in Indexes</title>
+  <para>
+   The uniqueness and relative ordering rules applied to null values
+   are defined when creating an index.  For the default
+   <literal>NULLS DISTINCT</literal> uniqueness, equality rules are applied.
+   Specifying <literal>NULLS NOT DISTINCT</literal> will result in
+   <literal>IS DISTINCT FROM</literal> rules being applied whereby all null
+   values are equal to each other.  This setting applies to all columns in the index.
+  </para>
+  <para>
+<programlisting>
+BEGIN;
+CREATE UNIQUE INDEX value_nulls_distinct_implicit ON null_examples (value);
+CREATE UNIQUE INDEX value_nulls_distinct_explicit ON null_examples (value) NULLS DISTINCT;
+INSERT INTO null_examples VALUES (4, NULL);
+ROLLBACK;
+</programlisting>
+<screen>
+CREATE INDEX
+CREATE INDEX
+INSERT 0 1
+</screen>
+<programlisting>
+BEGIN;
+CREATE UNIQUE INDEX value_nulls_not_distinct_explicit ON null_examples (value) NULLS NOT DISTINCT;
+INSERT INTO null_examples VALUES (4, NULL);
+ROLLBACK;
+</programlisting>
+<screen>
+CREATE INDEX
+ERROR:  duplicate key value violates unique constraint "value_nulls_not_distinct_explicit"
+DETAIL:  Key (value)=(null) already exists.
+</screen>
+  </para>
+  <para>
+   For ordering, each column in the index gets its own specification of
+   direction and null value placement similar to that found in the
+   <literal>ORDER BY</literal> clause.
+  </para>
+  <para>
+   Note that when dealing with multi-element values the comparison behavior described in
+   <xref linkend="nullvalues-multielementcomparison"/> applies,
+   if the comparison determination rests upon comparing a null value to a non-null value
+   the multi-element value with the null-valued component will sort greater than the one
+   with a non-null component.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-partitionkeys">
+  <title>Null Values in Partition Keys</title>
+  <para>
+   Presently, <productname>PostgreSQL</productname> requires that all the columns of a
+   partition key be included in the primary key.  Furthermore, all columns used in a primary
+   key must have a not-null column constraint applied to them.  Therefore, any partitioned table
+   with a primary key will only have non-null values in the partition key columns.
+  </para>
+  <para>
+   However, should you set up a situation where a partition key column can both: have a null value
+   and, null values in that key go to a specific partition, list-based routing will work as expected.
+   There is presently no way to direct rows having null values in partition keys away from the
+   default partition for range and hash partitioning.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-settings">
+  <title>Null-Valued Settings</title>
+  <para>
+   The value of a setting known to the system will never be null.  There is a bit of confusion
+   because the <function>current_setting</function> function has an operating mode where instead
+   of provoking an error when retrieving the value of a setting not known to the system it will
+   instead return a null value.  This null value should not be considered the value of the setting
+   but an error indicator.
+<programlisting>
+SELECT current_setting('example.string', false);
+SELECT current_setting('example.string', true);
+</programlisting>
+<screen>
+unrecognized configuration parameter "example.string"
+ current_setting
+-----------------
+ \N
+</screen>
+   The next paragraph discusses the corner case behavior when this
+   suggestion is not heeded.
+  </para>
+  <para>
+   The corner case mentioned above is only meaningful for
+   <link linkend="runtime-config-custom">custom settings</link>,
+   thus this section focuses on <link linkend="config-setting-sql">SQL interaction</link>.
+   Unlike settings created by extensions, custom settings can only be textual and the default
+   value for text here is the empty string.
+<programlisting>
+-- The transaction markers are left here to emphasize the rollback behavior.
+SHOW example.string;
+BEGIN;
+SELECT set_config('example.string', NULL, true);
+SELECT current_setting('example.string') IS NULL AS "Setting Is Null";
+ROLLBACK;
+SHOW example.string;
+RESET example.string;
+SHOW example.string;
+</programlisting>
+<screen>
+ERROR:  unrecognized configuration parameter "example.string"
+BEGIN
+ set_config
+------------
+
+
+ Setting Is Null
+-----------------
+ false
+
+ROLLBACK
+ example.string
+----------------
+
+
+RESET
+ example.string
+----------------
+
+</screen>
+   Notice two important behaviors: first, even though we passed in a null value to
+   the <literal>set_config</literal> function, the <literal>current_setting</literal>
+   function returned a non-null value, specifically the empty string.  Second, after ROLLBACK the
+   setting is still present (i.e., the error seen before creating the setting no longer appears),
+   and in fact will remain so until the session ends
+   (i.e., RESET does not restore the non-existence state.)
+  </para>
+  <para>
+    The other ways to specify settings do allow for null values;
+    a specific non-null value is required as part of the setting specification.
+   </para>
+ </sect2>
+
+ <sect2 id="nullvalues-json">
+  <title>Null Values in JSON</title>
+  <para>
+   As noted in <xref linkend="json-type-mapping-table"/>, the JSON specification's
+   null value is assigned its own type having a single constant value which can be
+   compared to all other JSON types with the expected non-null boolean result.
+   A consequence of this definition is that an SQL json or jsonb type containing
+   a JSON null value is seen as non-null in SQL.
+   (Note, while in SQL the capitalization of NULL is unimportant -
+   all-caps is just convention - JSON requires lowercase.)
+<programlisting>
+SELECT 'null'::json IS NULL AS "JSON null is NULL";
+</programlisting>
+<screen>
+ JSON null is NULL
+-------------------
+ false
+</screen>
+   Additionally, the SQL operators and functions involving JSON key or array element selection,
+   or construction from literals, require that a valid number or text value be supplied as an operand
+   and so an SQL null value cannot be targeted by those operators and functions.
+<programlisting>
+ SELECT to_json(null::text);
+</programlisting>
+<screen>
+ to_json
+---------
+ \N
+</screen>
+   That all said, the system will convert an SQL null value to a JSON null value when in a
+   composite type context.
+<programlisting>
+SELECT json_build_object('value', value)
+FROM null_examples;
+</programlisting>
+<screen>
+ json_build_object
+-------------------
+ {"value" : 1}
+ {"value" : null}
+ {"value" : 4}
+</screen>
+   And vice versa.
+<programlisting>
+SELECT *
+FROM jsonb_to_recordset('[{"value":1},{"value":null},{"value":4}]'::jsonb) AS jtr (value integer);
+</programlisting>
+<screen>
+ value
+-------
+     1
+    \N
+     4
+</screen>
+   Or when a simple scalar JSON null is cast to an SQL type.
+<programlisting>
+SELECT 'null'::jsonb::numeric IS NULL AS "Cast jsonb NULL to SQL NULL";
+</programlisting>
+<screen>
+ Cast jsonb NULL to SQL NULL
+-----------------------------
+ true
+</screen>
+  </para>
+  <para>
+   Aspects of null value handling within the internals of the JSON-related types are discussed
+   in <xref linkend="datatype-json"/>,
+   particularly in <xref linkend="datatype-jsonpath"/>.
+   This section is focused on how SQL null values are related to JSON null values.
+  </para>
+ </sect2>
+</sect1>
diff --git a/doc/src/sgml/ref/create_domain.sgml b/doc/src/sgml/ref/create_domain.sgml
index c111285a69c..0240f75f3cf 100644
--- a/doc/src/sgml/ref/create_domain.sgml
+++ b/doc/src/sgml/ref/create_domain.sgml
@@ -197,9 +197,10 @@ CREATE DOMAIN <replaceable class="parameter">name</replaceable> [ AS ] <replacea
    Domain constraints, particularly <literal>NOT NULL</literal>, are checked when
    converting a value to the domain type.  It is possible for a column that
    is nominally of the domain type to read as null despite there being such
-   a constraint.  For example, this can happen in an outer-join query, if
-   the domain column is on the nullable side of the outer join.  A more
-   subtle example is
+   a constraint.  For example, this can happen in
+   <link linkend="nullvalues-domains">an outer-join query</link>, if
+   the domain column is on the nullable side of the outer join.
+   A more subtle example is
 <programlisting>
 INSERT INTO tab (domcol) VALUES ((SELECT domcol FROM tab WHERE false));
 </programlisting>
diff --git a/doc/src/sgml/syntax.sgml b/doc/src/sgml/syntax.sgml
index 916189a7d68..c41687b2244 100644
--- a/doc/src/sgml/syntax.sgml
+++ b/doc/src/sgml/syntax.sgml
@@ -281,9 +281,9 @@ U&amp;"d!0061t!+000061" UESCAPE '!'
    </indexterm>
 
    <para>
-    There are three kinds of <firstterm>implicitly-typed
+    There are four kinds of <firstterm>implicitly-typed
     constants</firstterm> in <productname>PostgreSQL</productname>:
-    strings, bit strings, and numbers.
+    strings, bit strings, numbers, and the null value.
     Constants can also be specified with explicit types, which can
     enable more accurate representation and more efficient handling by
     the system. These alternatives are discussed in the following
@@ -834,6 +834,25 @@ CAST ( '<replaceable>string</replaceable>' AS <replaceable>type</replaceable> )
      usage, as is the function-call syntax.
     </para>
    </sect3>
+
+   <sect3 id="sql-syntax-constants-nullvalue">
+    <title>The Null Value Constant</title>
+    <indexterm>
+     <primary>null value</primary>
+     <secondary>constant</secondary>
+    </indexterm>
+    <para>
+     The null value represents an unknown value and its constant, the keyword <literal>NULL</literal>,
+     when evaluated in an expression, likewise yields a value of <literal>unknown</literal> type.
+     See <xref linkend="nullvalues"/> for an overview of how the system behaves in the presence
+     of a null value in various contexts.
+    </para>
+    <para>
+     Due to the typing of a null value as <literal>unknown</literal> it is often necessary to use
+     a cast, as described in the previous section, to convert it to the specific type needed.
+     However, implicit casting is performed when contextual information is available.
+    </para>
+   </sect3>
   </sect2>
 
   <sect2 id="sql-syntax-operators">
-- 
2.34.1

#72Marcos Pegoraro
marcos@f10.com.br
In reply to: David G. Johnston (#63)
Re: Document NULL

Em ter., 11 de mar. de 2025 às 12:52, David G. Johnston <
david.g.johnston@gmail.com> escreveu:

I'm mostly indifferent and it is very simple to change. It seemed

desirable to have the main topic of this page display as something that
isn't invisible though. And NULL was unappealing since it naturally
appears in data. Since COPY uses \N I figured it was a decent choice.
<null> or <NULL> came to mind too, but there were long compared to 1, 2,
and 4 that appear along side it.

You decided to show \N for Nulls. I think that the user who has questions
about nulls is usually a newbie, so he also doesn't know the COPY format
for nulls. And even GUIs, which are often used for learning, display a word
for nulls, be it NULL, <null>, [null] or something similar.

regards
Marcos

#73David G. Johnston
david.g.johnston@gmail.com
In reply to: Marcos Pegoraro (#72)
Re: Document NULL

On Wed, Jun 18, 2025, 11:25 Marcos Pegoraro <marcos@f10.com.br> wrote:

Em ter., 11 de mar. de 2025 às 12:52, David G. Johnston <

david.g.johnston@gmail.com> escreveu:

I'm mostly indifferent and it is very simple to change. It seemed

desirable to have the main topic of this page display as something that
isn't invisible though. And NULL was unappealing since it naturally
appears in data. Since COPY uses \N I figured it was a decent choice.
<null> or <NULL> came to mind too, but there were long compared to 1, 2,
and 4 that appear along side it.

You decided to show \N for Nulls. I think that the user who has questions
about nulls is usually a newbie, so he also doesn't know the COPY format
for nulls. And even GUIs, which are often used for learning, display a word
for nulls, be it NULL, <null>, [null] or something similar.

I figured I'd wait for more bike shedding, and maybe other comments, from a
committer before going though and doing another mass examples rebuild. I
like my reasoning and it seems easily learned that \N means null on this
page's example. But I'll go with the crowd.

David J.

#74Álvaro Herrera
alvherre@kurilemu.de
In reply to: David G. Johnston (#71)
1 attachment(s)
Re: Document NULL

On 2025-Jun-18, David G. Johnston wrote:

Version 8.

Marking this Ready to Commit in CF 2025-09 (CF PG19-1)

I have rebased this; here's v9. I haven't reviewed it in depth, but
intend to give it a read and get it pushed sometime in the
not-too-distant future, so if anybody wants to review it some more, it'd
be appreciated.

Note that this rebase was across the func.sgml split, which means I had
to do some "manual" merging. Looking at the git diff --stat output, it
seems to match what was there before, so I don't think anything was
lost.

--
Álvaro Herrera Breisgau, Deutschland — https://www.EnterpriseDB.com/
"Linux transformó mi computadora, de una `máquina para hacer cosas',
en un aparato realmente entretenido, sobre el cual cada día aprendo
algo nuevo" (Jaime Salinas)

Attachments:

v9-0001-doc-Add-an-overview-of-NULL-treatment-in-PostgreS.patchtext/x-diff; charset=utf-8Download
From 8467c19c39e34d55839ed682c58ed3eb35cc8e65 Mon Sep 17 00:00:00 2001
From: "David G. Johnston" <David.G.Johnston@Gmail.com>
Date: Wed, 18 Jun 2025 10:38:24 -0700
Subject: [PATCH v9] doc: Add an overview of NULL treatment in PostgreSQL

The handling of NULL within PostgreSQL is broad, varied, and
unintuitive.  This new section provides a place for the reader
to go and skim over the various behaviors and stick them in
the back of their mind.

Some existing documentation is tweaked to be more in line with
the overall flow of the material presented in this overview.
The individual features do still constitute an authoritative
location for describing the behaviors - but now have a more
convenient place to put examples.
---
 doc/src/sgml/datatype.sgml              |    2 +-
 doc/src/sgml/ddl.sgml                   |    2 +
 doc/src/sgml/filelist.sgml              |    1 +
 doc/src/sgml/func/func-comparisons.sgml |  123 +--
 doc/src/sgml/func/func-subquery.sgml    |  150 +--
 doc/src/sgml/json.sgml                  |    7 +-
 doc/src/sgml/nullvalues.sgml            | 1126 +++++++++++++++++++++++
 doc/src/sgml/ref/create_domain.sgml     |    7 +-
 doc/src/sgml/syntax.sgml                |   23 +-
 9 files changed, 1281 insertions(+), 160 deletions(-)
 create mode 100644 doc/src/sgml/nullvalues.sgml

diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml
index 1f2829e56a9..9e8ff34488a 100644
--- a/doc/src/sgml/datatype.sgml
+++ b/doc/src/sgml/datatype.sgml
@@ -5398,7 +5398,7 @@ WHERE ...
        <row>
         <entry><type>unknown</type></entry>
         <entry>Identifies a not-yet-resolved type, e.g., of an undecorated
-         string literal.</entry>
+         string literal.  Also, the <link linkend="nullvalues-usage">null value.</link></entry>
        </row>
       </tbody>
      </tgroup>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 948b9327f24..5ee0391d371 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -168,6 +168,8 @@ DROP TABLE products;
   </para>
  </sect1>
 
+ &nullvalues;
+
  <sect1 id="ddl-default">
   <title>Default Values</title>
 
diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml
index ac66fcbdb57..9b56a0d3393 100644
--- a/doc/src/sgml/filelist.sgml
+++ b/doc/src/sgml/filelist.sgml
@@ -24,6 +24,7 @@
 <!ENTITY indices    SYSTEM "indices.sgml">
 <!ENTITY json       SYSTEM "json.sgml">
 <!ENTITY mvcc       SYSTEM "mvcc.sgml">
+<!ENTITY nullvalues SYSTEM "nullvalues.sgml">
 <!ENTITY parallel   SYSTEM "parallel.sgml">
 <!ENTITY perform    SYSTEM "perform.sgml">
 <!ENTITY queries    SYSTEM "queries.sgml">
diff --git a/doc/src/sgml/func/func-comparisons.sgml b/doc/src/sgml/func/func-comparisons.sgml
index 6a6e0bd4019..970997e368a 100644
--- a/doc/src/sgml/func/func-comparisons.sgml
+++ b/doc/src/sgml/func/func-comparisons.sgml
@@ -57,7 +57,8 @@
    <productname>PostgreSQL</productname> extensions; the rest are
    <acronym>SQL</acronym>-compliant.
    All of the expression forms documented in this section return
-   Boolean (true/false) results.
+   <link linkend="nullvalues">three-valued</link> boolean typed
+   results (true, false, or null).
   </para>
 
   <sect2 id="functions-comparisons-in-scalar">
@@ -70,24 +71,13 @@
   <para>
    The right-hand side is a parenthesized list
    of expressions.  The result is <quote>true</quote> if the left-hand expression's
-   result is equal to any of the right-hand expressions.  This is a shorthand
-   notation for
-
-<synopsis>
-<replaceable>expression</replaceable> = <replaceable>value1</replaceable>
-OR
-<replaceable>expression</replaceable> = <replaceable>value2</replaceable>
-OR
-...
-</synopsis>
+   result is equal to any of the right-hand expressions.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand expression yields
-   null, the result of the <token>IN</token> construct will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence null values since the multiple equality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -101,35 +91,15 @@ OR
   <para>
    The right-hand side is a parenthesized list
    of expressions.  The result is <quote>true</quote> if the left-hand expression's
-   result is unequal to all of the right-hand expressions.  This is a shorthand
-   notation for
-
-<synopsis>
-<replaceable>expression</replaceable> &lt;&gt; <replaceable>value1</replaceable>
-AND
-<replaceable>expression</replaceable> &lt;&gt; <replaceable>value2</replaceable>
-AND
-...
-</synopsis>
+   result is unequal to all of the right-hand expressions.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand expression yields
-   null, the result of the <token>NOT IN</token> construct will be null, not true
-   as one might naively expect.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of null values since the multiple inequality
+   tests are OR'd together.
   </para>
 
-  <tip>
-  <para>
-   <literal>x NOT IN y</literal> is equivalent to <literal>NOT (x IN y)</literal> in all
-   cases.  However, null values are much more likely to trip up the novice when
-   working with <token>NOT IN</token> than when working with <token>IN</token>.
-   It is best to express your condition positively if possible.
-  </para>
-  </tip>
   </sect2>
 
   <sect2 id="functions-comparisons-any-some">
@@ -142,30 +112,26 @@ AND
 
   <para>
    The right-hand side is a parenthesized expression, which must yield an
-   array value.
-   The left-hand expression
+   array value. The result of <token>ANY</token> is
+   <quote>false</quote> if the array has zero element, otherwise
+   the left-hand expression
    is evaluated and compared to each element of the array using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ANY</token> is <quote>true</quote> if any true result is obtained.
-   The result is <quote>false</quote> if no true result is found (including the
-   case where the array has zero elements).
+   The result is <quote>true</quote> if any true result is obtained.
+   The result is <quote>false</quote> if no true result is found.
   </para>
 
   <para>
-   If the array expression yields a null array, the result of
-   <token>ANY</token> will be null.  If the left-hand expression yields null,
-   the result of <token>ANY</token> is ordinarily null (though a non-strict
-   comparison operator could possibly yield a different result).
-   Also, if the right-hand array contains any null elements and no true
-   comparison result is obtained, the result of <token>ANY</token>
-   will be null, not false (again, assuming a strict comparison operator).
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both elements and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
    <token>SOME</token> is a synonym for <token>ANY</token>.
+   <token>IN</token> is equivalent to <literal>= ANY</literal>.
   </para>
   </sect2>
 
@@ -179,26 +145,27 @@ AND
   <para>
    The right-hand side is a parenthesized expression, which must yield an
    array value.
-   The left-hand expression
+   The result of <token>ALL</token> is
+   <quote>true</quote> if the array has zero elements, otherwise
+   the left-hand expression
    is evaluated and compared to each element of the array using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ALL</token> is <quote>true</quote> if all comparisons yield true
-   (including the case where the array has zero elements).
+   The result is <quote>true</quote> if all comparisons yield true.
    The result is <quote>false</quote> if any false result is found.
   </para>
 
   <para>
-   If the array expression yields a null array, the result of
-   <token>ALL</token> will be null.  If the left-hand expression yields null,
-   the result of <token>ALL</token> is ordinarily null (though a non-strict
-   comparison operator could possibly yield a different result).
-   Also, if the right-hand array contains any null elements and no false
-   comparison result is obtained, the result of <token>ALL</token>
-   will be null, not true (again, assuming a strict comparison operator).
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both elements and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
+
+  <para>
+   <token>NOT IN</token> is equivalent to <literal>&lt;&gt; ALL</literal>.
+  </para>
+
   </sect2>
 
   <sect2 id="row-wise-comparison">
@@ -249,6 +216,11 @@ AND
    considered.
   </para>
 
+  <para>
+   See <xref linkend="nullvalues-multielementcomparison-rowconstructor"/>
+   and surrounding content for additional details and examples.
+  </para>
+
 <synopsis>
 <replaceable>row_constructor</replaceable> IS DISTINCT FROM <replaceable>row_constructor</replaceable>
 </synopsis>
@@ -283,20 +255,11 @@ AND
 </synopsis>
 
   <para>
-   The SQL specification requires row-wise comparison to return NULL if the
-   result depends on comparing two NULL values or a NULL and a non-NULL.
-   <productname>PostgreSQL</productname> does this only when comparing the
-   results of two row constructors (as in
-   <xref linkend="row-wise-comparison"/>) or comparing a row constructor
-   to the output of a subquery (as in <xref linkend="functions-subquery"/>).
-   In other contexts where two composite-type values are compared, two
-   NULL field values are considered equal, and a NULL is considered larger
-   than a non-NULL.  This is necessary in order to have consistent sorting
-   and indexing behavior for composite types.
-  </para>
-
-  <para>
-   Each side is evaluated and they are compared row-wise.  Composite type
+   Each side is evaluated and they are compared row-wise.
+   As discussed and shown in <xref linkend="nullvalues-multielementcomparison-composite"/>,
+   null values are treated as being equal to other null values and greater
+   than all non-null values.
+   Composite type
    comparisons are allowed when the <replaceable>operator</replaceable> is
    <literal>=</literal>,
    <literal>&lt;&gt;</literal>,
diff --git a/doc/src/sgml/func/func-subquery.sgml b/doc/src/sgml/func/func-subquery.sgml
index a9f2b12e48c..d516dc7132d 100644
--- a/doc/src/sgml/func/func-subquery.sgml
+++ b/doc/src/sgml/func/func-subquery.sgml
@@ -33,7 +33,8 @@
    This section describes the <acronym>SQL</acronym>-compliant subquery
    expressions available in <productname>PostgreSQL</productname>.
    All of the expression forms documented in this section return
-   Boolean (true/false) results.
+   <link linkend="nullvalues">three-valued</link> typed
+   results (true, false, or null).
   </para>
 
   <sect2 id="functions-subquery-exists">
@@ -95,19 +96,17 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>IN</token>
+   is <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result.
-   The result of <token>IN</token> is <quote>true</quote> if any equal subquery row is found.
-   The result is <quote>false</quote> if no equal row is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any equal subquery row is found.
+   The result is <quote>false</quote> if no equal row is found.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>IN</token> construct will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.
   </para>
 
   <para>
@@ -124,21 +123,18 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.
+   The result of <token>IN</token> is <quote>false</quote> if the subquery returns no rows,
+   otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result.
-   The result of <token>IN</token> is <quote>true</quote> if any equal subquery row is found.
-   The result is <quote>false</quote> if no equal row is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any equal subquery row is found.
+   The result is <quote>false</quote> if no equal row is found.
   </para>
 
   <para>
-   As usual, null values in the rows are combined per
-   the normal rules of SQL Boolean expressions.  Two rows are considered
-   equal if all their corresponding members are non-null and equal; the rows
-   are unequal if any corresponding members are non-null and unequal;
-   otherwise the result of that row comparison is unknown (null).
-   If all the per-row results are either unequal or null, with at least one
-   null, then the result of <token>IN</token> is null.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -150,20 +146,17 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 </synopsis>
 
   <para>
-   The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
-   is evaluated and compared to each row of the subquery result.
-   The result of <token>NOT IN</token> is <quote>true</quote> if only unequal subquery rows
-   are found (including the case where the subquery returns no rows).
+   The right-hand side is a parenthesized subquery, which must return exactly one column.
+   The result of <token>NOT IN</token> is <quote>true</quote> if the subquery returns no rows,
+   otherwise the left-hand expression is evaluated and compared to each row of the subquery result.
+   The result is <quote>true</quote> if only unequal subquery rows are found.
    The result is <quote>false</quote> if any equal row is found.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>NOT IN</token> construct will be null, not true.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
+   tests are OR'd together.
   </para>
 
   <para>
@@ -180,21 +173,18 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.
+   The result of <token>NOT IN</token> is <quote>true</quote> if the subquery returns no rows,
+   otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result.
-   The result of <token>NOT IN</token> is <quote>true</quote> if only unequal subquery rows
-   are found (including the case where the subquery returns no rows).
+   The result is <quote>true</quote> if only unequal subquery rows are found.
    The result is <quote>false</quote> if any equal row is found.
   </para>
 
   <para>
-   As usual, null values in the rows are combined per
-   the normal rules of SQL Boolean expressions.  Two rows are considered
-   equal if all their corresponding members are non-null and equal; the rows
-   are unequal if any corresponding members are non-null and unequal;
-   otherwise the result of that row comparison is unknown (null).
-   If all the per-row results are either unequal or null, with at least one
-   null, then the result of <token>NOT IN</token> is null.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -208,13 +198,13 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>ANY</token> is
+   <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ANY</token> is <quote>true</quote> if any true result is obtained.
-   The result is <quote>false</quote> if no true result is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any true result is obtained.
+   The result is <quote>false</quote> if no true result is found.
   </para>
 
   <para>
@@ -223,11 +213,10 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   </para>
 
   <para>
-   Note that if there are no successes and at least one right-hand row yields
-   null for the operator's result, the result of the <token>ANY</token> construct
-   will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -245,16 +234,19 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.  The result of <token>ANY</token> is
+   <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result,
    using the given <replaceable>operator</replaceable>.
-   The result of <token>ANY</token> is <quote>true</quote> if the comparison
-   returns true for any subquery row.
-   The result is <quote>false</quote> if the comparison returns false for every
-   subquery row (including the case where the subquery returns no
-   rows).
-   The result is NULL if no comparison with a subquery row returns true,
-   and at least one comparison returns NULL.
+   The result is <quote>true</quote> if the comparison returns true for any subquery row.
+   The result is <quote>false</quote> if the comparison returns false for every subquery row.
+  </para>
+
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are OR'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -272,15 +264,20 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>ALL</token> is
+   <quote>true</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ALL</token> is <quote>true</quote> if all rows yield true
-   (including the case where the subquery returns no rows).
+   The result is <quote>true</quote> if all rows yield true.
    The result is <quote>false</quote> if any false result is found.
-   The result is NULL if no comparison with a subquery row returns false,
-   and at least one comparison returns NULL.
+  </para>
+
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -301,22 +298,21 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.  The result of <token>ALL</token> is
+   <quote>true</quote> if the subquery returns no rows, otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result,
    using the given <replaceable>operator</replaceable>.
-   The result of <token>ALL</token> is <quote>true</quote> if the comparison
-   returns true for all subquery rows (including the
-   case where the subquery returns no rows).
-   The result is <quote>false</quote> if the comparison returns false for any
-   subquery row.
-   The result is NULL if no comparison with a subquery row returns false,
-   and at least one comparison returns NULL.
+   The result is <quote>true</quote> if the comparison returns true for all subquery rows.
+   The result is <quote>false</quote> if the comparison returns false for any subquery row.
   </para>
 
   <para>
-   See <xref linkend="row-wise-comparison"/> for details about the meaning
-   of a row constructor comparison.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
+
   </sect2>
 
   <sect2 id="functions-subquery-single-row-comp">
@@ -341,6 +337,14 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    compared row-wise to the single subquery result row.
   </para>
 
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, the result cannot be <quote>true</quote> in the
+   presence of null valued fields in either the row constructor or the subquery result row, as
+   the individual field tests are AND'd together.
+   Note that <literal>IS DISTINCT FROM</literal> is not an operator.
+  </para>
+
   <para>
    See <xref linkend="row-wise-comparison"/> for details about the meaning
    of a row constructor comparison.
diff --git a/doc/src/sgml/json.sgml b/doc/src/sgml/json.sgml
index 206eadb8f7b..0f39d4bf21a 100644
--- a/doc/src/sgml/json.sgml
+++ b/doc/src/sgml/json.sgml
@@ -129,6 +129,11 @@
   the corresponding <productname>PostgreSQL</productname> types.
  </para>
 
+ <indexterm>
+  <primary>null value</primary>
+  <secondary sortas="json">within JSON</secondary>
+ </indexterm>
+
   <table id="json-type-mapping-table">
      <title>JSON Primitive Types and Corresponding <productname>PostgreSQL</productname> Types</title>
      <tgroup cols="3">
@@ -162,7 +167,7 @@
        <row>
         <entry><type>null</type></entry>
         <entry>(none)</entry>
-        <entry>SQL <literal>NULL</literal> is a different concept</entry>
+        <entry>An SQL null value is similar, but see <xref linkend="nullvalues-json"/> for differences.</entry>
        </row>
       </tbody>
      </tgroup>
diff --git a/doc/src/sgml/nullvalues.sgml b/doc/src/sgml/nullvalues.sgml
new file mode 100644
index 00000000000..53063f598ee
--- /dev/null
+++ b/doc/src/sgml/nullvalues.sgml
@@ -0,0 +1,1126 @@
+<!-- doc/src/sgml/nullvalues.sgml -->
+
+<sect1 id="nullvalues">
+ <title>Null Values Overview</title>
+
+ <indexterm>
+  <primary>null value</primary>
+ </indexterm>
+
+ <para>
+  This section first introduces the concept of null values and then
+  explains how different parts of the system behave when provided
+  one or more null value inputs.  Examples throughout this section
+  can be executed so long as the following table and rows are created first.
+ </para>
+
+ <para>
+  Throughout this section, the discussion of null values will be limited to
+  the SQL language unless otherwise noted.  The JSON-related data types, and the
+  non-SQL procedural languages, have their own behaviors documented in their
+  respective areas.
+ </para>
+
+ <para>
+  The following <literal>CREATE TABLE</literal> and <literal>INSERT</literal>
+  SQL commands can be executed in any SQL client to create and populate
+  the persistent table used in the examples below.  The <literal>\pset</literal>
+  commands require the use of <application>psql</application> as the client program;
+  they make the resulting output a bit easier to read and do not impact any behaviors
+  described herein.  Note, the examples below have been manually edited to show
+  <literal>true</literal> and <literal>false</literal> instead of
+  <literal>t</literal> and <literal>f</literal>.  They also omit any transactional
+  command output when transactions are used.  Instead, each transaction gets its own
+  display block.
+ </para>
+
+<programlisting>
+CREATE TABLE null_examples (
+  id bigint PRIMARY KEY,
+  value integer NULL
+);
+INSERT INTO null_examples
+VALUES (1, 1), (2, NULL), (3, 4);
+
+-- This makes null values print as \N in the output instead of the empty string.
+\pset null '\\N'
+-- Removes the row count footer that prints by default.
+\pset footer off
+</programlisting>
+
+ <sect2 id="nullvalues-model">
+  <title>Meaning</title>
+  <para>
+   Generally, a null value is assumed to mean "unknown", but other interpretations
+   are common.  A data model design may state that a null value
+   is to be used to represent "not applicable" - i.e., that a value is not
+   even possible.  The null value also takes on a literal meaning of "not found"
+   when produced as the result of an outer join.
+  </para>
+  <para>
+   In different programming languages, some of which are accessible in the server
+   as procedural languages, the null value is represented in other ways.
+   Of those included in <productname>PostgreSQL</productname>,
+   these are:
+   <literal>None</literal> in <productname>Python</productname>,
+   <literal>undefined</literal> in <productname>Perl</productname>,
+   and the empty string in <productname>TCL</productname>.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-usage">
+  <title>Usage</title>
+  <para>
+   A null value, like all values, must have a data type, and is valid for all data types.
+   It must also be printed as text.  This section discusses null values at the boundaries
+   of the system, as well as how they can come into existence due to the design of a query.
+  </para>
+  <sect3 id="nullvalues-usage-input">
+   <title>Null Value Input</title>
+   <para>
+    A null value can be used as input to any function, operator, or expression.
+    The system will then decide how to behave based on the rules described in the
+    rest of this section.
+   </para>
+   <para>
+    As noted in <xref linkend="sql-syntax-constants-nullvalue"/>,
+    a null value literal is written using the <literal>NULL</literal> keyword.
+    Its type is the <link linkend="datatype-pseudo">pseudo-type unknown</link>
+    but can be cast to any concrete data type.
+   </para>
+   <para>
+<programlisting>
+SELECT
+ NULL AS "Literal Null Value",
+ pg_typeof(null) AS "Type of Null",
+ pg_typeof(NULL::text) AS "Type of Cast Null",
+ cast(null as text) AS "Cast Null Value";
+</programlisting>
+<screen>
+ Literal Null Value | Type of Null | Type of Cast Null | Cast Null Value
+--------------------+--------------+-------------------+-----------------
+ \N                 | unknown      | text              | \N
+</screen>
+   </para>
+   <para>
+<programlisting>
+SELECT text NULL;
+</programlisting>
+<screen>
+ERROR:  column "text" does not exist
+LINE 1: select text NUll;
+</screen>
+   </para>
+   <para>
+    The <link linkend="sql-copy"><command>COPY ... FROM</command></link> command,
+    including its psql counter-part meta-command
+    <link linkend="app-psql-meta-commands-copy"><command>\copy</command></link>,
+    must deal with input files containing textual representations of the null value.
+    The lack of consistency in real-world data requires having a few options to the
+    command related to null handling.  See the documentation in
+    <xref linkend="sql-copy"/> for more information.
+    But, in short, for CSV input it expects text to be quoted and interprets an unquoted
+    empty string as the null value.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-tables">
+   <title>Null Values in Tables</title>
+   <para>
+    From a semantics perspective a table treats a null value like any other value.
+    However, the SQL Language recognizes its uniqueness by defining a column-scoped
+    <link linkend="nullvalues-table-constraints"><literal>NOT NULL</literal> constraint</link>
+    as syntactic sugar.  At present one would expect that a column having a
+    domain data type with a <literal>NOT NULL</literal> constraint would likewise be
+    incapable of having a null value stored.  This is not the case.  See the commentary
+    below in <xref linkend="nullvalues-domains"/> for more information.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-derived">
+   <title>Derived Null Values</title>
+   <para>
+    Even if all data stored in tables are known to be non-null, null values can still
+    be produced while executing a query.  The most common way this happens is by
+    introducing a (left) outer join to the query and having left side data without
+    corresponding data on the right side of the join.
+<programlisting>
+SELECT
+ countries.country,
+ flagships.flagship
+FROM (
+ VALUES ('Spain'), ('Switzerland')
+) as countries (country)
+LEFT JOIN (
+ VALUES ('Spain', 'Ship')
+) as flagships (country, flagship)
+ON countries.country = flagships.country;
+</programlisting>
+<screen>
+   country   | flagship
+-------------+----------
+ Spain       | Ship
+ Switzerland | \N
+</screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-output">
+   <title>Null Value Output</title>
+   <para>
+    As evidenced above, the "absence of value" aspect of the null value results
+    in its secondary textual representation being an empty string
+    (its primary representation is just NULL).
+    This can be problematic if the empty string is expected to be a valid value.
+    Therefore, places that deal with possible null values as input and text as
+    output need some means to give the user a way to specify how to print
+    the null value.
+   </para>
+   <para>
+    Generally, the primary representation is used when the value is part of a multi-element value.
+    If the value is being displayed by itself the secondary (blank) representation is used.  The settings
+    discussed herein typically control the secondary representation.  The null value representation when it
+    is within a container type (composite, array, etc...) is controlled by the input and output rules of the
+    container type.  It is when the container value itself is the null value that these generalities then apply.
+   </para>
+   <para>
+    No matter how the null value got into the result when presenting results to the user it is
+    necessary to present null values using text.  This is the responsibility of the client application.
+    The <command>psql</command> client program has the <link linkend="app-psql-meta-command-pset-null">
+    <literal>\pset null</literal> meta-command</link> to specify the textual output of null values
+    it encounters in query results.
+   </para>
+   <para>
+    When the final output of the result is a text file instead of a user additional
+    considerations come into play.  While the option to take the user presentation
+    and send it to a text file always exists <productname>PostgreSQL</productname> also
+    provides a facility to output a structured text file.
+    The <link linkend="sql-copy"><command>COPY ... TO</command></link> command,
+    including its psql counter-part meta-command
+    <link linkend="app-psql-meta-commands-copy"><command>\copy</command></link>,
+    has the <literal>NULL</literal> option (and some modifier options) to specify
+    the string to print to the output for null values it encounters in the query result.
+    As with input file processing, for the CSV format it will, by default,
+    produce an unquoted empty string for the null value.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-handling">
+   <title>Null Value Handling</title>
+   <para>
+    The presence of null values in the system results in three-valued logic.
+    In conventional two-valued (binary) logic every outcome is either true or false.
+    In three-valued logic the concept of unknown, represented using the null value, is
+    also an outcome.  This results in falsifying the common-sense notion
+    that "p OR NOT p" is always true.
+<programlisting>
+SELECT
+ NULL OR NOT NULL AS "N OR !N";
+</programlisting>
+<screen>
+ N OR !N
+---------
+ \N
+</screen>
+    (See <xref linkend="nullvalues-operands"/> for more explanation.)
+   </para>
+   <para>
+    When dealing with null values it is often useful to explicitly to convert
+    data to and from a null value given a known non-null representation
+    (e.g., the empty string, the numbers 0 or 1, or boolean false).
+    The <link linkend="functions-coalesce-nvl-ifnull">COALESCE</link> and
+    <link linkend="functions-nullif">NULLIF</link> functions are useful
+    for this purpose.
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-cardinalrule">
+  <title>Distinctness - Overcoming the Cardinal Rule of Null Values</title>
+  <para>
+   The cardinal rule, a null value is
+   <link linkend="functions-comparison-op-table">
+    neither equal nor unequal
+   </link>
+   to any value, including other null values.
+<programlisting>
+SELECT
+ NULL = NULL AS "N = N",
+ NULL != NULL AS "N != N",
+ 1 = NULL AS "1 = N",
+ 1 != NULL AS "1 != N",
+ 1 = 1 AS "1 = 1",
+ 1 != 1 AS "1 != 1";
+</programlisting>
+<screen>
+ N = N | N != N | 1 = N | 1 != N | 1 = 1 | 1 != 1
+-------+--------+-------+--------+-------+--------
+ \N    | \N     | \N    | \N     | true  | false
+</screen>
+   However, as with many rules, there are exceptions, as noted in
+   <xref linkend="nullvalues-multielementcomparison"/>.
+   Particularly, when the two compared values are part of a larger multi-element value.
+<programlisting>
+SELECT
+ array[1,2]=array[1,null] AS "Array Equals";
+</programlisting>
+<screen>
+ Array Equals
+--------------
+ false
+</screen>
+  </para>
+  <para>
+   Because of this SQL standard rule, checking for a null value has an
+   explicit <literal>IS NULL</literal> predicate.  Additionally, there are comparison
+   predicates that consider a null value equal to other null values but unequal
+   to any other value (e.g., <literal>IS DISTINCT</literal>, and <literal>IS TRUE</literal>.)
+   These, and other predicates, are described in
+   <xref linkend="functions-comparison-pred-table"/>
+<programlisting>
+SELECT id, value,
+ value IS NULL AS "IS NULL",
+ value IS DISTINCT FROM id AS "IS DIST",
+ value != id AS "IS !="
+FROM null_examples;
+</programlisting>
+<screen>
+ id | value | IS NULL | IS DIST | IS !=
+----+-------+---------+---------+-------
+  1 |     1 | false   | false   | false
+  2 |    \N | true    | true    | \N
+  3 |     4 | false   | true    | true
+</screen>
+  </para>
+  <para>
+   On the other hand, the SQL standard is largely alone in taking this approach to comparing
+   values to the null value.  For example, when working within the JSON data types the use of equals
+   produces true or false and so the concept of distinctness is neither present nor required.
+   Additional details and links are provided in <xref linkend="nullvalues-json"/>.
+   For the non-SQL procedural languages, please consult the appropriate documentation.
+  </para>
+  <para>
+   There is also a cardinal warning: when dealing with
+   <link linkend="rowtypes">composite types</link> in
+   expressions, <literal>composite IS NULL</literal>
+   and <literal>composite IS NOT NULL</literal>
+   are not the opposites of each other in the case where some,
+   but not all, of the composite's fields are null values.
+   (The case where all fields are null is indistinguishable
+   from the composite as a whole being null.)
+   Write <literal>NOT(composite IS NULL)</literal> instead.
+<programlisting>
+SELECT
+ c,
+ c IS NULL AS "c IS N",
+ NOT(c IS NULL) AS "NOT c IS N",
+ c IS NOT NULL AS "c IS NOT N",
+ ROW(value, value) IS NULL AS "ROW(v,v) IS N",
+ ROW(value, value) IS NOT NULL AS "ROW(v,v) IS NOT N"
+FROM null_examples AS c;
+</programlisting>
+<screen>
+   c   | c IS N | NOT c IS N | c IS NOT N | ROW(v,v) IS N | ROW(v,v) IS NOT N
+-------+--------+------------+------------+---------------+-------------------
+ (1,1) | false  | true       | true       | false         | true
+ (2,)  | false  | true       | false      | true          | false
+ (3,4) | false  | true       | true       | false         | true
+</screen>
+   See <xref linkend="nullvalues-multielement"/> below for an explanation.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-operands">
+  <title>Null-Valued Operands</title>
+  <para>
+   As a general expectation, operator invocation expressions where one of the inputs
+   is a null value will result in a null-valued output.
+<programlisting>
+SELECT
+ 1 + null AS "Add",
+ 'text' || null AS "Concatenate";
+</programlisting>
+<screen>
+ Add | Concatenate
+-----+-------------
+  \N | \N
+</screen>
+   Operators that behave otherwise should document their deviation from this norm.
+  </para>
+  <para>
+   A notable example is the <literal>IN</literal> operator, which
+   uses equality, not distinctness, for testing.
+<programlisting>
+SELECT
+ 1 IN (1, null) AS "In Present",
+ 1 IN (2, null) AS "In Missing",
+ null IN (1, 2) AS "N In Non-N",
+ null IN (null, 2) AS "N In N";
+</programlisting>
+<screen>
+ In Present | In Missing | N In Non-N | N In N
+------------+------------+------------+--------
+ true       | \N         | \N         | \N
+</screen>
+   This is just an extension of the multi-element testing behavior described in
+   <xref linkend="nullvalues-multielement"/>.
+  </para>
+  <para>
+   Experience shows that <literal>CASE</literal> expressions are also prone
+   to bugs since their format encourages binary logic thinking while a
+   <literal>WHEN</literal> test will not consider a null value to be a match.
+<programlisting>
+SELECT id, value,
+ CASE WHEN id = value THEN 'Equal' ELSE 'Not Equal' END AS "Affirm",
+ CASE WHEN id != value THEN 'Not Equal' ELSE 'Equal' END AS "Negate",
+ CASE WHEN value IS NULL THEN 'Null'
+      WHEN id = value THEN 'Equal'
+      ELSE 'Not Equal' END AS "Safe Affirm",
+ CASE WHEN value IS NULL THEN 'Null'
+      WHEN id != value THEN 'Not Equal'
+      ELSE 'Equal' END AS "Safe Negate"
+FROM null_examples;
+</programlisting>
+<screen>
+ id | value |  Affirm   |  Negate   | Safe Affirm | Safe Negate
+----+-------+-----------+-----------+-------------+-------------
+  1 |     1 | Equal     | Equal     | Equal       | Equal
+  2 |    \N | Not Equal | Equal     | Null        | Null
+  3 |     4 | Not Equal | Not Equal | Not Equal   | Not Equal
+</screen>
+  </para>
+  <para>
+   The boolean operators <literal>AND</literal> and <literal>OR</literal>
+   will ignore the null value input if the other input is sufficient to
+   determine the outcome.
+<programlisting>
+SELECT
+ true OR null AS "T or N",
+ false OR null AS "F or N",
+ true AND null AS "T and N",
+ false AND null AS "F and N";
+</programlisting>
+<screen>
+ T or N | F or N | T and N | F and N
+--------+--------+---------+---------
+ true   | \N     | \N      | false
+</screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-domains">
+  <title>Null Values in Domains</title>
+  <para>
+   A domain is a user-defined data type that can have a <literal>NOT NULL</literal>
+   constraint.  However, some usages of domains can still cause a column to be of the
+   domain type but some value may be null.  The common way this happens is by including
+   the domain column's table on the right side of a left join.
+<programlisting>
+BEGIN;
+CREATE DOMAIN domain_example AS integer NOT NULL;
+CREATE TABLE domain_examples (de_id bigint PRIMARY KEY, de_value domain_example);
+INSERT INTO domain_examples VALUES (1, 1), (2, 2);
+SELECT *, pg_typeof(de_value)
+FROM null_examples AS ne
+LEFT JOIN domain_examples AS de ON ne.id = de.de_id;
+ROLLBACK;
+</programlisting>
+<screen>
+BEGIN
+CREATE DOMAIN
+CREATE TABLE
+INSERT 0 2
+ id | value | de_id | de_value |   pg_typeof
+----+-------+-------+----------+----------------
+  1 |     1 |     1 |        1 | domain_example
+  2 |    \N |     2 |        2 | domain_example
+  3 |     4 |    \N |       \N | domain_example
+
+ROLLBACK
+</screen>
+   Please see the details in <xref linkend="sql-createdomain-notes"/>
+   for another example, as well as commentary on why this non-standard behavior exists.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-multielement">
+  <title>Testing Multi-Element Values with Null-Valued Elements</title>
+  <para>
+   Arrays and composite types are multi-element types.  Here we also consider non-empty
+   <link linkend="functions-subquery">subquery results</link>
+   and the list of values (i.e., the multiset) specified in the
+   <link linkend="functions-comparisons-in-scalar">IN test</link>.
+  </para>
+  <para>
+   When a test is performed on one of these multi-element values
+   the system will iterate over each element, (or pair of elements if the test is
+   <link linkend="row-wise-comparison">comparing two row constructors</link> to each other),
+   left-to-right, combining the results using the boolean operations described in
+   <xref linkend="nullvalues-operands"/>. For tests that
+   require an exhaustive search, (e.g., <literal>ALL</literal>, <literal>NOT IN</literal>)
+   the search effectively ends when a false result is found (<literal>AND</literal> combiners).
+   For tests that require a true result, (e.g., <literal>ANY</literal>,
+   <literal>IN</literal>) the search effectively ends when a true result is found
+   (<literal>OR</literal> combiners). Therefore:
+   <simplelist>
+    <member>
+     <literal>IN</literal> and <literal>ANY</literal>
+     (<literal>OR</literal>) cannot produce a false result in the presence of null, and
+    </member>
+    <member>
+     <literal>NOT IN</literal> and <literal>ALL</literal>
+     (<literal>AND</literal>) cannot produce a true result in the presence of null.
+    </member>
+   </simplelist>
+   This is because any exhaustive search will produce at least one null value result
+   that cannot be ignored.
+  </para>
+  <para>
+   The SQL standard requires that non-exhaustive
+   (i.e., <literal>IN</literal> and <literal>ANY</literal>) subquery tests
+   return false when there are no rows in the subquery result, and return true
+   for the exhaustive tests (i.e., <literal>NOT IN</literal> and <literal>ALL</literal>).
+  </para>
+  <para>
+   Note that the cardinal warning
+   noted in <xref linkend="nullvalues-cardinalrule"/> above is just the application of this behavior to the
+   <literal>IS NULL</literal> and <literal>IS NOT NULL</literal>
+   tests, which are both exhaustive search tests guaranteed to produce at least one false result
+   when the composite has a mix of null and non-null values.
+  </para>
+  <para>
+   In the next section, the rules above are discussed.
+   <xref linkend="nullvalues-multielementpredicates"/>
+   discusses situations where a predicate or a scalar value
+   are being compared to a multi-element value.
+   In <xref linkend="nullvalues-multielementcomparison"/>
+   the rules when two multi-element values are compared
+   to each other are discussed
+   (including the two row constructor comparison case.)
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-multielementpredicates">
+  <title>Multi-Element Predicates and Scalars</title>
+  <sect3 id="nullvalues-multielementpredicates-composites">
+   <title>Composite Fields</title>
+   <para>
+    When a composite typed value is created, a null value can be assigned to any
+    of its fields (see <xref linkend="rowtypes-constructing"/> for how to do this).
+    So long as at least one field is non-null the composite value
+    as a whole exists and an <literal>IS NULL</literal> predicate will return false.
+   </para>
+   <para>
+    Applying the <literal>IS NOT NULL</literal> predicate to a composite value performs
+    checks on whether all fields of the composite have non-null values.  This is not the same
+    as a non-null composite value.  Specifically, if the composite value has
+    a null-valued field then both the <literal>IS NOT NULL</literal> predicate and the
+    <literal>IS NULL</literal> predicate will return false.
+<programlisting>
+SELECT
+ ROW(1,2) IS NULL AS "Row Is Null",
+ ROW(1,2) IS NOT NULL AS "Row Is Not Null",
+ ROW(1,NULL) IS NULL AS "Row Is Null",
+ ROW(1,NULL) IS NOT NULL AS "Row Is Not Null";
+</programlisting>
+<screen>
+ Row Is Null | Row Is Not Null | Row Is Null | Row Is Not Null
+-------------+-----------------+-------------+-----------------
+ false       | true            | false       | false
+</screen>
+   </para>
+   <para>
+    Please read <xref linkend="composite-type-comparison"/> for a complete treatment
+    on how <productname>PostgreSQL</productname> handles row-wise comparison.  The
+    next two multi-element related items in this section discuss those comparisons in the
+    presence of null-valued fields, and also in terms of the SQL standard.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementpredicates-arrays">
+   <title>Array Elements and IN Multiset Members</title>
+   <para>
+    Examples of applying the behavior discussed in <xref linkend="nullvalues-multielement"/>
+    to arrays, and <literal>IN</literal> and <literal>NOT IN</literal> multisets, using the
+    operators defined in <xref linkend="functions-comparisons"/>.  The following examples produce
+    the same results when swapping <literal>IN</literal>/<literal>ANY</literal>
+    and also <literal>NOT IN</literal>/<literal>ALL</literal>, plus transforming the multiset/array format.
+    I.e., the exhaustive and non-exhaustive pairs noted in <xref linkend="nullvalues-multielement"/>.
+   </para>
+   <para>
+<programlisting>
+SELECT
+ 1 = ANY(array[1, 1, NULL]) AS "Any-Null-Match",
+ 1 = ANY(array[1, 1]) AS "Any-NoNull-Match",
+ 1 = ALL(array[1, 1, NULL]) AS "ALL-Null-Match",
+ 1 = ALL(array[1, 1]) AS "All-NoNull-Match";
+SELECT
+ 2 IN (1, 1, NULL) AS "IN-Null-Negative",
+ 2 IN (1, 1) AS "IN-NoNull-Negative",
+ 2 NOT IN (2, 2, NULL) AS "NotIN-Null-Negative",
+ 2 NOT IN (2, 2) AS "NotIN-NoNull-Negative";
+</programlisting>
+<screen>
+ Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+----------------+------------------+----------------+------------------
+ true           | true             | \N             | true
+
+ IN-Null-Negative | IN-NoNull-Negative | NotIN-Null-Negative | NotIN-NoNull-Negative
+------------------+--------------------+---------------------+-----------------------
+ \N               | false              | false               | false
+</screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementpredicates-subqueries">
+   <title>Single-Column Subquery Rows</title>
+   <para>
+    The following examples demonstrate the behavior discussed in
+    <xref linkend="nullvalues-multielement"/>
+    applied to subqueries using the operators defined in <xref linkend="functions-subquery"/>.
+    Here we cover the case where the multiple elements being checked are rows, each having one column.
+    If the column itself is multi-element then the thing being searched for must be a compatible
+    multi-element value, and the corresponding comparison behavior described in
+    <xref linkend="nullvalues-multielementcomparison"/> will also be applied.
+   </para>
+   <para>
+<programlisting>
+SELECT
+ 1 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-Match",
+ 1 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-Match",
+ 1 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-Match",
+ 1 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-Match";
+SELECT
+ 2 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-NoMatch",
+ 2 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-NoMatch",
+ 2 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-NoMatch",
+ 2 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-NoMatch";
+</programlisting>
+<screen>
+ Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+----------------+------------------+----------------+------------------
+ true           | true             | \N             | true
+
+ Any-Null-NoMatch | Any-NoNull-NoMatch | ALL-Null-NoMatch | All-NoNull-NoMatch
+------------------+--------------------+------------------+--------------------
+ \N               | false              | false            | false
+</screen>
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-multielementcomparison">
+  <title>Multi-Element Comparisons</title>
+  <para>
+   The previous section, <xref linkend="nullvalues-multielementpredicates"/>, discussed applying
+   a predicate or a scalar value check element-wise across a multi-element value.
+   This section moves the discussion over to comparing two multi-element values to each other.
+   As both array and composite typed values
+   can be stored within an index, and comparing two values in that context must not produce
+   a null-valued result, considerations are made to adhere to the SQL standard where
+   possible while still making indexes, which the specification is silent on, functional.
+   Specifically, except when comparing two row constructors, null values are considered
+   equal to other null values and greater than all non-null values.
+  </para>
+  <para>
+   There are five pair-wise comparison situations to consider:
+   element-wise when the inputs are arrays, and row-wise when the inputs can be either
+   row constructors or composite typed values.  While these four later combinations seem similar,
+   the fact that row constructors are query literals, while composite typed values can be stored,
+   brings about important differences in how they are treated.  Please read
+   <xref linkend="composite-type-comparison"/> for a fuller treatment of this topic.  Here
+   we briefly recap the five situations in the presence of null values.
+  </para>
+  <sect3 id="nullvalues-multielementcomparison-array">
+   <title>Element-wise Comparisons</title>
+   <para>
+    In this first situation, null values within an array compare as equal to each other and greater
+    than all non-null values, regardless of whether the comparison involves
+    <link linkend="sql-syntax-array-constructors">array constructors</link> or array-typed values.
+<programlisting>
+SELECT
+ array[1,2]=array[1,null] AS "Constructors",
+ s, t,
+ s = t AS "Stored Equality",
+ t &gt; s AS "Stored Ordering"
+FROM
+(values (array[1,2])) AS sv (s),
+(values (array[1,null::integer])) AS st (t);
+</programlisting>
+<screen>
+ Constructors |   s   |    t     | Stored Equality | Stored Ordering
+--------------+-------+----------+-----------------+-----------------
+ false        | {1,2} | {1,NULL} | false           | true
+</screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-rowconstructor">
+   <title>Row-wise Mutual Row Constructor Comparisons</title>
+   <para>
+    In this situation, null values produce unknown when compared to all values.
+<programlisting>
+SELECT
+ (1,2)=(1,null) AS "NonNull=Null",
+ (1,null::integer)=(1,null) AS "Null=Null";
+</programlisting>
+<screen>
+ NonNull=Null | Null=Null
+--------------+-----------
+ \N           | \N
+</screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-composite">
+   <title>Row-wise Composite Involved Comparisons</title>
+   <para>
+    In these three situations, null values are considered equal to each other and greater than
+    all non-null valueS.
+   </para>
+<programlisting>
+SELECT s, t,
+ s = t AS "Stored Equals Stored",
+ t &lt; (1,2) AS "Stored LT Constructor",
+ t = (1,null::integer) AS "Stored Equals Constructor"
+FROM
+ (values (1,2)) AS s,
+ (values (1,null::integer)) AS t;
+</programlisting>
+<screen>
+   s   |  t   | Stored Equals Stored | Stored LT Constructor | Stored Equals Constructor
+-------+------+----------------------+-----------------------+---------------------------
+ (1,2) | (1,) | false                | false                 | true
+</screen>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-sqlconformance">
+   <title>SQL Standard Conformance</title>
+   <para>
+    The SQL standard requires row-wise comparison to return NULL if the
+    result depends on comparing two NULL values or a NULL and a non-NULL.
+    <productname>PostgreSQL</productname> does this only when comparing the
+    results of two row constructors (as in
+    <xref linkend="row-wise-comparison"/>) or comparing a row constructor
+    to the output of a subquery (as in <xref linkend="functions-subquery"/>).
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-functions">
+  <title>Null-Valued Arguments in Normal Function Calls</title>
+  <para>
+   <link linkend="sql-createfunction">Function specifications</link>
+   have a "strictness" attribute (<literal>pg_proc.proisstrict</literal>) that,
+   when set to "strict" (true) will tell the executor to return a null value for any
+   function call having at least one null-valued input, without executing the
+   function.
+  </para>
+  <para>
+   Most functions, especially single argument functions, are defined with strict because without
+   non-null values to act upon they cannot produce a meaningful result.  However, for multi-argument
+   functions, especially <link linkend="xfunc-sql-variadic-functions">variadic functions</link>
+   like concatenate, null values often are ignored.
+   This can be different than the choice made by a binary operator performing the same function,
+   like for concatenating text, but not always, like concatenating an element onto an array.
+<programlisting>
+SELECT
+ lower(null::text) AS "Lower",
+ left('text', null) AS "Left",
+ 'one' || null AS "|| Text Op",
+ concat('one', null) AS "concat Text Func",
+ array_append(array[1], null) AS "append([], null)",
+ array[1]::integer[] || null::integer AS "[] || null",
+ array[1]::integer[] || null::integer[] AS "[] || null[]";
+</programlisting>
+<screen>
+ Lower | Left | || Text Op | concat Text Func | append([], null) | [] || null | [] || null[]
+-------+------+------------+------------------+------------------+------------+--------------
+ \N    | \N   | \N         | one              | {1,NULL}         | {1,NULL}   | {1}
+</screen>
+   In short, please read the documentation for the functions you use if they may receive null inputs
+   to understand how they will behave.  Send a documentation comment pointing out any functions
+   that do not behave strictly but whose actual behavior in the presence of null-valued input
+   is not described or readily inferred.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-aggregates">
+  <title>Null-Valued Arguments in Aggregate and Window Functions</title>
+  <para>
+   When executing an aggregate or window function the state tracking component
+   (which may be initialized to a non-null value, e.g., 0 for the count function)
+   will remain unchanged even if the underlying processing
+   function returns a null value, whether from being defined strict
+   or it returns a null value upon execution.  The aggregation
+   routine will usually ignore the null value and continue processing,
+   as demonstrated in <literal>count(value)</literal> below.
+<programlisting>
+SELECT
+ count(*) AS "Count",
+ count(value) AS "Count Value",
+ count(null_examples) AS "Count Composite",
+ count(row(value, value)) AS "Count Row"
+FROM null_examples;
+</programlisting>
+<screen>
+ Count | Count Value | Count Composite | Count Row
+-------+-------------+-----------------+-----------
+     3 |           2 |               3 |         3
+</screen>
+   Notice the "Count Row" outcome, though.  While we noted in the cardinal warning
+   that a composite whose fields are all null values is indistinguishable from
+   a null value of composite type, the count aggregate does indeed distinguish them,
+   recognizing and counting the non-null composite value produced by the
+   <link linkend="sql-syntax-row-constructors">row constructor</link>
+   <literal>row(null, null)</literal>.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-filtering">
+  <title>Null Values When Filtering</title>
+  <para>
+   A <literal>WHERE</literal> clause that evaluates to a null value for a given row will exclude that row.
+   Note below that, due to tri-valued logic described in <xref linkend="nullvalues-cardinalrule"/>,
+   the row with an id of 2 is not included in either of the first two results.  The third result, using
+   <literal>IS NULL</literal>, finds that row.
+<programlisting>
+SELECT id, value AS "Equals 1"
+FROM null_examples
+WHERE value = 1;
+
+SELECT id, value AS "Not Equal to 1"
+FROM null_examples
+WHERE value != 1;
+
+SELECT id, value AS "IS NULL"
+FROM null_examples
+WHERE value IS NULL;
+</programlisting>
+<screen>
+ id | Equals 1
+----+----------
+  1 |        1
+
+ id | Not Equal to 1
+----+----------------
+  3 |              4
+
+ id | IS NULL
+----+---------
+  2 |      \N
+</screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-table-constraints">
+  <title>Null Values in Table Constraints</title>
+  <para>
+   It is possible to define
+   <link linkend="ddl-constraints-check-constraints">check constraint</link>
+   expressions on tables to ensure only values passing those expressions are inserted.
+   While this seems like it would behave the same as a where clause, the choice here,
+   when an expression evaluates to a null value, is to allow the row to be inserted
+   - the same as a true result.
+<programlisting>
+BEGIN;
+ALTER TABLE null_examples ADD CONSTRAINT value_not_1 CHECK (value != 1);
+ROLLBACK;
+</programlisting>
+<screen>
+ERROR:  check constraint "value_not_1" of relation "null_examples" is violated by some row
+</screen>
+<programlisting>
+BEGIN;
+ALTER TABLE null_examples ADD CONSTRAINT value_not_10 CHECK (value != 10);
+ROLLBACK;
+</programlisting>
+<screen>
+ALTER TABLE
+</screen>
+   We are using a transaction (<command>BEGIN</command> and <command>ROLLBACK</command>) and
+   the <command>ALTER TABLE</command> command to add two constraints to our null_examples table.
+   The first constraint prohibits rows with a value of 1, which our row with an id of 1 violates.
+   Prohibiting the value 10 definitely allows rows with ids 1 and 3 to exist, and since we are
+   not told that some row violates our constraint the null value in the row with id 2 is being
+   accepted as well.
+  </para>
+  <para>
+   The <link linkend="ddl-constraints-not-null"><literal>NOT NULL</literal> column constraint</link>
+   produces the same answer as a <literal>column IS NOT NULL</literal> check constraint but is
+   more concise to write.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-grouping">
+  <title>Null Values When Grouping</title>
+  <para>
+   In the context of both <literal>DISTINCT</literal> and <literal>GROUP BY</literal>
+   it is necessary that all inputs resolve to being either equal to or not equal to all
+   other values.  These features use <link linkend="nullvalues-cardinalrule">distinctness</link>
+   instead of simple equality in order to handle a null value like a definite value equal to
+   another null value and unequal to all other values.
+<programlisting>
+WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+SELECT
+ value,
+ count(*) AS "Count"
+FROM vals
+GROUP BY value
+ORDER BY value;
+</programlisting>
+<screen>
+ value | Count
+-------+-------
+     1 |     2
+     2 |     1
+    \N |     2
+</screen>
+<programlisting>
+WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+SELECT DISTINCT value
+FROM vals
+ORDER BY value NULLS FIRST;
+</programlisting>
+<screen>
+ value
+-------
+    \N
+     1
+     2
+</screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-ordering">
+  <title>Null Values When Ordering</title>
+  <para>
+   In the context of <literal>ORDER BY</literal>, distinctness rules also apply,
+   though this is insufficient since it must be determined whether or not to
+   present null values before or after all non-null values.  To handle
+   this, the <literal>ORDER BY</literal> clause will let you specify either
+   <literal>NULLS FIRST</literal> or <literal>NULLS LAST</literal>.
+<programlisting>
+WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+SELECT value FROM vals
+ORDER BY value DESC NULLS FIRST;
+</programlisting>
+<screen>
+ value
+-------
+    \N
+    \N
+     2
+     1
+     1
+</screen>
+  </para>
+  <para>
+   Note that when dealing with multi-element values the comparison behavior described in
+   <xref linkend="nullvalues-multielementcomparison"/> applies:
+   if the comparison determination rests upon comparing a null value to a non-null value,
+   the multi-element value with the null-valued component will sort greater than the one
+   with a non-null component.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-indexed">
+  <title>Null Values in Indexes</title>
+  <para>
+   The uniqueness and relative ordering rules applied to null values
+   are defined when creating an index.  For the default
+   <literal>NULLS DISTINCT</literal> uniqueness, equality rules are applied.
+   Specifying <literal>NULLS NOT DISTINCT</literal> will result in
+   <literal>IS DISTINCT FROM</literal> rules being applied whereby all null
+   values are equal to each other.  This setting applies to all columns in the index.
+  </para>
+  <para>
+<programlisting>
+BEGIN;
+CREATE UNIQUE INDEX value_nulls_distinct_implicit ON null_examples (value);
+CREATE UNIQUE INDEX value_nulls_distinct_explicit ON null_examples (value) NULLS DISTINCT;
+INSERT INTO null_examples VALUES (4, NULL);
+ROLLBACK;
+</programlisting>
+<screen>
+CREATE INDEX
+CREATE INDEX
+INSERT 0 1
+</screen>
+<programlisting>
+BEGIN;
+CREATE UNIQUE INDEX value_nulls_not_distinct_explicit ON null_examples (value) NULLS NOT DISTINCT;
+INSERT INTO null_examples VALUES (4, NULL);
+ROLLBACK;
+</programlisting>
+<screen>
+CREATE INDEX
+ERROR:  duplicate key value violates unique constraint "value_nulls_not_distinct_explicit"
+DETAIL:  Key (value)=(null) already exists.
+</screen>
+  </para>
+  <para>
+   For ordering, each column in the index gets its own specification of
+   direction and null value placement similar to that found in the
+   <literal>ORDER BY</literal> clause.
+  </para>
+  <para>
+   Note that when dealing with multi-element values the comparison behavior described in
+   <xref linkend="nullvalues-multielementcomparison"/> applies,
+   if the comparison determination rests upon comparing a null value to a non-null value
+   the multi-element value with the null-valued component will sort greater than the one
+   with a non-null component.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-partitionkeys">
+  <title>Null Values in Partition Keys</title>
+  <para>
+   Presently, <productname>PostgreSQL</productname> requires that all the columns of a
+   partition key be included in the primary key.  Furthermore, all columns used in a primary
+   key must have a not-null column constraint applied to them.  Therefore, any partitioned table
+   with a primary key will only have non-null values in the partition key columns.
+  </para>
+  <para>
+   However, should you set up a situation where a partition key column can both: have a null value
+   and, null values in that key go to a specific partition, list-based routing will work as expected.
+   There is presently no way to direct rows having null values in partition keys away from the
+   default partition for range and hash partitioning.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-settings">
+  <title>Null-Valued Settings</title>
+  <para>
+   The value of a setting known to the system will never be null.  There is a bit of confusion
+   because the <function>current_setting</function> function has an operating mode where instead
+   of provoking an error when retrieving the value of a setting not known to the system it will
+   instead return a null value.  This null value should not be considered the value of the setting
+   but an error indicator.
+<programlisting>
+SELECT current_setting('example.string', false);
+SELECT current_setting('example.string', true);
+</programlisting>
+<screen>
+unrecognized configuration parameter "example.string"
+ current_setting
+-----------------
+ \N
+</screen>
+   The next paragraph discusses the corner case behavior when this
+   suggestion is not heeded.
+  </para>
+  <para>
+   The corner case mentioned above is only meaningful for
+   <link linkend="runtime-config-custom">custom settings</link>,
+   thus this section focuses on <link linkend="config-setting-sql">SQL interaction</link>.
+   Unlike settings created by extensions, custom settings can only be textual and the default
+   value for text here is the empty string.
+<programlisting>
+-- The transaction markers are left here to emphasize the rollback behavior.
+SHOW example.string;
+BEGIN;
+SELECT set_config('example.string', NULL, true);
+SELECT current_setting('example.string') IS NULL AS "Setting Is Null";
+ROLLBACK;
+SHOW example.string;
+RESET example.string;
+SHOW example.string;
+</programlisting>
+<screen>
+ERROR:  unrecognized configuration parameter "example.string"
+BEGIN
+ set_config
+------------
+
+
+ Setting Is Null
+-----------------
+ false
+
+ROLLBACK
+ example.string
+----------------
+
+
+RESET
+ example.string
+----------------
+
+</screen>
+   Notice two important behaviors: first, even though we passed in a null value to
+   the <literal>set_config</literal> function, the <literal>current_setting</literal>
+   function returned a non-null value, specifically the empty string.  Second, after ROLLBACK the
+   setting is still present (i.e., the error seen before creating the setting no longer appears),
+   and in fact will remain so until the session ends
+   (i.e., RESET does not restore the non-existence state.)
+  </para>
+  <para>
+    The other ways to specify settings do allow for null values;
+    a specific non-null value is required as part of the setting specification.
+   </para>
+ </sect2>
+
+ <sect2 id="nullvalues-json">
+  <title>Null Values in JSON</title>
+  <para>
+   As noted in <xref linkend="json-type-mapping-table"/>, the JSON specification's
+   null value is assigned its own type having a single constant value which can be
+   compared to all other JSON types with the expected non-null boolean result.
+   A consequence of this definition is that an SQL json or jsonb type containing
+   a JSON null value is seen as non-null in SQL.
+   (Note, while in SQL the capitalization of NULL is unimportant -
+   all-caps is just convention - JSON requires lowercase.)
+<programlisting>
+SELECT 'null'::json IS NULL AS "JSON null is NULL";
+</programlisting>
+<screen>
+ JSON null is NULL
+-------------------
+ false
+</screen>
+   Additionally, the SQL operators and functions involving JSON key or array element selection,
+   or construction from literals, require that a valid number or text value be supplied as an operand
+   and so an SQL null value cannot be targeted by those operators and functions.
+<programlisting>
+ SELECT to_json(null::text);
+</programlisting>
+<screen>
+ to_json
+---------
+ \N
+</screen>
+   That all said, the system will convert an SQL null value to a JSON null value when in a
+   composite type context.
+<programlisting>
+SELECT json_build_object('value', value)
+FROM null_examples;
+</programlisting>
+<screen>
+ json_build_object
+-------------------
+ {"value" : 1}
+ {"value" : null}
+ {"value" : 4}
+</screen>
+   And vice versa.
+<programlisting>
+SELECT *
+FROM jsonb_to_recordset('[{"value":1},{"value":null},{"value":4}]'::jsonb) AS jtr (value integer);
+</programlisting>
+<screen>
+ value
+-------
+     1
+    \N
+     4
+</screen>
+   Or when a simple scalar JSON null is cast to an SQL type.
+<programlisting>
+SELECT 'null'::jsonb::numeric IS NULL AS "Cast jsonb NULL to SQL NULL";
+</programlisting>
+<screen>
+ Cast jsonb NULL to SQL NULL
+-----------------------------
+ true
+</screen>
+  </para>
+  <para>
+   Aspects of null value handling within the internals of the JSON-related types are discussed
+   in <xref linkend="datatype-json"/>,
+   particularly in <xref linkend="datatype-jsonpath"/>.
+   This section is focused on how SQL null values are related to JSON null values.
+  </para>
+ </sect2>
+</sect1>
diff --git a/doc/src/sgml/ref/create_domain.sgml b/doc/src/sgml/ref/create_domain.sgml
index c111285a69c..0240f75f3cf 100644
--- a/doc/src/sgml/ref/create_domain.sgml
+++ b/doc/src/sgml/ref/create_domain.sgml
@@ -197,9 +197,10 @@ CREATE DOMAIN <replaceable class="parameter">name</replaceable> [ AS ] <replacea
    Domain constraints, particularly <literal>NOT NULL</literal>, are checked when
    converting a value to the domain type.  It is possible for a column that
    is nominally of the domain type to read as null despite there being such
-   a constraint.  For example, this can happen in an outer-join query, if
-   the domain column is on the nullable side of the outer join.  A more
-   subtle example is
+   a constraint.  For example, this can happen in
+   <link linkend="nullvalues-domains">an outer-join query</link>, if
+   the domain column is on the nullable side of the outer join.
+   A more subtle example is
 <programlisting>
 INSERT INTO tab (domcol) VALUES ((SELECT domcol FROM tab WHERE false));
 </programlisting>
diff --git a/doc/src/sgml/syntax.sgml b/doc/src/sgml/syntax.sgml
index 34c83880a66..2ed07bd8f2b 100644
--- a/doc/src/sgml/syntax.sgml
+++ b/doc/src/sgml/syntax.sgml
@@ -281,9 +281,9 @@ U&amp;"d!0061t!+000061" UESCAPE '!'
    </indexterm>
 
    <para>
-    There are three kinds of <firstterm>implicitly-typed
+    There are four kinds of <firstterm>implicitly-typed
     constants</firstterm> in <productname>PostgreSQL</productname>:
-    strings, bit strings, and numbers.
+    strings, bit strings, numbers, and the null value.
     Constants can also be specified with explicit types, which can
     enable more accurate representation and more efficient handling by
     the system. These alternatives are discussed in the following
@@ -834,6 +834,25 @@ CAST ( '<replaceable>string</replaceable>' AS <replaceable>type</replaceable> )
      usage, as is the function-call syntax.
     </para>
    </sect3>
+
+   <sect3 id="sql-syntax-constants-nullvalue">
+    <title>The Null Value Constant</title>
+    <indexterm>
+     <primary>null value</primary>
+     <secondary>constant</secondary>
+    </indexterm>
+    <para>
+     The null value represents an unknown value and its constant, the keyword <literal>NULL</literal>,
+     when evaluated in an expression, likewise yields a value of <literal>unknown</literal> type.
+     See <xref linkend="nullvalues"/> for an overview of how the system behaves in the presence
+     of a null value in various contexts.
+    </para>
+    <para>
+     Due to the typing of a null value as <literal>unknown</literal> it is often necessary to use
+     a cast, as described in the previous section, to convert it to the specific type needed.
+     However, implicit casting is performed when contextual information is available.
+    </para>
+   </sect3>
   </sect2>
 
   <sect2 id="sql-syntax-operators">
-- 
2.47.3

#75Marcos Pegoraro
marcos@f10.com.br
In reply to: Álvaro Herrera (#74)
Re: Document NULL

Em ter., 11 de nov. de 2025 às 12:34, Álvaro Herrera <alvherre@kurilemu.de>
escreveu:

I have rebased this; here's v9. I haven't reviewed it in depth, but
intend to give it a read and get it pushed sometime in the
not-too-distant future, so if anybody wants to review it some more, it'd
be appreciated

Maybe this one
<programlisting>
SELECT
1 + null AS "Add",
'text' || null AS "Concatenate";
</programlisting>

Would be good to explain about explicit casting, because only Numeric, Text
and Boolean will work implicitly.

This ones will work
SELECT
1 + null AS "Add",
'text' || null AS "Concatenate",
false or null AS "BoolOR";

But any other datatype will work only if casted properly
select Current_Date + null::integer;
select jsonb_build_object ('x',5) || null::jsonb

regards
Marcos

#76Chao Li
li.evan.chao@gmail.com
In reply to: Álvaro Herrera (#74)
Re: Document NULL

On Nov 11, 2025, at 23:34, Álvaro Herrera <alvherre@kurilemu.de> wrote:

On 2025-Jun-18, David G. Johnston wrote:

Version 8.

Marking this Ready to Commit in CF 2025-09 (CF PG19-1)

I have rebased this; here's v9. I haven't reviewed it in depth, but
intend to give it a read and get it pushed sometime in the
not-too-distant future, so if anybody wants to review it some more, it'd
be appreciated.

I just reviewed this patch and got some comments:

Note that this rebase was across the func.sgml split, which means I had
to do some "manual" merging. Looking at the git diff --stat output, it
seems to match what was there before, so I don't think anything was
lost.

--
Álvaro Herrera Breisgau, Deutschland — https://www.EnterpriseDB.com/
"Linux transformó mi computadora, de una `máquina para hacer cosas',
en un aparato realmente entretenido, sobre el cual cada día aprendo
algo nuevo" (Jaime Salinas)
<v9-0001-doc-Add-an-overview-of-NULL-treatment-in-PostgreS.patch>

1 - func-comparsions.sgml
```
+ tests are AND'd together. Note that <literal>IS DISTINCT FROM</literal> is not an operator.
```

The “note that” sentence is not clear. I believe you meant to say the “IS DISTINCT FROM” cannot generate null values because it is not an operator. But one thing being not an operator doesn’t mean it cannot generate null value, right? So I think we’d be explicit, I am suggesting:

"Note that, IS DISTINCT FROM does not produce null results — it always returns true or false."

This comment applies to 2 occurrences.

2 -  func-comparsions.sgml
```
+   Each side is evaluated and they are compared row-wise.
+   As discussed and shown in <xref linkend="nullvalues-multielementcomparison-composite"/>,
+   null values are treated as being equal to other null values and greater
+   than all non-null values.
+   Composite type
    comparisons are allowed when the <replaceable>operator</replaceable> is
```

The “composite type” line is too short, consider move the next line up.

3 -  func-comparsions.sgml
```
   <para>
-   If the array expression yields a null array, the result of
-   <token>ANY</token> will be null.  If the left-hand expression yields null,
-   the result of <token>ANY</token> is ordinarily null (though a non-strict
-   comparison operator could possibly yield a different result).
-   Also, if the right-hand array contains any null elements and no true
-   comparison result is obtained, the result of <token>ANY</token>
-   will be null, not false (again, assuming a strict comparison operator).
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both elements and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
```

For ANY, it should be “OR’d”.

4 - func-subquery.sgml
```
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>IN</token>
+   is <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result.
-   The result of <token>IN</token> is <quote>true</quote> if any equal subquery row is found.
-   The result is <quote>false</quote> if no equal row is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any equal subquery row is found.
+   The result is <quote>false</quote> if no equal row is found.
   </para>
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>IN</token> construct will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.
   </para>
```

IN should be ORed.

5 -  func-subquery.sgml
```
   <para>
-   The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
-   is evaluated and compared to each row of the subquery result.
-   The result of <token>NOT IN</token> is <quote>true</quote> if only unequal subquery rows
-   are found (including the case where the subquery returns no rows).
+   The right-hand side is a parenthesized subquery, which must return exactly one column.
+   The result of <token>NOT IN</token> is <quote>true</quote> if the subquery returns no rows,
+   otherwise the left-hand expression is evaluated and compared to each row of the subquery result.
+   The result is <quote>true</quote> if only unequal subquery rows are found.
    The result is <quote>false</quote> if any equal row is found.
   </para>
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>NOT IN</token> construct will be null, not true.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
+   tests are OR'd together.
   </para>
```

NOT IN should be ANDed.

6 - func-subquery.sgml
```
-   The result of <token>ANY</token> is <quote>true</quote> if any true result is obtained.
-   The result is <quote>false</quote> if no true result is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any true result is obtained.
+   The result is <quote>false</quote> if no true result is found.
   </para>

<para>
@@ -223,11 +213,10 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
</para>

   <para>
-   Note that if there are no successes and at least one right-hand row yields
-   null for the operator's result, the result of the <token>ANY</token> construct
-   will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
```

ANY should be OR-ed

7 - func-subquery.sgml
```
+ Note that <literal>IS DISTINCT FROM</literal> is not an operator.
```

Same as 1.

8 - nullvalues.sgml
```
+ to any other value (e.g., <literal>IS DISTINCT</literal>, and <literal>IS TRUE</literal>.)
```

Should “IS DISTINCT” be “IS DISTINCT FROM”?

9 - nullvalues.sgml
```
+ all non-null valueS.
```

Nit typo. Should be small “s".

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/

#77David G. Johnston
david.g.johnston@gmail.com
In reply to: Chao Li (#76)
Re: Document NULL

On Fri, Nov 14, 2025 at 1:52 AM Chao Li <li.evan.chao@gmail.com> wrote:

On Nov 11, 2025, at 23:34, Álvaro Herrera <alvherre@kurilemu.de> wrote:

On 2025-Jun-18, David G. Johnston wrote:

Version 8.

Marking this Ready to Commit in CF 2025-09 (CF PG19-1)

I have rebased this; here's v9. I haven't reviewed it in depth, but
intend to give it a read and get it pushed sometime in the
not-too-distant future, so if anybody wants to review it some more, it'd
be appreciated.

I just reviewed this patch and got some comments:

Note that this rebase was across the func.sgml split, which means I had
to do some "manual" merging. Looking at the git diff --stat output, it
seems to match what was there before, so I don't think anything was
lost.

Thanks for the review. Still on extended travel sabbatical until December
so my full attention may not yet be here; and am not able to resubmit a new
patch version right now. I'll do so in a couple of weeks, but appreciate
any assistance given.

--
Álvaro Herrera Breisgau, Deutschland —

https://www.EnterpriseDB.com/

"Linux transformó mi computadora, de una `máquina para hacer cosas',
en un aparato realmente entretenido, sobre el cual cada día aprendo
algo nuevo" (Jaime Salinas)
<v9-0001-doc-Add-an-overview-of-NULL-treatment-in-PostgreS.patch>

1 - func-comparsions.sgml
```
+ tests are AND'd together. Note that <literal>IS DISTINCT
FROM</literal> is not an operator.
```

The “note that” sentence is not clear. I believe you meant to say the “IS
DISTINCT FROM” cannot generate null values because it is not an operator.
But one thing being not an operator doesn’t mean it cannot generate null
value, right? So I think we’d be explicit, I am suggesting:

"Note that, IS DISTINCT FROM does not produce null results — it always
returns true or false."

This comment applies to 2 occurrences.

Reading this again here, the first part where "operator cannot produce null
values" seems sufficient and calling out "is distinct from" can probably
just be removed instead of rephrased.

2 -  func-comparsions.sgml
```
+   Each side is evaluated and they are compared row-wise.
+   As discussed and shown in <xref
linkend="nullvalues-multielementcomparison-composite"/>,
+   null values are treated as being equal to other null values and greater
+   than all non-null values.
+   Composite type
comparisons are allowed when the <replaceable>operator</replaceable> is
```

The “composite type” line is too short, consider move the next line up.

Yeah, some of the lines are broken purely for review patch diff
considerations.

For ANY, it should be “OR’d”.

I very well may have flipped the AND/ORs around.

8 - nullvalues.sgml
```
+ to any other value (e.g., <literal>IS DISTINCT</literal>, and
<literal>IS TRUE</literal>.)
```

Should “IS DISTINCT” be “IS DISTINCT FROM”?

Probably.

9 - nullvalues.sgml
```
+ all non-null valueS.
```

Nit typo. Should be small “s".

Yeah.

David J.

#78Peter Eisentraut
peter@eisentraut.org
In reply to: Álvaro Herrera (#74)
Re: Document NULL

On 11.11.25 16:34, Álvaro Herrera wrote:

On 2025-Jun-18, David G. Johnston wrote:

Version 8.

Marking this Ready to Commit in CF 2025-09 (CF PG19-1)

I have rebased this; here's v9. I haven't reviewed it in depth, but
intend to give it a read and get it pushed sometime in the
not-too-distant future, so if anybody wants to review it some more, it'd
be appreciated.

diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 948b9327f24..5ee0391d371 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -168,6 +168,8 @@ DROP TABLE products;
</para>
</sect1>

+ &nullvalues;

I don't know if this is the right place for this section, if you
follow the flow of the chapters. The proposed text requires that you
already know about DML, queries, data types, and functions, all of
which come much later.

I also don't like the approach of this patch to pull out all of the
null-related information from those various places and collect them
all in one section. I mean, that's interesting if you're really into
studying null and how it affects various parts of SQL. But if I'm
like looking to use IS DISTINCT or whatever specific construct, then I
want to get all the information relevant to that right there, not in
various other places.

#79David G. Johnston
david.g.johnston@gmail.com
In reply to: Peter Eisentraut (#78)
Re: Document NULL

On Saturday, November 15, 2025, Peter Eisentraut <peter@eisentraut.org>
wrote:

On 11.11.25 16:34, Álvaro Herrera wrote:

On 2025-Jun-18, David G. Johnston wrote:

Version 8.

Marking this Ready to Commit in CF 2025-09 (CF PG19-1)

I have rebased this; here's v9. I haven't reviewed it in depth, but
intend to give it a read and get it pushed sometime in the
not-too-distant future, so if anybody wants to review it some more, it'd
be appreciated.

diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 948b9327f24..5ee0391d371 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -168,6 +168,8 @@ DROP TABLE products;
</para>
</sect1>

+ &nullvalues;

I don't know if this is the right place for this section, if you
follow the flow of the chapters. The proposed text requires that you
already know about DML, queries, data types, and functions, all of
which come much later.the.

Please make a concrete proposal of where to place it. Ideally after
considering the discussion had a while back in the thread on this topic.

I also don't like the approach of this patch to pull out all of the

null-related information from those various places and collect them
all in one section. I mean, that's interesting if you're really into
studying null and how it affects various parts of SQL. But if I'm
like looking to use IS DISTINCT or whatever specific construct, then I
want to get all the information relevant to that right there, not in
various other places.

This section is a comprehensive review and place for examples pertaining to
the handling of null values. Most of the feature sections already have the
relevant text present. If they do not have sufficient commentary, that can
be added independently of this reference section. There probably can be
quite a few more links from other places to here (I didn't really try on
these) and from here to those places (though I think I got those covered
fairly well) in a follow-on patch.

Null values introduce non-intuitive behaviors to the system and need to be
learned as a topic of study in order to safely operate the system. There
is no way to glean the breadth of this cross-cutting oddity of the language
without someone having curated the information into a single place. (Well,
I suppose we could ensure that "Null values" is an index term and points to
every place for linking via the index - but this section seems both more
helpful and, while probably harder to accomplish, the hard work is
complete.)

David J.

#80David G. Johnston
david.g.johnston@gmail.com
In reply to: Chao Li (#76)
2 attachment(s)
Re: Document NULL

On Thu, Nov 13, 2025 at 11:52 PM Chao Li <li.evan.chao@gmail.com> wrote:

On Nov 11, 2025, at 23:34, Álvaro Herrera <alvherre@kurilemu.de> wrote:

On 2025-Jun-18, David G. Johnston wrote:

Version 8.

Marking this Ready to Commit in CF 2025-09 (CF PG19-1)

I have rebased this; here's v9. I haven't reviewed it in depth, but
intend to give it a read and get it pushed sometime in the
not-too-distant future, so if anybody wants to review it some more, it'd
be appreciated.

I just reviewed this patch and got some comments:

The edit patch goes on top of v9 with some line width fixes in the
"any/in/all -> and/or" commentary locations made alongside fixing
the incorrect pairs.

I added pset display_true to the preamble since that feature has since been
added.

Plus fixing the other noted items.

I'm choosing not to worry about the implicit casting to integer/text in
the example Marcos pointed out.

David J.

Attachments:

0001-v9.patchtext/x-patch; charset=US-ASCII; name=0001-v9.patchDownload
From 5b5d055d0367a2287ccc953f6b7a6a8ac031bcab Mon Sep 17 00:00:00 2001
From: "David G. Johnston" <David.G.Johnston@Gmail.com>
Date: Mon, 15 Dec 2025 14:13:49 -0700
Subject: [PATCH 1/2] v9

The handling of NULL within PostgreSQL is broad, varied, and
unintuitive.  This new section provides a place for the reader
to go and skim over the various behaviors and stick them in
the back of their mind.

Some existing documentation is tweaked to be more in line with
the overall flow of the material presented in this overview.
The individual features do still constitute an authoritative
location for describing the behaviors - but now have a more
convenient place to put examples.
---
 doc/src/sgml/datatype.sgml              |    2 +-
 doc/src/sgml/ddl.sgml                   |    2 +
 doc/src/sgml/filelist.sgml              |    1 +
 doc/src/sgml/func/func-comparisons.sgml |  123 +--
 doc/src/sgml/func/func-subquery.sgml    |  150 +--
 doc/src/sgml/json.sgml                  |    7 +-
 doc/src/sgml/nullvalues.sgml            | 1126 +++++++++++++++++++++++
 doc/src/sgml/ref/create_domain.sgml     |    7 +-
 doc/src/sgml/syntax.sgml                |   23 +-
 9 files changed, 1281 insertions(+), 160 deletions(-)
 create mode 100644 doc/src/sgml/nullvalues.sgml

diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml
index e5267a8e4be..28d931fa9c9 100644
--- a/doc/src/sgml/datatype.sgml
+++ b/doc/src/sgml/datatype.sgml
@@ -5399,7 +5399,7 @@ WHERE ...
        <row>
         <entry><type>unknown</type></entry>
         <entry>Identifies a not-yet-resolved type, e.g., of an undecorated
-         string literal.</entry>
+         string literal.  Also, the <link linkend="nullvalues-usage">null value.</link></entry>
        </row>
       </tbody>
      </tgroup>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index cea28c00f8a..698791c00c4 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -168,6 +168,8 @@ DROP TABLE products;
   </para>
  </sect1>
 
+ &nullvalues;
+
  <sect1 id="ddl-default">
   <title>Default Values</title>
 
diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml
index ac66fcbdb57..9b56a0d3393 100644
--- a/doc/src/sgml/filelist.sgml
+++ b/doc/src/sgml/filelist.sgml
@@ -24,6 +24,7 @@
 <!ENTITY indices    SYSTEM "indices.sgml">
 <!ENTITY json       SYSTEM "json.sgml">
 <!ENTITY mvcc       SYSTEM "mvcc.sgml">
+<!ENTITY nullvalues SYSTEM "nullvalues.sgml">
 <!ENTITY parallel   SYSTEM "parallel.sgml">
 <!ENTITY perform    SYSTEM "perform.sgml">
 <!ENTITY queries    SYSTEM "queries.sgml">
diff --git a/doc/src/sgml/func/func-comparisons.sgml b/doc/src/sgml/func/func-comparisons.sgml
index 6a6e0bd4019..970997e368a 100644
--- a/doc/src/sgml/func/func-comparisons.sgml
+++ b/doc/src/sgml/func/func-comparisons.sgml
@@ -57,7 +57,8 @@
    <productname>PostgreSQL</productname> extensions; the rest are
    <acronym>SQL</acronym>-compliant.
    All of the expression forms documented in this section return
-   Boolean (true/false) results.
+   <link linkend="nullvalues">three-valued</link> boolean typed
+   results (true, false, or null).
   </para>
 
   <sect2 id="functions-comparisons-in-scalar">
@@ -70,24 +71,13 @@
   <para>
    The right-hand side is a parenthesized list
    of expressions.  The result is <quote>true</quote> if the left-hand expression's
-   result is equal to any of the right-hand expressions.  This is a shorthand
-   notation for
-
-<synopsis>
-<replaceable>expression</replaceable> = <replaceable>value1</replaceable>
-OR
-<replaceable>expression</replaceable> = <replaceable>value2</replaceable>
-OR
-...
-</synopsis>
+   result is equal to any of the right-hand expressions.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand expression yields
-   null, the result of the <token>IN</token> construct will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence null values since the multiple equality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -101,35 +91,15 @@ OR
   <para>
    The right-hand side is a parenthesized list
    of expressions.  The result is <quote>true</quote> if the left-hand expression's
-   result is unequal to all of the right-hand expressions.  This is a shorthand
-   notation for
-
-<synopsis>
-<replaceable>expression</replaceable> &lt;&gt; <replaceable>value1</replaceable>
-AND
-<replaceable>expression</replaceable> &lt;&gt; <replaceable>value2</replaceable>
-AND
-...
-</synopsis>
+   result is unequal to all of the right-hand expressions.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand expression yields
-   null, the result of the <token>NOT IN</token> construct will be null, not true
-   as one might naively expect.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of null values since the multiple inequality
+   tests are OR'd together.
   </para>
 
-  <tip>
-  <para>
-   <literal>x NOT IN y</literal> is equivalent to <literal>NOT (x IN y)</literal> in all
-   cases.  However, null values are much more likely to trip up the novice when
-   working with <token>NOT IN</token> than when working with <token>IN</token>.
-   It is best to express your condition positively if possible.
-  </para>
-  </tip>
   </sect2>
 
   <sect2 id="functions-comparisons-any-some">
@@ -142,30 +112,26 @@ AND
 
   <para>
    The right-hand side is a parenthesized expression, which must yield an
-   array value.
-   The left-hand expression
+   array value. The result of <token>ANY</token> is
+   <quote>false</quote> if the array has zero element, otherwise
+   the left-hand expression
    is evaluated and compared to each element of the array using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ANY</token> is <quote>true</quote> if any true result is obtained.
-   The result is <quote>false</quote> if no true result is found (including the
-   case where the array has zero elements).
+   The result is <quote>true</quote> if any true result is obtained.
+   The result is <quote>false</quote> if no true result is found.
   </para>
 
   <para>
-   If the array expression yields a null array, the result of
-   <token>ANY</token> will be null.  If the left-hand expression yields null,
-   the result of <token>ANY</token> is ordinarily null (though a non-strict
-   comparison operator could possibly yield a different result).
-   Also, if the right-hand array contains any null elements and no true
-   comparison result is obtained, the result of <token>ANY</token>
-   will be null, not false (again, assuming a strict comparison operator).
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both elements and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
    <token>SOME</token> is a synonym for <token>ANY</token>.
+   <token>IN</token> is equivalent to <literal>= ANY</literal>.
   </para>
   </sect2>
 
@@ -179,26 +145,27 @@ AND
   <para>
    The right-hand side is a parenthesized expression, which must yield an
    array value.
-   The left-hand expression
+   The result of <token>ALL</token> is
+   <quote>true</quote> if the array has zero elements, otherwise
+   the left-hand expression
    is evaluated and compared to each element of the array using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ALL</token> is <quote>true</quote> if all comparisons yield true
-   (including the case where the array has zero elements).
+   The result is <quote>true</quote> if all comparisons yield true.
    The result is <quote>false</quote> if any false result is found.
   </para>
 
   <para>
-   If the array expression yields a null array, the result of
-   <token>ALL</token> will be null.  If the left-hand expression yields null,
-   the result of <token>ALL</token> is ordinarily null (though a non-strict
-   comparison operator could possibly yield a different result).
-   Also, if the right-hand array contains any null elements and no false
-   comparison result is obtained, the result of <token>ALL</token>
-   will be null, not true (again, assuming a strict comparison operator).
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both elements and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
+
+  <para>
+   <token>NOT IN</token> is equivalent to <literal>&lt;&gt; ALL</literal>.
+  </para>
+
   </sect2>
 
   <sect2 id="row-wise-comparison">
@@ -249,6 +216,11 @@ AND
    considered.
   </para>
 
+  <para>
+   See <xref linkend="nullvalues-multielementcomparison-rowconstructor"/>
+   and surrounding content for additional details and examples.
+  </para>
+
 <synopsis>
 <replaceable>row_constructor</replaceable> IS DISTINCT FROM <replaceable>row_constructor</replaceable>
 </synopsis>
@@ -283,20 +255,11 @@ AND
 </synopsis>
 
   <para>
-   The SQL specification requires row-wise comparison to return NULL if the
-   result depends on comparing two NULL values or a NULL and a non-NULL.
-   <productname>PostgreSQL</productname> does this only when comparing the
-   results of two row constructors (as in
-   <xref linkend="row-wise-comparison"/>) or comparing a row constructor
-   to the output of a subquery (as in <xref linkend="functions-subquery"/>).
-   In other contexts where two composite-type values are compared, two
-   NULL field values are considered equal, and a NULL is considered larger
-   than a non-NULL.  This is necessary in order to have consistent sorting
-   and indexing behavior for composite types.
-  </para>
-
-  <para>
-   Each side is evaluated and they are compared row-wise.  Composite type
+   Each side is evaluated and they are compared row-wise.
+   As discussed and shown in <xref linkend="nullvalues-multielementcomparison-composite"/>,
+   null values are treated as being equal to other null values and greater
+   than all non-null values.
+   Composite type
    comparisons are allowed when the <replaceable>operator</replaceable> is
    <literal>=</literal>,
    <literal>&lt;&gt;</literal>,
diff --git a/doc/src/sgml/func/func-subquery.sgml b/doc/src/sgml/func/func-subquery.sgml
index a9f2b12e48c..d516dc7132d 100644
--- a/doc/src/sgml/func/func-subquery.sgml
+++ b/doc/src/sgml/func/func-subquery.sgml
@@ -33,7 +33,8 @@
    This section describes the <acronym>SQL</acronym>-compliant subquery
    expressions available in <productname>PostgreSQL</productname>.
    All of the expression forms documented in this section return
-   Boolean (true/false) results.
+   <link linkend="nullvalues">three-valued</link> typed
+   results (true, false, or null).
   </para>
 
   <sect2 id="functions-subquery-exists">
@@ -95,19 +96,17 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>IN</token>
+   is <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result.
-   The result of <token>IN</token> is <quote>true</quote> if any equal subquery row is found.
-   The result is <quote>false</quote> if no equal row is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any equal subquery row is found.
+   The result is <quote>false</quote> if no equal row is found.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>IN</token> construct will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.
   </para>
 
   <para>
@@ -124,21 +123,18 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.
+   The result of <token>IN</token> is <quote>false</quote> if the subquery returns no rows,
+   otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result.
-   The result of <token>IN</token> is <quote>true</quote> if any equal subquery row is found.
-   The result is <quote>false</quote> if no equal row is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any equal subquery row is found.
+   The result is <quote>false</quote> if no equal row is found.
   </para>
 
   <para>
-   As usual, null values in the rows are combined per
-   the normal rules of SQL Boolean expressions.  Two rows are considered
-   equal if all their corresponding members are non-null and equal; the rows
-   are unequal if any corresponding members are non-null and unequal;
-   otherwise the result of that row comparison is unknown (null).
-   If all the per-row results are either unequal or null, with at least one
-   null, then the result of <token>IN</token> is null.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -150,20 +146,17 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 </synopsis>
 
   <para>
-   The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
-   is evaluated and compared to each row of the subquery result.
-   The result of <token>NOT IN</token> is <quote>true</quote> if only unequal subquery rows
-   are found (including the case where the subquery returns no rows).
+   The right-hand side is a parenthesized subquery, which must return exactly one column.
+   The result of <token>NOT IN</token> is <quote>true</quote> if the subquery returns no rows,
+   otherwise the left-hand expression is evaluated and compared to each row of the subquery result.
+   The result is <quote>true</quote> if only unequal subquery rows are found.
    The result is <quote>false</quote> if any equal row is found.
   </para>
 
   <para>
-   Note that if the left-hand expression yields null, or if there are
-   no equal right-hand values and at least one right-hand row yields
-   null, the result of the <token>NOT IN</token> construct will be null, not true.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
+   tests are OR'd together.
   </para>
 
   <para>
@@ -180,21 +173,18 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.
+   The result of <token>NOT IN</token> is <quote>true</quote> if the subquery returns no rows,
+   otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result.
-   The result of <token>NOT IN</token> is <quote>true</quote> if only unequal subquery rows
-   are found (including the case where the subquery returns no rows).
+   The result is <quote>true</quote> if only unequal subquery rows are found.
    The result is <quote>false</quote> if any equal row is found.
   </para>
 
   <para>
-   As usual, null values in the rows are combined per
-   the normal rules of SQL Boolean expressions.  Two rows are considered
-   equal if all their corresponding members are non-null and equal; the rows
-   are unequal if any corresponding members are non-null and unequal;
-   otherwise the result of that row comparison is unknown (null).
-   If all the per-row results are either unequal or null, with at least one
-   null, then the result of <token>NOT IN</token> is null.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
+   tests are OR'd together.
   </para>
   </sect2>
 
@@ -208,13 +198,13 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>ANY</token> is
+   <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ANY</token> is <quote>true</quote> if any true result is obtained.
-   The result is <quote>false</quote> if no true result is found (including the
-   case where the subquery returns no rows).
+   The result is <quote>true</quote> if any true result is obtained.
+   The result is <quote>false</quote> if no true result is found.
   </para>
 
   <para>
@@ -223,11 +213,10 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   </para>
 
   <para>
-   Note that if there are no successes and at least one right-hand row yields
-   null for the operator's result, the result of the <token>ANY</token> construct
-   will be null, not false.
-   This is in accordance with SQL's normal rules for Boolean combinations
-   of null values.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -245,16 +234,19 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.  The result of <token>ANY</token> is
+   <quote>false</quote> if the subquery returns no rows, otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result,
    using the given <replaceable>operator</replaceable>.
-   The result of <token>ANY</token> is <quote>true</quote> if the comparison
-   returns true for any subquery row.
-   The result is <quote>false</quote> if the comparison returns false for every
-   subquery row (including the case where the subquery returns no
-   rows).
-   The result is NULL if no comparison with a subquery row returns true,
-   and at least one comparison returns NULL.
+   The result is <quote>true</quote> if the comparison returns true for any subquery row.
+   The result is <quote>false</quote> if the comparison returns false for every subquery row.
+  </para>
+
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
+   tests are OR'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -272,15 +264,20 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
 
   <para>
    The right-hand side is a parenthesized
-   subquery, which must return exactly one column.  The left-hand expression
+   subquery, which must return exactly one column.  The result of <token>ALL</token> is
+   <quote>true</quote> if the subquery returns no rows, otherwise the left-hand expression
    is evaluated and compared to each row of the subquery result using the
    given <replaceable>operator</replaceable>, which must yield a Boolean
    result.
-   The result of <token>ALL</token> is <quote>true</quote> if all rows yield true
-   (including the case where the subquery returns no rows).
+   The result is <quote>true</quote> if all rows yield true.
    The result is <quote>false</quote> if any false result is found.
-   The result is NULL if no comparison with a subquery row returns false,
-   and at least one comparison returns NULL.
+  </para>
+
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
 
   <para>
@@ -301,22 +298,21 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    as described in <xref linkend="sql-syntax-row-constructors"/>.
    The right-hand side is a parenthesized
    subquery, which must return exactly as many columns as there are
-   expressions in the left-hand row.  The left-hand expressions are
+   expressions in the left-hand row.  The result of <token>ALL</token> is
+   <quote>true</quote> if the subquery returns no rows, otherwise the left-hand expressions are
    evaluated and compared row-wise to each row of the subquery result,
    using the given <replaceable>operator</replaceable>.
-   The result of <token>ALL</token> is <quote>true</quote> if the comparison
-   returns true for all subquery rows (including the
-   case where the subquery returns no rows).
-   The result is <quote>false</quote> if the comparison returns false for any
-   subquery row.
-   The result is NULL if no comparison with a subquery row returns false,
-   and at least one comparison returns NULL.
+   The result is <quote>true</quote> if the comparison returns true for all subquery rows.
+   The result is <quote>false</quote> if the comparison returns false for any subquery row.
   </para>
 
   <para>
-   See <xref linkend="row-wise-comparison"/> for details about the meaning
-   of a row constructor comparison.
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, it is not possible to see
+   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
+   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
   </para>
+
   </sect2>
 
   <sect2 id="functions-subquery-single-row-comp">
@@ -341,6 +337,14 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
    compared row-wise to the single subquery result row.
   </para>
 
+  <para>
+   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
+   <xref linkend="nullvalues-multielement"/>, the result cannot be <quote>true</quote> in the
+   presence of null valued fields in either the row constructor or the subquery result row, as
+   the individual field tests are AND'd together.
+   Note that <literal>IS DISTINCT FROM</literal> is not an operator.
+  </para>
+
   <para>
    See <xref linkend="row-wise-comparison"/> for details about the meaning
    of a row constructor comparison.
diff --git a/doc/src/sgml/json.sgml b/doc/src/sgml/json.sgml
index 206eadb8f7b..0f39d4bf21a 100644
--- a/doc/src/sgml/json.sgml
+++ b/doc/src/sgml/json.sgml
@@ -129,6 +129,11 @@
   the corresponding <productname>PostgreSQL</productname> types.
  </para>
 
+ <indexterm>
+  <primary>null value</primary>
+  <secondary sortas="json">within JSON</secondary>
+ </indexterm>
+
   <table id="json-type-mapping-table">
      <title>JSON Primitive Types and Corresponding <productname>PostgreSQL</productname> Types</title>
      <tgroup cols="3">
@@ -162,7 +167,7 @@
        <row>
         <entry><type>null</type></entry>
         <entry>(none)</entry>
-        <entry>SQL <literal>NULL</literal> is a different concept</entry>
+        <entry>An SQL null value is similar, but see <xref linkend="nullvalues-json"/> for differences.</entry>
        </row>
       </tbody>
      </tgroup>
diff --git a/doc/src/sgml/nullvalues.sgml b/doc/src/sgml/nullvalues.sgml
new file mode 100644
index 00000000000..53063f598ee
--- /dev/null
+++ b/doc/src/sgml/nullvalues.sgml
@@ -0,0 +1,1126 @@
+<!-- doc/src/sgml/nullvalues.sgml -->
+
+<sect1 id="nullvalues">
+ <title>Null Values Overview</title>
+
+ <indexterm>
+  <primary>null value</primary>
+ </indexterm>
+
+ <para>
+  This section first introduces the concept of null values and then
+  explains how different parts of the system behave when provided
+  one or more null value inputs.  Examples throughout this section
+  can be executed so long as the following table and rows are created first.
+ </para>
+
+ <para>
+  Throughout this section, the discussion of null values will be limited to
+  the SQL language unless otherwise noted.  The JSON-related data types, and the
+  non-SQL procedural languages, have their own behaviors documented in their
+  respective areas.
+ </para>
+
+ <para>
+  The following <literal>CREATE TABLE</literal> and <literal>INSERT</literal>
+  SQL commands can be executed in any SQL client to create and populate
+  the persistent table used in the examples below.  The <literal>\pset</literal>
+  commands require the use of <application>psql</application> as the client program;
+  they make the resulting output a bit easier to read and do not impact any behaviors
+  described herein.  Note, the examples below have been manually edited to show
+  <literal>true</literal> and <literal>false</literal> instead of
+  <literal>t</literal> and <literal>f</literal>.  They also omit any transactional
+  command output when transactions are used.  Instead, each transaction gets its own
+  display block.
+ </para>
+
+<programlisting>
+CREATE TABLE null_examples (
+  id bigint PRIMARY KEY,
+  value integer NULL
+);
+INSERT INTO null_examples
+VALUES (1, 1), (2, NULL), (3, 4);
+
+-- This makes null values print as \N in the output instead of the empty string.
+\pset null '\\N'
+-- Removes the row count footer that prints by default.
+\pset footer off
+</programlisting>
+
+ <sect2 id="nullvalues-model">
+  <title>Meaning</title>
+  <para>
+   Generally, a null value is assumed to mean "unknown", but other interpretations
+   are common.  A data model design may state that a null value
+   is to be used to represent "not applicable" - i.e., that a value is not
+   even possible.  The null value also takes on a literal meaning of "not found"
+   when produced as the result of an outer join.
+  </para>
+  <para>
+   In different programming languages, some of which are accessible in the server
+   as procedural languages, the null value is represented in other ways.
+   Of those included in <productname>PostgreSQL</productname>,
+   these are:
+   <literal>None</literal> in <productname>Python</productname>,
+   <literal>undefined</literal> in <productname>Perl</productname>,
+   and the empty string in <productname>TCL</productname>.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-usage">
+  <title>Usage</title>
+  <para>
+   A null value, like all values, must have a data type, and is valid for all data types.
+   It must also be printed as text.  This section discusses null values at the boundaries
+   of the system, as well as how they can come into existence due to the design of a query.
+  </para>
+  <sect3 id="nullvalues-usage-input">
+   <title>Null Value Input</title>
+   <para>
+    A null value can be used as input to any function, operator, or expression.
+    The system will then decide how to behave based on the rules described in the
+    rest of this section.
+   </para>
+   <para>
+    As noted in <xref linkend="sql-syntax-constants-nullvalue"/>,
+    a null value literal is written using the <literal>NULL</literal> keyword.
+    Its type is the <link linkend="datatype-pseudo">pseudo-type unknown</link>
+    but can be cast to any concrete data type.
+   </para>
+   <para>
+<programlisting>
+SELECT
+ NULL AS "Literal Null Value",
+ pg_typeof(null) AS "Type of Null",
+ pg_typeof(NULL::text) AS "Type of Cast Null",
+ cast(null as text) AS "Cast Null Value";
+</programlisting>
+<screen>
+ Literal Null Value | Type of Null | Type of Cast Null | Cast Null Value
+--------------------+--------------+-------------------+-----------------
+ \N                 | unknown      | text              | \N
+</screen>
+   </para>
+   <para>
+<programlisting>
+SELECT text NULL;
+</programlisting>
+<screen>
+ERROR:  column "text" does not exist
+LINE 1: select text NUll;
+</screen>
+   </para>
+   <para>
+    The <link linkend="sql-copy"><command>COPY ... FROM</command></link> command,
+    including its psql counter-part meta-command
+    <link linkend="app-psql-meta-commands-copy"><command>\copy</command></link>,
+    must deal with input files containing textual representations of the null value.
+    The lack of consistency in real-world data requires having a few options to the
+    command related to null handling.  See the documentation in
+    <xref linkend="sql-copy"/> for more information.
+    But, in short, for CSV input it expects text to be quoted and interprets an unquoted
+    empty string as the null value.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-tables">
+   <title>Null Values in Tables</title>
+   <para>
+    From a semantics perspective a table treats a null value like any other value.
+    However, the SQL Language recognizes its uniqueness by defining a column-scoped
+    <link linkend="nullvalues-table-constraints"><literal>NOT NULL</literal> constraint</link>
+    as syntactic sugar.  At present one would expect that a column having a
+    domain data type with a <literal>NOT NULL</literal> constraint would likewise be
+    incapable of having a null value stored.  This is not the case.  See the commentary
+    below in <xref linkend="nullvalues-domains"/> for more information.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-derived">
+   <title>Derived Null Values</title>
+   <para>
+    Even if all data stored in tables are known to be non-null, null values can still
+    be produced while executing a query.  The most common way this happens is by
+    introducing a (left) outer join to the query and having left side data without
+    corresponding data on the right side of the join.
+<programlisting>
+SELECT
+ countries.country,
+ flagships.flagship
+FROM (
+ VALUES ('Spain'), ('Switzerland')
+) as countries (country)
+LEFT JOIN (
+ VALUES ('Spain', 'Ship')
+) as flagships (country, flagship)
+ON countries.country = flagships.country;
+</programlisting>
+<screen>
+   country   | flagship
+-------------+----------
+ Spain       | Ship
+ Switzerland | \N
+</screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-output">
+   <title>Null Value Output</title>
+   <para>
+    As evidenced above, the "absence of value" aspect of the null value results
+    in its secondary textual representation being an empty string
+    (its primary representation is just NULL).
+    This can be problematic if the empty string is expected to be a valid value.
+    Therefore, places that deal with possible null values as input and text as
+    output need some means to give the user a way to specify how to print
+    the null value.
+   </para>
+   <para>
+    Generally, the primary representation is used when the value is part of a multi-element value.
+    If the value is being displayed by itself the secondary (blank) representation is used.  The settings
+    discussed herein typically control the secondary representation.  The null value representation when it
+    is within a container type (composite, array, etc...) is controlled by the input and output rules of the
+    container type.  It is when the container value itself is the null value that these generalities then apply.
+   </para>
+   <para>
+    No matter how the null value got into the result when presenting results to the user it is
+    necessary to present null values using text.  This is the responsibility of the client application.
+    The <command>psql</command> client program has the <link linkend="app-psql-meta-command-pset-null">
+    <literal>\pset null</literal> meta-command</link> to specify the textual output of null values
+    it encounters in query results.
+   </para>
+   <para>
+    When the final output of the result is a text file instead of a user additional
+    considerations come into play.  While the option to take the user presentation
+    and send it to a text file always exists <productname>PostgreSQL</productname> also
+    provides a facility to output a structured text file.
+    The <link linkend="sql-copy"><command>COPY ... TO</command></link> command,
+    including its psql counter-part meta-command
+    <link linkend="app-psql-meta-commands-copy"><command>\copy</command></link>,
+    has the <literal>NULL</literal> option (and some modifier options) to specify
+    the string to print to the output for null values it encounters in the query result.
+    As with input file processing, for the CSV format it will, by default,
+    produce an unquoted empty string for the null value.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-usage-handling">
+   <title>Null Value Handling</title>
+   <para>
+    The presence of null values in the system results in three-valued logic.
+    In conventional two-valued (binary) logic every outcome is either true or false.
+    In three-valued logic the concept of unknown, represented using the null value, is
+    also an outcome.  This results in falsifying the common-sense notion
+    that "p OR NOT p" is always true.
+<programlisting>
+SELECT
+ NULL OR NOT NULL AS "N OR !N";
+</programlisting>
+<screen>
+ N OR !N
+---------
+ \N
+</screen>
+    (See <xref linkend="nullvalues-operands"/> for more explanation.)
+   </para>
+   <para>
+    When dealing with null values it is often useful to explicitly to convert
+    data to and from a null value given a known non-null representation
+    (e.g., the empty string, the numbers 0 or 1, or boolean false).
+    The <link linkend="functions-coalesce-nvl-ifnull">COALESCE</link> and
+    <link linkend="functions-nullif">NULLIF</link> functions are useful
+    for this purpose.
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-cardinalrule">
+  <title>Distinctness - Overcoming the Cardinal Rule of Null Values</title>
+  <para>
+   The cardinal rule, a null value is
+   <link linkend="functions-comparison-op-table">
+    neither equal nor unequal
+   </link>
+   to any value, including other null values.
+<programlisting>
+SELECT
+ NULL = NULL AS "N = N",
+ NULL != NULL AS "N != N",
+ 1 = NULL AS "1 = N",
+ 1 != NULL AS "1 != N",
+ 1 = 1 AS "1 = 1",
+ 1 != 1 AS "1 != 1";
+</programlisting>
+<screen>
+ N = N | N != N | 1 = N | 1 != N | 1 = 1 | 1 != 1
+-------+--------+-------+--------+-------+--------
+ \N    | \N     | \N    | \N     | true  | false
+</screen>
+   However, as with many rules, there are exceptions, as noted in
+   <xref linkend="nullvalues-multielementcomparison"/>.
+   Particularly, when the two compared values are part of a larger multi-element value.
+<programlisting>
+SELECT
+ array[1,2]=array[1,null] AS "Array Equals";
+</programlisting>
+<screen>
+ Array Equals
+--------------
+ false
+</screen>
+  </para>
+  <para>
+   Because of this SQL standard rule, checking for a null value has an
+   explicit <literal>IS NULL</literal> predicate.  Additionally, there are comparison
+   predicates that consider a null value equal to other null values but unequal
+   to any other value (e.g., <literal>IS DISTINCT</literal>, and <literal>IS TRUE</literal>.)
+   These, and other predicates, are described in
+   <xref linkend="functions-comparison-pred-table"/>
+<programlisting>
+SELECT id, value,
+ value IS NULL AS "IS NULL",
+ value IS DISTINCT FROM id AS "IS DIST",
+ value != id AS "IS !="
+FROM null_examples;
+</programlisting>
+<screen>
+ id | value | IS NULL | IS DIST | IS !=
+----+-------+---------+---------+-------
+  1 |     1 | false   | false   | false
+  2 |    \N | true    | true    | \N
+  3 |     4 | false   | true    | true
+</screen>
+  </para>
+  <para>
+   On the other hand, the SQL standard is largely alone in taking this approach to comparing
+   values to the null value.  For example, when working within the JSON data types the use of equals
+   produces true or false and so the concept of distinctness is neither present nor required.
+   Additional details and links are provided in <xref linkend="nullvalues-json"/>.
+   For the non-SQL procedural languages, please consult the appropriate documentation.
+  </para>
+  <para>
+   There is also a cardinal warning: when dealing with
+   <link linkend="rowtypes">composite types</link> in
+   expressions, <literal>composite IS NULL</literal>
+   and <literal>composite IS NOT NULL</literal>
+   are not the opposites of each other in the case where some,
+   but not all, of the composite's fields are null values.
+   (The case where all fields are null is indistinguishable
+   from the composite as a whole being null.)
+   Write <literal>NOT(composite IS NULL)</literal> instead.
+<programlisting>
+SELECT
+ c,
+ c IS NULL AS "c IS N",
+ NOT(c IS NULL) AS "NOT c IS N",
+ c IS NOT NULL AS "c IS NOT N",
+ ROW(value, value) IS NULL AS "ROW(v,v) IS N",
+ ROW(value, value) IS NOT NULL AS "ROW(v,v) IS NOT N"
+FROM null_examples AS c;
+</programlisting>
+<screen>
+   c   | c IS N | NOT c IS N | c IS NOT N | ROW(v,v) IS N | ROW(v,v) IS NOT N
+-------+--------+------------+------------+---------------+-------------------
+ (1,1) | false  | true       | true       | false         | true
+ (2,)  | false  | true       | false      | true          | false
+ (3,4) | false  | true       | true       | false         | true
+</screen>
+   See <xref linkend="nullvalues-multielement"/> below for an explanation.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-operands">
+  <title>Null-Valued Operands</title>
+  <para>
+   As a general expectation, operator invocation expressions where one of the inputs
+   is a null value will result in a null-valued output.
+<programlisting>
+SELECT
+ 1 + null AS "Add",
+ 'text' || null AS "Concatenate";
+</programlisting>
+<screen>
+ Add | Concatenate
+-----+-------------
+  \N | \N
+</screen>
+   Operators that behave otherwise should document their deviation from this norm.
+  </para>
+  <para>
+   A notable example is the <literal>IN</literal> operator, which
+   uses equality, not distinctness, for testing.
+<programlisting>
+SELECT
+ 1 IN (1, null) AS "In Present",
+ 1 IN (2, null) AS "In Missing",
+ null IN (1, 2) AS "N In Non-N",
+ null IN (null, 2) AS "N In N";
+</programlisting>
+<screen>
+ In Present | In Missing | N In Non-N | N In N
+------------+------------+------------+--------
+ true       | \N         | \N         | \N
+</screen>
+   This is just an extension of the multi-element testing behavior described in
+   <xref linkend="nullvalues-multielement"/>.
+  </para>
+  <para>
+   Experience shows that <literal>CASE</literal> expressions are also prone
+   to bugs since their format encourages binary logic thinking while a
+   <literal>WHEN</literal> test will not consider a null value to be a match.
+<programlisting>
+SELECT id, value,
+ CASE WHEN id = value THEN 'Equal' ELSE 'Not Equal' END AS "Affirm",
+ CASE WHEN id != value THEN 'Not Equal' ELSE 'Equal' END AS "Negate",
+ CASE WHEN value IS NULL THEN 'Null'
+      WHEN id = value THEN 'Equal'
+      ELSE 'Not Equal' END AS "Safe Affirm",
+ CASE WHEN value IS NULL THEN 'Null'
+      WHEN id != value THEN 'Not Equal'
+      ELSE 'Equal' END AS "Safe Negate"
+FROM null_examples;
+</programlisting>
+<screen>
+ id | value |  Affirm   |  Negate   | Safe Affirm | Safe Negate
+----+-------+-----------+-----------+-------------+-------------
+  1 |     1 | Equal     | Equal     | Equal       | Equal
+  2 |    \N | Not Equal | Equal     | Null        | Null
+  3 |     4 | Not Equal | Not Equal | Not Equal   | Not Equal
+</screen>
+  </para>
+  <para>
+   The boolean operators <literal>AND</literal> and <literal>OR</literal>
+   will ignore the null value input if the other input is sufficient to
+   determine the outcome.
+<programlisting>
+SELECT
+ true OR null AS "T or N",
+ false OR null AS "F or N",
+ true AND null AS "T and N",
+ false AND null AS "F and N";
+</programlisting>
+<screen>
+ T or N | F or N | T and N | F and N
+--------+--------+---------+---------
+ true   | \N     | \N      | false
+</screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-domains">
+  <title>Null Values in Domains</title>
+  <para>
+   A domain is a user-defined data type that can have a <literal>NOT NULL</literal>
+   constraint.  However, some usages of domains can still cause a column to be of the
+   domain type but some value may be null.  The common way this happens is by including
+   the domain column's table on the right side of a left join.
+<programlisting>
+BEGIN;
+CREATE DOMAIN domain_example AS integer NOT NULL;
+CREATE TABLE domain_examples (de_id bigint PRIMARY KEY, de_value domain_example);
+INSERT INTO domain_examples VALUES (1, 1), (2, 2);
+SELECT *, pg_typeof(de_value)
+FROM null_examples AS ne
+LEFT JOIN domain_examples AS de ON ne.id = de.de_id;
+ROLLBACK;
+</programlisting>
+<screen>
+BEGIN
+CREATE DOMAIN
+CREATE TABLE
+INSERT 0 2
+ id | value | de_id | de_value |   pg_typeof
+----+-------+-------+----------+----------------
+  1 |     1 |     1 |        1 | domain_example
+  2 |    \N |     2 |        2 | domain_example
+  3 |     4 |    \N |       \N | domain_example
+
+ROLLBACK
+</screen>
+   Please see the details in <xref linkend="sql-createdomain-notes"/>
+   for another example, as well as commentary on why this non-standard behavior exists.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-multielement">
+  <title>Testing Multi-Element Values with Null-Valued Elements</title>
+  <para>
+   Arrays and composite types are multi-element types.  Here we also consider non-empty
+   <link linkend="functions-subquery">subquery results</link>
+   and the list of values (i.e., the multiset) specified in the
+   <link linkend="functions-comparisons-in-scalar">IN test</link>.
+  </para>
+  <para>
+   When a test is performed on one of these multi-element values
+   the system will iterate over each element, (or pair of elements if the test is
+   <link linkend="row-wise-comparison">comparing two row constructors</link> to each other),
+   left-to-right, combining the results using the boolean operations described in
+   <xref linkend="nullvalues-operands"/>. For tests that
+   require an exhaustive search, (e.g., <literal>ALL</literal>, <literal>NOT IN</literal>)
+   the search effectively ends when a false result is found (<literal>AND</literal> combiners).
+   For tests that require a true result, (e.g., <literal>ANY</literal>,
+   <literal>IN</literal>) the search effectively ends when a true result is found
+   (<literal>OR</literal> combiners). Therefore:
+   <simplelist>
+    <member>
+     <literal>IN</literal> and <literal>ANY</literal>
+     (<literal>OR</literal>) cannot produce a false result in the presence of null, and
+    </member>
+    <member>
+     <literal>NOT IN</literal> and <literal>ALL</literal>
+     (<literal>AND</literal>) cannot produce a true result in the presence of null.
+    </member>
+   </simplelist>
+   This is because any exhaustive search will produce at least one null value result
+   that cannot be ignored.
+  </para>
+  <para>
+   The SQL standard requires that non-exhaustive
+   (i.e., <literal>IN</literal> and <literal>ANY</literal>) subquery tests
+   return false when there are no rows in the subquery result, and return true
+   for the exhaustive tests (i.e., <literal>NOT IN</literal> and <literal>ALL</literal>).
+  </para>
+  <para>
+   Note that the cardinal warning
+   noted in <xref linkend="nullvalues-cardinalrule"/> above is just the application of this behavior to the
+   <literal>IS NULL</literal> and <literal>IS NOT NULL</literal>
+   tests, which are both exhaustive search tests guaranteed to produce at least one false result
+   when the composite has a mix of null and non-null values.
+  </para>
+  <para>
+   In the next section, the rules above are discussed.
+   <xref linkend="nullvalues-multielementpredicates"/>
+   discusses situations where a predicate or a scalar value
+   are being compared to a multi-element value.
+   In <xref linkend="nullvalues-multielementcomparison"/>
+   the rules when two multi-element values are compared
+   to each other are discussed
+   (including the two row constructor comparison case.)
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-multielementpredicates">
+  <title>Multi-Element Predicates and Scalars</title>
+  <sect3 id="nullvalues-multielementpredicates-composites">
+   <title>Composite Fields</title>
+   <para>
+    When a composite typed value is created, a null value can be assigned to any
+    of its fields (see <xref linkend="rowtypes-constructing"/> for how to do this).
+    So long as at least one field is non-null the composite value
+    as a whole exists and an <literal>IS NULL</literal> predicate will return false.
+   </para>
+   <para>
+    Applying the <literal>IS NOT NULL</literal> predicate to a composite value performs
+    checks on whether all fields of the composite have non-null values.  This is not the same
+    as a non-null composite value.  Specifically, if the composite value has
+    a null-valued field then both the <literal>IS NOT NULL</literal> predicate and the
+    <literal>IS NULL</literal> predicate will return false.
+<programlisting>
+SELECT
+ ROW(1,2) IS NULL AS "Row Is Null",
+ ROW(1,2) IS NOT NULL AS "Row Is Not Null",
+ ROW(1,NULL) IS NULL AS "Row Is Null",
+ ROW(1,NULL) IS NOT NULL AS "Row Is Not Null";
+</programlisting>
+<screen>
+ Row Is Null | Row Is Not Null | Row Is Null | Row Is Not Null
+-------------+-----------------+-------------+-----------------
+ false       | true            | false       | false
+</screen>
+   </para>
+   <para>
+    Please read <xref linkend="composite-type-comparison"/> for a complete treatment
+    on how <productname>PostgreSQL</productname> handles row-wise comparison.  The
+    next two multi-element related items in this section discuss those comparisons in the
+    presence of null-valued fields, and also in terms of the SQL standard.
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementpredicates-arrays">
+   <title>Array Elements and IN Multiset Members</title>
+   <para>
+    Examples of applying the behavior discussed in <xref linkend="nullvalues-multielement"/>
+    to arrays, and <literal>IN</literal> and <literal>NOT IN</literal> multisets, using the
+    operators defined in <xref linkend="functions-comparisons"/>.  The following examples produce
+    the same results when swapping <literal>IN</literal>/<literal>ANY</literal>
+    and also <literal>NOT IN</literal>/<literal>ALL</literal>, plus transforming the multiset/array format.
+    I.e., the exhaustive and non-exhaustive pairs noted in <xref linkend="nullvalues-multielement"/>.
+   </para>
+   <para>
+<programlisting>
+SELECT
+ 1 = ANY(array[1, 1, NULL]) AS "Any-Null-Match",
+ 1 = ANY(array[1, 1]) AS "Any-NoNull-Match",
+ 1 = ALL(array[1, 1, NULL]) AS "ALL-Null-Match",
+ 1 = ALL(array[1, 1]) AS "All-NoNull-Match";
+SELECT
+ 2 IN (1, 1, NULL) AS "IN-Null-Negative",
+ 2 IN (1, 1) AS "IN-NoNull-Negative",
+ 2 NOT IN (2, 2, NULL) AS "NotIN-Null-Negative",
+ 2 NOT IN (2, 2) AS "NotIN-NoNull-Negative";
+</programlisting>
+<screen>
+ Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+----------------+------------------+----------------+------------------
+ true           | true             | \N             | true
+
+ IN-Null-Negative | IN-NoNull-Negative | NotIN-Null-Negative | NotIN-NoNull-Negative
+------------------+--------------------+---------------------+-----------------------
+ \N               | false              | false               | false
+</screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementpredicates-subqueries">
+   <title>Single-Column Subquery Rows</title>
+   <para>
+    The following examples demonstrate the behavior discussed in
+    <xref linkend="nullvalues-multielement"/>
+    applied to subqueries using the operators defined in <xref linkend="functions-subquery"/>.
+    Here we cover the case where the multiple elements being checked are rows, each having one column.
+    If the column itself is multi-element then the thing being searched for must be a compatible
+    multi-element value, and the corresponding comparison behavior described in
+    <xref linkend="nullvalues-multielementcomparison"/> will also be applied.
+   </para>
+   <para>
+<programlisting>
+SELECT
+ 1 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-Match",
+ 1 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-Match",
+ 1 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-Match",
+ 1 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-Match";
+SELECT
+ 2 = ANY(SELECT unnest(array[1, 1, NULL])) AS "Any-Null-NoMatch",
+ 2 = ANY(SELECT unnest(array[1, 1])) AS "Any-NoNull-NoMatch",
+ 2 = ALL(SELECT unnest(array[1, 1, NULL])) AS "ALL-Null-NoMatch",
+ 2 = ALL(SELECT unnest(array[1, 1])) AS "All-NoNull-NoMatch";
+</programlisting>
+<screen>
+ Any-Null-Match | Any-NoNull-Match | ALL-Null-Match | All-NoNull-Match
+----------------+------------------+----------------+------------------
+ true           | true             | \N             | true
+
+ Any-Null-NoMatch | Any-NoNull-NoMatch | ALL-Null-NoMatch | All-NoNull-NoMatch
+------------------+--------------------+------------------+--------------------
+ \N               | false              | false            | false
+</screen>
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-multielementcomparison">
+  <title>Multi-Element Comparisons</title>
+  <para>
+   The previous section, <xref linkend="nullvalues-multielementpredicates"/>, discussed applying
+   a predicate or a scalar value check element-wise across a multi-element value.
+   This section moves the discussion over to comparing two multi-element values to each other.
+   As both array and composite typed values
+   can be stored within an index, and comparing two values in that context must not produce
+   a null-valued result, considerations are made to adhere to the SQL standard where
+   possible while still making indexes, which the specification is silent on, functional.
+   Specifically, except when comparing two row constructors, null values are considered
+   equal to other null values and greater than all non-null values.
+  </para>
+  <para>
+   There are five pair-wise comparison situations to consider:
+   element-wise when the inputs are arrays, and row-wise when the inputs can be either
+   row constructors or composite typed values.  While these four later combinations seem similar,
+   the fact that row constructors are query literals, while composite typed values can be stored,
+   brings about important differences in how they are treated.  Please read
+   <xref linkend="composite-type-comparison"/> for a fuller treatment of this topic.  Here
+   we briefly recap the five situations in the presence of null values.
+  </para>
+  <sect3 id="nullvalues-multielementcomparison-array">
+   <title>Element-wise Comparisons</title>
+   <para>
+    In this first situation, null values within an array compare as equal to each other and greater
+    than all non-null values, regardless of whether the comparison involves
+    <link linkend="sql-syntax-array-constructors">array constructors</link> or array-typed values.
+<programlisting>
+SELECT
+ array[1,2]=array[1,null] AS "Constructors",
+ s, t,
+ s = t AS "Stored Equality",
+ t &gt; s AS "Stored Ordering"
+FROM
+(values (array[1,2])) AS sv (s),
+(values (array[1,null::integer])) AS st (t);
+</programlisting>
+<screen>
+ Constructors |   s   |    t     | Stored Equality | Stored Ordering
+--------------+-------+----------+-----------------+-----------------
+ false        | {1,2} | {1,NULL} | false           | true
+</screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-rowconstructor">
+   <title>Row-wise Mutual Row Constructor Comparisons</title>
+   <para>
+    In this situation, null values produce unknown when compared to all values.
+<programlisting>
+SELECT
+ (1,2)=(1,null) AS "NonNull=Null",
+ (1,null::integer)=(1,null) AS "Null=Null";
+</programlisting>
+<screen>
+ NonNull=Null | Null=Null
+--------------+-----------
+ \N           | \N
+</screen>
+   </para>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-composite">
+   <title>Row-wise Composite Involved Comparisons</title>
+   <para>
+    In these three situations, null values are considered equal to each other and greater than
+    all non-null valueS.
+   </para>
+<programlisting>
+SELECT s, t,
+ s = t AS "Stored Equals Stored",
+ t &lt; (1,2) AS "Stored LT Constructor",
+ t = (1,null::integer) AS "Stored Equals Constructor"
+FROM
+ (values (1,2)) AS s,
+ (values (1,null::integer)) AS t;
+</programlisting>
+<screen>
+   s   |  t   | Stored Equals Stored | Stored LT Constructor | Stored Equals Constructor
+-------+------+----------------------+-----------------------+---------------------------
+ (1,2) | (1,) | false                | false                 | true
+</screen>
+  </sect3>
+  <sect3 id="nullvalues-multielementcomparison-sqlconformance">
+   <title>SQL Standard Conformance</title>
+   <para>
+    The SQL standard requires row-wise comparison to return NULL if the
+    result depends on comparing two NULL values or a NULL and a non-NULL.
+    <productname>PostgreSQL</productname> does this only when comparing the
+    results of two row constructors (as in
+    <xref linkend="row-wise-comparison"/>) or comparing a row constructor
+    to the output of a subquery (as in <xref linkend="functions-subquery"/>).
+   </para>
+  </sect3>
+ </sect2>
+
+ <sect2 id="nullvalues-functions">
+  <title>Null-Valued Arguments in Normal Function Calls</title>
+  <para>
+   <link linkend="sql-createfunction">Function specifications</link>
+   have a "strictness" attribute (<literal>pg_proc.proisstrict</literal>) that,
+   when set to "strict" (true) will tell the executor to return a null value for any
+   function call having at least one null-valued input, without executing the
+   function.
+  </para>
+  <para>
+   Most functions, especially single argument functions, are defined with strict because without
+   non-null values to act upon they cannot produce a meaningful result.  However, for multi-argument
+   functions, especially <link linkend="xfunc-sql-variadic-functions">variadic functions</link>
+   like concatenate, null values often are ignored.
+   This can be different than the choice made by a binary operator performing the same function,
+   like for concatenating text, but not always, like concatenating an element onto an array.
+<programlisting>
+SELECT
+ lower(null::text) AS "Lower",
+ left('text', null) AS "Left",
+ 'one' || null AS "|| Text Op",
+ concat('one', null) AS "concat Text Func",
+ array_append(array[1], null) AS "append([], null)",
+ array[1]::integer[] || null::integer AS "[] || null",
+ array[1]::integer[] || null::integer[] AS "[] || null[]";
+</programlisting>
+<screen>
+ Lower | Left | || Text Op | concat Text Func | append([], null) | [] || null | [] || null[]
+-------+------+------------+------------------+------------------+------------+--------------
+ \N    | \N   | \N         | one              | {1,NULL}         | {1,NULL}   | {1}
+</screen>
+   In short, please read the documentation for the functions you use if they may receive null inputs
+   to understand how they will behave.  Send a documentation comment pointing out any functions
+   that do not behave strictly but whose actual behavior in the presence of null-valued input
+   is not described or readily inferred.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-aggregates">
+  <title>Null-Valued Arguments in Aggregate and Window Functions</title>
+  <para>
+   When executing an aggregate or window function the state tracking component
+   (which may be initialized to a non-null value, e.g., 0 for the count function)
+   will remain unchanged even if the underlying processing
+   function returns a null value, whether from being defined strict
+   or it returns a null value upon execution.  The aggregation
+   routine will usually ignore the null value and continue processing,
+   as demonstrated in <literal>count(value)</literal> below.
+<programlisting>
+SELECT
+ count(*) AS "Count",
+ count(value) AS "Count Value",
+ count(null_examples) AS "Count Composite",
+ count(row(value, value)) AS "Count Row"
+FROM null_examples;
+</programlisting>
+<screen>
+ Count | Count Value | Count Composite | Count Row
+-------+-------------+-----------------+-----------
+     3 |           2 |               3 |         3
+</screen>
+   Notice the "Count Row" outcome, though.  While we noted in the cardinal warning
+   that a composite whose fields are all null values is indistinguishable from
+   a null value of composite type, the count aggregate does indeed distinguish them,
+   recognizing and counting the non-null composite value produced by the
+   <link linkend="sql-syntax-row-constructors">row constructor</link>
+   <literal>row(null, null)</literal>.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-filtering">
+  <title>Null Values When Filtering</title>
+  <para>
+   A <literal>WHERE</literal> clause that evaluates to a null value for a given row will exclude that row.
+   Note below that, due to tri-valued logic described in <xref linkend="nullvalues-cardinalrule"/>,
+   the row with an id of 2 is not included in either of the first two results.  The third result, using
+   <literal>IS NULL</literal>, finds that row.
+<programlisting>
+SELECT id, value AS "Equals 1"
+FROM null_examples
+WHERE value = 1;
+
+SELECT id, value AS "Not Equal to 1"
+FROM null_examples
+WHERE value != 1;
+
+SELECT id, value AS "IS NULL"
+FROM null_examples
+WHERE value IS NULL;
+</programlisting>
+<screen>
+ id | Equals 1
+----+----------
+  1 |        1
+
+ id | Not Equal to 1
+----+----------------
+  3 |              4
+
+ id | IS NULL
+----+---------
+  2 |      \N
+</screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-table-constraints">
+  <title>Null Values in Table Constraints</title>
+  <para>
+   It is possible to define
+   <link linkend="ddl-constraints-check-constraints">check constraint</link>
+   expressions on tables to ensure only values passing those expressions are inserted.
+   While this seems like it would behave the same as a where clause, the choice here,
+   when an expression evaluates to a null value, is to allow the row to be inserted
+   - the same as a true result.
+<programlisting>
+BEGIN;
+ALTER TABLE null_examples ADD CONSTRAINT value_not_1 CHECK (value != 1);
+ROLLBACK;
+</programlisting>
+<screen>
+ERROR:  check constraint "value_not_1" of relation "null_examples" is violated by some row
+</screen>
+<programlisting>
+BEGIN;
+ALTER TABLE null_examples ADD CONSTRAINT value_not_10 CHECK (value != 10);
+ROLLBACK;
+</programlisting>
+<screen>
+ALTER TABLE
+</screen>
+   We are using a transaction (<command>BEGIN</command> and <command>ROLLBACK</command>) and
+   the <command>ALTER TABLE</command> command to add two constraints to our null_examples table.
+   The first constraint prohibits rows with a value of 1, which our row with an id of 1 violates.
+   Prohibiting the value 10 definitely allows rows with ids 1 and 3 to exist, and since we are
+   not told that some row violates our constraint the null value in the row with id 2 is being
+   accepted as well.
+  </para>
+  <para>
+   The <link linkend="ddl-constraints-not-null"><literal>NOT NULL</literal> column constraint</link>
+   produces the same answer as a <literal>column IS NOT NULL</literal> check constraint but is
+   more concise to write.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-grouping">
+  <title>Null Values When Grouping</title>
+  <para>
+   In the context of both <literal>DISTINCT</literal> and <literal>GROUP BY</literal>
+   it is necessary that all inputs resolve to being either equal to or not equal to all
+   other values.  These features use <link linkend="nullvalues-cardinalrule">distinctness</link>
+   instead of simple equality in order to handle a null value like a definite value equal to
+   another null value and unequal to all other values.
+<programlisting>
+WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+SELECT
+ value,
+ count(*) AS "Count"
+FROM vals
+GROUP BY value
+ORDER BY value;
+</programlisting>
+<screen>
+ value | Count
+-------+-------
+     1 |     2
+     2 |     1
+    \N |     2
+</screen>
+<programlisting>
+WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+SELECT DISTINCT value
+FROM vals
+ORDER BY value NULLS FIRST;
+</programlisting>
+<screen>
+ value
+-------
+    \N
+     1
+     2
+</screen>
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-ordering">
+  <title>Null Values When Ordering</title>
+  <para>
+   In the context of <literal>ORDER BY</literal>, distinctness rules also apply,
+   though this is insufficient since it must be determined whether or not to
+   present null values before or after all non-null values.  To handle
+   this, the <literal>ORDER BY</literal> clause will let you specify either
+   <literal>NULLS FIRST</literal> or <literal>NULLS LAST</literal>.
+<programlisting>
+WITH vals (value) AS (VALUES (1), (NULL), (1), (2), (NULL))
+SELECT value FROM vals
+ORDER BY value DESC NULLS FIRST;
+</programlisting>
+<screen>
+ value
+-------
+    \N
+    \N
+     2
+     1
+     1
+</screen>
+  </para>
+  <para>
+   Note that when dealing with multi-element values the comparison behavior described in
+   <xref linkend="nullvalues-multielementcomparison"/> applies:
+   if the comparison determination rests upon comparing a null value to a non-null value,
+   the multi-element value with the null-valued component will sort greater than the one
+   with a non-null component.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-indexed">
+  <title>Null Values in Indexes</title>
+  <para>
+   The uniqueness and relative ordering rules applied to null values
+   are defined when creating an index.  For the default
+   <literal>NULLS DISTINCT</literal> uniqueness, equality rules are applied.
+   Specifying <literal>NULLS NOT DISTINCT</literal> will result in
+   <literal>IS DISTINCT FROM</literal> rules being applied whereby all null
+   values are equal to each other.  This setting applies to all columns in the index.
+  </para>
+  <para>
+<programlisting>
+BEGIN;
+CREATE UNIQUE INDEX value_nulls_distinct_implicit ON null_examples (value);
+CREATE UNIQUE INDEX value_nulls_distinct_explicit ON null_examples (value) NULLS DISTINCT;
+INSERT INTO null_examples VALUES (4, NULL);
+ROLLBACK;
+</programlisting>
+<screen>
+CREATE INDEX
+CREATE INDEX
+INSERT 0 1
+</screen>
+<programlisting>
+BEGIN;
+CREATE UNIQUE INDEX value_nulls_not_distinct_explicit ON null_examples (value) NULLS NOT DISTINCT;
+INSERT INTO null_examples VALUES (4, NULL);
+ROLLBACK;
+</programlisting>
+<screen>
+CREATE INDEX
+ERROR:  duplicate key value violates unique constraint "value_nulls_not_distinct_explicit"
+DETAIL:  Key (value)=(null) already exists.
+</screen>
+  </para>
+  <para>
+   For ordering, each column in the index gets its own specification of
+   direction and null value placement similar to that found in the
+   <literal>ORDER BY</literal> clause.
+  </para>
+  <para>
+   Note that when dealing with multi-element values the comparison behavior described in
+   <xref linkend="nullvalues-multielementcomparison"/> applies,
+   if the comparison determination rests upon comparing a null value to a non-null value
+   the multi-element value with the null-valued component will sort greater than the one
+   with a non-null component.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-partitionkeys">
+  <title>Null Values in Partition Keys</title>
+  <para>
+   Presently, <productname>PostgreSQL</productname> requires that all the columns of a
+   partition key be included in the primary key.  Furthermore, all columns used in a primary
+   key must have a not-null column constraint applied to them.  Therefore, any partitioned table
+   with a primary key will only have non-null values in the partition key columns.
+  </para>
+  <para>
+   However, should you set up a situation where a partition key column can both: have a null value
+   and, null values in that key go to a specific partition, list-based routing will work as expected.
+   There is presently no way to direct rows having null values in partition keys away from the
+   default partition for range and hash partitioning.
+  </para>
+ </sect2>
+
+ <sect2 id="nullvalues-settings">
+  <title>Null-Valued Settings</title>
+  <para>
+   The value of a setting known to the system will never be null.  There is a bit of confusion
+   because the <function>current_setting</function> function has an operating mode where instead
+   of provoking an error when retrieving the value of a setting not known to the system it will
+   instead return a null value.  This null value should not be considered the value of the setting
+   but an error indicator.
+<programlisting>
+SELECT current_setting('example.string', false);
+SELECT current_setting('example.string', true);
+</programlisting>
+<screen>
+unrecognized configuration parameter "example.string"
+ current_setting
+-----------------
+ \N
+</screen>
+   The next paragraph discusses the corner case behavior when this
+   suggestion is not heeded.
+  </para>
+  <para>
+   The corner case mentioned above is only meaningful for
+   <link linkend="runtime-config-custom">custom settings</link>,
+   thus this section focuses on <link linkend="config-setting-sql">SQL interaction</link>.
+   Unlike settings created by extensions, custom settings can only be textual and the default
+   value for text here is the empty string.
+<programlisting>
+-- The transaction markers are left here to emphasize the rollback behavior.
+SHOW example.string;
+BEGIN;
+SELECT set_config('example.string', NULL, true);
+SELECT current_setting('example.string') IS NULL AS "Setting Is Null";
+ROLLBACK;
+SHOW example.string;
+RESET example.string;
+SHOW example.string;
+</programlisting>
+<screen>
+ERROR:  unrecognized configuration parameter "example.string"
+BEGIN
+ set_config
+------------
+
+
+ Setting Is Null
+-----------------
+ false
+
+ROLLBACK
+ example.string
+----------------
+
+
+RESET
+ example.string
+----------------
+
+</screen>
+   Notice two important behaviors: first, even though we passed in a null value to
+   the <literal>set_config</literal> function, the <literal>current_setting</literal>
+   function returned a non-null value, specifically the empty string.  Second, after ROLLBACK the
+   setting is still present (i.e., the error seen before creating the setting no longer appears),
+   and in fact will remain so until the session ends
+   (i.e., RESET does not restore the non-existence state.)
+  </para>
+  <para>
+    The other ways to specify settings do allow for null values;
+    a specific non-null value is required as part of the setting specification.
+   </para>
+ </sect2>
+
+ <sect2 id="nullvalues-json">
+  <title>Null Values in JSON</title>
+  <para>
+   As noted in <xref linkend="json-type-mapping-table"/>, the JSON specification's
+   null value is assigned its own type having a single constant value which can be
+   compared to all other JSON types with the expected non-null boolean result.
+   A consequence of this definition is that an SQL json or jsonb type containing
+   a JSON null value is seen as non-null in SQL.
+   (Note, while in SQL the capitalization of NULL is unimportant -
+   all-caps is just convention - JSON requires lowercase.)
+<programlisting>
+SELECT 'null'::json IS NULL AS "JSON null is NULL";
+</programlisting>
+<screen>
+ JSON null is NULL
+-------------------
+ false
+</screen>
+   Additionally, the SQL operators and functions involving JSON key or array element selection,
+   or construction from literals, require that a valid number or text value be supplied as an operand
+   and so an SQL null value cannot be targeted by those operators and functions.
+<programlisting>
+ SELECT to_json(null::text);
+</programlisting>
+<screen>
+ to_json
+---------
+ \N
+</screen>
+   That all said, the system will convert an SQL null value to a JSON null value when in a
+   composite type context.
+<programlisting>
+SELECT json_build_object('value', value)
+FROM null_examples;
+</programlisting>
+<screen>
+ json_build_object
+-------------------
+ {"value" : 1}
+ {"value" : null}
+ {"value" : 4}
+</screen>
+   And vice versa.
+<programlisting>
+SELECT *
+FROM jsonb_to_recordset('[{"value":1},{"value":null},{"value":4}]'::jsonb) AS jtr (value integer);
+</programlisting>
+<screen>
+ value
+-------
+     1
+    \N
+     4
+</screen>
+   Or when a simple scalar JSON null is cast to an SQL type.
+<programlisting>
+SELECT 'null'::jsonb::numeric IS NULL AS "Cast jsonb NULL to SQL NULL";
+</programlisting>
+<screen>
+ Cast jsonb NULL to SQL NULL
+-----------------------------
+ true
+</screen>
+  </para>
+  <para>
+   Aspects of null value handling within the internals of the JSON-related types are discussed
+   in <xref linkend="datatype-json"/>,
+   particularly in <xref linkend="datatype-jsonpath"/>.
+   This section is focused on how SQL null values are related to JSON null values.
+  </para>
+ </sect2>
+</sect1>
diff --git a/doc/src/sgml/ref/create_domain.sgml b/doc/src/sgml/ref/create_domain.sgml
index c111285a69c..0240f75f3cf 100644
--- a/doc/src/sgml/ref/create_domain.sgml
+++ b/doc/src/sgml/ref/create_domain.sgml
@@ -197,9 +197,10 @@ CREATE DOMAIN <replaceable class="parameter">name</replaceable> [ AS ] <replacea
    Domain constraints, particularly <literal>NOT NULL</literal>, are checked when
    converting a value to the domain type.  It is possible for a column that
    is nominally of the domain type to read as null despite there being such
-   a constraint.  For example, this can happen in an outer-join query, if
-   the domain column is on the nullable side of the outer join.  A more
-   subtle example is
+   a constraint.  For example, this can happen in
+   <link linkend="nullvalues-domains">an outer-join query</link>, if
+   the domain column is on the nullable side of the outer join.
+   A more subtle example is
 <programlisting>
 INSERT INTO tab (domcol) VALUES ((SELECT domcol FROM tab WHERE false));
 </programlisting>
diff --git a/doc/src/sgml/syntax.sgml b/doc/src/sgml/syntax.sgml
index 34c83880a66..2ed07bd8f2b 100644
--- a/doc/src/sgml/syntax.sgml
+++ b/doc/src/sgml/syntax.sgml
@@ -281,9 +281,9 @@ U&amp;"d!0061t!+000061" UESCAPE '!'
    </indexterm>
 
    <para>
-    There are three kinds of <firstterm>implicitly-typed
+    There are four kinds of <firstterm>implicitly-typed
     constants</firstterm> in <productname>PostgreSQL</productname>:
-    strings, bit strings, and numbers.
+    strings, bit strings, numbers, and the null value.
     Constants can also be specified with explicit types, which can
     enable more accurate representation and more efficient handling by
     the system. These alternatives are discussed in the following
@@ -834,6 +834,25 @@ CAST ( '<replaceable>string</replaceable>' AS <replaceable>type</replaceable> )
      usage, as is the function-call syntax.
     </para>
    </sect3>
+
+   <sect3 id="sql-syntax-constants-nullvalue">
+    <title>The Null Value Constant</title>
+    <indexterm>
+     <primary>null value</primary>
+     <secondary>constant</secondary>
+    </indexterm>
+    <para>
+     The null value represents an unknown value and its constant, the keyword <literal>NULL</literal>,
+     when evaluated in an expression, likewise yields a value of <literal>unknown</literal> type.
+     See <xref linkend="nullvalues"/> for an overview of how the system behaves in the presence
+     of a null value in various contexts.
+    </para>
+    <para>
+     Due to the typing of a null value as <literal>unknown</literal> it is often necessary to use
+     a cast, as described in the previous section, to convert it to the specific type needed.
+     However, implicit casting is performed when contextual information is available.
+    </para>
+   </sect3>
   </sect2>
 
   <sect2 id="sql-syntax-operators">
-- 
2.34.1

0002-v9-edit.patchtext/x-patch; charset=US-ASCII; name=0002-v9-edit.patchDownload
From 7a68f303429e05f62f7ec1831ca8d75972e9da6f Mon Sep 17 00:00:00 2001
From: "David G. Johnston" <David.G.Johnston@Gmail.com>
Date: Mon, 15 Dec 2025 15:01:22 -0700
Subject: [PATCH 2/2] v9-edit

---
 doc/src/sgml/func/func-comparisons.sgml | 31 ++++++------
 doc/src/sgml/func/func-subquery.sgml    | 66 ++++++++++++-------------
 doc/src/sgml/nullvalues.sgml            |  9 +++-
 3 files changed, 55 insertions(+), 51 deletions(-)

diff --git a/doc/src/sgml/func/func-comparisons.sgml b/doc/src/sgml/func/func-comparisons.sgml
index 970997e368a..b574f8afc45 100644
--- a/doc/src/sgml/func/func-comparisons.sgml
+++ b/doc/src/sgml/func/func-comparisons.sgml
@@ -75,9 +75,9 @@
   </para>
 
   <para>
-   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
-   a <quote>false</quote> result in the presence null values since the multiple equality
-   tests are OR'd together.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible
+   to see a <quote>false</quote> result in the presence of null values since the
+   multiple equality tests are OR'd together.
   </para>
   </sect2>
 
@@ -95,9 +95,9 @@
   </para>
 
   <para>
-   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
-   a <quote>true</quote> result in the presence of null values since the multiple inequality
-   tests are OR'd together.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible
+   to see a <quote>true</quote> result in the presence of null values since the
+   multiple inequality tests are AND'd together.
   </para>
 
   </sect2>
@@ -123,10 +123,10 @@
   </para>
 
   <para>
-   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
-   <xref linkend="nullvalues-multielement"/>, it is not possible to see
-   a <quote>false</quote> result in the presence of both elements and null values since the multiple equality
-   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
+   If <replaceable>operator</replaceable> can produce null valued booleans then,
+   as explained in <xref linkend="nullvalues-multielement"/>, it is not possible
+   to see a <quote>false</quote> result in the presence of both elements and null
+   values since the multiple equality tests are OR'd together.
   </para>
 
   <para>
@@ -156,10 +156,10 @@
   </para>
 
   <para>
-   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
-   <xref linkend="nullvalues-multielement"/>, it is not possible to see
-   a <quote>true</quote> result in the presence of both elements and null values since the multiple equality
-   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
+   If <replaceable>operator</replaceable> can produce null valued booleans then,
+   as explained in <xref linkend="nullvalues-multielement"/>, it is not possible
+   to see a <quote>true</quote> result in the presence of both elements and null
+   values since the multiple equality tests are AND'd together.
   </para>
 
   <para>
@@ -259,8 +259,7 @@
    As discussed and shown in <xref linkend="nullvalues-multielementcomparison-composite"/>,
    null values are treated as being equal to other null values and greater
    than all non-null values.
-   Composite type
-   comparisons are allowed when the <replaceable>operator</replaceable> is
+   Composite type comparisons are allowed when the <replaceable>operator</replaceable> is
    <literal>=</literal>,
    <literal>&lt;&gt;</literal>,
    <literal>&lt;</literal>,
diff --git a/doc/src/sgml/func/func-subquery.sgml b/doc/src/sgml/func/func-subquery.sgml
index d516dc7132d..5d4421b5355 100644
--- a/doc/src/sgml/func/func-subquery.sgml
+++ b/doc/src/sgml/func/func-subquery.sgml
@@ -104,9 +104,9 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   </para>
 
   <para>
-   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
-   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
-   tests are AND'd together.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible
+   to see a <quote>false</quote> result in the presence of both rows and null
+   values since the multiple equality tests are OR'd together.
   </para>
 
   <para>
@@ -132,9 +132,9 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   </para>
 
   <para>
-   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
-   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
-   tests are OR'd together.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible
+   to see a <quote>false</quote> result in the presence of both rows and null
+   values since the multiple equality tests are OR'd together.
   </para>
   </sect2>
 
@@ -154,9 +154,9 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   </para>
 
   <para>
-   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
-   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
-   tests are OR'd together.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible
+   to see a <quote>true</quote> result in the presence of both rows and null
+   values since the multiple inequality tests are AND'd together.
   </para>
 
   <para>
@@ -182,9 +182,9 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   </para>
 
   <para>
-   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible to see
-   a <quote>true</quote> result in the presence of both rows and null values since the multiple inequality
-   tests are OR'd together.
+   As explained in <xref linkend="nullvalues-multielement"/>, it is not possible
+   to see a <quote>true</quote> result in the presence of both rows and null
+   values since the multiple inequality tests are AND'd together.
   </para>
   </sect2>
 
@@ -213,10 +213,10 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   </para>
 
   <para>
-   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
-   <xref linkend="nullvalues-multielement"/>, it is not possible to see
-   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
-   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
+   If <replaceable>operator</replaceable> can produce null valued booleans then,
+   as explained in <xref linkend="nullvalues-multielement"/>, it is not possible
+   to see a <quote>false</quote> result in the presence of both rows and null
+   values since the multiple equality tests are OR'd together.
   </para>
 
   <para>
@@ -243,10 +243,10 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   </para>
 
   <para>
-   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
-   <xref linkend="nullvalues-multielement"/>, it is not possible to see
-   a <quote>false</quote> result in the presence of both rows and null values since the multiple equality
-   tests are OR'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
+   If <replaceable>operator</replaceable> can produce null valued booleans then,
+   as explained in <xref linkend="nullvalues-multielement"/>, it is not possible
+   to see a <quote>false</quote> result in the presence of both rows and null
+   values since the multiple equality tests are AND'd together.
   </para>
 
   <para>
@@ -274,10 +274,10 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   </para>
 
   <para>
-   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
-   <xref linkend="nullvalues-multielement"/>, it is not possible to see
-   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
-   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
+   If <replaceable>operator</replaceable> can produce null valued booleans then,
+   as explained in <xref linkend="nullvalues-multielement"/>, it is not possible
+   to see a <quote>true</quote> result in the presence of both rows and null
+   values since the multiple equality tests are AND'd together.
   </para>
 
   <para>
@@ -307,10 +307,10 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   </para>
 
   <para>
-   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
-   <xref linkend="nullvalues-multielement"/>, it is not possible to see
-   a <quote>true</quote> result in the presence of both rows and null values since the multiple equality
-   tests are AND'd together.  Note that <literal>IS DISTINCT FROM</literal> is not an operator.
+   If <replaceable>operator</replaceable> can produce null valued booleans then,
+   as explained in <xref linkend="nullvalues-multielement"/>, it is not possible
+   to see a <quote>true</quote> result in the presence of both rows and null
+   values since the multiple equality tests are AND'd together.
   </para>
 
   </sect2>
@@ -338,11 +338,11 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
   </para>
 
   <para>
-   If <replaceable>operator</replaceable> can produce null valued booleans then, as explained in
-   <xref linkend="nullvalues-multielement"/>, the result cannot be <quote>true</quote> in the
-   presence of null valued fields in either the row constructor or the subquery result row, as
-   the individual field tests are AND'd together.
-   Note that <literal>IS DISTINCT FROM</literal> is not an operator.
+   If <replaceable>operator</replaceable> can produce null valued booleans then,
+   as explained in <xref linkend="nullvalues-multielement"/>, the result cannot
+   be <quote>true</quote> in the presence of null valued fields in either the
+   row constructor or the subquery result row, as the individual field tests
+   are AND'd together.
   </para>
 
   <para>
diff --git a/doc/src/sgml/nullvalues.sgml b/doc/src/sgml/nullvalues.sgml
index 53063f598ee..c5a0abec23e 100644
--- a/doc/src/sgml/nullvalues.sgml
+++ b/doc/src/sgml/nullvalues.sgml
@@ -44,6 +44,11 @@ VALUES (1, 1), (2, NULL), (3, 4);
 
 -- This makes null values print as \N in the output instead of the empty string.
 \pset null '\\N'
+
+-- These cause boolean values to print as true/false instead of t/f.
+\pset display_true true
+\pset display_false false
+
 -- Removes the row count footer that prints by default.
 \pset footer off
 </programlisting>
@@ -270,7 +275,7 @@ SELECT
    Because of this SQL standard rule, checking for a null value has an
    explicit <literal>IS NULL</literal> predicate.  Additionally, there are comparison
    predicates that consider a null value equal to other null values but unequal
-   to any other value (e.g., <literal>IS DISTINCT</literal>, and <literal>IS TRUE</literal>.)
+   to any other value (e.g., <literal>IS DISTINCT FROM</literal>, and <literal>IS TRUE</literal>.)
    These, and other predicates, are described in
    <xref linkend="functions-comparison-pred-table"/>
 <programlisting>
@@ -668,7 +673,7 @@ SELECT
    <title>Row-wise Composite Involved Comparisons</title>
    <para>
     In these three situations, null values are considered equal to each other and greater than
-    all non-null valueS.
+    all non-null values.
    </para>
 <programlisting>
 SELECT s, t,
-- 
2.34.1

#81David G. Johnston
david.g.johnston@gmail.com
In reply to: David G. Johnston (#80)
Re: Document NULL

On Mon, Dec 15, 2025 at 3:12 PM David G. Johnston <
david.g.johnston@gmail.com> wrote:

I added pset display_true to the preamble since that feature has since
been added.

I failed to notice the comment in the preceding paragraph about t/f being
manually added. It can be removed.

<para>
The following <literal>CREATE TABLE</literal> and
<literal>INSERT</literal>
SQL commands can be executed in any SQL client to create and populate
the persistent table used in the examples below. The
<literal>\pset</literal>
commands require the use of <application>psql</application> as the client
program;
they make the resulting output a bit easier to read and do not impact any
behaviors
described herein. The examples also omit any transactional command
output when
transactions are used. Instead, each transaction gets its own display
block.
</para>

David J.

#82Marcos Pegoraro
marcos@f10.com.br
In reply to: Álvaro Herrera (#74)
Re: Document NULL

Em ter., 11 de nov. de 2025 às 12:34, Álvaro Herrera <alvherre@kurilemu.de>
escreveu:

I have rebased this; here's v9. I haven't reviewed it in depth, but
intend to give it a read and get it pushed sometime in the
not-too-distant future, so if anybody wants to review it some more, it'd
be appreciated.

- Reading this document I see that he uses "the empty string" but DOCs uses
more "an empty string".
Then a few minutes ago I sent a patch [1] to use "an empty string" instead
of "the empty string".
If that patch is accepted then this could be done here too.
- I think using several commands and their results in a <programlisting> is
difficult to read,
mainly because some commands result on 2 or more lines, some an empty line,
so it is difficult to see what command generated what result. Maybe
separate them into 2 blocks, maybe.

<programlisting>
-- The transaction markers are left here to emphasize the rollback behavior.
SHOW example.string;
BEGIN;
SELECT set_config('example.string', NULL, true);
SELECT current_setting('example.string') IS NULL AS "Setting Is Null";
ROLLBACK;
SHOW example.string;
RESET example.string;
SHOW example.string;
</programlisting>

1 -
/messages/by-id/CAB-JLwa2AgHWqz1Lf2ev2pb71yqbM0yBg-jwN0xnDn88BWystg@mail.gmail.com

regards
Marcos