limit checks

Stephen Weeks sweeks@intertrust.com
Wed, 24 Oct 2001 16:50:08 -0700


--Oy9lEvw/Hr
Content-Type: text/plain; charset=us-ascii
Content-Description: message body text
Content-Transfer-Encoding: 7bit


I figured out a bit more about what went wrong with the old limit
check insertion in vliw.  I have attached the postscript for the
offending member_1 function.  The pass that decided where limit checks
might be inserted (limit-check.fun) worked correctly.  Namely, it
decided that we might need a limit check at loop_385, and genCont in
backend.fun correctly decided that we might need a limit check at the
continuation corresponding to L_4445.

The problem is in insertLimitChecks in machine.fun.  Here is the
relevant snippet of vliw.toMOut.diagnostic, showing the bytesNeeded at
the start of each block.

L_4440 Some (0)
L_4441 Some (0)
L_4442 Some (0)
L_4443 Some (12)
L_4444 Some (12)
L_4445 Some (12)
L_4446 Some (0)
L_4447 Some (0)
L_4448 Some (0)
L_4449 Some (0)
L_4450 Some (0)
L_4451 Some (0)
L_4452 Some (0)
L_4453 Some (0)
loop_385 Some (0)
member_1 Some (0)

Notice that although L_4444 is 12, L_4452 is 0, even though L_4452
directly jumps to L_4444.  The problem is that insertLimitChecks does
a depth-first search from each entry point (continuation or function)
filling in the bytesNeeded fields.  It happens to first do a dfs from
L_4445 first, which sets L_4444's bytes needed temporarily to zero
before continuing the dfs.  It eventually gets to L_4452 via loop_185,
sees that L_4444 is zero, which causes L_4452 to be set to zero.

I think that the right way to go is for limit check placement to
choose enough points at which limit checks might be placed so that
every path encounters such a point infinitely often.  Put another way,
every dfs from a limit check point that stops when it hits other limit
check points will produce a dag.

The current limit check algorithm achieves this, except for the
unnatural loops introduced by contification, an unrelated bug that we
will soon fix.  The problem with vliw is that the current dfs is not
stopping when it hits limit check points points.

So as far as the limit check framework is concerned, I would like to
break the problem into two pieces -- 
  1. where to put limit check points points
  2. given a placement, figure out the right amount at each point

In MLton, there are two things to fix with (1), the unnatural loop bug
and we need to add limit checks at loop exits so that limit checks
aren't hoisted into loops.  I hope that both of those are doable with
loop forests.  With (2), we need to fix the dfs, or go with some other
algorithm.



--Oy9lEvw/Hr
Content-Type: application/postscript
Content-Disposition: attachment;
	filename="z.ps"
Content-Transfer-Encoding: base64

