<!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 Archie,<br>
there were several interesting design discussions on the JEP [1]
you have created for this.</p>
<p style="margin: 0px 0px 1.2em !important;">An intersting angle
we discussed was whether we feel imperative for loops are
special enough to deserve special treatment, or whether this is
the start of a loosening process that will eventually lead to
allow capture for every local variable <em>value</em>.</p>
<p style="margin: 0px 0px 1.2em !important;">In order to better
characterize the nature of the problem we’re dealing with, it
would be great if we could gather some more evidence on how many
“dummy” local variables are introduced for the sole purpose of
being able to capture them in a lambda/inner class. More
precisely, a “dummy” local variable is a local variable that:</p>
<ul style="margin: 1.2em 0px;padding-left: 2em;">
<li style="margin: 0.5em 0px;">is initialized with the value of
some other local variable
<ul style="margin: 1.2em 0px;padding-left: 2em;margin: 0px; padding-left: 1em;">
<li style="margin: 0.5em 0px;">is only referenced inside a
capture context (either lambda or inner class)</li>
</ul>
</li>
</ul>
<p style="margin: 0px 0px 1.2em !important;">(corollary: all
“dummy” local variables are effectively-final).</p>
<p style="margin: 0px 0px 1.2em !important;">Example:</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); -moz-text-size-adjust: none;"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">int</span> x = ...
...
x = ... <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// reassignment</span>
...
<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">int</span> x2 = x; <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// x2 is effectively-final</span>
... () -> x2; <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// x2 is only used here!</span>
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">Could you come up
with a javac patch that detects such “dummy” variable
declarations and prints a note/warning in the compiler output?</p>
<p style="margin: 0px 0px 1.2em !important;">Then we can try to
run the modified javac to build the JDK and see how many
warnings are found there. Similarly, we can try the modified
compiler against Maven artifacts (we have some infrastructure to
do that), or against other interesting codebases (perhaps Liam,
cc’ed, might help here?)</p>
<p style="margin: 0px 0px 1.2em !important;">Let me know what you
think.</p>
<p style="margin: 0px 0px 1.2em !important;">Cheers<br>
Maurizio</p>
<p style="margin: 0px 0px 1.2em !important;">[1] - <a href="https://git.openjdk.org/jdk/pull/21415" class="moz-txt-link-freetext">https://git.openjdk.org/jdk/pull/21415</a></p>
<p style="margin: 0px 0px 1.2em !important;">On 11/09/2024 00:23,
Archie Cobbs wrote:</p>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div class="markdown-here-exclude">
<p></p>
<blockquote type="cite" cite="mid:CANSoFxv9ix+8vJYiGEk89vuYg4VEeDBWLp3-CPoGRBeJzy4sfA@mail.gmail.com">
<div dir="ltr">
<div>I'm curious about this possible future language tweak
and have been looking at it more closely: <a href="https://bugs.openjdk.org/browse/JDK-8300691" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">https://bugs.openjdk.org/browse/JDK-8300691</a></div>
<div><br>
</div>
<div>I think this would be a nice practical change that fits
well within the Amber ambit. However, I'm stuck on one
question.<br>
</div>
<div><br>
</div>
<div>To summarize, there are two independent changes being
proposed:</div>
<div>
<ol>
<li>Prevent statements in for() loop steps from causing
for() loop variables to lose their "effectively final"
status</li>
<li>Allow final for() loop variables to be mutated in
the for() step (but not the for() body)</li>
</ol>
</div>
<div>
<div>Change #1 would allow code like this:</div>
<div><br>
</div>
<div style="margin-left:40px"><span style="font-family:monospace">for (int i = 0; i <
10; i++) {<br>
</span></div>
<div style="margin-left:40px"><span style="font-family:monospace"> Runnable r = ()
-> System.out.println(i); // hooray, "i" is
effectively final<br>
</span></div>
<div style="margin-left:40px"><span style="font-family:monospace">}</span></div>
</div>
<div>
<div><br>
</div>
<div>
<div>Change #2 would allow code like this:</div>
<div><br>
</div>
<div style="margin-left:40px"><span style="font-family:monospace">for (final int i = 0;
i < 10; i++) {<br>
</span></div>
<div style="margin-left:40px"><span style="font-family:monospace">
System.out.println(i); // we can rest
assured "i" can't change in here<br>
</span></div>
<div style="margin-left:40px"><span style="font-family:monospace">}<br>
</span></div>
<br>
</div>
<div>Change #1 is straightforward but Change #2 raises an
issue. A final initialized variable is not only
immutable but also can be a constant expression, and
this affects reachability analysis.<br>
</div>
<div><br>
</div>
<div>For example, these two examples do not compile:</div>
<div><br>
</div>
<div style="margin-left:40px"><span style="font-family:monospace">final int x = 0;</span></div>
<div style="margin-left:40px"><span style="font-family:monospace">while (x != 0)</span></div>
<div style="margin-left:40px"><span style="font-family:monospace">
System.out.println(x); // error: unreachable
statement<br>
</span></div>
<div style="margin-left:40px"><span style="font-family:monospace">System.out.println("done");</span></div>
<div><br>
</div>
<div>
<div style="margin-left:40px"><span style="font-family:monospace">final </span><span style="font-family:monospace">int x = 0;</span></div>
<div style="margin-left:40px"><span style="font-family:monospace">while (x == 0)</span></div>
<div style="margin-left:40px"><span style="font-family:monospace">
System.out.println(x);</span></div>
<div style="margin-left:40px"><span style="font-family:monospace">System.out.println("done");
// error: unreachable statement</span></div>
<div><br>
</div>
<div>We shouldn't expect the equivalent for() statements
to compile either, and in fact today they don't:<br>
</div>
</div>
<div style="margin-left:40px"><br>
</div>
<div style="margin-left:40px"><span style="font-family:monospace">for (final int x = 0; x
!= 0; )<br>
System.out.println(x); </span><span style="font-family:monospace"> // error:
unreachable statement</span><br>
<span style="font-family:monospace">System.out.println("done");</span></div>
<div><br>
</div>
<div style="margin-left:40px"><span style="font-family:monospace">for (final int x = 0; x
== 0; )<br>
System.out.println(x);<br>
System.out.println("done");</span><span style="font-family:monospace"> // error:
unreachable statement</span></div>
<div><br>
</div>
<div>
<div>
<div>But now suppose we add a step, which Change #2
would newly allow:<br>
</div>
</div>
<div style="margin-left:40px"><br>
</div>
<div style="margin-left:40px"><span style="font-family:monospace">for (final int x = 0;
x != 0; x++)<br>
System.out.println(x); </span><span style="font-family:monospace"> // error:
unreachable statement... ?</span><br>
<span style="font-family:monospace">System.out.println("done");</span></div>
<div><br>
</div>
<div style="margin-left:40px"><span style="font-family:monospace">for (final int x = 0;
x == 0; x++)<br>
System.out.println(x);<br>
System.out.println("done");</span><span style="font-family:monospace"> // NOT an
unreachable statement</span></div>
<div><br>
</div>
<div>In the first example, the inner statement is still
unreachable, so it's OK for the compiler to still
report that error, but in the second example, the
final statement is now obviously reachable, so the
compiler must do something different. Moreover it
would be doing something different based on inspection
of the step for mutations to "x", which seems like
"spooky action at a distance" and could be
spec-challenging.<br>
</div>
</div>
<div>
<div><br>
</div>
<div>Alternatively, the compiler could change its
behavior to never consider final loop variables as
constant expressions, but this could break existing
code.<br>
</div>
<br>
<div>Of course, if Change #2 had too many issues, Change
#1 would still be useful on its own.<br>
</div>
<div><br>
</div>
<div>Thoughts?<br>
</div>
<br>
</div>
<div>Thanks,<br>
</div>
<div>-Archie<br>
</div>
</div>
<div><br>
<span class="gmail_signature_prefix">-- </span><br>
<div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">Archie L. Cobbs<br>
</div>
</div>
</div>
</blockquote>
<p></p>
</div>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div title="MDH:PHA+SGkgQXJjaGllLDxicj50aGVyZSB3ZXJlIHNldmVyYWwgaW50ZXJlc3RpbmcgZGVzaWduIGRp
c2N1c3Npb25zIG9uIHRoZSBKRVAgWzFdIHlvdSBoYXZlIGNyZWF0ZWQgZm9yIHRoaXMuPC9wPjxw
PkFuIGludGVyc3RpbmcgYW5nbGUgd2UgZGlzY3Vzc2VkIHdhcyB3aGV0aGVyIHdlIGZlZWwgaW1w
ZXJhdGl2ZSBmb3IgbG9vcHMgYXJlIHNwZWNpYWwgZW5vdWdoIHRvIGRlc2VydmUgc3BlY2lhbCB0
cmVhdG1lbnQsIG9yIHdoZXRoZXIgdGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBsb29zZW5pbmcgcHJv
Y2VzcyB0aGF0IHdpbGwgZXZlbnR1YWxseSBsZWFkIHRvIGFsbG93IGNhcHR1cmUgZm9yIGV2ZXJ5
IGxvY2FsIHZhcmlhYmxlIF92YWx1ZV8uPC9wPjxwPkluIG9yZGVyIHRvIGJldHRlciBjaGFyYWN0
ZXJpemUgdGhlIG5hdHVyZSBvZiB0aGUgcHJvYmxlbSB3ZSdyZSBkZWFsaW5nIHdpdGgsIGl0IHdv
dWxkIGJlIGdyZWF0IGlmIHdlIGNvdWxkIGdhdGhlciBzb21lIG1vcmUgZXZpZGVuY2Ugb24gaG93
IG1hbnkgImR1bW15IiBsb2NhbCB2YXJpYWJsZXMgYXJlIGludHJvZHVjZWQgZm9yIHRoZSBzb2xl
IHB1cnBvc2Ugb2YgYmVpbmcgYWJsZSB0byBjYXB0dXJlIHRoZW0gaW4gYSBsYW1iZGEvaW5uZXIg
Y2xhc3MuIE1vcmUgcHJlY2lzZWx5LCBhICJkdW1teSIgbG9jYWwgdmFyaWFibGUgaXMgYSBsb2Nh
bCB2YXJpYWJsZSB0aGF0OjwvcD4KPHA+KiBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSB2YWx1ZSBv
ZiBzb21lIG90aGVyIGxvY2FsIHZhcmlhYmxlPGJyPgoqIGlzIG9ubHkgcmVmZXJlbmNlZCBpbnNp
ZGUgYSBjYXB0dXJlIGNvbnRleHQgKGVpdGhlciBsYW1iZGEgb3IgaW5uZXIgY2xhc3MpPGJyPjxi
cj4oY29yb2xsYXJ5OiBhbGwgImR1bW15IiBsb2NhbCB2YXJpYWJsZXMgYXJlIGVmZmVjdGl2ZWx5
LWZpbmFsKS48L3A+PHA+PC9wPjxwPkV4YW1wbGU6PC9wPjxwPmBgYGphdmE8YnI+aW50IHggPSAu
Li48YnI+Li4uPGJyPnggPSAuLi4gLy8gcmVhc3NpZ25tZW50PGJyPi4uLjxicj5pbnQgeDIgPSB4
OyAvLyB4MiBpcyBlZmZlY3RpdmVseS1maW5hbDxicj4uLi4gKCkgLSZndDsgeDI7IC8vIHgyIGlz
IG9ubHkgdXNlZCBoZXJlITxicj5gYGA8L3A+Q291bGQgeW91IGNvbWUgdXAgd2l0aCBhIGphdmFj
IHBhdGNoIHRoYXQgZGV0ZWN0cyBzdWNoICJkdW1teSIgdmFyaWFibGUgZGVjbGFyYXRpb25zIGFu
ZCBwcmludHMgYSBub3RlL3dhcm5pbmcgaW4gdGhlIGNvbXBpbGVyIG91dHB1dD88cD5UaGVuIHdl
IGNhbiB0cnkgdG8gcnVuIHRoZSBtb2RpZmllZCBqYXZhYyB0byBidWlsZCB0aGUgSkRLIGFuZCBz
ZWUgaG93IG1hbnkgd2FybmluZ3MgYXJlIGZvdW5kIHRoZXJlLiBTaW1pbGFybHksIHdlIGNhbiB0
cnkgdGhlIG1vZGlmaWVkIGNvbXBpbGVyIGFnYWluc3QgTWF2ZW4gYXJ0aWZhY3RzICh3ZSBoYXZl
IHNvbWUgaW5mcmFzdHJ1Y3R1cmUgdG8gZG8gdGhhdCksIG9yIGFnYWluc3Qgb3RoZXIgaW50ZXJl
c3RpbmcgY29kZWJhc2VzIChwZXJoYXBzIExpYW0sIGNjJ2VkLCBtaWdodCBoZWxwIGhlcmU/KTwv
cD48cD5MZXQgbWUga25vdyB3aGF0IHlvdSB0aGluay48L3A+PHA+Q2hlZXJzPGJyPk1hdXJpemlv
PC9wPjxwPlsxXSAtIGh0dHBzOi8vZ2l0Lm9wZW5qZGsub3JnL2pkay9wdWxsLzIxNDE1PGJyPjwv
cD48ZGl2IGNsYXNzPSJtb3otY2l0ZS1wcmVmaXgiPk9uIDExLzA5LzIwMjQgMDA6MjMsIEFyY2hp
ZSBDb2JicyB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIgY2l0ZT0ibWlk
OkNBTlNvRnh2OWl4Kzh2SllpR0VrODl2dVlnNFZFZURCV0xwMy1DUG9HUkJlSnp5NHNmQUBtYWls
LmdtYWlsLmNvbSI+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0
L2h0bWw7ICI+PGRpdiBkaXI9Imx0ciI+PGRpdj5JJ20gY3VyaW91cyBhYm91dCB0aGlzIHBvc3Np
YmxlIGZ1dHVyZSBsYW5ndWFnZSB0d2VhayBhbmQgaGF2ZSBiZWVuIGxvb2tpbmcgYXQgaXQgbW9y
ZSBjbG9zZWx5OiA8YSBocmVmPSJodHRwczovL2J1Z3Mub3Blbmpkay5vcmcvYnJvd3NlL0pESy04
MzAwNjkxIiB0YXJnZXQ9Il9ibGFuayIgbW96LWRvLW5vdC1zZW5kPSJ0cnVlIiBjbGFzcz0ibW96
LXR4dC1saW5rLWZyZWV0ZXh0Ij5odHRwczovL2J1Z3Mub3Blbmpkay5vcmcvYnJvd3NlL0pESy04
MzAwNjkxPC9hPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SSB0aGluayB0aGlzIHdvdWxkIGJl
IGEgbmljZSBwcmFjdGljYWwgY2hhbmdlIHRoYXQgZml0cyB3ZWxsIHdpdGhpbiB0aGUgQW1iZXIg
YW1iaXQuIEhvd2V2ZXIsIEknbSBzdHVjayBvbiBvbmUgcXVlc3Rpb24uPGJyPjwvZGl2PjxkaXY+
PGJyPjwvZGl2PjxkaXY+VG8gc3VtbWFyaXplLCB0aGVyZSBhcmUgdHdvIGluZGVwZW5kZW50IGNo
YW5nZXMgYmVpbmcgcHJvcG9zZWQ6PC9kaXY+PGRpdj48b2w+PGxpPlByZXZlbnQgc3RhdGVtZW50
cyBpbiBmb3IoKSBsb29wIHN0ZXBzIGZyb20gY2F1c2luZyBmb3IoKSBsb29wIHZhcmlhYmxlcyB0
byBsb3NlIHRoZWlyICJlZmZlY3RpdmVseSBmaW5hbCIgc3RhdHVzPC9saT48bGk+QWxsb3cgZmlu
YWwgZm9yKCkgbG9vcCB2YXJpYWJsZXMgdG8gYmUgbXV0YXRlZCBpbiB0aGUgZm9yKCkgc3RlcCAo
YnV0IG5vdCB0aGUgZm9yKCkgYm9keSk8L2xpPjwvb2w+PC9kaXY+PGRpdj48ZGl2PkNoYW5nZSAj
MSB3b3VsZCBhbGxvdyBjb2RlIGxpa2UgdGhpczo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2IHN0
eWxlPSJtYXJnaW4tbGVmdDo0MHB4Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNl
Ij5mb3IgKGludCBpID0gMDsgaSAmbHQ7IDEwOyBpKyspIHs8YnI+PC9zcGFuPjwvZGl2PjxkaXYg
c3R5bGU9Im1hcmdpbi1sZWZ0OjQwcHgiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25vc3Bh
Y2UiPiZuYnNwOyZuYnNwOyZuYnNwOyBSdW5uYWJsZSByID0gKCkgLSZndDsgU3lzdGVtLm91dC5w
cmludGxuKGkpOyZuYnNwOyZuYnNwOyAvLyBob29yYXksICJpIiBpcyBlZmZlY3RpdmVseSBmaW5h
bDxicj48L3NwYW4+PC9kaXY+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6NDBweCI+PHNwYW4gc3R5
bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSI+fTwvc3Bhbj48L2Rpdj48L2Rpdj48ZGl2PjxkaXY+
PGJyPjwvZGl2PjxkaXY+PGRpdj5DaGFuZ2UgIzIgd291bGQgYWxsb3cgY29kZSBsaWtlIHRoaXM6
PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6NDBweCI+PHNwYW4g
c3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSI+Zm9yIChmaW5hbCBpbnQgaSA9IDA7IGkgJmx0
OyAxMDsgaSsrKSB7PGJyPjwvc3Bhbj48L2Rpdj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDo0MHB4
Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNlIj4mbmJzcDsmbmJzcDsmbmJzcDsg
U3lzdGVtLm91dC5wcmludGxuKGkpOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
OyZuYnNwOyZuYnNwOyZuYnNwOyAvLyB3ZSBjYW4gcmVzdCBhc3N1cmVkICJpIiBjYW4ndCBjaGFu
Z2UgaW4gaGVyZTxicj48L3NwYW4+PC9kaXY+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6NDBweCI+
PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSI+fTxicj48L3NwYW4+PC9kaXY+PGJy
PjwvZGl2PjxkaXY+Q2hhbmdlICMxIGlzIHN0cmFpZ2h0Zm9yd2FyZCBidXQgQ2hhbmdlICMyIHJh
aXNlcyBhbiBpc3N1ZS4gQSBmaW5hbCBpbml0aWFsaXplZCB2YXJpYWJsZSBpcyBub3Qgb25seSBp
bW11dGFibGUgYnV0IGFsc28gY2FuIGJlIGEgY29uc3RhbnQgZXhwcmVzc2lvbiwgYW5kIHRoaXMg
YWZmZWN0cyByZWFjaGFiaWxpdHkgYW5hbHlzaXMuPGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2Pjxk
aXY+Rm9yIGV4YW1wbGUsIHRoZXNlIHR3byBleGFtcGxlcyBkbyBub3QgY29tcGlsZTo8L2Rpdj48
ZGl2Pjxicj48L2Rpdj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDo0MHB4Ij48c3BhbiBzdHlsZT0i
Zm9udC1mYW1pbHk6bW9ub3NwYWNlIj5maW5hbCBpbnQgeCA9IDA7PC9zcGFuPjwvZGl2PjxkaXYg
c3R5bGU9Im1hcmdpbi1sZWZ0OjQwcHgiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25vc3Bh
Y2UiPndoaWxlICh4ICE9IDApPC9zcGFuPjwvZGl2PjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OjQw
cHgiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2UiPiZuYnNwOyZuYnNwOyZuYnNw
OyBTeXN0ZW0ub3V0LnByaW50bG4oeCk7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
c3A7Jm5ic3A7Jm5ic3A7IC8vIGVycm9yOiB1bnJlYWNoYWJsZSBzdGF0ZW1lbnQ8YnI+PC9zcGFu
PjwvZGl2PjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OjQwcHgiPjxzcGFuIHN0eWxlPSJmb250LWZh
bWlseTptb25vc3BhY2UiPlN5c3RlbS5vdXQucHJpbnRsbigiZG9uZSIpOzwvc3Bhbj48L2Rpdj48
ZGl2Pjxicj48L2Rpdj48ZGl2PjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OjQwcHgiPjxzcGFuIHN0
eWxlPSJmb250LWZhbWlseTptb25vc3BhY2UiPmZpbmFsIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9u
dC1mYW1pbHk6bW9ub3NwYWNlIj5pbnQgeCA9IDA7PC9zcGFuPjwvZGl2PjxkaXYgc3R5bGU9Im1h
cmdpbi1sZWZ0OjQwcHgiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2UiPndoaWxl
ICh4ID09IDApPC9zcGFuPjwvZGl2PjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OjQwcHgiPjxzcGFu
IHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2UiPiZuYnNwOyZuYnNwOyZuYnNwOyBTeXN0ZW0u
b3V0LnByaW50bG4oeCk7PC9zcGFuPjwvZGl2PjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OjQwcHgi
PjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2UiPlN5c3RlbS5vdXQucHJpbnRsbigi
ZG9uZSIpOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBlcnJv
cjogdW5yZWFjaGFibGUgc3RhdGVtZW50PC9zcGFuPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+
V2Ugc2hvdWxkbid0IGV4cGVjdCB0aGUgZXF1aXZhbGVudCBmb3IoKSBzdGF0ZW1lbnRzIHRvIGNv
bXBpbGUgZWl0aGVyLCBhbmQgaW4gZmFjdCB0b2RheSB0aGV5IGRvbid0Ojxicj48L2Rpdj48L2Rp
dj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDo0MHB4Ij48YnI+PC9kaXY+PGRpdiBzdHlsZT0ibWFy
Z2luLWxlZnQ6NDBweCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSI+Zm9yIChm
aW5hbCBpbnQgeCA9IDA7IHggIT0gMDsgKTxicj4mbmJzcDsgJm5ic3A7IFN5c3RlbS5vdXQucHJp
bnRsbih4KTsgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2UiPiZuYnNw
OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBlcnJvcjogdW5yZWFjaGFi
bGUgc3RhdGVtZW50PC9zcGFuPjxicj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNl
Ij5TeXN0ZW0ub3V0LnByaW50bG4oImRvbmUiKTs8L3NwYW4+PC9kaXY+PGRpdj48YnI+PC9kaXY+
PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6NDBweCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5Om1v
bm9zcGFjZSI+Zm9yIChmaW5hbCBpbnQgeCA9IDA7IHggPT0gMDsgKTxicj4mbmJzcDsmbmJzcDsm
bmJzcDsgU3lzdGVtLm91dC5wcmludGxuKHgpOzxicj5TeXN0ZW0ub3V0LnByaW50bG4oImRvbmUi
KTs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSI+Jm5ic3A7Jm5ic3A7
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIGVycm9yOiB1bnJlYWNoYWJsZSBzdGF0
ZW1lbnQ8L3NwYW4+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj48ZGl2PjxkaXY+QnV0IG5vdyBz
dXBwb3NlIHdlIGFkZCBhIHN0ZXAsIHdoaWNoIENoYW5nZSAjMiB3b3VsZCBuZXdseSBhbGxvdzo8
YnI+PC9kaXY+PC9kaXY+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6NDBweCI+PGJyPjwvZGl2Pjxk
aXYgc3R5bGU9Im1hcmdpbi1sZWZ0OjQwcHgiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25v
c3BhY2UiPmZvciAoZmluYWwgaW50IHggPSAwOyB4ICE9IDA7IHgrKyk8YnI+Jm5ic3A7ICZuYnNw
OyBTeXN0ZW0ub3V0LnByaW50bG4oeCk7IDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6
bW9ub3NwYWNlIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy8g
ZXJyb3I6IHVucmVhY2hhYmxlIHN0YXRlbWVudC4uLiA/PC9zcGFuPjxicj48c3BhbiBzdHlsZT0i
Zm9udC1mYW1pbHk6bW9ub3NwYWNlIj5TeXN0ZW0ub3V0LnByaW50bG4oImRvbmUiKTs8L3NwYW4+
PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6NDBweCI+PHNwYW4g
c3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSI+Zm9yIChmaW5hbCBpbnQgeCA9IDA7IHggPT0g
MDsgeCsrKTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgU3lzdGVtLm91dC5wcmludGxuKHgpOzxicj5T
eXN0ZW0ub3V0LnByaW50bG4oImRvbmUiKTs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5
Om1vbm9zcGFjZSI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8v
IE5PVCBhbiB1bnJlYWNoYWJsZSBzdGF0ZW1lbnQ8L3NwYW4+PC9kaXY+PGRpdj48YnI+PC9kaXY+
PGRpdj5JbiB0aGUgZmlyc3QgZXhhbXBsZSwgdGhlIGlubmVyIHN0YXRlbWVudCBpcyBzdGlsbCB1
bnJlYWNoYWJsZSwgc28gaXQncyBPSyBmb3IgdGhlIGNvbXBpbGVyIHRvIHN0aWxsIHJlcG9ydCB0
aGF0IGVycm9yLCBidXQgaW4gdGhlIHNlY29uZCBleGFtcGxlLCB0aGUgZmluYWwgc3RhdGVtZW50
IGlzIG5vdyBvYnZpb3VzbHkgcmVhY2hhYmxlLCBzbyB0aGUgY29tcGlsZXIgbXVzdCZuYnNwOyBk
byBzb21ldGhpbmcgZGlmZmVyZW50LiBNb3Jlb3ZlciBpdCB3b3VsZCBiZSBkb2luZyBzb21ldGhp
bmcgZGlmZmVyZW50IGJhc2VkIG9uIGluc3BlY3Rpb24gb2YgdGhlIHN0ZXAgZm9yIG11dGF0aW9u
cyB0byAieCIsIHdoaWNoIHNlZW1zIGxpa2UgInNwb29reSBhY3Rpb24gYXQgYSBkaXN0YW5jZSIg
YW5kIGNvdWxkIGJlIHNwZWMtY2hhbGxlbmdpbmcuPGJyPjwvZGl2PjwvZGl2PjxkaXY+PGRpdj48
YnI+PC9kaXY+PGRpdj5BbHRlcm5hdGl2ZWx5LCB0aGUgY29tcGlsZXIgY291bGQgY2hhbmdlIGl0
cyBiZWhhdmlvciB0byBuZXZlciBjb25zaWRlciBmaW5hbCBsb29wIHZhcmlhYmxlcyBhcyBjb25z
dGFudCBleHByZXNzaW9ucywgYnV0IHRoaXMgY291bGQgYnJlYWsgZXhpc3RpbmcgY29kZS48YnI+
PC9kaXY+PGJyPjxkaXY+T2YgY291cnNlLCBpZiBDaGFuZ2UgIzIgaGFkIHRvbyBtYW55IGlzc3Vl
cywgQ2hhbmdlICMxIHdvdWxkIHN0aWxsIGJlIHVzZWZ1bCBvbiBpdHMgb3duLjxicj48L2Rpdj48
ZGl2Pjxicj48L2Rpdj48ZGl2PlRob3VnaHRzPzxicj48L2Rpdj48YnI+PC9kaXY+PGRpdj5UaGFu
a3MsPGJyPjwvZGl2PjxkaXY+LUFyY2hpZTxicj48L2Rpdj48L2Rpdj48ZGl2Pjxicj48c3BhbiBj
bGFzcz0iZ21haWxfc2lnbmF0dXJlX3ByZWZpeCI+LS0gPC9zcGFuPjxicj48ZGl2IGRpcj0ibHRy
IiBjbGFzcz0iZ21haWxfc2lnbmF0dXJlIiBkYXRhLXNtYXJ0bWFpbD0iZ21haWxfc2lnbmF0dXJl
Ij5BcmNoaWUgTC4gQ29iYnM8YnI+PC9kaXY+PC9kaXY+PC9kaXY+Cgo8L2Jsb2NrcXVvdGU+" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;"></div>
</div>
</body>
</html>