First, thanks for the speedy and thorough review. Some
good points made, some with which I strongly disagree,
but thrashing stuff like that out is part of the point
of the reviews.
On 06/05/2012 10:42 AM, "Martin J. Dürst" wrote:
[For replies, please trim the cc list, thanks!]
Not sure what trimming you mean. I've reduced it
to ietf-discuss and apps-discuss and authors.
I have been selected as the Applications Area Directorate reviewer for
this draft (for background on appsdir, please see
Please resolve these comments along with any other Last Call comments
you may receive. Please wait for direction from your document shepherd
or AD before posting a new version of the draft.
Title: Naming Things with Hashes
Reviewer: Martin Dürst
Review Date: 2012-06-03, 2012 (written up 2012-06-04/05)
IETF Last Call Date: started 2012-06-04, ends 2012-07-02
Summary: This draft addresses a real generic need, but the current form
of the draft is the result of adding more and more special cases without
a clear overall view and a firm hand to separate the wheat from the
chaff. This shows both in the technical issues as well as in many of the
editorial issues below. This draft is not ready for publication without
some serious additional work, but that work is mostly straightforward
and should be easy to complete quickly.
Wheat? Chaff? Firm hand? Hmm. Are those useful phrases here?
I disagree about 'em in any case, and you're wrong as to how
we got here and IMO quite wrong in your main technical comment.
See below for that.
Major design issue:
The draft defines two schemes, which differ only slightly, and mostly
just gratuitously (see also editorial issues).
These are the ni: and the nih: scheme. As far as I understand, they
differ as follows:
authority: optional disallowed
ascii-compatible encoding: base64url base16
check digit: disallowed optional
query part: optional disallowed
decimal presentation of algorithm: disallowed possible
The usability of URIs is strongly influenced by the number of different
schemes, with the smaller a number, the better. As a somewhat made-up
example, if the original URIs had been separated into httph: for HTML
pages and httpi: for images, or any other arbitrary subdivision that one
can envision, that would have hurt the growth and extensibility of the
Web. Creating new URI schemes is occasionally necessary, and the ideas
that lead to this draft definitely seem to warrant a new scheme (*), but
there's no reason for two schemes.
[(*) I know people who would claim the the .well-formed http/https thing
is completely sufficient, no new scheme needed at all.]
More specifically, if the original URIs had been separated into httpm:
(for machines) and httph: (for humans), the Web for sure wouldn't have
grown at the speed it did (and does) grow. In practice, there are huge
differences in human 'speakability' for URIs (and IRIs, for that
matter); compare e.g. http://google.com with
(which I have significantly shortened to hopefully eliminate potential
privacy issues), or compare the average mailto: URI with the average
data: URI. However, what's important is that there never has been a
strong dividing line between machine-only and human-only URIs or
schemes, the division has always been very gradual. Short and mainly
human-oriented URIs have of course been handled by machines, and on the
other hand, very long URIs have been spoken when really necessary.
"Speakability" has been maintained to some extent by scheme designers,
and to some extent by "survival of the fittest" (URIs that weren't very
speakable (or spellable/memorizable/guessable/...), and their Web sites,
might just die out slowly).
It should also be noted that the resistance against multiple URI schemes
may have been low because there are so many different ways to express
hashes in the draft anyway, and one more (the nih: section is the last
one before the examples section) didn't seem like much of a deal
anymore. But when it comes to URIs, one less is a lot better than one more.
In the above ni:/nih: distinction, nih: seems to have been added as an
afterthought after realizing that reading an ni: URI aloud over the
phone may be somewhat suboptimal because there is a need for repeated
"upper case" - "lower case" (sure very quickly shortened to "upper" -
"lower" and then to "up" - "low" or something similar). It is not a bad
idea to try to make sure that IETF technology, and URIs in particular,
are accessible to people with certain kinds of dislexya. (There are
indeed people who have tremendous difficulties with distinguishing
upper- and lower-case letters, and this may or may not be connected with
other aspects of dislexya.) It is however totally unclear to this
reviewer why this has to lead to two different URI schemes with other
Finding a solution is rather easy (of course, other solutions may also
be possible): Merge the schemes, so that authority, check digit, and
query part are all optional (an authority part and/or a query part may
very well be very useful in human communication, and a check digit won't
hurt when transmitted electronically) and the decimal presentation of
the algorithm is always allowed, and use base32
(http://tools.ietf.org/html/rfc4648) as the encoding. This leads to a
16.6% less efficient encoding of the value part of the ni: URI, but
given that other URI-related encodings, e.g. the %-encoding resulting
when converting an IRI to an URI, are much less efficient, and that URI
infrastructure these days can handle URIs with more than 1000 bytes,
this should not be a serious problem. Also, there's a separate binary
format (section 6) that is more compact already.
I strongly disagree with merging ni & nih. Though that clearly
could be done, it would be an error.
There was no such comment on the uri-review list and the designated
expert was happy. That review was IMO the time for such comments
and second-guessing the designated expert at this stage seems
contrary to the registration requirements. So process-wise I
think your main comment is late.
But in any case, I also think you're wrong technically in this
nih *is* intended for a corner case, where humans need to speak these
URIs and was added as a direct result of requirements from the core
WG and not as an afterthought. ni URIs are not intended for that
and so there really are IMO different requirements, (esp. e.g.
checkdigit) that are best met with different schemes.
Merging ni/nih would also add more complexity for no benefit,
which would be a bad idea.
Your analogy about httpm/h may appear reasonable, but it is always
unreasonable to draw conclusions from analogies. It is also unwise
to reason from counterfactuals, which we'd also be doing if we
accepted your argument. So I find that speculation utterly useless
to be honest.
In this case, we are dealing with different requirements so this
should stay as-is.
Finally, we have (some, early,) running code that matches the
current draft and that ought also count for something when compared
to a change that would be a gratuitous dis-improvement based it
seems upon dubious argument that is also offered at the wrong
point in the process. (I'd say that gets over the level of my
disagreement here with a firm hand:-)
(relatively) Minor technical issues:
Section 2, "When the input to the hash algorithm is a public key value":
Is it absolutely clear that this will work for any and all public key
values, existing and future, and not only for what's currently around?
After all, as far as I understand, the concept of a public key is a
fairly general one.
Yes. SPKI is good for this and is what's used elsewhere, e.g. in
dane and websec. Its the right choice and will be so long as folks
still need to map public key formats to X.509 which I expect will
be the case for many years to come. (Not that we get new public
key formats very often in any case.)
"Other than in the above special case where public keys are used, we do
not specify the hash function input here. Other specifications are
expected to define this.": Do you really expect that to happen?
I do, yes, assuming that ni URIs get adopted. If they don't, then
its not a problem:-)
it be better limit variability here as much as possible, and to use
media types to identify different kinds of data?
To be honest, I think that's another day's work. I don't know that
there's a generic solution that'd work for enough protocols. If there
were, then that could, and I think, should, be done in another RFC.
This would also work
for public keys: If there's a MIME media type for a
SubjectPublicKeyInfo, then the fact that this media type is the
preferred way to transfer a public key becomes an application convention
rather than a special case in the spec. If a better way (or just another
way) to encode/transfer public keys became popular at a later date,
there would be no need to change the spec.
Related, in Section 3:
The "val" field MUST contain the output of base64url encoding the
result of applying the hash function ("alg") to its defined input,
which defaults to the object bytes that are expected to be returned
when the URI is dereferenced.
How do I know whether the default applies or not? The URI doesn't tell
you. Deducing from context is a bad idea.
I agree that deducing the input from context alone could be
difficult, though you would know when you got the right answer.
I think the way to handle this is for other specifications that
use ni URIs to specify the inputs.
Section 3: "Thus to ensure interoperability, implementations SHOULD NOT
generate URIs that employ URI character escaping": This is wrong and
needs to be fixed. Characters such as "&", "=", "#", and "%", as well as
ASCII characters not allowed in URIs and non-ASCII characters MUST be
%-encoded if they appear in query parameter values in URIs (or in query
parameter tags, which is however less likely). It would be better if the
spec here deferred to the URI spec rather than trying to come up with
its own rules.
Can you suggest text to include? I'm always uncertain about this
kind of thing and would be very happy to take your suggestion.
Section 3: "The Named Information URI adapts the URI definition from the
URI Generic Syntax [RFC3986].": This sounds as if this were a voluntary
decision (and the text should be changed to avoid such an impression),
Huh? I don't get what change you'd like.
but if you don't conform to RFC 3986 syntax, you're not an URI. This is
the first time I have seen an URI scheme definition starting explicitly
with the top ABNF rule from RFC 3986
(http://tools.ietf.org/html/rfc3986#appendix-A). This is completely
unnecessary. Just make sure your production conforms to the generic URI
syntax, and mention all the ABNF rules from RFC3986 that you use.
Also, using the "URI" production from RFC 3986, and then silently
dropping the #fragment part, is technically wrong. Scheme definitions
have nothing to do with the fragment (including the question of whether
there's a fragment or not; the semantics of fragments are defined by the
MIME media type that you get when you resolve). This may not be
completely clear in RFC 4395, but the IRI WG is working on an update of
RFC 4395 where this will be made clearer (see also
http://trac.tools.ietf.org/wg/iri/trac/ticket/126; thanks for giving me
a chance to remember that I had to create a new issue in the tracker for
Again, I'm not clear what change is suggested.
Section 3, ABNF:
ni-hier-part = "//" authority path-algval
This gives you ni://example.com/sha-256;f4OxZX_x_FO5... (//authority/)
and ni:/sha-256;f4OxZX_x_FO5... (one slash only), but the examples show
ni:///sha-256;f4OxZX_x_FO5... (three slashes). It looks like the ABNF
you want is:
ni-hier-part = "//" authority path-algval
/ "//" path-algval
(aligning "=" and "/" helps!)
or more simply:
ni-hier-part = "//" [authority] path-algval
or even more simply:
ni-hier-part = "//" authority path-algval
because authority can be empty; let's show this:
authority = [ userinfo "@" ] host [ ":" port ]
If we can show that host can be empty, we're done:
host = IP-literal / IPv4address / reg-name
If we can show that any one of these can be empty, we're done, let's
reg-name = *( unreserved / pct-encoded / sub-delims )
* means "zero or more", thus reg-name can be empty. QED.
Good catch. Will craft a fix that disallows "ni:/sha-s56;..."
and forces "ni:///sha-256;..." when the authority is empty.
The HTTP(S) mapping MAY be used in any context where clients without
support for ni URIs are needed without loss of interoperability or
What is meant by "support for ni"? There's nowhere in the spec where
this is explained clearly. If I were a browser maker, or writing an URI
library,..., what would I do to support the ni scheme? The only thing I
have come up with is to covert ni to the .well-known format, then use
HTTP(S). In that case, the above text seems wrong, as it says that
.well-known is used when there's no support for ni, not in order to
We can re-word, but personally I think its clear now. A suggestion
would be welcome.
Section 5: This defines an "URL segment format". It seems to be limited
to path componest in HTTP URIs. What if I want to use this in a query
part, or maybe even as a fragment identifier? What if I want to use this
as a path component in an FTP URI? Or in some other schem? It would be
better to define the alg-val (see next point) part as such (before the
other things), with an explanation along the following lines: "This is
defined here both for use in other sections of this document as well as
for use in other places where it may be helpful, such as HTTP URI path
Can do that. Good suggestion.
Section 5 (and Section 3): "To do this one simply uses the "alg;val"
production": There is no "alg;val" production. Please change to "To do
this one simply uses the <alg-val> production" and fix the ABNF in
section 3 to
path-algval = "/" alg-val
alg-val = alg ";" val
It's probably even better to fold this in with the changes to
ni-hier-part, resulting e.g. in:
ni-hier-part = "//" authority "/" alg-val
alg-val = alg ";" val
Section 9.4: Status can be 'empty' or 'deprecated'. I suggest to replace
'empty' with something positive, such as 'valid' or 'active'. This will
help people who go to the IANA page and start to ask "well, it doesn't
have a status, what does that mean".
Also, I strongly suggest to add an
additional status 'reserved', and remove the current "Reserved" hash
name string from the entries with IDs 0 and 32.
Huh? Wouldn't that confuse things more? IANA handles Reserved
values all the time.
Section 9.4: "The Suite ID value 32 is reserved for compatibility with
ORCHIDs [RFC4843].": How will compatibility be kept for future
changes/additions in ORCHID?
Dunno actually:-) Ari might. But we can change it to just say "reserved
for compatibility with 4843"
Major editorial issues:
Title and abstract (and the spec itself) use the wording "Naming
Things". While in a security context, it may be that there is an
implicitly assumption that there are only digital things, in a wider
context, this is of course not true. Research on the Internet of Things
and efforts such as the Semantic Web/Linked Data try to deal with things
in the real world. People in these areas it will be confused by title,
abstract, and text, unless you can show (me and) them an ni: hash for a
person, an apple, a building, or an elephant. Therefore, while it may be
possible to keep the catchy title, the abstract has to be fixed to avoid
such misunderstandings, e.g. by changing "to identify a thing" to "to
identify a digital object" or some such in the abstract, and likewise in
the main text of the spec.
First, I disagree that people will really be confused. I think this
is both a nit and a gratuitous one. However, I've no problem with
making that (tiny, inconsequential and by no means major:-) change to
"Human-speakable" (e.g. ), "human-readable" (e.g. section title of
section 7), and "for humans" (e.g. section title of section 9.2): These
terms are used throughout the spec, but are imprecise and confusing.
Imprecise: sure. Confusing: really? Were you really confused?
First, there's the problem of interpreting "for humans" in the sense of
the previous paragraph, which of course has to be fixed. But the main
problem is that none of the "ni:" URIs are "non-human-readable" or
"non-human-speakable". Reading them aloud is only somewhat more tedious,
but not at all impossible. And because the value part of the nih: form
is 50% longer, and people quickly develop conventions for shortening
things such as "upper case" and "lower case", it's not even clear that
reading aloud the nih: form will necessarily take that much time.
Therefore, I strongly recommend to change all occurrences of
"Human-speakable", "human-readable", "for humans", and the like, to the
more precise "more easily read out aloud by humans" or something
Happy to take a look. But I suspect we'll still disagree on
whether or not there's real confusion here.
Abstract and further on: "specifying URI, URL": By all URx theories (see
e.g. http://www.w3.org/TR/uri-clarification/), URLs are a subset of
URIs, and therefore saying that the spec specifies an URI and an URL is
somewhat confusing. I'd propose using wording along the following lines:
"specifying an URI scheme and a way to map these URIs to http".
Sure. Happy to make this *minor* change:-)
Section 2, "When the input to the hash algorithm is a public key value",
and example section: It took me a while to understand that the "public
key" stuff was not yet another way to present a hash, and also not a way
to mix in a public key to the hash in order to obtain some specific
security property (I wasn't able to figure out how that would work, but
draft-hallambaker-decade-ni-params contains something similar involving
digital signatures and a public key). The document would be much easier
to understand if there was a section e.g. entitled "Forms of input to
hash", with subsections e.g. "general data", "public keys", "other stuff
(not defined in this document)". As it is written, the relevant
paragraphs in section 2 look like an afterthought, and it's not clear to
I really don't get what's not clear there and I suspect I don't like
the suggested re-structuring but I'll take a look. Be good if you can
make a suggestion for text to add to the current structure that would
have avoided your confusion.
Also, the example section should be fixed as follows: 1) say upfront
that there will be two examples, one for a short string and another for
a public key. 2) Make sure both examples exercise all forms (the public
key example seems to be pretty complete, but the "Hello World!" example
seems to be incomplete). 3) Use the same form of presentation (either a
table in both cases or short paragaphs in both cases.
The caption on Figure 7 is also way too unspecific.
I'll take a look. I entirely disagree that these are *major*
Section 9.4: "Hash Name Algorithm Registry", and later "a new registry
for hash algorithms as used in the name formats specified here": IANA
will be helped tremendously if your draft comes with an
easy-to-understand and unambiguous name for the new registry. "Hash Name
Algorithm Registry" may be okay, but is probably not specific enough.
The circumscription at the start of the section is definitely not good
enough because you're not registering hash algorithms, but names of hash
algorithms and their truncations.
I'll take a look.
Minor editorial issues:
Introduction: It would be good to have a general reference to hashing
(for security purposes) for people not utterly familiar with the subject.
Disagree. If I added that I could reasonably be asked to introduce
URIs for the security folks. Serious and pointless ratholes would ensue.
Intro: After reading the whole document, the structure of the Intro
seems to make some sense, but it didn't on first reading (where it's
actually more important). The main problem I was able to identify was
that after a general outlook in paragraph 1, the Intro drops into a list
of examples without saying what they are good for. I suggest to, after
the sentence "This document specifies standard ways to do that to aid
interoperability.", add a sentence along the lines: "The next few
paragraphs give usage examples for the various ways to include a hash in
a name or identifier as they are defined later in this document.". It
may also make sense to further streamline the following paragraphs, so
that it is clearer which pieces of text refer each to one of the
There are two instances of the term "binary presentation". Looking
around, it seems that they are supposed to mean the same as "binary
format". Please replace all instances of "binary presentation" with
"binary format" to avoid misunderstandings and useless seach time.
Section 3: "A Named Information (ni) URI consists of the following
components:": It would be good to know exactly where the list ended. One
way to do this would be to say "consists of the following nine components".
Those look reasonable. Will see if the changes work out.
Section 3: "Note that while the ni names with and without an authority
differ syntactically, both names refer to the same object if the digest
algorithm and value are the same.": What about cases with different
authority? The text seems to apply by transitivity, but this may be easy
to miss for an implementer. I suggest changing to: "Note that while ni
names with and without an authority, and ni names with different
authorities, differ syntactically, they all refer to the same object if
the digest algorithm and value are the same.".
Section 3: "Consequently no special escaping mechanism is required for
the query parameter portion of ni URIs.": Does this mean "no escaping
mechanism at all"? Or "nothing besides %-encoding"? Or something else?
I wish I knew:-) What do you think is right here? (Honestly,
input on this would be appreciated.)
Figure 3: the "=" characters of the various rules should be aligned as
much as possible to make it easier to scan the productions (see
http://tools.ietf.org/html/rfc3986#appendix-A for an example).
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
; directly from RFC 3986, section 2.3
; "authority" and "pct-encoded" are also from RFC 3986
Please don't copy productions. Please don't copy half (or one-third,
actually) of the productions you use, and reference the rest. Please
don't say what productions you copy from where in a comment, and even
less in a comment for an unrelated production. Please before the ABNF,
say which productions are used from another spec.
We got contrary advice from elsewhere (can't recall where right now;-).
I'll let Barry (as sponsoring AD) just tell us his preference and go
with that if that's ok.
The HTTP(S) mapping MAY be used in any context where clients without
support for ni URIs are needed without loss of interoperability or
This is difficult to understand. If some new functionality is proposed,
it's usually a client *with* the new functionality that's needed, not
one without. Also, the "without loss of interoperability or
functionality" is unclear: Sure if ni isn't supported, there's a loss in
interoperability. So I suggest to rewrite this as:
The HTTP(S) mapping MAY be used in any context where clients with
support for ni URIs are not available.
(but see also the comment in minor technical issues)
Section 6: "binary format name": Why 'name'? Why not just "binary
format"? The later is completely clear in the context of the document or
together with an indication of the document; for something that can be
used independently, even "binary format name" isn't enough.
I don't get the problem with that.
Section 6: "suite ID": The word "suite" seems out of place here. In the
general use of the term, it refers to "a group of things forming a unit
or constituting a collection" (see
http://www.merriam-webster.com/dictionary/suite). A good definition that
works for the uses I'm familiar with in digital security would be "An
algorithm suite is a coherent collection of cryptographic algorithms for
performing operations such as signing, encryption, generating message
digests, and so on."
disclaimer: I'm in no way a SOAP fan). The use here is not for a
collection, but for a single truncated-length variant of a single hash
algorithm. I seriously hope you can find a better name.
That's a don't-care for me. I think suite is fine, but could
take other terms (so long as its not "algorithm"). Suite could
be justified since we have alg+truncation here, but like I
said I'd be fine to change, if a good suggestion is made.
Section 6: "Note that a hash value that is truncated to 120 bits will
result in the overall name being a 128-bit value which may be useful
with certain use-cases.": This left me really wondering: Is there
something magic to 128 bits in computer/internet security? What are the
"certain use cases"? Or is this just an example to make sure the reader
got the relationships, and it could have been as well "Note that a hash
value that is truncated to 64 bits will result in the overall name being
a 72-bit value which may be useful with certain use-cases." (or whatever
other value that's registered in section 9)?
Bit of both. I believe the core WG are keen to end up with a 128 bit
binary value as their preferred option.
Section 7: Just for the highly unfortunate case that this doesn't
disappear, it would be very helpful if the presentation of this section
paralleled section 3.
Disagree. Different requirements, different URIs, different
presentation. I don't think there's a real problem here.
Section 7: "contain the ID value as a UTF-8 encoded decimal number": I'm
an internationalization expert with a strong affection for UTF-8, but
even for me, this should be "contain the ID value as an ASCII encoded
Section 9: The registration templates refer to sections. This is fine
for readers of the draft, but not if the template is standalone. I
suggest using a format such as that at
http://tools.ietf.org/html/rfc6068#section-8.1, which in draft stage may
look e.g. like
Will take a peek. Not sure I agree. (Nor disagree:-)
Section 9.3: "Assignment of Well Known URI prefix ni" and later (and
elsewhere in the draft) "URI suffix": Are we dealing with a prefix or a
Will take a peek.
Section 9.4: "This registry has five fields, the binary suite ID,...":
Better to remove the word "binary", because the actual number is decimal.
Section 9.4: "The expert SHOULD seek IETF review before approving a
request to mark an entry as "deprecated." Such requests may simply take
the form of a mail to the designated expert (an RFC is not required).
IETF review can be achieved if the designated expert sends a mail to the
IETF discussion list. At least two weeks for comments MUST be allowed
thereafter before the request is approved and actioned.": I'm at a loss
to see why asking the IETF at large is a SHOULD, but if it's done, then
the two weeks period is a MUST.
I don't get your comment. The two weeks is a MUST already.
Section 9.4: The registry initialization in Fig. 8 refers to RFC4055
many times. But RFC 4055 does in no way define SHA-256. It looks like
the actual spec is http://tools.ietf.org/html/rfc4055#ref-SHA2 (National
Institute of Standards and Technology (NIST), FIPS 180-2: Secure Hash
Standard, 1 August 2002.) I think this should be cited, in particular
because there is a "Specification Required" requirement, and this sure
should mean that there is a Specification for the actual algorithm, and
not just a specification that mentions some labels. So using RFC4055 as
a reference could be taken as creating bad precedent.
I guess so. Good catch.
Section 9.4: "The designated expert is responsible for ensuring that the
document referenced for the hash algorithm is such that it would be
acceptable were the "specification required" rule applied.": Why all
this circumscription? Why not just say something like: "The designated
expert is responsible for ensuring that the document referenced for the
hash algorithm meets the "specification required" rule."
Honestly? I can't recall:-) Will change unless I do remember.
Author's list: Last time I heard about this, there was a general limit
of 5 authors per RFC. I'm not sure whether this still exists, and what'd
be needed to get around it, but I just wanted to point out that this may
be a potential problem or additional work (hoops to get through).
Intro: "Since, there is no standard" -> "Since there is no standard"
Intro: "for these various purposes" -> "for these purposes" or "for
various purposes" (the indefinite 'various' is incompatible with the
"2. Hashes are what Count" -> "2. Hashes are what Counts" (the former
may look logically correct, but 'what' requires a singular verb form.
Section 2: "the left-most or most significant in network byte order N
bits from the binary representation of the hash value" -> "the left-most
(or most significant in network byte order) N bits from the binary
representation of the hash value" or "the left-most N bits, or the N
most significant bits in network byte order, from the binary
representation of the hash value" (the current text is virtually
Figure 1: The 0x notation is never explained. A short clause or pharse
is all that would be needed, but it would be better if this were spelled
Section 3, Query Parameter separator: "The query parameter separator
acts a separator between" -> "The query parameter separator acts *as* a
Section 3, Query Parameters: "A tag=value list of optional query
parameters as are used with HTTP URLs" -> "A tag=value list of optional
query parameters as used with HTTP URLs" (or "A tag=value list of
optional query parameters as they are used with HTTP URLs").
Section 4: "the object named by the ni URI will be available at the
corresponding HTTP(S) URL" -> "the object named by the ni URI will be
available via the corresponding HTTP(S) URL" (via stresses the point
that this should be done via (sic) redirection)
Section 4: "so there may still be reasons to use" -> "so there can still
be reasons to use" (better to use can because non-normative; the
document otherwise does a good job on this)
Section 10: "Note that fact that" -> "Note the fact that", or much
better: "Note that".
Those look ok or are nits in any case.
Thanks again for the thorough review even though we disagree as
to the main point.