<div dir="ltr">Thank you for the clarification. I am stuck with my mind because I thought that if the SegmentScope() is global, then even if the MemorySegment Object has been GCed, the underlying memory won't be released, not until the JVM exit. (Is that correct? I think that's the difference between the global scope and the auto scope).  Since there's no destructor in Java, there's no way to get notified that the MemorySegment  is not available anymore, thus some cleanup could be done. Perhaps this operation should not be suggested, since it make things much more complicated.<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Maurizio Cimadamore <<a href="mailto:maurizio.cimadamore@oracle.com">maurizio.cimadamore@oracle.com</a>> 于2023年4月17日周一 16:53写道:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

  
  <div>
    <div>
      <p style="margin:0px 0px 1.2em">What Jorn says is
        correct. There is no way for the FFM API to reason about the
        lifetime of pointers returned by native functions. Sometimes
        these pointers will need to be freed, manually, by the caller,
        other times they will be freed by the library, other times (as
        in this case) they will point to some constant data that will
        remain valid as long as the library is loaded.</p>
      <p style="margin:0px 0px 1.2em">It is up to the
        client to “override” the lifetime of the returned segment as
        needed.</p>
      <p style="margin:0px 0px 1.2em">The Java 21 API makes
        this a bit clearer, as segments with unknown lifetime are
        modelled as segment that have an <em>unbounded</em> scope (e.g.
        a scope that is always alive), but that is <em>different</em>
        from the scope of the global arena. This is demonstrated below:</p>
      <pre style="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;background-color:rgb(248,248,248);white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block">jshell> MemorySegment.ofAddress(42).scope().equals(Arena.global().scope())
