<html>
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div markdown-here-wrapper-content-modified="true" style=""
      class="markdown-here-wrapper" data-md-url="Thunderbird">
      <p style="margin: 0px 0px 1.2em ! important;"></p>
      <div class="markdown-here-exclude">
        <p></p>
        <blockquote
          cite="mid:20160602204903.738387805C@b03ledav004.gho.boulder.ibm.com"
          type="cite">
          <div class="socmaildefaultfont" dir="ltr"
            style="font-family:Arial;font-size:10.5pt">
            <div dir="ltr">
              <div>Brian,<strong> </strong>I see that you mentioned
                that generic instance methods are messier.</div>
              <div>> <tt>The translation for generic instance
                  methods is still somewhat messier (will post
                  separately), but still less messy than if we also had
                  to manage / cache a receiver.</tt></div>
              <div> </div>
              <div>Is this issue part of that mess? Do you have a
                solution, or is this an open issue? I tried making <span
                  style="font-family:courier new,courier,monospace;">m</span>
                species statics with a receiver argument, but that makes
                the invocation non-virtual.</div>
            </div>
          </div>
        </blockquote>
        <p></p>
      </div>
      <p style="margin: 0px 0px 1.2em ! important;"></p>
      <p style="margin: 0px 0px 1.2em ! important;">Here’s some more
        notes on how we might translate generic methods using
        species-static methods and nested classes. </p>
      <h4 style="margin: 1.3em 0px 1em; padding: 0px; font-weight:
        bold;font-size: 1.2em;" id="general-strategy">General strategy</h4>
      <ul style="margin: 1.2em 0px;padding-left: 2em;">
        <li style="margin: 0.5em 0px;">
          <p style="margin: 0px 0px 1.2em ! important;margin: 0.5em 0px
            ! important;">A {static,species,instance} generic method m()
            in <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;">Foo</code>
            is desugared into a species method <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;">m()</code>
            in a {static,species,instance} nested class <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;">Foo$m</code>.</p>
        </li>
        <li style="margin: 0.5em 0px;">
          <p style="margin: 0px 0px 1.2em ! important;margin: 0.5em 0px
            ! important;">The accessibility of the method <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;">m()</code>
            is lifted onto the class <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;">Foo$m</code>.</p>
        </li>
        <li style="margin: 0.5em 0px;">
          <p style="margin: 0px 0px 1.2em ! important;margin: 0.5em 0px
            ! important;">Foo also gets an erased bridge, that redirects
            to the erased invocation of the generic method (binary
            compatibility only.)</p>
        </li>
        <li style="margin: 0.5em 0px;">
          <p style="margin: 0px 0px 1.2em ! important;margin: 0.5em 0px
            ! important;">A generic method is invoked with indy. The
            indy call site statically captures the type parameters for
            the invocation, some representation of the owning class Foo,
            and the method m(). The dynamic argument list captures the
            Foo-valued receiver (for instance methods) and the arguments
            to the generic method.</p>
        </li>
      </ul>
      <h4 style="margin: 1.3em 0px 1em; padding: 0px; font-weight:
        bold;font-size: 1.2em;" id="goals">Goals</h4>
      <ul style="margin: 1.2em 0px;padding-left: 2em;">
        <li style="margin: 0.5em 0px;">
          <p style="margin: 0px 0px 1.2em ! important;margin: 0.5em 0px
            ! important;">Dispatch should be fast :)</p>
        </li>
        <li style="margin: 0.5em 0px;">
          <p style="margin: 0px 0px 1.2em ! important;margin: 0.5em 0px
            ! important;">It would be nice if the name-mangling strategy
            (<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;">Foo$m</code>)
            were private 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;">Foo</code>
            — that it does not appear in bytecode of Foo’s clients or
            subclasses.</p>
        </li>
        <li style="margin: 0.5em 0px;">
          <p style="margin: 0px 0px 1.2em ! important;margin: 0.5em 0px
            ! important;">It would be ideal if we could express what we
            want with bytecode alone, not indy, but that does not seem
            possible in all cases at this time.</p>
        </li>
      </ul>
      <h4 style="margin: 1.3em 0px 1em; padding: 0px; font-weight:
        bold;font-size: 1.2em;" id="static-methods">Static methods</h4>
      <p style="margin: 0px 0px 1.2em ! important;">Given source code:</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;display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); background: rgb(248, 248, 248) none repeat scroll 0% 0%;" class="hljs language-java"><span class="hljs-class"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">class</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">Foo</span><<span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">any</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">T</span>> </span>{
    ACC <span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">static</span><any U> <span class="hljs-function"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">void</span> <span style="color: rgb(153, 0, 0); font-weight: bold;" class="hljs-title">m</span><span class="hljs-params">(U u)</span> </span>{ }
}
</code></pre>
      <p style="margin: 0px 0px 1.2em ! important;">We translate this
        as:</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;display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); background: rgb(248, 248, 248) none repeat scroll 0% 0%;" class="hljs language-java"><span class="hljs-annotation">@Generic</span> <span class="hljs-class"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">class</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">Foo</span> </span>{
    <span style="color: rgb(153, 153, 136); font-style: italic;" class="hljs-comment">// for binary compatibility only</span>
    <where ref T>
    <span class="hljs-annotation">@Bridge</span> <span class="hljs-function">ACC <span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">static</span> <span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">void</span> <span style="color: rgb(153, 0, 0); font-weight: bold;" class="hljs-title">m</span><span class="hljs-params">(Object u)</span> </span>{ Foo.Foo$m<erased>m(u); }

    <span class="hljs-annotation">@Generic</span> ACC <span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">static</span> <span class="hljs-class"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">class</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">Foo</span>$<span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">m</span><<span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">any</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">U</span>> </span>{
        <span class="hljs-function">ACC species <span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">void</span> <span style="color: rgb(153, 0, 0); font-weight: bold;" class="hljs-title">m</span><span class="hljs-params">(U u)</span> </span>{ }
    }
}
</code></pre>
      <p style="margin: 0px 0px 1.2em ! important;">An invocation <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;">Foo.<U>m(u)</code>
        (where U is known statically) can be translated in bytecode as </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;">invokespecies Foo.Foo$m<U>.m(U)
</code></pre>
      <p style="margin: 0px 0px 1.2em ! important;">However, since it
        was a goal to not let the mangled name <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;">Foo$m</code>
        leak into client code, we can easily wrap this with an indy:</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;">invokedynamic GenericStaticMethod[Foo, "m", descriptor, U](u)
              ^bootstrap          ^static args             ^dyn args
</code></pre>
      <p style="margin: 0px 0px 1.2em ! important;">and let the
        bootstrap put together the class name <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;">Foo$m</code>
        from constituent parts (the bootstrap and the compiler share a
        conspiratorial connection, but the client bytecode doesn’t
        participate). Since everything is static at the call site, we
        can link to a <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;">ConstantCallSite</code>
        that always dispatches to an <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;">MH[invokespecies Foo$m<U>.m(U)]</code>.
      </p>
      <h4 style="margin: 1.3em 0px 1em; padding: 0px; font-weight:
        bold;font-size: 1.2em;" id="species-methods">Species methods</h4>
      <p style="margin: 0px 0px 1.2em ! important;">Species-static
        generic methods are translated almost the same way; given class</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;display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); background: rgb(248, 248, 248) none repeat scroll 0% 0%;" class="hljs language-java"><span class="hljs-class"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">class</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">Foo</span><<span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">any</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">T</span>> </span>{
    ACC species<any U> <span class="hljs-function"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">void</span> <span style="color: rgb(153, 0, 0); font-weight: bold;" class="hljs-title">m</span><span class="hljs-params">(T t, U u)</span> </span>{ }
}
</code></pre>
      <p style="margin: 0px 0px 1.2em ! important;">we translate as</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;display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); background: rgb(248, 248, 248) none repeat scroll 0% 0%;" class="hljs language-java"><span class="hljs-annotation">@Generic</span> <span class="hljs-class"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">class</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">Foo</span> </span>{
    <span style="color: rgb(153, 153, 136); font-style: italic;" class="hljs-comment">// for binary compatibility only</span>
    <where ref T>
    <span class="hljs-annotation">@Bridge</span> <span class="hljs-function">ACC species <span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">void</span> <span style="color: rgb(153, 0, 0); font-weight: bold;" class="hljs-title">m</span><span class="hljs-params">(Object t, Object u)</span> </span>{ 
        Foo<erased>.Foo$m<erased>m(t, u); 
    }

    <span class="hljs-annotation">@Generic</span> ACC species <span class="hljs-class"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">class</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">Foo</span>$<span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">m</span><<span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">any</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">U</span>> </span>{
        <span class="hljs-function">ACC species <span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">void</span> <span style="color: rgb(153, 0, 0); font-weight: bold;" class="hljs-title">m</span><span class="hljs-params">(T t, U u)</span> </span>{ }
    }
}
</code></pre>
      <p style="margin: 0px 0px 1.2em ! important;">and an invocation <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;">Foo<T>.<U>m(T,U)</code>
        is translated as</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;">invokespecies Foo<T>.Foo$m<U>.m(T, U)
