<div dir="ltr">Here it is:<div><br></div><div><a href="https://bugs.openjdk.org/browse/JDK-8369565">https://bugs.openjdk.org/browse/JDK-8369565</a></div><div><br></div><div>I checked a few random OpenJDK builds I have on my machine, and it looks like the behavior was like this since Java 8.</div><div><br></div><div>With best regards,</div><div>Tagir Valeev</div></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Thu, Oct 9, 2025 at 1:46 PM Maurizio Cimadamore <<a href="mailto:maurizio.cimadamore@oracle.com">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"><u></u>
<div>
<div>
<p style="margin-bottom:19.2px;margin-top:0px">Yes, please!</p>
<p style="margin-bottom:19.2px;margin-top:0px">Thanks<br>
Maurizio</p>
<p style="margin-bottom:19.2px;margin-top:0px">On 09/10/2025
10:18, Tagir Valeev wrote:</p>
<blockquote type="cite" style="border-color:rgb(119,119,119) rgb(119,119,119) rgb(119,119,119) rgb(114,159,207);border-left-width:2px;border-left-style:solid;color:rgb(119,119,119);column-rule-color:rgb(119,119,119);margin:19.2px 0px;outline-color:rgb(119,119,119);padding-left:16px;padding-right:16px;quotes:none;text-decoration-color:rgb(119,119,119);text-emphasis-color:rgb(119,119,119)">
<div id="m_-647106579506287976extcontent-0" style="border-color:rgb(119,119,119);color:rgb(119,119,119);column-rule-color:rgb(119,119,119);outline-color:rgb(119,119,119);quotes:none;text-decoration-color:rgb(119,119,119);text-emphasis-color:rgb(119,119,119)">
<div dir="ltr">Hello, Maurizio!
<div><br>
</div>
<div>Thank you for clarifying this. Should I file an issue?</div>
<div><br>
</div>
<div>With best regards,</div>
<div>Tagir Valeev</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Thu, Oct 9, 2025 at
11:00 AM Maurizio Cimadamore <<a href="mailto:maurizio.cimadamore@oracle.com" target="_blank">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>
<p>Hi Tagir!</p>
<p>Nice cacth.</p>
<p>Here's a slightly different example which reveals a
bit more of what's happening:</p>
<p>```<br>
interface Main {<br>
interface X<T> {<br>
X<T> self();<br>
}<br>
<br>
static X<?> makeX() {return null;}<br>
<br>
static <R> X<R> create(Supplier<?
extends R> supplier) {return null;}<br>
<br>
static X<X<?>> methodRef() {<br>
var s = (String)create(Main::makeX);<br>
}<br>
<br>
static X<X<?>> lambda() {<br>
var s = (String)create(() -> makeX());<br>
}<br>
}<br>
```</p>
<p>This prints:</p>
<p>```<br>
error: incompatible types: X<X<?>> cannot
be converted to String<br>
var s = (String)create(Main::makeX);<br>
^<br>
error: incompatible types: X<X<CAP#1>>
cannot be converted to String<br>
var s = (String)create(() -> makeX());<br>
^<br>
where CAP#1 is a fresh type-variable:<br>
CAP#1 extends Object from capture of ?<br>
```</p>
<p>So, the main difference between the two examples is
that in the lambda case, the return type of the makeX
call is captured. But in the method refreene case no
capture occurs.</p>
<p>I believe the lambda case works as expected, but the
method reference case does not.</p>
<p>The JLS mandates a capture of the resolved method
return type (JLS 15.13.2, emphasis mine):</p>
<p> </p>
<blockquote type="cite">A method reference expression is
<span><em>congruent</em></span> with a function type
if both of the following are true:
<div>
<ul style="list-style-type:disc">
<li>
<p>The function type identifies a single
compile-time declaration corresponding to the
reference. </p>
</li>
<li>
<p> One of the following is true: </p>
<div>
<ul style="list-style-type:circle">
<li>
<p>The result of the function type is <code>void</code>.
</p>
</li>
<li>
<p> The result of the function type is <span>R</span>,
<b>and the result of applying capture
conversion (<a href="https://docs.oracle.com/javase/specs/jls/se25/html/jls-5.html#jls-5.1.10" title="5.1.10. Capture Conversion" target="_blank">§5.1.10</a>)
to the return type of the invocation
type (<a href="https://docs.oracle.com/javase/specs/jls/se25/html/jls-15.html#jls-15.12.2.6" title="15.12.2.6. Method Invocation Type" target="_blank">§15.12.2.6</a>) of the chosen
compile-time declaration is <span>R</span>'</b>
(where <span>R</span> is the target
type that may be used to infer <span>R</span>'),
and neither <span>R</span> nor <span>R</span>'
is <code>void</code>, and <span>R</span>'
is compatible with <span>R</span> in an
assignment context. </p>
</li>
</ul>
</div>
</li>
</ul>
</div>
</blockquote>
<p>It seems like javac is missing this capture
conversion and, because of that, the behavior of the
two examples diverge.</p>
<p>Cheers<br>
Maurizio<br>
</p>
<p><br>
</p>
<p><br>
</p>
<p><br>
</p>
<p><br>
</p>
<div>On 07/10/2025 17:12, Tagir Valeev wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Hello!
<div><br>
</div>
<div>I'm investigating a seemingly weird compilation
case. Consider the following Java interface:</div>
<div><br>
</div>
<div>import java.util.function.Supplier;<br>
<br>
interface Main {<br>
interface X<T> {<br>
X<T> self();<br>
}<br>
<br>
static X<?> makeX() {return null;}<br>
<br>
static <R> X<R>
create(Supplier<? extends R> supplier)
{return null;}<br>
<br>
static X<X<?>> methodRef() {<br>
return create(Main::makeX).self();<br>
}<br>
<br>
static X<X<?>> lambda() {<br>
return create(() -> makeX()).self();<br>
}<br>
}</div>
<div><br>
</div>
<div>I expect that either both methods 'methodRef'
and 'lambda' should be compilable or both should
be non-compilable. However, while 'methodRef'
compiles, 'lambda' is rejected by compiler (using
javac build 25+36-3489):</div>
<div><br>
Main.java:17: error: incompatible types:
X<X<CAP#1>> cannot be converted to
X<X<?>><br>
return create(() -> makeX()).self();<br>
^<br>
where CAP#1 is a fresh type-variable:<br>
CAP#1 extends Object from capture of ?<br>
1 error<br>
error: compilation failed</div>
<div><br>
</div>
<div>Could you please help me and clarify whether
this is an expected behavior or not?</div>
<div><br>
</div>
<div>With best regards,</div>
<div>Tagir Valeev</div>
</div>
</blockquote>
</div>
</blockquote>
</div>
</div>
</blockquote>
</div>
<div style="height:0px;width:0px;max-height:0px;max-width:0px;overflow:hidden;font-size:0px;padding:0px;margin:0px" aria-hidden="true" title="MDH:PHA+WWVzLCBwbGVhc2UhPC9wPjxwPlRoYW5rczxicj5NYXVyaXppbzxicj48L3A+PGRpdiBjbGFzcz0ibW96LWNpdGUtcHJlZml4Ij5PbiAwOS8xMC8yMDI1IDEwOjE4LCBUYWdpciBWYWxlZXYgd3JvdGU6PGJyPjwvZGl2PjxibG9ja3F1b3RlIHR5cGU9ImNpdGUiIGNpdGU9Im1pZDpDQUUrM2ZqWmd5dy1odHdFcnQ5Q3B6c1U0YkRMMzdfY3BFN25XNUF1XzIwMUtxOTJpN1FAbWFpbC5nbWFpbC5jb20iPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyAiPjxkaXYgZGlyPSJsdHIiPkhlbGxvLCZuYnNwO01hdXJpemlvITxkaXY+PGJyPjwvZGl2PjxkaXY+VGhhbmsgeW91IGZvciBjbGFyaWZ5aW5nIHRoaXMuIFNob3VsZCBJIGZpbGUgYW4gaXNzdWU/PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5XaXRoIGJlc3QgcmVnYXJkcyw8L2Rpdj48ZGl2PlRhZ2lyIFZhbGVldjwvZGl2PjwvZGl2Pjxicj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSBnbWFpbF9xdW90ZV9jb250YWluZXIiPjxkaXYgZGlyPSJsdHIiIGNsYXNzPSJnbWFpbF9hdHRyIj5PbiBUaHUsIE9jdCA5LCAyMDI1IGF0IDExOjAw4oCvQU0gTWF1cml6aW8gQ2ltYWRhbW9yZSAmbHQ7PGEgaHJlZj0ibWFpbHRvOm1hdXJpemlvLmNpbWFkYW1vcmVAb3JhY2xlLmNvbSIgbW96LWRvLW5vdC1zZW5kPSJ0cnVlIj5tYXVyaXppby5jaW1hZGFtb3JlQG9yYWNsZS5jb208L2E+Jmd0OyB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjBweCAwcHggMHB4IDAuOGV4O2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2IoMjA0LDIwNCwyMDQpO3BhZGRpbmctbGVmdDoxZXgiPgoKICAKICA8ZGl2PgogICAgPHA+SGkgVGFnaXIhPC9wPgogICAgPHA+TmljZSBjYWN0aC48L3A+CiAgICA8cD5IZXJlJ3MgYSBzbGlnaHRseSBkaWZmZXJlbnQgZXhhbXBsZSB3aGljaCByZXZlYWxzIGEgYml0IG1vcmUgb2YKICAgICAgd2hhdCdzIGhhcHBlbmluZzo8L3A+CiAgICA8cD5gYGA8YnI+CiAgICAgIGludGVyZmFjZSBNYWluIHs8YnI+CiAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyBpbnRlcmZhY2UgWCZsdDtUJmd0OyB7PGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgWCZsdDtUJmd0OyBzZWxmKCk7PGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgfTxicj4KICAgICAgPGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgc3RhdGljIFgmbHQ7PyZndDsgbWFrZVgoKSB7cmV0dXJuIG51bGw7fTxicj4KICAgICAgPGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgc3RhdGljICZsdDtSJmd0OyBYJmx0O1ImZ3Q7IGNyZWF0ZShTdXBwbGllciZsdDs/IGV4dGVuZHMgUiZndDsKICAgICAgc3VwcGxpZXIpIHtyZXR1cm4gbnVsbDt9PGJyPgogICAgICA8YnI+CiAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyBzdGF0aWMgWCZsdDtYJmx0Oz8mZ3Q7Jmd0OyBtZXRob2RSZWYoKSB7PGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgdmFyIHMgPSAoU3RyaW5nKWNyZWF0ZShNYWluOjptYWtlWCk7PGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgfTxicj4KICAgICAgPGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgc3RhdGljIFgmbHQ7WCZsdDs/Jmd0OyZndDsgbGFtYmRhKCkgezxicj4KICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHZhciBzID0gKFN0cmluZyljcmVhdGUoKCkgLSZndDsgbWFrZVgoKSk7PGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgfTxicj4KICAgICAgfTxicj4KICAgICAgYGBgPC9wPgogICAgPHA+VGhpcyBwcmludHM6PC9wPgogICAgPHA+YGBgPGJyPgogICAgICBlcnJvcjogaW5jb21wYXRpYmxlIHR5cGVzOiBYJmx0O1gmbHQ7PyZndDsmZ3Q7IGNhbm5vdCBiZSBjb252ZXJ0ZWQKICAgICAgdG8gU3RyaW5nPGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgdmFyIHMgPSAoU3RyaW5nKWNyZWF0ZShNYWluOjptYWtlWCk7PGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgXjxicj4KICAgICAgZXJyb3I6IGluY29tcGF0aWJsZSB0eXBlczogWCZsdDtYJmx0O0NBUCMxJmd0OyZndDsgY2Fubm90IGJlCiAgICAgIGNvbnZlcnRlZCB0byBTdHJpbmc8YnI+CiAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB2YXIgcyA9IChTdHJpbmcpY3JlYXRlKCgpIC0mZ3Q7IG1ha2VYKCkpOzxicj4KICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IF48YnI+CiAgICAgICZuYnNwOyB3aGVyZSBDQVAjMSBpcyBhIGZyZXNoIHR5cGUtdmFyaWFibGU6PGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgQ0FQIzEgZXh0ZW5kcyBPYmplY3QgZnJvbSBjYXB0dXJlIG9mID88YnI+CiAgICAgIGBgYDwvcD4KICAgIDxwPlNvLCB0aGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBleGFtcGxlcyBpcyB0aGF0IGluIHRoZQogICAgICBsYW1iZGEgY2FzZSwgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtYWtlWCBjYWxsIGlzIGNhcHR1cmVkLiBCdXQgaW4KICAgICAgdGhlIG1ldGhvZCByZWZyZWVuZSBjYXNlIG5vIGNhcHR1cmUgb2NjdXJzLjwvcD4KICAgIDxwPkkgYmVsaWV2ZSB0aGUgbGFtYmRhIGNhc2Ugd29ya3MgYXMgZXhwZWN0ZWQsIGJ1dCB0aGUgbWV0aG9kCiAgICAgIHJlZmVyZW5jZSBjYXNlIGRvZXMgbm90LjwvcD4KICAgIDxwPlRoZSBKTFMgbWFuZGF0ZXMgYSBjYXB0dXJlIG9mIHRoZSByZXNvbHZlZCBtZXRob2QgcmV0dXJuIHR5cGUKICAgICAgKEpMUyAxNS4xMy4yLCBlbXBoYXNpcyBtaW5lKTo8L3A+CiAgICA8cD4KICAgICAgPC9wPjxibG9ja3F1b3RlIHR5cGU9ImNpdGUiPkEgbWV0aG9kIHJlZmVyZW5jZSBleHByZXNzaW9uIGlzIDxzcGFuPjxlbT5jb25ncnVlbnQ8L2VtPjwvc3Bhbj4gd2l0aCBhIGZ1bmN0aW9uCiAgICAgICAgdHlwZSBpZiBib3RoIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6CiAgICAgICAgPGRpdj4KICAgICAgICAgIDx1bCBzdHlsZT0ibGlzdC1zdHlsZS10eXBlOmRpc2MiPgogICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgPHA+VGhlIGZ1bmN0aW9uIHR5cGUgaWRlbnRpZmllcyBhCiAgICAgICAgICAgICAgICBzaW5nbGUgY29tcGlsZS10aW1lIGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlCiAgICAgICAgICAgICAgICByZWZlcmVuY2UuIDwvcD4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgIDxwPiZuYnNwO09uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IDwvcD4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPHVsIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6Y2lyY2xlIj4KICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgIDxwPlRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIDxjb2RlPnZvaWQ8L2NvZGU+LiA8L3A+CiAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICA8cD4mbmJzcDtUaGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgICAgdHlwZSBpcyA8c3Bhbj5SPC9zcGFuPiwgPGI+YW5kIHRoZQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgb2YgYXBwbHlpbmcgY2FwdHVyZSBjb252ZXJzaW9uICg8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2Uvc3BlY3MvamxzL3NlMjUvaHRtbC9qbHMtNS5odG1sI2pscy01LjEuMTAiIHRpdGxlPSI1LjEuMTAuJm5ic3A7Q2FwdHVyZSBDb252ZXJzaW9uIiB0YXJnZXQ9Il9ibGFuayIgbW96LWRvLW5vdC1zZW5kPSJ0cnVlIj7CpzUuMS4xMDwvYT4pCiAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgaW52b2NhdGlvbiB0eXBlICg8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2Uvc3BlY3MvamxzL3NlMjUvaHRtbC9qbHMtMTUuaHRtbCNqbHMtMTUuMTIuMi42IiB0aXRsZT0iMTUuMTIuMi42LiZuYnNwO01ldGhvZCBJbnZvY2F0aW9uIFR5cGUiIHRhcmdldD0iX2JsYW5rIiBtb3otZG8tbm90LXNlbmQ9InRydWUiPsKnMTUuMTIuMi42PC9hPikKICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGNob3NlbiBjb21waWxlLXRpbWUgZGVjbGFyYXRpb24gaXMgPHNwYW4+Ujwvc3Bhbj4nPC9iPiAod2hlcmUgPHNwYW4+Ujwvc3Bhbj4gaXMgdGhlIHRhcmdldCB0eXBlIHRoYXQKICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSB1c2VkIHRvIGluZmVyIDxzcGFuPlI8L3NwYW4+JyksCiAgICAgICAgICAgICAgICAgICAgICBhbmQgbmVpdGhlciA8c3Bhbj5SPC9zcGFuPiBub3IgPHNwYW4+Ujwvc3Bhbj4nIGlzIDxjb2RlPnZvaWQ8L2NvZGU+LAogICAgICAgICAgICAgICAgICAgICAgYW5kIDxzcGFuPlI8L3NwYW4+JyBpcyBjb21wYXRpYmxlCiAgICAgICAgICAgICAgICAgICAgICB3aXRoIDxzcGFuPlI8L3NwYW4+IGluIGFuIGFzc2lnbm1lbnQKICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuIDwvcD4KICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICA8L3VsPgogICAgICAgIDwvZGl2PgogICAgICA8L2Jsb2NrcXVvdGU+CiAgICAKICAgIDxwPkl0IHNlZW1zIGxpa2UgamF2YWMgaXMgbWlzc2luZyB0aGlzIGNhcHR1cmUgY29udmVyc2lvbiBhbmQsCiAgICAgIGJlY2F1c2Ugb2YgdGhhdCwgdGhlIGJlaGF2aW9yIG9mIHRoZSB0d28gZXhhbXBsZXMgZGl2ZXJnZS48L3A+CiAgICA8cD5DaGVlcnM8YnI+CiAgICAgIE1hdXJpemlvPGJyPgogICAgPC9wPgogICAgPHA+PGJyPgogICAgPC9wPgogICAgPHA+PGJyPgogICAgPC9wPgogICAgPHA+PGJyPgogICAgPC9wPgogICAgPHA+PGJyPgogICAgPC9wPgogICAgPGRpdj5PbiAwNy8xMC8yMDI1IDE3OjEyLCBUYWdpciBWYWxlZXYKICAgICAgd3JvdGU6PGJyPgogICAgPC9kaXY+CiAgICA8YmxvY2txdW90ZSB0eXBlPSJjaXRlIj4KICAgICAgCiAgICAgIDxkaXYgZGlyPSJsdHIiPkhlbGxvIQogICAgICAgIDxkaXY+PGJyPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXY+SSdtIGludmVzdGlnYXRpbmcgYSBzZWVtaW5nbHkgd2VpcmQgY29tcGlsYXRpb24gY2FzZS4KICAgICAgICAgIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgSmF2YSBpbnRlcmZhY2U6PC9kaXY+CiAgICAgICAgPGRpdj48YnI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdj5pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOzxicj4KICAgICAgICAgIDxicj4KICAgICAgICAgIGludGVyZmFjZSBNYWluIHs8YnI+CiAgICAgICAgICAmbmJzcDsgJm5ic3A7IGludGVyZmFjZSBYJmx0O1QmZ3Q7IHs8YnI+CiAgICAgICAgICAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgWCZsdDtUJmd0OyBzZWxmKCk7PGJyPgogICAgICAgICAgJm5ic3A7ICZuYnNwOyB9PGJyPgogICAgICAgICAgPGJyPgogICAgICAgICAgJm5ic3A7ICZuYnNwOyBzdGF0aWMgWCZsdDs/Jmd0OyBtYWtlWCgpIHtyZXR1cm4gbnVsbDt9PGJyPgogICAgICAgICAgPGJyPgogICAgICAgICAgJm5ic3A7ICZuYnNwOyBzdGF0aWMgJmx0O1ImZ3Q7IFgmbHQ7UiZndDsgY3JlYXRlKFN1cHBsaWVyJmx0Oz8gZXh0ZW5kcwogICAgICAgICAgUiZndDsgc3VwcGxpZXIpIHtyZXR1cm4gbnVsbDt9PGJyPgogICAgICAgICAgJm5ic3A7PGJyPgogICAgICAgICAgJm5ic3A7ICZuYnNwOyBzdGF0aWMgWCZsdDtYJmx0Oz8mZ3Q7Jmd0OyBtZXRob2RSZWYoKSB7PGJyPgogICAgICAgICAgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IHJldHVybiBjcmVhdGUoTWFpbjo6bWFrZVgpLnNlbGYoKTs8YnI+CiAgICAgICAgICAmbmJzcDsgJm5ic3A7IH08YnI+CiAgICAgICAgICA8YnI+CiAgICAgICAgICAmbmJzcDsgJm5ic3A7IHN0YXRpYyBYJmx0O1gmbHQ7PyZndDsmZ3Q7IGxhbWJkYSgpIHs8YnI+CiAgICAgICAgICAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgcmV0dXJuIGNyZWF0ZSgoKSAtJmd0OyBtYWtlWCgpKS5zZWxmKCk7PGJyPgogICAgICAgICAgJm5ic3A7ICZuYnNwOyB9PGJyPgogICAgICAgICAgfTwvZGl2PgogICAgICAgIDxkaXY+PGJyPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXY+SSBleHBlY3QgdGhhdCBlaXRoZXIgYm90aCBtZXRob2RzICdtZXRob2RSZWYnIGFuZCAnbGFtYmRhJwogICAgICAgICAgc2hvdWxkIGJlIGNvbXBpbGFibGUgb3IgYm90aCBzaG91bGQgYmUgbm9uLWNvbXBpbGFibGUuCiAgICAgICAgICBIb3dldmVyLCB3aGlsZSAnbWV0aG9kUmVmJyBjb21waWxlcywgJ2xhbWJkYScgaXMgcmVqZWN0ZWQgYnkKICAgICAgICAgIGNvbXBpbGVyICh1c2luZyBqYXZhYyZuYnNwO2J1aWxkIDI1KzM2LTM0ODkpOjwvZGl2PgogICAgICAgIDxkaXY+PGJyPgogICAgICAgICAgTWFpbi5qYXZhOjE3OiBlcnJvcjogaW5jb21wYXRpYmxlIHR5cGVzOgogICAgICAgICAgWCZsdDtYJmx0O0NBUCMxJmd0OyZndDsgY2Fubm90IGJlIGNvbnZlcnRlZCB0bwogICAgICAgICAgWCZsdDtYJmx0Oz8mZ3Q7Jmd0Ozxicj4KICAgICAgICAgICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyByZXR1cm4gY3JlYXRlKCgpIC0mZ3Q7IG1ha2VYKCkpLnNlbGYoKTs8YnI+CiAgICAgICAgICAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO148YnI+CiAgICAgICAgICAmbmJzcDsgd2hlcmUgQ0FQIzEgaXMgYSBmcmVzaCB0eXBlLXZhcmlhYmxlOjxicj4KICAgICAgICAgICZuYnNwOyAmbmJzcDsgQ0FQIzEgZXh0ZW5kcyBPYmplY3QgZnJvbSBjYXB0dXJlIG9mID88YnI+CiAgICAgICAgICAxIGVycm9yPGJyPgogICAgICAgICAgZXJyb3I6IGNvbXBpbGF0aW9uIGZhaWxlZDwvZGl2PgogICAgICAgIDxkaXY+PGJyPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXY+Q291bGQgeW91IHBsZWFzZSBoZWxwIG1lIGFuZCBjbGFyaWZ5IHdoZXRoZXIgdGhpcyBpcyBhbgogICAgICAgICAgZXhwZWN0ZWQgYmVoYXZpb3Igb3Igbm90PzwvZGl2PgogICAgICAgIDxkaXY+PGJyPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXY+V2l0aCBiZXN0IHJlZ2FyZHMsPC9kaXY+CiAgICAgICAgPGRpdj5UYWdpciBWYWxlZXY8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Jsb2NrcXVvdGU+CiAgPC9kaXY+Cgo8L2Jsb2NrcXVvdGU+PC9kaXY+Cgo8L2Jsb2NrcXVvdGU+PHVsIGNsYXNzPSJkcm9wZG93bi1tZW51IHRleHRjb21wbGV0ZS1kcm9wZG93biIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgei1pbmRleDogMTAwMDsiIGNvbnRlbnRlZGl0YWJsZT0iZmFsc2UiIHBvcG92ZXI9ImF1dG8iPjwvdWw+">​</div>
</div>
</blockquote></div>