<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important">Hello core-libs devs,</p>
<p style="margin:0px 0px 1.2em!important">The <a href="https://bugs.openjdk.org/browse/JDK-8263012">ExtentLocal</a> proposal adds a new way to transfer arguments to methods, e.g. (<a href="https://github.com/openjdk/loom/blob/2bf3cbcf3254a08ca9d1c20ed14e0976660351b8/src/jdk.incubator.concurrent/share/classes/jdk/incubator/concurrent/ExtentLocal.java#:~:text=target%3D%22ExtentLocal%23newInstance%22%20%3A-,*%20%20%20private%20static%20final%20ExtentLocal%3CCredentials%3E%20CREDENTIALS%20%3D%20ExtentLocal.newInstance()%3B,*%20%20%20%7D,-*%20%7D">taken from project’s loom git</a>)</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)"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">private</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">static</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">final</span> ExtentLocal<Credentials> CREDENTIALS = ExtentLocal.newInstance();

Credentials creds = ...
ExtentLocal.where(CREDENTIALS, creds).run(() -> {
    ...
    Connection connection = connectDatabase();
    ...
});

...

<span class="hljs-function">Connection <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">connectDatabase</span><span class="hljs-params">()</span> </span>{
    Credentials credentials = CREDENTIALS.get();
    ...
}
</code></pre>
<p style="margin:0px 0px 1.2em!important">I have a question about the proposal, why not allow try-with-resources with this API?</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)"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">private</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">static</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">final</span> ExtentLocal<Credentials> CREDENTIALS = ExtentLocal.newInstance();

Credentials creds = ...
<span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// Hopefully one day Java will support anonymous variables in "try-with-resource" to get rid of the "var _ =" part</span>
<span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// note that we still can introduce several binding with chaining ".where" without introducing several  dummy variables</span>
<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">try</span>(var _ = ExtentLocal.where(CREDENTIALS, creds)) { <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// maybe have a new method instead of "where" that returns some wrapper class, so ExtentLocal.Carrier won't need to implement AutoClosable</span>
    ...
    Connection connection = connectDatabase();
    ...
}

...

<span class="hljs-function">Connection <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">connectDatabase</span><span class="hljs-params">()</span> </span>{
    Credentials credentials = CREDENTIALS.get();
    ...
}
</code></pre>
<p style="margin:0px 0px 1.2em!important">The syntax of <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">.where(...)....where(...).run(...)</code> is nice, but it is weird that we “introduce variables” from a different clause then the run (I know it is only bindings, but it acts similar enough), the syntax of try-with-resources is already well known to introduce new variables. Another advantage is the ability of “catch” block without increasing nesting:</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)"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">try</span> {
    ExtentLocal.where(CREDENTIALS, creds).run(() -> {
        Connection connection = connectDatabase();
    });
} <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">catch</span> (...) {
    ...
}
</code></pre>
<p style="margin:0px 0px 1.2em!important">versus</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)"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">try</span>(var _ = ExtentLocal.where(CREDENTIALS, creds)) {
    Connection connection = connectDatabase();
} <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">catch</span> (...) {
    ...
}
</code></pre>
<p style="margin:0px 0px 1.2em!important">(Another solution to this is too add <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">.catch</code> method to <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">ExtentLocal.Carrier</code> to handle exceptions, but this will cause problems with <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">call</code> vs <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">run</code>)</p>
<p style="margin:0px 0px 1.2em!important">Further furthermore, one can combine it with <a href="https://openjdk.org/jeps/428">structured concurrency</a>:</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)"><span class="hljs-function"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">public</span> Response <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">handle</span><span class="hljs-params">(Credentials creds)</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">throws</span> ExecutionException, InterruptedException </span>{
    <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">try</span> (var scope = <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">new</span> StructuredTaskScope.ShutdownOnFailure();
          var _ = ExtentLocal.where(CREDENTIALS, creds)) { <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// functionally this binding is part of the scope</span>
        Future<String>  user  = scope.fork(() -> findUser());
        Future<Integer> order = scope.fork(() -> fetchOrder());

        scope.join().throwIfFailed();

        <span class="hljs-function"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">return</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">new</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">Response</span><span class="hljs-params">(user.resultNow()</span>, order.<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">resultNow</span><span class="hljs-params">()</span>)</span>;
    }
}
</code></pre>
<p style="margin:0px 0px 1.2em!important">Instead of doing something like:</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)"><span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// If this solution is possible at all, if the Credentials are a field in the object then you need to introduce some method to use "handle()" with the correct Extent binding, or wrap the body of "handle()" inside of the method "handle()" which needlessly increase nestings</span>
<span class="hljs-function"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">public</span> Response <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">handle</span><span class="hljs-params">(Credentials creds)</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">throws</span> ExecutionException, InterruptedException </span>{
    <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">return</span> ExtentLocal.where(CREDENTIALS, creds).call(<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">this</span>::handle)
}