</code></pre>
      <h4 style="margin: 1.3em 0px 1em; padding: 0px; font-weight:
        bold;font-size: 1.2em;" id="instance-methods">Instance methods</h4>
      <p style="margin: 0px 0px 1.2em ! important;">Our translation
        strategy — desugaring to a helper class — introduces some
        challenges in instance method dispatch. </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;display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); background: rgb(248, 248, 248) none repeat scroll 0% 0%;" class="hljs language-java"><span class="hljs-class"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">class</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">Foo</span><<span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">any</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">T</span>> </span>{
    ACC <any U> <span class="hljs-function"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">void</span> <span style="color: rgb(153, 0, 0); font-weight: bold;" class="hljs-title">m</span><span class="hljs-params">(T t, U u)</span> </span>{ }
}

<span class="hljs-class"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">class</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">Bar</span><<span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">any</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">T</span>> <span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">extends</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">Foo</span><<span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">T</span>> </span>{
    <span class="hljs-annotation">@Override</span> 
    ACC <any U> <span class="hljs-function"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">void</span> <span style="color: rgb(153, 0, 0); font-weight: bold;" class="hljs-title">m</span><span class="hljs-params">(T t, U u)</span> </span>{ }
}
</code></pre>
      <p style="margin: 0px 0px 1.2em ! important;">I am proposing we
        translate this as:</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;display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); background: rgb(248, 248, 248) none repeat scroll 0% 0%;" class="hljs language-java"><span class="hljs-annotation">@Generic</span> <span class="hljs-class"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">class</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">Foo</span> </span>{
    <span style="color: rgb(153, 153, 136); font-style: italic;" class="hljs-comment">// for binary compatibility only</span>
    <where ref T>
    <span class="hljs-annotation">@Bridge</span> <span class="hljs-function">ACC <span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">void</span> <span style="color: rgb(153, 0, 0); font-weight: bold;" class="hljs-title">m</span><span class="hljs-params">(Object t, Object u)</span> </span>{ <span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">this</span>.Foo$m<erased>m(t, u); }

    <span class="hljs-annotation">@Generic</span> ACC species <span class="hljs-class"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">class</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">Foo</span>$<span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">m</span><<span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">any</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">U</span>> </span>{
        <span class="hljs-function">ACC species <span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">void</span> <span style="color: rgb(153, 0, 0); font-weight: bold;" class="hljs-title">m</span><span class="hljs-params">(Foo<T> outer, T t, U u)</span> </span>{ }
    }
}

<span class="hljs-annotation">@Generic</span> <span class="hljs-class"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">class</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">Bar</span> </span>{
    <span style="color: rgb(153, 153, 136); font-style: italic;" class="hljs-comment">// for binary compatibility only</span>
    <where ref T>
    <span class="hljs-annotation">@Bridge</span> <span class="hljs-function">ACC <span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">void</span> <span style="color: rgb(153, 0, 0); font-weight: bold;" class="hljs-title">m</span><span class="hljs-params">(Object t, Object u)</span> </span>{ <span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">this</span>.Bar$m<erased>m(t, u); }

    <span class="hljs-annotation">@Generic</span> ACC species <span class="hljs-class"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">class</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">Bar</span>$<span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">m</span><<span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">any</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">U</span>> </span>{
        <span class="hljs-function">ACC species <span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">void</span> <span style="color: rgb(153, 0, 0); font-weight: bold;" class="hljs-title">m</span><span class="hljs-params">(Bar<T> outer, T t, U u)</span> </span>{ }
    }
}
</code></pre>
      <p style="margin: 0px 0px 1.2em ! important;">In this proposal, <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;">Bar$m</code>
        does not extend <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;">Foo$m</code>;
        this is to avoid leaking dependence on desugaring in subclass
        bytecode. The implementation methods in <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;">Xxx$m</code>
        take an extra “outer” argument, which is the receiver for the
        instance generic method invocation. The use of species-static
        methods for the implementation methods mean that we need not
        maintain instances of Foo$m, but instead can pass the actual Foo<t>
          receiver directly to the implementation. </t></p>
      <p style="margin: 0px 0px 1.2em ! important;">For an invocation:</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<T> f = ...
f.<U>m(t,u)
</code></pre>
      <p style="margin: 0px 0px 1.2em ! important;">We translate with
        indy as:</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;">invokedynamic InstanceStaticMethod[ParamType[Foo,T], "m", descriptor, U](r,t,u)
