<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div class="markdown-here-wrapper" data-md-url="" style="">
<p style="margin: 0px 0px 1.2em !important;">Hi Brian.<br>
I believe this is ultimately a bad idea. Note that I’ve been a
strong supporter of this position in the past.</p>
<p style="margin: 0px 0px 1.2em !important;">Now, onto the reason
I think it’s a bad idea. Let’s ignore legacy API for now. Let’s
assume the world is already moved on and adopted
StringTemplates. A new library that needs to parse strings which
contain sensitive user-defined values, already got the memo, and
will provide a StringTemplate-accepting factory (not merely a
String- accepting one).</p>
<p style="margin: 0px 0px 1.2em !important;">This world is
inherently safer than the world we have today - because a string
template is typically composed of two facets:</p>
<ul style="margin: 1.2em 0px;padding-left: 2em;">
<li style="margin: 0.5em 0px;">a “variable part” (the template
arguments)</li>
<li style="margin: 0.5em 0px;">a “constant part” (the template
fragments)</li>
</ul>
<p style="margin: 0px 0px 1.2em !important;">Libraries should
focus their validation/escaping efforts on the variable part of
a string template. But, for this assumption to hold water, we
need to be able to guarantee that the user cannot accidentally
sneak in some “variable parts” into the “constant part” of a
string template. Unfortunately, the String <: StringTemplate
approach seems to allow exactly that:</p>
<pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;">Foo of(StringTemplate) { ... }
Foo.of("Hello!") // ok, string is a constant
Foo.of("Hello" + world) // what?
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">If messy,
concatenated strings can be treated as degenerate templates, I
believe we’d be no better off than we are today - even in the
case of brand new API that fully bought into the idea of
StringTemplate.</p>
<p style="margin: 0px 0px 1.2em !important;">Maurizio</p>
<p style="margin: 0px 0px 1.2em !important;">On 12/03/2024 17:32,
Brian Goetz wrote:</p>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div class="markdown-here-exclude">
<p></p>
<blockquote type="cite" cite="mid:87dd98c8-e0ac-49e0-995a-5466a50219d3@oracle.com">
<font size="4" face="monospace">Splitting off into a separate
thread. <br>
<br>
I would like to redirect this discussion from the mechanical
challenges and consequences to the goals and semantics. <br>
<br>
If we are considering "String extends StringTemplate", we
are making a semantic statement that a String *is-a*
StringTemplate. While I can imagine convincing oneself that
this is true "if you look at it right", this sets off all my
"self-justification" detectors. <br>
<br>
So, I recommend we step back and examine why we think this
is a good idea before we descend into the mechanics. My
suspicion is that this is motivated by "I want to be able to
automatically use String where a StringTemplate is desired",
and that this seems a clever-enough hack to get there. (I
think we probably also need to drill further, into "why do
we think it is important to be able to use String where
StringTemplate is desired", and I suspect further that part
of it will be "but the APIs are not yet fully equilibrated"
(which would be a truly bad reason to give String a new
supertype.))<br>
<br>
<br>
<br>
</font><br>
<div class="moz-cite-prefix">On 3/12/2024 1:24 PM, Tagir
Valeev wrote:<br>
</div>
<blockquote type="cite" cite="mid:CAE+3fjYP3xo4BPomSuvoG-whTQCNTKs6tK3SOUCuHT5YvZ0iWw@mail.gmail.com">
<div dir="ltr">
<div>Hello, Maurizio!</div>
<div><br>
</div>
<div>Thank you for the detailed explanation!</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Mon, Mar 11, 2024
at 1:16 PM Maurizio Cimadamore <<a href="mailto:maurizio.cimadamore@oracle.com" moz-do-not-send="true" class="moz-txt-link-freetext">maurizio.cimadamore@oracle.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<div>
<p style="margin:0px 0px 1.2em">Hi all,<br>
we tried mainly three approaches to allow
smoother interop between strings and string
templates: (a) make String a subclass of
StringTemplate. Or (b) make constant strings bs
<em>convertible</em> to string templates. Or,
(c) use target-typing. All these approaches have
some issues, discussed below.<br>
</p>
<p style="margin:0px 0px 1.2em">The first approach
is slightly simpler, because it can be achieved
entirely outside of the Java language.
Unfortunately, adding “String implements
StringTemplate” adds overload ambiguities in
cases such as this:</p>
<pre style="font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;background-color:rgb(248,248,248);white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block">format(StringTemplate) // 1
format(String, Object...) // 2
</code></pre>
<p style="margin:0px 0px 1.2em">This is actually a
very important case, as we predice that
StringTemplate will serve as a great replacement
for methods out there accepting a string/Object…
pack.</p>
<p style="margin:0px 0px 1.2em">Unfortunatly, if
String <: StringTemplate, this means that
calling format with a string literal will
resolve to (1), not (2) as before. The problem
here is that (2) is not even applicable during
the two overload resolution phases (which is
only allowed to use subtyping and conversions,
respectively), as it is a varargs method.
Because of this, (1) will now take the
precedence, as that’s not varargs. While for
String::format this is probably harmless,
changing results of overload selection is
something that should be done with care (esp. if
different overloads have different return
types), as it could lead to source compatibility
issues.</p>
</div>
</div>
</blockquote>
<div>I would still like to advocate for String <:
StringTemplate solution. I think that the overloading
is not a big problem. Simply making String implements
StringTemplate will not break any of existing code
because there are no APIs yet that accept the
StringTemplate instance. The problem may appear only
when an API author actually adds such an overload and
does this in an incompatible way with an existing
String overload. This would be an extremely bad design
choice, and the blame goes to the API author. You've
correctly mentioned that for String::format this is
harmless because the API is well-designed. We may
suggest in StringTemplate documentation that the API
designers should provide the same behavior for
foo(String) and foo(StringTemplate) when they add an
overload.</div>
<div><br>
</div>
<div>I must say that we already had an experience of
introducing new interfaces in the hierarchy of
widely-used library classes. Closable got AutoClosable
parent, StringBuilder became comparable, and so on. So
far, the compatibility issues introduced were
tolerable. Well, probably I'm missing something but we
have preview rounds just for this purpose: to find out
the disadvantages of the approach.</div>
<div><br>
</div>
<div> </div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<div>
<p style="margin:0px 0px 1.2em">On top of these
issues, making all strings be string templates
has the disadvantage of also considering “messy”
strings obtained via concatenation of
non-constant values string templates too, which
seems bad.</p>
</div>
</div>
</blockquote>
<div>I think that most of the APIs will still provide
String overload. E.g., for preparing an SQL statement,
it's a perfectly reasonable scenario to have a
constant string as the input. So
prepareStatement(String) will stay along with
prepareStatement(StringTemplate). And people will
still be able to use concatenation. I don't think that
the absence of String <: StringTemplate relation
will protect anybody from using the concatenation. On
the other hand, if String actually implements
StringTemplate, it will be a very simple static
analysis rule to warn if the concatenation occurs in
this context. If the expected type for concatenation
is StringTemplate, then something is definitely wrong.
Without 'String implements StringTemplate', one will
not be able to write a concatenation directly in
StringTemplate context. Instead, String-accepting
overload will be used, and the expected type will be
String, so static analyzer will have to guess whether
it's dangerous to use the concatenation here. In
short, I think that it's actually an advantage: we
have an additional hint here that concatenation is
undesired. Even compilation warning could be possible
to implement.</div>
<div><br>
</div>
<div>So, I don't see these points as real disadvantages.
I definitely like this approach much more than adding
any kind of implicit conversion or another literal
syntax, which would complicate the specification much
more.<br>
</div>
<div><br>
</div>
<div>With best regards,</div>
<div>Tagir Valeev.</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<div> </div>
</div>
</blockquote>
</div>
</div>
</blockquote>
<br>
</blockquote>
<p></p>
</div>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div title="MDH:PHA+SGkgQnJpYW4uPGJyPkkgYmVsaWV2ZSB0aGlzIGlzIHVsdGltYXRlbHkgYSBiYWQgaWRlYS4g
Tm90ZSB0aGF0IEkndmUgYmVlbiBhIHN0cm9uZyBzdXBwb3J0ZXIgb2YgdGhpcyBwb3NpdGlvbiBp
biB0aGUgcGFzdC48L3A+PHA+Tm93LCBvbnRvIHRoZSByZWFzb24gSSB0aGluayBpdCdzIGEgYmFk
IGlkZWEuIExldCdzIGlnbm9yZSBsZWdhY3kgQVBJIGZvciBub3cuIExldCdzIGFzc3VtZSB0aGUg
d29ybGQgaXMgYWxyZWFkeSBtb3ZlZCBvbiBhbmQgYWRvcHRlZCBTdHJpbmdUZW1wbGF0ZXMuIEEg
bmV3IGxpYnJhcnkgdGhhdCBuZWVkcyB0byBwYXJzZSBzdHJpbmdzIHdoaWNoIGNvbnRhaW4gc2Vu
c2l0aXZlIHVzZXItZGVmaW5lZCB2YWx1ZXMsIGFscmVhZHkgZ290IHRoZSBtZW1vLCBhbmQgd2ls
bCBwcm92aWRlIGEgU3RyaW5nVGVtcGxhdGUtYWNjZXB0aW5nIGZhY3RvcnkgKG5vdCBtZXJlbHkg
YSBTdHJpbmctIGFjY2VwdGluZyBvbmUpLjwvcD48cD5UaGlzIHdvcmxkIGlzIGluaGVyZW50bHkg
c2FmZXIgdGhhbiB0aGUgd29ybGQgd2UgaGF2ZSB0b2RheSAtIGJlY2F1c2UgYSBzdHJpbmcgdGVt
cGxhdGUgaXMgdHlwaWNhbGx5IGNvbXBvc2VkIG9mIHR3byBmYWNldHM6PGJyPjxicj4qIGEgInZh
cmlhYmxlIHBhcnQiICh0aGUgdGVtcGxhdGUgYXJndW1lbnRzKTxicj4qIGEgImNvbnN0YW50IHBh
cnQiICh0aGUgdGVtcGxhdGUgZnJhZ21lbnRzKTwvcD48cD5MaWJyYXJpZXMgc2hvdWxkIGZvY3Vz
IHRoZWlyIHZhbGlkYXRpb24vZXNjYXBpbmcgZWZmb3J0cyBvbiB0aGUgdmFyaWFibGUgcGFydCBv
ZiBhIHN0cmluZyB0ZW1wbGF0ZS4gQnV0LCBmb3IgdGhpcyBhc3N1bXB0aW9uIHRvIGhvbGQgd2F0
ZXIsIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBndWFyYW50ZWUgdGhhdCB0aGUgdXNlciBjYW5ub3Qg
YWNjaWRlbnRhbGx5IHNuZWFrIGluIHNvbWUgInZhcmlhYmxlIHBhcnRzIiBpbnRvIHRoZSAiY29u
c3RhbnQgcGFydCIgb2YgYSBzdHJpbmcgdGVtcGxhdGUuIFVuZm9ydHVuYXRlbHksIHRoZSBTdHJp
bmcgJmx0OzogU3RyaW5nVGVtcGxhdGUgYXBwcm9hY2ggc2VlbXMgdG8gYWxsb3cgZXhhY3RseSB0
aGF0OjwvcD48cD5gYGA8YnI+Rm9vIG9mKFN0cmluZ1RlbXBsYXRlKSB7IC4uLiB9PGJyPjxicj5G
b28ub2YoIkhlbGxvISIpIC8vIG9rLCBzdHJpbmcgaXMgYSBjb25zdGFudDxicj5Gb28ub2YoIkhl
bGxvIiArIHdvcmxkKSAvLyB3aGF0Pzxicj5gYGA8YnI+PC9wPjxwPklmIG1lc3N5LCBjb25jYXRl
bmF0ZWQgc3RyaW5ncyBjYW4gYmUgdHJlYXRlZCBhcyBkZWdlbmVyYXRlIHRlbXBsYXRlcywgSSBi
ZWxpZXZlIHdlJ2QgYmUgbm8gYmV0dGVyIG9mZiB0aGFuIHdlIGFyZSB0b2RheSAtIGV2ZW4gaW4g
dGhlIGNhc2Ugb2YgYnJhbmQgbmV3IEFQSSB0aGF0IGZ1bGx5IGJvdWdodCBpbnRvIHRoZSBpZGVh
IG9mIFN0cmluZ1RlbXBsYXRlLjwvcD48cD5NYXVyaXppbzxicj48L3A+PHA+PGJyPjwvcD48ZGl2
IGNsYXNzPSJtb3otY2l0ZS1wcmVmaXgiPk9uIDEyLzAzLzIwMjQgMTc6MzIsIEJyaWFuIEdvZXR6
IHdyb3RlOjxicj48L2Rpdj48YmxvY2txdW90ZSB0eXBlPSJjaXRlIiBjaXRlPSJtaWQ6ODdkZDk4
YzgtZTBhYy00OWUwLTk5NWEtNTQ2NmE1MDIxOWQzQG9yYWNsZS5jb20iPgoKPG1ldGEgaHR0cC1l
cXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7ICI+CiAgCiAgCiAgICA8Zm9u
dCBzaXplPSI0IiBmYWNlPSJtb25vc3BhY2UiPlNwbGl0dGluZyBvZmYgaW50byBhIHNlcGFyYXRl
CiAgICAgIHRocmVhZC4mbmJzcDsgPGJyPgogICAgICA8YnI+CiAgICAgIEkgd291bGQgbGlrZSB0
byByZWRpcmVjdCB0aGlzIGRpc2N1c3Npb24gZnJvbSB0aGUgbWVjaGFuaWNhbAogICAgICBjaGFs
bGVuZ2VzIGFuZCBjb25zZXF1ZW5jZXMgdG8gdGhlIGdvYWxzIGFuZCBzZW1hbnRpY3MuJm5ic3A7
IDxicj4KICAgICAgPGJyPgogICAgICBJZiB3ZSBhcmUgY29uc2lkZXJpbmcgIlN0cmluZyBleHRl
bmRzIFN0cmluZ1RlbXBsYXRlIiwgd2UgYXJlCiAgICAgIG1ha2luZyBhIHNlbWFudGljIHN0YXRl
bWVudCB0aGF0IGEgU3RyaW5nICppcy1hKiBTdHJpbmdUZW1wbGF0ZS4mbmJzcDsKICAgICAgV2hp
bGUgSSBjYW4gaW1hZ2luZSBjb252aW5jaW5nIG9uZXNlbGYgdGhhdCB0aGlzIGlzIHRydWUgImlm
IHlvdQogICAgICBsb29rIGF0IGl0IHJpZ2h0IiwgdGhpcyBzZXRzIG9mZiBhbGwgbXkgInNlbGYt
anVzdGlmaWNhdGlvbiIKICAgICAgZGV0ZWN0b3JzLiZuYnNwOyA8YnI+CiAgICAgIDxicj4KICAg
ICAgU28sIEkgcmVjb21tZW5kIHdlIHN0ZXAgYmFjayBhbmQgZXhhbWluZSB3aHkgd2UgdGhpbmsg
dGhpcyBpcyBhCiAgICAgIGdvb2QgaWRlYSBiZWZvcmUgd2UgZGVzY2VuZCBpbnRvIHRoZSBtZWNo
YW5pY3MuJm5ic3A7IE15IHN1c3BpY2lvbiBpcwogICAgICB0aGF0IHRoaXMgaXMgbW90aXZhdGVk
IGJ5ICJJIHdhbnQgdG8gYmUgYWJsZSB0byBhdXRvbWF0aWNhbGx5IHVzZQogICAgICBTdHJpbmcg
d2hlcmUgYSBTdHJpbmdUZW1wbGF0ZSBpcyBkZXNpcmVkIiwgYW5kIHRoYXQgdGhpcyBzZWVtcyBh
CiAgICAgIGNsZXZlci1lbm91Z2ggaGFjayB0byBnZXQgdGhlcmUuJm5ic3A7IChJIHRoaW5rIHdl
IHByb2JhYmx5IGFsc28gbmVlZAogICAgICB0byBkcmlsbCBmdXJ0aGVyLCBpbnRvICJ3aHkgZG8g
d2UgdGhpbmsgaXQgaXMgaW1wb3J0YW50IHRvIGJlIGFibGUKICAgICAgdG8gdXNlIFN0cmluZyB3
aGVyZSBTdHJpbmdUZW1wbGF0ZSBpcyBkZXNpcmVkIiwgYW5kIEkgc3VzcGVjdAogICAgICBmdXJ0
aGVyIHRoYXQgcGFydCBvZiBpdCB3aWxsIGJlICJidXQgdGhlIEFQSXMgYXJlIG5vdCB5ZXQgZnVs
bHkKICAgICAgZXF1aWxpYnJhdGVkIiAod2hpY2ggd291bGQgYmUgYSB0cnVseSBiYWQgcmVhc29u
IHRvIGdpdmUgU3RyaW5nIGEKICAgICAgbmV3IHN1cGVydHlwZS4pKTxicj4KICAgICAgPGJyPgog
ICAgICA8YnI+CiAgICAgIDxicj4KICAgIDwvZm9udD48YnI+CiAgICA8ZGl2IGNsYXNzPSJtb3ot
Y2l0ZS1wcmVmaXgiPk9uIDMvMTIvMjAyNCAxOjI0IFBNLCBUYWdpciBWYWxlZXYKICAgICAgd3Jv
dGU6PGJyPgogICAgPC9kaXY+CiAgICA8YmxvY2txdW90ZSB0eXBlPSJjaXRlIiBjaXRlPSJtaWQ6
Q0FFKzNmallQM3hvNEJQb21TdXZvRy13aFRRQ05US3M2dEszU09VQ3VIVDVZdlowaVd3QG1haWwu
Z21haWwuY29tIj4KICAgICAgCiAgICAgIDxkaXYgZGlyPSJsdHIiPgogICAgICAgIDxkaXY+SGVs
bG8sIE1hdXJpemlvITwvZGl2PgogICAgICAgIDxkaXY+PGJyPgogICAgICAgIDwvZGl2PgogICAg
ICAgIDxkaXY+VGhhbmsgeW91IGZvciB0aGUgZGV0YWlsZWQgZXhwbGFuYXRpb24hPC9kaXY+CiAg
ICAgICAgPGJyPgogICAgICAgIDxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj4KICAgICAgICAgIDxk
aXYgZGlyPSJsdHIiIGNsYXNzPSJnbWFpbF9hdHRyIj5PbiBNb24sIE1hciAxMSwgMjAyNCBhdAog
ICAgICAgICAgICAxOjE24oCvUE0gTWF1cml6aW8gQ2ltYWRhbW9yZSAmbHQ7PGEgaHJlZj0ibWFp
bHRvOm1hdXJpemlvLmNpbWFkYW1vcmVAb3JhY2xlLmNvbSIgbW96LWRvLW5vdC1zZW5kPSJ0cnVl
IiBjbGFzcz0ibW96LXR4dC1saW5rLWZyZWV0ZXh0Ij5tYXVyaXppby5jaW1hZGFtb3JlQG9yYWNs
ZS5jb208L2E+Jmd0OwogICAgICAgICAgICB3cm90ZTo8YnI+CiAgICAgICAgICA8L2Rpdj4KICAg
ICAgICAgIDxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowcHgg
MHB4IDBweCAwLjhleDtib3JkZXItbGVmdDoxcHggc29saWQgcmdiKDIwNCwyMDQsMjA0KTtwYWRk
aW5nLWxlZnQ6MWV4Ij4KICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICA8ZGl2PgogICAg
ICAgICAgICAgICAgPHAgc3R5bGU9Im1hcmdpbjowcHggMHB4IDEuMmVtIj5IaSBhbGwsPGJyPgog
ICAgICAgICAgICAgICAgICB3ZSB0cmllZCBtYWlubHkgdGhyZWUgYXBwcm9hY2hlcyB0byBhbGxv
dyBzbW9vdGhlcgogICAgICAgICAgICAgICAgICBpbnRlcm9wIGJldHdlZW4gc3RyaW5ncyBhbmQg
c3RyaW5nIHRlbXBsYXRlczogKGEpIG1ha2UKICAgICAgICAgICAgICAgICAgU3RyaW5nIGEgc3Vi
Y2xhc3Mgb2YgU3RyaW5nVGVtcGxhdGUuIE9yIChiKSBtYWtlCiAgICAgICAgICAgICAgICAgIGNv
bnN0YW50IHN0cmluZ3MgYnMgPGVtPmNvbnZlcnRpYmxlPC9lbT4gdG8gc3RyaW5nCiAgICAgICAg
ICAgICAgICAgIHRlbXBsYXRlcy4gT3IsIChjKSB1c2UgdGFyZ2V0LXR5cGluZy4gQWxsIHRoZXNl
CiAgICAgICAgICAgICAgICAgIGFwcHJvYWNoZXMgaGF2ZSBzb21lIGlzc3VlcywgZGlzY3Vzc2Vk
IGJlbG93Ljxicj4KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgIDxwIHN0eWxl
PSJtYXJnaW46MHB4IDBweCAxLjJlbSI+VGhlIGZpcnN0IGFwcHJvYWNoIGlzCiAgICAgICAgICAg
ICAgICAgIHNsaWdodGx5IHNpbXBsZXIsIGJlY2F1c2UgaXQgY2FuIGJlIGFjaGlldmVkIGVudGly
ZWx5CiAgICAgICAgICAgICAgICAgIG91dHNpZGUgb2YgdGhlIEphdmEgbGFuZ3VhZ2UuIFVuZm9y
dHVuYXRlbHksIGFkZGluZwogICAgICAgICAgICAgICAgICDigJxTdHJpbmcgaW1wbGVtZW50cyBT
dHJpbmdUZW1wbGF0ZeKAnSBhZGRzIG92ZXJsb2FkCiAgICAgICAgICAgICAgICAgIGFtYmlndWl0
aWVzIGluIGNhc2VzIHN1Y2ggYXMgdGhpczo8L3A+CiAgICAgICAgICAgICAgICA8cHJlIHN0eWxl
PSJmb250LWZhbWlseTpDb25zb2xhcyxJbmNvbnNvbGF0YSxDb3VyaWVyLG1vbm9zcGFjZTtmb250
LXNpemU6MWVtO2xpbmUtaGVpZ2h0OjEuMmVtO21hcmdpbjoxLjJlbSAwcHgiPjxjb2RlIHN0eWxl
PSJmb250LXNpemU6MC44NWVtO2ZvbnQtZmFtaWx5OkNvbnNvbGFzLEluY29uc29sYXRhLENvdXJp
ZXIsbW9ub3NwYWNlO21hcmdpbjowcHggMC4xNWVtO2JhY2tncm91bmQtY29sb3I6cmdiKDI0OCwy
NDgsMjQ4KTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDtvdmVyZmxvdzphdXRvO2JvcmRlci1yYWRpdXM6
M3B4O2JvcmRlcjoxcHggc29saWQgcmdiKDIwNCwyMDQsMjA0KTtwYWRkaW5nOjAuNWVtIDAuN2Vt
O2Rpc3BsYXk6YmxvY2siPmZvcm1hdChTdHJpbmdUZW1wbGF0ZSkgLy8gMQpmb3JtYXQoU3RyaW5n
LCBPYmplY3QuLi4pIC8vIDIKPC9jb2RlPjwvcHJlPgogICAgICAgICAgICAgICAgPHAgc3R5bGU9
Im1hcmdpbjowcHggMHB4IDEuMmVtIj5UaGlzIGlzIGFjdHVhbGx5IGEgdmVyeQogICAgICAgICAg
ICAgICAgICBpbXBvcnRhbnQgY2FzZSwgYXMgd2UgcHJlZGljZSB0aGF0IFN0cmluZ1RlbXBsYXRl
IHdpbGwKICAgICAgICAgICAgICAgICAgc2VydmUgYXMgYSBncmVhdCByZXBsYWNlbWVudCBmb3Ig
bWV0aG9kcyBvdXQgdGhlcmUKICAgICAgICAgICAgICAgICAgYWNjZXB0aW5nIGEgc3RyaW5nL09i
amVjdOKApiBwYWNrLjwvcD4KICAgICAgICAgICAgICAgIDxwIHN0eWxlPSJtYXJnaW46MHB4IDBw
eCAxLjJlbSI+VW5mb3J0dW5hdGx5LCBpZiBTdHJpbmcKICAgICAgICAgICAgICAgICAgJmx0Ozog
U3RyaW5nVGVtcGxhdGUsIHRoaXMgbWVhbnMgdGhhdCBjYWxsaW5nIGZvcm1hdAogICAgICAgICAg
ICAgICAgICB3aXRoIGEgc3RyaW5nIGxpdGVyYWwgd2lsbCByZXNvbHZlIHRvICgxKSwgbm90ICgy
KSBhcwogICAgICAgICAgICAgICAgICBiZWZvcmUuIFRoZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCAo
MikgaXMgbm90IGV2ZW4KICAgICAgICAgICAgICAgICAgYXBwbGljYWJsZSBkdXJpbmcgdGhlIHR3
byBvdmVybG9hZCByZXNvbHV0aW9uIHBoYXNlcwogICAgICAgICAgICAgICAgICAod2hpY2ggaXMg
b25seSBhbGxvd2VkIHRvIHVzZSBzdWJ0eXBpbmcgYW5kCiAgICAgICAgICAgICAgICAgIGNvbnZl
cnNpb25zLCByZXNwZWN0aXZlbHkpLCBhcyBpdCBpcyBhIHZhcmFyZ3MgbWV0aG9kLgogICAgICAg
ICAgICAgICAgICBCZWNhdXNlIG9mIHRoaXMsICgxKSB3aWxsIG5vdyB0YWtlIHRoZSBwcmVjZWRl
bmNlLCBhcwogICAgICAgICAgICAgICAgICB0aGF04oCZcyBub3QgdmFyYXJncy4gV2hpbGUgZm9y
IFN0cmluZzo6Zm9ybWF0IHRoaXMgaXMKICAgICAgICAgICAgICAgICAgcHJvYmFibHkgaGFybWxl
c3MsIGNoYW5naW5nIHJlc3VsdHMgb2Ygb3ZlcmxvYWQKICAgICAgICAgICAgICAgICAgc2VsZWN0
aW9uIGlzIHNvbWV0aGluZyB0aGF0IHNob3VsZCBiZSBkb25lIHdpdGggY2FyZQogICAgICAgICAg
ICAgICAgICAoZXNwLiBpZiBkaWZmZXJlbnQgb3ZlcmxvYWRzIGhhdmUgZGlmZmVyZW50IHJldHVy
bgogICAgICAgICAgICAgICAgICB0eXBlcyksIGFzIGl0IGNvdWxkIGxlYWQgdG8gc291cmNlIGNv
bXBhdGliaWxpdHkKICAgICAgICAgICAgICAgICAgaXNzdWVzLjwvcD4KICAgICAgICAgICAgICA8
L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Jsb2NrcXVvdGU+CiAgICAgICAg
ICA8ZGl2Pkkgd291bGQgc3RpbGwgbGlrZSB0byBhZHZvY2F0ZSBmb3IgU3RyaW5nICZsdDs6CiAg
ICAgICAgICAgIFN0cmluZ1RlbXBsYXRlIHNvbHV0aW9uLiBJIHRoaW5rIHRoYXQgdGhlIG92ZXJs
b2FkaW5nIGlzIG5vdAogICAgICAgICAgICBhIGJpZyBwcm9ibGVtLiBTaW1wbHkgbWFraW5nIFN0
cmluZyBpbXBsZW1lbnRzCiAgICAgICAgICAgIFN0cmluZ1RlbXBsYXRlIHdpbGwgbm90IGJyZWFr
IGFueSBvZiBleGlzdGluZyBjb2RlIGJlY2F1c2UKICAgICAgICAgICAgdGhlcmUgYXJlIG5vIEFQ
SXMgeWV0IHRoYXQgYWNjZXB0IHRoZSBTdHJpbmdUZW1wbGF0ZQogICAgICAgICAgICBpbnN0YW5j
ZS4gVGhlIHByb2JsZW0gbWF5IGFwcGVhciBvbmx5IHdoZW4gYW4gQVBJIGF1dGhvcgogICAgICAg
ICAgICBhY3R1YWxseSBhZGRzIHN1Y2ggYW4gb3ZlcmxvYWQgYW5kIGRvZXMgdGhpcyBpbiBhbgog
ICAgICAgICAgICBpbmNvbXBhdGlibGUgd2F5IHdpdGggYW4gZXhpc3RpbmcgU3RyaW5nIG92ZXJs
b2FkLiBUaGlzCiAgICAgICAgICAgIHdvdWxkIGJlIGFuIGV4dHJlbWVseSBiYWQgZGVzaWduIGNo
b2ljZSwgYW5kIHRoZSBibGFtZSBnb2VzCiAgICAgICAgICAgIHRvIHRoZSBBUEkgYXV0aG9yLiBZ
b3UndmUgY29ycmVjdGx5IG1lbnRpb25lZCB0aGF0IGZvcgogICAgICAgICAgICBTdHJpbmc6OmZv
cm1hdCB0aGlzIGlzIGhhcm1sZXNzIGJlY2F1c2UgdGhlIEFQSSBpcwogICAgICAgICAgICB3ZWxs
LWRlc2lnbmVkLiBXZSBtYXkgc3VnZ2VzdCBpbiBTdHJpbmdUZW1wbGF0ZQogICAgICAgICAgICBk
b2N1bWVudGF0aW9uIHRoYXQgdGhlIEFQSSBkZXNpZ25lcnMgc2hvdWxkIHByb3ZpZGUgdGhlIHNh
bWUKICAgICAgICAgICAgYmVoYXZpb3IgZm9yIGZvbyhTdHJpbmcpIGFuZCBmb28oU3RyaW5nVGVt
cGxhdGUpIHdoZW4gdGhleQogICAgICAgICAgICBhZGQgYW4gb3ZlcmxvYWQuPC9kaXY+CiAgICAg
ICAgICA8ZGl2Pjxicj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdj5JIG11c3Qgc2F5
IHRoYXQgd2UgYWxyZWFkeSBoYWQgYW4gZXhwZXJpZW5jZSBvZgogICAgICAgICAgICBpbnRyb2R1
Y2luZyBuZXcgaW50ZXJmYWNlcyBpbiB0aGUgaGllcmFyY2h5IG9mIHdpZGVseS11c2VkCiAgICAg
ICAgICAgIGxpYnJhcnkgY2xhc3Nlcy4gQ2xvc2FibGUgZ290IEF1dG9DbG9zYWJsZSBwYXJlbnQs
CiAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYmVjYW1lIGNvbXBhcmFibGUsIGFuZCBzbyBvbi4g
U28gZmFyLCB0aGUKICAgICAgICAgICAgY29tcGF0aWJpbGl0eSBpc3N1ZXMgaW50cm9kdWNlZCB3
ZXJlIHRvbGVyYWJsZS4gV2VsbCwKICAgICAgICAgICAgcHJvYmFibHkgSSdtIG1pc3Npbmcgc29t
ZXRoaW5nIGJ1dCB3ZSBoYXZlIHByZXZpZXcgcm91bmRzCiAgICAgICAgICAgIGp1c3QgZm9yIHRo
aXMgcHVycG9zZTogdG8gZmluZCBvdXQgdGhlIGRpc2FkdmFudGFnZXMgb2YgdGhlCiAgICAgICAg
ICAgIGFwcHJvYWNoLjwvZGl2PgogICAgICAgICAgPGRpdj48YnI+CiAgICAgICAgICA8L2Rpdj4K
ICAgICAgICAgIDxkaXY+Jm5ic3A7PC9kaXY+CiAgICAgICAgICA8YmxvY2txdW90ZSBjbGFzcz0i
Z21haWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46MHB4IDBweCAwcHggMC44ZXg7Ym9yZGVyLWxlZnQ6
MXB4IHNvbGlkIHJnYigyMDQsMjA0LDIwNCk7cGFkZGluZy1sZWZ0OjFleCI+CiAgICAgICAgICAg
IDxkaXY+CiAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIDxwIHN0eWxlPSJtYXJn
aW46MHB4IDBweCAxLjJlbSI+T24gdG9wIG9mIHRoZXNlIGlzc3VlcywKICAgICAgICAgICAgICAg
ICAgbWFraW5nIGFsbCBzdHJpbmdzIGJlIHN0cmluZyB0ZW1wbGF0ZXMgaGFzIHRoZQogICAgICAg
ICAgICAgICAgICBkaXNhZHZhbnRhZ2Ugb2YgYWxzbyBjb25zaWRlcmluZyDigJxtZXNzeeKAnSBz
dHJpbmdzCiAgICAgICAgICAgICAgICAgIG9idGFpbmVkIHZpYSBjb25jYXRlbmF0aW9uIG9mIG5v
bi1jb25zdGFudCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgc3RyaW5nIHRlbXBsYXRlcyB0b28s
IHdoaWNoIHNlZW1zIGJhZC48L3A+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwv
ZGl2PgogICAgICAgICAgPC9ibG9ja3F1b3RlPgogICAgICAgICAgPGRpdj5JIHRoaW5rIHRoYXQg
bW9zdCBvZiB0aGUgQVBJcyB3aWxsIHN0aWxsIHByb3ZpZGUgU3RyaW5nCiAgICAgICAgICAgIG92
ZXJsb2FkLiBFLmcuLCBmb3IgcHJlcGFyaW5nIGFuIFNRTCBzdGF0ZW1lbnQsIGl0J3MgYQogICAg
ICAgICAgICBwZXJmZWN0bHkgcmVhc29uYWJsZSBzY2VuYXJpbyZuYnNwO3RvIGhhdmUgYSBjb25z
dGFudCBzdHJpbmcgYXMKICAgICAgICAgICAgdGhlIGlucHV0LiBTbyBwcmVwYXJlU3RhdGVtZW50
KFN0cmluZykgd2lsbCBzdGF5IGFsb25nIHdpdGgKICAgICAgICAgICAgcHJlcGFyZVN0YXRlbWVu
dChTdHJpbmdUZW1wbGF0ZSkuIEFuZCBwZW9wbGUgd2lsbCBzdGlsbCBiZQogICAgICAgICAgICBh
YmxlIHRvIHVzZSBjb25jYXRlbmF0aW9uLiBJIGRvbid0IHRoaW5rIHRoYXQgdGhlIGFic2VuY2Ug
b2YKICAgICAgICAgICAgU3RyaW5nICZsdDs6IFN0cmluZ1RlbXBsYXRlIHJlbGF0aW9uIHdpbGwg
cHJvdGVjdCBhbnlib2R5CiAgICAgICAgICAgIGZyb20gdXNpbmcgdGhlIGNvbmNhdGVuYXRpb24u
IE9uIHRoZSBvdGhlciBoYW5kLCBpZiBTdHJpbmcKICAgICAgICAgICAgYWN0dWFsbHkgaW1wbGVt
ZW50cyBTdHJpbmdUZW1wbGF0ZSwgaXQgd2lsbCBiZSBhIHZlcnkgc2ltcGxlCiAgICAgICAgICAg
IHN0YXRpYyBhbmFseXNpcyBydWxlIHRvIHdhcm4gaWYgdGhlIGNvbmNhdGVuYXRpb24gb2NjdXJz
IGluCiAgICAgICAgICAgIHRoaXMgY29udGV4dC4gSWYgdGhlIGV4cGVjdGVkIHR5cGUgZm9yIGNv
bmNhdGVuYXRpb24gaXMKICAgICAgICAgICAgU3RyaW5nVGVtcGxhdGUsIHRoZW4gc29tZXRoaW5n
IGlzIGRlZmluaXRlbHkgd3JvbmcuIFdpdGhvdXQKICAgICAgICAgICAgJ1N0cmluZyBpbXBsZW1l
bnRzIFN0cmluZ1RlbXBsYXRlJywgb25lIHdpbGwgbm90IGJlIGFibGUgdG8KICAgICAgICAgICAg
d3JpdGUgYSBjb25jYXRlbmF0aW9uIGRpcmVjdGx5IGluIFN0cmluZ1RlbXBsYXRlIGNvbnRleHQu
CiAgICAgICAgICAgIEluc3RlYWQsIFN0cmluZy1hY2NlcHRpbmcgb3ZlcmxvYWQgd2lsbCBiZSB1
c2VkLCBhbmQgdGhlCiAgICAgICAgICAgIGV4cGVjdGVkIHR5cGUgd2lsbCBiZSBTdHJpbmcsIHNv
IHN0YXRpYyBhbmFseXplciB3aWxsIGhhdmUKICAgICAgICAgICAgdG8gZ3Vlc3Mgd2hldGhlciBp
dCdzIGRhbmdlcm91cyB0byB1c2UgdGhlIGNvbmNhdGVuYXRpb24KICAgICAgICAgICAgaGVyZS4g
SW4gc2hvcnQsIEkgdGhpbmsgdGhhdCBpdCdzIGFjdHVhbGx5IGFuIGFkdmFudGFnZTogd2UKICAg
ICAgICAgICAgaGF2ZSBhbiBhZGRpdGlvbmFsIGhpbnQgaGVyZSB0aGF0IGNvbmNhdGVuYXRpb24g
aXMKICAgICAgICAgICAgdW5kZXNpcmVkLiBFdmVuIGNvbXBpbGF0aW9uIHdhcm5pbmcgY291bGQg
YmUgcG9zc2libGUgdG8KICAgICAgICAgICAgaW1wbGVtZW50LjwvZGl2PgogICAgICAgICAgPGRp
dj48YnI+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXY+U28sIEkgZG9uJ3Qgc2VlIHRo
ZXNlIHBvaW50cyBhcyByZWFsIGRpc2FkdmFudGFnZXMuIEkKICAgICAgICAgICAgZGVmaW5pdGVs
eSBsaWtlIHRoaXMgYXBwcm9hY2ggbXVjaCBtb3JlIHRoYW4gYWRkaW5nIGFueSBraW5kCiAgICAg
ICAgICAgIG9mIGltcGxpY2l0IGNvbnZlcnNpb24gb3IgYW5vdGhlciBsaXRlcmFsIHN5bnRheCwg
d2hpY2gKICAgICAgICAgICAgd291bGQgY29tcGxpY2F0ZSB0aGUgc3BlY2lmaWNhdGlvbiBtdWNo
IG1vcmUuPGJyPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2Pjxicj4KICAgICAgICAg
IDwvZGl2PgogICAgICAgICAgPGRpdj5XaXRoIGJlc3QgcmVnYXJkcyw8L2Rpdj4KICAgICAgICAg
IDxkaXY+VGFnaXIgVmFsZWV2LjwvZGl2PgogICAgICAgICAgPGJsb2NrcXVvdGUgY2xhc3M9Imdt
YWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjBweCAwcHggMHB4IDAuOGV4O2JvcmRlci1sZWZ0OjFw
eCBzb2xpZCByZ2IoMjA0LDIwNCwyMDQpO3BhZGRpbmctbGVmdDoxZXgiPgogICAgICAgICAgICA8
ZGl2PgogICAgICAgICAgICAgIDxkaXY+IDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAg
ICAgIDwvYmxvY2txdW90ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Jsb2Nr
cXVvdGU+CiAgICA8YnI+CiAgCgoKPC9ibG9ja3F1b3RlPg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;"></div>
</div>
</body>
</html>