[PATCH 5/5] eval: Overhaul implementation for speed and correctness

Eric Blake via M4-patches <[email protected]> Wed, 2 Apr 2025 17:28:40 -0500
Newsgroups gmane.comp.gnu.m4.patches
Message-ID <[email protected]>
V2hpbGUgYSByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIgaXMgZWFzeSB0byB3cml0ZSwgaXQgaW52
b2x2ZXMgYSBMT1QKb2YgZnVuY3Rpb24gY2FsbHMgYW5kIGJvaWxlcnBsYXRlLiAgTWVyZWx5IHBh
cnNpbmcgImV2YWwoMSkiIHJlcXVpcmVzCmRlc2NlbmRpbmcgdGhyb3VnaCBBTEwgMTEgbGV2ZWxz
IG9mIG9wZXJhdG9yIHByZWNlZGVuY2UsIG9ubHkgZm9yIGVhY2gKbGF5ZXIgdG8gZGlzY292ZXIg
dGhlcmUgaXMgbm8gb3BlcmF0b3IuICBCZXR0ZXIgaXMgdGhlIFByYXR0IHN0eWxlIG9mCkxSKDEp
IHBhcnNpbmcgWzFdLCB3aGljaCBjYW4gaGFuZGxlIGFueSBncmFtbWFyIHdoZXJlIG5vIHR3bwpj
b25zZWN1dGl2ZSBub24tdGVybWluYWxzIG9yIGVwc2lsb24gYXBwZWFyIGluIHRoZSByaWdodCBz
aWRlIG9mIGFueQpydWxlIFsyXS4gIE5vdywgcGFyc2luZyBpcyBkb25lIHdpdGgganVzdCB0d28g
bXV0dWFsbHkgcmVjdXJzaXZlCmZ1bmN0aW9uczsgImV2YWwoMSkiIHdvcmtzIHdpdGgganVzdCB0
d28gZnVuY3Rpb24gY2FsbHMgKHByaW1hcnkoKQpkZXRlcm1pbmVzIHRoZSB2YWx1ZSwgYW5kIHBh
cnNlX2V4cHIoKSBkZXRlcm1pbmVzIG5vIG9wZXJhdG9ycyBhcmUKcHJlc2VudCksIHdoaWxlIG1v
cmUgY29tcGxpY2F0ZWQgZXhwcmVzc2lvbnMgc3RpbGwgcHJvZHVjZSB0aGUgY29ycmVjdApyZXN1
bHRzIGJ1dCB3aXRoIGxlc3MgcmVjdXJzaW9uLgoKV2hpbGUgYXQgaXQsIEkgbm90aWNlZCB0aGF0
ICJldmFsKDF8fCgxLzApKSIgdXNlZCB0byBwcm9kdWNlIGEgY3J5cHRpYwptZXNzYWdlOgoKbTQ6
c3RkaW46MTogYmFkIGV4cHJlc3Npb24gaW4gZXZhbCAoZXhjZXNzIGlucHV0KTogMXx8KDEvMCkK
CmRlc3BpdGUgdGhlIHNpbWlsYXIgImV2YWwoMXx8MS8wKSIgc3VwcHJlc3NpbmcgdGhhdCBhcyBw
YXJ0IG9mCnNob3J0LWNpcmN1aXRpbmcuICBJdCB0dXJucyBvdXQgdGhhdCBteSBpbml0aWFsIGlt
cGxlbWVudGF0aW9uIG9mCnNob3J0LWNpcmN1aXRpbmcgaW4gMS40LjhiIChiYWNrIGluIDIwMDch
KSB3YXMgbmV2ZXIgZnVsbHkgdGVzdGVkIG9uCm1vcmUgY29tcGxleCBzaXR1YXRpb25zLgoKVG8g
dGVzdCB0aGF0IHRoZSBuZXcgaW1wbGVtZW50YXRpb24gaXMgaW5kZWVkIGZhc3RlciwgSSB3cm90
ZSBhbiBtNApzb2x1dGlvbiBbM10gdG8gYW4gQWR2ZW50IG9mIENvZGUgY2hhbGxlbmdlIFs0XSB0
aGF0IHJlcXVpcmVkCmNvbXB1dGluZyAyMDAwIGl0ZXJhdGlvbnMgb2YgYSAyNC1iaXQgbGluZWFy
IGZlZWRiYWNrIHNoaWZ0IHJlZ2lzdGVyCm92ZXIgMjAwMCBpbnB1dCB2YWx1ZXMgKC0tdHJhY2Ug
c2hvd3MgbmVhcmx5IDIwIG1pbGxpb24gZXZhbCBjYWxscykuCk9uIG15IG1hY2hpbmUsIHJ1bnRp
bWUgd2l0aCBhbiB1bm9wdGltaXplZCBwcmUtcGF0Y2ggbTQgd2FzIGF0IDc4CnNlY29uZHMsIHBv
c3QtcGF0Y2ggaXQgY29tcGxldGVzIGluIDY2IHNlY29uZHMuCgpbMV0gaHR0cHM6Ly9qb3VybmFs
LnN0dWZmd2l0aHN0dWZmLmNvbS8yMDExLzAzLzE5L3ByYXR0LXBhcnNlcnMtZXhwcmVzc2lvbi1w
YXJzaW5nLW1hZGUtZWFzeS8KWzJdIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09wZXJh
dG9yLXByZWNlZGVuY2VfcGFyc2VyClszXSBodHRwczovL3JlcG8ub3IuY3ovYW9jX2VibGFrZS5n
aXQvYmxvYi8xYjEyMjc5MWQ0Oi8yMDI0L2RheTIyLm00Cls0XSBodHRwczovL2FkdmVudG9mY29k
ZS5jb20vMjAyNC9kYXkvMjIKLS0tCiBORVdTICAgICAgICB8ICAgOCArCiBkb2MvbTQudGV4aSB8
ICAgOCArLQogc3JjL2V2YWwuYyAgfCA3NzEgKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogMyBmaWxlcyBjaGFuZ2VkLCAyNzIgaW5zZXJ0aW9ucygr
KSwgNTE1IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL05FV1MgYi9ORVdTCmluZGV4IGIzYWE0
NDFjLi4yYmFjOGFkNSAxMDA2NDQKLS0tIGEvTkVXUworKysgYi9ORVdTCkBAIC0yLDYgKzIsMTAg
QEAgR05VIE00IE5FV1MgLSBVc2VyIHZpc2libGUgY2hhbmdlcy4KCiAqIE5vdGV3b3J0aHkgY2hh
bmdlcyBpbiByZWxlYXNlID8uPyAoPz8/Py0/Py0/PykgWz9dCgorKiogRml4IGEgYnVnIGluIHRo
ZSBgZXZhbCcgYnVpbHRpbiB3aGVyZSBpdCBkb2VzIG5vdCBzdXBwcmVzcyB3YXJuaW5ncworICAg
YWJvdXQgZGl2aXNpb24gYnkgemVybyBpZiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHx8IG9yICYm
IGlzIGVuY2xvc2VkCisgICBpbiAoKSAocHJlc2VudCBzaW5jZSBzaG9ydC1jaXJjdWl0aW5nIHdh
cyBpbnRyb2R1Y2VkIGluIDEuNC44YikuCisKICoqIFRoZSBgc3lzY21kJyBhbmQgYGVzeXNjbWQn
IGJ1aWx0aW5zIG5vIGxvbmdlciBtaXNoYW5kbGUgYSBjb21tYW5kIGxpbmUKICAgIHN0YXJ0aW5n
IHdpdGggYC0nIG9yIGArJy4KCkBAIC0xNiwxMiArMjAsMTYgQEAgR05VIE00IE5FV1MgLSBVc2Vy
IHZpc2libGUgY2hhbmdlcy4KICAgIGNoYW5nZSBiZWxvbmdzIGluIGEgbWFqb3IgdmVyc2lvbiBy
ZWxlYXNlIHN1Y2ggYXMgMS42LCBhbmQgbm90IGEgbWlub3IKICAgIHJlbGVhc2UuCgorKiogVXBk
YXRlIHRvIGNvbXBseSB3aXRoIG5ld2VyIEMgc3RhbmRhcmRzLgorCisKICogTm90ZXdvcnRoeSBj
aGFuZ2VzIGluIHJlbGVhc2UgMS40LjE5ICgyMDIxLTA1LTI4KSBbc3RhYmxlXQoKICoqIEEgbnVt
YmVyIG9mIHBvcnRhYmlsaXR5IGltcHJvdmVtZW50cyBpbmhlcml0ZWQgZnJvbSBnbnVsaWIsIGlu
Y2x1ZGluZwogICAgdGhlIGFiaWxpdHkgdG8gcGVyZm9ybSBzdGFjayBvdmVyZmxvdyBkZXRlY3Rp
b24gb24gbW9yZSBwbGF0Zm9ybXMKICAgIHdpdGhvdXQgbGlua2luZyB0byBHTlUgbGlic2lnc2Vn
di4KCisKICogTm90ZXdvcnRoeSBjaGFuZ2VzIGluIHJlbGVhc2UgMS40LjE4ZCAoMjAyMS0wNS0x
MSkgW2JldGFdCgogKiogQSBudW1iZXIgb2YgcG9ydGFiaWxpdHkgaW1wcm92ZW1lbnRzIGluaGVy
aXRlZCBmcm9tIGdudWxpYi4KZGlmZiAtLWdpdCBhL2RvYy9tNC50ZXhpIGIvZG9jL200LnRleGkK
aW5kZXggZjUwN2NjZDEuLjAzNmU0MTQxIDEwMDY0NAotLS0gYS9kb2MvbTQudGV4aQorKysgYi9k
b2MvbTQudGV4aQpAQCAtNjMyOCwxMCArNjMyOCwxMCBAQCBFdmFsCiBldmFsKGAwIHx8IDEgLyAw
JykKIEBlcnJvcnt9bTQ6c3RkaW46OTogZGl2aWRlIGJ5IHplcm8gaW4gZXZhbDogMCB8fCAxIC8g
MAogQHJlc3VsdHt9Ci1ldmFsKGAwICYmIDEgJSAwJykKK2V2YWwoYDAgJiYgKDEgJSAwKScpCiBA
cmVzdWx0e30wCi1ldmFsKGAyICYmIDEgJSAwJykKLUBlcnJvcnt9bTQ6c3RkaW46MTE6IG1vZHVs
byBieSB6ZXJvIGluIGV2YWw6IDIgJiYgMSAlIDAKK2V2YWwoYDIgJiYgKDEgJSAwKScpCitAZXJy
b3J7fW00OnN0ZGluOjExOiBtb2R1bG8gYnkgemVybyBpbiBldmFsOiAyICYmICgxICUgMCkKIEBy
ZXN1bHR7fQogQGVuZCBleGFtcGxlCgpAQCAtNjM5OSw3ICs2Mzk5LDcgQEAgRXZhbAogZGVmaW5l
KGBmb28nLCBgNjY2JykKIEByZXN1bHR7fQogZXZhbChgZm9vIC8gNicpCi1AZXJyb3J7fW00OnN0
ZGluOjExOiBiYWQgZXhwcmVzc2lvbiBpbiBldmFsOiBmb28gLyA2CitAZXJyb3J7fW00OnN0ZGlu
OjExOiBiYWQgZXhwcmVzc2lvbiBpbiBldmFsIChiYWQgaW5wdXQpOiBmb28gLyA2CiBAcmVzdWx0
e30KIGV2YWwoZm9vIC8gNikKIEByZXN1bHR7fTExMQpkaWZmIC0tZ2l0IGEvc3JjL2V2YWwuYyBi
L3NyYy9ldmFsLmMKaW5kZXggOTdlZWIzZWIuLjNjODMwYjFhIDEwMDY0NAotLS0gYS9zcmMvZXZh
bC5jCisrKyBiL3NyYy9ldmFsLmMKQEAgLTYyLDE5ICs2Miw0MSBAQCB0eXBlZGVmIGVudW0gZXZh
bF9lcnJvcgogICB9CiBldmFsX2Vycm9yOwoKLXN0YXRpYyBldmFsX2Vycm9yIGxvZ2ljYWxfb3Jf
dGVybSAoZXZhbF90b2tlbiwgaW50MzJfdCAqKTsKLXN0YXRpYyBldmFsX2Vycm9yIGxvZ2ljYWxf
YW5kX3Rlcm0gKGV2YWxfdG9rZW4sIGludDMyX3QgKik7Ci1zdGF0aWMgZXZhbF9lcnJvciBvcl90
ZXJtIChldmFsX3Rva2VuLCBpbnQzMl90ICopOwotc3RhdGljIGV2YWxfZXJyb3IgeG9yX3Rlcm0g
KGV2YWxfdG9rZW4sIGludDMyX3QgKik7Ci1zdGF0aWMgZXZhbF9lcnJvciBhbmRfdGVybSAoZXZh
bF90b2tlbiwgaW50MzJfdCAqKTsKLXN0YXRpYyBldmFsX2Vycm9yIGVxdWFsaXR5X3Rlcm0gKGV2
YWxfdG9rZW4sIGludDMyX3QgKik7Ci1zdGF0aWMgZXZhbF9lcnJvciBjbXBfdGVybSAoZXZhbF90
b2tlbiwgaW50MzJfdCAqKTsKLXN0YXRpYyBldmFsX2Vycm9yIHNoaWZ0X3Rlcm0gKGV2YWxfdG9r
ZW4sIGludDMyX3QgKik7Ci1zdGF0aWMgZXZhbF9lcnJvciBhZGRfdGVybSAoZXZhbF90b2tlbiwg
aW50MzJfdCAqKTsKLXN0YXRpYyBldmFsX2Vycm9yIG11bHRfdGVybSAoZXZhbF90b2tlbiwgaW50
MzJfdCAqKTsKLXN0YXRpYyBldmFsX2Vycm9yIGV4cF90ZXJtIChldmFsX3Rva2VuLCBpbnQzMl90
ICopOwotc3RhdGljIGV2YWxfZXJyb3IgdW5hcnlfdGVybSAoZXZhbF90b2tlbiwgaW50MzJfdCAq
KTsKLXN0YXRpYyBldmFsX2Vycm9yIHNpbXBsZV90ZXJtIChldmFsX3Rva2VuLCBpbnQzMl90ICop
OworLyogUHJlY2VkZW5jZSBvZiBlYWNoIG9wZXJhdG9yLCB6ZXJvIHRvIGVuZCBwYXJzZV9leHBy
KCkuICAqLworCitzdGF0aWMgaW50IHByZWNlZGVuY2VbXSA9IHsKKyAgMCwgLyogRVJST1IgKi8K
KyAgMCwgLyogQkFET1AgKi8KKyAgOSwgLyogUExVUyAtIGJpbmFyeSBoYXMgcHJlY2VkZW5jZSwg
dW5hcnkgY29uc3VtZWQgYnkgcHJpbWFyeSgpICovCisgIDksIC8qIE1JTlVTIC0gYmluYXJ5IGhh
cyBwcmVjZWRlbmNlLCB1bmFyeSBjb25zdW1lZCBieSBwcmltYXJ5KCkgKi8KKyAgMTEsIC8qIEVY
UE9ORU5UIC0gdGhlIG9ubHkgcmlnaHQtYXNzb2NpYXRpdmUgb3BlcmF0b3IgKi8KKyAgMTAsIC8q
IFRJTUVTICovCisgIDEwLCAvKiBESVZJREUgKi8KKyAgMTAsIC8qIE1PRFVMTyAqLworICA2LCAv
KiBBU1NJR04gLSBkZXByZWNhdGVkIHN5bm9ueW0gdG8gRVEgKi8KKyAgNiwgLyogRVEgKi8KKyAg
NiwgLyogTk9URVEgKi8KKyAgNywgLyogR1QgKi8KKyAgNywgLyogR1RFUSAqLworICA3LCAvKiBM
UyAqLworICA3LCAvKiBMU0VRICovCisgIDgsIC8qIExTSElGVCAqLworICA4LCAvKiBSU0hJRlQg
Ki8KKyAgMCwgLyogTE5PVCAtIHVuYXJ5LCBvbmx5IGNvbnN1bWVkIGJ5IHByaW1hcnkoKSAqLwor
ICAyLCAvKiBMQU5EICovCisgIDEsIC8qIExPUiAqLworICAwLCAvKiBOT1QgLSB1bmFyeSwgb25s
eSBjb25zdW1lZCBieSBwcmltYXJ5KCkgKi8KKyAgNSwgLyogQU5EICovCisgIDMsIC8qIE9SICov
CisgIDQsIC8qIFhPUiAqLworICAwLCAvKiBMRUZUUCAtIG9ubHkgY29uc3VtZWQgYnkgcHJpbWFy
eSgpICovCisgIDAsIC8qIFJJR0hUUCAtIG9ubHkgY29uc3VtZWQgYnkgcHJpbWFyeSgpICovCisg
IDAsIC8qIE5VTUJFUiAtIG9ubHkgY29uc3VtZWQgYnkgcHJpbWFyeSgpICovCisgIDAgLyogRU9U
RVhUICovCit9OworCitzdGF0aWMgZXZhbF9lcnJvciBwcmltYXJ5IChpbnQzMl90ICopOworc3Rh
dGljIGV2YWxfZXJyb3IgcGFyc2VfZXhwciAoaW50MzJfdCAqdjEsIGludCBtaW5fcHJlYyk7Cgog
LyotLS0tLS0tLS0tLS0tLS0tLS0tLS4KIHwgTGV4aWNhbCBmdW5jdGlvbnMuICB8CkBAIC04NCw3
ICsxMDYsNyBAQCBzdGF0aWMgZXZhbF9lcnJvciBzaW1wbGVfdGVybSAoZXZhbF90b2tlbiwgaW50
MzJfdCAqKTsKIHN0YXRpYyBjb25zdCBjaGFyICpldmFsX3RleHQ7CgogLyogVmFsdWUgb2YgZXZh
bF90ZXh0LCBmcm9tIGJlZm9yZSBsYXN0IGNhbGwgb2YgZXZhbF9sZXggKCkuICBUaGlzIGlzIHNv
IHdlCi0gICBjYW4gYmFjayB1cCwgaWYgd2UgaGF2ZSByZWFkIHRvbyBtdWNoLiAgKi8KKyAgIGNh
biBiYWNrIHVwLCBpZiB3ZSBoYXZlIHJlYWQgdG9vIG11Y2gsIGdvb2QgZm9yIG9uZSB0b2tlbiBs
b29rYWhlYWQuICAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmxhc3RfdGV4dDsKCiBzdGF0aWMgdm9p
ZApAQCAtMjg2LDYgKzMwOCwyMjcgQEAgZXZhbF9sZXggKGludDMyX3QgKnZhbCkKICAgICB9CiB9
CgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS4KK3wgT3BlcmF0b3IgcHJlY2VkZW5jZSBwYXJzZXIgKGJhc2VkIG9uIFByYXR0IHBhcnNlciku
ICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0qLworCisvKiBQYXJzZSBgKGV4cHIpJywgdW5hcnkgb3BlcmF0b3JzLCBhbmQgbnVtYmVycy4g
ICovCitzdGF0aWMgZXZhbF9lcnJvcgorcHJpbWFyeSAoaW50MzJfdCAqdjEpCit7CisgIGV2YWxf
ZXJyb3IgZXI7CisgIGV2YWxfZXJyb3IgZXIyOworICBpbnQzMl90IHYyOworCisgIHN3aXRjaCAo
ZXZhbF9sZXggKHYxKSkKKyAgICB7CisgICAgICAvKiBOdW1iZXIgKi8KKyAgICBjYXNlIE5VTUJF
UjoKKyAgICAgIHJldHVybiBOT19FUlJPUjsKKworICAgICAgLyogUGFyZW50aGVzaXMgKi8KKyAg
ICBjYXNlIExFRlRQOgorICAgICAgaWYgKChlciA9IHByaW1hcnkgKHYxKSkgPj0gU1lOVEFYX0VS
Uk9SKQorICAgICAgICByZXR1cm4gZXI7CisgICAgICBpZiAoKGVyMiA9IHBhcnNlX2V4cHIgKHYx
LCAxKSkgPj0gU1lOVEFYX0VSUk9SKQorICAgICAgICByZXR1cm4gZXIyOworICAgICAgaWYgKGVy
ID09IE5PX0VSUk9SICYmIGVyMikKKyAgICAgICAgZXIgPSBlcjI7CisgICAgICBzd2l0Y2ggKGV2
YWxfbGV4ICgmdjIpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgRVJST1I6CisgICAgICAgICAg
cmV0dXJuIFVOS05PV05fSU5QVVQ7CisgICAgICAgIGNhc2UgUklHSFRQOgorICAgICAgICAgIHJl
dHVybiBlcjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gTUlTU0lOR19SSUdI
VDsKKyAgICAgICAgfQorCisgICAgICAvKiBVbmFyeSBvcGVyYXRvcnMgKi8KKyAgICAgIC8qIE1p
bmltaXplIHVuZGVmaW5lZCBDIGJlaGF2aW9yIG9uIG92ZXJmbG93LiAgVGhpcyBjb2RlIGFzc3Vt
ZXMKKyAgICAgICAgIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uLWRlZmluZWQgb3ZlcmZsb3cgd2hl
biBjYXN0aW5nCisgICAgICAgICB1bnNpZ25lZCB0byBzaWduZWQgaXMgYSBzaWxlbnQgdHdvcy1j
b21wbGVtZW50CisgICAgICAgICB3cmFwLWFyb3VuZC4gICovCisgICAgY2FzZSBQTFVTOgorICAg
ICAgcmV0dXJuIHByaW1hcnkgKHYxKTsKKyAgICBjYXNlIE1JTlVTOgorICAgICAgZXIgPSBwcmlt
YXJ5ICh2MSk7CisgICAgICAqdjEgPSAoaW50MzJfdCkgLSh1aW50MzJfdCkgKnYxOworICAgICAg
cmV0dXJuIGVyOworICAgIGNhc2UgTk9UOgorICAgICAgZXIgPSBwcmltYXJ5ICh2MSk7CisgICAg
ICAqdjEgPSB+KnYxOworICAgICAgcmV0dXJuIGVyOworICAgIGNhc2UgTE5PVDoKKyAgICAgIGVy
ID0gcHJpbWFyeSAodjEpOworICAgICAgKnYxID0gKnYxID09IDAgPyAxIDogMDsKKyAgICAgIHJl
dHVybiBlcjsKKworICAgICAgLyogQW55dGhpbmcgZWxzZSAqLworICAgIGNhc2UgRVJST1I6Cisg
ICAgICByZXR1cm4gVU5LTk9XTl9JTlBVVDsKKyAgICBjYXNlIEJBRE9QOgorICAgICAgcmV0dXJu
IElOVkFMSURfT1BFUkFUT1I7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBTWU5UQVhfRVJS
T1I7CisgICAgfQorfQorCisvKiBQYXJzZSBiaW5hcnkgb3BlcmF0b3JzIHdpdGggYXQgbGVhc3Qg
TUlOX1BSRUMgcHJlY2VkZW5jZS4gICovCitzdGF0aWMgZXZhbF9lcnJvcgorcGFyc2VfZXhwciAo
aW50MzJfdCAqdjEsIGludCBtaW5fcHJlYykKK3sKKyAgZXZhbF90b2tlbiBldDsKKyAgZXZhbF90
b2tlbiBldDI7CisgIGV2YWxfZXJyb3IgZXIgPSBOT19FUlJPUjsKKyAgZXZhbF9lcnJvciBlcjI7
CisgIGludDMyX3QgdjI7CisgIGludDMyX3QgdjM7CisgIHVpbnQzMl90IHUxOworCisgIGV0ID0g
ZXZhbF9sZXggKCZ2Mik7CisgIHdoaWxlIChwcmVjZWRlbmNlW2V0XSA+PSBtaW5fcHJlYykKKyAg
ICB7CisgICAgICBpZiAoKGVyID0gcHJpbWFyeSAoJnYyKSkgPj0gU1lOVEFYX0VSUk9SKQorICAg
ICAgICByZXR1cm4gZXI7CisgICAgICBldDIgPSBldmFsX2xleCAoJnYzKTsKKyAgICAgIC8qIEhh
bmRsZSBiaW5hcnkgb3BlcmF0b3JzIG9mIGhpZ2hlciBwcmVjZWRlbmNlIG9yIHJpZ2h0LWFzc29j
aWF0aXZpdHkgKi8KKyAgICAgIHdoaWxlIChwcmVjZWRlbmNlW2V0Ml0gPiBwcmVjZWRlbmNlW2V0
XSB8fCBldDIgPT0gRVhQT05FTlQpCisgICAgICAgIHsKKyAgICAgICAgICBldmFsX3VuZG8gKCk7
CisgICAgICAgICAgaWYgKChlcjIgPSBwYXJzZV9leHByICgmdjIsIHByZWNlZGVuY2VbZXQyXSkp
ID49IFNZTlRBWF9FUlJPUikKKyAgICAgICAgICAgIHJldHVybiBlcjI7CisgICAgICAgICAgaWYg
KGVyID09IE5PX0VSUk9SICYmIGVyMikKKyAgICAgICAgICAgIGVyID0gZXIyOworICAgICAgICAg
IGV0MiA9IGV2YWxfbGV4ICgmdjMpOworICAgICAgICB9CisgICAgICAvKiBSZWR1Y2UgdGhlIHR3
byB2YWx1ZXMgYnkgdGhlIGdpdmVuIGJpbmFyeSBvcGVyYXRvciAqLworICAgICAgc3dpdGNoIChl
dCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEVYUE9ORU5UOgorICAgICAgICAgIC8qIE1pbmlt
aXplIHVuZGVmaW5lZCBDIGJlaGF2aW9yIG9uIG92ZXJmbG93LiAgVGhpcyBjb2RlIGFzc3VtZXMK
KyAgICAgICAgICAgICB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIG92ZXJmbG93IHdo
ZW4gY2FzdGluZworICAgICAgICAgICAgIHVuc2lnbmVkIHRvIHNpZ25lZCBpcyBhIHNpbGVudCB0
d29zLWNvbXBsZW1lbnQKKyAgICAgICAgICAgICB3cmFwLWFyb3VuZC4gICovCisgICAgICAgICAg
dTEgPSAxOworICAgICAgICAgIGlmICh2MiA8IDApCisgICAgICAgICAgICBlciA9IE5FR0FUSVZF
X0VYUE9ORU5UOworICAgICAgICAgIGVsc2UgaWYgKCp2MSA9PSAwICYmIHYyID09IDApCisgICAg
ICAgICAgICBlciA9IERJVklERV9aRVJPOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgd2hpbGUgKHYyLS0gPiAwKQorICAgICAgICAgICAgICAgIHUxICo9ICh1
aW50MzJfdCkgKnYxOworICAgICAgICAgICAgfQorICAgICAgICAgICp2MSA9IHUxOworICAgICAg
ICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVElNRVM6CisgICAgICAgICAgKnYxID0gKGludDMy
X3QpICgodWludDMyX3QpICp2MSAqICh1aW50MzJfdCkgdjIpOworICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlIERJVklERToKKyAgICAgICAgICBpZiAodjIgPT0gMCkKKyAgICAgICAgICAg
IGVyID0gRElWSURFX1pFUk87CisgICAgICAgICAgZWxzZSBpZiAodjIgPT0gLTEpCisgICAgICAg
ICAgICAvKiBBdm9pZCBvdmVyZmxvdywgYW5kIHRoZSB4ODYgU0lHRlBFIG9uIElOVF9NSU4gLyAt
MS4gICovCisgICAgICAgICAgICAqdjEgPSAoaW50MzJfdCkgLSh1aW50MzJfdCkgKnYxOworICAg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgICp2MSAvPSB2MjsKKyAgICAgICAgICBicmVhazsKKyAg
ICAgICAgY2FzZSBNT0RVTE86CisgICAgICAgICAgaWYgKHYyID09IDApCisgICAgICAgICAgICBl
ciA9IE1PRFVMT19aRVJPOworICAgICAgICAgIGVsc2UgaWYgKHYyID09IC0xKQorICAgICAgICAg
ICAgLyogQXZvaWQgdGhlIHg4NiBTSUdGUEUgb24gSU5UX01JTiAlIC0xLiAgKi8KKyAgICAgICAg
ICAgICp2MSA9IDA7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgKnYxICU9IHYyOworICAg
ICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICAqdjEgPSAoaW50
MzJfdCkgKCh1aW50MzJfdCkgKnYxICsgKHVpbnQzMl90KSB2Mik7CisgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgKnYxID0gKGludDMyX3QpICgodWludDMy
X3QpICp2MSAtICh1aW50MzJfdCkgdjIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNh
c2UgTFNISUZUOgorICAgICAgICAgIHUxID0gKnYxOworICAgICAgICAgIHUxIDw8PSAodWludDMy
X3QpICh2MiAmIDB4MWYpOworICAgICAgICAgICp2MSA9IHUxOworICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlIFJTSElGVDoKKyAgICAgICAgICB1MSA9ICp2MSA8IDAgPyB+KnYxIDogKnYx
OworICAgICAgICAgIHUxID4+PSAodWludDMyX3QpICh2MiAmIDB4MWYpOworICAgICAgICAgICp2
MSA9ICp2MSA8IDAgPyB+dTEgOiB1MTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNl
IEdUOgorICAgICAgICAgICp2MSA9ICp2MSA+IHYyOworICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIEdURVE6CisgICAgICAgICAgKnYxID0gKnYxID49IHYyOworICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIExTOgorICAgICAgICAgICp2MSA9ICp2MSA8IHYyOworICAgICAgICAg
IGJyZWFrOworICAgICAgICBjYXNlIExTRVE6CisgICAgICAgICAgKnYxID0gKnYxIDw9IHYyOwor
ICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVNTSUdOOgorICAgICAgICAgIE00RVJS
T1IgKCh3YXJuaW5nX3N0YXR1cywgMCwgXygiXAorV2FybmluZzogcmVjb21tZW5kID09LCBub3Qg
PSwgZm9yIGVxdWFsaXR5IG9wZXJhdG9yIikpKTsKKyAgICAgICAgICBGQUxMVEhST1VHSDsKKyAg
ICAgICAgY2FzZSBFUToKKyAgICAgICAgICAqdjEgPSAqdjEgPT0gdjI7CisgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgTk9URVE6CisgICAgICAgICAgKnYxID0gKnYxICE9IHYyOworICAg
ICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQU5EOgorICAgICAgICAgICp2MSAmPSB2MjsK
KyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFhPUjoKKyAgICAgICAgICAqdjEgXj0g
djI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBPUjoKKyAgICAgICAgICAqdjEg
fD0gdjI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAvKiBJbXBsZW1lbnQgc2hvcnQt
Y2lyY3VpdGluZyBvZiB2YWxpZCBzeW50YXguICAqLworICAgICAgICBjYXNlIExBTkQ6CisgICAg
ICAgICAgaWYgKGVyID09IE5PX0VSUk9SKQorICAgICAgICAgICAgKnYxID0gKnYxICYmIHYyOwor
ICAgICAgICAgIGVsc2UgaWYgKCp2MSA9PSAwKQorICAgICAgICAgICAgZXIgPSBOT19FUlJPUjsK
KyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExPUjoKKyAgICAgICAgICBpZiAoZXIg
PT0gTk9fRVJST1IpCisgICAgICAgICAgICAqdjEgPSAqdjEgfHwgdjI7CisgICAgICAgICAgZWxz
ZSBpZiAoKnYxICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICp2MSA9IDE7Cisg
ICAgICAgICAgICAgIGVyID0gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgYnJl
YWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBNNEVSUk9SICgod2FybmluZ19zdGF0
dXMsIDAsCisgICAgICAgICAgICAgICAgICAgICJJTlRFUk5BTCBFUlJPUjogdW5leHBlY3RlZCBv
cGVyYXRvciBpbiBldmFsdWF0ZSAoKSIpKTsKKyAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAg
fQorICAgICAgZXQgPSBldDI7CisgICAgfQorCisgIGV2YWxfdW5kbyAoKTsKKyAgcmV0dXJuIGVy
OworfQorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KIHwgTWFp
biBlbnRyeSBwb2ludCwgY2FsbGVkIGZyb20gImV2YWwiLiAgfAogYC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yOTMsMTIgKzUzNiwxMiBAQCBldmFsX2xleCAo
aW50MzJfdCAqdmFsKQogYm9vbAogZXZhbHVhdGUgKGNvbnN0IGNoYXIgKmV4cHIsIGludDMyX3Qg
KnZhbCkKIHsKLSAgZXZhbF90b2tlbiBldDsKICAgZXZhbF9lcnJvciBlcnI7CgogICBldmFsX2lu
aXRfbGV4IChleHByKTsKLSAgZXQgPSBldmFsX2xleCAodmFsKTsKLSAgZXJyID0gbG9naWNhbF9v
cl90ZXJtIChldCwgdmFsKTsKKyAgZXJyID0gcHJpbWFyeSAodmFsKTsKKyAgaWYgKGVyciA9PSBO
T19FUlJPUikKKyAgICBlcnIgPSBwYXJzZV9leHByICh2YWwsIDEpOwoKICAgaWYgKGVyciA9PSBO
T19FUlJPUiAmJiAqZXZhbF90ZXh0ICE9ICdcMCcpCiAgICAgewpAQCAtMzYzLDQ5NyArNjA2LDMg
QEAgZXZhbHVhdGUgKGNvbnN0IGNoYXIgKmV4cHIsIGludDMyX3QgKnZhbCkKCiAgIHJldHVybiBl
cnIgIT0gTk9fRVJST1I7CiB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotfCBS
ZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIuICB8Ci1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ki8KLQotc3RhdGljIGV2YWxfZXJyb3IKLWxvZ2ljYWxfb3JfdGVybSAoZXZhbF90b2tlbiBldCwg
aW50MzJfdCAqdjEpCi17Ci0gIGludDMyX3QgdjI7Ci0gIGV2YWxfZXJyb3IgZXI7Ci0KLSAgaWYg
KChlciA9IGxvZ2ljYWxfYW5kX3Rlcm0gKGV0LCB2MSkpICE9IE5PX0VSUk9SKQotICAgIHJldHVy
biBlcjsKLQotICB3aGlsZSAoKGV0ID0gZXZhbF9sZXggKCZ2MikpID09IExPUikKLSAgICB7Ci0g
ICAgICBldCA9IGV2YWxfbGV4ICgmdjIpOwotICAgICAgaWYgKGV0ID09IEVSUk9SKQotICAgICAg
ICByZXR1cm4gVU5LTk9XTl9JTlBVVDsKLQotICAgICAgLyogSW1wbGVtZW50IHNob3J0LWNpcmN1
aXRpbmcgb2YgdmFsaWQgc3ludGF4LiAgKi8KLSAgICAgIGVyID0gbG9naWNhbF9hbmRfdGVybSAo
ZXQsICZ2Mik7Ci0gICAgICBpZiAoZXIgPT0gTk9fRVJST1IpCi0gICAgICAgICp2MSA9ICp2MSB8
fCB2MjsKLSAgICAgIGVsc2UgaWYgKCp2MSAhPSAwICYmIGVyIDwgU1lOVEFYX0VSUk9SKQotICAg
ICAgICAqdjEgPSAxOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gZXI7Ci0gICAgfQotICBp
ZiAoZXQgPT0gRVJST1IpCi0gICAgcmV0dXJuIFVOS05PV05fSU5QVVQ7Ci0KLSAgZXZhbF91bmRv
ICgpOwotICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXRpYyBldmFsX2Vycm9yCi1sb2dpY2Fs
X2FuZF90ZXJtIChldmFsX3Rva2VuIGV0LCBpbnQzMl90ICp2MSkKLXsKLSAgaW50MzJfdCB2MjsK
LSAgZXZhbF9lcnJvciBlcjsKLQotICBpZiAoKGVyID0gb3JfdGVybSAoZXQsIHYxKSkgIT0gTk9f
RVJST1IpCi0gICAgcmV0dXJuIGVyOwotCi0gIHdoaWxlICgoZXQgPSBldmFsX2xleCAoJnYyKSkg
PT0gTEFORCkKLSAgICB7Ci0gICAgICBldCA9IGV2YWxfbGV4ICgmdjIpOwotICAgICAgaWYgKGV0
ID09IEVSUk9SKQotICAgICAgICByZXR1cm4gVU5LTk9XTl9JTlBVVDsKLQotICAgICAgLyogSW1w
bGVtZW50IHNob3J0LWNpcmN1aXRpbmcgb2YgdmFsaWQgc3ludGF4LiAgKi8KLSAgICAgIGVyID0g
b3JfdGVybSAoZXQsICZ2Mik7Ci0gICAgICBpZiAoZXIgPT0gTk9fRVJST1IpCi0gICAgICAgICp2
MSA9ICp2MSAmJiB2MjsKLSAgICAgIGVsc2UgaWYgKCp2MSA9PSAwICYmIGVyIDwgU1lOVEFYX0VS
Uk9SKQotICAgICAgICA7IC8qIHYxIGlzIGFscmVhZHkgMCAqLwotICAgICAgZWxzZQotICAgICAg
ICByZXR1cm4gZXI7Ci0gICAgfQotICBpZiAoZXQgPT0gRVJST1IpCi0gICAgcmV0dXJuIFVOS05P
V05fSU5QVVQ7Ci0KLSAgZXZhbF91bmRvICgpOwotICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0
YXRpYyBldmFsX2Vycm9yCi1vcl90ZXJtIChldmFsX3Rva2VuIGV0LCBpbnQzMl90ICp2MSkKLXsK
LSAgaW50MzJfdCB2MjsKLSAgZXZhbF9lcnJvciBlcjsKLQotICBpZiAoKGVyID0geG9yX3Rlcm0g
KGV0LCB2MSkpICE9IE5PX0VSUk9SKQotICAgIHJldHVybiBlcjsKLQotICB3aGlsZSAoKGV0ID0g
ZXZhbF9sZXggKCZ2MikpID09IE9SKQotICAgIHsKLSAgICAgIGV0ID0gZXZhbF9sZXggKCZ2Mik7
Ci0gICAgICBpZiAoZXQgPT0gRVJST1IpCi0gICAgICAgIHJldHVybiBVTktOT1dOX0lOUFVUOwot
Ci0gICAgICBpZiAoKGVyID0geG9yX3Rlcm0gKGV0LCAmdjIpKSAhPSBOT19FUlJPUikKLSAgICAg
ICAgcmV0dXJuIGVyOwotCi0gICAgICAqdjEgfD0gdjI7Ci0gICAgfQotICBpZiAoZXQgPT0gRVJS
T1IpCi0gICAgcmV0dXJuIFVOS05PV05fSU5QVVQ7Ci0KLSAgZXZhbF91bmRvICgpOwotICByZXR1
cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXRpYyBldmFsX2Vycm9yCi14b3JfdGVybSAoZXZhbF90b2tl
biBldCwgaW50MzJfdCAqdjEpCi17Ci0gIGludDMyX3QgdjI7Ci0gIGV2YWxfZXJyb3IgZXI7Ci0K
LSAgaWYgKChlciA9IGFuZF90ZXJtIChldCwgdjEpKSAhPSBOT19FUlJPUikKLSAgICByZXR1cm4g
ZXI7Ci0KLSAgd2hpbGUgKChldCA9IGV2YWxfbGV4ICgmdjIpKSA9PSBYT1IpCi0gICAgewotICAg
ICAgZXQgPSBldmFsX2xleCAoJnYyKTsKLSAgICAgIGlmIChldCA9PSBFUlJPUikKLSAgICAgICAg
cmV0dXJuIFVOS05PV05fSU5QVVQ7Ci0KLSAgICAgIGlmICgoZXIgPSBhbmRfdGVybSAoZXQsICZ2
MikpICE9IE5PX0VSUk9SKQotICAgICAgICByZXR1cm4gZXI7Ci0KLSAgICAgICp2MSBePSB2MjsK
LSAgICB9Ci0gIGlmIChldCA9PSBFUlJPUikKLSAgICByZXR1cm4gVU5LTk9XTl9JTlBVVDsKLQot
ICBldmFsX3VuZG8gKCk7Ci0gIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdGljIGV2YWxfZXJy
b3IKLWFuZF90ZXJtIChldmFsX3Rva2VuIGV0LCBpbnQzMl90ICp2MSkKLXsKLSAgaW50MzJfdCB2
MjsKLSAgZXZhbF9lcnJvciBlcjsKLQotICBpZiAoKGVyID0gZXF1YWxpdHlfdGVybSAoZXQsIHYx
KSkgIT0gTk9fRVJST1IpCi0gICAgcmV0dXJuIGVyOwotCi0gIHdoaWxlICgoZXQgPSBldmFsX2xl
eCAoJnYyKSkgPT0gQU5EKQotICAgIHsKLSAgICAgIGV0ID0gZXZhbF9sZXggKCZ2Mik7Ci0gICAg
ICBpZiAoZXQgPT0gRVJST1IpCi0gICAgICAgIHJldHVybiBVTktOT1dOX0lOUFVUOwotCi0gICAg
ICBpZiAoKGVyID0gZXF1YWxpdHlfdGVybSAoZXQsICZ2MikpICE9IE5PX0VSUk9SKQotICAgICAg
ICByZXR1cm4gZXI7Ci0KLSAgICAgICp2MSAmPSB2MjsKLSAgICB9Ci0gIGlmIChldCA9PSBFUlJP
UikKLSAgICByZXR1cm4gVU5LTk9XTl9JTlBVVDsKLQotICBldmFsX3VuZG8gKCk7Ci0gIHJldHVy
biBOT19FUlJPUjsKLX0KLQotc3RhdGljIGV2YWxfZXJyb3IKLWVxdWFsaXR5X3Rlcm0gKGV2YWxf
dG9rZW4gZXQsIGludDMyX3QgKnYxKQotewotICBldmFsX3Rva2VuIG9wOwotICBpbnQzMl90IHYy
OwotICBldmFsX2Vycm9yIGVyOwotCi0gIGlmICgoZXIgPSBjbXBfdGVybSAoZXQsIHYxKSkgIT0g
Tk9fRVJST1IpCi0gICAgcmV0dXJuIGVyOwotCi0gIC8qIEluIHRoZSAxLjQueCBzZXJpZXMsIHdl
IG1haW50YWluIHRoZSB0cmFkaXRpb25hbCBiZWhhdmlvciB0aGF0Ci0gICAgICc9JyBpcyBhIHN5
bm9ueW0gZm9yICc9PSc7IGhvd2V2ZXIsIHRoaXMgaXMgY29udHJhcnkgdG8gUE9TSVggYW5kCi0g
ICAgIHdlIGhvcGUgdG8gY29udmVydCAnPScgdG8gbWVhbiBhc3NpZ25tZW50IGluIDIuMC4gICov
Ci0gIHdoaWxlICgob3AgPSBldmFsX2xleCAoJnYyKSkgPT0gRVEgfHwgb3AgPT0gTk9URVEgfHwg
b3AgPT0gQVNTSUdOKQotICAgIHsKLSAgICAgIGV0ID0gZXZhbF9sZXggKCZ2Mik7Ci0gICAgICBp
ZiAoZXQgPT0gRVJST1IpCi0gICAgICAgIHJldHVybiBVTktOT1dOX0lOUFVUOwotCi0gICAgICBp
ZiAoKGVyID0gY21wX3Rlcm0gKGV0LCAmdjIpKSAhPSBOT19FUlJPUikKLSAgICAgICAgcmV0dXJu
IGVyOwotCi0gICAgICBpZiAob3AgPT0gQVNTSUdOKQotICAgICAgewotICAgICAgICBNNEVSUk9S
ICgod2FybmluZ19zdGF0dXMsIDAsIF8oIlwKLVdhcm5pbmc6IHJlY29tbWVuZCA9PSwgbm90ID0s
IGZvciBlcXVhbGl0eSBvcGVyYXRvciIpKSk7Ci0gICAgICAgIG9wID0gRVE7Ci0gICAgICB9Ci0g
ICAgICAqdjEgPSAob3AgPT0gRVEpID09ICgqdjEgPT0gdjIpOwotICAgIH0KLSAgaWYgKG9wID09
IEVSUk9SKQotICAgIHJldHVybiBVTktOT1dOX0lOUFVUOwotCi0gIGV2YWxfdW5kbyAoKTsKLSAg
cmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0aWMgZXZhbF9lcnJvcgotY21wX3Rlcm0gKGV2YWxf
dG9rZW4gZXQsIGludDMyX3QgKnYxKQotewotICBldmFsX3Rva2VuIG9wOwotICBpbnQzMl90IHYy
OwotICBldmFsX2Vycm9yIGVyOwotCi0gIGlmICgoZXIgPSBzaGlmdF90ZXJtIChldCwgdjEpKSAh
PSBOT19FUlJPUikKLSAgICByZXR1cm4gZXI7Ci0KLSAgd2hpbGUgKChvcCA9IGV2YWxfbGV4ICgm
djIpKSA9PSBHVCB8fCBvcCA9PSBHVEVRCi0gICAgICAgICB8fCBvcCA9PSBMUyB8fCBvcCA9PSBM
U0VRKQotICAgIHsKLQotICAgICAgZXQgPSBldmFsX2xleCAoJnYyKTsKLSAgICAgIGlmIChldCA9
PSBFUlJPUikKLSAgICAgICAgcmV0dXJuIFVOS05PV05fSU5QVVQ7Ci0KLSAgICAgIGlmICgoZXIg
PSBzaGlmdF90ZXJtIChldCwgJnYyKSkgIT0gTk9fRVJST1IpCi0gICAgICAgIHJldHVybiBlcjsK
LQotICAgICAgc3dpdGNoIChvcCkKLSAgICAgICAgewotICAgICAgICBjYXNlIEdUOgotICAgICAg
ICAgICp2MSA9ICp2MSA+IHYyOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgR1RF
UToKLSAgICAgICAgICAqdjEgPSAqdjEgPj0gdjI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAg
ICAgY2FzZSBMUzoKLSAgICAgICAgICAqdjEgPSAqdjEgPCB2MjsKLSAgICAgICAgICBicmVhazsK
LQotICAgICAgICBjYXNlIExTRVE6Ci0gICAgICAgICAgKnYxID0gKnYxIDw9IHYyOwotICAgICAg
ICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgTTRFUlJPUiAoKHdhcm5p
bmdfc3RhdHVzLCAwLAotICAgICAgICAgICAgICAgICAgICAiSU5URVJOQUwgRVJST1I6IGJhZCBj
b21wYXJpc29uIG9wZXJhdG9yIGluIGNtcF90ZXJtICgpIikpOwotICAgICAgICAgIGFib3J0ICgp
OwotICAgICAgICB9Ci0gICAgfQotICBpZiAob3AgPT0gRVJST1IpCi0gICAgcmV0dXJuIFVOS05P
V05fSU5QVVQ7Ci0KLSAgZXZhbF91bmRvICgpOwotICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0
YXRpYyBldmFsX2Vycm9yCi1zaGlmdF90ZXJtIChldmFsX3Rva2VuIGV0LCBpbnQzMl90ICp2MSkK
LXsKLSAgZXZhbF90b2tlbiBvcDsKLSAgaW50MzJfdCB2MjsKLSAgdWludDMyX3QgdTE7Ci0gIGV2
YWxfZXJyb3IgZXI7Ci0KLSAgaWYgKChlciA9IGFkZF90ZXJtIChldCwgdjEpKSAhPSBOT19FUlJP
UikKLSAgICByZXR1cm4gZXI7Ci0KLSAgd2hpbGUgKChvcCA9IGV2YWxfbGV4ICgmdjIpKSA9PSBM
U0hJRlQgfHwgb3AgPT0gUlNISUZUKQotICAgIHsKLQotICAgICAgZXQgPSBldmFsX2xleCAoJnYy
KTsKLSAgICAgIGlmIChldCA9PSBFUlJPUikKLSAgICAgICAgcmV0dXJuIFVOS05PV05fSU5QVVQ7
Ci0KLSAgICAgIGlmICgoZXIgPSBhZGRfdGVybSAoZXQsICZ2MikpICE9IE5PX0VSUk9SKQotICAg
ICAgICByZXR1cm4gZXI7Ci0KLSAgICAgIC8qIE1pbmltaXplIHVuZGVmaW5lZCBDIGJlaGF2aW9y
IChzaGlmdGluZyBieSBhIG5lZ2F0aXZlIG51bWJlciwKLSAgICAgICAgIHNoaWZ0aW5nIGJ5IHRo
ZSB3aWR0aCBvciBncmVhdGVyLCBsZWZ0IHNoaWZ0IG92ZXJmbG93LCBvcgotICAgICAgICAgcmln
aHQgc2hpZnQgb2YgYSBuZWdhdGl2ZSBudW1iZXIpLiAgSW1wbGVtZW50IEphdmEgMzItYml0Ci0g
ICAgICAgICB3cmFwLWFyb3VuZCBzZW1hbnRpY3MuICBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRo
ZQotICAgICAgICAgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBvdmVyZmxvdyB3aGVuIGNhc3Rpbmcg
dW5zaWduZWQgdG8KLSAgICAgICAgIHNpZ25lZCBpcyBhIHNpbGVudCB0d29zLWNvbXBsZW1lbnQg
d3JhcC1hcm91bmQuICAqLwotICAgICAgc3dpdGNoIChvcCkKLSAgICAgICAgewotICAgICAgICBj
YXNlIExTSElGVDoKLSAgICAgICAgICB1MSA9ICp2MTsKLSAgICAgICAgICB1MSA8PD0gKHVpbnQz
Ml90KSAodjIgJiAweDFmKTsKLSAgICAgICAgICAqdjEgPSB1MTsKLSAgICAgICAgICBicmVhazsK
LQotICAgICAgICBjYXNlIFJTSElGVDoKLSAgICAgICAgICB1MSA9ICp2MSA8IDAgPyB+KnYxIDog
KnYxOwotICAgICAgICAgIHUxID4+PSAodWludDMyX3QpICh2MiAmIDB4MWYpOwotICAgICAgICAg
ICp2MSA9ICp2MSA8IDAgPyB+dTEgOiB1MTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBk
ZWZhdWx0OgotICAgICAgICAgIE00RVJST1IgKCh3YXJuaW5nX3N0YXR1cywgMCwKLSAgICAgICAg
ICAgICAgICAgICAgIklOVEVSTkFMIEVSUk9SOiBiYWQgc2hpZnQgb3BlcmF0b3IgaW4gc2hpZnRf
dGVybSAoKSIpKTsKLSAgICAgICAgICBhYm9ydCAoKTsKLSAgICAgICAgfQotICAgIH0KLSAgaWYg
KG9wID09IEVSUk9SKQotICAgIHJldHVybiBVTktOT1dOX0lOUFVUOwotCi0gIGV2YWxfdW5kbyAo
KTsKLSAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0aWMgZXZhbF9lcnJvcgotYWRkX3Rlcm0g
KGV2YWxfdG9rZW4gZXQsIGludDMyX3QgKnYxKQotewotICBldmFsX3Rva2VuIG9wOwotICBpbnQz
Ml90IHYyOwotICBldmFsX2Vycm9yIGVyOwotCi0gIGlmICgoZXIgPSBtdWx0X3Rlcm0gKGV0LCB2
MSkpICE9IE5PX0VSUk9SKQotICAgIHJldHVybiBlcjsKLQotICB3aGlsZSAoKG9wID0gZXZhbF9s
ZXggKCZ2MikpID09IFBMVVMgfHwgb3AgPT0gTUlOVVMpCi0gICAgewotICAgICAgZXQgPSBldmFs
X2xleCAoJnYyKTsKLSAgICAgIGlmIChldCA9PSBFUlJPUikKLSAgICAgICAgcmV0dXJuIFVOS05P
V05fSU5QVVQ7Ci0KLSAgICAgIGlmICgoZXIgPSBtdWx0X3Rlcm0gKGV0LCAmdjIpKSAhPSBOT19F
UlJPUikKLSAgICAgICAgcmV0dXJuIGVyOwotCi0gICAgICAvKiBNaW5pbWl6ZSB1bmRlZmluZWQg
QyBiZWhhdmlvciBvbiBvdmVyZmxvdy4gIFRoaXMgY29kZSBhc3N1bWVzCi0gICAgICAgICB0aGF0
IHRoZSBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIG92ZXJmbG93IHdoZW4gY2FzdGluZwotICAgICAg
ICAgdW5zaWduZWQgdG8gc2lnbmVkIGlzIGEgc2lsZW50IHR3b3MtY29tcGxlbWVudAotICAgICAg
ICAgd3JhcC1hcm91bmQuICAqLwotICAgICAgaWYgKG9wID09IFBMVVMpCi0gICAgICAgICp2MSA9
IChpbnQzMl90KSAoKHVpbnQzMl90KSAqdjEgKyAodWludDMyX3QpIHYyKTsKLSAgICAgIGVsc2UK
LSAgICAgICAgKnYxID0gKGludDMyX3QpICgodWludDMyX3QpICp2MSAtICh1aW50MzJfdCkgdjIp
OwotICAgIH0KLSAgaWYgKG9wID09IEVSUk9SKQotICAgIHJldHVybiBVTktOT1dOX0lOUFVUOwot
Ci0gIGV2YWxfdW5kbyAoKTsKLSAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0aWMgZXZhbF9l
cnJvcgotbXVsdF90ZXJtIChldmFsX3Rva2VuIGV0LCBpbnQzMl90ICp2MSkKLXsKLSAgZXZhbF90
b2tlbiBvcDsKLSAgaW50MzJfdCB2MjsKLSAgZXZhbF9lcnJvciBlcjsKLQotICBpZiAoKGVyID0g
ZXhwX3Rlcm0gKGV0LCB2MSkpICE9IE5PX0VSUk9SKQotICAgIHJldHVybiBlcjsKLQotICB3aGls
ZSAoKG9wID0gZXZhbF9sZXggKCZ2MikpID09IFRJTUVTIHx8IG9wID09IERJVklERSB8fCBvcCA9
PSBNT0RVTE8pCi0gICAgewotICAgICAgZXQgPSBldmFsX2xleCAoJnYyKTsKLSAgICAgIGlmIChl
dCA9PSBFUlJPUikKLSAgICAgICAgcmV0dXJuIFVOS05PV05fSU5QVVQ7Ci0KLSAgICAgIGlmICgo
ZXIgPSBleHBfdGVybSAoZXQsICZ2MikpICE9IE5PX0VSUk9SKQotICAgICAgICByZXR1cm4gZXI7
Ci0KLSAgICAgIC8qIE1pbmltaXplIHVuZGVmaW5lZCBDIGJlaGF2aW9yIG9uIG92ZXJmbG93LiAg
VGhpcyBjb2RlIGFzc3VtZXMKLSAgICAgICAgIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uLWRlZmlu
ZWQgb3ZlcmZsb3cgd2hlbiBjYXN0aW5nCi0gICAgICAgICB1bnNpZ25lZCB0byBzaWduZWQgaXMg
YSBzaWxlbnQgdHdvcy1jb21wbGVtZW50Ci0gICAgICAgICB3cmFwLWFyb3VuZC4gICovCi0gICAg
ICBzd2l0Y2ggKG9wKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgVElNRVM6Ci0gICAgICAgICAg
KnYxID0gKGludDMyX3QpICgodWludDMyX3QpICp2MSAqICh1aW50MzJfdCkgdjIpOwotICAgICAg
ICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRElWSURFOgotICAgICAgICAgIGlmICh2MiA9PSAw
KQotICAgICAgICAgICAgcmV0dXJuIERJVklERV9aRVJPOwotICAgICAgICAgIGVsc2UgaWYgKHYy
ID09IC0xKQotICAgICAgICAgICAgLyogQXZvaWQgb3ZlcmZsb3csIGFuZCB0aGUgeDg2IFNJR0ZQ
RSBvbiBJTlRfTUlOIC8gLTEuICAqLwotICAgICAgICAgICAgKnYxID0gKGludDMyX3QpIC0odWlu
dDMyX3QpICp2MTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAqdjEgLz0gdjI7Ci0gICAg
ICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNT0RVTE86Ci0gICAgICAgICAgaWYgKHYyID09
IDApCi0gICAgICAgICAgICByZXR1cm4gTU9EVUxPX1pFUk87Ci0gICAgICAgICAgZWxzZSBpZiAo
djIgPT0gLTEpCi0gICAgICAgICAgICAvKiBBdm9pZCB0aGUgeDg2IFNJR0ZQRSBvbiBJTlRfTUlO
ICUgLTEuICAqLwotICAgICAgICAgICAgKnYxID0gMDsKLSAgICAgICAgICBlbHNlCi0gICAgICAg
ICAgICAqdjEgJT0gdjI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAg
ICAgICAgICBNNEVSUk9SICgod2FybmluZ19zdGF0dXMsIDAsCi0gICAgICAgICAgICAgICAgICAg
ICJJTlRFUk5BTCBFUlJPUjogYmFkIG9wZXJhdG9yIGluIG11bHRfdGVybSAoKSIpKTsKLSAgICAg
ICAgICBhYm9ydCAoKTsKLSAgICAgICAgfQotICAgIH0KLSAgaWYgKG9wID09IEVSUk9SKQotICAg
IHJldHVybiBVTktOT1dOX0lOUFVUOwotCi0gIGV2YWxfdW5kbyAoKTsKLSAgcmV0dXJuIE5PX0VS
Uk9SOwotfQotCi1zdGF0aWMgZXZhbF9lcnJvcgotZXhwX3Rlcm0gKGV2YWxfdG9rZW4gZXQsIGlu
dDMyX3QgKnYxKQotewotICB1aW50MzJfdCByZXN1bHQ7Ci0gIGludDMyX3QgdjI7Ci0gIGV2YWxf
ZXJyb3IgZXI7Ci0KLSAgaWYgKChlciA9IHVuYXJ5X3Rlcm0gKGV0LCB2MSkpICE9IE5PX0VSUk9S
KQotICAgIHJldHVybiBlcjsKLQotICB3aGlsZSAoKGV0ID0gZXZhbF9sZXggKCZ2MikpID09IEVY
UE9ORU5UKQotICAgIHsKLSAgICAgIGV0ID0gZXZhbF9sZXggKCZ2Mik7Ci0gICAgICBpZiAoZXQg
PT0gRVJST1IpCi0gICAgICAgIHJldHVybiBVTktOT1dOX0lOUFVUOwotCi0gICAgICBpZiAoKGVy
ID0gZXhwX3Rlcm0gKGV0LCAmdjIpKSAhPSBOT19FUlJPUikKLSAgICAgICAgcmV0dXJuIGVyOwot
Ci0gICAgICAvKiBNaW5pbWl6ZSB1bmRlZmluZWQgQyBiZWhhdmlvciBvbiBvdmVyZmxvdy4gIFRo
aXMgY29kZSBhc3N1bWVzCi0gICAgICAgICB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbi1kZWZpbmVk
IG92ZXJmbG93IHdoZW4gY2FzdGluZwotICAgICAgICAgdW5zaWduZWQgdG8gc2lnbmVkIGlzIGEg
c2lsZW50IHR3b3MtY29tcGxlbWVudAotICAgICAgICAgd3JhcC1hcm91bmQuICAqLwotICAgICAg
cmVzdWx0ID0gMTsKLSAgICAgIGlmICh2MiA8IDApCi0gICAgICAgIHJldHVybiBORUdBVElWRV9F
WFBPTkVOVDsKLSAgICAgIGlmICgqdjEgPT0gMCAmJiB2MiA9PSAwKQotICAgICAgICByZXR1cm4g
RElWSURFX1pFUk87Ci0gICAgICB3aGlsZSAodjItLSA+IDApCi0gICAgICAgIHJlc3VsdCAqPSAo
dWludDMyX3QpICp2MTsKLSAgICAgICp2MSA9IHJlc3VsdDsKLSAgICB9Ci0gIGlmIChldCA9PSBF
UlJPUikKLSAgICByZXR1cm4gVU5LTk9XTl9JTlBVVDsKLQotICBldmFsX3VuZG8gKCk7Ci0gIHJl
dHVybiBOT19FUlJPUjsKLX0KLQotc3RhdGljIGV2YWxfZXJyb3IKLXVuYXJ5X3Rlcm0gKGV2YWxf
dG9rZW4gZXQsIGludDMyX3QgKnYxKQotewotICBldmFsX2Vycm9yIGVyOwotCi0gIGlmIChldCA9
PSBQTFVTIHx8IGV0ID09IE1JTlVTIHx8IGV0ID09IE5PVCB8fCBldCA9PSBMTk9UKQotICAgIHsK
LSAgICAgIGV2YWxfdG9rZW4gZXQyID0gZXZhbF9sZXggKHYxKTsKLSAgICAgIGlmIChldDIgPT0g
RVJST1IpCi0gICAgICAgIHJldHVybiBVTktOT1dOX0lOUFVUOwotCi0gICAgICBpZiAoKGVyID0g
dW5hcnlfdGVybSAoZXQyLCB2MSkpICE9IE5PX0VSUk9SKQotICAgICAgICByZXR1cm4gZXI7Ci0K
LSAgICAgIC8qIE1pbmltaXplIHVuZGVmaW5lZCBDIGJlaGF2aW9yIG9uIG92ZXJmbG93LiAgVGhp
cyBjb2RlIGFzc3VtZXMKLSAgICAgICAgIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uLWRlZmluZWQg
b3ZlcmZsb3cgd2hlbiBjYXN0aW5nCi0gICAgICAgICB1bnNpZ25lZCB0byBzaWduZWQgaXMgYSBz
aWxlbnQgdHdvcy1jb21wbGVtZW50Ci0gICAgICAgICB3cmFwLWFyb3VuZC4gICovCi0gICAgICBp
ZiAoZXQgPT0gTUlOVVMpCi0gICAgICAgICp2MSA9IChpbnQzMl90KSAtKHVpbnQzMl90KSAqdjE7
Ci0gICAgICBlbHNlIGlmIChldCA9PSBOT1QpCi0gICAgICAgICp2MSA9IH4qdjE7Ci0gICAgICBl
bHNlIGlmIChldCA9PSBMTk9UKQotICAgICAgICAqdjEgPSAqdjEgPT0gMCA/IDEgOiAwOwotICAg
IH0KLSAgZWxzZSBpZiAoKGVyID0gc2ltcGxlX3Rlcm0gKGV0LCB2MSkpICE9IE5PX0VSUk9SKQot
ICAgIHJldHVybiBlcjsKLQotICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXRpYyBldmFsX2Vy
cm9yCi1zaW1wbGVfdGVybSAoZXZhbF90b2tlbiBldCwgaW50MzJfdCAqdjEpCi17Ci0gIGludDMy
X3QgdjI7Ci0gIGV2YWxfZXJyb3IgZXI7Ci0KLSAgc3dpdGNoIChldCkKLSAgICB7Ci0gICAgY2Fz
ZSBMRUZUUDoKLSAgICAgIGV0ID0gZXZhbF9sZXggKHYxKTsKLSAgICAgIGlmIChldCA9PSBFUlJP
UikKLSAgICAgICAgcmV0dXJuIFVOS05PV05fSU5QVVQ7Ci0KLSAgICAgIGlmICgoZXIgPSBsb2dp
Y2FsX29yX3Rlcm0gKGV0LCB2MSkpICE9IE5PX0VSUk9SKQotICAgICAgICByZXR1cm4gZXI7Ci0K
LSAgICAgIGV0ID0gZXZhbF9sZXggKCZ2Mik7Ci0gICAgICBpZiAoZXQgPT0gRVJST1IpCi0gICAg
ICAgIHJldHVybiBVTktOT1dOX0lOUFVUOwotCi0gICAgICBpZiAoZXQgIT0gUklHSFRQKQotICAg
ICAgICByZXR1cm4gTUlTU0lOR19SSUdIVDsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5V
TUJFUjoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCQURPUDoKLSAgICAgIHJldHVybiBJTlZB
TElEX09QRVJBVE9SOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBTWU5UQVhfRVJST1I7
Ci0gICAgfQotICByZXR1cm4gTk9fRVJST1I7Ci19Ci0tIAoyLjQ4LjEKCgpfX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpNNC1wYXRjaGVzIG1haWxpbmcgbGlz
dApNNC1wYXRjaGVzQGdudS5vcmcKaHR0cHM6Ly9saXN0cy5nbnUub3JnL21haWxtYW4vbGlzdGlu
Zm8vbTQtcGF0Y2hlcwo=