</code></pre>
      <p style="margin: 0px 0px 1.2em ! important;">The static receiver
        type — here <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;">Foo<T></code>
        — is a static parameter to the bootstrap. Let’s call this class
        SR (the actual target will be <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;">Xxx$m</code>
        where <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;">Xxx</code>
        may be SR or a subclass of SR.) The dynamic receiver (a <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;">Foo<T></code>)
        is passed in the dynamic argument list as <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;">r</code>.
      </p>
      <p style="margin: 0px 0px 1.2em ! important;">The linking of the
        callsite is somewhat complex, but should optimize reasonably
        well. It proceeds as follows: </p>
      <ul style="margin: 1.2em 0px;padding-left: 2em;">
        <li style="margin: 0.5em 0px;">For each (static receiver class,
          method, specialization args) — all static properties of the
          callsite — there is a dispatch table, which is found
          statically at linkage time and stored as part of the callsite
          state;</li>
        <li style="margin: 0.5em 0px;">The dispatch table is a <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;">ClassValue<MethodHandle></code>,
          which maps the dynamic receiver type (a subtype of SR) to a <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;">MethodHandle</code>
          for 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;">invokespecies</code>
          implementation method;</li>
        <li style="margin: 0.5em 0px;">Invocation performs <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;">ClassValue.get(receiver.getClass()).invokeExact(receiver, args)</code></li>
        <li style="margin: 0.5em 0px;">This dispatch can be optionally
          wrapped with a PIC against <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;">receiver.getClass()</code></li>
      </ul>
      <p style="margin: 0px 0px 1.2em ! important;">The first thing the
        bootstrap must do (at linkage time) is compute SR. This is done
        by taking the owner class <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;">Foo<T></code>,
        along with the method name and descriptor, computing the
        name-mangled class <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;">Foo<T>.Foo$m</code>,
        call it SR’. We then take this class and compute <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;">SR=Crass.forSpecialization(SR', U)</code>.
        (Both of these computations are done with the classloader for <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;">Foo<T></code>,
        and we should check that both SR’ and SR share the classloader
        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;">Foo<T></code>.)
        SR corresponds to the fully specialized class <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;">Foo<T>.Foo$m<U></code>.
      </p>
      <p style="margin: 0px 0px 1.2em ! important;">Once we’ve computed
        SR, we have to find the dispatch table for SR, which is a
        multi-step lookup first by <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;">ClassLoader</code>
        (to allow for classloader unloading) and then by SR, which
        results in a <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;">DispatchTable</code>
        mapping a dynamic receiver type <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;">R</code>
        to a fully specialized desugared species-static MH. </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;">class DispatchTable extends ClassValue<MethodHandle> { ... }
class MetaDispatchTable extends ClassValue<DispatchTable> { ... }

private static final WeakHashMap<ClassLoader, MetaDispatchTable> mdt = ...
</code></pre>
      <p style="margin: 0px 0px 1.2em ! important;">We compute <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;">mdt.computeIfAbsent(SR.getClassLoader(), ...).get(SR)</code>
        and store that as <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;">DT</code>
        in 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;">CallSite</code>.
        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;">ClassValue</code>
        implementation for <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;">MetaDispatchTable</code>
        simply creates a new <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;">ClassValue<MH></code>
        entry. </p>
      <p style="margin: 0px 0px 1.2em ! important;">The callsite target
        is linked to the following logic: </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;">Class<?> R = r.getClass();
DT.get(R).invokeExact(r, args)
</code></pre>
      <p style="margin: 0px 0px 1.2em ! important;">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;">computeValue()</code>
        method 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;">DispatchTable</code>
        does the meat of the work. For the receiver type R, we have to
        find the corresponding <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;">Xxx$m</code>
        class, which might be declared in a superclass of R, specialize
        it to the desired method type parameters, and look up
        (findSpecies) the appropriate specialized MH. (Finding the
        corresponding <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;">Xxx$m</code>
        class could be done by walking the hierarchy directly, or by
        doing a <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;">MethodHandle.resolveOrFail</code>
        on the erased bridge.)</p>
      <p style="margin: 0px 0px 1.2em ! important;">The cost of an
        invocation is one <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;">ClassValue</code>
        lookup, plus the overhead of folding the arguments together
        appropriately and doing a MH invoke. The above logic seems
        representable as a single method handle expression using <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;">fold</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;">filter</code>
        combinators, but if not, might also introduce some varargs
        spreading/collecting overhead. (It could be further optimized by
        wrapping the the result of DT.get(R) with a PIC on R.) This
        doesn’t seem so bad. </p>
      <p style="margin: 0px 0px 1.2em ! important;">The first time a
        given target is resolved (a given combination of enclosing <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;">Foo<T></code>,
        <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;">m(...)</code>,
        type arguments U, and receiver class), a relatively expensive
        linkage step is performed — but is then cached in a table
        specific to the members involved, not the call site — so this
        should stabilize quickly. </p>
      <h4 style="margin: 1.3em 0px 1em; padding: 0px; font-weight:
        bold;font-size: 1.2em;" id="interface-methods">Interface methods</h4>
      <p style="margin: 0px 0px 1.2em ! important;">Interface methods
        add an additional layer, but do not change the story
        fundamentally. If I have:</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;display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); background: rgb(248, 248, 248) none repeat scroll 0% 0%;" class="hljs language-java"><span class="hljs-class"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">interface</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">I</span><<span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">any</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">T</span>> </span>{
    ACC <any U> <span class="hljs-function"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">void</span> <span style="color: rgb(153, 0, 0); font-weight: bold;" class="hljs-title">m</span><span class="hljs-params">(T t, U u)</span> </span>{ }
}

<span class="hljs-class"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">class</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">Foo</span><<span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">any</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">T</span>> <span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">implements</span> <span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">I</span><<span style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;" class="hljs-title">T</span>> </span>{
    <span class="hljs-annotation">@Override</span> 
    ACC <any U> <span class="hljs-function"><span style="color: rgb(51, 51, 51); font-weight: bold;" class="hljs-keyword">void</span> <span style="color: rgb(153, 0, 0); font-weight: bold;" class="hljs-title">m</span><span class="hljs-params">(T t, U u)</span> </span>{ }
}
</code></pre>
      <p style="margin: 0px 0px 1.2em ! important;">then we need to
        generate an artifact <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;">I$m</code>
        artifact as we do with classes. When linking an invocation which
        static receiver is a specialization of an interface rather than
        a class, we compute <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;">I$m</code>
        as our SR, and proceed as before. (In this case, our linkage
        strategy should probably use <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;">resolveOrFail</code>
        rather than manual hierarchy walking, so we should probably do
        this in both cases.) Additionally, we may need to do a check
        that 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;">Xxx</code>
        class corresponding to the resolved <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;">Xxx$m</code>
        holder class actually implements <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;">I<T></code>
        — again this can be done at linkage time, not dispatch time. </p>
      <h4 style="margin: 1.3em 0px 1em; padding: 0px; font-weight:
        bold;font-size: 1.2em;" id="default-methods">Default methods</h4>
      <p style="margin: 0px 0px 1.2em ! important;">If we do our
        dispatch using <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;">resolveOrFail</code>
        against the erased bridges, and the method is not implemented in
        the receiver’s superclass hierarchy, then I believe that
        resolution will hand us the MH for the default? If, so, we’re
        good; we resolve to the default, just like any other
        implementation. </p>
      <p style="margin: 0px 0px 1.2em ! important;">One integrity risk
        here is that 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;">Xxx$m</code>
        hierarchy is properly aligned to 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;">Foo</code>
        hierarchy. I think we can validate that (at the time we lazily
        populate the dispatch table) simply by checking that the
        resolved erased target <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;">Xxx.m()</code>
        and the corresponding specialized class <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;">Xxx$m.m()</code>
        share a nest (and hence derive from the same source class.) </p>
      <div
