<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div class="markdown-here-wrapper" data-md-url="" style="">
<p style="margin: 0px 0px 1.2em !important;">Hi,<br>
what OS/platform are you on?</p>
<p style="margin: 0px 0px 1.2em !important;">I tried a small
example on my Linux/x64:</p>
<pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code class="hljs language-c" style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); background: rgb(248, 248, 248); -moz-text-size-adjust: none;"><span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// foo.c</span>
<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">const</span> <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">int</span> x = <span class="hljs-number" style="color: rgb(0, 128, 128);">4</span>;
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">Then compiled to a
shared library:</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;">gcc -shared -o foo.so
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">Then, from jshell:</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;">jshell> import java.lang.foreign.*;
jshell> SymbolLookup lookup = SymbolLookup.libraryLookup("./foo.so", Arena.global());
lookup ==> java.lang.foreign.SymbolLookup$$Lambda/0x00007f8d6705ac18@4459eb14
jshell> lookup.findOrThrow("x");
$3 ==> MemorySegment{ address: 0x7f8dc403c000, byteSize: 0 }
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">So, the symbol seems
to be there, which is also confirmed 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;">objdump</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;">foo.so: file format elf64-x86-64
DYNAMIC SYMBOL TABLE:
0000000000000000 w D *UND* 0000000000000000 __cxa_finalize
0000000000000000 w D *UND* 0000000000000000 _ITM_registerTMCloneTable
0000000000000000 w D *UND* 0000000000000000 _ITM_deregisterTMCloneTable
0000000000000000 w D *UND* 0000000000000000 __gmon_start__
0000000000002000 g DO .rodata 0000000000000004 x
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">(see last line)</p>
<p style="margin: 0px 0px 1.2em !important;">I’d suggest to maybe
check that (a) the shared library you are using (.so or .dll)
does contain the constant variable symbols we’re trying to
lookup and (b) that jextract is using a correct symbol lookup
(e.g. one that points to your library). For (b) you might want
to refer this for further guidance:</p>
<p style="margin: 0px 0px 1.2em !important;"><a href="https://github.com/openjdk/jextract/blob/master/doc/GUIDE.md#library-loading" class="moz-txt-link-freetext">https://github.com/openjdk/jextract/blob/master/doc/GUIDE.md#library-loading</a></p>
<p style="margin: 0px 0px 1.2em !important;">Cheers<br>
Maurizio</p>
<p style="margin: 0px 0px 1.2em !important;">On 08/12/2024 15:38,
Adrian Trapletti wrote:</p>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div class="markdown-here-exclude">
<p></p>
<blockquote type="cite" cite="mid:CAGHZknEGZBugGhJH6gCMGT5v8CDd75bBaxXc+3b5eFayc6emzQ@mail.gmail.com">
<div dir="ltr">
<div>Hi,</div>
<div><br>
</div>
<div>I run jextract on <a href="https://github.com/ERGO-Code/HiGHS/blob/master/src/interfaces/highs_c_api.h" moz-do-not-send="true" class="moz-txt-link-freetext">https://github.com/ERGO-Code/HiGHS/blob/master/src/interfaces/highs_c_api.h</a>. </div>
<div><br>
</div>
<div>If I use the Java bindings to access the const
variables I get "java.lang.UnsatisfiedLinkError:
unresolved symbol". </div>
<div><br>
</div>
<div>For example</div>
<div>...</div>
<div>long sense = kHighsObjSenseMinimize();</div>
<div>...</div>
<div><br>
</div>
<div>results in</div>
<div><br>
</div>
<div>java.lang.UnsatisfiedLinkError: unresolved symbol:
kHighsObjSenseMinimize<br>
at
com.ustermetrics.highs4j/com.ustermetrics.highs4j.bindings.highs_c_api_h.lambda$findOrThrow$0(highs_c_api_h.java:44)<br>
at
java.base/java.util.Optional.orElseThrow(Optional.java:403)<br>
at
com.ustermetrics.highs4j/com.ustermetrics.highs4j.bindings.highs_c_api_h.findOrThrow(highs_c_api_h.java:44)<br>
at
com.ustermetrics.highs4j/com.ustermetrics.highs4j.bindings.highs_c_api_h$kHighsObjSenseMinimize$constants.<clinit>(highs_c_api_h.java:804)<br>
at
com.ustermetrics.highs4j/com.ustermetrics.highs4j.bindings.highs_c_api_h.kHighsObjSenseMinimize(highs_c_api_h.java:834)<br>
at
com.ustermetrics.highs4j/com.ustermetrics.highs4j.bindings.BindingsTest.solveLinearProgramReturnsExpectedSolution(BindingsTest.java:32)<br>
at
java.base/java.lang.reflect.Method.invoke(Method.java:580)<br>
at
java.base/java.util.ArrayList.forEach(ArrayList.java:1597)<br>
at
java.base/java.util.ArrayList.forEach(ArrayList.java:1597)</div>
<div><br>
</div>
<div>(<a href="https://github.com/atraplet/highs4j" moz-do-not-send="true" class="moz-txt-link-freetext">https://github.com/atraplet/highs4j</a>
and run the unit tests)</div>
<div><br>
</div>
<div>What do I miss here? </div>
<div><br>
</div>
<div>Thx and best regards,</div>
<div>Adrian</div>
<div><br>
</div>
<div>
<div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div><font size="2" face="arial, helvetica, sans-serif" color="#000000"><b>Dr. Adrian
Trapletti</b></font></div>
<div><font size="2" face="arial, helvetica, sans-serif" color="#000000">CEO</font></div>
<div><font size="2" face="arial, helvetica, sans-serif" color="#000000"><br>
</font></div>
<div><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif"><b>Uster
Metrics GmbH </b></span><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif">|
Steinstrasse 9b, </span><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif">8610
Uster, </span><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif">Switzerland</span><br>
</div>
<div><font size="2" face="arial, helvetica, sans-serif" color="#000000">P +41 32 512 83 63
| </font><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:small">M
+41 79 103 71 31</span></div>
<div><a href="mailto:a.trapletti@ustermetrics.com" style="font-family:arial,helvetica,sans-serif;font-size:small" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">a.trapletti@ustermetrics.com</a>
| <a href="http://www.ustermetrics.com" style="font-family:arial,helvetica,sans-serif;font-size:small" target="_blank" moz-do-not-send="true">www.ustermetrics.com</a></div>
<div><font size="2" face="arial, helvetica, sans-serif" color="#000000"><br>
</font></div>
<div><font size="2" face="arial, helvetica, sans-serif" color="#000000"><br>
</font></div>
<div><font color="#999999"><font size="1" face="arial, helvetica, sans-serif">This email message including any
attachments is confidential and
may </font><span style="font-family:arial,helvetica,sans-serif;font-size:x-small">be
privileged. It is intended solely
for the use of the individual or </span><span style="font-family:arial,helvetica,sans-serif;font-size:x-small">entity
named on this message. It is
provided for informational
purposes </span><span style="font-family:arial,helvetica,sans-serif;font-size:x-small">only
and does not constitute an offer
or invitation to subscribe for </span><span style="font-family:arial,helvetica,sans-serif;font-size:x-small">or
purchase any services or products.
Any form of disclosure, copying, </span><font size="1" face="arial, helvetica, sans-serif">modification or distribution is
unauthorized. If you are not the </font><span style="font-family:arial,helvetica,sans-serif;font-size:x-small">intended
recipient, you are requested to
please notify the sender </span><span style="font-family:arial,helvetica,sans-serif;font-size:x-small">immediately
and delete the message including
any attachments from </span><span style="font-family:arial,helvetica,sans-serif;font-size:x-small">your
computer system network. </span></font><font style="color:rgb(153,153,153)" size="1" face="arial, helvetica, sans-serif">Email
transmission cannot be guaranteed to
be secure or error free as </font><span style="color:rgb(153,153,153);font-family:arial,helvetica,sans-serif;font-size:x-small">information
could be modified. We therefore do
not accept responsibility </span><span style="color:rgb(153,153,153);font-family:arial,helvetica,sans-serif;font-size:x-small">or
liability as to the completeness or
accuracy of the information </span><span style="color:rgb(153,153,153);font-size:x-small;font-family:arial,helvetica,sans-serif">contained
in this message or any attachments.</span></div>
<div><font face="arial, helvetica, sans-serif"><br>
<br>
<br>
</font></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<p></p>
</div>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div title="MDH:PHA+SGksPGJyPndoYXQgT1MvcGxhdGZvcm0gYXJlIHlvdSBvbj88L3A+PHA+SSB0cmllZCBhIHNt
YWxsIGV4YW1wbGUgb24gbXkgTGludXgveDY0OjwvcD48cD5gYGBjPGJyPi8vIGZvby5jPGJyPmNv
bnN0IGludCB4ID0gNDs8YnI+YGBgPC9wPjxwPlRoZW4gY29tcGlsZWQgdG8gYSBzaGFyZWQgbGli
cmFyeTo8YnI+PGJyPmBgYDxicj5nY2MgLXNoYXJlZCAtbyBmb28uc288YnI+YGBgPC9wPjxwPlRo
ZW4sIGZyb20ganNoZWxsOjwvcD48cD5gYGA8YnI+anNoZWxsJmd0OyBpbXBvcnQgamF2YS5sYW5n
LmZvcmVpZ24uKjs8YnI+PGJyPmpzaGVsbCZndDsgU3ltYm9sTG9va3VwIGxvb2t1cCA9IFN5bWJv
bExvb2t1cC5saWJyYXJ5TG9va3VwKCIuL2Zvby5zbyIsIEFyZW5hLmdsb2JhbCgpKTs8YnI+bG9v
a3VwID09Jmd0OyBqYXZhLmxhbmcuZm9yZWlnbi5TeW1ib2xMb29rdXAkJExhbWJkYS8weDAwMDA3
ZjhkNjcwNWFjMThANDQ1OWViMTQ8YnI+PGJyPmpzaGVsbCZndDsgbG9va3VwLmZpbmRPclRocm93
KCJ4Iik7PGJyPiQzID09Jmd0OyBNZW1vcnlTZWdtZW50eyBhZGRyZXNzOiAweDdmOGRjNDAzYzAw
MCwgYnl0ZVNpemU6IDAgfTxicj5gYGA8L3A+PHA+U28sIHRoZSBzeW1ib2wgc2VlbXMgdG8gYmUg
dGhlcmUsIHdoaWNoIGlzIGFsc28gY29uZmlybWVkIGJ5IGBvYmpkdW1wYDo8L3A+PHA+YGBgPGJy
PmZvby5zbzombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgZmlsZSBmb3JtYXQgZWxmNjQteDg2LTY0
PGJyPjxicj5EWU5BTUlDIFNZTUJPTCBUQUJMRTo8YnI+MDAwMDAwMDAwMDAwMDAwMCZuYnNwOyB3
Jm5ic3A7Jm5ic3A7IEQmbmJzcDsgKlVORCombmJzcDsmbmJzcDsmbmJzcDsgMDAwMDAwMDAwMDAw
MDAwMCBfX2N4YV9maW5hbGl6ZTxicj4wMDAwMDAwMDAwMDAwMDAwJm5ic3A7IHcmbmJzcDsmbmJz
cDsgRCZuYnNwOyAqVU5EKiZuYnNwOyZuYnNwOyZuYnNwOyAwMDAwMDAwMDAwMDAwMDAwIF9JVE1f
cmVnaXN0ZXJUTUNsb25lVGFibGU8YnI+MDAwMDAwMDAwMDAwMDAwMCZuYnNwOyB3Jm5ic3A7Jm5i
c3A7IEQmbmJzcDsgKlVORCombmJzcDsmbmJzcDsmbmJzcDsgMDAwMDAwMDAwMDAwMDAwMCBfSVRN
X2RlcmVnaXN0ZXJUTUNsb25lVGFibGU8YnI+MDAwMDAwMDAwMDAwMDAwMCZuYnNwOyB3Jm5ic3A7
Jm5ic3A7IEQmbmJzcDsgKlVORCombmJzcDsmbmJzcDsmbmJzcDsgMDAwMDAwMDAwMDAwMDAwMCBf
X2dtb25fc3RhcnRfXzxicj4wMDAwMDAwMDAwMDAyMDAwIGcmbmJzcDsmbmJzcDsmbmJzcDsgRE8g
LnJvZGF0YSZuYnNwOyZuYnNwOyZuYnNwOyAwMDAwMDAwMDAwMDAwMDA0IHg8YnI+YGBgPC9wPjxw
PihzZWUgbGFzdCBsaW5lKTwvcD48cD5JJ2Qgc3VnZ2VzdCB0byBtYXliZSBjaGVjayB0aGF0IChh
KSB0aGUgc2hhcmVkIGxpYnJhcnkgeW91IGFyZSB1c2luZyAoLnNvIG9yIC5kbGwpIGRvZXMgY29u
dGFpbiB0aGUgY29uc3RhbnQgdmFyaWFibGUgc3ltYm9scyB3ZSdyZSB0cnlpbmcgdG8gbG9va3Vw
IGFuZCAoYikgdGhhdCBqZXh0cmFjdCBpcyB1c2luZyBhIGNvcnJlY3Qgc3ltYm9sIGxvb2t1cCAo
ZS5nLiBvbmUgdGhhdCBwb2ludHMgdG8geW91ciBsaWJyYXJ5KS4gRm9yIChiKSB5b3UgbWlnaHQg
d2FudCB0byByZWZlciB0aGlzIGZvciBmdXJ0aGVyIGd1aWRhbmNlOjwvcD48cD5odHRwczovL2dp
dGh1Yi5jb20vb3Blbmpkay9qZXh0cmFjdC9ibG9iL21hc3Rlci9kb2MvR1VJREUubWQjbGlicmFy
eS1sb2FkaW5nPC9wPjxwPkNoZWVyczxicj5NYXVyaXppbzxicj48L3A+PHA+PGJyPjwvcD48cD48
YnI+PC9wPjxkaXYgY2xhc3M9Im1vei1jaXRlLXByZWZpeCI+T24gMDgvMTIvMjAyNCAxNTozOCwg
QWRyaWFuIFRyYXBsZXR0aSB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIg
Y2l0ZT0ibWlkOkNBR0haa25FR1pCdWdHaEpINmdDTUdUNXY4Q0RkNzViQmF4WGMrM2I1ZUZheWM2
ZW16UUBtYWlsLmdtYWlsLmNvbSI+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250
ZW50PSJ0ZXh0L2h0bWw7ICI+PGRpdiBkaXI9Imx0ciI+PGRpdj5IaSw8L2Rpdj48ZGl2Pjxicj48
L2Rpdj48ZGl2PkkgcnVuIGpleHRyYWN0IG9uJm5ic3A7PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu
Y29tL0VSR08tQ29kZS9IaUdIUy9ibG9iL21hc3Rlci9zcmMvaW50ZXJmYWNlcy9oaWdoc19jX2Fw
aS5oIiBtb3otZG8tbm90LXNlbmQ9InRydWUiIGNsYXNzPSJtb3otdHh0LWxpbmstZnJlZXRleHQi
Pmh0dHBzOi8vZ2l0aHViLmNvbS9FUkdPLUNvZGUvSGlHSFMvYmxvYi9tYXN0ZXIvc3JjL2ludGVy
ZmFjZXMvaGlnaHNfY19hcGkuaDwvYT4uJm5ic3A7PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5J
ZiBJIHVzZSB0aGUgSmF2YSBiaW5kaW5ncyB0byBhY2Nlc3MgdGhlIGNvbnN0IHZhcmlhYmxlcyBJ
IGdldCAiamF2YS5sYW5nLlVuc2F0aXNmaWVkTGlua0Vycm9yOiB1bnJlc29sdmVkIHN5bWJvbCIu
Jm5ic3A7PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5Gb3IgZXhhbXBsZTwvZGl2PjxkaXY+Li4u
PC9kaXY+PGRpdj5sb25nIHNlbnNlID0ga0hpZ2hzT2JqU2Vuc2VNaW5pbWl6ZSgpOzwvZGl2Pjxk
aXY+Li4uPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5yZXN1bHRzIGluPC9kaXY+PGRpdj48YnI+
PC9kaXY+PGRpdj5qYXZhLmxhbmcuVW5zYXRpc2ZpZWRMaW5rRXJyb3I6IHVucmVzb2x2ZWQgc3lt
Ym9sOiBrSGlnaHNPYmpTZW5zZU1pbmltaXplPGJyPglhdCBjb20udXN0ZXJtZXRyaWNzLmhpZ2hz
NGovY29tLnVzdGVybWV0cmljcy5oaWdoczRqLmJpbmRpbmdzLmhpZ2hzX2NfYXBpX2gubGFtYmRh
JGZpbmRPclRocm93JDAoaGlnaHNfY19hcGlfaC5qYXZhOjQ0KTxicj4JYXQgamF2YS5iYXNlL2ph
dmEudXRpbC5PcHRpb25hbC5vckVsc2VUaHJvdyhPcHRpb25hbC5qYXZhOjQwMyk8YnI+CWF0IGNv
bS51c3Rlcm1ldHJpY3MuaGlnaHM0ai9jb20udXN0ZXJtZXRyaWNzLmhpZ2hzNGouYmluZGluZ3Mu
aGlnaHNfY19hcGlfaC5maW5kT3JUaHJvdyhoaWdoc19jX2FwaV9oLmphdmE6NDQpPGJyPglhdCBj
b20udXN0ZXJtZXRyaWNzLmhpZ2hzNGovY29tLnVzdGVybWV0cmljcy5oaWdoczRqLmJpbmRpbmdz
LmhpZ2hzX2NfYXBpX2gka0hpZ2hzT2JqU2Vuc2VNaW5pbWl6ZSRjb25zdGFudHMuJmx0O2NsaW5p
dCZndDsoaGlnaHNfY19hcGlfaC5qYXZhOjgwNCk8YnI+CWF0IGNvbS51c3Rlcm1ldHJpY3MuaGln
aHM0ai9jb20udXN0ZXJtZXRyaWNzLmhpZ2hzNGouYmluZGluZ3MuaGlnaHNfY19hcGlfaC5rSGln
aHNPYmpTZW5zZU1pbmltaXplKGhpZ2hzX2NfYXBpX2guamF2YTo4MzQpPGJyPglhdCBjb20udXN0
ZXJtZXRyaWNzLmhpZ2hzNGovY29tLnVzdGVybWV0cmljcy5oaWdoczRqLmJpbmRpbmdzLkJpbmRp
bmdzVGVzdC5zb2x2ZUxpbmVhclByb2dyYW1SZXR1cm5zRXhwZWN0ZWRTb2x1dGlvbihCaW5kaW5n
c1Rlc3QuamF2YTozMik8YnI+CWF0IGphdmEuYmFzZS9qYXZhLmxhbmcucmVmbGVjdC5NZXRob2Qu
aW52b2tlKE1ldGhvZC5qYXZhOjU4MCk8YnI+CWF0IGphdmEuYmFzZS9qYXZhLnV0aWwuQXJyYXlM
aXN0LmZvckVhY2goQXJyYXlMaXN0LmphdmE6MTU5Nyk8YnI+CWF0IGphdmEuYmFzZS9qYXZhLnV0
aWwuQXJyYXlMaXN0LmZvckVhY2goQXJyYXlMaXN0LmphdmE6MTU5Nyk8L2Rpdj48ZGl2Pjxicj48
L2Rpdj48ZGl2Pig8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXRyYXBsZXQvaGlnaHM0aiIg
bW96LWRvLW5vdC1zZW5kPSJ0cnVlIiBjbGFzcz0ibW96LXR4dC1saW5rLWZyZWV0ZXh0Ij5odHRw
czovL2dpdGh1Yi5jb20vYXRyYXBsZXQvaGlnaHM0ajwvYT4gYW5kIHJ1biB0aGUgdW5pdCB0ZXN0
cyk8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PldoYXQgZG8gSSBtaXNzIGhlcmU/Jm5ic3A7PC9k
aXY+PGRpdj48YnI+PC9kaXY+PGRpdj5UaHggYW5kIGJlc3QgcmVnYXJkcyw8L2Rpdj48ZGl2PkFk
cmlhbjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+PGRpdiBkaXI9Imx0ciIgY2xhc3M9ImdtYWls
X3NpZ25hdHVyZSIgZGF0YS1zbWFydG1haWw9ImdtYWlsX3NpZ25hdHVyZSI+PGRpdiBkaXI9Imx0
ciI+PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9
Imx0ciI+PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+PGRpdj48
Zm9udCBzaXplPSIyIiBmYWNlPSJhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBjb2xvcj0i
IzAwMDAwMCI+PGI+RHIuIEFkcmlhbiBUcmFwbGV0dGk8L2I+PC9mb250PjwvZGl2PjxkaXY+PGZv
bnQgc2l6ZT0iMiIgZmFjZT0iYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiIgY29sb3I9IiMw
MDAwMDAiPkNFTzwvZm9udD48L2Rpdj48ZGl2Pjxmb250IHNpemU9IjIiIGZhY2U9ImFyaWFsLCBo
ZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIGNvbG9yPSIjMDAwMDAwIj48YnI+PC9mb250PjwvZGl2Pjxk
aXY+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCk7Zm9udC1mYW1pbHk6YXJpYWwsaGVsdmV0
aWNhLHNhbnMtc2VyaWYiPjxiPlVzdGVyIE1ldHJpY3MgR21iSCAmbmJzcDs8L2I+PC9zcGFuPjxz
cGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApO2ZvbnQtZmFtaWx5OmFyaWFsLGhlbHZldGljYSxz
YW5zLXNlcmlmIj58ICZuYnNwO1N0ZWluc3RyYXNzZSA5YiwmbmJzcDs8L3NwYW4+PHNwYW4gc3R5
bGU9ImNvbG9yOnJnYigwLDAsMCk7Zm9udC1mYW1pbHk6YXJpYWwsaGVsdmV0aWNhLHNhbnMtc2Vy
aWYiPjg2MTAgVXN0ZXIsJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDAp
O2ZvbnQtZmFtaWx5OmFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmIj5Td2l0emVybGFuZDwvc3Bh
bj48YnI+PC9kaXY+PGRpdj48Zm9udCBzaXplPSIyIiBmYWNlPSJhcmlhbCwgaGVsdmV0aWNhLCBz
YW5zLXNlcmlmIiBjb2xvcj0iIzAwMDAwMCI+UCArNDEgMzIgNTEyIDgzIDYzICZuYnNwO3wgJm5i
c3A7PC9mb250PjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApO2ZvbnQtZmFtaWx5OmFyaWFs
LGhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtc2l6ZTpzbWFsbCI+TSArNDEgNzkgMTAzIDcxIDMx
PC9zcGFuPjwvZGl2PjxkaXY+PGEgaHJlZj0ibWFpbHRvOmEudHJhcGxldHRpQHVzdGVybWV0cmlj
cy5jb20iIHN0eWxlPSJmb250LWZhbWlseTphcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZjtmb250
LXNpemU6c21hbGwiIHRhcmdldD0iX2JsYW5rIiBtb3otZG8tbm90LXNlbmQ9InRydWUiIGNsYXNz
PSJtb3otdHh0LWxpbmstZnJlZXRleHQiPmEudHJhcGxldHRpQHVzdGVybWV0cmljcy5jb208L2E+
Jm5ic3A7IHwgJm5ic3A7PGEgaHJlZj0iaHR0cDovL3d3dy51c3Rlcm1ldHJpY3MuY29tIiBzdHls
ZT0iZm9udC1mYW1pbHk6YXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWY7Zm9udC1zaXplOnNtYWxs
IiB0YXJnZXQ9Il9ibGFuayIgbW96LWRvLW5vdC1zZW5kPSJ0cnVlIj53d3cudXN0ZXJtZXRyaWNz
LmNvbTwvYT48L2Rpdj48ZGl2Pjxmb250IHNpemU9IjIiIGZhY2U9ImFyaWFsLCBoZWx2ZXRpY2Es
IHNhbnMtc2VyaWYiIGNvbG9yPSIjMDAwMDAwIj48YnI+PC9mb250PjwvZGl2PjxkaXY+PGZvbnQg
c2l6ZT0iMiIgZmFjZT0iYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiIgY29sb3I9IiMwMDAw
MDAiPjxicj48L2ZvbnQ+PC9kaXY+PGRpdj48Zm9udCBjb2xvcj0iIzk5OTk5OSI+PGZvbnQgc2l6
ZT0iMSIgZmFjZT0iYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiI+VGhpcyBlbWFpbCBtZXNz
YWdlIGluY2x1ZGluZyBhbnkgYXR0YWNobWVudHMgaXMgY29uZmlkZW50aWFsIGFuZCBtYXkmbmJz
cDs8L2ZvbnQ+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsLGhlbHZldGljYSxzYW5zLXNl
cmlmO2ZvbnQtc2l6ZTp4LXNtYWxsIj5iZSBwcml2aWxlZ2VkLiBJdCBpcyBpbnRlbmRlZCBzb2xl
bHkgZm9yIHRoZSB1c2Ugb2YgdGhlIGluZGl2aWR1YWwgb3ImbmJzcDs8L3NwYW4+PHNwYW4gc3R5
bGU9ImZvbnQtZmFtaWx5OmFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtc2l6ZTp4LXNt
YWxsIj5lbnRpdHkgbmFtZWQgb24gdGhpcyBtZXNzYWdlLiBJdCBpcyBwcm92aWRlZCBmb3IgaW5m
b3JtYXRpb25hbCBwdXJwb3NlcyZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6
YXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWY7Zm9udC1zaXplOngtc21hbGwiPm9ubHkgYW5kIGRv
ZXMgbm90IGNvbnN0aXR1dGUgYW4gb2ZmZXIgb3IgaW52aXRhdGlvbiB0byBzdWJzY3JpYmUgZm9y
Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTphcmlhbCxoZWx2ZXRpY2Esc2Fu
cy1zZXJpZjtmb250LXNpemU6eC1zbWFsbCI+b3IgcHVyY2hhc2UgYW55IHNlcnZpY2VzIG9yIHBy
b2R1Y3RzLiBBbnkgZm9ybSBvZiBkaXNjbG9zdXJlLCBjb3B5aW5nLCZuYnNwOzwvc3Bhbj48Zm9u
dCBzaXplPSIxIiBmYWNlPSJhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmIj5tb2RpZmljYXRp
b24gb3IgZGlzdHJpYnV0aW9uIGlzIHVuYXV0aG9yaXplZC4gSWYgeW91IGFyZSBub3QgdGhlJm5i
c3A7PC9mb250PjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTphcmlhbCxoZWx2ZXRpY2Esc2Fucy1z
ZXJpZjtmb250LXNpemU6eC1zbWFsbCI+aW50ZW5kZWQgcmVjaXBpZW50LCB5b3UgYXJlIHJlcXVl
c3RlZCB0byBwbGVhc2Ugbm90aWZ5IHRoZSBzZW5kZXImbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9
ImZvbnQtZmFtaWx5OmFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtc2l6ZTp4LXNtYWxs
Ij5pbW1lZGlhdGVseSBhbmQgZGVsZXRlIHRoZSBtZXNzYWdlIGluY2x1ZGluZyBhbnkgYXR0YWNo
bWVudHMgZnJvbSZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6YXJpYWwsaGVs
dmV0aWNhLHNhbnMtc2VyaWY7Zm9udC1zaXplOngtc21hbGwiPnlvdXIgY29tcHV0ZXIgc3lzdGVt
IG5ldHdvcmsuJm5ic3A7PC9zcGFuPjwvZm9udD48Zm9udCBzdHlsZT0iY29sb3I6cmdiKDE1Mywx
NTMsMTUzKSIgc2l6ZT0iMSIgZmFjZT0iYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiI+RW1h
aWwgdHJhbnNtaXNzaW9uIGNhbm5vdCBiZSBndWFyYW50ZWVkIHRvIGJlIHNlY3VyZSBvciBlcnJv
ciBmcmVlIGFzJm5ic3A7PC9mb250PjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTUzLDE1MywxNTMp
O2ZvbnQtZmFtaWx5OmFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtc2l6ZTp4LXNtYWxs
Ij5pbmZvcm1hdGlvbiBjb3VsZCBiZSBtb2RpZmllZC4gV2UgdGhlcmVmb3JlIGRvIG5vdCBhY2Nl
cHQgcmVzcG9uc2liaWxpdHkmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxNTMs
MTUzLDE1Myk7Zm9udC1mYW1pbHk6YXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWY7Zm9udC1zaXpl
Ongtc21hbGwiPm9yIGxpYWJpbGl0eSBhcyB0byB0aGUgY29tcGxldGVuZXNzIG9yIGFjY3VyYWN5
IG9mIHRoZSBpbmZvcm1hdGlvbiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDE1
MywxNTMsMTUzKTtmb250LXNpemU6eC1zbWFsbDtmb250LWZhbWlseTphcmlhbCxoZWx2ZXRpY2Es
c2Fucy1zZXJpZiI+Y29udGFpbmVkIGluIHRoaXMgbWVzc2FnZSBvciBhbnkgYXR0YWNobWVudHMu
PC9zcGFuPjwvZGl2PjxkaXY+PGZvbnQgZmFjZT0iYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJp
ZiI+PGJyPjxicj48YnI+PC9mb250PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2
PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PgoKPC9ibG9ja3F1b3RlPg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;"></div>
</div>
</body>
</html>