$2 ==> false
</code></pre>
      <p style="margin:0px 0px 1.2em">Also, you might find
        the new javadoc for the Linker useful, as it contains a section
        on native functions returning pointers:</p>
      <p style="margin:0px 0px 1.2em"><a href="https://cr.openjdk.org/~pminborg/panama/21/v2/javadoc/api/java.base/java/lang/foreign/Linker.html#by-ref" target="_blank">https://cr.openjdk.org/~pminborg/panama/21/v2/javadoc/api/java.base/java/lang/foreign/Linker.html#by-ref</a></p>
      <p style="margin:0px 0px 1.2em">Which shows how,
        where needed, new temporal bounds can be given to segments
        returned by a downcall method handle.</p>
      <p style="margin:0px 0px 1.2em">Hope this helps.</p>
      <p style="margin:0px 0px 1.2em">Maurizio</p>
      <p style="margin:0px 0px 1.2em">On 17/04/2023 08:25,
        Jorn Vernee wrote:</p>
      <p style="margin:0px 0px 1.2em"></p>
      <div>
        <p></p>
        <blockquote type="cite">
          
          <p>I think they are asking not about the library symbols, but
            about the pointer returned by OPENSSL_version?<br>
            <br>
            Whether such pointers should be 'freed' depends on the
            native library. Some native libraries might allocate memory
            and return a pointer to the user. It is up to the native
            library to specify how the memory should be freed in that
            case. Usually if the user is expected to free the memory a
            special function to do that is provided by the library.<br>
          </p>
          <p>In this case, OPENSSL_version seems to be returning a
            pointer to a constant string (string literal), which doesn't
            have to be freed by the user.<br>
          </p>
          <p>Jorn<br>
          </p>
          <div>On 16/04/2023 14:32, Glavo wrote:<br>
          </div>
          <blockquote type="cite">
            <div dir="ltr">The zero-length MemorySegment associated with
              the global scope is a wrapper of the raw pointer.<br>
              <div>It indicates that the lifetime is unknown, rather
                than indicating that the lifetime is truly infinite.<br>
              </div>
              <div><br>
              </div>
              <div>The true lifetime of these symbols is associated with
                SymbolLookup. They are also invalid when the scope of
                the SymbolLookup is invalid.<br>
              </div>
              <div><br>
              </div>
              <div>Glavo</div>
            </div>
            <br>
            <div class="gmail_quote">
              <div dir="ltr" class="gmail_attr">On Sun, Apr 16, 2023 at
                7:52 PM 刘希晨 <<a href="mailto:benrush0705@gmail.com" target="_blank">benrush0705@gmail.com</a>>
                wrote:<br>
              </div>
              <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                <div dir="ltr">Thank you for the clarification. I didn'
                  mean the  SymbolLookup itself, but the MemorySegment
                  that MethodHandle returns, the  MethodHandle is
                  created by  , I already tested no matter what kind
                  of SegmentScope SymbolLookup used, the native
                  MemorySegment that MethodHandle returns would always
                  be Global scope.<br>
                  <div><br>
                  </div>
                  <div>A example would be like below :</div>
                  <div><br>
                  </div>
                  <div>```</div>
                  <div>
                    <div style="background-color:rgb(30,31,34);color:rgb(188,190,196);font-family:"JetBrains Mono",monospace;font-size:9.8pt;white-space:pre-wrap">SymbolLookup crypto = SymbolLookup.<span style="font-style:italic">libraryLookup</span>(Path.<span style="font-style:italic">of</span>(<span style="color:rgb(106,171,115)">"C:</span><span style="color:rgb(207,142,109)">\\</span><span style="color:rgb(106,171,115)">Program Files</span><span style="color:rgb(207,142,109)">\\</span><span style="color:rgb(106,171,115)">OpenSSL-Win64</span><span style="color:rgb(207,142,109)">\\</span><span style="color:rgb(106,171,115)">libcrypto-3-x64.dll"</span>), SegmentScope.<span style="font-style:italic">auto</span>());
MemorySegment methodPointer = crypto.find(<span style="color:rgb(106,171,115)">"OPENSSL_version"</span>)
        .orElseThrow(() -> <span style="color:rgb(207,142,109)">new </span>RuntimeException(<span style="color:rgb(106,171,115)">"Unable to load target native method"</span>));
MethodHandle openSSLVersion = Linker.<span style="font-style:italic">nativeLinker</span>().downcallHandle(methodPointer, FunctionDescriptor.<span style="font-style:italic">of</span>(ValueLayout.<span style="color:rgb(199,125,187);font-style:italic">ADDRESS</span>, ValueLayout.<span style="color:rgb(199,125,187);font-style:italic">JAVA_INT</span>));
MemorySegment version = (MemorySegment) openSSLVersion.invokeExact(<span style="color:rgb(42,172,184)">0</span>);
System.<span style="color:rgb(199,125,187);font-style:italic">out</span>.println(version);</div>
                  </div>
                  <div>```</div>
                  <div>the version Segment is global somehow and I don't
                    know how to release it</div>
                </div>
                <br>
                <div class="gmail_quote">
                  <div dir="ltr" class="gmail_attr">Glavo <<a href="mailto:zjx001202@gmail.com" target="_blank">zjx001202@gmail.com</a>>
                    于2023年4月16日周日 19:38写道:<br>
                  </div>
                  <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                    <div dir="ltr">SymbolLookup.libraryLookup takes a
                      SegmentScope as a parameter, which represents the
                      lifecycle of the returned SymbolLookup.
                      <div><br>
                      </div>
                      <div>It looks like you are using an old
                        JDK? Panama has critical changes every Java
                        update, please use the latest JDK.<br>
                        <div><br>
                        </div>
                        <div>Glavo</div>
                      </div>
                    </div>
                    <br>
                    <div class="gmail_quote">
                      <div dir="ltr" class="gmail_attr">On Sun, Apr 16,
                        2023 at 6:36 PM 刘希晨 <<a href="mailto:benrush0705@gmail.com" target="_blank">benrush0705@gmail.com</a>>
                        wrote:<br>
                      </div>
                      <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                        <div dir="ltr">Hi I have a question about global
                          segment scope.
                          <div><br>
                          </div>
                          <div>If I use SymbolLookup.libraryLookup to
                            load a C library and call its function which
                            returns a pointer , in java it's represented
                            by a memory segment, the memorysegment's
                            scope would be global scope. Does this mean
                            that the memory segment object wouldn't be
                            released by anything until the VM exits?</div>
                        </div>
                      </blockquote>
                    </div>
                  </blockquote>
                </div>
              </blockquote>
            </div>
          </blockquote>
        </blockquote>
        <p></p>
      </div>
      <p style="margin:0px 0px 1.2em"></p>
      <div title="MDH:PHA+V2hhdCBKb3JuIHNheXMgaXMgY29ycmVjdC4gVGhlcmUgaXMgbm8gd2F5IGZvciB0aGUgRkZNIEFQSSB0byByZWFzb24gYWJvdXQgdGhlIGxpZmV0aW1lIG9mIHBvaW50ZXJzIHJldHVybmVkIGJ5
