<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;">On 02/02/2023 00:13,
Alex Buckley wrote:</p>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div class="markdown-here-exclude">
<p></p>
<blockquote type="cite" cite="mid:df3891cf-9d5b-f105-d133-c78d63b7784a@oracle.com">8.1.3
has a nice note about intent:
<br>
<br>
"The purpose of a static context is to demarcate code that
must not refer explicitly or implicitly to the current
instance of the class whose declaration lexically encloses the
static context. Consequently, code that occurs in a static
context is restricted in the following ways: ..."
<br>
<br>
Beyond that, I'm not sure what to say, because all of this has
been in place since Java 1.1.
<br>
</blockquote>
<p></p>
</div>
<p style="margin: 0px 0px 1.2em !important;"></p>
<p style="margin: 0px 0px 1.2em !important;">I understand that
this has been there since the beginning.</p>
<p style="margin: 0px 0px 1.2em !important;">And, in a world where
(a) there’s no generics and (b) you can’t have statements before
super() - that para specifies the right behavior.</p>
<p style="margin: 0px 0px 1.2em !important;">When you throw in
type parameters, it seems to me that the “this is a static
context” no longer works - as it cannot explain programs that
are obviously valid (such as the one I have shown).</p>
<p style="margin: 0px 0px 1.2em !important;">And, if we add
statements before <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;">super</code>
it gets even worse, because now we can have types that are
non-static, but that it’s not clear as to why such types
couldn’t be referred to:</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 class="hljs language-java" 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;display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); background: rgb(248, 248, 248) none repeat scroll 0% 0%; -moz-text-size-adjust: none;"><span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Foo</span> </span>{
Foo() {
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Local</span> </span>{
<span class="hljs-function">String <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;">aString</span><span class="hljs-params">()</span> </span>{ ... }
}
<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">super</span>(<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">new</span> Local().aString()); <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// is this legal?</span>
}
}
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">Now that we’re
planning to do more work in this area [1], it would be IMHO a
good time to see if the use of “static context” in 8.8.7.1 is
really what we want.</p>
<p style="margin: 0px 0px 1.2em !important;">Maurizio</p>
<p style="margin: 0px 0px 1.2em !important;">[1] - <a href="https://bugs.openjdk.org/browse/JDK-8300786" class="moz-txt-link-freetext">https://bugs.openjdk.org/browse/JDK-8300786</a></p>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div class="markdown-here-exclude">
<p></p>
<blockquote type="cite" cite="mid:df3891cf-9d5b-f105-d133-c78d63b7784a@oracle.com">
<br>
Alex
<br>
<br>
On 2/1/2023 3:43 PM, Maurizio Cimadamore wrote:
<br>
<blockquote type="cite">While I agree that what javac does is
against the JLS, is this a javac or a spec bug?
<br>
<br>
I mean, consider this hierarchy:
<br>
<br>
|class Sup<X> { Sup(X x) { ... } } class Sub<Y>
extends Sup<Y> { Sub(Y y) { super(y); } } |
<br>
<br>
What the rules are saying is that “y” in the Sub super call
should be evaluated in a static context. But that doesn’t
make any sense - because Y is not even a valid type in such
a static context.
<br>
<br>
And yet - this is a valid program. So, if typechecking “y”
is correct, then, surely, typechecking “(Y)y” should also be
correct? E.g. it seems to me that the use of “static
context” here is an “approximation” for the behavior we
really want (e.g. no access to instance fields, whether
directly or indirectly).
<br>
<br>
Maurizio
<br>
<br>
On 01/02/2023 22:39, Alex Buckley wrote:
<br>
<br>
<blockquote type="cite">Your reading of the JLS is correct.
The cast expression `(T)obj` occurs in a static context,
so the use of T should be disallowed, and javac should
reject the program.
<br>
<br>
These rules in 8.8.7.1 and 8.1.3 are longstanding, and
have not changed recently, so I'm surprised that javac
lets the program through. That said, JLS16 saw a reworking
of 8.1.3 (driven by
<a class="moz-txt-link-freetext" href="https://openjdk.org/jeps/395#Static-members-of-inner-classes">https://openjdk.org/jeps/395#Static-members-of-inner-classes</a>)
and perhaps javac got a bit turned around over static
contexts.
<br>
<br>
As an additional test case, make the constructor generic
-- `public <U extends T> TypeParam ...` -- and cast
obj to U rather than T -- still illegal.
<br>
<br>
Alex
<br>
<br>
On 2/1/2023 12:45 PM, Archie Cobbs wrote:
<br>
<blockquote type="cite">This program compiles without
error:
<br>
<br>
import java.util.concurrent.atomic.*;
<br>
public class TypeParamStaticContext<T> extends
AtomicReference<T> {
<br>
public TypeParamStaticContext(Object obj) {
<br>
super((T)obj);
<br>
}
<br>
}
<br>
<br>
Yet according to my reading of the JLS, the appearance
of T inside the super() call should be disallowed:
<br>
<br>
§8.8.7.1 <a class="moz-txt-link-rfc2396E" href="http://8.8.7.1"><http://8.8.7.1></a>:
<br>
<br>
An explicit constructor invocation statement introduces
a static context (§8.1.3
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-8.html#jls-8.1.3"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-8.html#jls-8.1.3></a>),
which limits the use of constructs that refer to the
current object. Notably, the keywords |this| and |super|
are prohibited in a static context (§15.8.3
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-15.html#jls-15.8.3"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-15.html#jls-15.8.3></a>,
§15.11.2
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-15.html#jls-15.11.2"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-15.html#jls-15.11.2></a>),
as are unqualified references to instance variables,
instance methods, and type parameters of lexically
enclosing declarations (§6.5.5.1
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-6.html#jls-6.5.5.1"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-6.html#jls-6.5.5.1></a>,
§6.5.6.1
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-6.html#jls-6.5.6.1"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-6.html#jls-6.5.6.1></a>,
§15.12.3
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-15.html#jls-15.12.3"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-15.html#jls-15.12.3></a>).<br>
<br>
§6.5.5.1 <a class="moz-txt-link-rfc2396E" href="http://6.5.5.1"><http://6.5.5.1></a>:
<br>
<br>
If a type name consists of a single /Identifier/, then
the identifier must occur in the scope of exactly one
declaration of a class, interface, or type parameter
with this name (§6.3
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-6.html#jls-6.3"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-6.html#jls-6.3></a>),
or a compile-time error occurs.
<br>
<br>
If the declaration denotes a type parameter of a generic
class or interface C (§8.1.2
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-8.html#jls-8.1.2"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-8.html#jls-8.1.2></a>,
§9.1.2
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-9.html#jls-9.1.2"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-9.html#jls-9.1.2></a>),
then both of the following must be true, or a
compile-time error occurs:
<br>
<br>
*
<br>
<br>
The type name does not occur in a static context
(§8.1.3
<br>
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-8.html#jls-8.1.3"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-8.html#jls-8.1.3></a>)
<br>
<br>
*
<br>
<br>
If the type name appears in a nested class or
interface declaration
<br>
of C, then the immediately enclosing class or
interface declaration
<br>
of the type name is an inner class of C.
<br>
<br>
<br>
What am I missing?
<br>
<br>
Thanks,
<br>
-Archie
<br>
<br>
-- <br>
Archie L. Cobbs
<br>
</blockquote>
</blockquote>
<br>
<br>
</blockquote>
</blockquote>
<p></p>
</div>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div title="MDH:PHA+PGJyPjwvcD48ZGl2IGNsYXNzPSJtb3otY2l0ZS1wcmVmaXgiPk9uIDAyLzAyLzIwMjMgMDA6MTMsIEFsZXggQnVja2xleSB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIg
Y2l0ZT0ibWlkOmRmMzg5MWNmLTlkNWItZjEwNS1kMTMzLWM3OGQ2M2I3Nzg0YUBvcmFjbGUuY29t
Ij44LjEuMyBoYXMgYSBuaWNlIG5vdGUgYWJvdXQgaW50ZW50Ogo8YnI+Cjxicj4mbmJzcDsgIlRo
ZSBwdXJwb3NlIG9mIGEgc3RhdGljIGNvbnRleHQgaXMgdG8gZGVtYXJjYXRlIGNvZGUgdGhhdCBt
dXN0IG5vdCAKcmVmZXIgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5IHRvIHRoZSBjdXJyZW50IGlu
c3RhbmNlIG9mIHRoZSBjbGFzcyAKd2hvc2UgZGVjbGFyYXRpb24gbGV4aWNhbGx5IGVuY2xvc2Vz
IHRoZSBzdGF0aWMgY29udGV4dC4gQ29uc2VxdWVudGx5LCAKY29kZSB0aGF0IG9jY3VycyBpbiBh
IHN0YXRpYyBjb250ZXh0IGlzIHJlc3RyaWN0ZWQgaW4gdGhlIGZvbGxvd2luZyAKd2F5czogLi4u
Igo8YnI+Cjxicj5CZXlvbmQgdGhhdCwgSSdtIG5vdCBzdXJlIHdoYXQgdG8gc2F5LCBiZWNhdXNl
IGFsbCBvZiB0aGlzIGhhcyBiZWVuIGluIApwbGFjZSBzaW5jZSBKYXZhIDEuMS4KPGJyPjwvYmxv
Y2txdW90ZT48cD5JIHVuZGVyc3RhbmQgdGhhdCB0aGlzIGhhcyBiZWVuIHRoZXJlIHNpbmNlIHRo
ZSBiZWdpbm5pbmcuPC9wPjxwPkFuZCwgaW4gYSB3b3JsZCB3aGVyZSAoYSkgdGhlcmUncyBubyBn
ZW5lcmljcyBhbmQgKGIpIHlvdSBjYW4ndCBoYXZlIHN0YXRlbWVudHMgYmVmb3JlIHN1cGVyKCkg
LSB0aGF0IHBhcmEgc3BlY2lmaWVzIHRoZSByaWdodCBiZWhhdmlvci48L3A+PHA+V2hlbiB5b3Ug
dGhyb3cgaW4gdHlwZSBwYXJhbWV0ZXJzLCBpdCBzZWVtcyB0byBtZSB0aGF0IHRoZSAidGhpcyBp
cyBhIHN0YXRpYyBjb250ZXh0IiBubyBsb25nZXIgd29ya3MgLSBhcyBpdCBjYW5ub3QgZXhwbGFp
biBwcm9ncmFtcyB0aGF0IGFyZSBvYnZpb3VzbHkgdmFsaWQgKHN1Y2ggYXMgdGhlIG9uZSBJIGhh
dmUgc2hvd24pLjwvcD48cD5BbmQsIGlmIHdlIGFkZCBzdGF0ZW1lbnRzIGJlZm9yZSBgc3VwZXJg
IGl0IGdldHMgZXZlbiB3b3JzZSwgYmVjYXVzZSBub3cgd2UgY2FuIGhhdmUgdHlwZXMgdGhhdCBh
cmUgbm9uLXN0YXRpYywgYnV0IHRoYXQgaXQncyBub3QgY2xlYXIgYXMgdG8gd2h5IHN1Y2ggdHlw
ZXMgY291bGRuJ3QgYmUgcmVmZXJyZWQgdG86PC9wPjxwPmBgYGphdmE8YnI+Y2xhc3MgRm9vIHs8
YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEZvbygpIHs8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNsYXNzIExvY2FsIHs8YnI+Jm5i
c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFN0cmluZyBhU3RyaW5nKCkgeyAuLi4gfTxi
cj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsg
fTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
cDsgc3VwZXIobmV3IExvY2FsKCkuYVN0cmluZygpKTsgLy8gaXMgdGhpcyBsZWdhbD88YnI+Jm5i
c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+fTxicj5gYGA8YnI+PC9wPjxwPk5vdyB0aGF0IHdl
J3JlIHBsYW5uaW5nIHRvIGRvIG1vcmUgd29yayBpbiB0aGlzIGFyZWEgWzFdLCBpdCB3b3VsZCBi
ZSBJTUhPIGEgZ29vZCB0aW1lIHRvIHNlZSBpZiB0aGUgdXNlIG9mICJzdGF0aWMgY29udGV4dCIg
aW4gOC44LjcuMSBpcyByZWFsbHkgd2hhdCB3ZSB3YW50LjwvcD48cD5NYXVyaXppbzxicj48YnI+
WzFdIC0gaHR0cHM6Ly9idWdzLm9wZW5qZGsub3JnL2Jyb3dzZS9KREstODMwMDc4Njxicj48L3A+
PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIgY2l0ZT0ibWlkOmRmMzg5MWNmLTlkNWItZjEwNS1kMTMz
LWM3OGQ2M2I3Nzg0YUBvcmFjbGUuY29tIj4KPGJyPkFsZXgKPGJyPgo8YnI+T24gMi8xLzIwMjMg
Mzo0MyBQTSwgTWF1cml6aW8gQ2ltYWRhbW9yZSB3cm90ZToKPGJyPjxibG9ja3F1b3RlIHR5cGU9
ImNpdGUiPldoaWxlIEkgYWdyZWUgdGhhdCB3aGF0IGphdmFjIGRvZXMgaXMgYWdhaW5zdCB0aGUg
SkxTLCBpcyB0aGlzIGEgamF2YWMgCm9yIGEgc3BlYyBidWc/Cjxicj4KPGJyPkkgbWVhbiwgY29u
c2lkZXIgdGhpcyBoaWVyYXJjaHk6Cjxicj4KPGJyPnxjbGFzcyBTdXAmbHQ7WCZndDsgeyBTdXAo
WCB4KSB7IC4uLiB9IH0gY2xhc3MgU3ViJmx0O1kmZ3Q7IGV4dGVuZHMgU3VwJmx0O1kmZ3Q7IHsg
U3ViKFkgCnkpIHsgc3VwZXIoeSk7IH0gfSB8Cjxicj4KPGJyPldoYXQgdGhlIHJ1bGVzIGFyZSBz
YXlpbmcgaXMgdGhhdCDigJx54oCdIGluIHRoZSBTdWIgc3VwZXIgY2FsbCBzaG91bGQgYmUgCmV2
YWx1YXRlZCBpbiBhIHN0YXRpYyBjb250ZXh0LiBCdXQgdGhhdCBkb2VzbuKAmXQgbWFrZSBhbnkg
c2Vuc2UgLSBiZWNhdXNlIApZIGlzIG5vdCBldmVuIGEgdmFsaWQgdHlwZSBpbiBzdWNoIGEgc3Rh
dGljIGNvbnRleHQuCjxicj4KPGJyPkFuZCB5ZXQgLSB0aGlzIGlzIGEgdmFsaWQgcHJvZ3JhbS4g
U28sIGlmIHR5cGVjaGVja2luZyDigJx54oCdIGlzIGNvcnJlY3QsIAp0aGVuLCBzdXJlbHksIHR5
cGVjaGVja2luZyDigJwoWSl54oCdIHNob3VsZCBhbHNvIGJlIGNvcnJlY3Q/IEUuZy4gaXQgc2Vl
bXMgCnRvIG1lIHRoYXQgdGhlIHVzZSBvZiDigJxzdGF0aWMgY29udGV4dOKAnSBoZXJlIGlzIGFu
IOKAnGFwcHJveGltYXRpb27igJ0gZm9yIAp0aGUgYmVoYXZpb3Igd2UgcmVhbGx5IHdhbnQgKGUu
Zy4gbm8gYWNjZXNzIHRvIGluc3RhbmNlIGZpZWxkcywgd2hldGhlciAKZGlyZWN0bHkgb3IgaW5k
aXJlY3RseSkuCjxicj4KPGJyPk1hdXJpemlvCjxicj4KPGJyPk9uIDAxLzAyLzIwMjMgMjI6Mzks
IEFsZXggQnVja2xleSB3cm90ZToKPGJyPgo8YnI+PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSI+WW91
ciByZWFkaW5nIG9mIHRoZSBKTFMgaXMgY29ycmVjdC4gVGhlIGNhc3QgZXhwcmVzc2lvbiBgKFQp
b2JqYCAKb2NjdXJzIGluIGEgc3RhdGljIGNvbnRleHQsIHNvIHRoZSB1c2Ugb2YgVCBzaG91bGQg
YmUgZGlzYWxsb3dlZCwgYW5kIApqYXZhYyBzaG91bGQgcmVqZWN0IHRoZSBwcm9ncmFtLgo8YnI+
Cjxicj5UaGVzZSBydWxlcyBpbiA4LjguNy4xIGFuZCA4LjEuMyBhcmUgbG9uZ3N0YW5kaW5nLCBh
bmQgaGF2ZSBub3QgCmNoYW5nZWQgcmVjZW50bHksIHNvIEknbSBzdXJwcmlzZWQgdGhhdCBqYXZh
YyBsZXRzIHRoZSBwcm9ncmFtIAp0aHJvdWdoLiBUaGF0IHNhaWQsIEpMUzE2IHNhdyBhIHJld29y
a2luZyBvZiA4LjEuMyAoZHJpdmVuIGJ5IApodHRwczovL29wZW5qZGsub3JnL2plcHMvMzk1I1N0
YXRpYy1tZW1iZXJzLW9mLWlubmVyLWNsYXNzZXMpIGFuZCAKcGVyaGFwcyBqYXZhYyBnb3QgYSBi
aXQgdHVybmVkIGFyb3VuZCBvdmVyIHN0YXRpYyBjb250ZXh0cy4KPGJyPgo8YnI+QXMgYW4gYWRk
aXRpb25hbCB0ZXN0IGNhc2UsIG1ha2UgdGhlIGNvbnN0cnVjdG9yIGdlbmVyaWMgLS0gYHB1Ymxp
YyAmbHQ7VSAKZXh0ZW5kcyBUJmd0OyBUeXBlUGFyYW0gLi4uYCAtLSBhbmQgY2FzdCBvYmogdG8g
VSByYXRoZXIgdGhhbiBUIC0tIHN0aWxsIAppbGxlZ2FsLgo8YnI+Cjxicj5BbGV4Cjxicj4KPGJy
Pk9uIDIvMS8yMDIzIDEyOjQ1IFBNLCBBcmNoaWUgQ29iYnMgd3JvdGU6Cjxicj48YmxvY2txdW90
ZSB0eXBlPSJjaXRlIj5UaGlzIHByb2dyYW0gY29tcGlsZXMgd2l0aG91dCBlcnJvcjoKPGJyPgo8
YnI+aW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy4qOwo8YnI+cHVibGljIGNsYXNz
IFR5cGVQYXJhbVN0YXRpY0NvbnRleHQmbHQ7VCZndDsgZXh0ZW5kcyBBdG9taWNSZWZlcmVuY2Um
bHQ7VCZndDsgewo8YnI+Jm5ic3A7Jm5ic3A7ICZuYnNwOyBwdWJsaWMgVHlwZVBhcmFtU3RhdGlj
Q29udGV4dChPYmplY3Qgb2JqKSB7Cjxicj4mbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz
cDsgc3VwZXIoKFQpb2JqKTsKPGJyPiZuYnNwOyZuYnNwOyAmbmJzcDsgfQo8YnI+fQo8YnI+Cjxi
cj5ZZXQgYWNjb3JkaW5nIHRvIG15IHJlYWRpbmcgb2YgdGhlIEpMUywgdGhlIGFwcGVhcmFuY2Ug
b2YgVCBpbnNpZGUgCnRoZSBzdXBlcigpIGNhbGwgc2hvdWxkIGJlIGRpc2FsbG93ZWQ6Cjxicj4K
PGJyPsKnOC44LjcuMSAmbHQ7aHR0cDovLzguOC43LjEmZ3Q7Ogo8YnI+Cjxicj5BbiBleHBsaWNp
dCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIHN0YXRlbWVudCBpbnRyb2R1Y2VzIGEgc3RhdGljIApj
b250ZXh0ICjCpzguMS4zIAombHQ7aHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlL3NwZWNz
L2pscy9zZTE5L2h0bWwvamxzLTguaHRtbCNqbHMtOC4xLjMmZ3Q7KSwgd2hpY2ggbGltaXRzIHRo
ZSB1c2Ugb2YgY29uc3RydWN0cyB0aGF0IHJlZmVyIHRvIHRoZSBjdXJyZW50IG9iamVjdC4gTm90
YWJseSwgdGhlIGtleXdvcmRzIHx0aGlzfCBhbmQgfHN1cGVyfCBhcmUgcHJvaGliaXRlZCBpbiBh
IHN0YXRpYyBjb250ZXh0ICjCpzE1LjguMyAmbHQ7aHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2
YXNlL3NwZWNzL2pscy9zZTE5L2h0bWwvamxzLTE1Lmh0bWwjamxzLTE1LjguMyZndDssIMKnMTUu
MTEuMiAmbHQ7aHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlL3NwZWNzL2pscy9zZTE5L2h0
bWwvamxzLTE1Lmh0bWwjamxzLTE1LjExLjImZ3Q7KSwgYXMgYXJlIHVucXVhbGlmaWVkIHJlZmVy
ZW5jZXMgdG8gaW5zdGFuY2UgdmFyaWFibGVzLCBpbnN0YW5jZSBtZXRob2RzLCBhbmQgdHlwZSBw
YXJhbWV0ZXJzIG9mIGxleGljYWxseSBlbmNsb3NpbmcgZGVjbGFyYXRpb25zICjCpzYuNS41LjEg
Jmx0O2h0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2UxOS9odG1sL2ps
cy02Lmh0bWwjamxzLTYuNS41LjEmZ3Q7LCDCpzYuNS42LjEgJmx0O2h0dHBzOi8vZG9jcy5vcmFj
bGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2UxOS9odG1sL2pscy02Lmh0bWwjamxzLTYuNS42LjEm
Z3Q7LCDCpzE1LjEyLjMgJmx0O2h0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9q
bHMvc2UxOS9odG1sL2pscy0xNS5odG1sI2pscy0xNS4xMi4zJmd0OykuCjxicj4KPGJyPsKnNi41
LjUuMSAmbHQ7aHR0cDovLzYuNS41LjEmZ3Q7Ogo8YnI+Cjxicj5JZiBhIHR5cGUgbmFtZSBjb25z
aXN0cyBvZiBhIHNpbmdsZSAvSWRlbnRpZmllci8sIHRoZW4gdGhlIGlkZW50aWZpZXIgCm11c3Qg
b2NjdXIgaW4gdGhlIHNjb3BlIG9mIGV4YWN0bHkgb25lIGRlY2xhcmF0aW9uIG9mIGEgY2xhc3Ms
IAppbnRlcmZhY2UsIG9yIHR5cGUgcGFyYW1ldGVyIHdpdGggdGhpcyBuYW1lICjCpzYuMyAKJmx0
O2h0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2UxOS9odG1sL2pscy02
Lmh0bWwjamxzLTYuMyZndDspLCBvciBhIGNvbXBpbGUtdGltZSBlcnJvciBvY2N1cnMuCjxicj4K
PGJyPklmIHRoZSBkZWNsYXJhdGlvbiBkZW5vdGVzIGEgdHlwZSBwYXJhbWV0ZXIgb2YgYSBnZW5l
cmljIGNsYXNzIG9yIAppbnRlcmZhY2UgQyAowqc4LjEuMiAKJmx0O2h0dHBzOi8vZG9jcy5vcmFj
bGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2UxOS9odG1sL2pscy04Lmh0bWwjamxzLTguMS4yJmd0
Oywgwqc5LjEuMiAmbHQ7aHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlL3NwZWNzL2pscy9z
ZTE5L2h0bWwvamxzLTkuaHRtbCNqbHMtOS4xLjImZ3Q7KSwgdGhlbiBib3RoIG9mIHRoZSBmb2xs
b3dpbmcgbXVzdCBiZSB0cnVlLCBvciBhIGNvbXBpbGUtdGltZSBlcnJvciBvY2N1cnM6Cjxicj4K
PGJyPiZuYnNwOyAqCjxicj4KPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBUaGUgdHlwZSBuYW1lIGRv
ZXMgbm90IG9jY3VyIGluIGEgc3RhdGljIGNvbnRleHQgKMKnOC4xLjMKPGJyPiZsdDtodHRwczov
L2RvY3Mub3JhY2xlLmNvbS9qYXZhc2Uvc3BlY3MvamxzL3NlMTkvaHRtbC9qbHMtOC5odG1sI2ps
cy04LjEuMyZndDspCjxicj4KPGJyPiZuYnNwOyAqCjxicj4KPGJyPiZuYnNwOyZuYnNwOyZuYnNw
OyBJZiB0aGUgdHlwZSBuYW1lIGFwcGVhcnMgaW4gYSBuZXN0ZWQgY2xhc3Mgb3IgaW50ZXJmYWNl
IGRlY2xhcmF0aW9uCjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb2YgQywgdGhlbiB0aGUgaW1tZWRp
YXRlbHkgZW5jbG9zaW5nIGNsYXNzIG9yIGludGVyZmFjZSBkZWNsYXJhdGlvbgo8YnI+Jm5ic3A7
Jm5ic3A7Jm5ic3A7IG9mIHRoZSB0eXBlIG5hbWUgaXMgYW4gaW5uZXIgY2xhc3Mgb2YgQy4KPGJy
Pgo8YnI+Cjxicj5XaGF0IGFtIEkgbWlzc2luZz8KPGJyPgo8YnI+VGhhbmtzLAo8YnI+LUFyY2hp
ZQo8YnI+Cjxicj4tLSZuYnNwOzxicj5BcmNoaWUgTC4gQ29iYnMKPGJyPjwvYmxvY2txdW90ZT48
L2Jsb2NrcXVvdGU+Cjxicj7igIsKPGJyPjwvYmxvY2txdW90ZT48L2Jsb2NrcXVvdGU+" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;"></div>
</div>
</body>
</html>