<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div class="markdown-here-wrapper" data-md-url="" style="">
<p style="margin: 0px 0px 1.2em !important;">To add to Jorn’s
great reply, let’s also look at this from a different angle.</p>
<p style="margin: 0px 0px 1.2em !important;">The question you are
asking in reality has nothing to do with upcalls. It has to do
with memory segments that are passed <em>by reference</em>
(e.g. by passing their address in some register and/or stack
slot).</p>
<p style="margin: 0px 0px 1.2em !important;">Even a call to
something as simple as this:</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;"> size_t strlen(const char *s);
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">can be problematic:
consider the case where the string is stored in a memory segment
whose lifetime is managed by an automatic scope. It would be bad
if the segment could become unreachable <em>while</em>
executing <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;">strlen</code>.</p>
<p style="margin: 0px 0px 1.2em !important;">This is why the
Linker provides a lifetime guarantee for all memory segments
passed by reference: such arguments will be forcefully kept
alive for the entire duration of the call. This means that a
segment passed 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;">strlen</code>,
no matter how allocated, will never be deallocated while 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;">strlen</code>
code is executing.</p>
<p style="margin: 0px 0px 1.2em !important;">This is, of course an
80% (90% ?) guarantee: it works well when the native code uses
the provided segment <em>locally</em>. But in cases where the
native code stashes the segment pointer somewhere (e.g. a global
variable) and then, later on, re-access that same pointer (maybe
while evaluating a different function) there can be issues. The
problem here is that the native code as certain expectations on
the lifetime of the provided pointer (e.g. this pointer should
remain alive after the call). In such cases, the Java code using
Linker should reflect the expected lifetime accordingly, either
by adding reachability fences as required (if the segment is
managed by the GC), or by keeping the Arena alive for as long as
required. Whenever this doesn’t happen, the native code can be
exposed to use-after-free bugs. There is nothing a Java API can
do to protect against these sneaky cases: handling these cases
correctly is really a result of a deeper understanding of the
lifetime expectations of the library we’re interacting with.</p>
<p style="margin: 0px 0px 1.2em !important;">Upcall stubs are
“just another kind of segment” that can be passed by reference.
As such, it is subject to the same guarantees described above,
which can fail exactly in the same ways as described above for
non-upcall segments.</p>
<p style="margin: 0px 0px 1.2em !important;">Cheers<br>
Maurizio</p>
<p style="margin: 0px 0px 1.2em !important;">On 31/01/2023 22:20,
Jorn Vernee wrote:</p>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div class="markdown-here-exclude">
<p></p>
<blockquote type="cite" cite="mid:8512823c-855d-6a6e-75b2-640dd5326ca0@oracle.com">
<p>Hi,</p>
<p>The section of javadoc that you reference is talking about
a case like this:<br>
<br>
<font face="monospace"> static MemorySegment target() {<br>
try (Arena arena = Arena.openConfined()) {<br>
return arena.allocate(JAVA_INT);<br>
}<br>
}</font><br>
<br>
Note that the memory will be freed before the target
function returns, so if this function is used as the target
method of an upcall stub, it will effectively return a
dangling pointer to native code. If the native code then
dereferences the returned pointer, this can crash the VM.</p>
<p>> I don’t understand how/what clients should do to
ensure the address of the upcall stub is alive during the
upcall invocation within an implication session.</p>
<p>In the case of an implicit scope, the scope of the upcall
stub should be kept reachable (per [1]) until the upcall
stub can no longer be called. The Reference::reachability
fence method can be used for this. But, it might be easier
to use an explicitly closed scope for the upcall stub
instead, if you plan on storing it in native memory and
calling it later.<br>
</p>
<p>> Does that mean the implicit session is ALREADY kept
alive in the existing implementation of OpenJDK (which I
don’t think so) to guarantee the upcall stub works during
the upcall invocation based on the explanation in [1]?<br>
<br>
Not quite. The current implementation guarantees that the
implicit session of an upcall stub is kept alive (and the
upcall stub works) during and invocation of a _downcall_ to
which the upcall stub memory segment is passed. i.e. if an
upcall stub is passed to a downcall, the scope it is
attached to can not be closed for the duration of that
downcall (and this goes for any MemorySegment passed to a
downcall). This is achieved by calling
ImplicitSession::release [2] after a downcall returns.<br>
</p>
<p>There is no guarantee that an arbitrary upcall stub will be
kept alive until it is invoked. For instance, if I pass an
upcall stub to native code, and store the pointer in some
memory there (e.g. a global variable), then I return back to
Java. If I don't have a strong reference to the upcall
stub's scope, the upcall stub might be freed. If I then
later try to invoke the upcall stub again through the
pointer I stored in native code, the VM can crash. In short:
the JVM can not 'see' any pointer to the upcall stub from
native code, so they don't count toward its reachability.<br>
</p>
<p>To illustrate the problematic case, consider this native
library and Java program that calls into it (using the Java
20 API):<br>
<br>
libMylib.c:<br>
<br>
<font face="monospace">typedef void (*callback_t)(void);<br>
</font></p>
<p><font face="monospace">static callback_t GLOBAL_CB; //
global pointer variable</font></p>
<p><font face="monospace">void store(callback_t cb) {<br>
GLOBAL_CB = cb;<br>
}<br>
<br>
void call() {<br>
GLOBAL_CB();<br>
}</font><br>
<br>
Main.java:<br>
<font face="monospace"><br>
import java.lang.foreign.*;<br>
import java.lang.invoke.*;<br>
<br>
import static java.lang.foreign.ValueLayout.*;<br>
<br>
public class Main {<br>
static final Linker LINKER = Linker.nativeLinker();<br>
<br>
static final MethodHandle STORE;<br>
static final MethodHandle CALL;<br>
static final MethodHandle TARGET;<br>
<br>
static {<br>
System.loadLibrary("Mylib");<br>
SymbolLookup lookup = SymbolLookup.loaderLookup();<br>
STORE =
LINKER.downcallHandle(lookup.find("store").get(),
FunctionDescriptor.ofVoid(ADDRESS));<br>
CALL =
LINKER.downcallHandle(lookup.find("call").get(),
FunctionDescriptor.ofVoid());<br>
try {<br>
TARGET =
MethodHandles.lookup().findStatic(Main.class, "target",
MethodType.methodType(void.class));<br>
} catch (ReflectiveOperationException e) {<br>
throw new InternalError(e);<br>
}<br>
}<br>
public static void main(String[] args) throws Throwable
{<br>
store();<br>
System.gc(); // invoke gc which can clean up 'stub'<br>
call();<br>
}<br>
<br>
static void store() throws Throwable {<br>
MemorySegment stub = LINKER.upcallStub(TARGET,
FunctionDescriptor.ofVoid(), SegmentScope.auto());<br>
STORE.invokeExact(stub);<br>
// stub is unreachable here<br>
}<br>
<br>
static void call() throws Throwable {<br>
CALL.invokeExact();<br>
}<br>
<br>
static void target() {}<br>
}</font><br>
</p>
<p>On my machine this code reliably crashes the VM, since the
upcall stub is called after it becomes unreachable (and is
freed).<br>
</p>
<p>In order to fix this, I would have to keep the stub alive
until after I call the 'call' function from the native
library:<br>
<br>
<font face="monospace"> public static void main(String[]
args) throws Throwable {<br>
MemorySegment stub = store(); // <-----<br>
System.gc(); // invoke gc<br>
call();<br>
Reference.reachabilityFence(stub); </font><font face="monospace"><font face="monospace">// <----- keep
stub alive until after I call it</font><br>
}<br>
<br>
static MemorySegment store() throws Throwable {<br>
MemorySegment stub = LINKER.upcallStub(TARGET,
FunctionDescriptor.ofVoid(), SegmentScope.auto());<br>
STORE.invokeExact(stub);<br>
return stub;</font><font face="monospace"><font face="monospace"> // <--- return stub here</font><br>
}</font><br>
</p>
<p>Hope that helps,<br>
Jorn<br>
</p>
<p>[1]:
<a class="moz-txt-link-freetext" href="https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/lang/ref/package-summary.html#reachability" moz-do-not-send="true">https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/lang/ref/package-summary.html#reachability</a><br>
[2]:
<a class="moz-txt-link-freetext" href="https://github.com/openjdk/panama-foreign/blob/a943c2eb10ba40c36d5a6e874160d0a747457510/src/java.base/share/classes/jdk/internal/foreign/ImplicitSession.java#L50" moz-do-not-send="true">https://github.com/openjdk/panama-foreign/blob/a943c2eb10ba40c36d5a6e874160d0a747457510/src/java.base/share/classes/jdk/internal/foreign/ImplicitSession.java#L50</a><br>
</p>
<div class="moz-cite-prefix">On 31/01/2023 21:01, Cheng Jin
wrote:<br>
</div>
<blockquote type="cite" cite="mid:MN2PR15MB259204050A96476D15ECA613F5D09@MN2PR15MB2592.namprd15.prod.outlook.com">
<meta name="Generator" content="Microsoft Word 15 (filtered
medium)">
<style>@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
{font-family:DengXian;
panose-1:2 1 6 0 3 1 1 1 1 1;}@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}@font-face
{font-family:"\@DengXian";
panose-1:2 1 6 0 3 1 1 1 1 1;}p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}span.EmailStyle20
{mso-style-type:personal-reply;
font-family:"Calibri",sans-serif;
color:windowtext;}.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}div.WordSection1
{page:WordSection1;}ol
{margin-bottom:0cm;}ul
{margin-bottom:0cm;}</style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
<div class="WordSection1">
<p class="MsoNormal">Hi Jorn,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Correct but these bullets are only
intended for the downcall invocation rather than the
upcall stub.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">According to the explanation of
upcall stub in [1] as follows:<o:p></o:p></p>
<p class="MsoNormal">“When creating upcall stubs the
linker runtime....<o:p></o:p></p>
<p class="MsoNormal">Moreover, if the target method handle
associated with an upcall stub returns a memory address,<o:p></o:p></p>
<p class="MsoNormal">clients must ensure that this address
cannot become invalid after the upcall completes. <span style="font-family:Wingdings">ß</span>-----------------<o:p></o:p></p>
<p class="MsoNormal">This can lead to unspecified
behavior, and even JVM crashes, since an upcall is <o:p></o:p></p>
<p class="MsoNormal">typically executed in the context of
a downcall method handle invocation.”<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I don’t understand how/what clients
should do to ensure the address of the upcall stub is
alive during the upcall invocation within an implication
session.<o:p></o:p></p>
<p class="MsoNormal">Does that mean the implicit session
is ALREADY kept alive in the existing implementation of
OpenJDK (which I don’t think so) to guarantee the upcall
stub works during the upcall invocation based on the
explanation in [1]?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Best Regards<o:p></o:p></p>
<p class="MsoNormal">Cheng Jin<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-top:solid #E1E1E1
1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US">From:</span></b><span lang="EN-US"> Jorn Vernee <a class="moz-txt-link-rfc2396E" href="mailto:jorn.vernee@oracle.com" moz-do-not-send="true"><jorn.vernee@oracle.com></a>
<br>
<b>Sent:</b> January 31, 2023 2:14 PM<br>
<b>To:</b> Cheng Jin <a class="moz-txt-link-rfc2396E" href="mailto:jincheng@ca.ibm.com" moz-do-not-send="true"><jincheng@ca.ibm.com></a>;
<a class="moz-txt-link-abbreviated
moz-txt-link-freetext" href="mailto:panama-dev@openjdk.org" moz-do-not-send="true">panama-dev@openjdk.org</a><br>
<b>Subject:</b> [EXTERNAL] Re: Inappropriate use of
the implicit session in allocating the upcall stub
in SafeFunctionAccessTest.java<o:p></o:p></span></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal" style="mso-line-height-alt:.75pt"><span style="font-size:1.0pt;color:white">Hi Cheng Jin,
Thanks for the email. In this case it is not a
problem since memory sessions (including upcall
stubs) are kept alive/reachable for the duration of
a downcall (see the third bullet here: [1]) "The
memory session of R is kept <o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="mso-line-height-alt:.75pt"><span style="font-size:1.0pt;color:white">ZjQcmQRYFpfptBannerStart<o:p></o:p></span></p>
</div>
<table class="MsoNormalTable" style="width:100.0%;border-radius:4px" width="100%" cellspacing="0" cellpadding="0" border="0">
<tbody>
<tr>
<td style="padding:12.0pt 0cm 12.0pt 0cm">
<table class="MsoNormalTable" style="width:100.0%;background:#D0D8DC;border:none;border-top:solid
#90A4AE 3.0pt" width="100%" cellspacing="0" cellpadding="0" border="1">
<tbody>
<tr>
<td style="border:none;padding:0cm 7.5pt
3.75pt 4.5pt" valign="top">
<table class="MsoNormalTable" cellspacing="0" cellpadding="0" border="0" align="left">
<tbody>
<tr>
<td style="padding:3.0pt 6.0pt 3.0pt
6.0pt">
<p class="MsoNormal"><b><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black">This
Message Is From an External
Sender <o:p></o:p></span></b></p>
</td>
</tr>
<tr>
<td style="padding:3.0pt 6.0pt 3.0pt
6.0pt">
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Arial",sans-serif;color:black">This
message came from outside your
organization. <o:p></o:p></span></p>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<div>
<p class="MsoNormal" style="mso-line-height-alt:.75pt"><span style="font-size:1.0pt;color:white">ZjQcmQRYFpfptBannerEnd<o:p></o:p></span></p>
</div>
<p>Hi Cheng Jin,<o:p></o:p></p>
<p>Thanks for the email.<br>
<br>
In this case it is not a problem since memory sessions
(including upcall stubs) are kept alive/reachable for
the duration of a downcall (see the third bullet here:
[1])<o:p></o:p></p>
<p> "The memory session of R is kept alive (and cannot
be closed) during the invocation."<o:p></o:p></p>
<p>Since we don't store a reference to the upcall stub in
native code until after the downcall returns, this is
safe to rely on.<o:p></o:p></p>
<p>Cheers,<br>
Jorn<o:p></o:p></p>
<p>[1]: <a href="https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/lang/foreign/Linker.html#safety" moz-do-not-send="true" class="moz-txt-link-freetext">https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/lang/foreign/Linker.html#safety</a><o:p></o:p></p>
<div>
<p class="MsoNormal">On 31/01/2023 18:49, Cheng Jin
wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Hi there, <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">I notice there might be an issue
with the allocation of upcall stub under an implicit
session at
test/jdk/java/foreign/SafeFunctionAccessTest.java in
JDK19+ as follows:<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">e.g.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> @Test<o:p></o:p></p>
<p class="MsoNormal"> public void
testClosedStructCallback() throws Throwable {<o:p></o:p></p>
<p class="MsoNormal"> MethodHandle handle =
Linker.nativeLinker().downcallHandle(<o:p></o:p></p>
<p class="MsoNormal">
findNativeOrThrow("addr_func_cb"),<o:p></o:p></p>
<p class="MsoNormal">
FunctionDescriptor.ofVoid(C_POINTER, C_POINTER));<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> try (MemorySession session
= MemorySession.openConfined()) {<o:p></o:p></p>
<p class="MsoNormal"> MemorySegment segment =
MemorySegment.allocateNative(POINT, session);<o:p></o:p></p>
<p class="MsoNormal"> handle.invoke(segment,
sessionChecker(session)); <span style="font-family:Wingdings">ß</span>---------------
the upcall stub is allocated in sessionChecker()<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> MemorySegment
sessionChecker(MemorySession session) {<o:p></o:p></p>
<p class="MsoNormal"> try {<o:p></o:p></p>
<p class="MsoNormal"> MethodHandle handle =
MethodHandles.lookup().findStatic(SafeFunctionAccessTest.class,
"checkSession",<o:p></o:p></p>
<p class="MsoNormal">
MethodType.methodType(void.class,
MemorySession.class));<o:p></o:p></p>
<p class="MsoNormal"> handle =
handle.bindTo(session);<o:p></o:p></p>
<p class="MsoNormal"> return
Linker.nativeLinker().upcallStub(handle,
FunctionDescriptor.ofVoid(),
MemorySession.openImplicit()); <span style="font-family:Wingdings">ß</span>-----the
upcall stub is allocated with an implicit session<o:p></o:p></p>
<p class="MsoNormal"> } catch (Throwable ex) {<o:p></o:p></p>
<p class="MsoNormal"> throw new
AssertionError(ex);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal" style="text-indent:9.9pt">}<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">It is correct to allocate the
upcall stub with a session different from the current
session in tests given these tests intend to close the
current session in upcall to verify the behavior. But
it is problematic to exploit an implicit session
backed by GC, in which case the memory of the upcall
stub is more likely to be forced to release by GC
(when implicitly closing the session to free memory)
especially on the memory-restricted machines, which
leads to unexpected behavior in upcall (e.g. crash
which was captured recently). To work around this
case, I’d suggest to replace it with a global session
or others so as to keep the upcall stub alive during
the upcall.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Best Regards<o:p></o:p></p>
<p class="MsoNormal">Cheng Jin<o:p></o:p></p>
</blockquote>
</div>
</blockquote>
</blockquote>
<p></p>
</div>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div title="MDH:PHA+VG8gYWRkIHRvIEpvcm4ncyBncmVhdCByZXBseSwgbGV0J3MgYWxzbyBsb29rIGF0IHRoaXMgZnJvbSBhIGRpZmZlcmVudCBhbmdsZS48L3A+PHA+VGhlIHF1ZXN0aW9uIHlvdSBhcmUgYXNraW5n
IGluIHJlYWxpdHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB1cGNhbGxzLiBJdCBoYXMgdG8gZG8g
d2l0aCBtZW1vcnkgc2VnbWVudHMgdGhhdCBhcmUgcGFzc2VkIF9ieSByZWZlcmVuY2VfIChlLmcu
IGJ5IHBhc3NpbmcgdGhlaXIgYWRkcmVzcyBpbiBzb21lIHJlZ2lzdGVyIGFuZC9vciBzdGFjayBz
bG90KS48L3A+PHA+RXZlbiBhIGNhbGwgdG8gc29tZXRoaW5nIGFzIHNpbXBsZSBhcyB0aGlzOjwv
cD48cD5gYGA8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNpemVfdCBz
dHJsZW4oY29uc3QgY2hhciAqcyk7PGJyPmBgYDwvcD48cD5jYW4gYmUgcHJvYmxlbWF0aWM6IGNv
bnNpZGVyIHRoZSBjYXNlIHdoZXJlIHRoZSBzdHJpbmcgaXMgc3RvcmVkIGluIGEgbWVtb3J5IHNl
Z21lbnQgd2hvc2UgbGlmZXRpbWUgaXMgbWFuYWdlZCBieSBhbiBhdXRvbWF0aWMgc2NvcGUuIEl0
IHdvdWxkIGJlIGJhZCBpZiB0aGUgc2VnbWVudCBjb3VsZCBiZWNvbWUgdW5yZWFjaGFibGUgX3do
aWxlXyBleGVjdXRpbmcgYHN0cmxlbmAuPC9wPjxwPlRoaXMgaXMgd2h5IHRoZSBMaW5rZXIgcHJv
dmlkZXMgYSBsaWZldGltZSBndWFyYW50ZWUgZm9yIGFsbCBtZW1vcnkgc2VnbWVudHMgcGFzc2Vk
IGJ5IHJlZmVyZW5jZTogc3VjaCBhcmd1bWVudHMgd2lsbCBiZSBmb3JjZWZ1bGx5IGtlcHQgYWxp
dmUgZm9yIHRoZSBlbnRpcmUgZHVyYXRpb24gb2YgdGhlIGNhbGwuIFRoaXMgbWVhbnMgdGhhdCBh
IHNlZ21lbnQgcGFzc2VkIHRvIGBzdHJsZW5gLCBubyBtYXR0ZXIgaG93IGFsbG9jYXRlZCwgd2ls
bCBuZXZlciBiZSBkZWFsbG9jYXRlZCB3aGlsZSB0aGUgYHN0cmxlbmAgY29kZSBpcyBleGVjdXRp
bmcuPC9wPjxwPlRoaXMgaXMsIG9mIGNvdXJzZSBhbiA4MCUgKDkwJSA/KSBndWFyYW50ZWU6IGl0
IHdvcmtzIHdlbGwgd2hlbiB0aGUgbmF0aXZlIGNvZGUgdXNlcyB0aGUgcHJvdmlkZWQgc2VnbWVu
dCBfbG9jYWxseV8uIEJ1dCBpbiBjYXNlcyB3aGVyZSB0aGUgbmF0aXZlIGNvZGUgc3Rhc2hlcyB0
aGUgc2VnbWVudCBwb2ludGVyIHNvbWV3aGVyZSAoZS5nLiBhIGdsb2JhbCB2YXJpYWJsZSkgYW5k
IHRoZW4sIGxhdGVyIG9uLCByZS1hY2Nlc3MgdGhhdCBzYW1lIHBvaW50ZXIgKG1heWJlIHdoaWxl
IGV2YWx1YXRpbmcgYSBkaWZmZXJlbnQgZnVuY3Rpb24pIHRoZXJlIGNhbiBiZSBpc3N1ZXMuIFRo
ZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCB0aGUgbmF0aXZlIGNvZGUgYXMgY2VydGFpbiBleHBlY3Rh
dGlvbnMgb24gdGhlIGxpZmV0aW1lIG9mIHRoZSBwcm92aWRlZCBwb2ludGVyIChlLmcuIHRoaXMg
cG9pbnRlciBzaG91bGQgcmVtYWluIGFsaXZlIGFmdGVyIHRoZSBjYWxsKS4gSW4gc3VjaCBjYXNl
cywgdGhlIEphdmEgY29kZSB1c2luZyBMaW5rZXIgc2hvdWxkIHJlZmxlY3QgdGhlIGV4cGVjdGVk
IGxpZmV0aW1lIGFjY29yZGluZ2x5LCBlaXRoZXIgYnkgYWRkaW5nIHJlYWNoYWJpbGl0eSBmZW5j
ZXMgYXMgcmVxdWlyZWQgKGlmIHRoZSBzZWdtZW50IGlzIG1hbmFnZWQgYnkgdGhlIEdDKSwgb3Ig
Ynkga2VlcGluZyB0aGUgQXJlbmEgYWxpdmUgZm9yIGFzIGxvbmcgYXMgcmVxdWlyZWQuIFdoZW5l
dmVyIHRoaXMgZG9lc24ndCBoYXBwZW4sIHRoZSBuYXRpdmUgY29kZSBjYW4gYmUgZXhwb3NlZCB0
byB1c2UtYWZ0ZXItZnJlZSBidWdzLiBUaGVyZSBpcyBub3RoaW5nIGEgSmF2YSBBUEkgY2FuIGRv
IHRvIHByb3RlY3QgYWdhaW5zdCB0aGVzZSBzbmVha3kgY2FzZXM6IGhhbmRsaW5nIHRoZXNlIGNh
c2VzIGNvcnJlY3RseSBpcyByZWFsbHkgYSByZXN1bHQgb2YgYSBkZWVwZXIgdW5kZXJzdGFuZGlu
ZyBvZiB0aGUgbGlmZXRpbWUgZXhwZWN0YXRpb25zIG9mIHRoZSBsaWJyYXJ5IHdlJ3JlIGludGVy
YWN0aW5nIHdpdGguPC9wPjxwPlVwY2FsbCBzdHVicyBhcmUgImp1c3QgYW5vdGhlciBraW5kIG9m
IHNlZ21lbnQiIHRoYXQgY2FuIGJlIHBhc3NlZCBieSByZWZlcmVuY2UuIEFzIHN1Y2gsIGl0IGlz
IHN1YmplY3QgdG8gdGhlIHNhbWUgZ3VhcmFudGVlcyBkZXNjcmliZWQgYWJvdmUsIHdoaWNoIGNh
biBmYWlsIGV4YWN0bHkgaW4gdGhlIHNhbWUgd2F5cyBhcyBkZXNjcmliZWQgYWJvdmUgZm9yIG5v
bi11cGNhbGwgc2VnbWVudHMuPC9wPjxwPkNoZWVyczxicj5NYXVyaXppbzxicj48L3A+PGRpdiBj
bGFzcz0ibW96LWNpdGUtcHJlZml4Ij5PbiAzMS8wMS8yMDIzIDIyOjIwLCBKb3JuIFZlcm5lZSB3
cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIgY2l0ZT0ibWlkOjg1MTI4MjNj
LTg1NWQtNmE2ZS03NWIyLTY0MGRkNTMyNmNhMEBvcmFjbGUuY29tIj4KPG1ldGEgaHR0cC1lcXVp
dj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7ICI+CiAgCiAgCiAgICA8cD5IaSw8
L3A+CiAgICA8cD5UaGUgc2VjdGlvbiBvZiBqYXZhZG9jIHRoYXQgeW91IHJlZmVyZW5jZSBpcyB0
YWxraW5nIGFib3V0IGEgY2FzZQogICAgICBsaWtlIHRoaXM6PGJyPgogICAgICA8YnI+CiAgICAg
IDxmb250IGZhY2U9Im1vbm9zcGFjZSI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHN0YXRpYyBNZW1vcnlT
ZWdtZW50IHRhcmdldCgpIHs8YnI+CiAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
c3A7Jm5ic3A7Jm5ic3A7IHRyeSAoQXJlbmEgYXJlbmEgPSBBcmVuYS5vcGVuQ29uZmluZWQoKSkg
ezxicj4KICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcmV0dXJuIGFyZW5hLmFsbG9jYXRlKEpBVkFfSU5UKTs8
YnI+CiAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08
YnI+CiAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IH08L2ZvbnQ+PGJyPgogICAgICA8YnI+CiAg
ICAgIE5vdGUgdGhhdCB0aGUgbWVtb3J5IHdpbGwgYmUgZnJlZWQgYmVmb3JlIHRoZSB0YXJnZXQg
ZnVuY3Rpb24KICAgICAgcmV0dXJucywgc28gaWYgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFzIHRo
ZSB0YXJnZXQgbWV0aG9kIG9mIGFuCiAgICAgIHVwY2FsbCBzdHViLCBpdCB3aWxsIGVmZmVjdGl2
ZWx5IHJldHVybiBhIGRhbmdsaW5nIHBvaW50ZXIgdG8KICAgICAgbmF0aXZlIGNvZGUuIElmIHRo
ZSBuYXRpdmUgY29kZSB0aGVuIGRlcmVmZXJlbmNlcyB0aGUgcmV0dXJuZWQKICAgICAgcG9pbnRl
ciwgdGhpcyBjYW4gY3Jhc2ggdGhlIFZNLjwvcD4KICAgIDxwPiZndDsgSSBkb27igJl0IHVuZGVy
c3RhbmQgaG93L3doYXQgY2xpZW50cyBzaG91bGQgZG8gdG8gZW5zdXJlIHRoZQogICAgICBhZGRy
ZXNzIG9mIHRoZSB1cGNhbGwgc3R1YiBpcyBhbGl2ZSBkdXJpbmcgdGhlIHVwY2FsbCBpbnZvY2F0
aW9uCiAgICAgIHdpdGhpbiBhbiBpbXBsaWNhdGlvbiBzZXNzaW9uLjwvcD4KICAgIDxwPkluIHRo
ZSBjYXNlIG9mIGFuIGltcGxpY2l0IHNjb3BlLCB0aGUgc2NvcGUgb2YgdGhlIHVwY2FsbCBzdHVi
CiAgICAgIHNob3VsZCBiZSBrZXB0IHJlYWNoYWJsZSAocGVyIFsxXSkgdW50aWwgdGhlIHVwY2Fs
bCBzdHViIGNhbiBubwogICAgICBsb25nZXIgYmUgY2FsbGVkLiBUaGUgUmVmZXJlbmNlOjpyZWFj
aGFiaWxpdHkgZmVuY2UgbWV0aG9kIGNhbiBiZQogICAgICB1c2VkIGZvciB0aGlzLiBCdXQsIGl0
IG1pZ2h0IGJlIGVhc2llciB0byB1c2UgYW4gZXhwbGljaXRseSBjbG9zZWQKICAgICAgc2NvcGUg
Zm9yIHRoZSB1cGNhbGwgc3R1YiBpbnN0ZWFkLCBpZiB5b3UgcGxhbiBvbiBzdG9yaW5nIGl0IGlu
CiAgICAgIG5hdGl2ZSBtZW1vcnkgYW5kIGNhbGxpbmcgaXQgbGF0ZXIuPGJyPgogICAgPC9wPgog
ICAgPHA+Jmd0OyBEb2VzIHRoYXQgbWVhbiB0aGUgaW1wbGljaXQgc2Vzc2lvbiBpcyBBTFJFQURZ
IGtlcHQgYWxpdmUgaW4KICAgICAgdGhlIGV4aXN0aW5nIGltcGxlbWVudGF0aW9uIG9mIE9wZW5K
REsgKHdoaWNoIEkgZG9u4oCZdCB0aGluayBzbykgdG8KICAgICAgZ3VhcmFudGVlIHRoZSB1cGNh
bGwgc3R1YiB3b3JrcyBkdXJpbmcgdGhlIHVwY2FsbCBpbnZvY2F0aW9uIGJhc2VkCiAgICAgIG9u
IHRoZSBleHBsYW5hdGlvbiBpbiBbMV0/PGJyPgogICAgICA8YnI+CiAgICAgIE5vdCBxdWl0ZS4g
VGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZ3VhcmFudGVlcyB0aGF0IHRoZSBpbXBsaWNpdAog
ICAgICBzZXNzaW9uIG9mIGFuIHVwY2FsbCBzdHViIGlzIGtlcHQgYWxpdmUgKGFuZCB0aGUgdXBj
YWxsIHN0dWIKICAgICAgd29ya3MpIGR1cmluZyBhbmQgaW52b2NhdGlvbiBvZiBhIF9kb3duY2Fs
bF8gdG8gd2hpY2ggdGhlIHVwY2FsbAogICAgICBzdHViIG1lbW9yeSBzZWdtZW50IGlzIHBhc3Nl
ZC4gaS5lLiBpZiBhbiB1cGNhbGwgc3R1YiBpcyBwYXNzZWQgdG8KICAgICAgYSBkb3duY2FsbCwg
dGhlIHNjb3BlIGl0IGlzIGF0dGFjaGVkIHRvIGNhbiBub3QgYmUgY2xvc2VkIGZvciB0aGUKICAg
ICAgZHVyYXRpb24gb2YgdGhhdCBkb3duY2FsbCAoYW5kIHRoaXMgZ29lcyBmb3IgYW55IE1lbW9y
eVNlZ21lbnQKICAgICAgcGFzc2VkIHRvIGEgZG93bmNhbGwpLiBUaGlzIGlzIGFjaGlldmVkIGJ5
IGNhbGxpbmcKICAgICAgSW1wbGljaXRTZXNzaW9uOjpyZWxlYXNlIFsyXSBhZnRlciBhIGRvd25j
YWxsIHJldHVybnMuPGJyPgogICAgPC9wPgogICAgPHA+VGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRo
YXQgYW4gYXJiaXRyYXJ5IHVwY2FsbCBzdHViIHdpbGwgYmUga2VwdAogICAgICBhbGl2ZSB1bnRp
bCBpdCBpcyBpbnZva2VkLiBGb3IgaW5zdGFuY2UsIGlmIEkgcGFzcyBhbiB1cGNhbGwgc3R1Ygog
ICAgICB0byBuYXRpdmUgY29kZSwgYW5kIHN0b3JlIHRoZSBwb2ludGVyIGluIHNvbWUgbWVtb3J5
IHRoZXJlIChlLmcuIGEKICAgICAgZ2xvYmFsIHZhcmlhYmxlKSwgdGhlbiBJIHJldHVybiBiYWNr
IHRvIEphdmEuIElmIEkgZG9uJ3QgaGF2ZSBhCiAgICAgIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhl
IHVwY2FsbCBzdHViJ3Mgc2NvcGUsIHRoZSB1cGNhbGwgc3R1YiBtaWdodAogICAgICBiZSBmcmVl
ZC4gSWYgSSB0aGVuIGxhdGVyIHRyeSB0byBpbnZva2UgdGhlIHVwY2FsbCBzdHViIGFnYWluCiAg
ICAgIHRocm91Z2ggdGhlIHBvaW50ZXIgSSBzdG9yZWQgaW4gbmF0aXZlIGNvZGUsIHRoZSBWTSBj
YW4gY3Jhc2guIEluCiAgICAgIHNob3J0OiB0aGUgSlZNIGNhbiBub3QgJ3NlZScgYW55IHBvaW50
ZXIgdG8gdGhlIHVwY2FsbCBzdHViIGZyb20KICAgICAgbmF0aXZlIGNvZGUsIHNvIHRoZXkgZG9u
J3QgY291bnQgdG93YXJkIGl0cyByZWFjaGFiaWxpdHkuPGJyPgogICAgPC9wPgogICAgPHA+VG8g
aWxsdXN0cmF0ZSB0aGUgcHJvYmxlbWF0aWMgY2FzZSwgY29uc2lkZXIgdGhpcyBuYXRpdmUgbGli
cmFyeQogICAgICBhbmQgSmF2YSBwcm9ncmFtIHRoYXQgY2FsbHMgaW50byBpdCAodXNpbmcgdGhl
IEphdmEgMjAgQVBJKTo8YnI+CiAgICAgIDxicj4KICAgICAgbGliTXlsaWIuYzo8YnI+CiAgICAg
IDxicj4KICAgICAgPGZvbnQgZmFjZT0ibW9ub3NwYWNlIj50eXBlZGVmIHZvaWQgKCpjYWxsYmFj
a190KSh2b2lkKTs8YnI+CiAgICAgIDwvZm9udD48L3A+CiAgICA8cD48Zm9udCBmYWNlPSJtb25v
c3BhY2UiPnN0YXRpYyBjYWxsYmFja190IEdMT0JBTF9DQjsgLy8gZ2xvYmFsCiAgICAgICAgcG9p
bnRlciB2YXJpYWJsZTwvZm9udD48L3A+CiAgICA8cD48Zm9udCBmYWNlPSJtb25vc3BhY2UiPnZv
aWQgc3RvcmUoY2FsbGJhY2tfdCBjYikgezxicj4KICAgICAgICAmbmJzcDsgR0xPQkFMX0NCID0g
Y2I7PGJyPgogICAgICAgIH08YnI+CiAgICAgICAgPGJyPgogICAgICAgIHZvaWQgY2FsbCgpIHs8
YnI+CiAgICAgICAgJm5ic3A7IEdMT0JBTF9DQigpOzxicj4KICAgICAgICB9PC9mb250Pjxicj4K
ICAgICAgPGJyPgogICAgICBNYWluLmphdmE6PGJyPgogICAgICA8Zm9udCBmYWNlPSJtb25vc3Bh
Y2UiPjxicj4KICAgICAgICBpbXBvcnQgamF2YS5sYW5nLmZvcmVpZ24uKjs8YnI+CiAgICAgICAg
aW1wb3J0IGphdmEubGFuZy5pbnZva2UuKjs8YnI+CiAgICAgICAgPGJyPgogICAgICAgIGltcG9y
dCBzdGF0aWMgamF2YS5sYW5nLmZvcmVpZ24uVmFsdWVMYXlvdXQuKjs8YnI+CiAgICAgICAgPGJy
PgogICAgICAgIHB1YmxpYyBjbGFzcyBNYWluIHs8YnI+CiAgICAgICAgJm5ic3A7IHN0YXRpYyBm
aW5hbCBMaW5rZXIgTElOS0VSID0gTGlua2VyLm5hdGl2ZUxpbmtlcigpOzxicj4KICAgICAgICAm
bmJzcDsgPGJyPgogICAgICAgICZuYnNwOyBzdGF0aWMgZmluYWwgTWV0aG9kSGFuZGxlIFNUT1JF
Ozxicj4KICAgICAgICAmbmJzcDsgc3RhdGljIGZpbmFsIE1ldGhvZEhhbmRsZSBDQUxMOzxicj4K
ICAgICAgICAmbmJzcDsgc3RhdGljIGZpbmFsIE1ldGhvZEhhbmRsZSBUQVJHRVQ7PGJyPgogICAg
ICAgIDxicj4KICAgICAgICAmbmJzcDsgc3RhdGljIHs8YnI+CiAgICAgICAgJm5ic3A7Jm5ic3A7
Jm5ic3A7IFN5c3RlbS5sb2FkTGlicmFyeSgiTXlsaWIiKTs8YnI+CiAgICAgICAgJm5ic3A7Jm5i
c3A7Jm5ic3A7IFN5bWJvbExvb2t1cCBsb29rdXAgPSBTeW1ib2xMb29rdXAubG9hZGVyTG9va3Vw
KCk7PGJyPgogICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyBTVE9SRSA9IExJTktFUi5kb3duY2Fs
bEhhbmRsZShsb29rdXAuZmluZCgic3RvcmUiKS5nZXQoKSwKICAgICAgICBGdW5jdGlvbkRlc2Ny
aXB0b3Iub2ZWb2lkKEFERFJFU1MpKTs8YnI+CiAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IENB
TEwgPSBMSU5LRVIuZG93bmNhbGxIYW5kbGUobG9va3VwLmZpbmQoImNhbGwiKS5nZXQoKSwKICAg
ICAgICBGdW5jdGlvbkRlc2NyaXB0b3Iub2ZWb2lkKCkpOzxicj4KICAgICAgICAmbmJzcDsmbmJz
cDsmbmJzcDsgdHJ5IHs8YnI+CiAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
IFRBUkdFVCA9IE1ldGhvZEhhbmRsZXMubG9va3VwKCkuZmluZFN0YXRpYyhNYWluLmNsYXNzLAog
ICAgICAgICJ0YXJnZXQiLCBNZXRob2RUeXBlLm1ldGhvZFR5cGUodm9pZC5jbGFzcykpOzxicj4K
ICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgfSBjYXRjaCAoUmVmbGVjdGl2ZU9wZXJhdGlvbkV4
Y2VwdGlvbiBlKSB7PGJyPgogICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB0
aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTs8YnI+CiAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7
IH08YnI+CiAgICAgICAgJm5ic3A7IH08YnI+CiAgICAgICAgJm5ic3A7IHB1YmxpYyBzdGF0aWMg
dm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgezxicj4KICAgICAgICAm
bmJzcDsmbmJzcDsmbmJzcDsgc3RvcmUoKTs8YnI+CiAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7
IFN5c3RlbS5nYygpOyAvLyBpbnZva2UgZ2Mgd2hpY2ggY2FuIGNsZWFuIHVwICdzdHViJzxicj4K
ICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgY2FsbCgpOzxicj4KICAgICAgICAmbmJzcDsgfTxi
cj4KICAgICAgICA8YnI+CiAgICAgICAgJm5ic3A7IHN0YXRpYyB2b2lkIHN0b3JlKCkgdGhyb3dz
IFRocm93YWJsZSB7PGJyPgogICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyBNZW1vcnlTZWdtZW50
IHN0dWIgPSBMSU5LRVIudXBjYWxsU3R1YihUQVJHRVQsCiAgICAgICAgRnVuY3Rpb25EZXNjcmlw
dG9yLm9mVm9pZCgpLCBTZWdtZW50U2NvcGUuYXV0bygpKTs8YnI+CiAgICAgICAgJm5ic3A7Jm5i
c3A7Jm5ic3A7IFNUT1JFLmludm9rZUV4YWN0KHN0dWIpOzxicj4KICAgICAgICAmbmJzcDsmbmJz
cDsmbmJzcDsgLy8gc3R1YiBpcyB1bnJlYWNoYWJsZSBoZXJlPGJyPgogICAgICAgICZuYnNwOyB9
PGJyPgogICAgICAgIDxicj4KICAgICAgICAmbmJzcDsgc3RhdGljIHZvaWQgY2FsbCgpIHRocm93
cyBUaHJvd2FibGUgezxicj4KICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgQ0FMTC5pbnZva2VF
eGFjdCgpOzxicj4KICAgICAgICAmbmJzcDsgfTxicj4KICAgICAgICA8YnI+CiAgICAgICAgJm5i
c3A7IHN0YXRpYyB2b2lkIHRhcmdldCgpIHt9PGJyPgogICAgICAgIH08L2ZvbnQ+PGJyPgogICAg
PC9wPgogICAgPHA+T24gbXkgbWFjaGluZSB0aGlzIGNvZGUgcmVsaWFibHkgY3Jhc2hlcyB0aGUg
Vk0sIHNpbmNlIHRoZSB1cGNhbGwKICAgICAgc3R1YiBpcyBjYWxsZWQgYWZ0ZXIgaXQgYmVjb21l
cyB1bnJlYWNoYWJsZSAoYW5kIGlzIGZyZWVkKS48YnI+CiAgICA8L3A+CiAgICA8cD5JbiBvcmRl
ciB0byBmaXggdGhpcywgSSB3b3VsZCBoYXZlIHRvIGtlZXAgdGhlIHN0dWIgYWxpdmUgdW50aWwK
ICAgICAgYWZ0ZXIgSSBjYWxsIHRoZSAnY2FsbCcgZnVuY3Rpb24gZnJvbSB0aGUgbmF0aXZlIGxp
YnJhcnk6PGJyPgogICAgICA8YnI+CiAgICAgIDxmb250IGZhY2U9Im1vbm9zcGFjZSI+Jm5ic3A7
IHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCiAgICAgICAgdGhyb3dzIFRo
cm93YWJsZSB7PGJyPgogICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyBNZW1vcnlTZWdtZW50IHN0
dWIgPSBzdG9yZSgpOyAvLyAmbHQ7LS0tLS08YnI+CiAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7
IFN5c3RlbS5nYygpOyAvLyBpbnZva2UgZ2M8YnI+CiAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7
IGNhbGwoKTs8YnI+CiAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IFJlZmVyZW5jZS5yZWFjaGFi
aWxpdHlGZW5jZShzdHViKTsgPC9mb250Pjxmb250IGZhY2U9Im1vbm9zcGFjZSI+PGZvbnQgZmFj
ZT0ibW9ub3NwYWNlIj4vLyAmbHQ7LS0tLS0ga2VlcCBzdHViCiAgICAgICAgICBhbGl2ZSB1bnRp
bCBhZnRlciBJIGNhbGwgaXQ8L2ZvbnQ+PGJyPgogICAgICAgICZuYnNwOyB9PGJyPgogICAgICAg
IDxicj4KICAgICAgICAmbmJzcDsgc3RhdGljIE1lbW9yeVNlZ21lbnQgc3RvcmUoKSB0aHJvd3Mg
VGhyb3dhYmxlIHs8YnI+CiAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IE1lbW9yeVNlZ21lbnQg
c3R1YiA9IExJTktFUi51cGNhbGxTdHViKFRBUkdFVCwKICAgICAgICBGdW5jdGlvbkRlc2NyaXB0
b3Iub2ZWb2lkKCksIFNlZ21lbnRTY29wZS5hdXRvKCkpOzxicj4KICAgICAgICAmbmJzcDsmbmJz
cDsmbmJzcDsgU1RPUkUuaW52b2tlRXhhY3Qoc3R1Yik7PGJyPgogICAgICAgICZuYnNwOyZuYnNw
OyZuYnNwOyByZXR1cm4gc3R1Yjs8L2ZvbnQ+PGZvbnQgZmFjZT0ibW9ub3NwYWNlIj48Zm9udCBm
YWNlPSJtb25vc3BhY2UiPiAvLyAmbHQ7LS0tIHJldHVybiBzdHViIGhlcmU8L2ZvbnQ+PGJyPgog
ICAgICAgICZuYnNwOyB9PC9mb250Pjxicj4KICAgIDwvcD4KICAgIDxwPkhvcGUgdGhhdCBoZWxw
cyw8YnI+CiAgICAgIEpvcm48YnI+CiAgICA8L3A+CiAgICA8cD5bMV06CjxhIGNsYXNzPSJtb3ot
dHh0LWxpbmstZnJlZXRleHQiIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEv
amF2YXNlLzE5L2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL2xhbmcvcmVmL3BhY2thZ2Utc3VtbWFy
eS5odG1sI3JlYWNoYWJpbGl0eSIgbW96LWRvLW5vdC1zZW5kPSJ0cnVlIj5odHRwczovL2RvY3Mu
b3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xOS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9sYW5n
L3JlZi9wYWNrYWdlLXN1bW1hcnkuaHRtbCNyZWFjaGFiaWxpdHk8L2E+PGJyPgogICAgICBbMl06
CjxhIGNsYXNzPSJtb3otdHh0LWxpbmstZnJlZXRleHQiIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv
bS9vcGVuamRrL3BhbmFtYS1mb3JlaWduL2Jsb2IvYTk0M2MyZWIxMGJhNDBjMzZkNWE2ZTg3NDE2
MGQwYTc0NzQ1NzUxMC9zcmMvamF2YS5iYXNlL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL2Zv
cmVpZ24vSW1wbGljaXRTZXNzaW9uLmphdmEjTDUwIiBtb3otZG8tbm90LXNlbmQ9InRydWUiPmh0
dHBzOi8vZ2l0aHViLmNvbS9vcGVuamRrL3BhbmFtYS1mb3JlaWduL2Jsb2IvYTk0M2MyZWIxMGJh
NDBjMzZkNWE2ZTg3NDE2MGQwYTc0NzQ1NzUxMC9zcmMvamF2YS5iYXNlL3NoYXJlL2NsYXNzZXMv
amRrL2ludGVybmFsL2ZvcmVpZ24vSW1wbGljaXRTZXNzaW9uLmphdmEjTDUwPC9hPjxicj4KICAg
IDwvcD4KICAgIDxkaXYgY2xhc3M9Im1vei1jaXRlLXByZWZpeCI+T24gMzEvMDEvMjAyMyAyMTow
MSwgQ2hlbmcgSmluIHdyb3RlOjxicj4KICAgIDwvZGl2PgogICAgPGJsb2NrcXVvdGUgdHlwZT0i
Y2l0ZSIgY2l0ZT0ibWlkOk1OMlBSMTVNQjI1OTIwNDA1MEE5NjQ3NkQxNUVDQTYxM0Y1RDA5QE1O
MlBSMTVNQjI1OTIubmFtcHJkMTUucHJvZC5vdXRsb29rLmNvbSI+CiAgICAgIAogICAgICA8bWV0
YSBuYW1lPSJHZW5lcmF0b3IiIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDE1IChmaWx0ZXJlZAog
ICAgICAgIG1lZGl1bSkiPgogICAgICA8c3R5bGU+QGZvbnQtZmFjZQoJe2ZvbnQtZmFtaWx5Oldp
bmdkaW5nczsKCXBhbm9zZS0xOjUgMCAwIDAgMCAwIDAgMCAwIDA7fUBmb250LWZhY2UKCXtmb250
LWZhbWlseToiQ2FtYnJpYSBNYXRoIjsKCXBhbm9zZS0xOjIgNCA1IDMgNSA0IDYgMyAyIDQ7fUBm
b250LWZhY2UKCXtmb250LWZhbWlseTpEZW5nWGlhbjsKCXBhbm9zZS0xOjIgMSA2IDAgMyAxIDEg
MSAxIDE7fUBmb250LWZhY2UKCXtmb250LWZhbWlseTpDYWxpYnJpOwoJcGFub3NlLTE6MiAxNSA1
IDIgMiAyIDQgMyAyIDQ7fUBmb250LWZhY2UKCXtmb250LWZhbWlseToiXEBEZW5nWGlhbiI7Cglw
YW5vc2UtMToyIDEgNiAwIDMgMSAxIDEgMSAxO31wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBk
aXYuTXNvTm9ybWFsCgl7bWFyZ2luOjBjbTsKCWZvbnQtc2l6ZToxMS4wcHQ7Cglmb250LWZhbWls
eToiQ2FsaWJyaSIsc2Fucy1zZXJpZjt9YTpsaW5rLCBzcGFuLk1zb0h5cGVybGluawoJe21zby1z
dHlsZS1wcmlvcml0eTo5OTsKCWNvbG9yOmJsdWU7Cgl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5l
O31zcGFuLkVtYWlsU3R5bGUyMAoJe21zby1zdHlsZS10eXBlOnBlcnNvbmFsLXJlcGx5OwoJZm9u
dC1mYW1pbHk6IkNhbGlicmkiLHNhbnMtc2VyaWY7Cgljb2xvcjp3aW5kb3d0ZXh0O30uTXNvQ2hw
RGVmYXVsdAoJe21zby1zdHlsZS10eXBlOmV4cG9ydC1vbmx5OwoJZm9udC1zaXplOjEwLjBwdDt9
ZGl2LldvcmRTZWN0aW9uMQoJe3BhZ2U6V29yZFNlY3Rpb24xO31vbAoJe21hcmdpbi1ib3R0b206
MGNtO311bAoJe21hcmdpbi1ib3R0b206MGNtO308L3N0eWxlPjwhLS1baWYgZ3RlIG1zbyA5XT48
eG1sPgo8bzpzaGFwZWRlZmF1bHRzIHY6ZXh0PSJlZGl0IiBzcGlkbWF4PSIxMDI2IiAvPgo8L3ht
bD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KPG86c2hhcGVsYXlvdXQgdjpl
eHQ9ImVkaXQiPgo8bzppZG1hcCB2OmV4dD0iZWRpdCIgZGF0YT0iMSIgLz4KPC9vOnNoYXBlbGF5
b3V0PjwveG1sPjwhW2VuZGlmXS0tPgogICAgICA8ZGl2IGNsYXNzPSJXb3JkU2VjdGlvbjEiPgog
ICAgICAgIDxwIGNsYXNzPSJNc29Ob3JtYWwiPkhpIEpvcm4sPG86cD48L286cD48L3A+CiAgICAg
ICAgPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+CiAgICAgICAgPHAg
Y2xhc3M9Ik1zb05vcm1hbCI+Q29ycmVjdCBidXQgdGhlc2UgYnVsbGV0cyBhcmUgb25seSBpbnRl
bmRlZAogICAgICAgICAgZm9yIHRoZSBkb3duY2FsbCBpbnZvY2F0aW9uIHJhdGhlciB0aGFuIHRo
ZSB1cGNhbGwgc3R1Yi48bzpwPjwvbzpwPjwvcD4KICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFs
Ij48bzpwPiZuYnNwOzwvbzpwPjwvcD4KICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIj5BY2Nv
cmRpbmcgdG8gdGhlIGV4cGxhbmF0aW9uIG9mIHVwY2FsbCBzdHViCiAgICAgICAgICBpbiBbMV0g
YXMgZm9sbG93czo8bzpwPjwvbzpwPjwvcD4KICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIj7i
gJxXaGVuIGNyZWF0aW5nIHVwY2FsbCBzdHVicyB0aGUgbGlua2VyCiAgICAgICAgICBydW50aW1l
Li4uLjxvOnA+PC9vOnA+PC9wPgogICAgICAgIDxwIGNsYXNzPSJNc29Ob3JtYWwiPk1vcmVvdmVy
LCBpZiB0aGUgdGFyZ2V0IG1ldGhvZCBoYW5kbGUKICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBh
biB1cGNhbGwgc3R1YiByZXR1cm5zIGEgbWVtb3J5IGFkZHJlc3MsPG86cD48L286cD48L3A+CiAg
ICAgICAgPHAgY2xhc3M9Ik1zb05vcm1hbCI+Y2xpZW50cyBtdXN0IGVuc3VyZSB0aGF0IHRoaXMg
YWRkcmVzcwogICAgICAgICAgY2Fubm90IGJlY29tZSBpbnZhbGlkIGFmdGVyIHRoZSB1cGNhbGwg
Y29tcGxldGVzLgogICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OldpbmdkaW5ncyI+
w588L3NwYW4+LS0tLS0tLS0tLS0tLS0tLS08bzpwPjwvbzpwPjwvcD4KICAgICAgICA8cCBjbGFz
cz0iTXNvTm9ybWFsIj5UaGlzIGNhbiBsZWFkIHRvIHVuc3BlY2lmaWVkIGJlaGF2aW9yLCBhbmQK
ICAgICAgICAgIGV2ZW4gSlZNIGNyYXNoZXMsIHNpbmNlIGFuIHVwY2FsbCBpcwogICAgICAgICAg
PG86cD48L286cD48L3A+CiAgICAgICAgPHAgY2xhc3M9Ik1zb05vcm1hbCI+dHlwaWNhbGx5IGV4
ZWN1dGVkIGluIHRoZSBjb250ZXh0IG9mIGEKICAgICAgICAgIGRvd25jYWxsIG1ldGhvZCBoYW5k
bGUgaW52b2NhdGlvbi7igJ08bzpwPjwvbzpwPjwvcD4KICAgICAgICA8cCBjbGFzcz0iTXNvTm9y
bWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4KICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIj5J
IGRvbuKAmXQgdW5kZXJzdGFuZCBob3cvd2hhdCBjbGllbnRzIHNob3VsZAogICAgICAgICAgZG8g
dG8gZW5zdXJlIHRoZSBhZGRyZXNzIG9mIHRoZSB1cGNhbGwgc3R1YiBpcyBhbGl2ZSBkdXJpbmcK
ICAgICAgICAgIHRoZSB1cGNhbGwgaW52b2NhdGlvbiB3aXRoaW4gYW4gaW1wbGljYXRpb24gc2Vz
c2lvbi48bzpwPjwvbzpwPjwvcD4KICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIj5Eb2VzIHRo
YXQgbWVhbiB0aGUgaW1wbGljaXQgc2Vzc2lvbiBpcwogICAgICAgICAgQUxSRUFEWSBrZXB0IGFs
aXZlIGluIHRoZSBleGlzdGluZyBpbXBsZW1lbnRhdGlvbiBvZiBPcGVuSkRLCiAgICAgICAgICAo
d2hpY2ggSSBkb27igJl0IHRoaW5rIHNvKSB0byBndWFyYW50ZWUgdGhlIHVwY2FsbCBzdHViIHdv
cmtzCiAgICAgICAgICBkdXJpbmcgdGhlIHVwY2FsbCBpbnZvY2F0aW9uIGJhc2VkIG9uIHRoZSBl
eHBsYW5hdGlvbiBpbiBbMV0/PG86cD48L286cD48L3A+CiAgICAgICAgPHAgY2xhc3M9Ik1zb05v
cm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+CiAgICAgICAgPHAgY2xhc3M9Ik1zb05vcm1hbCI+
QmVzdCBSZWdhcmRzPG86cD48L286cD48L3A+CiAgICAgICAgPHAgY2xhc3M9Ik1zb05vcm1hbCI+
Q2hlbmcgSmluPG86cD48L286cD48L3A+CiAgICAgICAgPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86
cD4mbmJzcDs8L286cD48L3A+CiAgICAgICAgPGRpdiBzdHlsZT0iYm9yZGVyOm5vbmU7Ym9yZGVy
LXRvcDpzb2xpZCAjRTFFMUUxCiAgICAgICAgICAxLjBwdDtwYWRkaW5nOjMuMHB0IDBjbSAwY20g
MGNtIj4KICAgICAgICAgIDxwIGNsYXNzPSJNc29Ob3JtYWwiPjxiPjxzcGFuIGxhbmc9IkVOLVVT
Ij5Gcm9tOjwvc3Bhbj48L2I+PHNwYW4gbGFuZz0iRU4tVVMiPiBKb3JuIFZlcm5lZSA8YSBjbGFz
cz0ibW96LXR4dC1saW5rLXJmYzIzOTZFIiBocmVmPSJtYWlsdG86am9ybi52ZXJuZWVAb3JhY2xl
LmNvbSIgbW96LWRvLW5vdC1zZW5kPSJ0cnVlIj4mbHQ7am9ybi52ZXJuZWVAb3JhY2xlLmNvbSZn
dDs8L2E+CiAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgIDxiPlNlbnQ6PC9iPiBKYW51
YXJ5IDMxLCAyMDIzIDI6MTQgUE08YnI+CiAgICAgICAgICAgICAgPGI+VG86PC9iPiBDaGVuZyBK
aW4gPGEgY2xhc3M9Im1vei10eHQtbGluay1yZmMyMzk2RSIgaHJlZj0ibWFpbHRvOmppbmNoZW5n
QGNhLmlibS5jb20iIG1vei1kby1ub3Qtc2VuZD0idHJ1ZSI+Jmx0O2ppbmNoZW5nQGNhLmlibS5j
b20mZ3Q7PC9hPjsKICAgICAgICAgICAgICA8YSBjbGFzcz0ibW96LXR4dC1saW5rLWFiYnJldmlh
dGVkIG1vei10eHQtbGluay1mcmVldGV4dCIgaHJlZj0ibWFpbHRvOnBhbmFtYS1kZXZAb3Blbmpk
ay5vcmciIG1vei1kby1ub3Qtc2VuZD0idHJ1ZSI+cGFuYW1hLWRldkBvcGVuamRrLm9yZzwvYT48
YnI+CiAgICAgICAgICAgICAgPGI+U3ViamVjdDo8L2I+IFtFWFRFUk5BTF0gUmU6IEluYXBwcm9w
cmlhdGUgdXNlIG9mIHRoZQogICAgICAgICAgICAgIGltcGxpY2l0IHNlc3Npb24gaW4gYWxsb2Nh
dGluZyB0aGUgdXBjYWxsIHN0dWIgaW4KICAgICAgICAgICAgICBTYWZlRnVuY3Rpb25BY2Nlc3NU
ZXN0LmphdmE8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHAg
Y2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+CiAgICAgICAgPGRpdj4KICAg
ICAgICAgIDxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtc28tbGluZS1oZWlnaHQtYWx0Oi43
NXB0Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEuMHB0O2NvbG9yOndoaXRlIj5IaSBDaGVuZyBK
aW4sIFRoYW5rcwogICAgICAgICAgICAgIGZvciB0aGUgZW1haWwuIEluIHRoaXMgY2FzZSBpdCBp
cyBub3QgYSBwcm9ibGVtIHNpbmNlCiAgICAgICAgICAgICAgbWVtb3J5IHNlc3Npb25zIChpbmNs
dWRpbmcgdXBjYWxsIHN0dWJzKSBhcmUga2VwdAogICAgICAgICAgICAgIGFsaXZlL3JlYWNoYWJs
ZSBmb3IgdGhlIGR1cmF0aW9uIG9mIGEgZG93bmNhbGwgKHNlZSB0aGUKICAgICAgICAgICAgICB0
aGlyZCBidWxsZXQgaGVyZTogWzFdKSAiVGhlIG1lbW9yeSBzZXNzaW9uIG9mIFIgaXMga2VwdCA8
bzpwPgogICAgICAgICAgICAgIDwvbzpwPjwvc3Bhbj48L3A+CiAgICAgICAgPC9kaXY+CiAgICAg
ICAgPGRpdj4KICAgICAgICAgIDxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtc28tbGluZS1o
ZWlnaHQtYWx0Oi43NXB0Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEuMHB0O2NvbG9yOndoaXRl
Ij5aalFjbVFSWUZwZnB0QmFubmVyU3RhcnQ8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CiAgICAgICAg
PC9kaXY+CiAgICAgICAgPHRhYmxlIGNsYXNzPSJNc29Ob3JtYWxUYWJsZSIgc3R5bGU9IndpZHRo
OjEwMC4wJTtib3JkZXItcmFkaXVzOjRweCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBj
ZWxscGFkZGluZz0iMCIgYm9yZGVyPSIwIj4KICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAg
PHRyPgogICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzoxMi4wcHQgMGNtIDEyLjBwdCAw
Y20iPgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJNc29Ob3JtYWxUYWJsZSIgc3R5bGU9
IndpZHRoOjEwMC4wJTtiYWNrZ3JvdW5kOiNEMEQ4REM7Ym9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpz
b2xpZAogICAgICAgICAgICAgICAgICAjOTBBNEFFIDMuMHB0IiB3aWR0aD0iMTAwJSIgY2VsbHNw
YWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBib3JkZXI9IjEiPgogICAgICAgICAgICAgICAgICA8
dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRk
IHN0eWxlPSJib3JkZXI6bm9uZTtwYWRkaW5nOjBjbSA3LjVwdCAzLjc1cHQKICAgICAgICAgICAg
ICAgICAgICAgICAgNC41cHQiIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAg
PHRhYmxlIGNsYXNzPSJNc29Ob3JtYWxUYWJsZSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5n
PSIwIiBib3JkZXI9IjAiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8
dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzozLjBwdCA2LjBwdCAzLjBwdAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIDYuMHB0Ij4KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIj48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEw
LjVwdDtmb250LWZhbWlseTomcXVvdDtBcmlhbCZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOmJsYWNr
Ij5UaGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBJcyBG
cm9tIGFuIEV4dGVybmFsIFNlbmRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDxvOnA+PC9vOnA+PC9zcGFuPjwvYj48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5
bGU9InBhZGRpbmc6My4wcHQgNi4wcHQgMy4wcHQKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICA2LjBwdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9Ik1z
b05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTo5LjBwdDtmb250LWZhbWlseTomcXVvdDtB
cmlhbCZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOmJsYWNrIj5UaGlzCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgY2FtZSBmcm9tIG91dHNpZGUgeW91cgogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmdhbml6YXRpb24uCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+
CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgICAgICAg
ICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAg
ICAgPC90cj4KICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgIDwvdGFi
bGU+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgIDwvdGJv
ZHk+CiAgICAgICAgPC90YWJsZT4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHAgY2xhc3M9Ik1z
b05vcm1hbCIgc3R5bGU9Im1zby1saW5lLWhlaWdodC1hbHQ6Ljc1cHQiPjxzcGFuIHN0eWxlPSJm
b250LXNpemU6MS4wcHQ7Y29sb3I6d2hpdGUiPlpqUWNtUVJZRnBmcHRCYW5uZXJFbmQ8bzpwPjwv
bzpwPjwvc3Bhbj48L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHA+SGkgQ2hlbmcgSmluLDxv
OnA+PC9vOnA+PC9wPgogICAgICAgIDxwPlRoYW5rcyBmb3IgdGhlIGVtYWlsLjxicj4KICAgICAg
ICAgIDxicj4KICAgICAgICAgIEluIHRoaXMgY2FzZSBpdCBpcyBub3QgYSBwcm9ibGVtIHNpbmNl
IG1lbW9yeSBzZXNzaW9ucwogICAgICAgICAgKGluY2x1ZGluZyB1cGNhbGwgc3R1YnMpIGFyZSBr
ZXB0IGFsaXZlL3JlYWNoYWJsZSBmb3IgdGhlCiAgICAgICAgICBkdXJhdGlvbiBvZiBhIGRvd25j
YWxsIChzZWUgdGhlIHRoaXJkIGJ1bGxldCBoZXJlOiBbMV0pPG86cD48L286cD48L3A+CiAgICAg
ICAgPHA+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICJUaGUgbWVtb3J5IHNlc3Npb24gb2YgUiBpcyBrZXB0
IGFsaXZlIChhbmQgY2Fubm90IGJlCiAgICAgICAgICBjbG9zZWQpIGR1cmluZyB0aGUgaW52b2Nh
dGlvbi4iPG86cD48L286cD48L3A+CiAgICAgICAgPHA+U2luY2Ugd2UgZG9uJ3Qgc3RvcmUgYSBy
ZWZlcmVuY2UgdG8gdGhlIHVwY2FsbCBzdHViIGluIG5hdGl2ZQogICAgICAgICAgY29kZSB1bnRp
bCBhZnRlciB0aGUgZG93bmNhbGwgcmV0dXJucywgdGhpcyBpcyBzYWZlIHRvIHJlbHkKICAgICAg
ICAgIG9uLjxvOnA+PC9vOnA+PC9wPgogICAgICAgIDxwPkNoZWVycyw8YnI+CiAgICAgICAgICBK
b3JuPG86cD48L286cD48L3A+CiAgICAgICAgPHA+WzFdOiA8YSBocmVmPSJodHRwczovL2RvY3Mu
b3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xOS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9sYW5n
L2ZvcmVpZ24vTGlua2VyLmh0bWwjc2FmZXR5IiBtb3otZG8tbm90LXNlbmQ9InRydWUiIGNsYXNz
PSJtb3otdHh0LWxpbmstZnJlZXRleHQiPmh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEv
amF2YXNlLzE5L2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL2xhbmcvZm9yZWlnbi9MaW5rZXIuaHRt
bCNzYWZldHk8L2E+PG86cD48L286cD48L3A+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwIGNs
YXNzPSJNc29Ob3JtYWwiPk9uIDMxLzAxLzIwMjMgMTg6NDksIENoZW5nIEppbiB3cm90ZTo8bzpw
PjwvbzpwPjwvcD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8YmxvY2txdW90ZSBzdHlsZT0ibWFy
Z2luLXRvcDo1LjBwdDttYXJnaW4tYm90dG9tOjUuMHB0Ij4KICAgICAgICAgIDxwIGNsYXNzPSJN
c29Ob3JtYWwiPkhpIHRoZXJlLCA8bzpwPjwvbzpwPjwvcD4KICAgICAgICAgIDxwIGNsYXNzPSJN
c29Ob3JtYWwiPiZuYnNwOzxvOnA+PC9vOnA+PC9wPgogICAgICAgICAgPHAgY2xhc3M9Ik1zb05v
cm1hbCI+SSBub3RpY2UgdGhlcmUgbWlnaHQgYmUgYW4gaXNzdWUgd2l0aCB0aGUKICAgICAgICAg
ICAgYWxsb2NhdGlvbiBvZiB1cGNhbGwgc3R1YiB1bmRlciBhbiBpbXBsaWNpdCBzZXNzaW9uIGF0
CiAgICAgICAgICAgIHRlc3QvamRrL2phdmEvZm9yZWlnbi9TYWZlRnVuY3Rpb25BY2Nlc3NUZXN0
LmphdmEgaW4gSkRLMTkrCiAgICAgICAgICAgIGFzIGZvbGxvd3M6PG86cD48L286cD48L3A+CiAg
ICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4KICAgICAg
ICAgIDxwIGNsYXNzPSJNc29Ob3JtYWwiPmUuZy48bzpwPjwvbzpwPjwvcD4KICAgICAgICAgIDxw
IGNsYXNzPSJNc29Ob3JtYWwiPiZuYnNwOzxvOnA+PC9vOnA+PC9wPgogICAgICAgICAgPHAgY2xh
c3M9Ik1zb05vcm1hbCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IEBUZXN0PG86cD48L286cD48L3A+CiAg
ICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIj4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHZv
aWQKICAgICAgICAgICAgdGVzdENsb3NlZFN0cnVjdENhbGxiYWNrKCkgdGhyb3dzIFRocm93YWJs
ZSB7PG86cD48L286cD48L3A+CiAgICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIj4mbmJzcDsm
bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgTWV0aG9kSGFuZGxlIGhhbmRsZSA9
CiAgICAgICAgICAgIExpbmtlci5uYXRpdmVMaW5rZXIoKS5kb3duY2FsbEhhbmRsZSg8bzpwPjwv
bzpwPjwvcD4KICAgICAgICAgIDxwIGNsYXNzPSJNc29Ob3JtYWwiPiZuYnNwOyZuYnNwOyZuYnNw
OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOwogICAgICAgICAgICBmaW5kTmF0aXZlT3JUaHJvdygiYWRkcl9mdW5j
X2NiIiksPG86cD48L286cD48L3A+CiAgICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIj4mbmJz
cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKICAgICAgICAgICAgRnVuY3Rpb25EZXNjcmlw
dG9yLm9mVm9pZChDX1BPSU5URVIsIENfUE9JTlRFUikpOzxvOnA+PC9vOnA+PC9wPgogICAgICAg
ICAgPHAgY2xhc3M9Ik1zb05vcm1hbCI+Jm5ic3A7PG86cD48L286cD48L3A+CiAgICAgICAgICA8
cCBjbGFzcz0iTXNvTm9ybWFsIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
bmJzcDsgdHJ5IChNZW1vcnlTZXNzaW9uIHNlc3Npb24gPQogICAgICAgICAgICBNZW1vcnlTZXNz
aW9uLm9wZW5Db25maW5lZCgpKSB7PG86cD48L286cD48L3A+CiAgICAgICAgICA8cCBjbGFzcz0i
TXNvTm9ybWFsIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
cDsmbmJzcDsmbmJzcDsmbmJzcDtNZW1vcnlTZWdtZW50IHNlZ21lbnQgPQogICAgICAgICAgICBN
ZW1vcnlTZWdtZW50LmFsbG9jYXRlTmF0aXZlKFBPSU5ULCBzZXNzaW9uKTs8bzpwPjwvbzpwPjwv
cD4KICAgICAgICAgIDxwIGNsYXNzPSJNc29Ob3JtYWwiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBoYW5kbGUuaW52b2tl
KHNlZ21lbnQsCiAgICAgICAgICAgIHNlc3Npb25DaGVja2VyKHNlc3Npb24pKTsKICAgICAgICAg
ICAgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OldpbmdkaW5ncyI+w588L3NwYW4+LS0tLS0tLS0t
LS0tLS0tCiAgICAgICAgICAgIHRoZSB1cGNhbGwgc3R1YiBpcyBhbGxvY2F0ZWQgaW4gc2Vzc2lv
bkNoZWNrZXIoKTxvOnA+PC9vOnA+PC9wPgogICAgICAgICAgPHAgY2xhc3M9Ik1zb05vcm1hbCI+
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08bzpwPjwvbzpwPjwv
cD4KICAgICAgICAgIDxwIGNsYXNzPSJNc29Ob3JtYWwiPiZuYnNwOyZuYnNwOyZuYnNwOyB9PG86
cD48L286cD48L3A+CiAgICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIj4mbmJzcDs8bzpwPjwv
bzpwPjwvcD4KICAgICAgICAgIDxwIGNsYXNzPSJNc29Ob3JtYWwiPiZuYnNwOyZuYnNwOyZuYnNw
OyBNZW1vcnlTZWdtZW50CiAgICAgICAgICAgIHNlc3Npb25DaGVja2VyKE1lbW9yeVNlc3Npb24g
c2Vzc2lvbikgezxvOnA+PC9vOnA+PC9wPgogICAgICAgICAgPHAgY2xhc3M9Ik1zb05vcm1hbCI+
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwO3RyeSB7PG86cD48L286
cD48L3A+CiAgICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIj4mbmJzcDsmbmJzcDsmbmJzcDsm
bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgTWV0aG9kSGFu
ZGxlIGhhbmRsZSA9CiAgICAgICAgICAgIE1ldGhvZEhhbmRsZXMubG9va3VwKCkuZmluZFN0YXRp
YyhTYWZlRnVuY3Rpb25BY2Nlc3NUZXN0LmNsYXNzLAogICAgICAgICAgICAiY2hlY2tTZXNzaW9u
Iiw8bzpwPjwvbzpwPjwvcD4KICAgICAgICAgIDxwIGNsYXNzPSJNc29Ob3JtYWwiPiZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwogICAgICAg
ICAgICBNZXRob2RUeXBlLm1ldGhvZFR5cGUodm9pZC5jbGFzcywgTWVtb3J5U2Vzc2lvbi5jbGFz
cykpOzxvOnA+PC9vOnA+PC9wPgogICAgICAgICAgPHAgY2xhc3M9Ik1zb05vcm1hbCI+Jm5ic3A7
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
c3A7IGhhbmRsZSA9CiAgICAgICAgICAgIGhhbmRsZS5iaW5kVG8oc2Vzc2lvbik7PG86cD48L286
cD48L3A+CiAgICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIj4mbmJzcDsmbmJzcDsmbmJzcDsm
bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcmV0dXJuCiAg
ICAgICAgICAgIExpbmtlci5uYXRpdmVMaW5rZXIoKS51cGNhbGxTdHViKGhhbmRsZSwKICAgICAg
ICAgICAgRnVuY3Rpb25EZXNjcmlwdG9yLm9mVm9pZCgpLCBNZW1vcnlTZXNzaW9uLm9wZW5JbXBs
aWNpdCgpKTsKICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OldpbmdkaW5ncyI+
w588L3NwYW4+LS0tLS10aGUgdXBjYWxsCiAgICAgICAgICAgIHN0dWIgaXMgYWxsb2NhdGVkIHdp
dGggYW4gaW1wbGljaXQgc2Vzc2lvbjxvOnA+PC9vOnA+PC9wPgogICAgICAgICAgPHAgY2xhc3M9
Ik1zb05vcm1hbCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH0g
Y2F0Y2ggKFRocm93YWJsZSBleCkgezxvOnA+PC9vOnA+PC9wPgogICAgICAgICAgPHAgY2xhc3M9
Ik1zb05vcm1hbCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihleCk7PG86cD48
L286cD48L3A+CiAgICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIj4mbmJzcDsmbmJzcDsmbmJz
cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfTxvOnA+PC9vOnA+PC9wPgogICAgICAgICAgPHAg
Y2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9InRleHQtaW5kZW50OjkuOXB0Ij59PG86cD48L286cD48
L3A+CiAgICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4K
ICAgICAgICAgIDxwIGNsYXNzPSJNc29Ob3JtYWwiPkl0IGlzIGNvcnJlY3QgdG8gYWxsb2NhdGUg
dGhlIHVwY2FsbCBzdHViCiAgICAgICAgICAgIHdpdGggYSBzZXNzaW9uIGRpZmZlcmVudCBmcm9t
IHRoZSBjdXJyZW50IHNlc3Npb24gaW4gdGVzdHMKICAgICAgICAgICAgZ2l2ZW4gdGhlc2UgdGVz
dHMgaW50ZW5kIHRvIGNsb3NlIHRoZSBjdXJyZW50IHNlc3Npb24gaW4KICAgICAgICAgICAgdXBj
YWxsIHRvIHZlcmlmeSB0aGUgYmVoYXZpb3IuIEJ1dCBpdCBpcyBwcm9ibGVtYXRpYyB0bwogICAg
ICAgICAgICBleHBsb2l0IGFuIGltcGxpY2l0IHNlc3Npb24gYmFja2VkIGJ5IEdDLCBpbiB3aGlj
aCBjYXNlIHRoZQogICAgICAgICAgICBtZW1vcnkgb2YgdGhlIHVwY2FsbCBzdHViIGlzIG1vcmUg
bGlrZWx5IHRvIGJlIGZvcmNlZCB0bwogICAgICAgICAgICByZWxlYXNlIGJ5IEdDICh3aGVuIGlt
cGxpY2l0bHkgY2xvc2luZyB0aGUgc2Vzc2lvbiB0byBmcmVlCiAgICAgICAgICAgIG1lbW9yeSkg
ZXNwZWNpYWxseSBvbiB0aGUgbWVtb3J5LXJlc3RyaWN0ZWQgbWFjaGluZXMsIHdoaWNoCiAgICAg
ICAgICAgIGxlYWRzIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IgaW4gdXBjYWxsIChlLmcuIGNyYXNo
IHdoaWNoIHdhcwogICAgICAgICAgICBjYXB0dXJlZCByZWNlbnRseSkuIFRvIHdvcmsgYXJvdW5k
IHRoaXMgY2FzZSwgSeKAmWQgc3VnZ2VzdCB0bwogICAgICAgICAgICByZXBsYWNlIGl0IHdpdGgg
YSBnbG9iYWwgc2Vzc2lvbiBvciBvdGhlcnMgc28gYXMgdG8ga2VlcCB0aGUKICAgICAgICAgICAg
dXBjYWxsIHN0dWIgYWxpdmUgZHVyaW5nIHRoZSB1cGNhbGwuPG86cD48L286cD48L3A+CiAgICAg
ICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4KICAgICAgICAg
IDxwIGNsYXNzPSJNc29Ob3JtYWwiPkJlc3QgUmVnYXJkczxvOnA+PC9vOnA+PC9wPgogICAgICAg
ICAgPHAgY2xhc3M9Ik1zb05vcm1hbCI+Q2hlbmcgSmluPG86cD48L286cD48L3A+CiAgICAgICAg
PC9ibG9ja3F1b3RlPgogICAgICA8L2Rpdj4KICAgIDwvYmxvY2txdW90ZT4KICAKCgo8L2Jsb2Nr
cXVvdGU+" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;"></div>
</div>
</body>
</html>