JSFQUy1BZG9iZS0yLjAKJSVDcmVhdG9yOiBkb3QgdmVyc2lvbiAxLjcuNCAoVGh1IE1hciAxNSAx
NToxNjowNCBDRVQgMjAwMSkKJSVGb3I6IChzd2Vla3MpIFN0ZXBoZW4gV2Vla3MKJSVUaXRsZTog
bWVtYmVyXzEgKHhfNjY2MCx4XzY2NTkpIGNvbnRyb2wtZmxvdyBncmFwaAolJVBhZ2VzOiAoYXRl
bmQpCiUlQm91bmRpbmdCb3g6IDM2IDM2IDU5NCAxMDY1CiUlRW5kQ29tbWVudHMKJSVCZWdpblBy
b2xvZwpzYXZlCi9Eb3REaWN0IDIwMCBkaWN0IGRlZgpEb3REaWN0IGJlZ2luCgolJUJlZ2luUmVz
b3VyY2U6IHByb2NzZXQKL2Nvb3JkLWZvbnQtZmFtaWx5IC9UaW1lcy1Sb21hbiBkZWYKL2RlZmF1
bHQtZm9udC1mYW1pbHkgL1RpbWVzLVJvbWFuIGRlZgovY29vcmRmb250IGNvb3JkLWZvbnQtZmFt
aWx5IGZpbmRmb250IDggc2NhbGVmb250IGRlZgoKL0ludlNjYWxlRmFjdG9yIDEuMCBkZWYKL3Nl
dF9zY2FsZSB7CglkdXAgMSBleGNoIGRpdiAvSW52U2NhbGVGYWN0b3IgZXhjaCBkZWYKCWR1cCBz
Y2FsZQp9IGJpbmQgZGVmCgolIHN0eWxlcwovc29saWQgeyB9IGJpbmQgZGVmCi9kYXNoZWQgeyBb
OSBJbnZTY2FsZUZhY3RvciBtdWwgZHVwIF0gMCBzZXRkYXNoIH0gYmluZCBkZWYKL2RvdHRlZCB7
IFsxIEludlNjYWxlRmFjdG9yIG11bCA2IEludlNjYWxlRmFjdG9yIG11bF0gMCBzZXRkYXNoIH0g
YmluZCBkZWYKL2ludmlzIHsvZmlsbCB7bmV3cGF0aH0gZGVmIC9zdHJva2Uge25ld3BhdGh9IGRl
ZiAvc2hvdyB7cG9wIG5ld3BhdGh9IGRlZn0gYmluZCBkZWYKL2JvbGQgeyAyIHNldGxpbmV3aWR0
aCB9IGJpbmQgZGVmCi9maWxsZWQgeyB9IGJpbmQgZGVmCi91bmZpbGxlZCB7IH0gYmluZCBkZWYK
L3JvdW5kZWQgeyB9IGJpbmQgZGVmCi9kaWFnb25hbHMgeyB9IGJpbmQgZGVmCgolIGhvb2tzIGZv
ciBzZXR0aW5nIGNvbG9yIAovbm9kZWNvbG9yIHsgc2V0aHNiY29sb3IgfSBiaW5kIGRlZgovZWRn
ZWNvbG9yIHsgc2V0aHNiY29sb3IgfSBiaW5kIGRlZgovZ3JhcGhjb2xvciB7IHNldGhzYmNvbG9y
IH0gYmluZCBkZWYKL25vcGNvbG9yIHtwb3AgcG9wIHBvcH0gYmluZCBkZWYKCi9iZWdpbnBhZ2Ug
ewklIGkgaiBucGFnZXMKCS9ucGFnZXMgZXhjaCBkZWYKCS9qIGV4Y2ggZGVmCgkvaSBleGNoIGRl
ZgoJL3N0ciAxMCBzdHJpbmcgZGVmCglucGFnZXMgMSBndCB7CgkJZ3NhdmUKCQkJY29vcmRmb250
IHNldGZvbnQKCQkJMCAwIG1vdmV0bwoJCQkoXCgpIHNob3cgaSBzdHIgY3ZzIHNob3cgKCwpIHNo
b3cgaiBzdHIgY3ZzIHNob3cgKFwpKSBzaG93CgkJZ3Jlc3RvcmUKCX0gaWYKfSBiaW5kIGRlZgoK
L3NldF9mb250IHsKCWZpbmRmb250IGV4Y2gKCXNjYWxlZm9udCBzZXRmb250Cn0gZGVmCgolIGRy
YXcgYWxpZ25lZCBsYWJlbCBpbiBib3VuZGluZyBib3ggYWxpZ25lZCB0byBjdXJyZW50IHBvaW50
CiUgYWxpZ25mYWN0b3IgdGVsbHMgd2hhdCBmcmFjdGlvbiB0byBwbGFjZSBvbiB0aGUgbGVmdC4K
JSAtLjUgaXMgY2VudGVyZWQuCi9hbGlnbmVkdGV4dCB7CQkJJSB0ZXh0IGxhYmVsd2lkdGggZm9u
dHN6IGFsaWduZmFjdG9yCgkvYWxpZ25mYWN0b3IgZXhjaCBkZWYKCS9mb250c3ogZXhjaCBkZWYK
CS93aWR0aCBleGNoIGRlZgoJL3RleHQgZXhjaCBkZWYKCWdzYXZlCgkJJSBldmVuIGlmIG5vZGUg
b3IgZWRnZSBpcyBkYXNoZWQsIGRvbid0IHBhaW50IHRleHQgd2l0aCBkYXNoZXMKCQlbXSAwIHNl
dGRhc2gKCQljdXJyZW50cG9pbnQgbmV3cGF0aCBtb3ZldG8KCQl0ZXh0IHN0cmluZ3dpZHRoIHBv
cAoJCWFsaWduZmFjdG9yIG11bCBmb250c3ogLS4zIG11bCBybW92ZXRvCgkJdGV4dCBzaG93Cgln
cmVzdG9yZQp9IGRlZgoKL2JveHByaW0gewkJCQklIHhjb3JuZXIgeWNvcm5lciB4c2l6ZSB5c2l6
ZQoJCTQgMiByb2xsCgkJbW92ZXRvCgkJMiBjb3B5CgkJZXhjaCAwIHJsaW5ldG8KCQkwIGV4Y2gg
cmxpbmV0bwoJCXBvcCBuZWcgMCBybGluZXRvCgkJY2xvc2VwYXRoCn0gYmluZCBkZWYKCi9lbGxp
cHNlX3BhdGggewoJL3J5IGV4Y2ggZGVmCgkvcnggZXhjaCBkZWYKCS95IGV4Y2ggZGVmCgkveCBl
eGNoIGRlZgoJbWF0cml4IGN1cnJlbnRtYXRyaXgKCW5ld3BhdGgKCXggeSB0cmFuc2xhdGUKCXJ4
IHJ5IHNjYWxlCgkwIDAgMSAwIDM2MCBhcmMKCXNldG1hdHJpeAp9IGJpbmQgZGVmCgovZW5kcGFn
ZSB7IHNob3dwYWdlIH0gYmluZCBkZWYKCi9sYXllcmNvbG9yc2VxCglbCSUgbGF5ZXIgY29sb3Ig
c2VxdWVuY2UgLSBkYXJrZXN0IHRvIGxpZ2h0ZXN0CgkJWzAgMCAwXQoJCVsuMiAuOCAuOF0KCQlb
LjQgLjggLjhdCgkJWy42IC44IC44XQoJCVsuOCAuOCAuOF0KCV0KZGVmCgovc2V0bGF5ZXIgey9t
YXhsYXllciBleGNoIGRlZiAvY3VybGF5ZXIgZXhjaCBkZWYKCWxheWVyY29sb3JzZXEgY3VybGF5
ZXIgZ2V0CglhbG9hZCBwb3Agc2V0aHNiY29sb3IKCS9ub2RlY29sb3Ige25vcGNvbG9yfSBkZWYK
CS9lZGdlY29sb3Ige25vcGNvbG9yfSBkZWYKCS9ncmFwaGNvbG9yIHtub3Bjb2xvcn0gZGVmCn0g
YmluZCBkZWYKCi9vbmxheWVyIHsgY3VybGF5ZXIgbmUge2ludmlzfSBpZiB9IGRlZgoKL29ubGF5
ZXJzIHsKCS9teXVwcGVyIGV4Y2ggZGVmCgkvbXlsb3dlciBleGNoIGRlZgoJY3VybGF5ZXIgbXls
b3dlciBsdAoJY3VybGF5ZXIgbXl1cHBlciBndAoJb3IKCXtpbnZpc30gaWYKfSBkZWYKCi9jdXJs
YXllciAwIGRlZgoKJSVFbmRQcm9sb2cKJSVCZWdpblNldHVwCjE0IGRlZmF1bHQtZm9udC1mYW1p
bHkgc2V0X2ZvbnQKMSBzZXRtaXRlcmxpbWl0CiUgL2Fycm93bGVuZ3RoIDEwIGRlZgolIC9hcnJv
d3dpZHRoIDUgZGVmCgolIG1ha2Ugc3VyZSBwZGZtYXJrIGlzIGhhcm1sZXNzIGZvciBQUy1pbnRl
cnByZXRlcnMgb3RoZXIgdGhhbiBEaXN0aWxsZXIKL3BkZm1hcmsgd2hlcmUge3BvcH0ge3VzZXJk
aWN0IC9wZGZtYXJrIC9jbGVhcnRvbWFyayBsb2FkIHB1dH0gaWZlbHNlCiUgbWFrZSAnPDwnIGFu
ZCAnPj4nIHNhZmUgb24gUFMgTGV2ZWwgMSBkZXZpY2VzCi9sYW5ndWFnZWxldmVsIHdoZXJlIHtw
b3AgbGFuZ3VhZ2VsZXZlbH17MX0gaWZlbHNlCjIgbHQgewogICAgdXNlcmRpY3QgKDw8KSBjdm4g
KFspIGN2biBsb2FkIHB1dAogICAgdXNlcmRpY3QgKD4+KSBjdm4gKFspIGN2biBsb2FkIHB1dAp9
IGlmCgolJUVuZFJlc291cmNlCiUlRW5kU2V0dXAKJSVQYWdlOiAxIDEKJSVQYWdlQm91bmRpbmdC
b3g6IDM2IDM2IDU5NCAxMDY1CiUlUGFnZU9yaWVudGF0aW9uOiBQb3J0cmFpdApnc2F2ZQozNSAz
NSA1NTkgMTAzMCBib3hwcmltIGNsaXAgbmV3cGF0aAozNiAzNiB0cmFuc2xhdGUKMCAwIDEgYmVn
aW5wYWdlCjAgMCB0cmFuc2xhdGUgMCByb3RhdGUKWyAvQ3JvcEJveCBbMzYgMzYgNTk0IDEwNjVd
IC9QQUdFUyBwZGZtYXJrCjAuMDAwIDAuMDAwIDAuMDAwIGdyYXBoY29sb3IKMTQuMDAgL1RpbWVz
LVJvbWFuIHNldF9mb250CmdzYXZlIDEwIGRpY3QgYmVnaW4KMjc4IDkgbW92ZXRvIChtZW1iZXJf
MSBcKHhfNjY2MCx4XzY2NTlcKSBjb250cm9sLWZsb3cgZ3JhcGgpIDI2OCAxNC4wMCAtMC41MCBh
bGlnbmVkdGV4dAplbmQgZ3Jlc3RvcmUKCiUJbjAKZ3NhdmUgMTAgZGljdCBiZWdpbgpuZXdwYXRo
IDE0OSA5MTAgbW92ZXRvCjY3IDkxMCBsaW5ldG8KNjcgODc0IGxpbmV0bwoxNDkgODc0IGxpbmV0
bwpjbG9zZXBhdGgKc3Ryb2tlCmdzYXZlIDEwIGRpY3QgYmVnaW4KMC4wMDAgMC4wMDAgMC4wMDAg
bm9kZWNvbG9yCjY3IDkwMSBtb3ZldG8gKExfNDQ0MSBcKFwpKSA1NiAxNC4wMCAwLjAwIGFsaWdu
ZWR0ZXh0CjY3IDg4NSBtb3ZldG8gKHJldHVybiBcKHRydWVcKSkgNjcgMTQuMDAgMC4wMCBhbGln
bmVkdGV4dAplbmQgZ3Jlc3RvcmUKZW5kIGdyZXN0b3JlCgolCW4xCmdzYXZlIDEwIGRpY3QgYmVn
aW4KbmV3cGF0aCAzNzMgOTE2IG1vdmV0bwoyMDUgOTE2IGxpbmV0bwoyMDUgODY4IGxpbmV0bwoz
NzMgODY4IGxpbmV0bwpjbG9zZXBhdGgKc3Ryb2tlCmdzYXZlIDEwIGRpY3QgYmVnaW4KMC4wMDAg
MC4wMDAgMC4wMDAgbm9kZWNvbG9yCjIwNSA5MDkgbW92ZXRvIChMXzQ0NDMgXChcKSkgNTYgMTQu
MDAgMC4wMCBhbGlnbmVkdGV4dAoyMDUgODkzIG1vdmV0byAoeF82NjYxID0gXCh4XzY2NjMseF82
NjYyXCkpIDE1MyAxNC4wMCAwLjAwIGFsaWduZWR0ZXh0CjIwNSA4NzcgbW92ZXRvIChsb29wXzM4
NSBcKHhfNjY2MSx4XzY2NjRcKSkgMTUzIDE0LjAwIDAuMDAgYWxpZ25lZHRleHQKZW5kIGdyZXN0
b3JlCmVuZCBncmVzdG9yZQoKJQluMgpnc2F2ZSAxMCBkaWN0IGJlZ2luCm5ld3BhdGggMzk1IDgx
NiBtb3ZldG8KMjI5IDgxNiBsaW5ldG8KMjI5IDc1MiBsaW5ldG8KMzk1IDc1MiBsaW5ldG8KY2xv
c2VwYXRoCnN0cm9rZQpnc2F2ZSAxMCBkaWN0IGJlZ2luCjAuMDAwIDAuMDAwIDAuMDAwIG5vZGVj
b2xvcgoyMjkgODA5IG1vdmV0byAobG9vcF8zODUgXCh4XzY2NzcseF82NjY0XCkpIDE1MyAxNC4w
MCAwLjAwIGFsaWduZWR0ZXh0CjIyOSA3OTMgbW92ZXRvICh4XzY2NzggPSAjMiB4XzY2NzcpIDEx
NiAxNC4wMCAwLjAwIGFsaWduZWR0ZXh0CjIyOSA3NzcgbW92ZXRvICh4XzY2NjMgPSAjMSB4XzY2
NzcpIDExNiAxNC4wMCAwLjAwIGFsaWduZWR0ZXh0CjIyOSA3NjEgbW92ZXRvIChjYXNlIHhfNjY3
OCkgNjkgMTQuMDAgMC4wMCBhbGlnbmVkdGV4dAplbmQgZ3Jlc3RvcmUKZW5kIGdyZXN0b3JlCgol
CW4xIC0+IG4yCmdzYXZlIDEwIGRpY3QgYmVnaW4Kc29saWQKbmV3cGF0aCAyOTQgODY4IG1vdmV0
bwoyOTYgODU2IDMwMCA4NDAgMzAzIDgyNiBjdXJ2ZXRvCnN0cm9rZQpuZXdwYXRoIDMwMSA4MjUg
bW92ZXRvCjMwNSA4MTYgbGluZXRvCjMwNSA4MjYgbGluZXRvCmNsb3NlcGF0aApmaWxsCmdzYXZl
IDEwIGRpY3QgYmVnaW4KMzAyIDg0MyBtb3ZldG8gKCkgMCAxNC4wMCAtMC41MCBhbGlnbmVkdGV4
dAplbmQgZ3Jlc3RvcmUKZW5kIGdyZXN0b3JlCgolCW4xMgpnc2F2ZSAxMCBkaWN0IGJlZ2luCm5l
d3BhdGggMjkyIDcwMCBtb3ZldG8KMjA2IDcwMCBsaW5ldG8KMjA2IDY2NCBsaW5ldG8KMjkyIDY2
NCBsaW5ldG8KY2xvc2VwYXRoCnN0cm9rZQpnc2F2ZSAxMCBkaWN0IGJlZ2luCjAuMDAwIDAuMDAw
IDAuMDAwIG5vZGVjb2xvcgoyMDYgNjkxIG1vdmV0byAoTF80NDQyIFwoXCkpIDU2IDE0LjAwIDAu
MDAgYWxpZ25lZHRleHQKMjA2IDY3NSBtb3ZldG8gKHJldHVybiBcKGZhbHNlXCkpIDcyIDE0LjAw
IDAuMDAgYWxpZ25lZHRleHQKZW5kIGdyZXN0b3JlCmVuZCBncmVzdG9yZQoKJQluMiAtPiBuMTIK
Z3NhdmUgMTAgZGljdCBiZWdpbgpzb2xpZApuZXdwYXRoIDI5MiA3NTIgbW92ZXRvCjI4NCA3Mzgg
MjczIDcyMSAyNjUgNzA4IGN1cnZldG8Kc3Ryb2tlCm5ld3BhdGggMjYzIDcxMCBtb3ZldG8KMjYw
IDcwMCBsaW5ldG8KMjY3IDcwNyBsaW5ldG8KY2xvc2VwYXRoCmZpbGwKZ3NhdmUgMTAgZGljdCBi
ZWdpbgozMDMgNzI3IG1vdmV0byAobmlsXzEpIDI4IDE0LjAwIC0wLjUwIGFsaWduZWR0ZXh0CmVu
ZCBncmVzdG9yZQplbmQgZ3Jlc3RvcmUKCiUJbjEzCmdzYXZlIDEwIGRpY3QgYmVnaW4KbmV3cGF0
aCA0NjggNzAwIG1vdmV0bwozMTAgNzAwIGxpbmV0bwozMTAgNjY0IGxpbmV0bwo0NjggNjY0IGxp
bmV0bwpjbG9zZXBhdGgKc3Ryb2tlCmdzYXZlIDEwIGRpY3QgYmVnaW4KMC4wMDAgMC4wMDAgMC4w
MDAgbm9kZWNvbG9yCjMxMCA2OTEgbW92ZXRvIChMXzQ0NTMgXCh4XzY2NjIseF82NjczXCkpIDE0
MyAxNC4wMCAwLjAwIGFsaWduZWR0ZXh0CjMxMCA2NzUgbW92ZXRvIChjYXNlIHhfNjY2MykgNjkg
MTQuMDAgMC4wMCBhbGlnbmVkdGV4dAplbmQgZ3Jlc3RvcmUKZW5kIGdyZXN0b3JlCgolCW4yIC0+
IG4xMwpnc2F2ZSAxMCBkaWN0IGJlZ2luCnNvbGlkCm5ld3BhdGggMzM2IDc1MiBtb3ZldG8KMzQ3
IDczOCAzNjAgNzIxIDM3MCA3MDcgY3VydmV0bwpzdHJva2UKbmV3cGF0aCAzNjcgNzA3IG1vdmV0
bwozNzUgNzAwIGxpbmV0bwozNzEgNzEwIGxpbmV0bwpjbG9zZXBhdGgKZmlsbApnc2F2ZSAxMCBk
aWN0IGJlZ2luCjM3OSA3MjcgbW92ZXRvICg6Ol8yKSAyMSAxNC4wMCAtMC41MCBhbGlnbmVkdGV4
dAplbmQgZ3Jlc3RvcmUKZW5kIGdyZXN0b3JlCgolCW4zCmdzYXZlIDEwIGRpY3QgYmVnaW4KbmV3
cGF0aCAxNzAgNzIgbW92ZXRvCjAgNzIgbGluZXRvCjAgMjQgbGluZXRvCjE3MCAyNCBsaW5ldG8K
Y2xvc2VwYXRoCnN0cm9rZQpnc2F2ZSAxMCBkaWN0IGJlZ2luCjAuMDAwIDAuMDAwIDAuMDAwIG5v
ZGVjb2xvcgowIDY1IG1vdmV0byAoTF80NDQ1IFwoeF82NjY2XCkpIDk4IDE0LjAwIDAuMDAgYWxp
Z25lZHRleHQKMCA0OSBtb3ZldG8gKHhfNjY2NyA9IHhfNjY2OCA9IHhfNjY2NikgMTU1IDE0LjAw
IDAuMDAgYWxpZ25lZHRleHQKMCAzMyBtb3ZldG8gKExfNDQ0NCBcKHhfNjY2N1wpKSA5OCAxNC4w
MCAwLjAwIGFsaWduZWR0ZXh0CmVuZCBncmVzdG9yZQplbmQgZ3Jlc3RvcmUKCiUJbjQKZ3NhdmUg
MTAgZGljdCBiZWdpbgpuZXdwYXRoIDE5OCAxMDA0IG1vdmV0bwo4NiAxMDA0IGxpbmV0bwo4NiA5
NjggbGluZXRvCjE5OCA5NjggbGluZXRvCmNsb3NlcGF0aApzdHJva2UKZ3NhdmUgMTAgZGljdCBi
ZWdpbgowLjAwMCAwLjAwMCAwLjAwMCBub2RlY29sb3IKODYgOTk1IG1vdmV0byAoTF80NDQ0IFwo
eF82NjY1XCkpIDk4IDE0LjAwIDAuMDAgYWxpZ25lZHRleHQKODYgOTc5IG1vdmV0byAoY2FzZSB4
XzY2NjUpIDY5IDE0LjAwIDAuMDAgYWxpZ25lZHRleHQKZW5kIGdyZXN0b3JlCmVuZCBncmVzdG9y
ZQoKJQluMyAtPiBuNApnc2F2ZSAxMCBkaWN0IGJlZ2luCnNvbGlkCm5ld3BhdGggMTAzIDk2NCBt
b3ZldG8KNzMgOTQ2IDM5IDkxOCAzOSA4OTIgY3VydmV0bwozOSA4OTIgMzkgODkyIDM5IDE0MiBj
dXJ2ZXRvCjM5IDEyMSA1NSA5MiA2OCA3MiBjdXJ2ZXRvCnN0cm9rZQpuZXdwYXRoIDEwMiA5NjAg
bW92ZXRvCjEwOSA5NjggbGluZXRvCjk5IDk2NSBsaW5ldG8KY2xvc2VwYXRoCmZpbGwKZ3NhdmUg
MTAgZGljdCBiZWdpbgozOSA0OTUgbW92ZXRvICgpIDAgMTQuMDAgLTAuNTAgYWxpZ25lZHRleHQK
ZW5kIGdyZXN0b3JlCmVuZCBncmVzdG9yZQoKJQluNCAtPiBuMApnc2F2ZSAxMCBkaWN0IGJlZ2lu
CnNvbGlkCm5ld3BhdGggMTMyIDk2OCBtb3ZldG8KMTI5IDk2MSAxMjYgOTU1IDEyNCA5NTAgY3Vy
dmV0bwoxMjIgOTQyIDExOCA5MzEgMTE1IDkyMCBjdXJ2ZXRvCnN0cm9rZQpuZXdwYXRoIDExMyA5
MjAgbW92ZXRvCjExMyA5MTAgbGluZXRvCjExNyA5MTkgbGluZXRvCmNsb3NlcGF0aApmaWxsCmdz
YXZlIDEwIGRpY3QgYmVnaW4KMTQyIDk0MyBtb3ZldG8gKHRydWUpIDIxIDE0LjAwIC0wLjUwIGFs
aWduZWR0ZXh0CmVuZCBncmVzdG9yZQplbmQgZ3Jlc3RvcmUKCiUJbjQgLT4gbjEKZ3NhdmUgMTAg
ZGljdCBiZWdpbgpzb2xpZApuZXdwYXRoIDE3MCA5NjggbW92ZXRvCjE5MSA5NTUgMjE5IDkzNiAy
NDQgOTIxIGN1cnZldG8Kc3Ryb2tlCm5ld3BhdGggMjQyIDkxOSBtb3ZldG8KMjUyIDkxNiBsaW5l
dG8KMjQ1IDkyMyBsaW5ldG8KY2xvc2VwYXRoCmZpbGwKZ3NhdmUgMTAgZGljdCBiZWdpbgoyNDQg
OTQzIG1vdmV0byAoZmFsc2UpIDI2IDE0LjAwIC0wLjUwIGFsaWduZWR0ZXh0CmVuZCBncmVzdG9y
ZQplbmQgZ3Jlc3RvcmUKCiUJbjUKZ3NhdmUgMTAgZGljdCBiZWdpbgpuZXdwYXRoIDI5MyAxNjAg
bW92ZXRvCjY3IDE2MCBsaW5ldG8KNjcgMTI0IGxpbmV0bwoyOTMgMTI0IGxpbmV0bwpjbG9zZXBh
dGgKc3Ryb2tlCmdzYXZlIDEwIGRpY3QgYmVnaW4KMC4wMDAgMC4wMDAgMC4wMDAgbm9kZWNvbG9y
CjY3IDE1MSBtb3ZldG8gKExfNDQ0NiBcKHhfNjY2OVwpKSA5OCAxNC4wMCAwLjAwIGFsaWduZWR0
ZXh0CjY3IDEzNSBtb3ZldG8gKExfNDQ0NSBcKGltcGxvZGVfMFwoeF82NjY5LHhfNjY3MFwpXCkp
IDIxMiAxNC4wMCAwLjAwIGFsaWduZWR0ZXh0CmVuZCBncmVzdG9yZQplbmQgZ3Jlc3RvcmUKCiUJ
bjUgLT4gbjMKZ3NhdmUgMTAgZGljdCBiZWdpbgpkb3R0ZWQKbmV3cGF0aCAxNjIgMTI0IG1vdmV0
bwoxNDkgMTExIDEzMiA5NCAxMTYgNzkgY3VydmV0bwpzdHJva2UKbmV3cGF0aCAxMTQgODEgbW92
ZXRvCjEwOSA3MiBsaW5ldG8KMTE4IDc3IGxpbmV0bwpjbG9zZXBhdGgKZmlsbApnc2F2ZSAxMCBk
aWN0IGJlZ2luCjE0NCA5OSBtb3ZldG8gKCkgMCAxNC4wMCAtMC41MCBhbGlnbmVkdGV4dAplbmQg
Z3Jlc3RvcmUKZW5kIGdyZXN0b3JlCgolCW42CmdzYXZlIDEwIGRpY3QgYmVnaW4KbmV3cGF0aCAy
NjAgMjQ4IG1vdmV0bwoxMDIgMjQ4IGxpbmV0bwoxMDIgMjEyIGxpbmV0bwoyNjAgMjEyIGxpbmV0
bwpjbG9zZXBhdGgKc3Ryb2tlCmdzYXZlIDEwIGRpY3QgYmVnaW4KMC4wMDAgMC4wMDAgMC4wMDAg
bm9kZWNvbG9yCjEwMiAyMzkgbW92ZXRvIChMXzQ0NDcgXCh4XzY2NzFcKSkgOTggMTQuMDAgMC4w
MCBhbGlnbmVkdGV4dAoxMDIgMjIzIG1vdmV0byAoTF80NDQ2IFwocHJlZl8wXCh4XzY2NzFcKVwp
KSAxNDMgMTQuMDAgMC4wMCBhbGlnbmVkdGV4dAplbmQgZ3Jlc3RvcmUKZW5kIGdyZXN0b3JlCgol
CW42IC0+IG41CmdzYXZlIDEwIGRpY3QgYmVnaW4KZG90dGVkCm5ld3BhdGggMTgxIDIxMiBtb3Zl
dG8KMTgwIDIwMCAxODAgMTgzIDE4MCAxNjkgY3VydmV0bwpzdHJva2UKbmV3cGF0aCAxNzggMTcw
IG1vdmV0bwoxODAgMTYwIGxpbmV0bwoxODMgMTcwIGxpbmV0bwpjbG9zZXBhdGgKZmlsbApnc2F2
ZSAxMCBkaWN0IGJlZ2luCjE4MSAxODcgbW92ZXRvICgpIDAgMTQuMDAgLTAuNTAgYWxpZ25lZHRl
eHQKZW5kIGdyZXN0b3JlCmVuZCBncmVzdG9yZQoKJQluNwpnc2F2ZSAxMCBkaWN0IGJlZ2luCm5l
d3BhdGggMjk4IDMzNiBtb3ZldG8KNzQgMzM2IGxpbmV0bwo3NCAzMDAgbGluZXRvCjI5OCAzMDAg
bGluZXRvCmNsb3NlcGF0aApzdHJva2UKZ3NhdmUgMTAgZGljdCBiZWdpbgowLjAwMCAwLjAwMCAw
LjAwMCBub2RlY29sb3IKNzQgMzI3IG1vdmV0byAoTF80NDQ4IFwoeF82NjY4XCkpIDk4IDE0LjAw
IDAuMDAgYWxpZ25lZHRleHQKNzQgMzExIG1vdmV0byAoTF80NDQ3IFwoZXhwbG9kZV8wXCh4XzY2
NzMseF82NjcyXClcKSkgMjExIDE0LjAwIDAuMDAgYWxpZ25lZHRleHQKZW5kIGdyZXN0b3JlCmVu
ZCBncmVzdG9yZQoKJQluNyAtPiBuNgpnc2F2ZSAxMCBkaWN0IGJlZ2luCmRvdHRlZApuZXdwYXRo
IDE4NSAzMDAgbW92ZXRvCjE4NCAyODggMTgzIDI3MSAxODMgMjU3IGN1cnZldG8Kc3Ryb2tlCm5l
d3BhdGggMTgxIDI1OCBtb3ZldG8KMTgyIDI0OCBsaW5ldG8KMTg2IDI1OCBsaW5ldG8KY2xvc2Vw
YXRoCmZpbGwKZ3NhdmUgMTAgZGljdCBiZWdpbgoxODQgMjc1IG1vdmV0byAoKSAwIDE0LjAwIC0w
LjUwIGFsaWduZWR0ZXh0CmVuZCBncmVzdG9yZQplbmQgZ3Jlc3RvcmUKCiUJbjgKZ3NhdmUgMTAg
ZGljdCBiZWdpbgpuZXdwYXRoIDMxOSA0MjQgbW92ZXRvCjkzIDQyNCBsaW5ldG8KOTMgMzg4IGxp
bmV0bwozMTkgMzg4IGxpbmV0bwpjbG9zZXBhdGgKc3Ryb2tlCmdzYXZlIDEwIGRpY3QgYmVnaW4K
MC4wMDAgMC4wMDAgMC4wMDAgbm9kZWNvbG9yCjkzIDQxNSBtb3ZldG8gKExfNDQ0OSBcKHhfNjY3
NFwpKSA5OCAxNC4wMCAwLjAwIGFsaWduZWR0ZXh0CjkzIDM5OSBtb3ZldG8gKExfNDQ0OCBcKGlt
cGxvZGVfMFwoeF82Njc0LHhfNjY3MFwpXCkpIDIxMiAxNC4wMCAwLjAwIGFsaWduZWR0ZXh0CmVu
ZCBncmVzdG9yZQplbmQgZ3Jlc3RvcmUKCiUJbjggLT4gbjcKZ3NhdmUgMTAgZGljdCBiZWdpbgpk
b3R0ZWQKbmV3cGF0aCAyMDIgMzg4IG1vdmV0bwoxOTkgMzc2IDE5NSAzNTkgMTkyIDM0NSBjdXJ2
ZXRvCnN0cm9rZQpuZXdwYXRoIDE5MCAzNDYgbW92ZXRvCjE5MCAzMzYgbGluZXRvCjE5NSAzNDUg
bGluZXRvCmNsb3NlcGF0aApmaWxsCmdzYXZlIDEwIGRpY3QgYmVnaW4KMTk4IDM2MyBtb3ZldG8g
KCkgMCAxNC4wMCAtMC41MCBhbGlnbmVkdGV4dAplbmQgZ3Jlc3RvcmUKZW5kIGdyZXN0b3JlCgol
CW45CmdzYXZlIDEwIGRpY3QgYmVnaW4KbmV3cGF0aCAzNjMgNTEyIG1vdmV0bwoyMDUgNTEyIGxp
bmV0bwoyMDUgNDc2IGxpbmV0bwozNjMgNDc2IGxpbmV0bwpjbG9zZXBhdGgKc3Ryb2tlCmdzYXZl
IDEwIGRpY3QgYmVnaW4KMC4wMDAgMC4wMDAgMC4wMDAgbm9kZWNvbG9yCjIwNSA1MDMgbW92ZXRv
IChMXzQ0NTAgXCh4XzY2NzVcKSkgOTggMTQuMDAgMC4wMCBhbGlnbmVkdGV4dAoyMDUgNDg3IG1v
dmV0byAoTF80NDQ5IFwocHJlZl8wXCh4XzY2NzVcKVwpKSAxNDMgMTQuMDAgMC4wMCBhbGlnbmVk
dGV4dAplbmQgZ3Jlc3RvcmUKZW5kIGdyZXN0b3JlCgolCW45IC0+IG44CmdzYXZlIDEwIGRpY3Qg
YmVnaW4KZG90dGVkCm5ld3BhdGggMjY4IDQ3NiBtb3ZldG8KMjU3IDQ2MyAyNDEgNDQ1IDIyOCA0
MzEgY3VydmV0bwpzdHJva2UKbmV3cGF0aCAyMjcgNDMzIG1vdmV0bwoyMjIgNDI0IGxpbmV0bwoy
MzAgNDMwIGxpbmV0bwpjbG9zZXBhdGgKZmlsbApnc2F2ZSAxMCBkaWN0IGJlZ2luCjI1MyA0NTEg
bW92ZXRvICgpIDAgMTQuMDAgLTAuNTAgYWxpZ25lZHRleHQKZW5kIGdyZXN0b3JlCmVuZCBncmVz
dG9yZQoKJQluMTAKZ3NhdmUgMTAgZGljdCBiZWdpbgpuZXdwYXRoIDUwMiA2MDYgbW92ZXRvCjI3
OCA2MDYgbGluZXRvCjI3OCA1NzAgbGluZXRvCjUwMiA1NzAgbGluZXRvCmNsb3NlcGF0aApzdHJv
a2UKZ3NhdmUgMTAgZGljdCBiZWdpbgowLjAwMCAwLjAwMCAwLjAwMCBub2RlY29sb3IKMjc4IDU5
NyBtb3ZldG8gKExfNDQ1MSBcKHhfNjY3Mix4XzY2NzBcKSkgMTQzIDE0LjAwIDAuMDAgYWxpZ25l
ZHRleHQKMjc4IDU4MSBtb3ZldG8gKExfNDQ1MCBcKGV4cGxvZGVfMFwoeF82NjY0LHhfNjY3Mlwp
XCkpIDIxMSAxNC4wMCAwLjAwIGFsaWduZWR0ZXh0CmVuZCBncmVzdG9yZQplbmQgZ3Jlc3RvcmUK
CiUJbjEwIC0+IG45CmdzYXZlIDEwIGRpY3QgYmVnaW4KZG90dGVkCm5ld3BhdGggMzcwIDU3MCBt
b3ZldG8KMzUzIDU1NiAzMjkgNTM1IDMxMSA1MTggY3VydmV0bwpzdHJva2UKbmV3cGF0aCAzMTAg
NTIwIG1vdmV0bwozMDQgNTEyIGxpbmV0bwozMTMgNTE3IGxpbmV0bwpjbG9zZXBhdGgKZmlsbApn
c2F2ZSAxMCBkaWN0IGJlZ2luCjM0MyA1MzkgbW92ZXRvICgpIDAgMTQuMDAgLTAuNTAgYWxpZ25l
ZHRleHQKZW5kIGdyZXN0b3JlCmVuZCBncmVzdG9yZQoKJQluMTEKZ3NhdmUgMTAgZGljdCBiZWdp
bgpuZXdwYXRoIDI2MCA2MTIgbW92ZXRvCjkwIDYxMiBsaW5ldG8KOTAgNTY0IGxpbmV0bwoyNjAg
NTY0IGxpbmV0bwpjbG9zZXBhdGgKc3Ryb2tlCmdzYXZlIDEwIGRpY3QgYmVnaW4KMC4wMDAgMC4w
MDAgMC4wMDAgbm9kZWNvbG9yCjkwIDYwNSBtb3ZldG8gKExfNDQ1MiBcKFwpKSA1NiAxNC4wMCAw
LjAwIGFsaWduZWR0ZXh0CjkwIDU4OSBtb3ZldG8gKHhfNjY3NiA9IHhfNjY3MyA9IHhfNjY2NCkg
MTU1IDE0LjAwIDAuMDAgYWxpZ25lZHRleHQKOTAgNTczIG1vdmV0byAoTF80NDQ0IFwoeF82Njc2
XCkpIDk4IDE0LjAwIDAuMDAgYWxpZ25lZHRleHQKZW5kIGdyZXN0b3JlCmVuZCBncmVzdG9yZQoK
JQluMTEgLT4gbjQKZ3NhdmUgMTAgZGljdCBiZWdpbgpzb2xpZApuZXdwYXRoIDE2MCA5NjIgbW92
ZXRvCjE2MyA5NTggMTY2IDk1MyAxNjcgOTUwIGN1cnZldG8KMTc0IDkzMSAxNzcgOTExIDE3NyA4
OTIgY3VydmV0bwoxNzcgODkyIDE3NyA4OTIgMTc3IDY4MiBjdXJ2ZXRvCjE3NyA2NjMgMTc2IDYz
MyAxNzYgNjEyIGN1cnZldG8Kc3Ryb2tlCm5ld3BhdGggMTY0IDk2MSBtb3ZldG8KMTU2IDk2OCBs
aW5ldG8KMTU5IDk1OCBsaW5ldG8KY2xvc2VwYXRoCmZpbGwKZ3NhdmUgMTAgZGljdCBiZWdpbgox
NzcgNzg1IG1vdmV0byAoKSAwIDE0LjAwIC0wLjUwIGFsaWduZWR0ZXh0CmVuZCBncmVzdG9yZQpl
bmQgZ3Jlc3RvcmUKCiUJbjEzIC0+IG4xMApnc2F2ZSAxMCBkaWN0IGJlZ2luCnNvbGlkCm5ld3Bh
dGggMzg5IDY2NCBtb3ZldG8KMzg5IDY1MSAzODkgNjMxIDM5MCA2MTUgY3VydmV0bwpzdHJva2UK
bmV3cGF0aCAzODggNjE2IG1vdmV0bwozOTAgNjA2IGxpbmV0bwozOTMgNjE2IGxpbmV0bwpjbG9z
ZXBhdGgKZmlsbApnc2F2ZSAxMCBkaWN0IGJlZ2luCjQxOCA2MzkgbW92ZXRvIChFbnZfMTUpIDQz
IDE0LjAwIC0wLjUwIGFsaWduZWR0ZXh0CmVuZCBncmVzdG9yZQplbmQgZ3Jlc3RvcmUKCiUJbjEz
IC0+IG4xMQpnc2F2ZSAxMCBkaWN0IGJlZ2luCnNvbGlkCm5ld3BhdGggMzQ4IDY2NCBtb3ZldG8K
MzE2IDY1MCAyNzMgNjMxIDIzOCA2MTUgY3VydmV0bwpzdHJva2UKbmV3cGF0aCAyMzggNjE4IG1v
dmV0bwoyMzAgNjEyIGxpbmV0bwoyNDAgNjEzIGxpbmV0bwpjbG9zZXBhdGgKZmlsbApnc2F2ZSAx
MCBkaWN0IGJlZ2luCjMzMyA2MzkgbW92ZXRvIChFbnZfMikgMzYgMTQuMDAgLTAuNTAgYWxpZ25l
ZHRleHQKZW5kIGdyZXN0b3JlCmVuZCBncmVzdG9yZQoKJQluMTQKZ3NhdmUgMTAgZGljdCBiZWdp
bgpuZXdwYXRoIDU1NyA5MTAgbW92ZXRvCjM5MSA5MTAgbGluZXRvCjM5MSA4NzQgbGluZXRvCjU1
NyA4NzQgbGluZXRvCmNsb3NlcGF0aApzdHJva2UKZ3NhdmUgMTAgZGljdCBiZWdpbgowLjAwMCAw
LjAwMCAwLjAwMCBub2RlY29sb3IKMzkxIDkwMSBtb3ZldG8gKExfNDQ0MCBcKFwpKSA1NiAxNC4w
MCAwLjAwIGFsaWduZWR0ZXh0CjM5MSA4ODUgbW92ZXRvIChsb29wXzM4NSBcKHhfNjY1OSx4XzY2
NjBcKSkgMTUzIDE0LjAwIDAuMDAgYWxpZ25lZHRleHQKZW5kIGdyZXN0b3JlCmVuZCBncmVzdG9y
ZQoKJQluMTQgLT4gbjIKZ3NhdmUgMTAgZGljdCBiZWdpbgpzb2xpZApuZXdwYXRoIDQ0NyA4NzQg
bW92ZXRvCjQyNSA4NjAgMzk2IDg0MCAzNjkgODIyIGN1cnZldG8Kc3Ryb2tlCm5ld3BhdGggMzY3
IDgyNCBtb3ZldG8KMzYwIDgxNiBsaW5ldG8KMzcwIDgxOSBsaW5ldG8KY2xvc2VwYXRoCmZpbGwK
Z3NhdmUgMTAgZGljdCBiZWdpbgo0MTEgODQzIG1vdmV0byAoKSAwIDE0LjAwIC0wLjUwIGFsaWdu
ZWR0ZXh0CmVuZCBncmVzdG9yZQplbmQgZ3Jlc3RvcmUKZW5kcGFnZQpncmVzdG9yZQolJVBhZ2VU
cmFpbGVyCiUlRW5kUGFnZTogMQolJVRyYWlsZXIKJSVQYWdlczogMQplbmQKcmVzdG9yZQolJUVP
Rgo=

--Oy9lEvw/Hr--