Re: Read-sequence is slow?
Raymond Toy <[email protected]> Sat, 11 Apr 2026 18:18:18 -0700
| Newsgroups | gmane.lisp.gcl.devel |
|---|---|
| Message-ID | <[email protected]> |
This is a multi-part message in MIME format.
--------------ucL4062ywXsn1gsN7wBOb6Aq
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
On 4/8/26 9:21 AM, Raymond Toy wrote:
> I have this routine:
>
> |(defun slurp-bytes (filename) "Return the entire contents of FILENAME
> as a (unsigned-byte 8) vector. Results are cached in *bytes-cache* so
> each file is read only once." (or (gethash filename *bytes-cache*)
> (setf (gethash filename *bytes-cache*) (with-open-file (s filename
> :direction :input :element-type '(unsigned-byte 8)) (let* ((len
> (file-length s)) (buf (make-array len :element-type '(unsigned-byte
> 8)))) (read-sequence buf s) buf))))) |
>
> When reading maxima.info-1 (1030671 bytes), it takes a very long time
> (several seconds). Is there anyway to speed this up? I would have
> expected reading a bunch of bytes from a file via read-sequence would
> be very fast.
>
Some googling pointed me to |si:fread|. It makes |slurp-bytes| really
fast taking tiny fractions of a sec to read i a 1 MB file. Having
|read-sequence| use |si:fread| for element types of |character| or
|(unsigned-byte 8)| would be a really good thing.
​
--------------ucL4062ywXsn1gsN7wBOb6Aq
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<!DOCTYPE html>
<html>
<head>
<meta http-equiv=3D"content-type" content=3D"text/html; charset=3DUTF=
-8">
<title></title>
<meta charset=3D"utf-8">
</head>
<body>
<div class=3D"markdown-here-wrapper">
<p style=3D"margin-bottom: 19.2px; margin-top: 0px;">On 4/8/26 9:21=
AM, Raymond Toy wrote:<br>
</p>
<blockquote type=3D"cite"
style=3D"border-block-color: rgb(119, 119, 119); border-bottom-color: rgb=
(119, 119, 119); border-inline-color: rgb(114, 159, 207) rgb(119, 119, 11=
9); border-inline-start: 2px solid rgb(114, 159, 207); border-left: 2px s=
olid rgb(114, 159, 207); border-right-color: rgb(119, 119, 119); border-t=
op-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-colo=
r: rgb(119, 119, 119); margin: 19.2px 0px; outline-color: rgb(119, 119, 1=
19); padding-inline: 16px; padding-left: 16px; padding-right: 16px; quote=
s: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: =
rgb(119, 119, 119);">
<title></title>
<div class=3D"markdown-here-wrapper">
<p style=3D"margin-bottom: 19.2px; margin-top: 0px;">I have thi=
s
routine:</p>
<pre
style=3D"font-family: Consolas, Inconsolata, Courier, monospace; font-siz=
e: 16px; line-height: 19.2px; margin-bottom: 19.2px; margin-top: 19.2px;"=
><code
style=3D"background-color: rgba(175, 184, 193, 0.2); border-block: 1px so=
lid rgb(204, 204, 204); border-bottom: 1px solid rgb(204, 204, 204); bord=
er-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-end-e=
nd-radius: 3px; border-end-start-radius: 3px; border-inline: 1px solid rg=
b(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); border-right=
: 1px solid rgb(204, 204, 204); border-start-end-radius: 3px; border-star=
t-start-radius: 3px; border-top: 1px solid rgb(204, 204, 204); border-top=
-left-radius: 3px; border-top-right-radius: 3px; display: block; font-fam=
ily: Consolas, Inconsolata, Courier, monospace; font-size: 16px; font-wei=
ght: 550; line-height: 19.2px; margin-left: 2.4px; margin-right: 2.4px; o=
verflow-block: auto; overflow-inline: auto; overflow: auto; padding-block=
: 8px; padding-bottom: 8px; padding-inline: 11.2px; padding-left: 11.2px;=
padding-right: 11.2px; padding-top: 8px;">
(defun slurp-bytes (filename)
"Return the entire contents of FILENAME as a (unsigned-byte 8) vector.
Results are cached in *bytes-cache* so each file is read only once."
(or (gethash filename *bytes-cache*)
(setf (gethash filename *bytes-cache*)
(with-open-file (s filename :direction :input
:element-type '(unsigned-byte 8))=
(let* ((len (file-length s))
(buf (make-array len :element-type '(unsigned-byte 8=
))))
(read-sequence buf s)
buf)))))
</code></pre>
<p style=3D"margin-bottom: 19.2px; margin-top: 0px;">When
reading maxima.info-1 (1030671 bytes), it takes a very long
time (several seconds). Is there anyway to speed this up? I
would have expected reading a bunch of bytes from a file via
read-sequence would be very fast.</p>
</div>
</blockquote>
<p style=3D"margin-bottom: 19.2px; margin-top: 0px;">Some googling
pointed me to <code
style=3D"background-color: rgba(175, 184, 193, 0.2); border-bottom-left-r=
adius: 3px; border-bottom-right-radius: 3px; border-end-end-radius: 3px; =
border-end-start-radius: 3px; border-start-end-radius: 3px; border-start-=
start-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: =
3px; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 1=
6px; font-weight: 550; margin-left: 2.4px; margin-right: 2.4px; padding-i=
nline: 4.8px; padding-left: 4.8px; padding-right: 4.8px; white-space-coll=
apse: preserve;">si:fread</code>.
It makes <code
style=3D"background-color: rgba(175, 184, 193, 0.2); border-bottom-left-r=
adius: 3px; border-bottom-right-radius: 3px; border-end-end-radius: 3px; =
border-end-start-radius: 3px; border-start-end-radius: 3px; border-start-=
start-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: =
3px; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 1=
6px; font-weight: 550; margin-left: 2.4px; margin-right: 2.4px; padding-i=
nline: 4.8px; padding-left: 4.8px; padding-right: 4.8px; white-space-coll=
apse: preserve;">slurp-bytes</code>
really fast taking tiny fractions of a sec to read i a 1 MB
file. Having <code
style=3D"background-color: rgba(175, 184, 193, 0.2); border-bottom-left-r=
adius: 3px; border-bottom-right-radius: 3px; border-end-end-radius: 3px; =
border-end-start-radius: 3px; border-start-end-radius: 3px; border-start-=
start-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: =
3px; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 1=
6px; font-weight: 550; margin-left: 2.4px; margin-right: 2.4px; padding-i=
nline: 4.8px; padding-left: 4.8px; padding-right: 4.8px; white-space-coll=
apse: preserve;">read-sequence</code>
use <code
style=3D"background-color: rgba(175, 184, 193, 0.2); border-bottom-left-r=
adius: 3px; border-bottom-right-radius: 3px; border-end-end-radius: 3px; =
border-end-start-radius: 3px; border-start-end-radius: 3px; border-start-=
start-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: =
3px; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 1=
6px; font-weight: 550; margin-left: 2.4px; margin-right: 2.4px; padding-i=
nline: 4.8px; padding-left: 4.8px; padding-right: 4.8px; white-space-coll=
apse: preserve;">si:fread</code>
for element types of <code
style=3D"background-color: rgba(175, 184, 193, 0.2); border-bottom-left-r=
adius: 3px; border-bottom-right-radius: 3px; border-end-end-radius: 3px; =
border-end-start-radius: 3px; border-start-end-radius: 3px; border-start-=
start-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: =
3px; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 1=
6px; font-weight: 550; margin-left: 2.4px; margin-right: 2.4px; padding-i=
nline: 4.8px; padding-left: 4.8px; padding-right: 4.8px; white-space-coll=
apse: preserve;">character</code>
or <code
style=3D"background-color: rgba(175, 184, 193, 0.2); border-bottom-left-r=
adius: 3px; border-bottom-right-radius: 3px; border-end-end-radius: 3px; =
border-end-start-radius: 3px; border-start-end-radius: 3px; border-start-=
start-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: =
3px; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 1=
6px; font-weight: 550; margin-left: 2.4px; margin-right: 2.4px; padding-i=
nline: 4.8px; padding-left: 4.8px; padding-right: 4.8px; white-space-coll=
apse: preserve;">(unsigned-byte 8)</code>
would be a really good thing.</p>
<blockquote type=3D"cite"
style=3D"border-block-color: rgb(119, 119, 119); border-bottom-color: rgb=
(119, 119, 119); border-inline-color: rgb(114, 159, 207) rgb(119, 119, 11=
9); border-inline-start: 2px solid rgb(114, 159, 207); border-left: 2px s=
olid rgb(114, 159, 207); border-right-color: rgb(119, 119, 119); border-t=
op-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-colo=
r: rgb(119, 119, 119); margin: 19.2px 0px; outline-color: rgb(119, 119, 1=
19); padding-inline: 16px; padding-left: 16px; padding-right: 16px; quote=
s: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: =
rgb(119, 119, 119);">
<div class=3D"markdown-here-wrapper"> </div>
</blockquote>
</div>
<div class=3D"mdhr-raw"
style=3D"height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-s=
ize:0;padding:0;margin:0;"
aria-hidden=3D"true"
title=3D"MDH:PHA+PGJyPjwvcD48ZGl2IGNsYXNzPSJtb3otY2l0ZS1wcmVmaXgiPk9uIDQv=
OC8yNiA5OjIxIEFNLCBSYXltb25kIFRveSB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgd=
HlwZT0iY2l0ZSIgY2l0ZT0ibWlkOjNmZDgwMDRmLWFmYzMtNDQyYy04YWE2LWExYzZmNWUxNG=
JlN0BnbWFpbC5jb20iPgoKCiAgICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGN=
vbnRlbnQ9InRleHQvaHRtbDsgIj4KICAgIDx0aXRsZT48L3RpdGxlPgogICAgPG1ldGEgY2hh=
cnNldD0idXRmLTgiPgogIAogIAogICAgPGRpdiBjbGFzcz0ibWFya2Rvd24taGVyZS13cmFwc=
GVyIj4KICAgICAgPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDE5LjJweDsgbWFyZ2luLXRvcD=
ogMHB4OyI+SSBoYXZlIHRoaXMKICAgICAgICByb3V0aW5lOjwvcD4KICAgICAgPHByZSBzdHl=
sZT0iZm9udC1mYW1pbHk6IENvbnNvbGFzLCBJbmNvbnNvbGF0YSwgQ291cmllciwgbW9ub3Nw=
YWNlOyBmb250LXNpemU6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxOS4ycHg7IG1hcmdpbi1ib3R0b=
206IDE5LjJweDsgbWFyZ2luLXRvcDogMTkuMnB4OyI+PGNvZGUgc3R5bGU9ImJhY2tncm91bm=
QtY29sb3I6IHJnYmEoMTc1LCAxODQsIDE5MywgMC4yKTsgYm9yZGVyLWJsb2NrOiAxcHggc29=
saWQgcmdiKDIwNCwgMjA0LCAyMDQpOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDIw=
NCwgMjA0LCAyMDQpOyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAzcHg7IGJvcmRlci1ib=
3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7IGJvcmRlci1lbmQtZW5kLXJhZGl1czogM3B4OyBib3=
JkZXItZW5kLXN0YXJ0LXJhZGl1czogM3B4OyBib3JkZXItaW5saW5lOiAxcHggc29saWQgcmd=
iKDIwNCwgMjA0LCAyMDQpOyBib3JkZXItbGVmdDogMXB4IHNvbGlkIHJnYigyMDQsIDIwNCwg=
MjA0KTsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgcmdiKDIwNCwgMjA0LCAyMDQpOyBib3JkZ=
XItc3RhcnQtZW5kLXJhZGl1czogM3B4OyBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiAzcH=
g7IGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2IoMjA0LCAyMDQsIDIwNCk7IGJvcmRlci10b3A=
tbGVmdC1yYWRpdXM6IDNweDsgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDNweDsgZGlzcGxh=
eTogYmxvY2s7IGZvbnQtZmFtaWx5OiBDb25zb2xhcywgSW5jb25zb2xhdGEsIENvdXJpZXIsI=
G1vbm9zcGFjZTsgZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNTUwOyBsaW5lLWhlaW=
dodDogMTkuMnB4OyBtYXJnaW4tbGVmdDogMi40cHg7IG1hcmdpbi1yaWdodDogMi40cHg7IG9=
2ZXJmbG93LWJsb2NrOiBhdXRvOyBvdmVyZmxvdy1pbmxpbmU6IGF1dG87IG92ZXJmbG93OiBh=
dXRvOyBwYWRkaW5nLWJsb2NrOiA4cHg7IHBhZGRpbmctYm90dG9tOiA4cHg7IHBhZGRpbmcta=
W5saW5lOiAxMS4ycHg7IHBhZGRpbmctbGVmdDogMTEuMnB4OyBwYWRkaW5nLXJpZ2h0OiAxMS=
4ycHg7IHBhZGRpbmctdG9wOiA4cHg7Ij4KKGRlZnVuIHNsdXJwLWJ5dGVzIChmaWxlbmFtZSk=
KICAiUmV0dXJuIHRoZSBlbnRpcmUgY29udGVudHMgb2YgRklMRU5BTUUgYXMgYSAodW5zaWdu=
ZWQtYnl0ZSA4KSB2ZWN0b3IuCiAgIFJlc3VsdHMgYXJlIGNhY2hlZCBpbiAqYnl0ZXMtY2Fja=
GUqIHNvIGVhY2ggZmlsZSBpcyByZWFkIG9ubHkgb25jZS4iCiAgKG9yIChnZXRoYXNoIGZpbG=
VuYW1lICpieXRlcy1jYWNoZSopCiAgICAgIChzZXRmIChnZXRoYXNoIGZpbGVuYW1lICpieXR=
lcy1jYWNoZSopCiAgICAgICAgICAgICh3aXRoLW9wZW4tZmlsZSAocyBmaWxlbmFtZSA6ZGly=
ZWN0aW9uIDppbnB1dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO=
mVsZW1lbnQtdHlwZSAnKHVuc2lnbmVkLWJ5dGUgOCkpCiAgICAgICAgICAgICAgKGxldCogKC=
hsZW4gKGZpbGUtbGVuZ3RoIHMpKQogICAgICAgICAgICAgICAgICAgICAoYnVmIChtYWtlLWF=
ycmF5IGxlbiA6ZWxlbWVudC10eXBlICcodW5zaWduZWQtYnl0ZSA4KSkpKQogICAgICAgICAg=
ICAgICAgKHJlYWQtc2VxdWVuY2UgYnVmIHMpCiAgICAgICAgICAgICAgICBidWYpKSkpKQo8L=
2NvZGU+PC9wcmU+CiAgICAgIDxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAxOS4ycHg7IG1hcm=
dpbi10b3A6IDBweDsiPldoZW4gcmVhZGluZwogICAgICAgIG1heGltYS5pbmZvLTEgKDEwMzA=
2NzEgYnl0ZXMpLCBpdCB0YWtlcyBhIHZlcnkgbG9uZyB0aW1lCiAgICAgICAgKHNldmVyYWwg=
c2Vjb25kcykuIElzIHRoZXJlIGFueXdheSB0byBzcGVlZCB0aGlzIHVwPyBJIHdvdWxkCiAgI=
CAgICAgaGF2ZSBleHBlY3RlZCByZWFkaW5nIGEgYnVuY2ggb2YgYnl0ZXMgZnJvbSBhIGZpbG=
UgdmlhCiAgICAgICAgcmVhZC1zZXF1ZW5jZSB3b3VsZCBiZSB2ZXJ5IGZhc3QuPC9wPjwvZGl=
2PjwvYmxvY2txdW90ZT48cD5Tb21lIGdvb2dsaW5nIHBvaW50ZWQgbWUgdG8gYHNpOmZyZWFk=
YC4mbmJzcDsgSXQgbWFrZXMgYHNsdXJwLWJ5dGVzYCByZWFsbHkgZmFzdCB0YWtpbmcgdGlue=
SBmcmFjdGlvbnMgb2YgYSBzZWMgdG8gcmVhZCBpIGEgMSBNQiBmaWxlLiZuYnNwOyBIYXZpbm=
cgYHJlYWQtc2VxdWVuY2VgIHVzZSBgc2k6ZnJlYWRgIGZvciBlbGVtZW50IHR5cGVzIG9mIGB=
jaGFyYWN0ZXJgIG9yIGAodW5zaWduZWQtYnl0ZSA4KWAgd291bGQgYmUgYSByZWFsbHkgZ29v=
ZCB0aGluZy48L3A+PHA+PGJyPjwvcD48YmxvY2txdW90ZSB0eXBlPSJjaXRlIiBjaXRlPSJta=
WQ6M2ZkODAwNGYtYWZjMy00NDJjLThhYTYtYTFjNmY1ZTE0YmU3QGdtYWlsLmNvbSI+PGRpdi=
BjbGFzcz0ibWFya2Rvd24taGVyZS13cmFwcGVyIj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGF=
zcz0ibWRoci1yYXciIHN0eWxlPSJoZWlnaHQ6MDt3aWR0aDowO21heC1oZWlnaHQ6MDttYXgt=
d2lkdGg6MDtvdmVyZmxvdzpoaWRkZW47Zm9udC1zaXplOjA7cGFkZGluZzowO21hcmdpbjowO=
yIgYXJpYS1oaWRkZW49InRydWUiIHRpdGxlPSJNREg6UEhBK1NTQm9ZWFpsSUhSb2FYTWdjbT=
kxZEdsdVpUbzhMM0ErUEhBK1lHQmdQQzl3UGp4d1BpaGtaV1oxYmlCemJIVnljQzFpZVhSbGN=
5QW9abWxzWlc1aGJXVXBQR0p5UGladVluTndPeUFpVW1WMGRYSnVJSFJvWlNCbGJuUnBjbVVn=
WTI5dWRHVnVkSE1nYjJZZ1JrbE1SVTVCVFVVZ1lYTWdZU0FvZFc1emFXZHVaV1F0WW5sMFpTQ=
TRLU0IyWldOMGIzSXVQR0p5UGladVluTndPeUFtYm1KemNEdFNaWE4xYkhSeklHRnlaU0JqWV=
dOb1pXUWdhVzRnS21KNWRHVnpMV05oWTJobEtpQnpieUJsWVdOb0lHWnBiR1VnYVhNZ2NtVmh=
aQ0J2Ym14NUlHOXVZMlV1SWp4aWNqNG1ibUp6Y0RzZ0tHOXlJQ2huWlhSb1lYTm9JR1pwYkdW=
dVlXMWxJQ3BpZVhSbGN5MWpZV05vWlNvcFBHSnlQaVp1WW5Od095QW1ibUp6Y0RzZ0ptNWljM=
0E3SUNoelpYUm1JQ2huWlhSb1lYTm9JR1pwYkdWdVlXMWxJQ3BpZVhSbGN5MWpZV05vWlNvcF=
BHSnlQaVp1WW5Od095QW1ibUp6Y0RzZ0ptNWljM0E3SUNadVluTndPeUFtYm1KemNEc2dKbTV=
pYzNBN0lDaDNhWFJvTFc5d1pXNHRabWxzWlNBb2N5Qm1hV3hsYm1GdFpTQTZaR2x5WldOMGFX=
OXVJRHBwYm5CMWREeGljajRtYm1KemNEc2dKbTVpYzNBN0lDWnVZbk53T3lBbWJtSnpjRHNnS=
m01aWMzQTdJQ1p1WW5Od095QW1ibUp6Y0RzZ0ptNWljM0E3SUNadVluTndPeUFtYm1KemNEc2=
dKbTVpYzNBN0lDWnVZbk53T3lBbWJtSnpjRHNnSm01aWMzQTdJQ1p1WW5Od095QW1ibUp6Y0R=
zZ0ptNWljM0E3SUNadVluTndPeUFtYm1KemNEc2dKbTVpYzNBN0lEcGxiR1Z0Wlc1MExYUjVj=
R1VnSnloMWJuTnBaMjVsWkMxaWVYUmxJRGdwS1R4aWNqNG1ibUp6Y0RzZ0ptNWljM0E3SUNad=
VluTndPeUFtYm1KemNEc2dKbTVpYzNBN0lDWnVZbk53T3lBbWJtSnpjRHNnS0d4bGRDb2dLQ2=
hzWlc0Z0tHWnBiR1V0YkdWdVozUm9JSE1wS1R4aWNqNG1ibUp6Y0RzZ0ptNWljM0E3SUNadVl=
uTndPeUFtYm1KemNEc2dKbTVpYzNBN0lDWnVZbk53T3lBbWJtSnpjRHNnSm01aWMzQTdJQ1p1=
WW5Od095QW1ibUp6Y0RzZ0ptNWljM0E3S0dKMVppQW9iV0ZyWlMxaGNuSmhlU0JzWlc0Z09tV=
nNaVzFsYm5RdGRIbHdaU0FuS0hWdWMybG5ibVZrTFdKNWRHVWdPQ2twS1NrOFluSStKbTVpYz=
NBN0lDWnVZbk53T3lBbWJtSnpjRHNnSm01aWMzQTdJQ1p1WW5Od095QW1ibUp6Y0RzZ0ptNWl=
jM0E3SUNadVluTndPeUFvY21WaFpDMXpaWEYxWlc1alpTQmlkV1lnY3lrOFluSStKbTVpYzNB=
N0lDWnVZbk53T3lBbWJtSnpjRHNnSm01aWMzQTdJQ1p1WW5Od095QW1ibUp6Y0RzZ0ptNWljM=
0E3SUNadVluTndPeUJpZFdZcEtTa3BLVHd2Y0Q0OGNENWdZR0E4TDNBK1BIQStWMmhsYmlCeV=
pXRmthVzVuSUcxaGVHbHRZUzVwYm1adkxURWdLREV3TXpBMk56RWdZbmwwWlhNcExDQnBkQ0I=
wWVd0bGN5QmhJSFpsY25rZ2JHOXVaeUIwYVcxbElDaHpaWFpsY21Gc0lITmxZMjl1WkhNcExp=
WnVZbk53T3lCSmN5QjBhR1Z5WlNCaGJubDNZWGtnZEc4Z2MzQmxaV1FnZEdocGN5QjFjRDhtY=
m1KemNEc2dTU0IzYjNWc1pDQm9ZWFpsSUdWNGNHVmpkR1ZrSUhKbFlXUnBibWNnWVNCaWRXNW=
phQ0J2WmlCaWVYUmxjeUJtY205dElHRWdabWxzWlNCMmFXRWdjbVZoWkMxelpYRjFaVzVqWlN=
CM2IzVnNaQ0JpWlNCMlpYSjVJR1poYzNRdVBDOXdQangxYkNCamJHRnpjejBpWkhKdmNHUnZk=
MjR0YldWdWRTQjBaWGgwWTI5dGNHeGxkR1V0WkhKdmNHUnZkMjRpSUhOMGVXeGxQU0prYVhOd=
2JHRjVPaUJ1YjI1bE95QndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdJSG90YVc1a1pYZzZJRE=
V3TURBN0lpQmpiMjUwWlc1MFpXUnBkR0ZpYkdVOUltWmhiSE5sSWlCd2IzQnZkbVZ5UFNKaGR=
YUnZJajQ4TDNWc1BnPT0iPiZhbXA7IzgyMDM7PC9kaXY+CiAgCgoKPC9ibG9ja3F1b3RlPg=3D=
=3D">&#8203;</div>
</body>
</html>
--------------ucL4062ywXsn1gsN7wBOb6Aq--