IG5hdGl2ZSBmdW5jdGlvbnMuIFNvbWV0aW1lcyB0aGVzZSBwb2ludGVycyB3aWxsIG5lZWQgdG8g
YmUgZnJlZWQsIG1hbnVhbGx5LCBieSB0aGUgY2FsbGVyLCBvdGhlciB0aW1lcyB0aGV5IHdpbGwg
YmUgZnJlZWQgYnkgdGhlIGxpYnJhcnksIG90aGVyIHRpbWVzIChhcyBpbiB0aGlzIGNhc2UpIHRo
ZXkgd2lsbCBwb2ludCB0byBzb21lIGNvbnN0YW50IGRhdGEgdGhhdCB3aWxsIHJlbWFpbiB2YWxp
ZCBhcyBsb25nIGFzIHRoZSBsaWJyYXJ5IGlzIGxvYWRlZC48L3A+PHA+SXQgaXMgdXAgdG8gdGhl
IGNsaWVudCB0byAib3ZlcnJpZGUiIHRoZSBsaWZldGltZSBvZiB0aGUgcmV0dXJuZWQgc2VnbWVu
dCBhcyBuZWVkZWQuPC9wPjxwPlRoZSBKYXZhIDIxIEFQSSBtYWtlcyB0aGlzIGEgYml0IGNsZWFy
ZXIsIEkgdGhpbmssIGFzIHNlZ21lbnRzIHdpdGggdW5rbm93biBsaWZldGltZSBhcmUgbW9kZWxs
ZWQgYXMgc2VnbWVudCB0aGF0IGhhdmUgYW4gX3VuYm91bmRlZF8gc2NvcGUgKGUuZy4gYSBzY29w
ZSB0aGF0IGlzIGFsd2F5cyBhbGl2ZSksIGJ1dCB0aGF0IGlzIF9kaWZmZXJlbnRfIGZyb20gdGhl
IHNjb3BlIG9mIHRoZSBnbG9iYWwgYXJlbmEuIFRoaXMgaXMgZGVtb25zdHJhdGVkIGJlbG93Ojwv
cD48cD5gYGA8YnI+anNoZWxsJmd0OyBNZW1vcnlTZWdtZW50Lm9mQWRkcmVzcyg0Mikuc2NvcGUo
KS5lcXVhbHMoQXJlbmEuZ2xvYmFsKCkuc2NvcGUoKSk8YnI+JDIgPT0mZ3Q7IGZhbHNlPGJyPmBg
YDwvcD48cD5BbHNvLCB5b3UgbWlnaHQgZmluZCB0aGUgbmV3IGphdmFkb2MgZm9yIHRoZSBMaW5r
ZXIgdXNlZnVsLCBhcyBpdCBjb250YWlucyBhIHNlY3Rpb24gb24gbmF0aXZlIGZ1bmN0aW9ucyBy
ZXR1cm5pbmcgcG9pbnRlcnM6PC9wPjxwPmh0dHBzOi8vY3Iub3Blbmpkay5vcmcvfnBtaW5ib3Jn
L3BhbmFtYS8yMS92Mi9qYXZhZG9jL2FwaS9qYXZhLmJhc2UvamF2YS9sYW5nL2ZvcmVpZ24vTGlu
a2VyLmh0bWwjYnktcmVmPC9wPjxwPldoaWNoIHNob3dzIGhvdywgd2hlcmUgbmVlZGVkLCBuZXcg
dGVtcG9yYWwgYm91bmRzIGNhbiBiZSBnaXZlbiB0byBzZWdtZW50cyByZXR1cm5lZCBieSBhIGRv
d25jYWxsIG1ldGhvZCBoYW5kbGUuPC9wPjxwPkhvcGUgdGhpcyBoZWxwcy48L3A+PHA+TWF1cml6
aW88L3A+PHA+PGJyPjwvcD48ZGl2IGNsYXNzPSJtb3otY2l0ZS1wcmVmaXgiPk9uIDE3LzA0LzIw
MjMgMDg6MjUsIEpvcm4gVmVybmVlIHdyb3RlOjxicj48L2Rpdj48YmxvY2txdW90ZSB0eXBlPSJj
aXRlIiBjaXRlPSJtaWQ6YjMyMjBkODUtZjVhOS0zYmY5LTE5MzgtMzQ4MzJiMGE5YjY1QG9yYWNs
ZS5jb20iPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRt
bDsgIj4KICAKICAKICAgIDxwPkkgdGhpbmsgdGhleSBhcmUgYXNraW5nIG5vdCBhYm91dCB0aGUg
bGlicmFyeSBzeW1ib2xzLCBidXQgYWJvdXQKICAgICAgdGhlIHBvaW50ZXIgcmV0dXJuZWQgYnkg
T1BFTlNTTF92ZXJzaW9uPzxicj4KICAgICAgPGJyPgogICAgICBXaGV0aGVyIHN1Y2ggcG9pbnRl
cnMgc2hvdWxkIGJlICdmcmVlZCcgZGVwZW5kcyBvbiB0aGUgbmF0aXZlCiAgICAgIGxpYnJhcnku
IFNvbWUgbmF0aXZlIGxpYnJhcmllcyBtaWdodCBhbGxvY2F0ZSBtZW1vcnkgYW5kIHJldHVybiBh
CiAgICAgIHBvaW50ZXIgdG8gdGhlIHVzZXIuIEl0IGlzIHVwIHRvIHRoZSBuYXRpdmUgbGlicmFy
eSB0byBzcGVjaWZ5IGhvdwogICAgICB0aGUgbWVtb3J5IHNob3VsZCBiZSBmcmVlZCBpbiB0aGF0
IGNhc2UuIFVzdWFsbHkgaWYgdGhlIHVzZXIgaXMKICAgICAgZXhwZWN0ZWQgdG8gZnJlZSB0aGUg
bWVtb3J5IGEgc3BlY2lhbCBmdW5jdGlvbiB0byBkbyB0aGF0IGlzCiAgICAgIHByb3ZpZGVkIGJ5
IHRoZSBsaWJyYXJ5Ljxicj4KICAgIDwvcD4KICAgIDxwPkluIHRoaXMgY2FzZSwgT1BFTlNTTF92
ZXJzaW9uIHNlZW1zIHRvIGJlIHJldHVybmluZyBhIHBvaW50ZXIgdG8KICAgICAgYSBjb25zdGFu
dCBzdHJpbmcgKHN0cmluZyBsaXRlcmFsKSwgd2hpY2ggZG9lc24ndCBoYXZlIHRvIGJlIGZyZWVk
CiAgICAgIGJ5IHRoZSB1c2VyLjxicj4KICAgIDwvcD4KICAgIDxwPkpvcm48YnI+CiAgICA8L3A+
CiAgICA8ZGl2IGNsYXNzPSJtb3otY2l0ZS1wcmVmaXgiPk9uIDE2LzA0LzIwMjMgMTQ6MzIsIEds
YXZvIHdyb3RlOjxicj4KICAgIDwvZGl2PgogICAgPGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIgY2l0
ZT0ibWlkOkNBSkw1QTNudk52SD1tWEVITjFiVmVNWGgrNW5nNVhPQXVHckFReGdtR1Vvem5aQjJI
Z0BtYWlsLmdtYWlsLmNvbSI+CiAgICAgIAogICAgICA8ZGl2IGRpcj0ibHRyIj5UaGUgemVyby1s
ZW5ndGggTWVtb3J5U2VnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlCiAgICAgICAgZ2xvYmFsIHNj
b3BlIGlzIGEgd3JhcHBlciBvZiB0aGUgcmF3IHBvaW50ZXIuPGJyPgogICAgICAgIDxkaXY+SXQg
aW5kaWNhdGVzIHRoYXQgdGhlIGxpZmV0aW1lIGlzIHVua25vd24sIHJhdGhlciB0aGFuCiAgICAg
ICAgICBpbmRpY2F0aW5nIHRoYXQgdGhlIGxpZmV0aW1lIGlzIHRydWx5IGluZmluaXRlLjxicj4K
ICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2Pjxicj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8
ZGl2PlRoZSB0cnVlIGxpZmV0aW1lIG9mIHRoZXNlIHN5bWJvbHMgaXMgYXNzb2NpYXRlZCB3aXRo
CiAgICAgICAgICBTeW1ib2xMb29rdXAuIFRoZXkgYXJlIGFsc28gaW52YWxpZCB3aGVuIHRoZSBz
Y29wZSBvZiB0aGUKICAgICAgICAgIFN5bWJvbExvb2t1cCBpcyBpbnZhbGlkLjxicj4KICAgICAg
ICA8L2Rpdj4KICAgICAgICA8ZGl2Pjxicj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2Pkds
YXZvPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8YnI+CiAgICAgIDxkaXYgY2xhc3M9ImdtYWls
X3F1b3RlIj4KICAgICAgICA8ZGl2IGRpcj0ibHRyIiBjbGFzcz0iZ21haWxfYXR0ciI+T24gU3Vu
LCBBcHIgMTYsIDIwMjMgYXQKICAgICAgICAgIDc6NTLigK9QTSDliJjluIzmmaggJmx0OzxhIGhy
ZWY9Im1haWx0bzpiZW5ydXNoMDcwNUBnbWFpbC5jb20iIG1vei1kby1ub3Qtc2VuZD0idHJ1ZSIg
Y2xhc3M9Im1vei10eHQtbGluay1mcmVldGV4dCI+YmVucnVzaDA3MDVAZ21haWwuY29tPC9hPiZn
dDsKICAgICAgICAgIHdyb3RlOjxicj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8YmxvY2txdW90
ZSBjbGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46MHB4IDBweCAwcHgKICAgICAgICAg
IDAuOGV4O2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2IoMjA0LDIwNCwyMDQpO3BhZGRpbmctbGVm
dDoxZXgiPgogICAgICAgICAgPGRpdiBkaXI9Imx0ciI+VGhhbmsgeW91IGZvciB0aGUgY2xhcmlm
aWNhdGlvbi4gSSBkaWRuJyBtZWFuCiAgICAgICAgICAgIHRoZSZuYnNwOwogICAgICAgICAgICBT
eW1ib2xMb29rdXAgaXRzZWxmLCBidXQgdGhlIE1lbW9yeVNlZ21lbnQgdGhhdCBNZXRob2RIYW5k
bGUKICAgICAgICAgICAgcmV0dXJucywgdGhlJm5ic3A7CiAgICAgICAgICAgIE1ldGhvZEhhbmRs
ZSZuYnNwO2lzIGNyZWF0ZWQgYnkmbmJzcDsmbmJzcDssIEkgYWxyZWFkeSB0ZXN0ZWQgbm8gbWF0
dGVyCiAgICAgICAgICAgIHdoYXQga2luZCBvZiZuYnNwO1NlZ21lbnRTY29wZSZuYnNwO1N5bWJv
bExvb2t1cCB1c2VkLCB0aGUgbmF0aXZlCiAgICAgICAgICAgIE1lbW9yeVNlZ21lbnQgdGhhdCBN
ZXRob2RIYW5kbGUgcmV0dXJucyB3b3VsZCBhbHdheXMgYmUKICAgICAgICAgICAgR2xvYmFsIHNj
b3BlLjxicj4KICAgICAgICAgICAgPGRpdj48YnI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAg
ICAgICA8ZGl2PkEgZXhhbXBsZSB3b3VsZCBiZSBsaWtlIGJlbG93IDo8L2Rpdj4KICAgICAgICAg
ICAgPGRpdj48YnI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2PmBgYDwvZGl2
PgogICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImJhY2tncm91bmQt
Y29sb3I6cmdiKDMwLDMxLDM0KTtjb2xvcjpyZ2IoMTg4LDE5MCwxOTYpO2ZvbnQtZmFtaWx5OiZx
dW90O0pldEJyYWlucyBNb25vJnF1b3Q7LG1vbm9zcGFjZTtmb250LXNpemU6OS44cHQ7d2hpdGUt
c3BhY2U6cHJlLXdyYXAiPlN5bWJvbExvb2t1cCBjcnlwdG8gPSBTeW1ib2xMb29rdXAuPHNwYW4g
c3R5bGU9ImZvbnQtc3R5bGU6aXRhbGljIj5saWJyYXJ5TG9va3VwPC9zcGFuPihQYXRoLjxzcGFu
IHN0eWxlPSJmb250LXN0eWxlOml0YWxpYyI+b2Y8L3NwYW4+KDxzcGFuIHN0eWxlPSJjb2xvcjpy
Z2IoMTA2LDE3MSwxMTUpIj4iQzo8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigyMDcsMTQy
LDEwOSkiPlxcPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTA2LDE3MSwxMTUpIj5Qcm9n
cmFtIEZpbGVzPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMjA3LDE0MiwxMDkpIj5cXDwv
c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEwNiwxNzEsMTE1KSI+T3BlblNTTC1XaW42NDwv
c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDIwNywxNDIsMTA5KSI+XFw8L3NwYW4+PHNwYW4g
c3R5bGU9ImNvbG9yOnJnYigxMDYsMTcxLDExNSkiPmxpYmNyeXB0by0zLXg2NC5kbGwiPC9zcGFu
PiksIFNlZ21lbnRTY29wZS48c3BhbiBzdHlsZT0iZm9udC1zdHlsZTppdGFsaWMiPmF1dG88L3Nw
YW4+KCkpOwpNZW1vcnlTZWdtZW50IG1ldGhvZFBvaW50ZXIgPSBjcnlwdG8uZmluZCg8c3BhbiBz
dHlsZT0iY29sb3I6cmdiKDEwNiwxNzEsMTE1KSI+Ik9QRU5TU0xfdmVyc2lvbiI8L3NwYW4+KQog
ICAgICAgIC5vckVsc2VUaHJvdygoKSAtJmd0OyA8c3BhbiBzdHlsZT0iY29sb3I6cmdiKDIwNywx
NDIsMTA5KSI+bmV3IDwvc3Bhbj5SdW50aW1lRXhjZXB0aW9uKDxzcGFuIHN0eWxlPSJjb2xvcjpy
Z2IoMTA2LDE3MSwxMTUpIj4iVW5hYmxlIHRvIGxvYWQgdGFyZ2V0IG5hdGl2ZSBtZXRob2QiPC9z
cGFuPikpOwpNZXRob2RIYW5kbGUgb3BlblNTTFZlcnNpb24gPSBMaW5rZXIuPHNwYW4gc3R5bGU9
ImZvbnQtc3R5bGU6aXRhbGljIj5uYXRpdmVMaW5rZXI8L3NwYW4+KCkuZG93bmNhbGxIYW5kbGUo
bWV0aG9kUG9pbnRlciwgRnVuY3Rpb25EZXNjcmlwdG9yLjxzcGFuIHN0eWxlPSJmb250LXN0eWxl
Oml0YWxpYyI+b2Y8L3NwYW4+KFZhbHVlTGF5b3V0LjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTk5
LDEyNSwxODcpO2ZvbnQtc3R5bGU6aXRhbGljIj5BRERSRVNTPC9zcGFuPiwgVmFsdWVMYXlvdXQu
PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxOTksMTI1LDE4Nyk7Zm9udC1zdHlsZTppdGFsaWMiPkpB
VkFfSU5UPC9zcGFuPikpOwpNZW1vcnlTZWdtZW50IHZlcnNpb24gPSAoTWVtb3J5U2VnbWVudCkg
b3BlblNTTFZlcnNpb24uaW52b2tlRXhhY3QoPHNwYW4gc3R5bGU9ImNvbG9yOnJnYig0MiwxNzIs
MTg0KSI+MDwvc3Bhbj4pOwpTeXN0ZW0uPHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxOTksMTI1LDE4
Nyk7Zm9udC1zdHlsZTppdGFsaWMiPm91dDwvc3Bhbj4ucHJpbnRsbih2ZXJzaW9uKTs8L2Rpdj4K
ICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXY+YGBgPC9kaXY+CiAgICAgICAgICAg
IDxkaXY+dGhlIHZlcnNpb24gU2VnbWVudCBpcyBnbG9iYWwgc29tZWhvdyBhbmQgSSBkb24ndCBr
bm93CiAgICAgICAgICAgICAgaG93IHRvIHJlbGVhc2UgaXQ8L2Rpdj4KICAgICAgICAgIDwvZGl2
PgogICAgICAgICAgPGJyPgogICAgICAgICAgPGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPgogICAg
ICAgICAgICA8ZGl2IGRpcj0ibHRyIiBjbGFzcz0iZ21haWxfYXR0ciI+R2xhdm8gJmx0OzxhIGhy
ZWY9Im1haWx0bzp6angwMDEyMDJAZ21haWwuY29tIiB0YXJnZXQ9Il9ibGFuayIgbW96LWRvLW5v
dC1zZW5kPSJ0cnVlIiBjbGFzcz0ibW96LXR4dC1saW5rLWZyZWV0ZXh0Ij56angwMDEyMDJAZ21h
aWwuY29tPC9hPiZndDsKICAgICAgICAgICAgICDkuo4yMDIz5bm0NOaciDE25pel5ZGo5pelIDE5
OjM45YaZ6YGT77yaPGJyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGJsb2NrcXVv
dGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjBweCAwcHggMHB4CiAgICAgICAg
ICAgICAgMC44ZXg7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkCiAgICAgICAgICAgICAgcmdiKDIwNCwy
MDQsMjA0KTtwYWRkaW5nLWxlZnQ6MWV4Ij4KICAgICAgICAgICAgICA8ZGl2IGRpcj0ibHRyIj5T
eW1ib2xMb29rdXAubGlicmFyeUxvb2t1cCB0YWtlcyBhCiAgICAgICAgICAgICAgICBTZWdtZW50
U2NvcGUgYXMgYSBwYXJhbWV0ZXIsIHdoaWNoIHJlcHJlc2VudHMgdGhlCiAgICAgICAgICAgICAg
ICBsaWZlY3ljbGUgb2YgdGhlIHJldHVybmVkIFN5bWJvbExvb2t1cC4KICAgICAgICAgICAgICAg
IDxkaXY+PGJyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2Pkl0
IGxvb2tzIGxpa2UgeW91IGFyZSB1c2luZyBhbiBvbGQgSkRLPyZuYnNwO1BhbmFtYSBoYXMKICAg
ICAgICAgICAgICAgICAgY3JpdGljYWwgY2hhbmdlcyBldmVyeSBKYXZhIHVwZGF0ZSwgcGxlYXNl
IHVzZSB0aGUKICAgICAgICAgICAgICAgICAgbGF0ZXN0IEpESy48YnI+CiAgICAgICAgICAgICAg
ICAgIDxkaXY+PGJyPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAg
PGRpdj5HbGF2bzwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC9k
aXY+CiAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdtYWlsX3F1
b3RlIj4KICAgICAgICAgICAgICAgIDxkaXYgZGlyPSJsdHIiIGNsYXNzPSJnbWFpbF9hdHRyIj5P
biBTdW4sIEFwciAxNiwgMjAyMwogICAgICAgICAgICAgICAgICBhdCA2OjM24oCvUE0g5YiY5biM
5pmoICZsdDs8YSBocmVmPSJtYWlsdG86YmVucnVzaDA3MDVAZ21haWwuY29tIiB0YXJnZXQ9Il9i
bGFuayIgbW96LWRvLW5vdC1zZW5kPSJ0cnVlIiBjbGFzcz0ibW96LXR4dC1saW5rLWZyZWV0ZXh0
Ij5iZW5ydXNoMDcwNUBnbWFpbC5jb208L2E+Jmd0OwogICAgICAgICAgICAgICAgICB3cm90ZTo8
YnI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxibG9ja3F1b3RlIGNs
YXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowcHggMHB4CiAgICAgICAgICAgICAgICAg
IDBweCAwLjhleDtib3JkZXItbGVmdDoxcHggc29saWQKICAgICAgICAgICAgICAgICAgcmdiKDIw
NCwyMDQsMjA0KTtwYWRkaW5nLWxlZnQ6MWV4Ij4KICAgICAgICAgICAgICAgICAgPGRpdiBkaXI9
Imx0ciI+SGkgSSBoYXZlIGEgcXVlc3Rpb24gYWJvdXQgZ2xvYmFsCiAgICAgICAgICAgICAgICAg
ICAgc2VnbWVudCBzY29wZS4KICAgICAgICAgICAgICAgICAgICA8ZGl2Pjxicj4KICAgICAgICAg
ICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2PklmIEkgdXNlIFN5bWJv
bExvb2t1cC5saWJyYXJ5TG9va3VwIHRvIGxvYWQgYSBDCiAgICAgICAgICAgICAgICAgICAgICBs
aWJyYXJ5IGFuZCBjYWxsIGl0cyBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEKICAgICAgICAgICAg
ICAgICAgICAgIHBvaW50ZXIgLCBpbiBqYXZhIGl0J3MgcmVwcmVzZW50ZWQgYnkgYSBtZW1vcnkK
ICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQsIHRoZSBtZW1vcnlzZWdtZW50J3Mgc2NvcGUg
d291bGQgYmUgZ2xvYmFsCiAgICAgICAgICAgICAgICAgICAgICBzY29wZS4gRG9lcyB0aGlzIG1l
YW4gdGhhdCB0aGUgbWVtb3J5CiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50Jm5ic3A7b2Jq
ZWN0IHdvdWxkbid0IGJlIHJlbGVhc2VkIGJ5IGFueXRoaW5nCiAgICAgICAgICAgICAgICAgICAg
ICB1bnRpbCB0aGUgVk0gZXhpdHM/PC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAg
ICAgICAgICAgICAgPC9ibG9ja3F1b3RlPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAg
ICA8L2Jsb2NrcXVvdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Jsb2NrcXVvdGU+CiAg
ICAgIDwvZGl2PgogICAgPC9ibG9ja3F1b3RlPgogIAoKCjwvYmxvY2txdW90ZT4=" style="height:0px;width:0px;max-height:0px;max-width:0px;overflow:hidden;font-size:0em;padding:0px;margin:0px">​</div>
    </div>
  </div>

</blockquote></div>