<span class="hljs-function"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">public</span> Response <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">handle</span><span class="hljs-params">()</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">throws</span> ExecutionException, InterruptedException </span>{
    <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">try</span> (var scope = <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">new</span> StructuredTaskScope.ShutdownOnFailure()) {
        Future<String>  user  = scope.fork(() -> findUser());
        Future<Integer> order = scope.fork(() -> fetchOrder());

        scope.join();
        scope.throwIfFailed();

        <span class="hljs-function"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">return</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">new</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">Response</span><span class="hljs-params">(user.resultNow()</span>, order.<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">resultNow</span><span class="hljs-params">()</span>)</span>;
    }
}
</code></pre>
<p style="margin:0px 0px 1.2em!important">Before saying that I shouldn’t couple <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">handle()</code> to <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">CREDENTIALS</code>, note that <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">findUser</code> and <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">fetchOrder</code> are already coupled to it, in fact the use of private <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">ExtentLocal</code> variable introduce coupling pretty much by definition (which is <a href="https://github.com/openjdk/loom/blob/fibers/src/jdk.incubator.concurrent/share/classes/jdk/incubator/concurrent/ExtentLocal.java#:~:text=An%20%7B%40,nest).">the intended use case</a>, although I can think on some use cases with public <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">ExtentLocal</code>).</p>
<p style="margin:0px 0px 1.2em!important">Now, I do really like the <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">where-run</code> syntax, but I see a lot of merits in allowing also try-with-resources as well.</p>
<p style="margin:0px 0px 1.2em!important">Thanks for the read,<br>Yuval Paz</p>
<div title="MDH:SGVsbG/CoGNvcmUtbGlicyBkZXZzLDxicj48YnI+VGhlIFtFeHRlbnRMb2NhbF1bMV0gcHJvcG9z
YWwgYWRkcyBhIG5ldyB3YXkgdG8gdHJhbnNmZXIgYXJndW1lbnRzIHRvIG1ldGhvZHMsIGUuZy4g
KFt0YWtlbiBmcm9tIHByb2plY3QncyBsb29tIGdpdF1bMl0pPGJyPjxicj5gYGBqYXZhPGJyPnBy
aXZhdGUgc3RhdGljIGZpbmFsIEV4dGVudExvY2FsJmx0O0NyZWRlbnRpYWxzJmd0OyBDUkVERU5U
SUFMUyA9IEV4dGVudExvY2FsLm5ld0luc3RhbmNlKCk7PGJyPjxicj5DcmVkZW50aWFscyBjcmVk
cyA9IC4uLjxicj5FeHRlbnRMb2NhbC53aGVyZShDUkVERU5USUFMUywgY3JlZHMpLnJ1bigoKSAt
Jmd0OyB7PGJyPsKgIMKgIC4uLjxicj7CoCDCoCBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBjb25u
ZWN0RGF0YWJhc2UoKTs8YnI+wqAgwqAgLi4uPGJyPn0pOzxicj48YnI+Li4uPGJyPjxicj5Db25u
ZWN0aW9uIGNvbm5lY3REYXRhYmFzZSgpIHs8YnI+wqAgwqAgQ3JlZGVudGlhbHMgY3JlZGVudGlh
bHMgPSBDUkVERU5USUFMUy5nZXQoKTs8YnI+wqAgwqAgLi4uPGJyPn08YnI+YGBgPGRpdj48YnI+
PC9kaXY+PGRpdj5JIGhhdmUgYSBxdWVzdGlvbiBhYm91dCB0aGUgcHJvcG9zYWwsIHdoeSBub3Qg
YWxsb3cgdHJ5LXdpdGgtcmVzb3VyY2VzIHdpdGggdGhpcyBBUEk/PC9kaXY+PGRpdj48YnI+PC9k
aXY+PGRpdj5gYGBqYXZhPGJyPnByaXZhdGUgc3RhdGljIGZpbmFsIEV4dGVudExvY2FsJmx0O0Ny
ZWRlbnRpYWxzJmd0OyBDUkVERU5USUFMUyA9IEV4dGVudExvY2FsLm5ld0luc3RhbmNlKCk7PGJy
Pjxicj5DcmVkZW50aWFscyBjcmVkcyA9IC4uLjxicj4vLyBIb3BlZnVsbHkgb25lIGRheSBKYXZh
IHdpbGwgc3VwcG9ydCBhbm9ueW1vdXMmbmJzcDt2YXJpYWJsZXMgaW4gInRyeS13aXRoLXJlc291
cmNlIiB0byBnZXQgcmlkIG9mIHRoZSAidmFyIF8gPSIgcGFydDxicj4vLyBub3RlIHRoYXQgd2Ug
c3RpbGwgY2FuIGludHJvZHVjZSBzZXZlcmFsIGJpbmRpbmcgd2l0aCBjaGFpbmluZyAiLndoZXJl
IiB3aXRob3V0IGludHJvZHVjaW5nIHNldmVyYWwmbmJzcDsgZHVtbXkgdmFyaWFibGVzPGJyPnRy
eSh2YXIgXyA9IEV4dGVudExvY2FsLndoZXJlKENSRURFTlRJQUxTLCBjcmVkcykpIHsgLy8gbWF5
YmUgaGF2ZSBhIG5ldyBtZXRob2QgaW5zdGVhZCBvZiAid2hlcmUiIHRoYXQgcmV0dXJucyZuYnNw
O3NvbWUgd3JhcHBlciBjbGFzcywgc28mbmJzcDtFeHRlbnRMb2NhbC5DYXJyaWVyIHdvbid0IG5l
ZWQgdG8gaW1wbGVtZW50IEF1dG9DbG9zYWJsZTxicj4mbmJzcDsgJm5ic3A7IC4uLjxicj4mbmJz
cDsgJm5ic3A7IENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGNvbm5lY3REYXRhYmFzZSgpOzxicj4m
bmJzcDsgJm5ic3A7IC4uLjxicj59PGJyPjxicj4uLi48YnI+PGJyPkNvbm5lY3Rpb24gY29ubmVj
dERhdGFiYXNlKCkgezxicj4mbmJzcDsgJm5ic3A7IENyZWRlbnRpYWxzIGNyZWRlbnRpYWxzID0g
Q1JFREVOVElBTFMuZ2V0KCk7PGJyPiZuYnNwOyAmbmJzcDsgLi4uPGJyPn08YnI+YGBgPC9kaXY+
PGRpdj5UaGUgc3ludGF4IG9mIGAud2hlcmUoLi4uKS4uLi53aGVyZSguLi4pLnJ1biguLi4pYCBp
cyBuaWNlLCBidXQgaXQgaXMgd2VpcmQgdGhhdCB3ZSAiaW50cm9kdWNlIHZhcmlhYmxlcyIgZnJv
bSBhIGRpZmZlcmVudCBjbGF1c2UgdGhlbiB0aGUgcnVuIChJIGtub3cgaXQgaXMgb25seSBiaW5k
aW5ncywgYnV0IGl0IGFjdHMgc2ltaWxhciBlbm91Z2gpLCB0aGUgc3ludGF4IG9mIHRyeS13aXRo
LXJlc291cmNlcyBpcyBhbHJlYWR5IHdlbGwga25vd24gdG8gaW50cm9kdWNlIG5ldyB2YXJpYWJs
ZXMuIEFub3RoZXIgYWR2YW50YWdlIGlzIHRoZSBhYmlsaXR5IG9mICJjYXRjaCIgYmxvY2sgd2l0
aG91dCBpbmNyZWFzaW5nIG5lc3Rpbmc6PGJyPjxicj5gYGBqYXZhPGJyPnRyeSB7PGJyPiZuYnNw
OyAmbmJzcDsgRXh0ZW50TG9jYWwud2hlcmUoQ1JFREVOVElBTFMsIGNyZWRzKS5ydW4oKCkgLSZn
dDsgezxicj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgQ29ubmVjdGlvbiBjb25uZWN0aW9u
ID0gY29ubmVjdERhdGFiYXNlKCk7PGJyPiZuYnNwOyAmbmJzcDsgfSk7PGJyPn0gY2F0Y2ggKC4u
Likgezxicj4mbmJzcDsgJm5ic3A7IC4uLjxicj59PGJyPmBgYDxicj52ZXJzdXM8L2Rpdj48ZGl2
PmBgYGphdmE8YnI+dHJ5KHZhciBfID0gRXh0ZW50TG9jYWwud2hlcmUoQ1JFREVOVElBTFMsIGNy
ZWRzKSkgezxicj4mbmJzcDsgJm5ic3A7IENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGNvbm5lY3RE
YXRhYmFzZSgpOzxicj59Jm5ic3A7Y2F0Y2ggKC4uLikgezxicj4mbmJzcDsgJm5ic3A7IC4uLjxi
cj59PGJyPmBgYDxicj48L2Rpdj48ZGl2PihBbm90aGVyIHNvbHV0aW9uIHRvIHRoaXMgaXMgdG9v
IGFkZCBgLmNhdGNoYCBtZXRob2QgdG8gYEV4dGVudExvY2FsLkNhcnJpZXJgIHRvIGhhbmRsZSBl
eGNlcHRpb25zLCBidXQgdGhpcyB3aWxsIGNhdXNlIHByb2JsZW1zIHdpdGggYGNhbGxgIHZzIGBy
dW5gKTxicj48YnI+RnVydGhlciBmdXJ0aGVybW9yZSwgb25lIGNhbiBjb21iaW5lIGl0IHdpdGgg
W3N0cnVjdHVyZWQgY29uY3VycmVuY3ldWzNdOjxicj48YnI+YGBgamF2YTxicj5wdWJsaWMgUmVz
cG9uc2UgaGFuZGxlKENyZWRlbnRpYWxzIGNyZWRzKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9u
LCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IHRyeSAodmFy
IHNjb3BlID0gbmV3IFN0cnVjdHVyZWRUYXNrU2NvcGUuU2h1dGRvd25PbkZhaWx1cmUoKTs8YnI+
Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyB2YXIgXyA9IEV4dGVudExvY2FsLndo
ZXJlKENSRURFTlRJQUxTLCBjcmVkcykpIHsgLy8gZnVuY3Rpb25hbGx5IHRoaXMgYmluZGluZyBp
cyBwYXJ0IG9mIHRoZSBzY29wZTwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7
IEZ1dHVyZSZsdDtTdHJpbmcmZ3Q7ICZuYnNwO3VzZXIgJm5ic3A7PSBzY29wZS5mb3JrKCgpIC0m
Z3Q7IGZpbmRVc2VyKCkpOzxicj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgRnV0dXJlJmx0
O0ludGVnZXImZ3Q7IG9yZGVyID0gc2NvcGUuZm9yaygoKSAtJmd0OyBmZXRjaE9yZGVyKCkpOzxi
cj48YnI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IHNjb3BlLmpvaW4oKS50aHJvd0lmRmFp
bGVkKCk7PGJyPjxicj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgcmV0dXJuIG5ldyBSZXNw
b25zZSh1c2VyLnJlc3VsdE5vdygpLCBvcmRlci5yZXN1bHROb3coKSk7PGJyPiZuYnNwOyAmbmJz
cDsgfTxicj59PGJyPmBgYDxicj48YnI+SW5zdGVhZCBvZiBkb2luZyBzb21ldGhpbmcgbGlrZTo8
YnI+PGJyPjxkaXY+YGBgamF2YTxicj4vLyBJZiB0aGlzIHNvbHV0aW9uIGlzIHBvc3NpYmxlIGF0
IGFsbCwgaWYgdGhlJm5ic3A7Q3JlZGVudGlhbHMmbmJzcDthcmUgYSBmaWVsZCBpbiB0aGUgb2Jq
ZWN0IHRoZW4geW91IG5lZWQgdG8gaW50cm9kdWNlIHNvbWUgbWV0aG9kIHRvIHVzZSAiaGFuZGxl
KCkiIHdpdGggdGhlIGNvcnJlY3QgRXh0ZW50IGJpbmRpbmcsIG9yIHdyYXAgdGhlIGJvZHkgb2Yg
ImhhbmRsZSgpIiBpbnNpZGUgb2YgdGhlIG1ldGhvZCAiaGFuZGxlKCkiIHdoaWNoIG5lZWRsZXNz
bHkgaW5jcmVhc2UgbmVzdGluZ3M8YnI+cHVibGljIFJlc3BvbnNlIGhhbmRsZShDcmVkZW50aWFs
cyBjcmVkcykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24g
ezwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyByZXR1cm4gRXh0ZW50TG9jYWwud2hlcmUoQ1JFREVO
VElBTFMsIGNyZWRzKS5jYWxsKHRoaXM6OmhhbmRsZSk8L2Rpdj48ZGl2Pn08YnI+PGJyPnB1Ymxp
YyBSZXNwb25zZSBoYW5kbGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRl
ZEV4Y2VwdGlvbiB7PGJyPiZuYnNwOyAmbmJzcDsgdHJ5ICh2YXIgc2NvcGUgPSBuZXcgU3RydWN0
dXJlZFRhc2tTY29wZS5TaHV0ZG93bk9uRmFpbHVyZSgpKSB7PGJyPiZuYnNwOyAmbmJzcDsgJm5i
c3A7ICZuYnNwOyBGdXR1cmUmbHQ7U3RyaW5nJmd0OyAmbmJzcDt1c2VyICZuYnNwOz0gc2NvcGUu
Zm9yaygoKSAtJmd0OyBmaW5kVXNlcigpKTs8YnI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7
IEZ1dHVyZSZsdDtJbnRlZ2VyJmd0OyBvcmRlciA9IHNjb3BlLmZvcmsoKCkgLSZndDsgZmV0Y2hP
cmRlcigpKTs8YnI+PGJyPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBzY29wZS5qb2luKCk7
PGJyPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBzY29wZS50aHJvd0lmRmFpbGVkKCk7PGJy
Pjxicj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgcmV0dXJuIG5ldyBSZXNwb25zZSh1c2Vy
LnJlc3VsdE5vdygpLCBvcmRlci5yZXN1bHROb3coKSk7PGJyPiZuYnNwOyAmbmJzcDsgfTxicj59
PGJyPmBgYDwvZGl2PjwvZGl2PjxkaXY+PGRpdj5CZWZvcmUgc2F5aW5nIHRoYXQgSSBzaG91bGRu
J3QgY291cGxlIGBoYW5kbGUoKWAgdG8gYENSRURFTlRJQUxTYCwgbm90ZSB0aGF0IGAKCmZpbmRV
c2VyYCBhbmQgYGZldGNoT3JkZXJgIGFyZSBhbHJlYWR5IGNvdXBsZWQgdG8gaXQsIGluIGZhY3Qg
dGhlIHVzZSBvZiBwcml2YXRlIGBFeHRlbnRMb2NhbGAgdmFyaWFibGUgaW50cm9kdWNlIGNvdXBs
aW5nIHByZXR0eSBtdWNoIGJ5IGRlZmluaXRpb24gKHdoaWNoIGlzIFt0aGUmbmJzcDtpbnRlbmRl
ZCB1c2UgY2FzZV1bNF0sIGFsdGhvdWdoIEkgY2FuIHRoaW5rIG9uIHNvbWUgdXNlIGNhc2VzIHdp
dGggcHVibGljIGBFeHRlbnRMb2NhbGApLjxicj48YnI+Tm93LCBJIGRvIHJlYWxseSBsaWtlIHRo
ZSBgd2hlcmUtcnVuYCBzeW50YXgsIGJ1dCBJIHNlZSBhIGxvdCBvZiBtZXJpdHMgaW4gYWxsb3dp
bmcgYWxzbyB0cnktd2l0aC1yZXNvdXJjZXMgYXMgd2VsbC48YnI+PGJyPlRoYW5rcyBmb3IgdGhl
IHJlYWQsIDxicj5ZdXZhbCBQYXo8YnI+PGJyPjwvZGl2PjxkaXY+PGJyPlsxXTogaHR0cHM6Ly9i
dWdzLm9wZW5qZGsub3JnL2Jyb3dzZS9KREstODI2MzAxMjwvZGl2PjxkaXY+PGJyPjxkaXY+WzJd
OiZuYnNwO2h0dHBzOi8vZ2l0aHViLmNvbS9vcGVuamRrL2xvb20vYmxvYi8yYmYzY2JjZjMyNTRh
MDhjYTlkMWMyMGVkMTRlMDk3NjY2MDM1MWI4L3NyYy9qZGsuaW5jdWJhdG9yLmNvbmN1cnJlbnQv
c2hhcmUvY2xhc3Nlcy9qZGsvaW5jdWJhdG9yL2NvbmN1cnJlbnQvRXh0ZW50TG9jYWwuamF2YSM6
fjp0ZXh0PXRhcmdldCUzRCUyMkV4dGVudExvY2FsJTIzbmV3SW5zdGFuY2UlMjIlMjAlM0EtLCol
MjAlMjAlMjBwcml2YXRlJTIwc3RhdGljJTIwZmluYWwlMjBFeHRlbnRMb2NhbCUzQ0NyZWRlbnRp
YWxzJTNFJTIwQ1JFREVOVElBTFMlMjAlM0QlMjBFeHRlbnRMb2NhbC5uZXdJbnN0YW5jZSgpJTNC
LColMjAlMjAlMjAlN0QsLSolMjAlN0Q8YnI+PGJyPlszXTombmJzcDtodHRwczovL29wZW5qZGsu
b3JnL2plcHMvNDI4PGJyPjxicj5bNF06Jm5ic3A7aHR0cHM6Ly9naXRodWIuY29tL29wZW5qZGsv
bG9vbS9ibG9iL2ZpYmVycy9zcmMvamRrLmluY3ViYXRvci5jb25jdXJyZW50L3NoYXJlL2NsYXNz
ZXMvamRrL2luY3ViYXRvci9jb25jdXJyZW50L0V4dGVudExvY2FsLmphdmEjOn46dGV4dD1BbiUy
MCU3QiU0MCxuZXN0KS48YnI+PGJyPjwvZGl2PjwvZGl2PjwvZGl2Pg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0"></div></div></div>