[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=