title="MDH:PGJyPsKgPGJsb2NrcXVvdGUgY2l0ZT0ibWlkOjIwMTYwNjAyMjA0OTAzLjczODM4NzgwNUNAYjAzbGVkYXYwMDQuZ2hvLmJvdWxkZXIuaWJtLmNvbSIgdHlwZT0iY2l0ZSI+PGRpdiBjbGFzcz0ic29j
bWFpbGRlZmF1bHRmb250IiBkaXI9Imx0ciIgc3R5bGU9ImZvbnQtZmFtaWx5OkFyaWFsO2ZvbnQt
c2l6ZToxMC41cHQiPjxkaXYgZGlyPSJsdHIiPgo8ZGl2PkJyaWFuLDxzdHJvbmc+IDwvc3Ryb25n
Pkkgc2VlIHRoYXQgeW91IG1lbnRpb25lZCB0aGF0IGdlbmVyaWMgaW5zdGFuY2UgbWV0aG9kcyBh
cmUgbWVzc2llci48L2Rpdj4KPGRpdj4mZ3Q7IDx0dD5UaGUgdHJhbnNsYXRpb24gZm9yIGdlbmVy
aWMgaW5zdGFuY2UgbWV0aG9kcyBpcyBzdGlsbCBzb21ld2hhdCBtZXNzaWVyICh3aWxsIHBvc3Qg
c2VwYXJhdGVseSksIGJ1dCBzdGlsbCBsZXNzIG1lc3N5IHRoYW4gaWYgd2UgYWxzbyBoYWQgdG8g
bWFuYWdlIC8gY2FjaGUgYSByZWNlaXZlci48L3R0PjwvZGl2Pgo8ZGl2PiZuYnNwOzwvZGl2Pgo8
ZGl2PklzIHRoaXMgaXNzdWUgcGFydCBvZiB0aGF0IG1lc3M/IERvIHlvdSBoYXZlIGEgc29sdXRp
b24sIG9yIGlzIHRoaXMgYW4gb3BlbiBpc3N1ZT8gSSB0cmllZCBtYWtpbmcgPHNwYW4gc3R5bGU9
ImZvbnQtZmFtaWx5OmNvdXJpZXIgbmV3LGNvdXJpZXIsbW9ub3NwYWNlOyI+bTwvc3Bhbj4gc3Bl
Y2llcyBzdGF0aWNzIHdpdGggYSByZWNlaXZlciBhcmd1bWVudCwgYnV0IHRoYXQgbWFrZXMgdGhl
IGludm9jYXRpb24gbm9uLXZpcnR1YWwuPC9kaXY+PC9kaXY+PC9kaXY+PC9ibG9ja3F1b3RlPjxi
cj5IZXJlJ3Mgc29tZSBub3RlcyBvbiBob3cgd2UgbWlnaHQgdHJhbnNsYXRlIGdlbmVyaWMgbWV0
aG9kcyB1c2luZyBzcGVjaWVzLXN0YXRpYyBtZXRob2RzIGFuZCBuZXN0ZWQtY2xhc3Nlcy7CoCA8
YnI+PGJyPjxkaXYgY2xhc3M9Im1vei10ZXh0LWh0bWwiIGxhbmc9IngtdW5pY29kZSI+PHR0PiMj
IyMgR2VuZXJhbCBzdHJhdGVneTwvdHQ+PHR0Pjxicj48L3R0Pjx0dD48YnI+PC90dD48dHQ+Jm5i
c3A7LSBBIHtzdGF0aWMsc3BlY2llcyxpbnN0YW5jZX0gZ2VuZXJpYyBtZXRob2QgbSgpIGluIGBG
b29gIGlzIGRlc3VnYXJlZCBpbnRvIGEgc3BlY2llcyBtZXRob2QgYG0oKWAgaW4gYSB7c3RhdGlj
LHNwZWNpZXMsaW5zdGFuY2V9IG5lc3RlZCBjbGFzcyBgRm9vJG1gLjwvdHQ+PHR0Pjxicj48L3R0
Pjx0dD48YnI+PC90dD48dHQ+Jm5ic3A7LSBUaGUgYWNjZXNzaWJpbGl0eSBvZiB0aGUgbWV0aG9k
IGBtKClgIGlzIGxpZnRlZCBvbnRvIHRoZSBjbGFzcyBgRm9vJG1gLjwvdHQ+PHR0Pjxicj48L3R0
Pjx0dD48YnI+PC90dD48dHQ+Jm5ic3A7LSBGb28gYWxzbyBnZXRzIGFuIGVyYXNlZCBicmlkZ2Us
IHRoYXQgcmVkaXJlY3RzIHRvIHRoZSBlcmFzZWQgaW52b2NhdGlvbiBvZiB0aGUgZ2VuZXJpYyBt
ZXRob2QgKGJpbmFyeSBjb21wYXRpYmlsaXR5IG9ubHkuKTwvdHQ+PHR0Pjxicj48L3R0Pjx0dD48
YnI+PC90dD48dHQ+PHR0PiZuYnNwOy0gPC90dD5BIGdlbmVyaWMgbWV0aG9kIGlzIGludm9rZWQg
d2l0aCBpbmR5LiBUaGUgaW5keSBjYWxsIHNpdGUgc3RhdGljYWxseSBjYXB0dXJlcyB0aGUgdHlw
ZSBwYXJhbWV0ZXJzIGZvciB0aGUgaW52b2NhdGlvbiwgc29tZSByZXByZXNlbnRhdGlvbiBvZiB0
aGUgb3duaW5nIGNsYXNzIEZvbywgYW5kIHRoZSBtZXRob2QgbSgpLiBUaGUgZHluYW1pYyBhcmd1
bWVudCBsaXN0IGNhcHR1cmVzIHRoZSBGb28tdmFsdWVkIHJlY2VpdmVyIChmb3IgaW5zdGFuY2Ug
bWV0aG9kcykgYW5kIHRoZSBhcmd1bWVudHMgdG8gdGhlIGdlbmVyaWMgbWV0aG9kLjwvdHQ+PHR0
Pjxicj48L3R0Pjx0dD48YnI+PC90dD48dHQ+IyMjIyBHb2FsczwvdHQ+PHR0Pjxicj48L3R0Pjx0
dD48YnI+PC90dD48dHQ+PHR0PiZuYnNwOy0gPC90dD5EaXNwYXRjaCBzaG91bGQgYmUgZmFzdCA6
KTwvdHQ+PHR0Pjxicj48L3R0Pjx0dD48YnI+PC90dD48dHQ+PHR0PiZuYnNwOy0gPC90dD5JdCB3
b3VsZCBiZSBuaWNlIGlmIHRoZSBuYW1lLW1hbmdsaW5nIHN0cmF0ZWd5IChgRm9vJG1gKSB3ZXJl
IHByaXZhdGUgdG8gYEZvb2Ag4oCUIHRoYXQgaXQgZG9lcyBub3QgYXBwZWFyIGluIGJ5dGVjb2Rl
IG9mIEZvb+KAmXMgY2xpZW50cyBvciBzdWJjbGFzc2VzLjwvdHQ+PHR0Pjxicj48L3R0Pjx0dD48
YnI+PC90dD48dHQ+PHR0PiZuYnNwOy0gPC90dD5JdCB3b3VsZCBiZSBpZGVhbCBpZiB3ZSBjb3Vs
ZCBleHByZXNzIHdoYXQgd2Ugd2FudCB3aXRoIGJ5dGVjb2RlIGFsb25lLCBub3QgaW5keSwgYnV0
IHRoYXQgZG9lcyBub3Qgc2VlbSBwb3NzaWJsZSBpbiBhbGwgY2FzZXMgYXQgdGhpcyB0aW1lLjwv
dHQ+PHR0Pjxicj48L3R0Pjx0dD48YnI+PGJyPiMjIyMgU3RhdGljIG1ldGhvZHM8YnI+PGJyPkdp
dmVuIHNvdXJjZSBjb2RlOjxicj48YnI+YGBgamF2YTxicj5jbGFzcyBGb28mbHQ7YW55IFQmZ3Q7
IHs8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IEFDQyBzdGF0aWMmbHQ7YW55IFUmZ3Q7IHZvaWQgbShV
IHUpIHsgfTxicj59PGJyPmBgYDxicj48YnI+V2UgdHJhbnNsYXRlIHRoaXMgYXM6PGJyPjxicj48
L3R0Pjx0dD5gYGBqYXZhPGJyPkBHZW5lcmljIGNsYXNzIEZvbyB7PGJyPiZuYnNwOyZuYnNwOyZu
YnNwOyAvLyBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgb25seTxicj48L3R0Pjx0dD48dHQ+Jm5i
c3A7Jm5ic3A7Jm5ic3A7ICZsdDt3aGVyZSByZWYgVCZndDs8YnI+PC90dD4mbmJzcDsmbmJzcDsm
bmJzcDsgQEJyaWRnZSA8L3R0Pjx0dD48dHQ+QUNDIDwvdHQ+c3RhdGljIHZvaWQgbShPYmplY3Qg
dSkgeyBGb28uRm9vJG0mbHQ7ZXJhc2VkJmd0O20odSk7IH08YnI+PGJyPiZuYnNwOyZuYnNwOyZu
YnNwOyBAR2VuZXJpYyA8L3R0Pjx0dD48dHQ+QUNDIDwvdHQ+c3RhdGljIGNsYXNzIEZvbyRtJmx0
O2FueSBVJmd0OyB7PGJyPjwvdHQ+PHR0Pjx0dD4mbmJzcDsgJm5ic3A7Jm5ic3A7ICZuYnNwOyZu
YnNwOyA8L3R0PjwvdHQ+PHR0Pjx0dD48dHQ+QUNDIDwvdHQ+c3BlY2llcyB2b2lkIG0oVSB1KSB7
IH08YnI+PC90dD4mbmJzcDsmbmJzcDsmbmJzcDsgfTxicj59PGJyPmBgYDxicj48YnI+QW4gaW52
b2NhdGlvbiBgRm9vLiZsdDtVJmd0O20odSlgICh3aGVyZSBVIGlzIGtub3duIHN0YXRpY2FsbHkp
IGNhbiBiZSB0cmFuc2xhdGVkIGluIGJ5dGVjb2RlIGFzIDxicj48YnI+Jm5ic3A7Jm5ic3A7Jm5i
c3A7IGludm9rZXNwZWNpZXMgRm9vLkZvbyRtJmx0O1UmZ3Q7Lm0oVSk8YnI+PGJyPkhvd2V2ZXIs
IHNpbmNlIGl0IHdhcyBhIGdvYWwgdG8gbm90IGxldCB0aGUgbWFuZ2xlZCBuYW1lIGBGb28kbWAg
bGVhayBpbnRvIGNsaWVudCBjb2RlLCB3ZSBjYW4gZWFzaWx5IHdyYXAgdGhpcyB3aXRoIGFuIGlu
ZHk6PGJyPjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgaW52b2tlZHluYW1pYyBHZW5lcmljU3RhdGlj
TWV0aG9kW0ZvbywgIm0iLCBkZXNjcmlwdG9yLCBVXSh1KTxicj4mbmJzcDsmbmJzcDsmbmJzcDsm
bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgXmJvb3RzdHJhcCZuYnNwOyZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBec3RhdGljIGFyZ3MmbmJzcDsmbmJz
cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
bmJzcDsgXmR5biBhcmdzPGJyPjxicj5hbmQgbGV0IHRoZSBib290c3RyYXAgcHV0IHRvZ2V0aGVy
IHRoZSBjbGFzcyBuYW1lIGBGb28kbWAgZnJvbSBjb25zdGl0dWVudCBwYXJ0cyAodGhlIGJvb3Rz
dHJhcCBhbmQgdGhlIGNvbXBpbGVyIHNoYXJlIGEgY29uc3BpcmF0b3JpYWwgY29ubmVjdGlvbiwg
YnV0IHRoZSBjbGllbnQgYnl0ZWNvZGUgZG9lc24ndCBwYXJ0aWNpcGF0ZSkuJm5ic3A7IFNpbmNl
IGV2ZXJ5dGhpbmcgaXMgc3RhdGljIGF0IHRoZSBjYWxsIHNpdGUsIHdlIGNhbiBsaW5rIHRvIGEg
YENvbnN0YW50Q2FsbFNpdGVgIHRoYXQgYWx3YXlzIGRpc3BhdGNoZXMgdG8gYW4gYE1IW2ludm9r
ZXNwZWNpZXMgRm9vJG0mbHQ7VSZndDsubShVKV1gLiZuYnNwOyA8YnI+PGJyPjwvdHQ+PGJyPjx0
dD4jIyMjIFNwZWNpZXMgbWV0aG9kczxicj48YnI+U3BlY2llcy1zdGF0aWMgZ2VuZXJpYyBtZXRo
b2RzIGFyZSB0cmFuc2xhdGVkIGFsbW9zdCB0aGUgc2FtZSB3YXk7IGdpdmVuIGNsYXNzPGJyPjxi
cj48L3R0Pjx0dD5gYGBqYXZhPGJyPmNsYXNzIEZvbyZsdDthbnkgVCZndDsgezxicj4mbmJzcDsm
bmJzcDsmbmJzcDsgQUNDIHNwZWNpZXMmbHQ7YW55IFUmZ3Q7IHZvaWQgbShUIHQsIFUgdSkgeyB9
PGJyPn08YnI+YGBgPGJyPjxicj53ZSB0cmFuc2xhdGUgYXM8YnI+PGJyPjwvdHQ+PHR0PmBgYGph
dmE8YnI+QEdlbmVyaWMgY2xhc3MgRm9vIHs8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIGZvciBi
aW5hcnkgY29tcGF0aWJpbGl0eSBvbmx5PGJyPjwvdHQ+PHR0Pjx0dD4mbmJzcDsmbmJzcDsmbmJz
cDsgJmx0O3doZXJlIHJlZiBUJmd0Ozxicj48L3R0PiZuYnNwOyZuYnNwOyZuYnNwOyBAQnJpZGdl
IDwvdHQ+PHR0Pjx0dD5BQ0MgPC90dD5zcGVjaWVzIHZvaWQgbShPYmplY3QgdCwgT2JqZWN0IHUp
IHsgPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBGb28mbHQ7
ZXJhc2VkJmd0Oy5Gb28kbSZsdDtlcmFzZWQmZ3Q7bSh0LCB1KTsgPGJyPiZuYnNwOyZuYnNwOyZu
YnNwOyB9PGJyPjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgQEdlbmVyaWMgPC90dD48dHQ+PHR0PkFD
QyA8L3R0PnNwZWNpZXMgY2xhc3MgRm9vJG0mbHQ7YW55IFUmZ3Q7IHs8YnI+PC90dD48dHQ+PHR0
PiZuYnNwOyAmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7IDwvdHQ+PC90dD48dHQ+PHR0Pjx0dD5B
Q0MgPC90dD5zcGVjaWVzIHZvaWQgbShUIHQsIFUgdSkgeyB9PGJyPjwvdHQ+Jm5ic3A7Jm5ic3A7
Jm5ic3A7IH08YnI+fTxicj5gYGA8YnI+PGJyPmFuZCBhbiBpbnZvY2F0aW9uIGBGb28mbHQ7VCZn
dDsuJmx0O1UmZ3Q7bShULFUpYCBpcyB0cmFuc2xhdGVkIGFzPGJyPjwvdHQ+PHR0Pjxicj4mbmJz
cDsmbmJzcDsmbmJzcDsgaW52b2tlc3BlY2llcyBGb28mbHQ7VCZndDsuRm9vJG0mbHQ7VSZndDsu
bShULCBVKTxicj48YnI+PGJyPiMjIyMgSW5zdGFuY2UgbWV0aG9kczxicj48YnI+T3VyIHRyYW5z
bGF0aW9uIHN0cmF0ZWd5IC0tIGRlc3VnYXJpbmcgdG8gYSBoZWxwZXIgY2xhc3MgLS0gaW50cm9k
dWNlcyBzb21lIGNoYWxsZW5nZXMgaW4gaW5zdGFuY2UgbWV0aG9kIGRpc3BhdGNoLiZuYnNwOyA8
YnI+PC90dD48YnI+PHR0Pjx0dD5gYGBqYXZhPGJyPmNsYXNzIEZvbyZsdDthbnkgVCZndDsgezxi
cj4mbmJzcDsmbmJzcDsmbmJzcDsgPC90dD48L3R0Pjx0dD48dHQ+PHR0PkFDQyA8L3R0PiZsdDth
bnkgVSZndDsgdm9pZCBtKFQgdCwgVSB1KSB7IH08YnI+fTxicj48L3R0PjwvdHQ+PGJyPjx0dD48
dHQ+PHR0Pjx0dD5jbGFzcyBCYXImbHQ7YW55IFQmZ3Q7IGV4dGVuZHMgRm9vJmx0O1QmZ3Q7IHs8
YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IEBPdmVycmlkZSA8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwv
dHQ+PC90dD48L3R0PjwvdHQ+PHR0Pjx0dD48dHQ+PHR0Pjx0dD5BQ0MgPC90dD4mbHQ7YW55IFUm
Z3Q7IHZvaWQgbShUIHQsIFUgdSkgeyB9PGJyPn08YnI+PC90dD48L3R0PmBgYDxicj48L3R0Pjxi
cj5JIGFtIHByb3Bvc2luZyB3ZSB0cmFuc2xhdGUgdGhpcyBhczo8YnI+PC90dD48dHQ+PHR0Pjxi
cj48L3R0Pjx0dD5gYGBqYXZhPGJyPkBHZW5lcmljIGNsYXNzIEZvbyB7PGJyPiZuYnNwOyZuYnNw
OyZuYnNwOyAvLyBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgb25seTxicj48L3R0PjwvdHQ+PHR0
Pjx0dD48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDt3aGVyZSByZWYgVCZndDs8YnI+PC90dD4m
bmJzcDsmbmJzcDsmbmJzcDsgQEJyaWRnZSA8L3R0PjwvdHQ+PHR0Pjx0dD48dHQ+QUNDIDwvdHQ+
dm9pZCBtKE9iamVjdCB0LCBPYmplY3QgdSkgeyB0aGlzLkZvbyRtJmx0O2VyYXNlZCZndDttKHQs
IHUpOyB9PGJyPjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgQEdlbmVyaWMgPC90dD48L3R0Pjx0dD48
dHQ+PHR0PkFDQyA8L3R0PnNwZWNpZXMgY2xhc3MgRm9vJG0mbHQ7YW55IFUmZ3Q7IHs8YnI+PC90
dD48dHQ+PHR0PiZuYnNwOyAmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7IDwvdHQ+PC90dD48L3R0
Pjx0dD48dHQ+PHR0Pjx0dD5BQ0MgPC90dD5zcGVjaWVzIHZvaWQgbShGb28mbHQ7VCZndDsgb3V0
ZXIsIFQgdCwgVSB1KSB7IH08YnI+PC90dD4mbmJzcDsmbmJzcDsmbmJzcDsgfTxicj59PGJyPjwv
dHQ+PC90dD48dHQ+PHR0Pjx0dD48dHQ+PGJyPkBHZW5lcmljIGNsYXNzIEJhciB7PGJyPiZuYnNw
OyZuYnNwOyZuYnNwOyAvLyBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgb25seTxicj48L3R0Pjwv
dHQ+PHR0Pjx0dD48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDt3aGVyZSByZWYgVCZndDs8YnI+
PC90dD4mbmJzcDsmbmJzcDsmbmJzcDsgQEJyaWRnZSA8L3R0PjwvdHQ+PHR0Pjx0dD48dHQ+QUND
IDwvdHQ+dm9pZCBtKE9iamVjdCB0LCBPYmplY3QgdSkgeyB0aGlzLkJhciRtJmx0O2VyYXNlZCZn
dDttKHQsIHUpOyB9PGJyPjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgQEdlbmVyaWMgPC90dD48L3R0
Pjx0dD48dHQ+PHR0PkFDQyA8L3R0PnNwZWNpZXMgY2xhc3MgQmFyJG0mbHQ7YW55IFUmZ3Q7IHs8
YnI+PC90dD48dHQ+PHR0PiZuYnNwOyAmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7IDwvdHQ+PC90
dD48L3R0Pjx0dD48dHQ+PHR0Pjx0dD5BQ0MgPC90dD5zcGVjaWVzIHZvaWQgbShCYXImbHQ7VCZn
dDsgb3V0ZXIsIFQgdCwgVSB1KSB7IH08YnI+PC90dD4mbmJzcDsmbmJzcDsmbmJzcDsgfTxicj59
PGJyPjwvdHQ+PC90dD5gYGA8L3R0Pjxicj5JbiB0aGlzIHByb3Bvc2FsLCBgQmFyJG1gIGRvZXMg
bm90IGV4dGVuZCBgRm9vJG1gOyB0aGlzIGlzIHRvIGF2b2lkIGxlYWtpbmcgZGVwZW5kZW5jZSBv
biBkZXN1Z2FyaW5nIGluIHN1YmNsYXNzIGJ5dGVjb2RlLiZuYnNwOyBUaGUgaW1wbGVtZW50YXRp
b24gbWV0aG9kcyBpbiBgWHh4JG1gIHRha2UgYW4gZXh0cmEgIm91dGVyIiBhcmd1bWVudCwgd2hp
Y2ggaXMgdGhlIHJlY2VpdmVyIGZvciB0aGUgaW5zdGFuY2UgZ2VuZXJpYyBtZXRob2QgaW52b2Nh
dGlvbi4mbmJzcDsgVGhlIHVzZSBvZiBzcGVjaWVzLXN0YXRpYyBtZXRob2RzIGZvciB0aGUgaW1w
bGVtZW50YXRpb24gbWV0aG9kcyBtZWFuIHRoYXQgd2UgbmVlZCBub3QgbWFpbnRhaW4gaW5zdGFu
Y2VzIG9mIEZvbyRtLCBidXQgaW5zdGVhZCBjYW4gcGFzcyB0aGUgYWN0dWFsIEZvbyZsdDtUJmd0
OyByZWNlaXZlciBkaXJlY3RseSB0byB0aGUgaW1wbGVtZW50YXRpb24uJm5ic3A7IDxicj48YnI+
Rm9yIGFuIGludm9jYXRpb246PGJyPjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgRm9vJmx0O1QmZ3Q7
IGYgPSAuLi48YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGYuJmx0O1UmZ3Q7bSh0LHUpPGJyPjxicj5X
ZSB0cmFuc2xhdGUgd2l0aCBpbmR5IGFzOjxicj48YnI+PC90dD48dHQ+PHR0PiZuYnNwOyZuYnNw
OyZuYnNwOyBpbnZva2VkeW5hbWljIEluc3RhbmNlU3RhdGljTWV0aG9kW1BhcmFtVHlwZVtGb28s
VF0sICJtIiwgZGVzY3JpcHRvciwgVV0ocix0LHUpPGJyPjwvdHQ+PGJyPjwvdHQ+PHR0Pjx0dD5U
aGUgc3RhdGljIHJlY2VpdmVyIHR5cGUgLS0gaGVyZSBgRm9vJmx0O1QmZ3Q7YCAtLSBpcyBhIHN0
YXRpYyAKcGFyYW1ldGVyIHRvIHRoZSBib290c3RyYXAuJm5ic3A7IExldCdzIGNhbGwgdGhpcyBj
bGFzcyBTUiAodGhlIGFjdHVhbCB0YXJnZXQKIHdpbGwgYmUgYFh4eCRtYCB3aGVyZSBgWHh4YCBt
YXkgYmUgU1Igb3IgYSBzdWJjbGFzcyBvZiBTUi4pJm5ic3A7IFRoZSBkeW5hbWljIHJlY2VpdmVy
IChhIGBGb28mbHQ7VCZndDtgKSBpcyBwYXNzZWQgaW4gdGhlIGR5bmFtaWMgYXJndW1lbnQgbGlz
dCBhcyBgcmAuJm5ic3A7IDxicj4KPGJyPjwvdHQ+VGhlIGxpbmtpbmcgb2YgdGhlIGNhbGxzaXRl
IGlzIHNvbWV3aGF0IGNvbXBsZXgsIGJ1dCBzaG91bGQgb3B0aW1pemUgcmVhc29uYWJseSB3ZWxs
LiZuYnNwOyBJdCBwcm9jZWVkcyBhcyBmb2xsb3dzOiA8YnI+Jm5ic3A7LSBGb3IgZWFjaCAoc3Rh
dGljIHJlY2VpdmVyIGNsYXNzLCBtZXRob2QsIHNwZWNpYWxpemF0aW9uIGFyZ3MpIC0tIGFsbCBz
dGF0aWMgcHJvcGVydGllcyBvZiB0aGUgY2FsbHNpdGUgLS0gdGhlcmUgaXMgYSBkaXNwYXRjaCB0
YWJsZSwgd2hpY2ggaXMgZm91bmQgc3RhdGljYWxseSBhdCBsaW5rYWdlIHRpbWUgYW5kIHN0b3Jl
ZCBhcyBwYXJ0IG9mIHRoZSBjYWxsc2l0ZSBzdGF0ZTs8YnI+Jm5ic3A7LSBUaGUgZGlzcGF0Y2gg
dGFibGUgaXMgYSBgQ2xhc3NWYWx1ZSZsdDtNZXRob2RIYW5kbGUmZ3Q7YCwgd2hpY2ggbWFwcyB0
aGUgZHluYW1pYyByZWNlaXZlciB0eXBlIChhIHN1YnR5cGUgb2YgU1IpIHRvIGEgYE1ldGhvZEhh
bmRsZWAgZm9yIHRoZSBgaW52b2tlc3BlY2llc2AgaW1wbGVtZW50YXRpb24gbWV0aG9kOzxicj4m
bmJzcDstIEludm9jYXRpb24gcGVyZm9ybXMgYENsYXNzVmFsdWUuZ2V0KHJlY2VpdmVyLmdldENs
YXNzKCkpLmludm9rZUV4YWN0KHJlY2VpdmVyLCBhcmdzKWA8YnI+Jm5ic3A7LSBUaGlzIGRpc3Bh
dGNoIGNhbiBiZSBvcHRpb25hbGx5IHdyYXBwZWQgd2l0aCBhIFBJQyBhZ2FpbnN0IGByZWNlaXZl
ci5nZXRDbGFzcygpYDxicj48YnI+VGhlIGZpcnN0IHRoaW5nIHRoZSBib290c3RyYXAgbXVzdCBk
byAoYXQgbGlua2FnZSB0aW1lKSBpcyBjb21wdXRlIFNSLiZuYnNwOyBUaGlzIGlzIGRvbmUgYnkg
dGFraW5nIHRoZSBvd25lciBjbGFzcyBgRm9vJmx0O1QmZ3Q7YCwgYWxvbmcgd2l0aCB0aGUgbWV0
aG9kIG5hbWUgYW5kIGRlc2NyaXB0b3IsIGNvbXB1dGluZyB0aGUgbmFtZS1tYW5nbGVkIGNsYXNz
IGBGb28mbHQ7VCZndDsuRm9vJG1gLCBjYWxsIGl0IFNSJy4mbmJzcDsgV2UgdGhlbiB0YWtlIHRo
aXMgY2xhc3MgYW5kIGNvbXB1dGUgYFNSPUNyYXNzLmZvclNwZWNpYWxpemF0aW9uKFNSJywgVSlg
LiZuYnNwOyAoQm90aCBvZiB0aGVzZSBjb21wdXRhdGlvbnMgYXJlIGRvbmUgd2l0aCB0aGUgY2xh
c3Nsb2FkZXIgZm9yIGBGb28mbHQ7VCZndDtgLCBhbmQgd2Ugc2hvdWxkIGNoZWNrIHRoYXQgYm90
aCBTUicgYW5kIFNSIHNoYXJlIHRoZSBjbGFzc2xvYWRlciB3aXRoIGBGb28mbHQ7VCZndDtgLikm
bmJzcDsgU1IgY29ycmVzcG9uZHMgdG8gdGhlIGZ1bGx5IHNwZWNpYWxpemVkIGNsYXNzIGBGb28m
bHQ7VCZndDsuRm9vJG0mbHQ7VSZndDtgLiZuYnNwOyA8YnI+PGJyPk9uY2Ugd2UndmUgY29tcHV0
ZWQgU1IsIHdlIGhhdmUgdG8gZmluZCB0aGUgZGlzcGF0Y2ggdGFibGUgZm9yIFNSLCB3aGljaCBp
cyBhIG11bHRpLXN0ZXAgbG9va3VwIGZpcnN0IGJ5IGBDbGFzc0xvYWRlcmAgKHRvIGFsbG93IGZv
ciBjbGFzc2xvYWRlciB1bmxvYWRpbmcpIGFuZCB0aGVuIGJ5IFNSLCB3aGljaCByZXN1bHRzIGlu
IGEgYERpc3BhdGNoVGFibGVgIG1hcHBpbmcgYSBkeW5hbWljIHJlY2VpdmVyIHR5cGUgYFJgIHRv
IGEgZnVsbHkgc3BlY2lhbGl6ZWQgZGVzdWdhcmVkIHNwZWNpZXMtc3RhdGljIE1ILiZuYnNwOyA8
YnI+PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBjbGFzcyBEaXNwYXRjaFRhYmxlIGV4dGVuZHMgQ2xh
c3NWYWx1ZSZsdDtNZXRob2RIYW5kbGUmZ3Q7IHsgLi4uIH08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7
IGNsYXNzIE1ldGFEaXNwYXRjaFRhYmxlIGV4dGVuZHMgQ2xhc3NWYWx1ZSZsdDtEaXNwYXRjaFRh
YmxlJmd0OyB7IC4uLiB9PGJyPjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgcHJpdmF0ZSBzdGF0aWMg
ZmluYWwgV2Vha0hhc2hNYXAmbHQ7Q2xhc3NMb2FkZXIsIE1ldGFEaXNwYXRjaFRhYmxlJmd0OyBt
ZHQgPSAuLi48YnI+PGJyPldlIGNvbXB1dGUgYG1kdC5jb21wdXRlSWZBYnNlbnQoU1IuZ2V0Q2xh
c3NMb2FkZXIoKSwgLi4uKS5nZXQoU1IpYCBhbmQgc3RvcmUgdGhhdCBhcyBgRFRgIGluIHRoZSBg
Q2FsbFNpdGVgLiZuYnNwOyBUaGUgYENsYXNzVmFsdWVgIGltcGxlbWVudGF0aW9uIGZvciBgTWV0
YURpc3BhdGNoVGFibGVgIHNpbXBseSBjcmVhdGVzIGEgbmV3IGBDbGFzc1ZhbHVlJmx0O01IJmd0
O2AgZW50cnkuJm5ic3A7IDxicj48YnI+VGhlIGNhbGxzaXRlIHRhcmdldCBpcyBsaW5rZWQgdG8g
dGhlIGZvbGxvd2luZyBsb2dpYzogPGJyPjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgQ2xhc3MmbHQ7
PyZndDsgUiA9IHIuZ2V0Q2xhc3MoKTs8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IERULmdldChSKS5p
bnZva2VFeGFjdChyLCBhcmdzKTxicj48YnI+VGhlIGBjb21wdXRlVmFsdWUoKWAgbWV0aG9kIG9m
IGBEaXNwYXRjaFRhYmxlYCBkb2VzIHRoZSBtZWF0IG9mIHRoZSB3b3JrLiZuYnNwOyBGb3IgdGhl
IHJlY2VpdmVyIHR5cGUgUiwgd2UgaGF2ZSB0byBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGBYeHgk
bWAgY2xhc3MsIHdoaWNoIG1pZ2h0IGJlIGRlY2xhcmVkIGluIGEgc3VwZXJjbGFzcyBvZiBSLCBz
cGVjaWFsaXplIGl0IHRvIHRoZSBkZXNpcmVkIG1ldGhvZCB0eXBlIHBhcmFtZXRlcnMsIGFuZCBs
b29rIHVwIChmaW5kU3BlY2llcykgdGhlIGFwcHJvcHJpYXRlIHNwZWNpYWxpemVkIE1ILiZuYnNw
OyAoRmluZGluZyB0aGUgY29ycmVzcG9uZGluZyBgWHh4JG1gIGNsYXNzIGNvdWxkIGJlIGRvbmUg
Ynkgd2Fsa2luZyB0aGUgaGllcmFyY2h5IGRpcmVjdGx5LCBvciBieSBkb2luZyBhIGBNZXRob2RI
YW5kbGUucmVzb2x2ZU9yRmFpbGAgb24gdGhlIGVyYXNlZCBicmlkZ2UuKTxicj48YnI+PC90dD48
dHQ+VGhlIGNvc3Qgb2YgYW4gaW52b2NhdGlvbiBpcyBvbmUgYENsYXNzVmFsdWVgIGxvb2t1cCwg
cGx1cyB0aGUgb3ZlcmhlYWQgb2YgZm9sZGluZyB0aGUgYXJndW1lbnRzIHRvZ2V0aGVyIGFwcHJv
cHJpYXRlbHkgYW5kIGRvaW5nIGEgTUggaW52b2tlLiZuYnNwOyBUaGUgYWJvdmUgbG9naWMgc2Vl
bXMgcmVwcmVzZW50YWJsZSBhcyBhIHNpbmdsZSBtZXRob2QgaGFuZGxlIGV4cHJlc3Npb24gdXNp
bmcgYGZvbGRgIGFuZCBgZmlsdGVyYCBjb21iaW5hdG9ycywgYnV0IGlmIG5vdCwgbWlnaHQgYWxz
byBpbnRyb2R1Y2Ugc29tZSB2YXJhcmdzIHNwcmVhZGluZy9jb2xsZWN0aW5nIG92ZXJoZWFkLiZu
YnNwOyAoSXQgY291bGQgYmUgZnVydGhlciBvcHRpbWl6ZWQgYnkgd3JhcHBpbmcgdGhlIHRoZSBy
ZXN1bHQgb2YgRFQuZ2V0KFIpIHdpdGggYSBQSUMgb24gUi4pJm5ic3A7IFRoaXMgZG9lc24ndCBz
ZWVtIHNvIGJhZC4mbmJzcDsgPGJyPjxicj5UaGUgZmlyc3QgdGltZSBhIGdpdmVuIHRhcmdldCBp
cyByZXNvbHZlZCAoYSBnaXZlbiBjb21iaW5hdGlvbiBvZiBlbmNsb3NpbmcgYEZvbyZsdDtUJmd0
O2AsIGBtKC4uLilgLCB0eXBlIGFyZ3VtZW50cyBVLCBhbmQgcmVjZWl2ZXIgY2xhc3MpLCBhIHJl
bGF0aXZlbHkgZXhwZW5zaXZlIGxpbmthZ2Ugc3RlcCBpcyBwZXJmb3JtZWQgLS0gYnV0IGlzIHRo
ZW4gY2FjaGVkIGluIGEgdGFibGUgc3BlY2lmaWMgdG8gdGhlIG1lbWJlcnMgaW52b2x2ZWQsIG5v
dCB0aGUgY2FsbCBzaXRlIC0tIHNvIHRoaXMgc2hvdWxkIHN0YWJpbGl6ZSBxdWlja2x5LiZuYnNw
OyA8YnI+PGJyPjwvdHQ+PHR0Pjx0dD4jIyMjIEludGVyZmFjZSBtZXRob2RzPGJyPjxicj5JbnRl
cmZhY2UgbWV0aG9kcyBhZGQgYW4gYWRkaXRpb25hbCBsYXllciwgYnV0IGRvIG5vdCBjaGFuZ2Ug
dGhlIHN0b3J5IGZ1bmRhbWVudGFsbHkuJm5ic3A7IElmIEkgaGF2ZTo8YnI+PC90dD48L3R0Pjxi
cj48dHQ+PHR0Pjx0dD48dHQ+YGBgamF2YTxicj5pbnRlcmZhY2UgSSZsdDthbnkgVCZndDsgezxi
cj4mbmJzcDsmbmJzcDsmbmJzcDsgPC90dD48L3R0Pjx0dD48dHQ+PHR0PkFDQyA8L3R0PiZsdDth
bnkgVSZndDsgdm9pZCBtKFQgdCwgVSB1KSB7IH08YnI+fTxicj48L3R0PjwvdHQ+PGJyPjx0dD48
dHQ+PHR0Pjx0dD5jbGFzcyBGb28mbHQ7YW55IFQmZ3Q7IGltcGxlbWVudHMgSSZsdDtUJmd0OyB7
PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBAT3ZlcnJpZGUgPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyA8
L3R0PjwvdHQ+PC90dD48L3R0Pjx0dD48dHQ+PHR0Pjx0dD48dHQ+QUNDIDwvdHQ+Jmx0O2FueSBV
Jmd0OyB2b2lkIG0oVCB0LCBVIHUpIHsgfTxicj59PGJyPjwvdHQ+PC90dD5gYGA8YnI+PC90dD48
L3R0PnRoZW4gd2UgbmVlZCB0byBnZW5lcmF0ZSBhbiBhcnRpZmFjdCBgSSRtYCBhcnRpZmFjdCBh
cyB3ZSBkbyB3aXRoIGNsYXNzZXMuJm5ic3A7IFdoZW4gbGlua2luZyBhbiBpbnZvY2F0aW9uIHdo
aWNoIHN0YXRpYyByZWNlaXZlciBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIGFuIGludGVyZmFjZSBy
YXRoZXIgdGhhbiBhIGNsYXNzLCB3ZSBjb21wdXRlIGBJJG1gIGFzIG91ciBTUiwgYW5kIHByb2Nl
ZWQgYXMgYmVmb3JlLiZuYnNwOyAoSW4gdGhpcyBjYXNlLCBvdXIgbGlua2FnZSBzdHJhdGVneSBz
aG91bGQgcHJvYmFibHkgdXNlIGByZXNvbHZlT3JGYWlsYCByYXRoZXIgdGhhbiBtYW51YWwgaGll
cmFyY2h5IHdhbGtpbmcsIHNvIHdlIHNob3VsZCBwcm9iYWJseSBkbyB0aGlzIGluIGJvdGggY2Fz
ZXMuKSZuYnNwOyBBZGRpdGlvbmFsbHksIHdlIG1heSBuZWVkIHRvIGRvIGEgY2hlY2sgdGhhdCB0
aGUgYFh4eGAgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgcmVzb2x2ZWQgYFh4eCRtYCBob2xk
ZXIgY2xhc3MgYWN0dWFsbHkgaW1wbGVtZW50cyBgSSZsdDtUJmd0O2AgLS0gYWdhaW4gdGhpcyBj
YW4gYmUgZG9uZSBhdCBsaW5rYWdlIHRpbWUsIG5vdCBkaXNwYXRjaCB0aW1lLiZuYnNwOyA8YnI+
PGJyPiMjIyMgRGVmYXVsdCBtZXRob2RzPGJyPjxicj5JZiB3ZSBkbyBvdXIgZGlzcGF0Y2ggdXNp
bmcgYHJlc29sdmVPckZhaWxgIGFnYWluc3QgdGhlIGVyYXNlZCBicmlkZ2VzLCBhbmQgdGhlIG1l
dGhvZCBpcyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIHJlY2VpdmVyJ3Mgc3VwZXJjbGFzcyBoaWVy
YXJjaHksIHRoZW4gSSBiZWxpZXZlIHRoYXQgcmVzb2x1dGlvbiB3aWxsIGhhbmQgdXMgdGhlIE1I
IGZvciB0aGUgZGVmYXVsdD8mbmJzcDsgSWYsIHNvLCB3ZSdyZSBnb29kOyB3ZSByZXNvbHZlIHRv
IHRoZSBkZWZhdWx0LCBqdXN0IGxpa2UgYW55IG90aGVyIGltcGxlbWVudGF0aW9uLiZuYnNwOyA8
YnI+PGJyPk9uZSBpbnRlZ3JpdHkgcmlzayBoZXJlIGlzIHRoYXQgdGhlIGBYeHgkbWAgaGllcmFy
Y2h5IGlzIHByb3Blcmx5IGFsaWduZWQgdG8gdGhlIGBGb29gIGhpZXJhcmNoeS4mbmJzcDsgSSB0
aGluayB3ZSBjYW4gdmFsaWRhdGUgdGhhdCAoYXQgdGhlIHRpbWUgd2UgbGF6aWx5IHBvcHVsYXRl
IHRoZSBkaXNwYXRjaCB0YWJsZSkgc2ltcGx5IGJ5IGNoZWNraW5nIHRoYXQgdGhlIHJlc29sdmVk
IGVyYXNlZCB0YXJnZXQgYFh4eC5tKClgIGFuZCB0aGUgY29ycmVzcG9uZGluZyBzcGVjaWFsaXpl
ZCBjbGFzcyBgWHh4JG0ubSgpYCBzaGFyZSBhIG5lc3QgKGFuZCBoZW5jZSBkZXJpdmUgZnJvbSB0
aGUgc2FtZSBzb3VyY2UgY2xhc3MuKSZuYnNwOyA8YnI+PGJyPjxicj48YnI+PC90dD48L3R0Pgog
        IAoKPC9kaXY+Cgo8YnI+"
style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;">​</div>
    </div>
  </body>
</html>