From mboxrd@z Thu Jan 1 00:00:00 1970 From: wjl@mindless.com To: gcc-gnats@gcc.gnu.org Subject: c++/3903: ICE near an enum declaration compiling qgdict.cpp from Qt with -O2 or -Os Date: Tue, 31 Jul 2001 12:06:00 -0000 Message-id: <20010731190355.8416.qmail@sourceware.cygnus.com> X-SW-Source: 2001-07/msg00830.html List-Id: >Number: 3903 >Category: c++ >Synopsis: ICE near an enum declaration compiling qgdict.cpp from Qt with -O2 or -Os >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: ice-on-legal-code >Submitter-Id: net >Arrival-Date: Tue Jul 31 12:06:01 PDT 2001 >Closed-Date: >Last-Modified: >Originator: wjl@mindless.com >Release: gcc-3.1 20010731 (experimental) (HEAD from CVS) >Organization: >Environment: % g++ -v Thread model: single gcc version 3.1 20010731 (experimental) >Description: % g++ -c qgdict.ii (no errors) % g++ -O -c qgdict.ii (no errors) % g++ -O2 -c qgdict.ii qgdict.cpp: In member function `void QGDict::statistics() const': qgdict.cpp:942: Internal compiler error in compensate_edge, at reg-stack.c:2555 Please submit a full bug report, with preprocessed source if appropriate. See for instructions. % g++ -Os -c qgdict.ii qgdict.cpp: In member function `void QGDict::statistics() const': qgdict.cpp:942: Internal compiler error in compensate_edge, at reg-stack.c:2555 Please submit a full bug report, with preprocessed source if appropriate. See for instructions. I tried to find specific -f flags that would make it fail, but I didn't find anything. This bug has been in the HEAD of CVS for a couple weeks; I update daily. I don't know *exactly* when this failed, however, sorry. >How-To-Repeat: Compile qgdict.ii with '-c -O2' or '-c -Os'. >Fix: Using -O instead of -O2 or -Os compiles the file with no readily apparently problems. This doesn't solve the ICE, however. =) >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="qgdict.ii" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="qgdict.ii" IyAzOCAicWdkaWN0LmNwcCIKIyAxICJxZ2RpY3QuaCIgMQojIDQyICJxZ2RpY3QuaCIKIyAxICJx Y29sbGVjdGlvbi5oIiAxCiMgNDIgInFjb2xsZWN0aW9uLmgiCiMgMSAicWdsb2JhbC5oIiAxCiMg MzI4ICJxZ2xvYmFsLmgiCnR5cGVkZWYgdW5zaWduZWQgY2hhciB1Y2hhcjsKdHlwZWRlZiB1bnNp Z25lZCBzaG9ydCB1c2hvcnQ7CnR5cGVkZWYgdW5zaWduZWQgdWludDsKdHlwZWRlZiB1bnNpZ25l ZCBsb25nIHVsb25nOwp0eXBlZGVmIGNoYXIgKnBjaGFyOwp0eXBlZGVmIHVjaGFyICpwdWNoYXI7 CnR5cGVkZWYgY29uc3QgY2hhciAqcGNjaGFyOwoKCgoKCgoKY29uc3QgYm9vbCBGQUxTRSA9IDA7 CmNvbnN0IGJvb2wgVFJVRSA9ICEwOwojIDM2NiAicWdsb2JhbC5oIgppbmxpbmUgaW50IHFSb3Vu ZCggZG91YmxlIGQgKQp7CiAgICByZXR1cm4gZCA+IDAuMCA/IGludChkKzAuNSkgOiBpbnQoZC0w LjUpOwp9CiMgMzc5ICJxZ2xvYmFsLmgiCnR5cGVkZWYgc2lnbmVkIGNoYXIgSU5UODsKdHlwZWRl ZiB1bnNpZ25lZCBjaGFyIFVJTlQ4Owp0eXBlZGVmIHNob3J0IElOVDE2Owp0eXBlZGVmIHVuc2ln bmVkIHNob3J0IFVJTlQxNjsKdHlwZWRlZiBpbnQgSU5UMzI7CnR5cGVkZWYgdW5zaWduZWQgaW50 IFVJTlQzMjsKCgp0eXBlZGVmIHNpZ25lZCBjaGFyIFFfSU5UODsKdHlwZWRlZiB1bnNpZ25lZCBj aGFyIFFfVUlOVDg7CnR5cGVkZWYgc2hvcnQgUV9JTlQxNjsKdHlwZWRlZiB1bnNpZ25lZCBzaG9y dCBRX1VJTlQxNjsKdHlwZWRlZiBpbnQgUV9JTlQzMjsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgUV9V SU5UMzI7CnR5cGVkZWYgbG9uZyBRX0lOVDY0Owp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgUV9VSU5U NjQ7CgoKCgoKY2xhc3MgUURhdGFTdHJlYW07CiMgNDA5ICJxZ2xvYmFsLmgiCiMgMSAicWZlYXR1 cmVzLmgiIDEKIyA2NCAicWZlYXR1cmVzLmgiCiMgMSAicWNvbmZpZy5oIiAxCiMgNjUgInFmZWF0 dXJlcy5oIiAyCiMgNDEwICJxZ2xvYmFsLmgiIDIKIyA0NDcgInFnbG9iYWwuaCIKICAgICAgICAg Y29uc3QgY2hhciAqcVZlcnNpb24oKTsKICAgICAgICAgYm9vbCBxU3lzSW5mbyggaW50ICp3b3Jk U2l6ZSwgYm9vbCAqYmlnRW5kaWFuICk7CiMgNTExICJxZ2xvYmFsLmgiCiAgICAgICAgIHZvaWQg cURlYnVnKCBjb25zdCBjaGFyICosIC4uLiApCgogICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAo cHJpbnRmLCAxLCAyKSkpCgo7CgogICAgICAgICB2b2lkIHFXYXJuaW5nKCBjb25zdCBjaGFyICos IC4uLiApCgogICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpCgo7Cgog ICAgICAgICB2b2lkIHFGYXRhbCggY29uc3QgY2hhciAqLCAuLi4gKQoKICAgIF9fYXR0cmlidXRl X18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKQoKOwoKCgoKCgoKICAgICAgICAgdm9pZCBkZWJ1 ZyggY29uc3QgY2hhciAqLCAuLi4gKQoKICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50 ZiwgMSwgMikpKQoKOwoKICAgICAgICAgdm9pZCB3YXJuaW5nKCBjb25zdCBjaGFyICosIC4uLiAp CgogICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpCgo7CgogICAgICAg ICB2b2lkIGZhdGFsKCBjb25zdCBjaGFyICosIC4uLiApCgogICAgX19hdHRyaWJ1dGVfXyAoKGZv cm1hdCAocHJpbnRmLCAxLCAyKSkpCgo7CiMgNTcwICJxZ2xvYmFsLmgiCiAgICAgICAgIGJvb2wg cXRfY2hlY2tfcG9pbnRlciggYm9vbCBjLCBjb25zdCBjaGFyICosIGludCApOwoKCgoKCgoKZW51 bSBRdE1zZ1R5cGUgeyBRdERlYnVnTXNnLCBRdFdhcm5pbmdNc2csIFF0RmF0YWxNc2cgfTsKCnR5 cGVkZWYgdm9pZCAoKm1zZ19oYW5kbGVyKShRdE1zZ1R5cGUsIGNvbnN0IGNoYXIgKik7CiAgICAg ICAgIG1zZ19oYW5kbGVyIHFJbnN0YWxsTXNnSGFuZGxlciggbXNnX2hhbmRsZXIgKTsKCgogICAg ICAgICB2b2lkIHFTdXBwcmVzc09ic29sZXRlV2FybmluZ3MoIGJvb2wgPSBUUlVFICk7CgoKCiAg ICAgICAgIHZvaWQgcU9ic29sZXRlKCBjb25zdCBjaGFyICpvYmosIGNvbnN0IGNoYXIgKm9sZGZ1 bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuZXdmdW5jICk7CiAgICAg ICAgIHZvaWQgcU9ic29sZXRlKCBjb25zdCBjaGFyICpvYmosIGNvbnN0IGNoYXIgKm9sZGZ1bmMg KTsKICAgICAgICAgdm9pZCBxT2Jzb2xldGUoIGNvbnN0IGNoYXIgKm1lc3NhZ2UgKTsKIyA0MyAi cWNvbGxlY3Rpb24uaCIgMgoKCgpjbGFzcyBRR1ZlY3RvcjsKY2xhc3MgUUdMaXN0OwpjbGFzcyBR R0RpY3Q7CgoKY2xhc3MgUUNvbGxlY3Rpb24KewpwdWJsaWM6CiAgICBib29sIGF1dG9EZWxldGUo KSBjb25zdCB7IHJldHVybiBkZWxfaXRlbTsgfQogICAgdm9pZCBzZXRBdXRvRGVsZXRlKCBib29s IGVuYWJsZSApIHsgZGVsX2l0ZW0gPSBlbmFibGU7IH0KCiAgICB2aXJ0dWFsIHVpbnQgY291bnQo KSBjb25zdCA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgY2xlYXIoKSA9IDA7CgogICAgdHlwZWRlZiB2 b2lkICpJdGVtOwoKcHJvdGVjdGVkOgogICAgUUNvbGxlY3Rpb24oKSB7IGRlbF9pdGVtID0gRkFM U0U7IH0KICAgIFFDb2xsZWN0aW9uKGNvbnN0IFFDb2xsZWN0aW9uICYpIHsgZGVsX2l0ZW0gPSBG QUxTRTsgfQogICAgdmlydHVhbCB+UUNvbGxlY3Rpb24oKSB7fQoKICAgIGJvb2wgZGVsX2l0ZW07 CgogICAgdmlydHVhbCBJdGVtIG5ld0l0ZW0oIEl0ZW0gKTsKICAgIHZpcnR1YWwgdm9pZCBkZWxl dGVJdGVtKCBJdGVtICk7Cn07CiMgNDMgInFnZGljdC5oIiAyCiMgMSAicXN0cmluZy5oIiAxCiMg NDMgInFzdHJpbmcuaCIKIyAxICJxY3N0cmluZy5oIiAxCiMgNDMgInFjc3RyaW5nLmgiCiMgMSAi cWFycmF5LmgiIDEKIyA0MiAicWFycmF5LmgiCiMgMSAicWdhcnJheS5oIiAxCiMgNDIgInFnYXJy YXkuaCIKIyAxICJxc2hhcmVkLmgiIDEKIyA0MiAicXNoYXJlZC5oIgojIDEgInFnbG9iYWwuaCIg MQojIDQzICJxc2hhcmVkLmgiIDIKCgoKc3RydWN0IFFTaGFyZWQKewogICAgUVNoYXJlZCgpIHsg Y291bnQgPSAxOyB9CiAgICB2b2lkIHJlZigpIHsgY291bnQrKzsgfQogICAgYm9vbCBkZXJlZigp IHsgcmV0dXJuICEtLWNvdW50OyB9CiAgICB1aW50IGNvdW50Owp9OwojIDQzICJxZ2FycmF5Lmgi IDIKCgoKY2xhc3MgUUdBcnJheQp7CmZyaWVuZCBjbGFzcyBRQnVmZmVyOwpwdWJsaWM6CgogICAg c3RydWN0IGFycmF5X2RhdGEgOiBwdWJsaWMgUVNoYXJlZCB7CiAgICAgICAgYXJyYXlfZGF0YSgp IHsgZGF0YT0wOyBsZW49MDsgfQogICAgICAgIGNoYXIgKmRhdGE7CiAgICAgICAgdWludCBsZW47 CiAgICB9OwogICAgUUdBcnJheSgpOwpwcm90ZWN0ZWQ6CiAgICBRR0FycmF5KCBpbnQsIGludCAp OwogICAgUUdBcnJheSggaW50IHNpemUgKTsKICAgIFFHQXJyYXkoIGNvbnN0IFFHQXJyYXkgJmEg KTsKICAgIHZpcnR1YWwgflFHQXJyYXkoKTsKCiAgICBRR0FycmF5ICZvcGVyYXRvcj0oIGNvbnN0 IFFHQXJyYXkgJmEgKSB7IHJldHVybiBhc3NpZ24oIGEgKTsgfQoKICAgIHZpcnR1YWwgdm9pZCBk ZXRhY2goKSB7IGR1cGxpY2F0ZSgqdGhpcyk7IH0KCiAgICBjaGFyICpkYXRhKCkgY29uc3QgeyBy ZXR1cm4gc2hkLT5kYXRhOyB9CiAgICB1aW50IG5yZWZzKCkgY29uc3QgeyByZXR1cm4gc2hkLT5j b3VudDsgfQogICAgdWludCBzaXplKCkgY29uc3QgeyByZXR1cm4gc2hkLT5sZW47IH0KICAgIGJv b2wgaXNFcXVhbCggY29uc3QgUUdBcnJheSAmYSApIGNvbnN0OwoKICAgIGJvb2wgcmVzaXplKCB1 aW50IG5ld3NpemUgKTsKCiAgICBib29sIGZpbGwoIGNvbnN0IGNoYXIgKmQsIGludCBsZW4sIHVp bnQgc3ogKTsKCiAgICBRR0FycmF5ICZhc3NpZ24oIGNvbnN0IFFHQXJyYXkgJmEgKTsKICAgIFFH QXJyYXkgJmFzc2lnbiggY29uc3QgY2hhciAqZCwgdWludCBsZW4gKTsKICAgIFFHQXJyYXkgJmR1 cGxpY2F0ZSggY29uc3QgUUdBcnJheSAmYSApOwogICAgUUdBcnJheSAmZHVwbGljYXRlKCBjb25z dCBjaGFyICpkLCB1aW50IGxlbiApOwogICAgdm9pZCBzdG9yZSggY29uc3QgY2hhciAqZCwgdWlu dCBsZW4gKTsKCiAgICBhcnJheV9kYXRhICpzaGFyZWRCbG9jaygpIGNvbnN0IHsgcmV0dXJuIHNo ZDsgfQogICAgdm9pZCBzZXRTaGFyZWRCbG9jayggYXJyYXlfZGF0YSAqcCApIHsgc2hkPShhcnJh eV9kYXRhKilwOyB9CgogICAgUUdBcnJheSAmc2V0UmF3RGF0YSggY29uc3QgY2hhciAqZCwgdWlu dCBsZW4gKTsKICAgIHZvaWQgcmVzZXRSYXdEYXRhKCBjb25zdCBjaGFyICpkLCB1aW50IGxlbiAp OwoKICAgIGludCBmaW5kKCBjb25zdCBjaGFyICpkLCB1aW50IGluZGV4LCB1aW50IHN6ICkgY29u c3Q7CiAgICBpbnQgY29udGFpbnMoIGNvbnN0IGNoYXIgKmQsIHVpbnQgc3ogKSBjb25zdDsKCiAg ICB2b2lkIHNvcnQoIHVpbnQgc3ogKTsKICAgIGludCBic2VhcmNoKCBjb25zdCBjaGFyICpkLCB1 aW50IHN6ICkgY29uc3Q7CgogICAgY2hhciAqYXQoIHVpbnQgaW5kZXggKSBjb25zdDsKCiAgICBi b29sIHNldEV4cGFuZCggdWludCBpbmRleCwgY29uc3QgY2hhciAqZCwgdWludCBzeiApOwoKcHJv dGVjdGVkOgogICAgdmlydHVhbCBhcnJheV9kYXRhICpuZXdEYXRhKCk7CiAgICB2aXJ0dWFsIHZv aWQgZGVsZXRlRGF0YSggYXJyYXlfZGF0YSAqcCApOwoKcHJpdmF0ZToKICAgIHN0YXRpYyB2b2lk IG1zZ19pbmRleCggdWludCApOwogICAgYXJyYXlfZGF0YSAqc2hkOwp9OwoKCmlubGluZSBjaGFy ICpRR0FycmF5OjphdCggdWludCBpbmRleCApIGNvbnN0CnsKCiAgICBpZiAoIGluZGV4ID49IHNp emUoKSApIHsKICAgICAgICBtc2dfaW5kZXgoIGluZGV4ICk7CiAgICAgICAgaW5kZXggPSAwOwog ICAgfQoKICAgIHJldHVybiAmc2hkLT5kYXRhW2luZGV4XTsKfQojIDQzICJxYXJyYXkuaCIgMgoK Cgp0ZW1wbGF0ZTxjbGFzcyB0eXBlPiBjbGFzcyBRQXJyYXkgOiBwdWJsaWMgUUdBcnJheQp7CnB1 YmxpYzoKICAgIHR5cGVkZWYgdHlwZSogSXRlcmF0b3I7CiAgICB0eXBlZGVmIGNvbnN0IHR5cGUq IENvbnN0SXRlcmF0b3I7CiAgICB0eXBlZGVmIHR5cGUgVmFsdWVUeXBlOwoKcHJvdGVjdGVkOgog ICAgUUFycmF5KCBpbnQsIGludCApIDogUUdBcnJheSggMCwgMCApIHt9CgpwdWJsaWM6CiAgICBR QXJyYXkoKSB7fQogICAgUUFycmF5KCBpbnQgc2l6ZSApIDogUUdBcnJheShzaXplKnNpemVvZih0 eXBlKSkge30KICAgIFFBcnJheSggY29uc3QgUUFycmF5PHR5cGU+ICZhICkgOiBRR0FycmF5KGEp IHt9CiAgIH5RQXJyYXkoKSB7fQogICAgUUFycmF5PHR5cGU+ICZvcGVyYXRvcj0oY29uc3QgUUFy cmF5PHR5cGU+ICZhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChR QXJyYXk8dHlwZT4mKVFHQXJyYXk6OmFzc2lnbihhKTsgfQogICAgdHlwZSAqZGF0YSgpIGNvbnN0 IHsgcmV0dXJuICh0eXBlICopUUdBcnJheTo6ZGF0YSgpOyB9CiAgICB1aW50IG5yZWZzKCkgY29u c3QgeyByZXR1cm4gUUdBcnJheTo6bnJlZnMoKTsgfQogICAgdWludCBzaXplKCkgY29uc3QgeyBy ZXR1cm4gUUdBcnJheTo6c2l6ZSgpL3NpemVvZih0eXBlKTsgfQogICAgdWludCBjb3VudCgpIGNv bnN0IHsgcmV0dXJuIHNpemUoKTsgfQogICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4g UUdBcnJheTo6c2l6ZSgpID09IDA7IH0KICAgIGJvb2wgaXNOdWxsKCkgY29uc3QgeyByZXR1cm4g UUdBcnJheTo6ZGF0YSgpID09IDA7IH0KICAgIGJvb2wgcmVzaXplKCB1aW50IHNpemUgKSB7IHJl dHVybiBRR0FycmF5OjpyZXNpemUoc2l6ZSpzaXplb2YodHlwZSkpOyB9CiAgICBib29sIHRydW5j YXRlKCB1aW50IHBvcyApIHsgcmV0dXJuIFFHQXJyYXk6OnJlc2l6ZShwb3Mqc2l6ZW9mKHR5cGUp KTsgfQogICAgYm9vbCBmaWxsKCBjb25zdCB0eXBlICZkLCBpbnQgc2l6ZSA9IC0xICkKICAgICAg ICB7IHJldHVybiBRR0FycmF5OjpmaWxsKChjaGFyKikmZCxzaXplLHNpemVvZih0eXBlKSApOyB9 CiAgICB2b2lkIGRldGFjaCgpIHsgUUdBcnJheTo6ZGV0YWNoKCk7IH0KICAgIFFBcnJheTx0eXBl PiBjb3B5KCkgY29uc3QKICAgICAgICB7IFFBcnJheTx0eXBlPiB0bXA7IHJldHVybiB0bXAuZHVw bGljYXRlKCp0aGlzKTsgfQogICAgUUFycmF5PHR5cGU+JiBhc3NpZ24oIGNvbnN0IFFBcnJheTx0 eXBlPiYgYSApCiAgICAgICAgeyByZXR1cm4gKFFBcnJheTx0eXBlPiYpUUdBcnJheTo6YXNzaWdu KGEpOyB9CiAgICBRQXJyYXk8dHlwZT4mIGFzc2lnbiggY29uc3QgdHlwZSAqYSwgdWludCBuICkK ICAgICAgICB7IHJldHVybiAoUUFycmF5PHR5cGU+JilRR0FycmF5Ojphc3NpZ24oKGNoYXIqKWEs bipzaXplb2YodHlwZSkpOyB9CiAgICBRQXJyYXk8dHlwZT4mIGR1cGxpY2F0ZSggY29uc3QgUUFy cmF5PHR5cGU+JiBhICkKICAgICAgICB7IHJldHVybiAoUUFycmF5PHR5cGU+JilRR0FycmF5Ojpk dXBsaWNhdGUoYSk7IH0KICAgIFFBcnJheTx0eXBlPiYgZHVwbGljYXRlKCBjb25zdCB0eXBlICph LCB1aW50IG4gKQogICAgICAgIHsgcmV0dXJuIChRQXJyYXk8dHlwZT4mKVFHQXJyYXk6OmR1cGxp Y2F0ZSgoY2hhciopYSxuKnNpemVvZih0eXBlKSk7IH0KICAgIFFBcnJheTx0eXBlPiYgc2V0UmF3 RGF0YSggY29uc3QgdHlwZSAqYSwgdWludCBuICkKICAgICAgICB7IHJldHVybiAoUUFycmF5PHR5 cGU+JilRR0FycmF5OjpzZXRSYXdEYXRhKChjaGFyKilhLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4qc2l6ZW9mKHR5cGUpKTsgfQogICAgdm9p ZCByZXNldFJhd0RhdGEoIGNvbnN0IHR5cGUgKmEsIHVpbnQgbiApCiAgICAgICAgeyBRR0FycmF5 OjpyZXNldFJhd0RhdGEoKGNoYXIqKWEsbipzaXplb2YodHlwZSkpOyB9CiAgICBpbnQgZmluZCgg Y29uc3QgdHlwZSAmZCwgdWludCBpPTAgKSBjb25zdAogICAgICAgIHsgcmV0dXJuIFFHQXJyYXk6 OmZpbmQoKGNoYXIqKSZkLGksc2l6ZW9mKHR5cGUpKTsgfQogICAgaW50IGNvbnRhaW5zKCBjb25z dCB0eXBlICZkICkgY29uc3QKICAgICAgICB7IHJldHVybiBRR0FycmF5Ojpjb250YWlucygoY2hh ciopJmQsc2l6ZW9mKHR5cGUpKTsgfQogICAgdm9pZCBzb3J0KCkgeyBRR0FycmF5Ojpzb3J0KHNp emVvZih0eXBlKSk7IH0KICAgIGludCBic2VhcmNoKCBjb25zdCB0eXBlICZkICkgY29uc3QKICAg ICAgICB7IHJldHVybiBRR0FycmF5Ojpic2VhcmNoKChjb25zdCBjaGFyKikmZCxzaXplb2YodHlw ZSkpOyB9CiAgICB0eXBlJiBvcGVyYXRvcltdKCBpbnQgaSApIGNvbnN0CiAgICAgICAgeyByZXR1 cm4gKHR5cGUgJikoKih0eXBlICopUUdBcnJheTo6YXQoaSpzaXplb2YodHlwZSkpKTsgfQogICAg dHlwZSYgYXQoIHVpbnQgaSApIGNvbnN0CiAgICAgICAgeyByZXR1cm4gKHR5cGUgJikoKih0eXBl ICopUUdBcnJheTo6YXQoaSpzaXplb2YodHlwZSkpKTsgfQogICAgICAgICBvcGVyYXRvciBjb25z dCB0eXBlKigpIGNvbnN0IHsgcmV0dXJuIChjb25zdCB0eXBlICopUUdBcnJheTo6ZGF0YSgpOyB9 CiAgICBib29sIG9wZXJhdG9yPT0oIGNvbnN0IFFBcnJheTx0eXBlPiAmYSApIGNvbnN0IHsgcmV0 dXJuIGlzRXF1YWwoYSk7IH0KICAgIGJvb2wgb3BlcmF0b3IhPSggY29uc3QgUUFycmF5PHR5cGU+ ICZhICkgY29uc3QgeyByZXR1cm4gIWlzRXF1YWwoYSk7IH0KICAgIEl0ZXJhdG9yIGJlZ2luKCkg eyByZXR1cm4gZGF0YSgpOyB9CiAgICBJdGVyYXRvciBlbmQoKSB7IHJldHVybiBkYXRhKCkgKyBz aXplKCk7IH0KICAgIENvbnN0SXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBkYXRhKCk7 IH0KICAgIENvbnN0SXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gZGF0YSgpICsgc2l6ZSgp OyB9Cn07CiMgNDQgInFjc3RyaW5nLmgiIDIKCgojIDEgIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIg MSAzCiMgMjYgIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIgMwojIDEgIi91c3IvaW5jbHVkZS9mZWF0 dXJlcy5oIiAxIDMKIyAyODMgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAzCiMgMSAiL3Vzci9p bmNsdWRlL3N5cy9jZGVmcy5oIiAxIDMKIyAyODQgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAy IDMKIyAzMTEgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL2du dS9zdHVicy5oIiAxIDMKIyAzMTIgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAyIDMKIyAyNyAi L3Vzci9pbmNsdWRlL3N0cmluZy5oIiAyIDMKCmV4dGVybiAiQyIgewoKCgoKIyAxICIvdXNyL2xv Y2FsL2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgtZ251LzMuMS9pbmNsdWRlL3N0ZGRlZi5oIiAx IDMKIyAxOTkgIi91c3IvbG9jYWwvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMy4xL2lu Y2x1ZGUvc3RkZGVmLmgiIDMKdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OwojIDM0ICIvdXNy L2luY2x1ZGUvc3RyaW5nLmgiIDIgMwoKCgpleHRlcm4gdm9pZCAqbWVtY3B5ICh2b2lkICpfX3Jl c3RyaWN0IF9fZGVzdCwKICAgICAgICAgICAgICAgICAgICAgX19jb25zdCB2b2lkICpfX3Jlc3Ry aWN0IF9fc3JjLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgpleHRlcm4gdm9pZCAqbWVtbW92ZSAo dm9pZCAqX19kZXN0LCBfX2NvbnN0IHZvaWQgKl9fc3JjLCBzaXplX3QgX19uKQogICAgIHRocm93 ICgpOwoKCgoKCmV4dGVybiB2b2lkICptZW1jY3B5ICh2b2lkICpfX3Jlc3RyaWN0IF9fZGVzdCwg X19jb25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fc3JjLAogICAgICAgICAgICAgICAgICAgICAgaW50 IF9fYywgc2l6ZV90IF9fbikKICAgICB0aHJvdyAoKTsKCgoKCmV4dGVybiB2b2lkICptZW1zZXQg KHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBt ZW1jbXAgKF9fY29uc3Qgdm9pZCAqX19zMSwgX19jb25zdCB2b2lkICpfX3MyLCBzaXplX3QgX19u KQogICAgIHRocm93ICgpIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOwoKCmV4dGVybiB2b2lk ICptZW1jaHIgKF9fY29uc3Qgdm9pZCAqX19zLCBpbnQgX19jLCBzaXplX3QgX19uKQogICAgICB0 aHJvdyAoKSBfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKTsKCgoKCmV4dGVybiB2b2lkICpyYXdt ZW1jaHIgKF9fY29uc3Qgdm9pZCAqX19zLCBpbnQgX19jKSB0aHJvdyAoKSBfX2F0dHJpYnV0ZV9f ICgoX19wdXJlX18pKTsKCgpleHRlcm4gdm9pZCAqbWVtcmNociAoX19jb25zdCB2b2lkICpfX3Ms IGludCBfX2MsIHNpemVfdCBfX24pCiAgICAgIHRocm93ICgpIF9fYXR0cmlidXRlX18gKChfX3B1 cmVfXykpOwoKCgoKZXh0ZXJuIGNoYXIgKnN0cmNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3Qs IF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYykKICAgICB0aHJvdyAoKTsKCmV4dGVybiBj aGFyICpzdHJuY3B5IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwKICAgICAgICAgICAgICAgICAg ICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikgdGhyb3cgKCk7 CgoKZXh0ZXJuIGNoYXIgKnN0cmNhdCAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qg Y2hhciAqX19yZXN0cmljdCBfX3NyYykKICAgICB0aHJvdyAoKTsKCmV4dGVybiBjaGFyICpzdHJu Y2F0IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9f c3JjLAogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKZXh0ZXJu IGludCBzdHJjbXAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyKQogICAg IHRocm93ICgpIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOwoKZXh0ZXJuIGludCBzdHJuY21w IChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMiwgc2l6ZV90IF9fbikKICAg ICB0aHJvdyAoKSBfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKTsKCgpleHRlcm4gaW50IHN0cmNv bGwgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyKQogICAgIHRocm93ICgp IF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOwoKZXh0ZXJuIHNpemVfdCBzdHJ4ZnJtIChjaGFy ICpfX3Jlc3RyaWN0IF9fZGVzdCwKICAgICAgICAgICAgICAgICAgICAgICBfX2NvbnN0IGNoYXIg Kl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24pIHRocm93ICgpOwoKCgoKCiMgMSAiL3Vzci9p bmNsdWRlL3hsb2NhbGUuaCIgMSAzCiMgMjggIi91c3IvaW5jbHVkZS94bG9jYWxlLmgiIDMKdHlw ZWRlZiBzdHJ1Y3QgX19sb2NhbGVfc3RydWN0CnsKCiAgc3RydWN0IGxvY2FsZV9kYXRhICpfX2xv Y2FsZXNbMTNdOwoKCiAgY29uc3QgdW5zaWduZWQgc2hvcnQgaW50ICpfX2N0eXBlX2I7CiAgY29u c3QgaW50ICpfX2N0eXBlX3RvbG93ZXI7CiAgY29uc3QgaW50ICpfX2N0eXBlX3RvdXBwZXI7Cn0g Kl9fbG9jYWxlX3Q7CiMgMTA5ICIvdXNyL2luY2x1ZGUvc3RyaW5nLmgiIDIgMwoKCmV4dGVybiBp bnQgX19zdHJjb2xsX2wgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyLCBf X2xvY2FsZV90IF9fbCkKICAgICB0aHJvdyAoKSBfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKTsK CmV4dGVybiBzaXplX3QgX19zdHJ4ZnJtX2wgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyICpf X3NyYywgc2l6ZV90IF9fbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgX19sb2NhbGVfdCBf X2wpIHRocm93ICgpOwoKCgoKZXh0ZXJuIGNoYXIgKnN0cmR1cCAoX19jb25zdCBjaGFyICpfX3Mp IHRocm93ICgpIF9fYXR0cmlidXRlX18gKChfX21hbGxvY19fKSk7CgoKCgoKCmV4dGVybiBjaGFy ICpzdHJuZHVwIChfX2NvbnN0IGNoYXIgKl9fc3RyaW5nLCBzaXplX3QgX19uKQogICAgIHRocm93 ICgpIF9fYXR0cmlidXRlX18gKChfX21hbGxvY19fKSk7CiMgMTU1ICIvdXNyL2luY2x1ZGUvc3Ry aW5nLmgiIDMKZXh0ZXJuIGNoYXIgKnN0cmNociAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2Mp IHRocm93ICgpIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOwoKZXh0ZXJuIGNoYXIgKnN0cnJj aHIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKSB0aHJvdyAoKSBfX2F0dHJpYnV0ZV9fICgo X19wdXJlX18pKTsKCgoKCmV4dGVybiBjaGFyICpzdHJjaHJudWwgKF9fY29uc3QgY2hhciAqX19z LCBpbnQgX19jKSB0aHJvdyAoKSBfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKTsKCgoKCmV4dGVy biBzaXplX3Qgc3RyY3NwbiAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19yZWpl Y3QpCiAgICAgdGhyb3cgKCkgX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSk7CgoKZXh0ZXJuIHNp emVfdCBzdHJzcG4gKF9fY29uc3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fYWNjZXB0KQog ICAgIHRocm93ICgpIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOwoKZXh0ZXJuIGNoYXIgKnN0 cnBicmsgKF9fY29uc3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fYWNjZXB0KQogICAgIHRo cm93ICgpIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOwoKZXh0ZXJuIGNoYXIgKnN0cnN0ciAo X19jb25zdCBjaGFyICpfX2hheXN0YWNrLCBfX2NvbnN0IGNoYXIgKl9fbmVlZGxlKQogICAgIHRo cm93ICgpIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOwoKCgpleHRlcm4gY2hhciAqc3RyY2Fz ZXN0ciAoX19jb25zdCBjaGFyICpfX2hheXN0YWNrLCBfX2NvbnN0IGNoYXIgKl9fbmVlZGxlKQog ICAgIHRocm93ICgpIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOwoKCgpleHRlcm4gY2hhciAq c3RydG9rIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9f ZGVsaW0pCiAgICAgdGhyb3cgKCk7CgoKCmV4dGVybiBjaGFyICpfX3N0cnRva19yIChjaGFyICpf X3Jlc3RyaWN0IF9fcywKICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29uc3QgY2hhciAqX19y ZXN0cmljdCBfX2RlbGltLAogICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKl9fcmVzdHJp Y3QgX19zYXZlX3B0cikgdGhyb3cgKCk7CgpleHRlcm4gY2hhciAqc3RydG9rX3IgKGNoYXIgKl9f cmVzdHJpY3QgX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19kZWxpbSwKICAgICAgICAg ICAgICAgICAgICAgICBjaGFyICoqX19yZXN0cmljdCBfX3NhdmVfcHRyKSB0aHJvdyAoKTsKCgoK CgoKZXh0ZXJuIHZvaWQgKm1lbW1lbSAoX19jb25zdCB2b2lkICpfX2hheXN0YWNrLCBzaXplX3Qg X19oYXlzdGFja2xlbiwKICAgICAgICAgICAgICAgICAgICAgX19jb25zdCB2b2lkICpfX25lZWRs ZSwgc2l6ZV90IF9fbmVlZGxlbGVuKQogICAgIHRocm93ICgpIF9fYXR0cmlidXRlX18gKChfX3B1 cmVfXykpOwoKCgpleHRlcm4gdm9pZCAqX19tZW1wY3B5ICh2b2lkICpfX3Jlc3RyaWN0IF9fZGVz dCwKICAgICAgICAgICAgICAgICAgICAgICAgX19jb25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fc3Jj LCBzaXplX3QgX19uKSB0aHJvdyAoKTsKZXh0ZXJuIHZvaWQgKm1lbXBjcHkgKHZvaWQgKl9fcmVz dHJpY3QgX19kZXN0LAogICAgICAgICAgICAgICAgICAgICAgX19jb25zdCB2b2lkICpfX3Jlc3Ry aWN0IF9fc3JjLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgoKCmV4dGVybiBzaXplX3Qgc3RybGVu IChfX2NvbnN0IGNoYXIgKl9fcykgdGhyb3cgKCkgX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSk7 CgoKCgpleHRlcm4gc2l6ZV90IHN0cm5sZW4gKF9fY29uc3QgY2hhciAqX19zdHJpbmcsIHNpemVf dCBfX21heGxlbikKICAgICB0aHJvdyAoKSBfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKTsKCgoK CmV4dGVybiBjaGFyICpzdHJlcnJvciAoaW50IF9fZXJybnVtKSB0aHJvdyAoKTsKCgoKZXh0ZXJu IGNoYXIgKnN0cmVycm9yX3IgKGludCBfX2Vycm51bSwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1 ZmxlbikgdGhyb3cgKCk7CgoKCgpleHRlcm4gdm9pZCBfX2J6ZXJvICh2b2lkICpfX3MsIHNpemVf dCBfX24pIHRocm93ICgpOwoKCgpleHRlcm4gdm9pZCBiY29weSAoX19jb25zdCB2b2lkICpfX3Ny Yywgdm9pZCAqX19kZXN0LCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgpleHRlcm4gdm9pZCBiemVy byAodm9pZCAqX19zLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IGJjbXAgKF9f Y29uc3Qgdm9pZCAqX19zMSwgX19jb25zdCB2b2lkICpfX3MyLCBzaXplX3QgX19uKQogICAgIHRo cm93ICgpIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOwoKCmV4dGVybiBjaGFyICppbmRleCAo X19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpIHRocm93ICgpIF9fYXR0cmlidXRlX18gKChfX3B1 cmVfXykpOwoKCmV4dGVybiBjaGFyICpyaW5kZXggKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19j KSB0aHJvdyAoKSBfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKTsKCgoKZXh0ZXJuIGludCBmZnMg KGludCBfX2kpIHRocm93ICgpIF9fYXR0cmlidXRlX18gKChjb25zdCkpOwoKCgoKZXh0ZXJuIGlu dCBmZnNsIChsb25nIGludCBfX2wpIHRocm93ICgpIF9fYXR0cmlidXRlX18gKChjb25zdCkpOwoK X19leHRlbnNpb25fXyBleHRlcm4gaW50IGZmc2xsIChsb25nIGxvbmcgaW50IF9fbGwpCiAgICAg dGhyb3cgKCkgX19hdHRyaWJ1dGVfXyAoKGNvbnN0KSk7CgoKCgpleHRlcm4gaW50IHN0cmNhc2Vj bXAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyKQogICAgIHRocm93ICgp IF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOwoKCmV4dGVybiBpbnQgc3RybmNhc2VjbXAgKF9f Y29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyLCBzaXplX3QgX19uKQogICAgIHRo cm93ICgpIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOwoKCgoKCmV4dGVybiBpbnQgX19zdHJj YXNlY21wX2wgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyLAogICAgICAg ICAgICAgICAgICAgICAgICAgICBfX2xvY2FsZV90IF9fbG9jKSB0aHJvdyAoKSBfX2F0dHJpYnV0 ZV9fICgoX19wdXJlX18pKTsKCmV4dGVybiBpbnQgX19zdHJuY2FzZWNtcF9sIChfX2NvbnN0IGNo YXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAg IHNpemVfdCBfX24sIF9fbG9jYWxlX3QgX19sb2MpCiAgICAgdGhyb3cgKCkgX19hdHRyaWJ1dGVf XyAoKF9fcHVyZV9fKSk7CgoKCgoKZXh0ZXJuIGNoYXIgKnN0cnNlcCAoY2hhciAqKl9fcmVzdHJp Y3QgX19zdHJpbmdwLAogICAgICAgICAgICAgICAgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJp Y3QgX19kZWxpbSkgdGhyb3cgKCk7CgoKCgpleHRlcm4gaW50IHN0cnZlcnNjbXAgKF9fY29uc3Qg Y2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyKQogICAgIHRocm93ICgpIF9fYXR0cmlidXRl X18gKChfX3B1cmVfXykpOwoKCmV4dGVybiBjaGFyICpzdHJzaWduYWwgKGludCBfX3NpZykgdGhy b3cgKCk7CgoKZXh0ZXJuIGNoYXIgKl9fc3RwY3B5IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwg X19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjKQogICAgIHRocm93ICgpOwpleHRlcm4gY2hh ciAqc3RwY3B5IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3Ry aWN0IF9fc3JjKQogICAgIHRocm93ICgpOwoKCgpleHRlcm4gY2hhciAqX19zdHBuY3B5IChjaGFy ICpfX3Jlc3RyaWN0IF9fZGVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgX19jb25zdCBjaGFy ICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKZXh0ZXJuIGNoYXIgKnN0 cG5jcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LAogICAgICAgICAgICAgICAgICAgICAgX19j b25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgpleHRl cm4gY2hhciAqc3RyZnJ5IChjaGFyICpfX3N0cmluZykgdGhyb3cgKCk7CgoKZXh0ZXJuIHZvaWQg Km1lbWZyb2IgKHZvaWQgKl9fcywgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKCgoKCmV4dGVybiBj aGFyICpiYXNlbmFtZSAoX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lKSB0aHJvdyAoKTsKIyAzNjMg Ii91c3IvaW5jbHVkZS9zdHJpbmcuaCIgMwp9CiMgNDcgInFjc3RyaW5nLmgiIDIKIyA3OCAicWNz dHJpbmcuaCIKICAgICAgICAgdm9pZCAqcW1lbW1vdmUoIHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAq c3JjLCB1aW50IGxlbiApOwoKCgoKCiAgICAgICAgIGNoYXIgKnFzdHJkdXAoIGNvbnN0IGNoYXIg KiApOwoKICAgICAgICAgaW5saW5lIHVpbnQgY3N0cmxlbiggY29uc3QgY2hhciAqc3RyICkKeyBy ZXR1cm4gc3RybGVuKHN0cik7IH0KCiAgICAgICAgIGlubGluZSB1aW50IHFzdHJsZW4oIGNvbnN0 IGNoYXIgKnN0ciApCnsgcmV0dXJuIHN0ciA/IHN0cmxlbihzdHIpIDogMDsgfQoKICAgICAgICAg aW5saW5lIGNoYXIgKmNzdHJjcHkoIGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjICkKeyByZXR1 cm4gc3RyY3B5KGRzdCxzcmMpOyB9CgogICAgICAgICBpbmxpbmUgY2hhciAqcXN0cmNweSggY2hh ciAqZHN0LCBjb25zdCBjaGFyICpzcmMgKQp7IHJldHVybiBzcmMgPyBzdHJjcHkoZHN0LCBzcmMp IDogMDsgfQoKICAgICAgICAgY2hhciAqcXN0cm5jcHkoIGNoYXIgKmRzdCwgY29uc3QgY2hhciAq c3JjLCB1aW50IGxlbiApOwoKICAgICAgICAgaW5saW5lIGludCBjc3RyY21wKCBjb25zdCBjaGFy ICpzdHIxLCBjb25zdCBjaGFyICpzdHIyICkKeyByZXR1cm4gc3RyY21wKHN0cjEsc3RyMik7IH0K CiAgICAgICAgIGlubGluZSBpbnQgcXN0cmNtcCggY29uc3QgY2hhciAqc3RyMSwgY29uc3QgY2hh ciAqc3RyMiApCnsgcmV0dXJuIChzdHIxICYmIHN0cjIpID8gc3RyY21wKHN0cjEsc3RyMikgOiAo aW50KSgobG9uZylzdHIyIC0gKGxvbmcpc3RyMSk7IH0KCiAgICAgICAgIGlubGluZSBpbnQgY3N0 cm5jbXAoIGNvbnN0IGNoYXIgKnN0cjEsIGNvbnN0IGNoYXIgKnN0cjIsIHVpbnQgbGVuICkKeyBy ZXR1cm4gc3RybmNtcChzdHIxLHN0cjIsbGVuKTsgfQoKICAgICAgICAgaW5saW5lIGludCBxc3Ry bmNtcCggY29uc3QgY2hhciAqc3RyMSwgY29uc3QgY2hhciAqc3RyMiwgdWludCBsZW4gKQp7IHJl dHVybiAoc3RyMSAmJiBzdHIyKSA/IHN0cm5jbXAoc3RyMSxzdHIyLGxlbikgOgogICAgICAgICAg ICAgICAgICAgICAgICAgIChpbnQpKChsb25nKXN0cjIgLSAobG9uZylzdHIxKTsgfQoKICAgICAg ICAgaW50IHFzdHJpY21wKCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiApOwoKICAgICAgICAg aW50IHFzdHJuaWNtcCggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHVpbnQgbGVuICk7CiMg MTQ3ICJxY3N0cmluZy5oIgogICAgICAgICBRX1VJTlQxNiBxQ2hlY2tzdW0oIGNvbnN0IGNoYXIg KnMsIHVpbnQgbGVuICk7CiMgMTU2ICJxY3N0cmluZy5oIgp0eXBlZGVmIFFBcnJheTxjaGFyPiBR Qnl0ZUFycmF5OwoKCgoKCgogICAgICAgICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I8PCggUURhdGFT dHJlYW0gJiwgY29uc3QgUUJ5dGVBcnJheSAmICk7CiAgICAgICAgIFFEYXRhU3RyZWFtICZvcGVy YXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRQnl0ZUFycmF5ICYgKTsKIyAxNzMgInFjc3RyaW5nLmgi CmNsYXNzIFFSZWdFeHA7CgpjbGFzcyBRQ1N0cmluZyA6IHB1YmxpYyBRQnl0ZUFycmF5CnsKcHVi bGljOgogICAgUUNTdHJpbmcoKSB7fQogICAgUUNTdHJpbmcoIGludCBzaXplICk7CiAgICBRQ1N0 cmluZyggY29uc3QgUUNTdHJpbmcgJnMgKSA6IFFCeXRlQXJyYXkoIHMgKSB7fQogICAgUUNTdHJp bmcoIGNvbnN0IGNoYXIgKnN0ciApOwogICAgUUNTdHJpbmcoIGNvbnN0IGNoYXIgKnN0ciwgdWlu dCBtYXhsZW4gKTsKCiAgICBRQ1N0cmluZyAmb3BlcmF0b3I9KCBjb25zdCBRQ1N0cmluZyAmcyAp OwogICAgUUNTdHJpbmcgJm9wZXJhdG9yPSggY29uc3QgY2hhciAqc3RyICk7CgogICAgYm9vbCBp c051bGwoKSBjb25zdDsKICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0OwogICAgdWludCBsZW5ndGgo KSBjb25zdDsKICAgIGJvb2wgcmVzaXplKCB1aW50IG5ld2xlbiApOwogICAgYm9vbCB0cnVuY2F0 ZSggdWludCBwb3MgKTsKICAgIGJvb2wgZmlsbCggY2hhciBjLCBpbnQgbGVuID0gLTEgKTsKCiAg ICBRQ1N0cmluZyBjb3B5KCkgY29uc3Q7CgogICAgUUNTdHJpbmcgJnNwcmludGYoIGNvbnN0IGNo YXIgKmZvcm1hdCwgLi4uICk7CgogICAgaW50IGZpbmQoIGNoYXIgYywgaW50IGluZGV4PTAsIGJv b2wgY3M9VFJVRSApIGNvbnN0OwogICAgaW50IGZpbmQoIGNvbnN0IGNoYXIgKnN0ciwgaW50IGlu ZGV4PTAsIGJvb2wgY3M9VFJVRSApIGNvbnN0OwogICAgaW50IGZpbmQoIGNvbnN0IFFSZWdFeHAg JiwgaW50IGluZGV4PTAgKSBjb25zdDsKICAgIGludCBmaW5kUmV2KCBjaGFyIGMsIGludCBpbmRl eD0tMSwgYm9vbCBjcz1UUlVFKSBjb25zdDsKICAgIGludCBmaW5kUmV2KCBjb25zdCBjaGFyICpz dHIsIGludCBpbmRleD0tMSwgYm9vbCBjcz1UUlVFKSBjb25zdDsKICAgIGludCBmaW5kUmV2KCBj b25zdCBRUmVnRXhwICYsIGludCBpbmRleD0tMSApIGNvbnN0OwogICAgaW50IGNvbnRhaW5zKCBj aGFyIGMsIGJvb2wgY3M9VFJVRSApIGNvbnN0OwogICAgaW50IGNvbnRhaW5zKCBjb25zdCBjaGFy ICpzdHIsIGJvb2wgY3M9VFJVRSApIGNvbnN0OwogICAgaW50IGNvbnRhaW5zKCBjb25zdCBRUmVn RXhwICYgKSBjb25zdDsKCiAgICBRQ1N0cmluZyBsZWZ0KCB1aW50IGxlbiApIGNvbnN0OwogICAg UUNTdHJpbmcgcmlnaHQoIHVpbnQgbGVuICkgY29uc3Q7CiAgICBRQ1N0cmluZyBtaWQoIHVpbnQg aW5kZXgsIHVpbnQgbGVuPTB4ZmZmZmZmZmYpIGNvbnN0OwoKICAgIFFDU3RyaW5nIGxlZnRKdXN0 aWZ5KCB1aW50IHdpZHRoLCBjaGFyIGZpbGw9JyAnLCBib29sIHRydW5jPUZBTFNFKWNvbnN0Owog ICAgUUNTdHJpbmcgcmlnaHRKdXN0aWZ5KCB1aW50IHdpZHRoLCBjaGFyIGZpbGw9JyAnLGJvb2wg dHJ1bmM9RkFMU0UpY29uc3Q7CgogICAgUUNTdHJpbmcgbG93ZXIoKSBjb25zdDsKICAgIFFDU3Ry aW5nIHVwcGVyKCkgY29uc3Q7CgogICAgUUNTdHJpbmcgc3RyaXBXaGl0ZVNwYWNlKCkgY29uc3Q7 CiAgICBRQ1N0cmluZyBzaW1wbGlmeVdoaXRlU3BhY2UoKSBjb25zdDsKCiAgICBRQ1N0cmluZyAm aW5zZXJ0KCB1aW50IGluZGV4LCBjb25zdCBjaGFyICogKTsKICAgIFFDU3RyaW5nICZpbnNlcnQo IHVpbnQgaW5kZXgsIGNoYXIgKTsKICAgIFFDU3RyaW5nICZhcHBlbmQoIGNvbnN0IGNoYXIgKiAp OwogICAgUUNTdHJpbmcgJnByZXBlbmQoIGNvbnN0IGNoYXIgKiApOwogICAgUUNTdHJpbmcgJnJl bW92ZSggdWludCBpbmRleCwgdWludCBsZW4gKTsKICAgIFFDU3RyaW5nICZyZXBsYWNlKCB1aW50 IGluZGV4LCB1aW50IGxlbiwgY29uc3QgY2hhciAqICk7CiAgICBRQ1N0cmluZyAmcmVwbGFjZSgg Y29uc3QgUVJlZ0V4cCAmLCBjb25zdCBjaGFyICogKTsKCiAgICBzaG9ydCB0b1Nob3J0KCBib29s ICpvaz0wICkgY29uc3Q7CiAgICB1c2hvcnQgdG9VU2hvcnQoIGJvb2wgKm9rPTAgKSBjb25zdDsK ICAgIGludCB0b0ludCggYm9vbCAqb2s9MCApIGNvbnN0OwogICAgdWludCB0b1VJbnQoIGJvb2wg Km9rPTAgKSBjb25zdDsKICAgIGxvbmcgdG9Mb25nKCBib29sICpvaz0wICkgY29uc3Q7CiAgICB1 bG9uZyB0b1VMb25nKCBib29sICpvaz0wICkgY29uc3Q7CiAgICBmbG9hdCB0b0Zsb2F0KCBib29s ICpvaz0wICkgY29uc3Q7CiAgICBkb3VibGUgdG9Eb3VibGUoIGJvb2wgKm9rPTAgKSBjb25zdDsK CiAgICBRQ1N0cmluZyAmc2V0U3RyKCBjb25zdCBjaGFyICpzICk7CiAgICBRQ1N0cmluZyAmc2V0 TnVtKCBzaG9ydCApOwogICAgUUNTdHJpbmcgJnNldE51bSggdXNob3J0ICk7CiAgICBRQ1N0cmlu ZyAmc2V0TnVtKCBpbnQgKTsKICAgIFFDU3RyaW5nICZzZXROdW0oIHVpbnQgKTsKICAgIFFDU3Ry aW5nICZzZXROdW0oIGxvbmcgKTsKICAgIFFDU3RyaW5nICZzZXROdW0oIHVsb25nICk7CiAgICBR Q1N0cmluZyAmc2V0TnVtKCBmbG9hdCwgY2hhciBmPSdnJywgaW50IHByZWM9NiApOwogICAgUUNT dHJpbmcgJnNldE51bSggZG91YmxlLCBjaGFyIGY9J2cnLCBpbnQgcHJlYz02ICk7CgogICAgYm9v bCBzZXRFeHBhbmQoIHVpbnQgaW5kZXgsIGNoYXIgYyApOwoKICAgICAgICAgICAgICAgIG9wZXJh dG9yIGNvbnN0IGNoYXIgKigpIGNvbnN0OwogICAgUUNTdHJpbmcgJm9wZXJhdG9yKz0oIGNvbnN0 IGNoYXIgKnN0ciApOwogICAgUUNTdHJpbmcgJm9wZXJhdG9yKz0oIGNoYXIgYyApOwp9OwoKCgoK CgogICAgICAgICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I8PCggUURhdGFTdHJlYW0gJiwgY29uc3Qg UUNTdHJpbmcgJiApOwogICAgICAgICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I+PiggUURhdGFTdHJl YW0gJiwgUUNTdHJpbmcgJiApOwoKCgoKCgppbmxpbmUgUUNTdHJpbmcgJlFDU3RyaW5nOjpvcGVy YXRvcj0oIGNvbnN0IFFDU3RyaW5nICZzICkKeyByZXR1cm4gKFFDU3RyaW5nJilhc3NpZ24oIHMg KTsgfQoKaW5saW5lIFFDU3RyaW5nICZRQ1N0cmluZzo6b3BlcmF0b3I9KCBjb25zdCBjaGFyICpz dHIgKQp7IHJldHVybiAoUUNTdHJpbmcmKWR1cGxpY2F0ZSggc3RyLCBxc3RybGVuKHN0cikrMSAp OyB9CgppbmxpbmUgYm9vbCBRQ1N0cmluZzo6aXNOdWxsKCkgY29uc3QKeyByZXR1cm4gZGF0YSgp ID09IDA7IH0KCmlubGluZSBib29sIFFDU3RyaW5nOjppc0VtcHR5KCkgY29uc3QKeyByZXR1cm4g ZGF0YSgpID09IDAgfHwgKmRhdGEoKSA9PSAnXDAnOyB9CgppbmxpbmUgdWludCBRQ1N0cmluZzo6 bGVuZ3RoKCkgY29uc3QKeyByZXR1cm4gcXN0cmxlbiggZGF0YSgpICk7IH0KCmlubGluZSBib29s IFFDU3RyaW5nOjp0cnVuY2F0ZSggdWludCBwb3MgKQp7IHJldHVybiByZXNpemUocG9zKzEpOyB9 CgppbmxpbmUgUUNTdHJpbmcgUUNTdHJpbmc6OmNvcHkoKSBjb25zdAp7IHJldHVybiBRQ1N0cmlu ZyggZGF0YSgpICk7IH0KCmlubGluZSBRQ1N0cmluZyAmUUNTdHJpbmc6OnByZXBlbmQoIGNvbnN0 IGNoYXIgKnMgKQp7IHJldHVybiBpbnNlcnQoMCxzKTsgfQoKaW5saW5lIFFDU3RyaW5nICZRQ1N0 cmluZzo6YXBwZW5kKCBjb25zdCBjaGFyICpzICkKeyByZXR1cm4gb3BlcmF0b3IrPShzKTsgfQoK aW5saW5lIFFDU3RyaW5nICZRQ1N0cmluZzo6c2V0TnVtKCBzaG9ydCBuICkKeyByZXR1cm4gc2V0 TnVtKChsb25nKW4pOyB9CgppbmxpbmUgUUNTdHJpbmcgJlFDU3RyaW5nOjpzZXROdW0oIHVzaG9y dCBuICkKeyByZXR1cm4gc2V0TnVtKCh1bG9uZyluKTsgfQoKaW5saW5lIFFDU3RyaW5nICZRQ1N0 cmluZzo6c2V0TnVtKCBpbnQgbiApCnsgcmV0dXJuIHNldE51bSgobG9uZyluKTsgfQoKaW5saW5l IFFDU3RyaW5nICZRQ1N0cmluZzo6c2V0TnVtKCB1aW50IG4gKQp7IHJldHVybiBzZXROdW0oKHVs b25nKW4pOyB9CgppbmxpbmUgUUNTdHJpbmcgJlFDU3RyaW5nOjpzZXROdW0oIGZsb2F0IG4sIGNo YXIgZiwgaW50IHByZWMgKQp7IHJldHVybiBzZXROdW0oKGRvdWJsZSluLGYscHJlYyk7IH0KCmlu bGluZSBRQ1N0cmluZzo6b3BlcmF0b3IgY29uc3QgY2hhciAqKCkgY29uc3QKeyByZXR1cm4gKGNv bnN0IGNoYXIgKilkYXRhKCk7IH0KCgoKCgoKICAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9 PSggY29uc3QgUUNTdHJpbmcgJnMxLCBjb25zdCBRQ1N0cmluZyAmczIgKQp7IHJldHVybiBxc3Ry Y21wKHMxLmRhdGEoKSxzMi5kYXRhKCkpID09IDA7IH0KCiAgICAgICAgIGlubGluZSBib29sIG9w ZXJhdG9yPT0oIGNvbnN0IFFDU3RyaW5nICZzMSwgY29uc3QgY2hhciAqczIgKQp7IHJldHVybiBx c3RyY21wKHMxLmRhdGEoKSxzMikgPT0gMDsgfQoKICAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0 b3I9PSggY29uc3QgY2hhciAqczEsIGNvbnN0IFFDU3RyaW5nICZzMiApCnsgcmV0dXJuIHFzdHJj bXAoczEsczIuZGF0YSgpKSA9PSAwOyB9CgogICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9 KCBjb25zdCBRQ1N0cmluZyAmczEsIGNvbnN0IFFDU3RyaW5nICZzMiApCnsgcmV0dXJuIHFzdHJj bXAoczEuZGF0YSgpLHMyLmRhdGEoKSkgIT0gMDsgfQoKICAgICAgICAgaW5saW5lIGJvb2wgb3Bl cmF0b3IhPSggY29uc3QgUUNTdHJpbmcgJnMxLCBjb25zdCBjaGFyICpzMiApCnsgcmV0dXJuIHFz dHJjbXAoczEuZGF0YSgpLHMyKSAhPSAwOyB9CgogICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRv ciE9KCBjb25zdCBjaGFyICpzMSwgY29uc3QgUUNTdHJpbmcgJnMyICkKeyByZXR1cm4gcXN0cmNt cChzMSxzMi5kYXRhKCkpICE9IDA7IH0KCiAgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPCgg Y29uc3QgUUNTdHJpbmcgJnMxLCBjb25zdCBRQ1N0cmluZyYgczIgKQp7IHJldHVybiBxc3RyY21w KHMxLmRhdGEoKSxzMi5kYXRhKCkpIDwgMDsgfQoKICAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0 b3I8KCBjb25zdCBRQ1N0cmluZyAmczEsIGNvbnN0IGNoYXIgKnMyICkKeyByZXR1cm4gcXN0cmNt cChzMS5kYXRhKCksczIpIDwgMDsgfQoKICAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KCBj b25zdCBjaGFyICpzMSwgY29uc3QgUUNTdHJpbmcgJnMyICkKeyByZXR1cm4gcXN0cmNtcChzMSxz Mi5kYXRhKCkpIDwgMDsgfQoKICAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PSggY29uc3Qg UUNTdHJpbmcgJnMxLCBjb25zdCBjaGFyICpzMiApCnsgcmV0dXJuIHFzdHJjbXAoczEuZGF0YSgp LHMyKSA8PSAwOyB9CgogICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KCBjb25zdCBjaGFy ICpzMSwgY29uc3QgUUNTdHJpbmcgJnMyICkKeyByZXR1cm4gcXN0cmNtcChzMSxzMi5kYXRhKCkp IDw9IDA7IH0KCiAgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPiggY29uc3QgUUNTdHJpbmcg JnMxLCBjb25zdCBjaGFyICpzMiApCnsgcmV0dXJuIHFzdHJjbXAoczEuZGF0YSgpLHMyKSA+IDA7 IH0KCiAgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPiggY29uc3QgY2hhciAqczEsIGNvbnN0 IFFDU3RyaW5nICZzMiApCnsgcmV0dXJuIHFzdHJjbXAoczEsczIuZGF0YSgpKSA+IDA7IH0KCiAg ICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oIGNvbnN0IFFDU3RyaW5nICZzMSwgY29uc3Qg Y2hhciAqczIgKQp7IHJldHVybiBxc3RyY21wKHMxLmRhdGEoKSxzMikgPj0gMDsgfQoKICAgICAg ICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PSggY29uc3QgY2hhciAqczEsIGNvbnN0IFFDU3RyaW5n ICZzMiApCnsgcmV0dXJuIHFzdHJjbXAoczEsczIuZGF0YSgpKSA+PSAwOyB9CgogICAgICAgICBp bmxpbmUgUUNTdHJpbmcgb3BlcmF0b3IrKCBjb25zdCBRQ1N0cmluZyAmczEsIGNvbnN0IFFDU3Ry aW5nICZzMiApCnsKICAgIFFDU3RyaW5nIHRtcCggczEuZGF0YSgpICk7CiAgICB0bXAgKz0gczI7 CiAgICByZXR1cm4gdG1wOwp9CgogICAgICAgICBpbmxpbmUgUUNTdHJpbmcgb3BlcmF0b3IrKCBj b25zdCBRQ1N0cmluZyAmczEsIGNvbnN0IGNoYXIgKnMyICkKewogICAgUUNTdHJpbmcgdG1wKCBz MS5kYXRhKCkgKTsKICAgIHRtcCArPSBzMjsKICAgIHJldHVybiB0bXA7Cn0KCiAgICAgICAgIGlu bGluZSBRQ1N0cmluZyBvcGVyYXRvcisoIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBRQ1N0cmluZyAm czIgKQp7CiAgICBRQ1N0cmluZyB0bXAoIHMxICk7CiAgICB0bXAgKz0gczI7CiAgICByZXR1cm4g dG1wOwp9CgogICAgICAgICBpbmxpbmUgUUNTdHJpbmcgb3BlcmF0b3IrKCBjb25zdCBRQ1N0cmlu ZyAmczEsIGNoYXIgYzIgKQp7CiAgICBRQ1N0cmluZyB0bXAoIHMxLmRhdGEoKSApOwogICAgdG1w ICs9IGMyOwogICAgcmV0dXJuIHRtcDsKfQoKICAgICAgICAgaW5saW5lIFFDU3RyaW5nIG9wZXJh dG9yKyggY2hhciBjMSwgY29uc3QgUUNTdHJpbmcgJnMyICkKewogICAgUUNTdHJpbmcgdG1wOwog ICAgdG1wICs9IGMxOwogICAgdG1wICs9IHMyOwogICAgcmV0dXJuIHRtcDsKfQojIDQ0ICJxc3Ry aW5nLmgiIDIKCgoKCgoKCmNsYXNzIFFSZWdFeHA7CmNsYXNzIFFTdHJpbmc7CmNsYXNzIFFDaGFy UmVmOwoKY2xhc3MgUUNoYXIgewpwdWJsaWM6CiAgICBRQ2hhcigpOwogICAgUUNoYXIoIGNoYXIg YyApOwogICAgUUNoYXIoIHVjaGFyIGMgKTsKICAgIFFDaGFyKCB1Y2hhciBjLCB1Y2hhciByICk7 CiAgICBRQ2hhciggY29uc3QgUUNoYXImIGMgKTsKICAgIFFDaGFyKCB1c2hvcnQgcmMgKTsKICAg IFFDaGFyKCBzaG9ydCByYyApOwogICAgUUNoYXIoIHVpbnQgcmMgKTsKICAgIFFDaGFyKCBpbnQg cmMgKTsKCiAgICBzdGF0aWMgY29uc3QgUUNoYXIgbnVsbDsKICAgIHN0YXRpYyBjb25zdCBRQ2hh ciByZXBsYWNlbWVudDsKICAgIHN0YXRpYyBjb25zdCBRQ2hhciBieXRlT3JkZXJNYXJrOwogICAg c3RhdGljIGNvbnN0IFFDaGFyIGJ5dGVPcmRlclN3YXBwZWQ7CiAgICBzdGF0aWMgY29uc3QgUUNo YXIgbmJzcDsKCgoKICAgIGVudW0gQ2F0ZWdvcnkKICAgIHsKICAgICAgICBOb0NhdGVnb3J5LAoK ICAgICAgICBNYXJrX05vblNwYWNpbmcsCiAgICAgICAgTWFya19TcGFjaW5nQ29tYmluaW5nLAog ICAgICAgIE1hcmtfRW5jbG9zaW5nLAoKICAgICAgICBOdW1iZXJfRGVjaW1hbERpZ2l0LAogICAg ICAgIE51bWJlcl9MZXR0ZXIsCiAgICAgICAgTnVtYmVyX090aGVyLAoKICAgICAgICBTZXBhcmF0 b3JfU3BhY2UsCiAgICAgICAgU2VwYXJhdG9yX0xpbmUsCiAgICAgICAgU2VwYXJhdG9yX1BhcmFn cmFwaCwKCiAgICAgICAgT3RoZXJfQ29udHJvbCwKICAgICAgICBPdGhlcl9Gb3JtYXQsCiAgICAg ICAgT3RoZXJfU3Vycm9nYXRlLAogICAgICAgIE90aGVyX1ByaXZhdGVVc2UsCiAgICAgICAgT3Ro ZXJfTm90QXNzaWduZWQsCgogICAgICAgIExldHRlcl9VcHBlcmNhc2UsCiAgICAgICAgTGV0dGVy X0xvd2VyY2FzZSwKICAgICAgICBMZXR0ZXJfVGl0bGVjYXNlLAogICAgICAgIExldHRlcl9Nb2Rp ZmllciwKICAgICAgICBMZXR0ZXJfT3RoZXIsCgogICAgICAgIFB1bmN0dWF0aW9uX0Nvbm5lY3Rv ciwKICAgICAgICBQdW5jdHVhdGlvbl9EYXNrLAogICAgICAgIFB1bmN0dWF0aW9uX09wZW4sCiAg ICAgICAgUHVuY3R1YXRpb25fQ2xvc2UsCiAgICAgICAgUHVuY3R1YXRpb25fSW5pdGlhbFF1b3Rl LAogICAgICAgIFB1bmN0dWF0aW9uX0ZpbmFsUXVvdGUsCiAgICAgICAgUHVuY3R1YXRpb25fT3Ro ZXIsCgogICAgICAgIFN5bWJvbF9NYXRoLAogICAgICAgIFN5bWJvbF9DdXJyZW5jeSwKICAgICAg ICBTeW1ib2xfTW9kaWZpZXIsCiAgICAgICAgU3ltYm9sX090aGVyCiAgICB9OwoKICAgIGVudW0g RGlyZWN0aW9uCiAgICB7CiAgICAgICAgRGlyTCwgRGlyUiwgRGlyRU4sIERpckVTLCBEaXJFVCwg RGlyQU4sIERpckNTLCBEaXJCLCBEaXJTLCBEaXJXUywgRGlyT04sCiAgICAgICAgRGlyTFJFLCBE aXJMUk8sIERpckFMLCBEaXJSTEUsIERpclJMTywgRGlyUERGLCBEaXJOU00sIERpckJOCiAgICB9 OwoKICAgIGVudW0gRGVjb21wb3NpdGlvbgogICAgewogICAgICAgIFNpbmdsZSwgQ2Fub25pY2Fs LCBGb250LCBOb0JyZWFrLCBJbml0aWFsLCBNZWRpYWwsCiAgICAgICAgRmluYWwsIElzb2xhdGVk LCBDaXJjbGUsIFN1cGVyLCBTdWIsIFZlcnRpY2FsLAogICAgICAgIFdpZGUsIE5hcnJvdywgU21h bGwsIFNxdWFyZSwgQ29tcGF0LCBGcmFjdGlvbgogICAgfTsKCiAgICBlbnVtIEpvaW5pbmcKICAg IHsKICAgICAgICBPdGhlckpvaW5pbmcsIER1YWwsIFJpZ2h0LCBDZW50ZXIKICAgIH07CgoKCiAg ICBpbnQgZGlnaXRWYWx1ZSgpIGNvbnN0OwogICAgUUNoYXIgbG93ZXIoKSBjb25zdDsKICAgIFFD aGFyIHVwcGVyKCkgY29uc3Q7CgogICAgQ2F0ZWdvcnkgY2F0ZWdvcnkoKSBjb25zdDsKICAgIERp cmVjdGlvbiBkaXJlY3Rpb24oKSBjb25zdDsKICAgIEpvaW5pbmcgam9pbmluZygpIGNvbnN0Owog ICAgYm9vbCBtaXJyb3JlZCgpIGNvbnN0OwogICAgUUNoYXIgbWlycm9yZWRDaGFyKCkgY29uc3Q7 CiAgICBRU3RyaW5nIGRlY29tcG9zaXRpb24oKSBjb25zdDsKICAgIERlY29tcG9zaXRpb24gZGVj b21wb3NpdGlvblRhZygpIGNvbnN0OwoKICAgIGNoYXIgbGF0aW4xKCkgY29uc3QgeyByZXR1cm4g cncgPyAwIDogY2w7IH0KICAgIHVzaG9ydCB1bmljb2RlKCkgY29uc3QgeyByZXR1cm4gKHJ3IDw8 IDgpIHwgY2w7IH0KCgogICAgb3BlcmF0b3IgY2hhcigpIGNvbnN0IHsgcmV0dXJuIGxhdGluMSgp OyB9CgoKICAgIGJvb2wgaXNOdWxsKCkgY29uc3QgeyByZXR1cm4gdW5pY29kZSgpPT0wOyB9CiAg ICBib29sIGlzUHJpbnQoKSBjb25zdDsKICAgIGJvb2wgaXNQdW5jdCgpIGNvbnN0OwogICAgYm9v bCBpc1NwYWNlKCkgY29uc3Q7CiAgICBib29sIGlzTWFyaygpIGNvbnN0OwogICAgYm9vbCBpc0xl dHRlcigpIGNvbnN0OwogICAgYm9vbCBpc051bWJlcigpIGNvbnN0OwogICAgYm9vbCBpc0xldHRl ck9yTnVtYmVyKCkgY29uc3Q7CiAgICBib29sIGlzRGlnaXQoKSBjb25zdDsKCiAgICB1Y2hhciYg Y2VsbCgpIHsgcmV0dXJuIGNsOyB9CiAgICB1Y2hhciYgcm93KCkgeyByZXR1cm4gcnc7IH0KICAg IHVjaGFyIGNlbGwoKSBjb25zdCB7IHJldHVybiBjbDsgfQogICAgdWNoYXIgcm93KCkgY29uc3Qg eyByZXR1cm4gcnc7IH0KCiAgICBzdGF0aWMgYm9vbCBuZXR3b3JrT3JkZXJlZCgpIHsgcmV0dXJu IChpbnQpbmV0X29yZGVyZWQgPT0gMTsgfQoKICAgIGZyaWVuZCBpbmxpbmUgaW50IG9wZXJhdG9y PT0oIGNoYXIgY2gsIFFDaGFyIGMgKTsKICAgIGZyaWVuZCBpbmxpbmUgaW50IG9wZXJhdG9yPT0o IFFDaGFyIGMsIGNoYXIgY2ggKTsKICAgIGZyaWVuZCBpbmxpbmUgaW50IG9wZXJhdG9yPT0oIFFD aGFyIGMxLCBRQ2hhciBjMiApOwogICAgZnJpZW5kIGlubGluZSBpbnQgb3BlcmF0b3IhPSggUUNo YXIgYzEsIFFDaGFyIGMyICk7CiAgICBmcmllbmQgaW5saW5lIGludCBvcGVyYXRvciE9KCBjaGFy IGNoLCBRQ2hhciBjICk7CiAgICBmcmllbmQgaW5saW5lIGludCBvcGVyYXRvciE9KCBRQ2hhciBj LCBjaGFyIGNoICk7CiAgICBmcmllbmQgaW5saW5lIGludCBvcGVyYXRvcjw9KCBRQ2hhciBjLCBj aGFyIGNoICk7CiAgICBmcmllbmQgaW5saW5lIGludCBvcGVyYXRvcjw9KCBjaGFyIGNoLCBRQ2hh ciBjICk7CiAgICBmcmllbmQgaW5saW5lIGludCBvcGVyYXRvcjw9KCBRQ2hhciBjMSwgUUNoYXIg YzIgKTsKCnByaXZhdGU6CgoKCiAgICB1Y2hhciBydzsKICAgIHVjaGFyIGNsOwoKCgogICAgZW51 bSB7IG5ldF9vcmRlcmVkID0gMSB9OwojIDIwMiAicXN0cmluZy5oIgp9OwoKaW5saW5lIFFDaGFy OjpRQ2hhcigpCnsKICAgIHJ3ID0gMDsgY2wgPSAwOwoKCgp9CmlubGluZSBRQ2hhcjo6UUNoYXIo IGNoYXIgYyApCnsKICAgIHJ3ID0gMDsgY2wgPSAodWNoYXIpYzsKCgoKfQppbmxpbmUgUUNoYXI6 OlFDaGFyKCB1Y2hhciBjICkKewogICAgcncgPSAwOyBjbCA9IGM7CgoKCn0KaW5saW5lIFFDaGFy OjpRQ2hhciggdWNoYXIgYywgdWNoYXIgciApCnsKICAgIHJ3ID0gcjsgY2wgPSBjOwoKCgp9Cmlu bGluZSBRQ2hhcjo6UUNoYXIoIGNvbnN0IFFDaGFyJiBjICkKewogICAgcncgPSBjLnJ3OyBjbCA9 IGMuY2w7CgoKCn0KaW5saW5lIFFDaGFyOjpRQ2hhciggdXNob3J0IHJjICkKewogICAgcncgPSAo dWNoYXIpKChyYz4+OCkmMHhmZik7IGNsID0gKHVjaGFyKShyYyYweGZmKTsKCgoKfQppbmxpbmUg UUNoYXI6OlFDaGFyKCBzaG9ydCByYyApCnsKICAgIHJ3ID0gKHVjaGFyKSgocmM+PjgpJjB4ZmYp OyBjbCA9ICh1Y2hhcikocmMmMHhmZik7CgoKCn0KaW5saW5lIFFDaGFyOjpRQ2hhciggdWludCBy YyApCnsKICAgIHJ3ID0gKHVjaGFyKSgocmM+PjgpJjB4ZmYpOyBjbCA9ICh1Y2hhcikocmMmMHhm Zik7CgoKCn0KaW5saW5lIFFDaGFyOjpRQ2hhciggaW50IHJjICkKewogICAgcncgPSAodWNoYXIp KChyYz4+OCkmMHhmZik7IGNsID0gKHVjaGFyKShyYyYweGZmKTsKCgoKfQoKCmlubGluZSBpbnQg b3BlcmF0b3I9PSggY2hhciBjaCwgUUNoYXIgYyApCnsKICAgIHJldHVybiBjaCA9PSBjLmNsICYm ICFjLnJ3Owp9CgppbmxpbmUgaW50IG9wZXJhdG9yPT0oIFFDaGFyIGMsIGNoYXIgY2ggKQp7CiAg ICByZXR1cm4gY2ggPT0gYy5jbCAmJiAhYy5ydzsKfQoKaW5saW5lIGludCBvcGVyYXRvcj09KCBR Q2hhciBjMSwgUUNoYXIgYzIgKQp7CiAgICByZXR1cm4gYzEuY2wgPT0gYzIuY2wKICAgICAgICAm JiBjMS5ydyA9PSBjMi5ydzsKfQoKaW5saW5lIGludCBvcGVyYXRvciE9KCBRQ2hhciBjMSwgUUNo YXIgYzIgKQp7CiAgICByZXR1cm4gYzEuY2wgIT0gYzIuY2wKICAgICAgICB8fCBjMS5ydyAhPSBj Mi5ydzsKfQoKaW5saW5lIGludCBvcGVyYXRvciE9KCBjaGFyIGNoLCBRQ2hhciBjICkKewogICAg cmV0dXJuIGNoICE9IGMuY2wgfHwgYy5ydzsKfQoKaW5saW5lIGludCBvcGVyYXRvciE9KCBRQ2hh ciBjLCBjaGFyIGNoICkKewogICAgcmV0dXJuIGNoICE9IGMuY2wgfHwgYy5ydzsKfQoKaW5saW5l IGludCBvcGVyYXRvcjw9KCBRQ2hhciBjLCBjaGFyIGNoICkKewogICAgcmV0dXJuICEoY2ggPCBj LmNsIHx8IGMucncpOwp9CgppbmxpbmUgaW50IG9wZXJhdG9yPD0oIGNoYXIgY2gsIFFDaGFyIGMg KQp7CiAgICByZXR1cm4gY2ggPD0gYy5jbCB8fCBjLnJ3Owp9CgppbmxpbmUgaW50IG9wZXJhdG9y PD0oIFFDaGFyIGMxLCBRQ2hhciBjMiApCnsKICAgIHJldHVybiBjMS5ydyA+IGMyLnJ3CiAgICAg ICAgPyBGQUxTRQogICAgICAgIDogYzEucncgPCBjMi5ydwogICAgICAgICAgICA/IFRSVUUKICAg ICAgICAgICAgOiBjMS5jbCA8PSBjMi5jbDsKfQoKaW5saW5lIGludCBvcGVyYXRvcj49KCBRQ2hh ciBjLCBjaGFyIGNoICkgeyByZXR1cm4gY2ggPD0gYzsgfQppbmxpbmUgaW50IG9wZXJhdG9yPj0o IGNoYXIgY2gsIFFDaGFyIGMgKSB7IHJldHVybiBjIDw9IGNoOyB9CmlubGluZSBpbnQgb3BlcmF0 b3I+PSggUUNoYXIgYzEsIFFDaGFyIGMyICkgeyByZXR1cm4gYzIgPD0gYzE7IH0KaW5saW5lIGlu dCBvcGVyYXRvcjwoIFFDaGFyIGMsIGNoYXIgY2ggKSB7IHJldHVybiAhKGNoPD1jKTsgfQppbmxp bmUgaW50IG9wZXJhdG9yPCggY2hhciBjaCwgUUNoYXIgYyApIHsgcmV0dXJuICEoYzw9Y2gpOyB9 CmlubGluZSBpbnQgb3BlcmF0b3I8KCBRQ2hhciBjMSwgUUNoYXIgYzIgKSB7IHJldHVybiAhKGMy PD1jMSk7IH0KaW5saW5lIGludCBvcGVyYXRvcj4oIFFDaGFyIGMsIGNoYXIgY2ggKSB7IHJldHVy biAhKGNoPj1jKTsgfQppbmxpbmUgaW50IG9wZXJhdG9yPiggY2hhciBjaCwgUUNoYXIgYyApIHsg cmV0dXJuICEoYz49Y2gpOyB9CmlubGluZSBpbnQgb3BlcmF0b3I+KCBRQ2hhciBjMSwgUUNoYXIg YzIgKSB7IHJldHVybiAhKGMyPj1jMSk7IH0KCgpzdHJ1Y3QgUVN0cmluZ0RhdGEgOiBwdWJsaWMg UVNoYXJlZCB7CiAgICBRU3RyaW5nRGF0YSgpIDoKICAgICAgICB1bmljb2RlKDApLCBhc2NpaSgw KSwgbGVuKDApLCBtYXhsKDApLCBkaXJ0eWFzY2lpKDApIHsgcmVmKCk7IH0KICAgIFFTdHJpbmdE YXRhKFFDaGFyICp1LCB1aW50IGwsIHVpbnQgbSkgOgogICAgICAgIHVuaWNvZGUodSksIGFzY2lp KDApLCBsZW4obCksIG1heGwobSksIGRpcnR5YXNjaWkoMCkgeyB9CgogICAgflFTdHJpbmdEYXRh KCkgeyBpZiAoIHVuaWNvZGUgKSBkZWxldGVbXSAoKGNoYXIqKXVuaWNvZGUpOwogICAgICAgICAg ICAgICAgICAgICBpZiAoIGFzY2lpICkgZGVsZXRlW10gYXNjaWk7IH0KCiAgICB2b2lkIGRlbGV0 ZVNlbGYoKTsKICAgIFFDaGFyICp1bmljb2RlOwogICAgY2hhciAqYXNjaWk7CiAgICB1aW50IGxl bjsKICAgIHVpbnQgbWF4bDozMDsKICAgIHVpbnQgZGlydHlhc2NpaToxOwp9OwoKCmNsYXNzIFFT dHJpbmcKewpwdWJsaWM6CiAgICBRU3RyaW5nKCk7CiAgICBRU3RyaW5nKCBRQ2hhciApOwogICAg UVN0cmluZyggY29uc3QgUVN0cmluZyAmICk7CiAgICBRU3RyaW5nKCBjb25zdCBRQnl0ZUFycmF5 JiApOwogICAgUVN0cmluZyggY29uc3QgUUNoYXIqIHVuaWNvZGUsIHVpbnQgbGVuZ3RoICk7Cgog ICAgUVN0cmluZyggY29uc3QgY2hhciAqc3RyICk7CgogICAgflFTdHJpbmcoKTsKCiAgICBRU3Ry aW5nICZvcGVyYXRvcj0oIGNvbnN0IFFTdHJpbmcgJiApOwoKICAgIFFTdHJpbmcgJm9wZXJhdG9y PSggY29uc3QgY2hhciAqICk7CgogICAgUVN0cmluZyAmb3BlcmF0b3I9KCBjb25zdCBRQ1N0cmlu ZyYgKTsKICAgIFFTdHJpbmcgJm9wZXJhdG9yPSggUUNoYXIgYyApOwogICAgUVN0cmluZyAmb3Bl cmF0b3I9KCBjaGFyIGMgKTsKCiAgICBzdGF0aWMgY29uc3QgUVN0cmluZyBudWxsOwoKICAgIGJv b2wgaXNOdWxsKCkgY29uc3Q7CiAgICBib29sIGlzRW1wdHkoKSBjb25zdDsKICAgIHVpbnQgbGVu Z3RoKCkgY29uc3Q7CiAgICB2b2lkIHRydW5jYXRlKCB1aW50IHBvcyApOwoKCgoKICAgIHZvaWQg ZmlsbCggUUNoYXIgYywgaW50IGxlbiA9IC0xICk7CgogICAgUVN0cmluZyBjb3B5KCkgY29uc3Q7 CgogICAgUVN0cmluZyBhcmcobG9uZyBhLCBpbnQgZmllbGR3aWR0aD0wLCBpbnQgYmFzZT0xMCkg Y29uc3Q7CiAgICBRU3RyaW5nIGFyZyh1bG9uZyBhLCBpbnQgZmllbGR3aWR0aD0wLCBpbnQgYmFz ZT0xMCkgY29uc3Q7CiAgICBRU3RyaW5nIGFyZyhpbnQgYSwgaW50IGZpZWxkd2lkdGg9MCwgaW50 IGJhc2U9MTApIGNvbnN0OwogICAgUVN0cmluZyBhcmcodWludCBhLCBpbnQgZmllbGR3aWR0aD0w LCBpbnQgYmFzZT0xMCkgY29uc3Q7CiAgICBRU3RyaW5nIGFyZyhzaG9ydCBhLCBpbnQgZmllbGR3 aWR0aD0wLCBpbnQgYmFzZT0xMCkgY29uc3Q7CiAgICBRU3RyaW5nIGFyZyh1c2hvcnQgYSwgaW50 IGZpZWxkd2lkdGg9MCwgaW50IGJhc2U9MTApIGNvbnN0OwogICAgUVN0cmluZyBhcmcoY2hhciBh LCBpbnQgZmllbGR3aWR0aD0wKSBjb25zdDsKICAgIFFTdHJpbmcgYXJnKFFDaGFyIGEsIGludCBm aWVsZHdpZHRoPTApIGNvbnN0OwogICAgUVN0cmluZyBhcmcoY29uc3QgUVN0cmluZyYgYSwgaW50 IGZpZWxkd2lkdGg9MCkgY29uc3Q7CiAgICBRU3RyaW5nIGFyZyhkb3VibGUgYSwgaW50IGZpZWxk d2lkdGg9MCwgY2hhciBmbXQ9J2cnLCBpbnQgcHJlYz0tMSkgY29uc3Q7CgogICAgUVN0cmluZyAm c3ByaW50ZiggY29uc3QgY2hhciogZm9ybWF0LCAuLi4gKQoKICAgICAgICBfX2F0dHJpYnV0ZV9f ICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSkKCiAgICAgICAgOwoKICAgIGludCBmaW5kKCBRQ2hh ciBjLCBpbnQgaW5kZXg9MCwgYm9vbCBjcz1UUlVFICkgY29uc3Q7CiAgICBpbnQgZmluZCggY2hh ciBjLCBpbnQgaW5kZXg9MCwgYm9vbCBjcz1UUlVFICkgY29uc3Q7CiAgICBpbnQgZmluZCggY29u c3QgUVN0cmluZyAmc3RyLCBpbnQgaW5kZXg9MCwgYm9vbCBjcz1UUlVFICkgY29uc3Q7CiAgICBp bnQgZmluZCggY29uc3QgUVJlZ0V4cCAmLCBpbnQgaW5kZXg9MCApIGNvbnN0OwoKICAgIGludCBm aW5kKCBjb25zdCBjaGFyKiBzdHIsIGludCBpbmRleD0wICkgY29uc3Q7CgogICAgaW50IGZpbmRS ZXYoIFFDaGFyIGMsIGludCBpbmRleD0tMSwgYm9vbCBjcz1UUlVFKSBjb25zdDsKICAgIGludCBm aW5kUmV2KCBjaGFyIGMsIGludCBpbmRleD0tMSwgYm9vbCBjcz1UUlVFKSBjb25zdDsKICAgIGlu dCBmaW5kUmV2KCBjb25zdCBRU3RyaW5nICZzdHIsIGludCBpbmRleD0tMSwgYm9vbCBjcz1UUlVF KSBjb25zdDsKICAgIGludCBmaW5kUmV2KCBjb25zdCBRUmVnRXhwICYsIGludCBpbmRleD0tMSAp IGNvbnN0OwoKICAgIGludCBmaW5kUmV2KCBjb25zdCBjaGFyKiBzdHIsIGludCBpbmRleD0tMSAp IGNvbnN0OwoKICAgIGludCBjb250YWlucyggUUNoYXIgYywgYm9vbCBjcz1UUlVFICkgY29uc3Q7 CiAgICBpbnQgY29udGFpbnMoIGNoYXIgYywgYm9vbCBjcz1UUlVFICkgY29uc3QKICAgICAgICAg ICAgICAgICAgICB7IHJldHVybiBjb250YWlucyhRQ2hhcihjKSwgY3MpOyB9CgogICAgaW50IGNv bnRhaW5zKCBjb25zdCBjaGFyKiBzdHIsIGJvb2wgY3M9VFJVRSApIGNvbnN0OwoKICAgIGludCBj b250YWlucyggY29uc3QgUVN0cmluZyAmc3RyLCBib29sIGNzPVRSVUUgKSBjb25zdDsKICAgIGlu dCBjb250YWlucyggY29uc3QgUVJlZ0V4cCAmICkgY29uc3Q7CgogICAgUVN0cmluZyBsZWZ0KCB1 aW50IGxlbiApIGNvbnN0OwogICAgUVN0cmluZyByaWdodCggdWludCBsZW4gKSBjb25zdDsKICAg IFFTdHJpbmcgbWlkKCB1aW50IGluZGV4LCB1aW50IGxlbj0weGZmZmZmZmZmKSBjb25zdDsKCiAg ICBRU3RyaW5nIGxlZnRKdXN0aWZ5KCB1aW50IHdpZHRoLCBRQ2hhciBmaWxsPScgJywgYm9vbCB0 cnVuYz1GQUxTRSljb25zdDsKICAgIFFTdHJpbmcgcmlnaHRKdXN0aWZ5KCB1aW50IHdpZHRoLCBR Q2hhciBmaWxsPScgJyxib29sIHRydW5jPUZBTFNFKWNvbnN0OwoKICAgIFFTdHJpbmcgbG93ZXIo KSBjb25zdDsKICAgIFFTdHJpbmcgdXBwZXIoKSBjb25zdDsKCiAgICBRU3RyaW5nIHN0cmlwV2hp dGVTcGFjZSgpIGNvbnN0OwogICAgUVN0cmluZyBzaW1wbGlmeVdoaXRlU3BhY2UoKSBjb25zdDsK CiAgICBRU3RyaW5nICZpbnNlcnQoIHVpbnQgaW5kZXgsIGNvbnN0IFFTdHJpbmcgJiApOwogICAg UVN0cmluZyAmaW5zZXJ0KCB1aW50IGluZGV4LCBjb25zdCBRQ2hhciosIHVpbnQgbGVuICk7CiAg ICBRU3RyaW5nICZpbnNlcnQoIHVpbnQgaW5kZXgsIFFDaGFyICk7CiAgICBRU3RyaW5nICZpbnNl cnQoIHVpbnQgaW5kZXgsIGNoYXIgYyApIHsgcmV0dXJuIGluc2VydChpbmRleCxRQ2hhcihjKSk7 IH0KICAgIFFTdHJpbmcgJmFwcGVuZCggY2hhciApOwogICAgUVN0cmluZyAmYXBwZW5kKCBRQ2hh ciApOwogICAgUVN0cmluZyAmYXBwZW5kKCBjb25zdCBRU3RyaW5nICYgKTsKICAgIFFTdHJpbmcg JnByZXBlbmQoIGNoYXIgKTsKICAgIFFTdHJpbmcgJnByZXBlbmQoIFFDaGFyICk7CiAgICBRU3Ry aW5nICZwcmVwZW5kKCBjb25zdCBRU3RyaW5nICYgKTsKICAgIFFTdHJpbmcgJnJlbW92ZSggdWlu dCBpbmRleCwgdWludCBsZW4gKTsKICAgIFFTdHJpbmcgJnJlcGxhY2UoIHVpbnQgaW5kZXgsIHVp bnQgbGVuLCBjb25zdCBRU3RyaW5nICYgKTsKICAgIFFTdHJpbmcgJnJlcGxhY2UoIHVpbnQgaW5k ZXgsIHVpbnQgbGVuLCBjb25zdCBRQ2hhciosIHVpbnQgY2xlbiApOwogICAgUVN0cmluZyAmcmVw bGFjZSggY29uc3QgUVJlZ0V4cCAmLCBjb25zdCBRU3RyaW5nICYgKTsKCiAgICBzaG9ydCB0b1No b3J0KCBib29sICpvaz0wLCBpbnQgYmFzZT0xMCApIGNvbnN0OwogICAgdXNob3J0IHRvVVNob3J0 KCBib29sICpvaz0wLCBpbnQgYmFzZT0xMCApIGNvbnN0OwogICAgaW50IHRvSW50KCBib29sICpv az0wLCBpbnQgYmFzZT0xMCApIGNvbnN0OwogICAgdWludCB0b1VJbnQoIGJvb2wgKm9rPTAsIGlu dCBiYXNlPTEwICkgY29uc3Q7CiAgICBsb25nIHRvTG9uZyggYm9vbCAqb2s9MCwgaW50IGJhc2U9 MTAgKSBjb25zdDsKICAgIHVsb25nIHRvVUxvbmcoIGJvb2wgKm9rPTAsIGludCBiYXNlPTEwICkg Y29uc3Q7CiAgICBmbG9hdCB0b0Zsb2F0KCBib29sICpvaz0wICkgY29uc3Q7CiAgICBkb3VibGUg dG9Eb3VibGUoIGJvb2wgKm9rPTAgKSBjb25zdDsKCiAgICBRU3RyaW5nICZzZXROdW0oIHNob3J0 LCBpbnQgYmFzZT0xMCApOwogICAgUVN0cmluZyAmc2V0TnVtKCB1c2hvcnQsIGludCBiYXNlPTEw ICk7CiAgICBRU3RyaW5nICZzZXROdW0oIGludCwgaW50IGJhc2U9MTAgKTsKICAgIFFTdHJpbmcg JnNldE51bSggdWludCwgaW50IGJhc2U9MTAgKTsKICAgIFFTdHJpbmcgJnNldE51bSggbG9uZywg aW50IGJhc2U9MTAgKTsKICAgIFFTdHJpbmcgJnNldE51bSggdWxvbmcsIGludCBiYXNlPTEwICk7 CiAgICBRU3RyaW5nICZzZXROdW0oIGZsb2F0LCBjaGFyIGY9J2cnLCBpbnQgcHJlYz02ICk7CiAg ICBRU3RyaW5nICZzZXROdW0oIGRvdWJsZSwgY2hhciBmPSdnJywgaW50IHByZWM9NiApOwoKICAg IHN0YXRpYyBRU3RyaW5nIG51bWJlciggbG9uZywgaW50IGJhc2U9MTAgKTsKICAgIHN0YXRpYyBR U3RyaW5nIG51bWJlciggdWxvbmcsIGludCBiYXNlPTEwKTsKICAgIHN0YXRpYyBRU3RyaW5nIG51 bWJlciggaW50LCBpbnQgYmFzZT0xMCApOwogICAgc3RhdGljIFFTdHJpbmcgbnVtYmVyKCB1aW50 LCBpbnQgYmFzZT0xMCk7CiAgICBzdGF0aWMgUVN0cmluZyBudW1iZXIoIGRvdWJsZSwgY2hhciBm PSdnJywgaW50IHByZWM9NiApOwoKICAgIHZvaWQgc2V0RXhwYW5kKCB1aW50IGluZGV4LCBRQ2hh ciBjICk7CgogICAgUVN0cmluZyAmb3BlcmF0b3IrPSggY29uc3QgUVN0cmluZyAmc3RyICk7CiAg ICBRU3RyaW5nICZvcGVyYXRvcis9KCBRQ2hhciBjICk7CiAgICBRU3RyaW5nICZvcGVyYXRvcis9 KCBjaGFyIGMgKTsKCgogICAgUUNoYXIgYXQoIHVpbnQgaSApIGNvbnN0CiAgICAgICAgeyByZXR1 cm4gaTxkLT5sZW4gPyBkLT51bmljb2RlW2ldIDogUUNoYXI6Om51bGw7IH0KICAgIFFDaGFyIG9w ZXJhdG9yW10oIGludCBpICkgY29uc3QgeyByZXR1cm4gYXQoKHVpbnQpaSk7IH0KICAgIFFDaGFy UmVmIGF0KCB1aW50IGkgKTsKICAgIFFDaGFyUmVmIG9wZXJhdG9yW10oIGludCBpICk7CgogICAg UUNoYXIgY29uc3RyZWYodWludCBpKSBjb25zdAogICAgICAgIHsgcmV0dXJuIGF0KGkpOyB9CiAg ICBRQ2hhciYgcmVmKHVpbnQgaSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChkLT5jb3VudCE9 MSB8fCBpPj1kLT5sZW4pCiAgICAgICAgICAgICAgICBzdWJhdChpKTsKICAgICAgICAgICAgZC0+ ZGlydHlhc2NpaT0xOwogICAgICAgICAgICByZXR1cm4gZC0+dW5pY29kZVtpXTsKICAgICAgICB9 CgogICAgY29uc3QgUUNoYXIqIHVuaWNvZGUoKSBjb25zdCB7IHJldHVybiBkLT51bmljb2RlOyB9 CiAgICBjb25zdCBjaGFyKiBhc2NpaSgpIGNvbnN0OwogICAgY29uc3QgY2hhciogbGF0aW4xKCkg Y29uc3Q7CiAgICBzdGF0aWMgUVN0cmluZyBmcm9tTGF0aW4xKGNvbnN0IGNoYXIqLCBpbnQgbGVu PS0xKTsKCiAgICBRQ1N0cmluZyB1dGY4KCkgY29uc3Q7CiAgICBzdGF0aWMgUVN0cmluZyBmcm9t VXRmOChjb25zdCBjaGFyKiwgaW50IGxlbj0tMSk7CgogICAgUUNTdHJpbmcgbG9jYWw4Qml0KCkg Y29uc3Q7CiAgICBzdGF0aWMgUVN0cmluZyBmcm9tTG9jYWw4Qml0KGNvbnN0IGNoYXIqLCBpbnQg bGVuPS0xKTsKICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3Q7CgogICAgb3BlcmF0b3IgY29uc3Qg Y2hhciAqKCkgY29uc3QgeyByZXR1cm4gbGF0aW4xKCk7IH0KCgogICAgUVN0cmluZyAmc2V0VW5p Y29kZSggY29uc3QgUUNoYXIqIHVuaWNvZGUsIHVpbnQgbGVuICk7CiAgICBRU3RyaW5nICZzZXRV bmljb2RlQ29kZXMoIGNvbnN0IHVzaG9ydCogdW5pY29kZV9hc191c2hvcnRzLCB1aW50IGxlbiAp OwogICAgUVN0cmluZyAmc2V0TGF0aW4xKCBjb25zdCBjaGFyKiwgaW50IGxlbj0tMSApOwoKICAg IGludCBjb21wYXJlKCBjb25zdCBRU3RyaW5nJiBzICkgY29uc3Q7CiAgICBzdGF0aWMgaW50IGNv bXBhcmUoIGNvbnN0IFFTdHJpbmcmIHMxLCBjb25zdCBRU3RyaW5nJiBzMiApCiAgICAgICAgeyBy ZXR1cm4gczEuY29tcGFyZShzMik7IH0KCgogICAgZnJpZW5kIFFEYXRhU3RyZWFtICZvcGVyYXRv cj4+KCBRRGF0YVN0cmVhbSAmLCBRU3RyaW5nICYgKTsKCgogICAgdm9pZCBjb21wb3NlKCk7CiAg ICBRQ2hhcjo6RGlyZWN0aW9uIGJhc2ljRGlyZWN0aW9uKCk7CiAgICBRU3RyaW5nIHZpc3VhbChp bnQgaW5kZXggPSAwLCBpbnQgbGVuID0gLTEpOwoKCiAgICBjb25zdCBjaGFyKiBkYXRhKCkgY29u c3QgeyByZXR1cm4gbGF0aW4xKCk7IH0KCgogICAgYm9vbCBzdGFydHNXaXRoKCBjb25zdCBRU3Ry aW5nJiApIGNvbnN0OwoKcHJpdmF0ZToKICAgIFFTdHJpbmcoIGludCBzaXplLCBib29sIGR1bW15 ICk7CgogICAgdm9pZCBkZXJlZigpOwogICAgdm9pZCByZWFsX2RldGFjaCgpOwogICAgdm9pZCBz ZXRMZW5ndGgoIHVpbnQgcG9zICk7CiAgICB2b2lkIHN1YmF0KCB1aW50ICk7CiAgICBib29sIGZp bmRBcmcoaW50JiBwb3MsIGludCYgbGVuKSBjb25zdDsKCiAgICBzdGF0aWMgUUNoYXIqIGFzY2lp VG9Vbmljb2RlKCBjb25zdCBjaGFyKiwgdWludCAqIGxlbiwgdWludCBtYXhsZW49KHVpbnQpLTEg KTsKICAgIHN0YXRpYyBRQ2hhciogYXNjaWlUb1VuaWNvZGUoIGNvbnN0IFFCeXRlQXJyYXkmLCB1 aW50ICogbGVuICk7CiAgICBzdGF0aWMgY2hhciogdW5pY29kZVRvQXNjaWkoIGNvbnN0IFFDaGFy KiwgdWludCBsZW4gKTsKCiAgICBRU3RyaW5nRGF0YSAqZDsKICAgIHN0YXRpYyBRU3RyaW5nRGF0 YSogc2hhcmVkX251bGw7CiAgICBzdGF0aWMgUVN0cmluZ0RhdGEqIG1ha2VTaGFyZWROdWxsKCk7 CgogICAgZnJpZW5kIGNsYXNzIFFDb25zdFN0cmluZzsKICAgIFFTdHJpbmcoUVN0cmluZ0RhdGEq IGRkLCBib29sICkgOiBkKGRkKSB7IH0KfTsKCmNsYXNzIFFDaGFyUmVmIHsKICAgIGZyaWVuZCBj bGFzcyBRU3RyaW5nOwogICAgUVN0cmluZyYgczsKICAgIHVpbnQgcDsKICAgIFFDaGFyUmVmKFFT dHJpbmcqIHN0ciwgdWludCBwb3MpIDogcygqc3RyKSwgcChwb3MpIHsgfQoKcHVibGljOgoKCgoK ICAgIHVzaG9ydCB1bmljb2RlKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS51bmljb2Rl KCk7IH0KICAgIGNoYXIgbGF0aW4xKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS5sYXRp bjEoKTsgfQoKCiAgICBRQ2hhclJlZiBvcGVyYXRvcj0oY2hhciBjICkgeyBzLnJlZihwKT1jOyBy ZXR1cm4gKnRoaXM7IH0KICAgIFFDaGFyUmVmIG9wZXJhdG9yPSh1Y2hhciBjICkgeyBzLnJlZihw KT1jOyByZXR1cm4gKnRoaXM7IH0KICAgIFFDaGFyUmVmIG9wZXJhdG9yPShRQ2hhciBjICkgeyBz LnJlZihwKT1jOyByZXR1cm4gKnRoaXM7IH0KICAgIFFDaGFyUmVmIG9wZXJhdG9yPShjb25zdCBR Q2hhclJlZiYgYyApIHsgcy5yZWYocCk9Yy51bmljb2RlKCk7IHJldHVybiAqdGhpczsgfQogICAg UUNoYXJSZWYgb3BlcmF0b3I9KHVzaG9ydCByYyApIHsgcy5yZWYocCk9cmM7IHJldHVybiAqdGhp czsgfQogICAgUUNoYXJSZWYgb3BlcmF0b3I9KHNob3J0IHJjICkgeyBzLnJlZihwKT1yYzsgcmV0 dXJuICp0aGlzOyB9CiAgICBRQ2hhclJlZiBvcGVyYXRvcj0odWludCByYyApIHsgcy5yZWYocCk9 cmM7IHJldHVybiAqdGhpczsgfQogICAgUUNoYXJSZWYgb3BlcmF0b3I9KGludCByYyApIHsgcy5y ZWYocCk9cmM7IHJldHVybiAqdGhpczsgfQoKICAgIG9wZXJhdG9yIFFDaGFyICgpIGNvbnN0IHsg cmV0dXJuIHMuY29uc3RyZWYocCk7IH0KCgogICAgYm9vbCBpc051bGwoKSBjb25zdCB7IHJldHVy biB1bmljb2RlKCk9PTA7IH0KICAgIGJvb2wgaXNQcmludCgpIGNvbnN0IHsgcmV0dXJuIHMuY29u c3RyZWYocCkuaXNQcmludCgpOyB9CiAgICBib29sIGlzUHVuY3QoKSBjb25zdCB7IHJldHVybiBz LmNvbnN0cmVmKHApLmlzUHVuY3QoKTsgfQogICAgYm9vbCBpc1NwYWNlKCkgY29uc3QgeyByZXR1 cm4gcy5jb25zdHJlZihwKS5pc1NwYWNlKCk7IH0KICAgIGJvb2wgaXNNYXJrKCkgY29uc3QgeyBy ZXR1cm4gcy5jb25zdHJlZihwKS5pc01hcmsoKTsgfQogICAgYm9vbCBpc0xldHRlcigpIGNvbnN0 IHsgcmV0dXJuIHMuY29uc3RyZWYocCkuaXNMZXR0ZXIoKTsgfQogICAgYm9vbCBpc051bWJlcigp IGNvbnN0IHsgcmV0dXJuIHMuY29uc3RyZWYocCkuaXNOdW1iZXIoKTsgfQogICAgYm9vbCBpc0xl dHRlck9yTnVtYmVyKCkgeyByZXR1cm4gcy5jb25zdHJlZihwKS5pc0xldHRlck9yTnVtYmVyKCk7 IH0KICAgIGJvb2wgaXNEaWdpdCgpIGNvbnN0IHsgcmV0dXJuIHMuY29uc3RyZWYocCkuaXNEaWdp dCgpOyB9CgogICAgaW50IGRpZ2l0VmFsdWUoKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHAp LmRpZ2l0VmFsdWUoKTsgfQogICAgUUNoYXIgbG93ZXIoKSB7IHJldHVybiBzLmNvbnN0cmVmKHAp Lmxvd2VyKCk7IH0KICAgIFFDaGFyIHVwcGVyKCkgeyByZXR1cm4gcy5jb25zdHJlZihwKS51cHBl cigpOyB9CgogICAgUUNoYXI6OkNhdGVnb3J5IGNhdGVnb3J5KCkgY29uc3QgeyByZXR1cm4gcy5j b25zdHJlZihwKS5jYXRlZ29yeSgpOyB9CiAgICBRQ2hhcjo6RGlyZWN0aW9uIGRpcmVjdGlvbigp IGNvbnN0IHsgcmV0dXJuIHMuY29uc3RyZWYocCkuZGlyZWN0aW9uKCk7IH0KICAgIFFDaGFyOjpK b2luaW5nIGpvaW5pbmcoKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLmpvaW5pbmcoKTsg fQogICAgYm9vbCBtaXJyb3JlZCgpIGNvbnN0IHsgcmV0dXJuIHMuY29uc3RyZWYocCkubWlycm9y ZWQoKTsgfQogICAgUUNoYXIgbWlycm9yZWRDaGFyKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJl ZihwKS5taXJyb3JlZENoYXIoKTsgfQogICAgUVN0cmluZyBkZWNvbXBvc2l0aW9uKCkgY29uc3Qg eyByZXR1cm4gcy5jb25zdHJlZihwKS5kZWNvbXBvc2l0aW9uKCk7IH0KICAgIFFDaGFyOjpEZWNv bXBvc2l0aW9uIGRlY29tcG9zaXRpb25UYWcoKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHAp LmRlY29tcG9zaXRpb25UYWcoKTsgfQoKCiAgICB1Y2hhciBjZWxsKCkgY29uc3QgeyByZXR1cm4g cy5jb25zdHJlZihwKS5jZWxsKCk7IH0KICAgIHVjaGFyIHJvdygpIGNvbnN0IHsgcmV0dXJuIHMu Y29uc3RyZWYocCkucm93KCk7IH0KCn07CgppbmxpbmUgUUNoYXJSZWYgUVN0cmluZzo6YXQoIHVp bnQgaSApIHsgcmV0dXJuIFFDaGFyUmVmKHRoaXMsaSk7IH0KaW5saW5lIFFDaGFyUmVmIFFTdHJp bmc6Om9wZXJhdG9yW10oIGludCBpICkgeyByZXR1cm4gYXQoKHVpbnQpaSk7IH0KCgpjbGFzcyBR Q29uc3RTdHJpbmcgOiBwcml2YXRlIFFTdHJpbmcgewpwdWJsaWM6CiAgICBRQ29uc3RTdHJpbmco IFFDaGFyKiB1bmljb2RlLCB1aW50IGxlbmd0aCApOwogICAgflFDb25zdFN0cmluZygpOwogICAg Y29uc3QgUVN0cmluZyYgc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gKnRoaXM7IH0KfTsKCgoKCgoK ICAgICAgICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFEYXRhU3RyZWFtICYsIGNvbnN0IFFT dHJpbmcgJiApOwogICAgICAgICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I+PiggUURhdGFTdHJlYW0g JiwgUVN0cmluZyAmICk7CiMgNjQxICJxc3RyaW5nLmgiCmlubGluZSBRU3RyaW5nOjpRU3RyaW5n KCkgOgogICAgZChzaGFyZWRfbnVsbCA/IHNoYXJlZF9udWxsIDogbWFrZVNoYXJlZE51bGwoKSkK ewogICAgZC0+cmVmKCk7Cn0KCmlubGluZSBRU3RyaW5nOjp+UVN0cmluZygpCnsKICAgIGlmICgg ZC0+ZGVyZWYoKSApIHsKICAgICAgICBpZiAoIGQgPT0gc2hhcmVkX251bGwgKQogICAgICAgICAg ICBzaGFyZWRfbnVsbCA9IDA7CiAgICAgICAgZC0+ZGVsZXRlU2VsZigpOwogICAgfQp9Cgppbmxp bmUgUVN0cmluZyAmUVN0cmluZzo6b3BlcmF0b3I9KCBRQ2hhciBjICkKeyByZXR1cm4gKnRoaXMg PSBRU3RyaW5nKGMpOyB9CgppbmxpbmUgUVN0cmluZyAmUVN0cmluZzo6b3BlcmF0b3I9KCBjaGFy IGMgKQp7IHJldHVybiAqdGhpcyA9IFFTdHJpbmcoUUNoYXIoYykpOyB9CgppbmxpbmUgYm9vbCBR U3RyaW5nOjppc051bGwoKSBjb25zdAp7IHJldHVybiB1bmljb2RlKCkgPT0gMDsgfQoKaW5saW5l IGJvb2wgUVN0cmluZzo6b3BlcmF0b3IhKCkgY29uc3QKeyByZXR1cm4gaXNOdWxsKCk7IH0KCmlu bGluZSB1aW50IFFTdHJpbmc6Omxlbmd0aCgpIGNvbnN0CnsgcmV0dXJuIGQtPmxlbjsgfQoKaW5s aW5lIGJvb2wgUVN0cmluZzo6aXNFbXB0eSgpIGNvbnN0CnsgcmV0dXJuIGxlbmd0aCgpID09IDA7 IH0KCmlubGluZSBRU3RyaW5nIFFTdHJpbmc6OmNvcHkoKSBjb25zdAp7IHJldHVybiBRU3RyaW5n KCAqdGhpcyApOyB9CgppbmxpbmUgUVN0cmluZyAmUVN0cmluZzo6cHJlcGVuZCggY29uc3QgUVN0 cmluZyAmIHMgKQp7IHJldHVybiBpbnNlcnQoMCxzKTsgfQoKaW5saW5lIFFTdHJpbmcgJlFTdHJp bmc6OnByZXBlbmQoIFFDaGFyIGMgKQp7IHJldHVybiBpbnNlcnQoMCxjKTsgfQoKaW5saW5lIFFT dHJpbmcgJlFTdHJpbmc6OnByZXBlbmQoIGNoYXIgYyApCnsgcmV0dXJuIGluc2VydCgwLGMpOyB9 CgppbmxpbmUgUVN0cmluZyAmUVN0cmluZzo6YXBwZW5kKCBjb25zdCBRU3RyaW5nICYgcyApCnsg cmV0dXJuIG9wZXJhdG9yKz0ocyk7IH0KCmlubGluZSBRU3RyaW5nICZRU3RyaW5nOjphcHBlbmQo IFFDaGFyIGMgKQp7IHJldHVybiBvcGVyYXRvcis9KGMpOyB9CgppbmxpbmUgUVN0cmluZyAmUVN0 cmluZzo6YXBwZW5kKCBjaGFyIGMgKQp7IHJldHVybiBvcGVyYXRvcis9KGMpOyB9CgppbmxpbmUg UVN0cmluZyAmUVN0cmluZzo6c2V0TnVtKCBzaG9ydCBuLCBpbnQgYmFzZSApCnsgcmV0dXJuIHNl dE51bSgobG9uZyluLCBiYXNlKTsgfQoKaW5saW5lIFFTdHJpbmcgJlFTdHJpbmc6OnNldE51bSgg dXNob3J0IG4sIGludCBiYXNlICkKeyByZXR1cm4gc2V0TnVtKCh1bG9uZyluLCBiYXNlKTsgfQoK aW5saW5lIFFTdHJpbmcgJlFTdHJpbmc6OnNldE51bSggaW50IG4sIGludCBiYXNlICkKeyByZXR1 cm4gc2V0TnVtKChsb25nKW4sIGJhc2UpOyB9CgppbmxpbmUgUVN0cmluZyAmUVN0cmluZzo6c2V0 TnVtKCB1aW50IG4sIGludCBiYXNlICkKeyByZXR1cm4gc2V0TnVtKCh1bG9uZyluLCBiYXNlKTsg fQoKaW5saW5lIFFTdHJpbmcgJlFTdHJpbmc6OnNldE51bSggZmxvYXQgbiwgY2hhciBmLCBpbnQg cHJlYyApCnsgcmV0dXJuIHNldE51bSgoZG91YmxlKW4sZixwcmVjKTsgfQoKaW5saW5lIFFTdHJp bmcgUVN0cmluZzo6YXJnKGludCBhLCBpbnQgZmllbGR3aWR0aCwgaW50IGJhc2UpIGNvbnN0Cnsg cmV0dXJuIGFyZygobG9uZylhLCBmaWVsZHdpZHRoLCBiYXNlKTsgfQoKaW5saW5lIFFTdHJpbmcg UVN0cmluZzo6YXJnKHVpbnQgYSwgaW50IGZpZWxkd2lkdGgsIGludCBiYXNlKSBjb25zdAp7IHJl dHVybiBhcmcoKHVsb25nKWEsIGZpZWxkd2lkdGgsIGJhc2UpOyB9CgppbmxpbmUgUVN0cmluZyBR U3RyaW5nOjphcmcoc2hvcnQgYSwgaW50IGZpZWxkd2lkdGgsIGludCBiYXNlKSBjb25zdAp7IHJl dHVybiBhcmcoKGxvbmcpYSwgZmllbGR3aWR0aCwgYmFzZSk7IH0KCmlubGluZSBRU3RyaW5nIFFT dHJpbmc6OmFyZyh1c2hvcnQgYSwgaW50IGZpZWxkd2lkdGgsIGludCBiYXNlKSBjb25zdAp7IHJl dHVybiBhcmcoKHVsb25nKWEsIGZpZWxkd2lkdGgsIGJhc2UpOyB9CgppbmxpbmUgaW50IFFTdHJp bmc6OmZpbmQoIGNoYXIgYywgaW50IGluZGV4LCBib29sIGNzICkgY29uc3QKeyByZXR1cm4gZmlu ZChRQ2hhcihjKSwgaW5kZXgsIGNzKTsgfQoKaW5saW5lIGludCBRU3RyaW5nOjpmaW5kUmV2KCBj aGFyIGMsIGludCBpbmRleCwgYm9vbCBjcykgY29uc3QKeyByZXR1cm4gZmluZFJldiggUUNoYXIo YyksIGluZGV4LCBjcyApOyB9CgoKCmlubGluZSBpbnQgUVN0cmluZzo6ZmluZCggY29uc3QgY2hh ciogc3RyLCBpbnQgaW5kZXggKSBjb25zdAp7IHJldHVybiBmaW5kKFFTdHJpbmc6OmZyb21MYXRp bjEoc3RyKSwgaW5kZXgpOyB9CgppbmxpbmUgaW50IFFTdHJpbmc6OmZpbmRSZXYoIGNvbnN0IGNo YXIqIHN0ciwgaW50IGluZGV4ICkgY29uc3QKeyByZXR1cm4gZmluZFJldihRU3RyaW5nOjpmcm9t TGF0aW4xKHN0ciksIGluZGV4KTsgfQoKCgoKCgoKICAgICAgICAgYm9vbCBvcGVyYXRvciE9KCBj b25zdCBRU3RyaW5nICZzMSwgY29uc3QgUVN0cmluZyAmczIgKTsKICAgICAgICAgYm9vbCBvcGVy YXRvcjwoIGNvbnN0IFFTdHJpbmcgJnMxLCBjb25zdCBRU3RyaW5nICZzMiApOwogICAgICAgICBi b29sIG9wZXJhdG9yPD0oIGNvbnN0IFFTdHJpbmcgJnMxLCBjb25zdCBRU3RyaW5nICZzMiApOwog ICAgICAgICBib29sIG9wZXJhdG9yPT0oIGNvbnN0IFFTdHJpbmcgJnMxLCBjb25zdCBRU3RyaW5n ICZzMiApOwogICAgICAgICBib29sIG9wZXJhdG9yPiggY29uc3QgUVN0cmluZyAmczEsIGNvbnN0 IFFTdHJpbmcgJnMyICk7CiAgICAgICAgIGJvb2wgb3BlcmF0b3I+PSggY29uc3QgUVN0cmluZyAm czEsIGNvbnN0IFFTdHJpbmcgJnMyICk7CgogICAgICAgICBib29sIG9wZXJhdG9yIT0oIGNvbnN0 IFFTdHJpbmcgJnMxLCBjb25zdCBjaGFyICpzMiApOwogICAgICAgICBib29sIG9wZXJhdG9yPCgg Y29uc3QgUVN0cmluZyAmczEsIGNvbnN0IGNoYXIgKnMyICk7CiAgICAgICAgIGJvb2wgb3BlcmF0 b3I8PSggY29uc3QgUVN0cmluZyAmczEsIGNvbnN0IGNoYXIgKnMyICk7CiAgICAgICAgIGJvb2wg b3BlcmF0b3I9PSggY29uc3QgUVN0cmluZyAmczEsIGNvbnN0IGNoYXIgKnMyICk7CiAgICAgICAg IGJvb2wgb3BlcmF0b3I+KCBjb25zdCBRU3RyaW5nICZzMSwgY29uc3QgY2hhciAqczIgKTsKICAg ICAgICAgYm9vbCBvcGVyYXRvcj49KCBjb25zdCBRU3RyaW5nICZzMSwgY29uc3QgY2hhciAqczIg KTsKICAgICAgICAgYm9vbCBvcGVyYXRvciE9KCBjb25zdCBjaGFyICpzMSwgY29uc3QgUVN0cmlu ZyAmczIgKTsKICAgICAgICAgYm9vbCBvcGVyYXRvcjwoIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBR U3RyaW5nICZzMiApOwogICAgICAgICBib29sIG9wZXJhdG9yPD0oIGNvbnN0IGNoYXIgKnMxLCBj b25zdCBRU3RyaW5nICZzMiApOwogICAgICAgICBib29sIG9wZXJhdG9yPT0oIGNvbnN0IGNoYXIg KnMxLCBjb25zdCBRU3RyaW5nICZzMiApOwoKICAgICAgICAgYm9vbCBvcGVyYXRvcj49KCBjb25z dCBjaGFyICpzMSwgY29uc3QgUVN0cmluZyAmczIgKTsKCgogICAgICAgICBpbmxpbmUgUVN0cmlu ZyBvcGVyYXRvcisoIGNvbnN0IFFTdHJpbmcgJnMxLCBjb25zdCBRU3RyaW5nICZzMiApCnsKICAg IFFTdHJpbmcgdG1wKCBzMSApOwogICAgdG1wICs9IHMyOwogICAgcmV0dXJuIHRtcDsKfQoKCiAg ICAgICAgIGlubGluZSBRU3RyaW5nIG9wZXJhdG9yKyggY29uc3QgUVN0cmluZyAmczEsIGNvbnN0 IGNoYXIgKnMyICkKewogICAgUVN0cmluZyB0bXAoIHMxICk7CiAgICB0bXAgKz0gUVN0cmluZzo6 ZnJvbUxhdGluMShzMik7CiAgICByZXR1cm4gdG1wOwp9CgogICAgICAgICBpbmxpbmUgUVN0cmlu ZyBvcGVyYXRvcisoIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBRU3RyaW5nICZzMiApCnsKICAgIFFT dHJpbmcgdG1wID0gUVN0cmluZzo6ZnJvbUxhdGluMSggczEgKTsKICAgIHRtcCArPSBzMjsKICAg IHJldHVybiB0bXA7Cn0KCgogICAgICAgICBpbmxpbmUgUVN0cmluZyBvcGVyYXRvcisoIGNvbnN0 IFFTdHJpbmcgJnMxLCBRQ2hhciBjMiApCnsKICAgIFFTdHJpbmcgdG1wKCBzMSApOwogICAgdG1w ICs9IGMyOwogICAgcmV0dXJuIHRtcDsKfQoKICAgICAgICAgaW5saW5lIFFTdHJpbmcgb3BlcmF0 b3IrKCBjb25zdCBRU3RyaW5nICZzMSwgY2hhciBjMiApCnsKICAgIFFTdHJpbmcgdG1wKCBzMSAp OwogICAgdG1wICs9IGMyOwogICAgcmV0dXJuIHRtcDsKfQoKICAgICAgICAgaW5saW5lIFFTdHJp bmcgb3BlcmF0b3IrKCBRQ2hhciBjMSwgY29uc3QgUVN0cmluZyAmczIgKQp7CiAgICBRU3RyaW5n IHRtcDsKICAgIHRtcCArPSBjMTsKICAgIHRtcCArPSBzMjsKICAgIHJldHVybiB0bXA7Cn0KCiAg ICAgICAgIGlubGluZSBRU3RyaW5nIG9wZXJhdG9yKyggY2hhciBjMSwgY29uc3QgUVN0cmluZyAm czIgKQp7CiAgICBRU3RyaW5nIHRtcDsKICAgIHRtcCArPSBjMTsKICAgIHRtcCArPSBzMjsKICAg IHJldHVybiB0bXA7Cn0KIyA0NCAicWdkaWN0LmgiIDIKCgpjbGFzcyBRR0RpY3RJdGVyYXRvcjsK Y2xhc3MgUUdESXRMaXN0OwoKCmNsYXNzIFFCYXNlQnVja2V0CnsKcHVibGljOgogICAgUUNvbGxl Y3Rpb246Okl0ZW0gZ2V0RGF0YSgpIHsgcmV0dXJuIGRhdGE7IH0KICAgIFFDb2xsZWN0aW9uOjpJ dGVtIHNldERhdGEoIFFDb2xsZWN0aW9uOjpJdGVtIGQgKSB7IHJldHVybiBkYXRhID0gZDsgfQog ICAgUUJhc2VCdWNrZXQgKmdldE5leHQoKSB7IHJldHVybiBuZXh0OyB9CiAgICB2b2lkIHNldE5l eHQoIFFCYXNlQnVja2V0ICpuKSB7IG5leHQgPSBuOyB9CnByb3RlY3RlZDoKICAgIFFCYXNlQnVj a2V0KCBRQ29sbGVjdGlvbjo6SXRlbSBkLCBRQmFzZUJ1Y2tldCAqbiApIDogZGF0YShkKSwgbmV4 dChuKSB7fQogICAgUUNvbGxlY3Rpb246Okl0ZW0gZGF0YTsKICAgIFFCYXNlQnVja2V0ICpuZXh0 Owp9OwoKY2xhc3MgUVN0cmluZ0J1Y2tldCA6IHB1YmxpYyBRQmFzZUJ1Y2tldAp7CnB1YmxpYzoK ICAgIFFTdHJpbmdCdWNrZXQoIGNvbnN0IFFTdHJpbmcgJmssIFFDb2xsZWN0aW9uOjpJdGVtIGQs IFFCYXNlQnVja2V0ICpuICkKICAgICAgICA6IFFCYXNlQnVja2V0KGQsbiksIGtleShrKSB7fQog ICAgY29uc3QgUVN0cmluZyAmZ2V0S2V5KCkgY29uc3QgeyByZXR1cm4ga2V5OyB9CnByaXZhdGU6 CiAgICBRU3RyaW5nIGtleTsKfTsKCmNsYXNzIFFBc2NpaUJ1Y2tldCA6IHB1YmxpYyBRQmFzZUJ1 Y2tldAp7CnB1YmxpYzoKICAgIFFBc2NpaUJ1Y2tldCggY29uc3QgY2hhciAqaywgUUNvbGxlY3Rp b246Okl0ZW0gZCwgUUJhc2VCdWNrZXQgKm4gKQogICAgICAgIDogUUJhc2VCdWNrZXQoZCxuKSwg a2V5KGspIHt9CiAgICBjb25zdCBjaGFyICpnZXRLZXkoKSBjb25zdCB7IHJldHVybiBrZXk7IH0K cHJpdmF0ZToKICAgIGNvbnN0IGNoYXIgKmtleTsKfTsKCmNsYXNzIFFJbnRCdWNrZXQgOiBwdWJs aWMgUUJhc2VCdWNrZXQKewpwdWJsaWM6CiAgICBRSW50QnVja2V0KCBsb25nIGssIFFDb2xsZWN0 aW9uOjpJdGVtIGQsIFFCYXNlQnVja2V0ICpuICkKICAgICAgICA6IFFCYXNlQnVja2V0KGQsbiks IGtleShrKSB7fQogICAgbG9uZyBnZXRLZXkoKSBjb25zdCB7IHJldHVybiBrZXk7IH0KcHJpdmF0 ZToKICAgIGxvbmcga2V5Owp9OwoKY2xhc3MgUVB0ckJ1Y2tldCA6IHB1YmxpYyBRQmFzZUJ1Y2tl dAp7CnB1YmxpYzoKICAgIFFQdHJCdWNrZXQoIHZvaWQgKmssIFFDb2xsZWN0aW9uOjpJdGVtIGQs IFFCYXNlQnVja2V0ICpuICkKICAgICAgICA6IFFCYXNlQnVja2V0KGQsbiksIGtleShrKSB7fQog ICAgdm9pZCAqZ2V0S2V5KCkgY29uc3QgeyByZXR1cm4ga2V5OyB9CnByaXZhdGU6CiAgICB2b2lk ICprZXk7Cn07CgoKY2xhc3MgUUdEaWN0IDogcHVibGljIFFDb2xsZWN0aW9uCnsKcHVibGljOgog ICAgdWludCBjb3VudCgpIGNvbnN0IHsgcmV0dXJuIG51bUl0ZW1zOyB9CiAgICB1aW50IHNpemUo KSBjb25zdCB7IHJldHVybiB2bGVuOyB9CiAgICBRQ29sbGVjdGlvbjo6SXRlbSBsb29rX3N0cmlu ZyggY29uc3QgUVN0cmluZyYga2V5LCBRQ29sbGVjdGlvbjo6SXRlbSwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBpbnQgKTsKICAgIFFDb2xsZWN0aW9uOjpJdGVtIGxvb2tfYXNj aWkoIGNvbnN0IGNoYXIgKmtleSwgUUNvbGxlY3Rpb246Okl0ZW0sIGludCApOwogICAgUUNvbGxl Y3Rpb246Okl0ZW0gbG9va19pbnQoIGxvbmcga2V5LCBRQ29sbGVjdGlvbjo6SXRlbSwgaW50ICk7 CiAgICBRQ29sbGVjdGlvbjo6SXRlbSBsb29rX3B0ciggdm9pZCAqa2V5LCBRQ29sbGVjdGlvbjo6 SXRlbSwgaW50ICk7CgogICAgUURhdGFTdHJlYW0gJnJlYWQoIFFEYXRhU3RyZWFtICYgKTsKICAg IFFEYXRhU3RyZWFtICZ3cml0ZSggUURhdGFTdHJlYW0gJiApIGNvbnN0OwoKcHJvdGVjdGVkOgog ICAgZW51bSBLZXlUeXBlIHsgU3RyaW5nS2V5LCBBc2NpaUtleSwgSW50S2V5LCBQdHJLZXkgfTsK CiAgICBRR0RpY3QoIHVpbnQgbGVuLCBLZXlUeXBlIGt0LCBib29sIGNzLCBib29sIGNrICk7CiAg ICBRR0RpY3QoIGNvbnN0IFFHRGljdCAmICk7CiAgIH5RR0RpY3QoKTsKCiAgICBRR0RpY3QgJm9w ZXJhdG9yPSggY29uc3QgUUdEaWN0ICYgKTsKCiAgICBib29sIHJlbW92ZV9zdHJpbmcoIGNvbnN0 IFFTdHJpbmcgJmtleSwgUUNvbGxlY3Rpb246Okl0ZW0gaXRlbT0wICk7CiAgICBib29sIHJlbW92 ZV9hc2NpaSggY29uc3QgY2hhciAqa2V5LCBRQ29sbGVjdGlvbjo6SXRlbSBpdGVtPTAgKTsKICAg IGJvb2wgcmVtb3ZlX2ludCggbG9uZyBrZXksIFFDb2xsZWN0aW9uOjpJdGVtIGl0ZW09MCApOwog ICAgYm9vbCByZW1vdmVfcHRyKCB2b2lkICprZXksIFFDb2xsZWN0aW9uOjpJdGVtIGl0ZW09MCAp OwogICAgUUNvbGxlY3Rpb246Okl0ZW0gdGFrZV9zdHJpbmcoIGNvbnN0IFFTdHJpbmcgJmtleSAp OwogICAgUUNvbGxlY3Rpb246Okl0ZW0gdGFrZV9hc2NpaSggY29uc3QgY2hhciAqa2V5ICk7CiAg ICBRQ29sbGVjdGlvbjo6SXRlbSB0YWtlX2ludCggbG9uZyBrZXkgKTsKICAgIFFDb2xsZWN0aW9u OjpJdGVtIHRha2VfcHRyKCB2b2lkICprZXkgKTsKCiAgICB2b2lkIGNsZWFyKCk7CiAgICB2b2lk IHJlc2l6ZSggdWludCApOwoKICAgIGludCBoYXNoS2V5U3RyaW5nKCBjb25zdCBRU3RyaW5nICYg KTsKICAgIGludCBoYXNoS2V5QXNjaWkoIGNvbnN0IGNoYXIgKiApOwoKICAgIHZvaWQgc3RhdGlz dGljcygpIGNvbnN0OwoKCiAgICB2aXJ0dWFsIFFEYXRhU3RyZWFtICZyZWFkKCBRRGF0YVN0cmVh bSAmLCBRQ29sbGVjdGlvbjo6SXRlbSAmICk7CiAgICB2aXJ0dWFsIFFEYXRhU3RyZWFtICZ3cml0 ZSggUURhdGFTdHJlYW0gJiwgUUNvbGxlY3Rpb246Okl0ZW0gKSBjb25zdDsKCnByaXZhdGU6CiAg ICBRQmFzZUJ1Y2tldCAqKnZlYzsKICAgIHVpbnQgdmxlbjsKICAgIHVpbnQgbnVtSXRlbXM7CiAg ICB1aW50IGtleXR5cGUgOiAyOwogICAgdWludCBjYXNlcyA6IDE7CiAgICB1aW50IGNvcHlrIDog MTsKICAgIFFHREl0TGlzdCAqaXRlcmF0b3JzOwogICAgdm9pZCB1bmxpbmtfY29tbW9uKCBpbnQs IFFCYXNlQnVja2V0ICosIFFCYXNlQnVja2V0ICogKTsKICAgIFFTdHJpbmdCdWNrZXQgKnVubGlu a19zdHJpbmcoIGNvbnN0IFFTdHJpbmcgJiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFFDb2xsZWN0aW9uOjpJdGVtIGl0ZW0gPSAwICk7CiAgICBRQXNjaWlCdWNrZXQgKnVubGlu a19hc2NpaSggY29uc3QgY2hhciAqLCBRQ29sbGVjdGlvbjo6SXRlbSBpdGVtID0gMCApOwogICAg UUludEJ1Y2tldCAqdW5saW5rX2ludCggbG9uZywgUUNvbGxlY3Rpb246Okl0ZW0gaXRlbSA9IDAg KTsKICAgIFFQdHJCdWNrZXQgKnVubGlua19wdHIoIHZvaWQgKiwgUUNvbGxlY3Rpb246Okl0ZW0g aXRlbSA9IDAgKTsKICAgIHZvaWQgaW5pdCggdWludCwgS2V5VHlwZSwgYm9vbCwgYm9vbCApOwog ICAgZnJpZW5kIGNsYXNzIFFHRGljdEl0ZXJhdG9yOwp9OwoKCmNsYXNzIFFHRGljdEl0ZXJhdG9y CnsKZnJpZW5kIGNsYXNzIFFHRGljdDsKcHVibGljOgogICAgUUdEaWN0SXRlcmF0b3IoIGNvbnN0 IFFHRGljdCAmICk7CiAgICBRR0RpY3RJdGVyYXRvciggY29uc3QgUUdEaWN0SXRlcmF0b3IgJiAp OwogICAgUUdEaWN0SXRlcmF0b3IgJm9wZXJhdG9yPSggY29uc3QgUUdEaWN0SXRlcmF0b3IgJiAp OwogICB+UUdEaWN0SXRlcmF0b3IoKTsKCiAgICBRQ29sbGVjdGlvbjo6SXRlbSB0b0ZpcnN0KCk7 CgogICAgUUNvbGxlY3Rpb246Okl0ZW0gZ2V0KCkgY29uc3Q7CiAgICBRU3RyaW5nIGdldEtleVN0 cmluZygpIGNvbnN0OwogICAgY29uc3QgY2hhciAqZ2V0S2V5QXNjaWkoKSBjb25zdDsKICAgIGxv bmcgZ2V0S2V5SW50KCkgY29uc3Q7CiAgICB2b2lkICpnZXRLZXlQdHIoKSBjb25zdDsKCiAgICBR Q29sbGVjdGlvbjo6SXRlbSBvcGVyYXRvcigpKCk7CiAgICBRQ29sbGVjdGlvbjo6SXRlbSBvcGVy YXRvcisrKCk7CiAgICBRQ29sbGVjdGlvbjo6SXRlbSBvcGVyYXRvcis9KHVpbnQpOwoKcHJvdGVj dGVkOgogICAgUUdEaWN0ICpkaWN0OwoKcHJpdmF0ZToKICAgIFFCYXNlQnVja2V0ICpjdXJOb2Rl OwogICAgdWludCBjdXJJbmRleDsKfTsKCmlubGluZSBRQ29sbGVjdGlvbjo6SXRlbSBRR0RpY3RJ dGVyYXRvcjo6Z2V0KCkgY29uc3QKewogICAgcmV0dXJuIGN1ck5vZGUgPyBjdXJOb2RlLT5nZXRE YXRhKCkgOiAwOwp9CgppbmxpbmUgUVN0cmluZyBRR0RpY3RJdGVyYXRvcjo6Z2V0S2V5U3RyaW5n KCkgY29uc3QKewogICAgcmV0dXJuIGN1ck5vZGUgPyAoKFFTdHJpbmdCdWNrZXQqKWN1ck5vZGUp LT5nZXRLZXkoKSA6IFFTdHJpbmc6Om51bGw7Cn0KCmlubGluZSBjb25zdCBjaGFyICpRR0RpY3RJ dGVyYXRvcjo6Z2V0S2V5QXNjaWkoKSBjb25zdAp7CiAgICByZXR1cm4gY3VyTm9kZSA/ICgoUUFz Y2lpQnVja2V0KiljdXJOb2RlKS0+Z2V0S2V5KCkgOiAwOwp9CgppbmxpbmUgbG9uZyBRR0RpY3RJ dGVyYXRvcjo6Z2V0S2V5SW50KCkgY29uc3QKewogICAgcmV0dXJuIGN1ck5vZGUgPyAoKFFJbnRC dWNrZXQqKWN1ck5vZGUpLT5nZXRLZXkoKSA6IDA7Cn0KCmlubGluZSB2b2lkICpRR0RpY3RJdGVy YXRvcjo6Z2V0S2V5UHRyKCkgY29uc3QKewogICAgcmV0dXJuIGN1ck5vZGUgPyAoKFFQdHJCdWNr ZXQqKWN1ck5vZGUpLT5nZXRLZXkoKSA6IDA7Cn0KIyAzOSAicWdkaWN0LmNwcCIgMgojIDEgInFs aXN0LmgiIDEKIyA0MiAicWxpc3QuaCIKIyAxICJxZ2xpc3QuaCIgMQojIDQyICJxZ2xpc3QuaCIK IyAxICJxY29sbGVjdGlvbi5oIiAxCiMgNDMgInFnbGlzdC5oIiAyCgoKCgoKCgpjbGFzcyBRTE5v ZGUKewpmcmllbmQgY2xhc3MgUUdMaXN0OwpmcmllbmQgY2xhc3MgUUdMaXN0SXRlcmF0b3I7CnB1 YmxpYzoKICAgIFFDb2xsZWN0aW9uOjpJdGVtIGdldERhdGEoKSB7IHJldHVybiBkYXRhOyB9CnBy aXZhdGU6CiAgICBRQ29sbGVjdGlvbjo6SXRlbSBkYXRhOwogICAgUUxOb2RlICpwcmV2OwogICAg UUxOb2RlICpuZXh0OwogICAgUUxOb2RlKCBRQ29sbGVjdGlvbjo6SXRlbSBkICkgeyBkYXRhID0g ZDsgfQp9OwoKCgoKCgpjbGFzcyBRR0xpc3QgOiBwdWJsaWMgUUNvbGxlY3Rpb24KewpmcmllbmQg Y2xhc3MgUUdMaXN0SXRlcmF0b3I7CmZyaWVuZCBjbGFzcyBRR1ZlY3RvcjsKcHVibGljOgogICAg dWludCBjb3VudCgpIGNvbnN0OwoKCiAgICBRRGF0YVN0cmVhbSAmcmVhZCggUURhdGFTdHJlYW0g JiApOwogICAgUURhdGFTdHJlYW0gJndyaXRlKCBRRGF0YVN0cmVhbSAmICkgY29uc3Q7Cgpwcm90 ZWN0ZWQ6CiAgICBRR0xpc3QoKTsKICAgIFFHTGlzdCggY29uc3QgUUdMaXN0ICYgKTsKICAgIHZp cnR1YWwgflFHTGlzdCgpOwoKICAgIFFHTGlzdCAmb3BlcmF0b3I9KCBjb25zdCBRR0xpc3QgJiAp OwogICAgYm9vbCBvcGVyYXRvcj09KCBjb25zdCBRR0xpc3QmICkgY29uc3Q7CgogICAgdm9pZCBp blNvcnQoIFFDb2xsZWN0aW9uOjpJdGVtICk7CiAgICB2b2lkIGFwcGVuZCggUUNvbGxlY3Rpb246 Okl0ZW0gKTsKICAgIGJvb2wgaW5zZXJ0QXQoIHVpbnQgaW5kZXgsIFFDb2xsZWN0aW9uOjpJdGVt ICk7CiAgICB2b2lkIHJlbGlua05vZGUoIFFMTm9kZSAqICk7CiAgICBib29sIHJlbW92ZU5vZGUo IFFMTm9kZSAqICk7CiAgICBib29sIHJlbW92ZSggUUNvbGxlY3Rpb246Okl0ZW0gPSAwICk7CiAg ICBib29sIHJlbW92ZVJlZiggUUNvbGxlY3Rpb246Okl0ZW0gPSAwICk7CiAgICBib29sIHJlbW92 ZUZpcnN0KCk7CiAgICBib29sIHJlbW92ZUxhc3QoKTsKICAgIGJvb2wgcmVtb3ZlQXQoIHVpbnQg aW5kZXggKTsKICAgIFFDb2xsZWN0aW9uOjpJdGVtIHRha2VOb2RlKCBRTE5vZGUgKiApOwogICAg UUNvbGxlY3Rpb246Okl0ZW0gdGFrZSgpOwogICAgUUNvbGxlY3Rpb246Okl0ZW0gdGFrZUF0KCB1 aW50IGluZGV4ICk7CiAgICBRQ29sbGVjdGlvbjo6SXRlbSB0YWtlRmlyc3QoKTsKICAgIFFDb2xs ZWN0aW9uOjpJdGVtIHRha2VMYXN0KCk7CgogICAgdm9pZCBzb3J0KCk7CiAgICB2b2lkIGNsZWFy KCk7CgogICAgaW50IGZpbmRSZWYoIFFDb2xsZWN0aW9uOjpJdGVtLCBib29sID0gVFJVRSApOwog ICAgaW50IGZpbmQoIFFDb2xsZWN0aW9uOjpJdGVtLCBib29sID0gVFJVRSApOwoKICAgIHVpbnQg Y29udGFpbnNSZWYoIFFDb2xsZWN0aW9uOjpJdGVtICkgY29uc3Q7CiAgICB1aW50IGNvbnRhaW5z KCBRQ29sbGVjdGlvbjo6SXRlbSApIGNvbnN0OwoKICAgIFFDb2xsZWN0aW9uOjpJdGVtIGF0KCB1 aW50IGluZGV4ICk7CiAgICBpbnQgYXQoKSBjb25zdDsKICAgIFFMTm9kZSAqY3VycmVudE5vZGUo KSBjb25zdDsKCiAgICBRQ29sbGVjdGlvbjo6SXRlbSBnZXQoKSBjb25zdDsKCiAgICBRQ29sbGVj dGlvbjo6SXRlbSBjZmlyc3QoKSBjb25zdDsKICAgIFFDb2xsZWN0aW9uOjpJdGVtIGNsYXN0KCkg Y29uc3Q7CiAgICBRQ29sbGVjdGlvbjo6SXRlbSBmaXJzdCgpOwogICAgUUNvbGxlY3Rpb246Okl0 ZW0gbGFzdCgpOwogICAgUUNvbGxlY3Rpb246Okl0ZW0gbmV4dCgpOwogICAgUUNvbGxlY3Rpb246 Okl0ZW0gcHJldigpOwoKICAgIHZvaWQgdG9WZWN0b3IoIFFHVmVjdG9yICogKSBjb25zdDsKCiAg ICB2aXJ0dWFsIGludCBjb21wYXJlSXRlbXMoIFFDb2xsZWN0aW9uOjpJdGVtLCBRQ29sbGVjdGlv bjo6SXRlbSApOwoKCiAgICB2aXJ0dWFsIFFEYXRhU3RyZWFtICZyZWFkKCBRRGF0YVN0cmVhbSAm LCBRQ29sbGVjdGlvbjo6SXRlbSAmICk7CiAgICB2aXJ0dWFsIFFEYXRhU3RyZWFtICZ3cml0ZSgg UURhdGFTdHJlYW0gJiwgUUNvbGxlY3Rpb246Okl0ZW0gKSBjb25zdDsKCnByaXZhdGU6CiAgICB2 b2lkIHByZXBlbmQoIFFDb2xsZWN0aW9uOjpJdGVtICk7CgogICAgdm9pZCBoZWFwU29ydFB1c2hE b3duKCBRQ29sbGVjdGlvbjo6SXRlbSogaGVhcCwgaW50IGZpcnN0LCBpbnQgbGFzdCApOwoKICAg IFFMTm9kZSAqZmlyc3ROb2RlOwogICAgUUxOb2RlICpsYXN0Tm9kZTsKICAgIFFMTm9kZSAqY3Vy Tm9kZTsKICAgIGludCBjdXJJbmRleDsKICAgIHVpbnQgbnVtTm9kZXM7CiAgICBRR0xpc3QgKml0 ZXJhdG9yczsKCiAgICBRTE5vZGUgKmxvY2F0ZSggdWludCApOwogICAgUUxOb2RlICp1bmxpbmso KTsKfTsKCgppbmxpbmUgdWludCBRR0xpc3Q6OmNvdW50KCkgY29uc3QKewogICAgcmV0dXJuIG51 bU5vZGVzOwp9CgppbmxpbmUgYm9vbCBRR0xpc3Q6OnJlbW92ZUZpcnN0KCkKewogICAgZmlyc3Qo KTsKICAgIHJldHVybiByZW1vdmUoKTsKfQoKaW5saW5lIGJvb2wgUUdMaXN0OjpyZW1vdmVMYXN0 KCkKewogICAgbGFzdCgpOwogICAgcmV0dXJuIHJlbW92ZSgpOwp9CgppbmxpbmUgaW50IFFHTGlz dDo6YXQoKSBjb25zdAp7CiAgICByZXR1cm4gY3VySW5kZXg7Cn0KCmlubGluZSBRQ29sbGVjdGlv bjo6SXRlbSBRR0xpc3Q6OmF0KCB1aW50IGluZGV4ICkKewogICAgUUxOb2RlICpuID0gbG9jYXRl KCBpbmRleCApOwogICAgcmV0dXJuIG4gPyBuLT5kYXRhIDogMDsKfQoKaW5saW5lIFFMTm9kZSAq UUdMaXN0OjpjdXJyZW50Tm9kZSgpIGNvbnN0CnsKICAgIHJldHVybiBjdXJOb2RlOwp9Cgppbmxp bmUgUUNvbGxlY3Rpb246Okl0ZW0gUUdMaXN0OjpnZXQoKSBjb25zdAp7CiAgICByZXR1cm4gY3Vy Tm9kZSA/IGN1ck5vZGUtPmRhdGEgOiAwOwp9CgppbmxpbmUgUUNvbGxlY3Rpb246Okl0ZW0gUUdM aXN0OjpjZmlyc3QoKSBjb25zdAp7CiAgICByZXR1cm4gZmlyc3ROb2RlID8gZmlyc3ROb2RlLT5k YXRhIDogMDsKfQoKaW5saW5lIFFDb2xsZWN0aW9uOjpJdGVtIFFHTGlzdDo6Y2xhc3QoKSBjb25z dAp7CiAgICByZXR1cm4gbGFzdE5vZGUgPyBsYXN0Tm9kZS0+ZGF0YSA6IDA7Cn0KCgoKCgoKCiAg ICAgICAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRR0xpc3QgJiAp OwogICAgICAgICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I8PCggUURhdGFTdHJlYW0gJiwgY29uc3Qg UUdMaXN0ICYgKTsKCgoKCgoKY2xhc3MgUUdMaXN0SXRlcmF0b3IKewpmcmllbmQgY2xhc3MgUUdM aXN0Owpwcm90ZWN0ZWQ6CiAgICBRR0xpc3RJdGVyYXRvciggY29uc3QgUUdMaXN0ICYgKTsKICAg IFFHTGlzdEl0ZXJhdG9yKCBjb25zdCBRR0xpc3RJdGVyYXRvciAmICk7CiAgICBRR0xpc3RJdGVy YXRvciAmb3BlcmF0b3I9KCBjb25zdCBRR0xpc3RJdGVyYXRvciAmICk7CiAgIH5RR0xpc3RJdGVy YXRvcigpOwoKICAgIGJvb2wgYXRGaXJzdCgpIGNvbnN0OwogICAgYm9vbCBhdExhc3QoKSBjb25z dDsKICAgIFFDb2xsZWN0aW9uOjpJdGVtIHRvRmlyc3QoKTsKICAgIFFDb2xsZWN0aW9uOjpJdGVt IHRvTGFzdCgpOwoKICAgIFFDb2xsZWN0aW9uOjpJdGVtIGdldCgpIGNvbnN0OwogICAgUUNvbGxl Y3Rpb246Okl0ZW0gb3BlcmF0b3IoKSgpOwogICAgUUNvbGxlY3Rpb246Okl0ZW0gb3BlcmF0b3Ir KygpOwogICAgUUNvbGxlY3Rpb246Okl0ZW0gb3BlcmF0b3IrPSh1aW50KTsKICAgIFFDb2xsZWN0 aW9uOjpJdGVtIG9wZXJhdG9yLS0oKTsKICAgIFFDb2xsZWN0aW9uOjpJdGVtIG9wZXJhdG9yLT0o dWludCk7Cgpwcm90ZWN0ZWQ6CiAgICBRR0xpc3QgKmxpc3Q7Cgpwcml2YXRlOgogICAgUUxOb2Rl ICpjdXJOb2RlOwp9OwoKCmlubGluZSBib29sIFFHTGlzdEl0ZXJhdG9yOjphdEZpcnN0KCkgY29u c3QKewogICAgcmV0dXJuIGN1ck5vZGUgPT0gbGlzdC0+Zmlyc3ROb2RlOwp9CgppbmxpbmUgYm9v bCBRR0xpc3RJdGVyYXRvcjo6YXRMYXN0KCkgY29uc3QKewogICAgcmV0dXJuIGN1ck5vZGUgPT0g bGlzdC0+bGFzdE5vZGU7Cn0KCmlubGluZSBRQ29sbGVjdGlvbjo6SXRlbSBRR0xpc3RJdGVyYXRv cjo6Z2V0KCkgY29uc3QKewogICAgcmV0dXJuIGN1ck5vZGUgPyBjdXJOb2RlLT5kYXRhIDogMDsK fQojIDQzICJxbGlzdC5oIiAyCgoKCnRlbXBsYXRlPGNsYXNzIHR5cGU+IGNsYXNzIFFMaXN0IDog cHVibGljIFFHTGlzdAp7CnB1YmxpYzoKICAgIFFMaXN0KCkge30KICAgIFFMaXN0KCBjb25zdCBR TGlzdDx0eXBlPiAmbCApIDogUUdMaXN0KGwpIHt9CiAgIH5RTGlzdCgpIHsgY2xlYXIoKTsgfQog ICAgUUxpc3Q8dHlwZT4gJm9wZXJhdG9yPShjb25zdCBRTGlzdDx0eXBlPiAmbCkKICAgICAgICAg ICAgICAgICAgICAgICAgeyByZXR1cm4gKFFMaXN0PHR5cGU+JilRR0xpc3Q6Om9wZXJhdG9yPShs KTsgfQogICAgYm9vbCBvcGVyYXRvcj09KCBjb25zdCBRTGlzdDx0eXBlPiAmbGlzdCApIGNvbnN0 CiAgICB7IHJldHVybiBRR0xpc3Q6Om9wZXJhdG9yPT0oIGxpc3QgKTsgfQogICAgdWludCBjb3Vu dCgpIGNvbnN0IHsgcmV0dXJuIFFHTGlzdDo6Y291bnQoKTsgfQogICAgYm9vbCBpc0VtcHR5KCkg Y29uc3QgeyByZXR1cm4gUUdMaXN0Ojpjb3VudCgpID09IDA7IH0KICAgIGJvb2wgaW5zZXJ0KCB1 aW50IGksIGNvbnN0IHR5cGUgKmQpeyByZXR1cm4gUUdMaXN0OjppbnNlcnRBdChpLChRQ29sbGVj dGlvbjo6SXRlbSlkKTsgfQogICAgdm9pZCBpblNvcnQoIGNvbnN0IHR5cGUgKmQgKSB7IFFHTGlz dDo6aW5Tb3J0KChRQ29sbGVjdGlvbjo6SXRlbSlkKTsgfQogICAgdm9pZCBwcmVwZW5kKCBjb25z dCB0eXBlICpkICkgeyBRR0xpc3Q6Omluc2VydEF0KDAsKFFDb2xsZWN0aW9uOjpJdGVtKWQpOyB9 CiAgICB2b2lkIGFwcGVuZCggY29uc3QgdHlwZSAqZCApIHsgUUdMaXN0OjphcHBlbmQoKFFDb2xs ZWN0aW9uOjpJdGVtKWQpOyB9CiAgICBib29sIHJlbW92ZSggdWludCBpICkgeyByZXR1cm4gUUdM aXN0OjpyZW1vdmVBdChpKTsgfQogICAgYm9vbCByZW1vdmUoKSB7IHJldHVybiBRR0xpc3Q6OnJl bW92ZSgoUUNvbGxlY3Rpb246Okl0ZW0pMCk7IH0KICAgIGJvb2wgcmVtb3ZlKCBjb25zdCB0eXBl ICpkICkgeyByZXR1cm4gUUdMaXN0OjpyZW1vdmUoKFFDb2xsZWN0aW9uOjpJdGVtKWQpOyB9CiAg ICBib29sIHJlbW92ZVJlZiggY29uc3QgdHlwZSAqZCApIHsgcmV0dXJuIFFHTGlzdDo6cmVtb3Zl UmVmKChRQ29sbGVjdGlvbjo6SXRlbSlkKTsgfQogICAgdm9pZCByZW1vdmVOb2RlKCBRTE5vZGUg Km4gKSB7IFFHTGlzdDo6cmVtb3ZlTm9kZShuKTsgfQogICAgYm9vbCByZW1vdmVGaXJzdCgpIHsg cmV0dXJuIFFHTGlzdDo6cmVtb3ZlRmlyc3QoKTsgfQogICAgYm9vbCByZW1vdmVMYXN0KCkgeyBy ZXR1cm4gUUdMaXN0OjpyZW1vdmVMYXN0KCk7IH0KICAgIHR5cGUgKnRha2UoIHVpbnQgaSApIHsg cmV0dXJuICh0eXBlICopUUdMaXN0Ojp0YWtlQXQoaSk7IH0KICAgIHR5cGUgKnRha2UoKSB7IHJl dHVybiAodHlwZSAqKVFHTGlzdDo6dGFrZSgpOyB9CiAgICB0eXBlICp0YWtlTm9kZSggUUxOb2Rl ICpuICkgeyByZXR1cm4gKHR5cGUgKilRR0xpc3Q6OnRha2VOb2RlKG4pOyB9CiAgICB2b2lkIGNs ZWFyKCkgeyBRR0xpc3Q6OmNsZWFyKCk7IH0KICAgIHZvaWQgc29ydCgpIHsgUUdMaXN0Ojpzb3J0 KCk7IH0KICAgIGludCBmaW5kKCBjb25zdCB0eXBlICpkICkgeyByZXR1cm4gUUdMaXN0OjpmaW5k KChRQ29sbGVjdGlvbjo6SXRlbSlkKTsgfQogICAgaW50IGZpbmROZXh0KCBjb25zdCB0eXBlICpk ICkgeyByZXR1cm4gUUdMaXN0OjpmaW5kKChRQ29sbGVjdGlvbjo6SXRlbSlkLEZBTFNFKTsgfQog ICAgaW50IGZpbmRSZWYoIGNvbnN0IHR5cGUgKmQgKSB7IHJldHVybiBRR0xpc3Q6OmZpbmRSZWYo KFFDb2xsZWN0aW9uOjpJdGVtKWQpOyB9CiAgICBpbnQgZmluZE5leHRSZWYoIGNvbnN0IHR5cGUg KmQgKXsgcmV0dXJuIFFHTGlzdDo6ZmluZFJlZigoUUNvbGxlY3Rpb246Okl0ZW0pZCxGQUxTRSk7 fQogICAgdWludCBjb250YWlucyggY29uc3QgdHlwZSAqZCApIGNvbnN0IHsgcmV0dXJuIFFHTGlz dDo6Y29udGFpbnMoKFFDb2xsZWN0aW9uOjpJdGVtKWQpOyB9CiAgICB1aW50IGNvbnRhaW5zUmVm KCBjb25zdCB0eXBlICpkICkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHsgcmV0dXJuIFFHTGlzdDo6Y29udGFpbnNSZWYoKFFDb2xsZWN0aW9uOjpJdGVtKWQp OyB9CiAgICB0eXBlICphdCggdWludCBpICkgeyByZXR1cm4gKHR5cGUgKilRR0xpc3Q6OmF0KGkp OyB9CiAgICBpbnQgYXQoKSBjb25zdCB7IHJldHVybiBRR0xpc3Q6OmF0KCk7IH0KICAgIHR5cGUg KmN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAodHlwZSAqKVFHTGlzdDo6Z2V0KCk7IH0KICAgIFFM Tm9kZSAqY3VycmVudE5vZGUoKSBjb25zdCB7IHJldHVybiBRR0xpc3Q6OmN1cnJlbnROb2RlKCk7 IH0KICAgIHR5cGUgKmdldEZpcnN0KCkgY29uc3QgeyByZXR1cm4gKHR5cGUgKilRR0xpc3Q6OmNm aXJzdCgpOyB9CiAgICB0eXBlICpnZXRMYXN0KCkgY29uc3QgeyByZXR1cm4gKHR5cGUgKilRR0xp c3Q6OmNsYXN0KCk7IH0KICAgIHR5cGUgKmZpcnN0KCkgeyByZXR1cm4gKHR5cGUgKilRR0xpc3Q6 OmZpcnN0KCk7IH0KICAgIHR5cGUgKmxhc3QoKSB7IHJldHVybiAodHlwZSAqKVFHTGlzdDo6bGFz dCgpOyB9CiAgICB0eXBlICpuZXh0KCkgeyByZXR1cm4gKHR5cGUgKilRR0xpc3Q6Om5leHQoKTsg fQogICAgdHlwZSAqcHJldigpIHsgcmV0dXJuICh0eXBlICopUUdMaXN0OjpwcmV2KCk7IH0KICAg IHZvaWQgdG9WZWN0b3IoIFFHVmVjdG9yICp2ZWMgKWNvbnN0eyBRR0xpc3Q6OnRvVmVjdG9yKHZl Yyk7IH0KcHJpdmF0ZToKICAgIHZvaWQgZGVsZXRlSXRlbSggUUNvbGxlY3Rpb246Okl0ZW0gZCAp Owp9OwoKCgoKCgoKdGVtcGxhdGU8Y2xhc3MgdHlwZT4gaW5saW5lIHZvaWQgUUxpc3Q8dHlwZT46 OmRlbGV0ZUl0ZW0oIFFDb2xsZWN0aW9uOjpJdGVtIGQgKQp7CiAgICBpZiAoIGRlbF9pdGVtICkg ZGVsZXRlICh0eXBlICopZDsKfQoKCnRlbXBsYXRlPGNsYXNzIHR5cGU+IGNsYXNzIFFMaXN0SXRl cmF0b3IgOiBwdWJsaWMgUUdMaXN0SXRlcmF0b3IKewpwdWJsaWM6CiAgICBRTGlzdEl0ZXJhdG9y KGNvbnN0IFFMaXN0PHR5cGU+ICZsKSA6UUdMaXN0SXRlcmF0b3IoKFFHTGlzdCAmKWwpIHt9CiAg IH5RTGlzdEl0ZXJhdG9yKCkge30KICAgIHVpbnQgY291bnQoKSBjb25zdCB7IHJldHVybiBsaXN0 LT5jb3VudCgpOyB9CiAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBsaXN0LT5jb3Vu dCgpID09IDA7IH0KICAgIGJvb2wgYXRGaXJzdCgpIGNvbnN0IHsgcmV0dXJuIFFHTGlzdEl0ZXJh dG9yOjphdEZpcnN0KCk7IH0KICAgIGJvb2wgYXRMYXN0KCkgY29uc3QgeyByZXR1cm4gUUdMaXN0 SXRlcmF0b3I6OmF0TGFzdCgpOyB9CiAgICB0eXBlICp0b0ZpcnN0KCkgeyByZXR1cm4gKHR5cGUg KilRR0xpc3RJdGVyYXRvcjo6dG9GaXJzdCgpOyB9CiAgICB0eXBlICp0b0xhc3QoKSB7IHJldHVy biAodHlwZSAqKVFHTGlzdEl0ZXJhdG9yOjp0b0xhc3QoKTsgfQogICAgb3BlcmF0b3IgdHlwZSAq KCkgY29uc3QgeyByZXR1cm4gKHR5cGUgKilRR0xpc3RJdGVyYXRvcjo6Z2V0KCk7IH0KICAgIHR5 cGUgKm9wZXJhdG9yKigpIHsgcmV0dXJuICh0eXBlICopUUdMaXN0SXRlcmF0b3I6OmdldCgpOyB9 CgoKCgoKCgogICAgdHlwZSAqY3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICh0eXBlICopUUdMaXN0 SXRlcmF0b3I6OmdldCgpOyB9CiAgICB0eXBlICpvcGVyYXRvcigpKCkgeyByZXR1cm4gKHR5cGUg KilRR0xpc3RJdGVyYXRvcjo6b3BlcmF0b3IoKSgpO30KICAgIHR5cGUgKm9wZXJhdG9yKysoKSB7 IHJldHVybiAodHlwZSAqKVFHTGlzdEl0ZXJhdG9yOjpvcGVyYXRvcisrKCk7IH0KICAgIHR5cGUg Km9wZXJhdG9yKz0odWludCBqKSB7IHJldHVybiAodHlwZSAqKVFHTGlzdEl0ZXJhdG9yOjpvcGVy YXRvcis9KGopO30KICAgIHR5cGUgKm9wZXJhdG9yLS0oKSB7IHJldHVybiAodHlwZSAqKVFHTGlz dEl0ZXJhdG9yOjpvcGVyYXRvci0tKCk7IH0KICAgIHR5cGUgKm9wZXJhdG9yLT0odWludCBqKSB7 IHJldHVybiAodHlwZSAqKVFHTGlzdEl0ZXJhdG9yOjpvcGVyYXRvci09KGopO30KICAgIFFMaXN0 SXRlcmF0b3I8dHlwZT4mIG9wZXJhdG9yPShjb25zdCBRTGlzdEl0ZXJhdG9yPHR5cGU+Jml0KQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFFHTGlzdEl0ZXJhdG9yOjpvcGVyYXRvcj0o aXQpOyByZXR1cm4gKnRoaXM7IH0KfTsKIyA0MCAicWdkaWN0LmNwcCIgMgojIDEgInFzdHJpbmcu aCIgMQojIDQxICJxZ2RpY3QuY3BwIiAyCiMgMSAicWRhdGFzdHJlYW0uaCIgMQojIDQyICJxZGF0 YXN0cmVhbS5oIgojIDEgInFpb2RldmljZS5oIiAxCiMgNDIgInFpb2RldmljZS5oIgojIDEgInFn bG9iYWwuaCIgMQojIDQzICJxaW9kZXZpY2UuaCIgMgojIDEgInFjc3RyaW5nLmgiIDEKIyA0NCAi cWlvZGV2aWNlLmgiIDIKIyA4OCAicWlvZGV2aWNlLmgiCmNsYXNzIFFJT0RldmljZQp7CnB1Ymxp YzoKICAgIFFJT0RldmljZSgpOwogICAgdmlydHVhbCB+UUlPRGV2aWNlKCk7CgogICAgaW50IGZs YWdzKCkgY29uc3QgeyByZXR1cm4gaW9Nb2RlOyB9CiAgICBpbnQgbW9kZSgpIGNvbnN0IHsgcmV0 dXJuIGlvTW9kZSAmIDB4MDBmZjsgfQogICAgaW50IHN0YXRlKCkgY29uc3QgeyByZXR1cm4gaW9N b2RlICYgMHhmMDAwOyB9CgogICAgYm9vbCBpc0RpcmVjdEFjY2VzcygpIGNvbnN0IHsgcmV0dXJu ICgoaW9Nb2RlICYgMHgwMTAwKSA9PSAweDAxMDApOyB9CiAgICBib29sIGlzU2VxdWVudGlhbEFj Y2VzcygpIGNvbnN0IHsgcmV0dXJuICgoaW9Nb2RlICYgMHgwMjAwKSA9PSAweDAyMDApOyB9CiAg ICBib29sIGlzQ29tYmluZWRBY2Nlc3MoKSBjb25zdCB7IHJldHVybiAoKGlvTW9kZSAmIDB4MDMw MCkgPT0gMHgwMzAwKTsgfQogICAgYm9vbCBpc0J1ZmZlcmVkKCkgY29uc3QgeyByZXR1cm4gKChp b01vZGUgJiAweDAwNDApICE9IDB4MDA0MCk7IH0KICAgIGJvb2wgaXNSYXcoKSBjb25zdCB7IHJl dHVybiAoKGlvTW9kZSAmIDB4MDA0MCkgPT0gMHgwMDQwKTsgfQogICAgYm9vbCBpc1N5bmNocm9u b3VzKCkgY29uc3QgeyByZXR1cm4gKChpb01vZGUgJiAweDAwODApICE9IDB4MDA4MCk7IH0KICAg IGJvb2wgaXNBc3luY2hyb25vdXMoKSBjb25zdCB7IHJldHVybiAoKGlvTW9kZSAmIDB4MDA4MCkg PT0gMHgwMDgwKTsgfQogICAgYm9vbCBpc1RyYW5zbGF0ZWQoKSBjb25zdCB7IHJldHVybiAoKGlv TW9kZSAmIDB4MDAxMCkgPT0gMHgwMDEwKTsgfQogICAgYm9vbCBpc1JlYWRhYmxlKCkgY29uc3Qg eyByZXR1cm4gKChpb01vZGUgJiAweDAwMDEpID09IDB4MDAwMSk7IH0KICAgIGJvb2wgaXNXcml0 YWJsZSgpIGNvbnN0IHsgcmV0dXJuICgoaW9Nb2RlICYgMHgwMDAyKSA9PSAweDAwMDIpOyB9CiAg ICBib29sIGlzUmVhZFdyaXRlKCkgY29uc3QgeyByZXR1cm4gKChpb01vZGUgJiAweDAwMDMpID09 IDB4MDAwMyk7IH0KICAgIGJvb2wgaXNJbmFjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlKCkg PT0gMDsgfQogICAgYm9vbCBpc09wZW4oKSBjb25zdCB7IHJldHVybiBzdGF0ZSgpID09IDB4MTAw MDsgfQoKICAgIGludCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBpb1N0OyB9CiAgICB2b2lkIHJl c2V0U3RhdHVzKCkgeyBpb1N0ID0gMDsgfQoKICAgIHZpcnR1YWwgYm9vbCBvcGVuKCBpbnQgbW9k ZSApID0gMDsKICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpID0gMDsKICAgIHZpcnR1YWwgdm9pZCBm bHVzaCgpID0gMDsKCiAgICB2aXJ0dWFsIHVpbnQgc2l6ZSgpIGNvbnN0ID0gMDsKICAgIHZpcnR1 YWwgaW50IGF0KCkgY29uc3Q7CiAgICB2aXJ0dWFsIGJvb2wgYXQoIGludCApOwogICAgdmlydHVh bCBib29sIGF0RW5kKCkgY29uc3Q7CiAgICBib29sIHJlc2V0KCkgeyByZXR1cm4gYXQoMCk7IH0K CiAgICB2aXJ0dWFsIGludCByZWFkQmxvY2soIGNoYXIgKmRhdGEsIHVpbnQgbWF4bGVuICkgPSAw OwogICAgdmlydHVhbCBpbnQgd3JpdGVCbG9jayggY29uc3QgY2hhciAqZGF0YSwgdWludCBsZW4g KSA9IDA7CiAgICB2aXJ0dWFsIGludCByZWFkTGluZSggY2hhciAqZGF0YSwgdWludCBtYXhsZW4g KTsKICAgIGludCB3cml0ZUJsb2NrKCBjb25zdCBRQnl0ZUFycmF5JiBkYXRhICk7CiAgICBRQnl0 ZUFycmF5IHJlYWRBbGwoKTsKCiAgICB2aXJ0dWFsIGludCBnZXRjaCgpID0gMDsKICAgIHZpcnR1 YWwgaW50IHB1dGNoKCBpbnQgKSA9IDA7CiAgICB2aXJ0dWFsIGludCB1bmdldGNoKCBpbnQgKSA9 IDA7Cgpwcm90ZWN0ZWQ6CiAgICB2b2lkIHNldEZsYWdzKCBpbnQgZiApIHsgaW9Nb2RlID0gZjsg fQogICAgdm9pZCBzZXRUeXBlKCBpbnQgKTsKICAgIHZvaWQgc2V0TW9kZSggaW50ICk7CiAgICB2 b2lkIHNldFN0YXRlKCBpbnQgKTsKICAgIHZvaWQgc2V0U3RhdHVzKCBpbnQgKTsKICAgIGludCBp b0luZGV4OwoKcHJpdmF0ZToKICAgIGludCBpb01vZGU7CiAgICBpbnQgaW9TdDsKCnByaXZhdGU6 CgogICAgUUlPRGV2aWNlKCBjb25zdCBRSU9EZXZpY2UgJiApOwogICAgUUlPRGV2aWNlICZvcGVy YXRvcj0oIGNvbnN0IFFJT0RldmljZSAmICk7Cgp9OwojIDQzICJxZGF0YXN0cmVhbS5oIiAyCiMg MSAicXN0cmluZy5oIiAxCiMgNDQgInFkYXRhc3RyZWFtLmgiIDIKCgoKY2xhc3MgUURhdGFTdHJl YW0KewpwdWJsaWM6CiAgICBRRGF0YVN0cmVhbSgpOwogICAgUURhdGFTdHJlYW0oIFFJT0Rldmlj ZSAqICk7CiAgICBRRGF0YVN0cmVhbSggUUJ5dGVBcnJheSwgaW50IG1vZGUgKTsKICAgIHZpcnR1 YWwgflFEYXRhU3RyZWFtKCk7CgogICAgUUlPRGV2aWNlICpkZXZpY2UoKSBjb25zdDsKICAgIHZv aWQgc2V0RGV2aWNlKCBRSU9EZXZpY2UgKiApOwogICAgdm9pZCB1bnNldERldmljZSgpOwoKICAg IGJvb2wgYXRFbmQoKSBjb25zdDsKICAgIGJvb2wgZW9mKCkgY29uc3Q7CgogICAgZW51bSBCeXRl T3JkZXIgeyBCaWdFbmRpYW4sIExpdHRsZUVuZGlhbiB9OwogICAgaW50IGJ5dGVPcmRlcigpIGNv bnN0OwogICAgdm9pZCBzZXRCeXRlT3JkZXIoIGludCApOwoKICAgIGJvb2wgaXNQcmludGFibGVE YXRhKCkgY29uc3Q7CiAgICB2b2lkIHNldFByaW50YWJsZURhdGEoIGJvb2wgKTsKCiAgICBpbnQg dmVyc2lvbigpIGNvbnN0OwogICAgdm9pZCBzZXRWZXJzaW9uKCBpbnQgKTsKCiAgICBRRGF0YVN0 cmVhbSAmb3BlcmF0b3I+PiggUV9JTlQ4ICZpICk7CiAgICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I+ PiggUV9VSU5UOCAmaSApOwogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIFFfSU5UMTYgJmkg KTsKICAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+KCBRX1VJTlQxNiAmaSApOwogICAgUURhdGFT dHJlYW0gJm9wZXJhdG9yPj4oIFFfSU5UMzIgJmkgKTsKICAgIFFEYXRhU3RyZWFtICZvcGVyYXRv cj4+KCBRX1VJTlQzMiAmaSApOwogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIFFfSU5UNjQg JmkgKTsKICAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+KCBRX1VJTlQ2NCAmaSApOwoKICAgIFFE YXRhU3RyZWFtICZvcGVyYXRvcj4+KCBmbG9hdCAmZiApOwogICAgUURhdGFTdHJlYW0gJm9wZXJh dG9yPj4oIGRvdWJsZSAmZiApOwogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIGNoYXIgKiZz dHIgKTsKCiAgICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I8PCggUV9JTlQ4IGkgKTsKICAgIFFEYXRh U3RyZWFtICZvcGVyYXRvcjw8KCBRX1VJTlQ4IGkgKTsKICAgIFFEYXRhU3RyZWFtICZvcGVyYXRv cjw8KCBRX0lOVDE2IGkgKTsKICAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcjw8KCBRX1VJTlQxNiBp ICk7CiAgICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I8PCggUV9JTlQzMiBpICk7CiAgICBRRGF0YVN0 cmVhbSAmb3BlcmF0b3I8PCggUV9VSU5UMzIgaSApOwogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9y PDwoIFFfSU5UNjQgaSApOwogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFfVUlOVDY0IGkg KTsKICAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcjw8KCBmbG9hdCBmICk7CiAgICBRRGF0YVN0cmVh bSAmb3BlcmF0b3I8PCggZG91YmxlIGYgKTsKICAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcjw8KCBj b25zdCBjaGFyICpzdHIgKTsKCiAgICBRRGF0YVN0cmVhbSAmcmVhZEJ5dGVzKCBjaGFyIComLCB1 aW50ICZsZW4gKTsKICAgIFFEYXRhU3RyZWFtICZyZWFkUmF3Qnl0ZXMoIGNoYXIgKiwgdWludCBs ZW4gKTsKCiAgICBRRGF0YVN0cmVhbSAmd3JpdGVCeXRlcyggY29uc3QgY2hhciAqLCB1aW50IGxl biApOwogICAgUURhdGFTdHJlYW0gJndyaXRlUmF3Qnl0ZXMoIGNvbnN0IGNoYXIgKiwgdWludCBs ZW4gKTsKCnByaXZhdGU6CiAgICBRSU9EZXZpY2UgKmRldjsKICAgIGJvb2wgb3duZGV2OwogICAg aW50IGJ5dGVvcmRlcjsKICAgIGJvb2wgcHJpbnRhYmxlOwogICAgYm9vbCBub3N3YXA7CiAgICBp bnQgdmVyOwoKcHJpdmF0ZToKCiAgICBRRGF0YVN0cmVhbSggY29uc3QgUURhdGFTdHJlYW0gJiAp OwogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPSggY29uc3QgUURhdGFTdHJlYW0gJiApOwoKfTsK CgoKCgoKaW5saW5lIFFJT0RldmljZSAqUURhdGFTdHJlYW06OmRldmljZSgpIGNvbnN0CnsgcmV0 dXJuIGRldjsgfQoKaW5saW5lIGJvb2wgUURhdGFTdHJlYW06OmF0RW5kKCkgY29uc3QKeyByZXR1 cm4gZGV2ID8gZGV2LT5hdEVuZCgpIDogVFJVRTsgfQoKaW5saW5lIGJvb2wgUURhdGFTdHJlYW06 OmVvZigpIGNvbnN0CnsgcmV0dXJuIGF0RW5kKCk7IH0KCmlubGluZSBpbnQgUURhdGFTdHJlYW06 OmJ5dGVPcmRlcigpIGNvbnN0CnsgcmV0dXJuIGJ5dGVvcmRlcjsgfQoKaW5saW5lIGJvb2wgUURh dGFTdHJlYW06OmlzUHJpbnRhYmxlRGF0YSgpIGNvbnN0CnsgcmV0dXJuIHByaW50YWJsZTsgfQoK aW5saW5lIHZvaWQgUURhdGFTdHJlYW06OnNldFByaW50YWJsZURhdGEoIGJvb2wgcCApCnsgcHJp bnRhYmxlID0gcDsgfQoKaW5saW5lIGludCBRRGF0YVN0cmVhbTo6dmVyc2lvbigpIGNvbnN0Cnsg cmV0dXJuIHZlcjsgfQoKaW5saW5lIHZvaWQgUURhdGFTdHJlYW06OnNldFZlcnNpb24oIGludCB2 ICkKeyB2ZXIgPSB2OyB9CgppbmxpbmUgUURhdGFTdHJlYW0gJlFEYXRhU3RyZWFtOjpvcGVyYXRv cj4+KCBRX1VJTlQ4ICZpICkKeyByZXR1cm4gKnRoaXMgPj4gKFFfSU5UOCYpaTsgfQoKaW5saW5l IFFEYXRhU3RyZWFtICZRRGF0YVN0cmVhbTo6b3BlcmF0b3I+PiggUV9VSU5UMTYgJmkgKQp7IHJl dHVybiAqdGhpcyA+PiAoUV9JTlQxNiYpaTsgfQoKaW5saW5lIFFEYXRhU3RyZWFtICZRRGF0YVN0 cmVhbTo6b3BlcmF0b3I+PiggUV9VSU5UMzIgJmkgKQp7IHJldHVybiAqdGhpcyA+PiAoUV9JTlQz MiYpaTsgfQoKaW5saW5lIFFEYXRhU3RyZWFtICZRRGF0YVN0cmVhbTo6b3BlcmF0b3I+PiggUV9V SU5UNjQgJmkgKQp7IHJldHVybiAqdGhpcyA+PiAoUV9JTlQ2NCYpaTsgfQoKaW5saW5lIFFEYXRh U3RyZWFtICZRRGF0YVN0cmVhbTo6b3BlcmF0b3I8PCggUV9VSU5UOCBpICkKeyByZXR1cm4gKnRo aXMgPDwgKFFfSU5UOClpOyB9CgppbmxpbmUgUURhdGFTdHJlYW0gJlFEYXRhU3RyZWFtOjpvcGVy YXRvcjw8KCBRX1VJTlQxNiBpICkKeyByZXR1cm4gKnRoaXMgPDwgKFFfSU5UMTYpaTsgfQoKaW5s aW5lIFFEYXRhU3RyZWFtICZRRGF0YVN0cmVhbTo6b3BlcmF0b3I8PCggUV9VSU5UMzIgaSApCnsg cmV0dXJuICp0aGlzIDw8IChRX0lOVDMyKWk7IH0KCmlubGluZSBRRGF0YVN0cmVhbSAmUURhdGFT dHJlYW06Om9wZXJhdG9yPDwoIFFfVUlOVDY0IGkgKQp7IHJldHVybiAqdGhpcyA8PCAoUV9JTlQ2 NClpOyB9CiMgNDIgInFnZGljdC5jcHAiIDIKIyAxICIvdXNyL2luY2x1ZGUvY3R5cGUuaCIgMSAz CiMgMjYgIi91c3IvaW5jbHVkZS9jdHlwZS5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVz LmgiIDEgMwojIDI3ICIvdXNyL2luY2x1ZGUvY3R5cGUuaCIgMiAzCiMgMSAiL3Vzci9pbmNsdWRl L2JpdHMvdHlwZXMuaCIgMSAzCiMgMjYgIi91c3IvaW5jbHVkZS9iaXRzL3R5cGVzLmgiIDMKIyAx ICIvdXNyL2luY2x1ZGUvZmVhdHVyZXMuaCIgMSAzCiMgMjcgIi91c3IvaW5jbHVkZS9iaXRzL3R5 cGVzLmgiIDIgMwoKCiMgMSAiL3Vzci9sb2NhbC9saWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdu dS8zLjEvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCiMgMzAgIi91c3IvaW5jbHVkZS9iaXRzL3R5cGVz LmgiIDIgMwoKCnR5cGVkZWYgdW5zaWduZWQgY2hhciBfX3VfY2hhcjsKdHlwZWRlZiB1bnNpZ25l ZCBzaG9ydCBfX3Vfc2hvcnQ7CnR5cGVkZWYgdW5zaWduZWQgaW50IF9fdV9pbnQ7CnR5cGVkZWYg dW5zaWduZWQgbG9uZyBfX3VfbG9uZzsKCl9fZXh0ZW5zaW9uX18gdHlwZWRlZiB1bnNpZ25lZCBs b25nIGxvbmcgaW50IF9fdV9xdWFkX3Q7Cl9fZXh0ZW5zaW9uX18gdHlwZWRlZiBsb25nIGxvbmcg aW50IF9fcXVhZF90OwojIDQ5ICIvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIiAzCnR5cGVkZWYg c2lnbmVkIGNoYXIgX19pbnQ4X3Q7CnR5cGVkZWYgdW5zaWduZWQgY2hhciBfX3VpbnQ4X3Q7CnR5 cGVkZWYgc2lnbmVkIHNob3J0IGludCBfX2ludDE2X3Q7CnR5cGVkZWYgdW5zaWduZWQgc2hvcnQg aW50IF9fdWludDE2X3Q7CnR5cGVkZWYgc2lnbmVkIGludCBfX2ludDMyX3Q7CnR5cGVkZWYgdW5z aWduZWQgaW50IF9fdWludDMyX3Q7CgpfX2V4dGVuc2lvbl9fIHR5cGVkZWYgc2lnbmVkIGxvbmcg bG9uZyBpbnQgX19pbnQ2NF90OwpfX2V4dGVuc2lvbl9fIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBs b25nIGludCBfX3VpbnQ2NF90OwoKdHlwZWRlZiBfX3F1YWRfdCAqX19xYWRkcl90OwoKdHlwZWRl ZiBfX3VfcXVhZF90IF9fZGV2X3Q7CnR5cGVkZWYgX191X2ludCBfX3VpZF90Owp0eXBlZGVmIF9f dV9pbnQgX19naWRfdDsKdHlwZWRlZiBfX3VfbG9uZyBfX2lub190Owp0eXBlZGVmIF9fdV9pbnQg X19tb2RlX3Q7CnR5cGVkZWYgX191X2ludCBfX25saW5rX3Q7CnR5cGVkZWYgbG9uZyBpbnQgX19v ZmZfdDsKdHlwZWRlZiBfX3F1YWRfdCBfX2xvZmZfdDsKdHlwZWRlZiBpbnQgX19waWRfdDsKdHlw ZWRlZiBpbnQgX19zc2l6ZV90Owp0eXBlZGVmIF9fdV9sb25nIF9fcmxpbV90Owp0eXBlZGVmIF9f dV9xdWFkX3QgX19ybGltNjRfdDsKdHlwZWRlZiBfX3VfaW50IF9faWRfdDsKCnR5cGVkZWYgc3Ry dWN0CiAgewogICAgaW50IF9fdmFsWzJdOwogIH0gX19mc2lkX3Q7CgoKdHlwZWRlZiBpbnQgX19k YWRkcl90Owp0eXBlZGVmIGNoYXIgKl9fY2FkZHJfdDsKdHlwZWRlZiBsb25nIGludCBfX3RpbWVf dDsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgX191c2Vjb25kc190Owp0eXBlZGVmIGxvbmcgaW50IF9f c3VzZWNvbmRzX3Q7CnR5cGVkZWYgbG9uZyBpbnQgX19zd2Jsa190OwoKdHlwZWRlZiBsb25nIGlu dCBfX2Nsb2NrX3Q7CgoKdHlwZWRlZiBpbnQgX19jbG9ja2lkX3Q7CgoKdHlwZWRlZiBpbnQgX190 aW1lcl90OwoKCgoKCgp0eXBlZGVmIGludCBfX2tleV90OwoKCnR5cGVkZWYgdW5zaWduZWQgc2hv cnQgaW50IF9faXBjX3BpZF90OwoKCgp0eXBlZGVmIGxvbmcgaW50IF9fYmxrc2l6ZV90OwoKCgoK dHlwZWRlZiBsb25nIGludCBfX2Jsa2NudF90Owp0eXBlZGVmIF9fcXVhZF90IF9fYmxrY250NjRf dDsKCgp0eXBlZGVmIF9fdV9sb25nIF9fZnNibGtjbnRfdDsKdHlwZWRlZiBfX3VfcXVhZF90IF9f ZnNibGtjbnQ2NF90OwoKCnR5cGVkZWYgX191X2xvbmcgX19mc2ZpbGNudF90Owp0eXBlZGVmIF9f dV9xdWFkX3QgX19mc2ZpbGNudDY0X3Q7CgoKdHlwZWRlZiBfX3VfcXVhZF90IF9faW5vNjRfdDsK Cgp0eXBlZGVmIF9fbG9mZl90IF9fb2ZmNjRfdDsKCgp0eXBlZGVmIGxvbmcgaW50IF9fdF9zY2Fs YXJfdDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBfX3RfdXNjYWxhcl90OwoKCnR5cGVkZWYg aW50IF9faW50cHRyX3Q7CgoKdHlwZWRlZiB1bnNpZ25lZCBpbnQgX19zb2NrbGVuX3Q7CgoKCgoj IDEgIi91c3IvaW5jbHVkZS9iaXRzL3B0aHJlYWR0eXBlcy5oIiAxIDMKIyAyMyAiL3Vzci9pbmNs dWRlL2JpdHMvcHRocmVhZHR5cGVzLmgiIDMKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9zY2hlZC5o IiAxIDMKIyA2OCAiL3Vzci9pbmNsdWRlL2JpdHMvc2NoZWQuaCIgMwpzdHJ1Y3QgX19zY2hlZF9w YXJhbQogIHsKICAgIGludCBfX3NjaGVkX3ByaW9yaXR5OwogIH07CiMgMjQgIi91c3IvaW5jbHVk ZS9iaXRzL3B0aHJlYWR0eXBlcy5oIiAyIDMKCgpzdHJ1Y3QgX3B0aHJlYWRfZmFzdGxvY2sKewog IGxvbmcgaW50IF9fc3RhdHVzOwogIGludCBfX3NwaW5sb2NrOwoKfTsKCgoKdHlwZWRlZiBzdHJ1 Y3QgX3B0aHJlYWRfZGVzY3Jfc3RydWN0ICpfcHRocmVhZF9kZXNjcjsKCgoKCgp0eXBlZGVmIHN0 cnVjdCBfX3B0aHJlYWRfYXR0cl9zCnsKICBpbnQgX19kZXRhY2hzdGF0ZTsKICBpbnQgX19zY2hl ZHBvbGljeTsKICBzdHJ1Y3QgX19zY2hlZF9wYXJhbSBfX3NjaGVkcGFyYW07CiAgaW50IF9faW5o ZXJpdHNjaGVkOwogIGludCBfX3Njb3BlOwogIHNpemVfdCBfX2d1YXJkc2l6ZTsKICBpbnQgX19z dGFja2FkZHJfc2V0OwogIHZvaWQgKl9fc3RhY2thZGRyOwogIHNpemVfdCBfX3N0YWNrc2l6ZTsK fSBwdGhyZWFkX2F0dHJfdDsKCgoKdHlwZWRlZiBzdHJ1Y3QKewogIHN0cnVjdCBfcHRocmVhZF9m YXN0bG9jayBfX2NfbG9jazsKICBfcHRocmVhZF9kZXNjciBfX2Nfd2FpdGluZzsKfSBwdGhyZWFk X2NvbmRfdDsKCgoKdHlwZWRlZiBzdHJ1Y3QKewogIGludCBfX2R1bW15Owp9IHB0aHJlYWRfY29u ZGF0dHJfdDsKCgp0eXBlZGVmIHVuc2lnbmVkIGludCBwdGhyZWFkX2tleV90OwoKCgoKCnR5cGVk ZWYgc3RydWN0CnsKICBpbnQgX19tX3Jlc2VydmVkOwogIGludCBfX21fY291bnQ7CiAgX3B0aHJl YWRfZGVzY3IgX19tX293bmVyOwogIGludCBfX21fa2luZDsKICBzdHJ1Y3QgX3B0aHJlYWRfZmFz dGxvY2sgX19tX2xvY2s7Cn0gcHRocmVhZF9tdXRleF90OwoKCgp0eXBlZGVmIHN0cnVjdAp7CiAg aW50IF9fbXV0ZXhraW5kOwp9IHB0aHJlYWRfbXV0ZXhhdHRyX3Q7CgoKCnR5cGVkZWYgaW50IHB0 aHJlYWRfb25jZV90OwoKCgoKdHlwZWRlZiBzdHJ1Y3QgX3B0aHJlYWRfcndsb2NrX3QKewogIHN0 cnVjdCBfcHRocmVhZF9mYXN0bG9jayBfX3J3X2xvY2s7CiAgaW50IF9fcndfcmVhZGVyczsKICBf cHRocmVhZF9kZXNjciBfX3J3X3dyaXRlcjsKICBfcHRocmVhZF9kZXNjciBfX3J3X3JlYWRfd2Fp dGluZzsKICBfcHRocmVhZF9kZXNjciBfX3J3X3dyaXRlX3dhaXRpbmc7CiAgaW50IF9fcndfa2lu ZDsKICBpbnQgX19yd19wc2hhcmVkOwp9IHB0aHJlYWRfcndsb2NrX3Q7CgoKCnR5cGVkZWYgc3Ry dWN0CnsKICBpbnQgX19sb2Nra2luZDsKICBpbnQgX19wc2hhcmVkOwp9IHB0aHJlYWRfcndsb2Nr YXR0cl90OwoKCgoKdHlwZWRlZiB2b2xhdGlsZSBpbnQgcHRocmVhZF9zcGlubG9ja190OwoKCnR5 cGVkZWYgc3RydWN0IHsKICBzdHJ1Y3QgX3B0aHJlYWRfZmFzdGxvY2sgX19iYV9sb2NrOwogIGlu dCBfX2JhX3JlcXVpcmVkOwogIGludCBfX2JhX3ByZXNlbnQ7CiAgX3B0aHJlYWRfZGVzY3IgX19i YV93YWl0aW5nOwp9IHB0aHJlYWRfYmFycmllcl90OwoKCnR5cGVkZWYgc3RydWN0IHsKICBpbnQg X19wc2hhcmVkOwp9IHB0aHJlYWRfYmFycmllcmF0dHJfdDsKCgoKCgp0eXBlZGVmIHVuc2lnbmVk IGxvbmcgaW50IHB0aHJlYWRfdDsKIyAxNDQgIi91c3IvaW5jbHVkZS9iaXRzL3R5cGVzLmgiIDIg MwojIDI4ICIvdXNyL2luY2x1ZGUvY3R5cGUuaCIgMiAzCgpleHRlcm4gIkMiIHsKIyA0MCAiL3Vz ci9pbmNsdWRlL2N0eXBlLmgiIDMKIyAxICIvdXNyL2luY2x1ZGUvZW5kaWFuLmgiIDEgMwojIDIy ICIvdXNyL2luY2x1ZGUvZW5kaWFuLmgiIDMKIyAxICIvdXNyL2luY2x1ZGUvZmVhdHVyZXMuaCIg MSAzCiMgMjMgIi91c3IvaW5jbHVkZS9lbmRpYW4uaCIgMiAzCiMgMzcgIi91c3IvaW5jbHVkZS9l bmRpYW4uaCIgMwojIDEgIi91c3IvaW5jbHVkZS9iaXRzL2VuZGlhbi5oIiAxIDMKIyAzOCAiL3Vz ci9pbmNsdWRlL2VuZGlhbi5oIiAyIDMKIyA0MSAiL3Vzci9pbmNsdWRlL2N0eXBlLmgiIDIgMwoK CgoKCgplbnVtCnsKICBfSVN1cHBlciA9ICgoMCkgPCA4ID8gKCgxIDw8ICgwKSkgPDwgOCkgOiAo KDEgPDwgKDApKSA+PiA4KSksCiAgX0lTbG93ZXIgPSAoKDEpIDwgOCA/ICgoMSA8PCAoMSkpIDw8 IDgpIDogKCgxIDw8ICgxKSkgPj4gOCkpLAogIF9JU2FscGhhID0gKCgyKSA8IDggPyAoKDEgPDwg KDIpKSA8PCA4KSA6ICgoMSA8PCAoMikpID4+IDgpKSwKICBfSVNkaWdpdCA9ICgoMykgPCA4ID8g KCgxIDw8ICgzKSkgPDwgOCkgOiAoKDEgPDwgKDMpKSA+PiA4KSksCiAgX0lTeGRpZ2l0ID0gKCg0 KSA8IDggPyAoKDEgPDwgKDQpKSA8PCA4KSA6ICgoMSA8PCAoNCkpID4+IDgpKSwKICBfSVNzcGFj ZSA9ICgoNSkgPCA4ID8gKCgxIDw8ICg1KSkgPDwgOCkgOiAoKDEgPDwgKDUpKSA+PiA4KSksCiAg X0lTcHJpbnQgPSAoKDYpIDwgOCA/ICgoMSA8PCAoNikpIDw8IDgpIDogKCgxIDw8ICg2KSkgPj4g OCkpLAogIF9JU2dyYXBoID0gKCg3KSA8IDggPyAoKDEgPDwgKDcpKSA8PCA4KSA6ICgoMSA8PCAo NykpID4+IDgpKSwKICBfSVNibGFuayA9ICgoOCkgPCA4ID8gKCgxIDw8ICg4KSkgPDwgOCkgOiAo KDEgPDwgKDgpKSA+PiA4KSksCiAgX0lTY250cmwgPSAoKDkpIDwgOCA/ICgoMSA8PCAoOSkpIDw8 IDgpIDogKCgxIDw8ICg5KSkgPj4gOCkpLAogIF9JU3B1bmN0ID0gKCgxMCkgPCA4ID8gKCgxIDw8 ICgxMCkpIDw8IDgpIDogKCgxIDw8ICgxMCkpID4+IDgpKSwKICBfSVNhbG51bSA9ICgoMTEpIDwg OCA/ICgoMSA8PCAoMTEpKSA8PCA4KSA6ICgoMSA8PCAoMTEpKSA+PiA4KSkKfTsKIyA3NSAiL3Vz ci9pbmNsdWRlL2N0eXBlLmgiIDMKZXh0ZXJuIF9fY29uc3QgdW5zaWduZWQgc2hvcnQgaW50ICpf X2N0eXBlX2I7CmV4dGVybiBfX2NvbnN0IF9faW50MzJfdCAqX19jdHlwZV90b2xvd2VyOwpleHRl cm4gX19jb25zdCBfX2ludDMyX3QgKl9fY3R5cGVfdG91cHBlcjsKIyA5MSAiL3Vzci9pbmNsdWRl L2N0eXBlLmgiIDMKZXh0ZXJuIGludCBpc2FsbnVtIChpbnQpIHRocm93ICgpOwpleHRlcm4gaW50 IGlzYWxwaGEgKGludCkgdGhyb3cgKCk7CmV4dGVybiBpbnQgaXNjbnRybCAoaW50KSB0aHJvdyAo KTsKZXh0ZXJuIGludCBpc2RpZ2l0IChpbnQpIHRocm93ICgpOwpleHRlcm4gaW50IGlzbG93ZXIg KGludCkgdGhyb3cgKCk7CmV4dGVybiBpbnQgaXNncmFwaCAoaW50KSB0aHJvdyAoKTsKZXh0ZXJu IGludCBpc3ByaW50IChpbnQpIHRocm93ICgpOwpleHRlcm4gaW50IGlzcHVuY3QgKGludCkgdGhy b3cgKCk7CmV4dGVybiBpbnQgaXNzcGFjZSAoaW50KSB0aHJvdyAoKTsKZXh0ZXJuIGludCBpc3Vw cGVyIChpbnQpIHRocm93ICgpOwpleHRlcm4gaW50IGlzeGRpZ2l0IChpbnQpIHRocm93ICgpOwoK CmV4dGVybiBpbnQgaXNibGFuayAoaW50KSB0aHJvdyAoKTsKCgoKCmV4dGVybiBpbnQgdG9sb3dl ciAoaW50IF9fYykgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCB0b3VwcGVyIChpbnQgX19jKSB0aHJv dyAoKTsKCgoKCgoKZXh0ZXJuIGludCBpc2FzY2lpIChpbnQgX19jKSB0aHJvdyAoKTsKCgoKZXh0 ZXJuIGludCB0b2FzY2lpIChpbnQgX19jKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBfdG91cHBl ciAoaW50KSB0aHJvdyAoKTsKZXh0ZXJuIGludCBfdG9sb3dlciAoaW50KSB0aHJvdyAoKTsKIyAx NjggIi91c3IvaW5jbHVkZS9jdHlwZS5oIiAzCmV4dGVybiBfX2lubGluZSBpbnQKdG9sb3dlciAo aW50IF9fYykgdGhyb3cgKCkKewogIHJldHVybiBfX2MgPj0gLTEyOCAmJiBfX2MgPCAyNTYgPyBf X2N0eXBlX3RvbG93ZXJbX19jXSA6IF9fYzsKfQoKZXh0ZXJuIF9faW5saW5lIGludAp0b3VwcGVy IChpbnQgX19jKSB0aHJvdyAoKQp7CiAgcmV0dXJuIF9fYyA+PSAtMTI4ICYmIF9fYyA8IDI1NiA/ IF9fY3R5cGVfdG91cHBlcltfX2NdIDogX19jOwp9CiMgMjExICIvdXNyL2luY2x1ZGUvY3R5cGUu aCIgMwojIDEgIi91c3IvaW5jbHVkZS94bG9jYWxlLmgiIDEgMwojIDIxMiAiL3Vzci9pbmNsdWRl L2N0eXBlLmgiIDIgMwojIDIyNCAiL3Vzci9pbmNsdWRlL2N0eXBlLmgiIDMKZXh0ZXJuIGludCBf X2lzYWxudW1fbCAoaW50LCBfX2xvY2FsZV90KSB0aHJvdyAoKTsKZXh0ZXJuIGludCBfX2lzYWxw aGFfbCAoaW50LCBfX2xvY2FsZV90KSB0aHJvdyAoKTsKZXh0ZXJuIGludCBfX2lzY250cmxfbCAo aW50LCBfX2xvY2FsZV90KSB0aHJvdyAoKTsKZXh0ZXJuIGludCBfX2lzZGlnaXRfbCAoaW50LCBf X2xvY2FsZV90KSB0aHJvdyAoKTsKZXh0ZXJuIGludCBfX2lzbG93ZXJfbCAoaW50LCBfX2xvY2Fs ZV90KSB0aHJvdyAoKTsKZXh0ZXJuIGludCBfX2lzZ3JhcGhfbCAoaW50LCBfX2xvY2FsZV90KSB0 aHJvdyAoKTsKZXh0ZXJuIGludCBfX2lzcHJpbnRfbCAoaW50LCBfX2xvY2FsZV90KSB0aHJvdyAo KTsKZXh0ZXJuIGludCBfX2lzcHVuY3RfbCAoaW50LCBfX2xvY2FsZV90KSB0aHJvdyAoKTsKZXh0 ZXJuIGludCBfX2lzc3BhY2VfbCAoaW50LCBfX2xvY2FsZV90KSB0aHJvdyAoKTsKZXh0ZXJuIGlu dCBfX2lzdXBwZXJfbCAoaW50LCBfX2xvY2FsZV90KSB0aHJvdyAoKTsKZXh0ZXJuIGludCBfX2lz eGRpZ2l0X2wgKGludCwgX19sb2NhbGVfdCkgdGhyb3cgKCk7CgpleHRlcm4gaW50IF9faXNibGFu a19sIChpbnQsIF9fbG9jYWxlX3QpIHRocm93ICgpOwoKCgpleHRlcm4gaW50IF9fdG9sb3dlcl9s IChpbnQgX19jLCBfX2xvY2FsZV90IF9fbCkgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBfX3RvdXBw ZXJfbCAoaW50IF9fYywgX19sb2NhbGVfdCBfX2wpIHRocm93ICgpOwojIDI3NyAiL3Vzci9pbmNs dWRlL2N0eXBlLmgiIDMKfQojIDQzICJxZ2RpY3QuY3BwIiAyCiMgNjIgInFnZGljdC5jcHAiCnN0 YXRpYyBjb25zdCBpbnQgb3BfZmluZCA9IDA7CnN0YXRpYyBjb25zdCBpbnQgb3BfaW5zZXJ0ID0g MTsKc3RhdGljIGNvbnN0IGludCBvcF9yZXBsYWNlID0gMjsKCgpjbGFzcyBRR0RJdExpc3QgOiBw dWJsaWMgUUxpc3Q8UUdEaWN0SXRlcmF0b3I+CnsKcHVibGljOgogICAgUUdESXRMaXN0KCkgOiBR TGlzdDxRR0RpY3RJdGVyYXRvcj4oKSB7fQogICAgUUdESXRMaXN0KCBjb25zdCBRR0RJdExpc3Qg Jmxpc3QgKSA6IFFMaXN0PFFHRGljdEl0ZXJhdG9yPihsaXN0KSB7fQogICB+UUdESXRMaXN0KCkg eyBjbGVhcigpOyB9CiAgICBRR0RJdExpc3QgJm9wZXJhdG9yPShjb25zdCBRR0RJdExpc3QgJmxp c3QpCiAgICAgICAgeyByZXR1cm4gKFFHREl0TGlzdCYpUUxpc3Q8UUdEaWN0SXRlcmF0b3I+Ojpv cGVyYXRvcj0obGlzdCk7IH0KfTsKIyA4NyAicWdkaWN0LmNwcCIKaW50IFFHRGljdDo6aGFzaEtl eVN0cmluZyggY29uc3QgUVN0cmluZyAma2V5ICkKewoKICAgIGlmICgga2V5LmlzTnVsbCgpICkK ICAgICAgICBxV2FybmluZyggIlFHRGljdDo6aGFzaFN0cmluZ0tleTogSW52YWxpZCBudWxsIGtl eSIgKTsKCiAgICBpbnQgaTsKICAgIHJlZ2lzdGVyIHVpbnQgaD0wOwogICAgdWludCBnOwogICAg Y29uc3QgUUNoYXIgKnAgPSBrZXkudW5pY29kZSgpOwogICAgaWYgKCBjYXNlcyApIHsKICAgICAg ICBmb3IgKCBpPTA7IGk8KGludClrZXkubGVuZ3RoKCk7IGkrKyApIHsKICAgICAgICAgICAgaCA9 IChoPDw0KSArIHBbaV0uY2VsbCgpOwogICAgICAgICAgICBpZiAoIChnID0gaCAmIDB4ZjAwMDAw MDApICkKICAgICAgICAgICAgICAgIGggXj0gZyA+PiAyNDsKICAgICAgICAgICAgaCAmPSB+ZzsK ICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGZvciAoIGk9MDsgaTwoaW50KWtleS5sZW5n dGgoKTsgaSsrICkgewogICAgICAgICAgICBoID0gKGg8PDQpICsgcFtpXS5sb3dlcigpLmNlbGwo KTsKICAgICAgICAgICAgaWYgKCAoZyA9IGggJiAweGYwMDAwMDAwKSApCiAgICAgICAgICAgICAg ICBoIF49IGcgPj4gMjQ7CiAgICAgICAgICAgIGggJj0gfmc7CiAgICAgICAgfQogICAgfQogICAg aW50IGluZGV4ID0gaDsKICAgIGlmICggaW5kZXggPCAwICkKICAgICAgICBpbmRleCA9IC1pbmRl eDsKICAgIHJldHVybiBpbmRleDsKfQoKCgoKCgppbnQgUUdEaWN0OjpoYXNoS2V5QXNjaWkoIGNv bnN0IGNoYXIgKmtleSApCnsKCiAgICBpZiAoIGtleSA9PSAwICkKICAgICAgICBxV2FybmluZygg IlFHRGljdDo6aGFzaEFzY2lpS2V5OiBJbnZhbGlkIG51bGwga2V5IiApOwoKICAgIHJlZ2lzdGVy IGNvbnN0IGNoYXIgKmsgPSBrZXk7CiAgICByZWdpc3RlciB1aW50IGg9MDsKICAgIHVpbnQgZzsK ICAgIGlmICggY2FzZXMgKSB7CiAgICAgICAgd2hpbGUgKCAqayApIHsKICAgICAgICAgICAgaCA9 IChoPDw0KSArICprKys7CiAgICAgICAgICAgIGlmICggKGcgPSBoICYgMHhmMDAwMDAwMCkgKQog ICAgICAgICAgICAgICAgaCBePSBnID4+IDI0OwogICAgICAgICAgICBoICY9IH5nOwogICAgICAg IH0KICAgIH0gZWxzZSB7CiAgICAgICAgd2hpbGUgKCAqayApIHsKICAgICAgICAgICAgaCA9ICho PDw0KSArIHRvbG93ZXIoKmspOwogICAgICAgICAgICBpZiAoIChnID0gaCAmIDB4ZjAwMDAwMDAp ICkKICAgICAgICAgICAgICAgIGggXj0gZyA+PiAyNDsKICAgICAgICAgICAgaCAmPSB+ZzsKICAg ICAgICAgICAgaysrOwogICAgICAgIH0KICAgIH0KICAgIGludCBpbmRleCA9IGg7CiAgICBpZiAo IGluZGV4IDwgMCApCiAgICAgICAgaW5kZXggPSAtaW5kZXg7CiAgICByZXR1cm4gaW5kZXg7Cn0K IyAxNjUgInFnZGljdC5jcHAiClFEYXRhU3RyZWFtJiBRR0RpY3Q6OnJlYWQoIFFEYXRhU3RyZWFt ICZzLCBRQ29sbGVjdGlvbjo6SXRlbSAmaXRlbSApCnsKICAgIGl0ZW0gPSAwOwogICAgcmV0dXJu IHM7Cn0KIyAxNzggInFnZGljdC5jcHAiClFEYXRhU3RyZWFtJiBRR0RpY3Q6OndyaXRlKCBRRGF0 YVN0cmVhbSAmcywgUUNvbGxlY3Rpb246Okl0ZW0gKSBjb25zdAp7CiAgICByZXR1cm4gczsKfQoj IDE5MyAicWdkaWN0LmNwcCIKUUdEaWN0OjpRR0RpY3QoIHVpbnQgbGVuLCBLZXlUeXBlIGt0LCBi b29sIGNhc2VTZW5zaXRpdmUsIGJvb2wgY29weUtleXMgKQp7CiAgICBpbml0KCBsZW4sIGt0LCBj YXNlU2Vuc2l0aXZlLCBjb3B5S2V5cyApOwp9CgoKdm9pZCBRR0RpY3Q6OmluaXQoIHVpbnQgbGVu LCBLZXlUeXBlIGt0LCBib29sIGNhc2VTZW5zaXRpdmUsIGJvb2wgY29weUtleXMgKQp7CiAgICB2 ZWMgPSBuZXcgUUJhc2VCdWNrZXQgKlt2bGVuID0gbGVuXTsKICAgIChxdF9jaGVja19wb2ludGVy KCh2ZWMpPT0wLCJxZ2RpY3QuY3BwIiwyMDIpKTsKICAgIG1lbXNldCggKGNoYXIqKXZlYywgMCwg dmxlbipzaXplb2YoUUJhc2VCdWNrZXQqKSApOwogICAgbnVtSXRlbXMgPSAwOwogICAgaXRlcmF0 b3JzID0gMDsKCgogICAgc3dpdGNoICggKGtleXR5cGUgPSAodWludClrdCkgKSB7CiAgICAgICAg Y2FzZSBTdHJpbmdLZXk6CiAgICAgICAgICAgIGNhc2VzID0gY2FzZVNlbnNpdGl2ZTsKICAgICAg ICAgICAgY29weWsgPSBGQUxTRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBc2Np aUtleToKICAgICAgICAgICAgY2FzZXMgPSBjYXNlU2Vuc2l0aXZlOwogICAgICAgICAgICBjb3B5 ayA9IGNvcHlLZXlzOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAg ICAgICBjYXNlcyA9IEZBTFNFOwogICAgICAgICAgICBjb3B5ayA9IEZBTFNFOwogICAgICAgICAg ICBicmVhazsKICAgIH0KfQoKCgoKCgoKUUdEaWN0OjpRR0RpY3QoIGNvbnN0IFFHRGljdCAmIGRp Y3QgKQogICAgOiBRQ29sbGVjdGlvbiggZGljdCApCnsKICAgIGluaXQoIGRpY3QudmxlbiwgKEtl eVR5cGUpZGljdC5rZXl0eXBlLCBkaWN0LmNhc2VzLCBkaWN0LmNvcHlrICk7CiAgICBRR0RpY3RJ dGVyYXRvciBpdCggZGljdCApOwogICAgd2hpbGUgKCBpdC5nZXQoKSApIHsKICAgICAgICBzd2l0 Y2ggKCBrZXl0eXBlICkgewogICAgICAgICAgICBjYXNlIFN0cmluZ0tleToKICAgICAgICAgICAg ICAgIGxvb2tfc3RyaW5nKCBpdC5nZXRLZXlTdHJpbmcoKSwgaXQuZ2V0KCksIG9wX2luc2VydCAp OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgQXNjaWlLZXk6CiAgICAg ICAgICAgICAgICBsb29rX2FzY2lpKCBpdC5nZXRLZXlBc2NpaSgpLCBpdC5nZXQoKSwgb3BfaW5z ZXJ0ICk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBJbnRLZXk6CiAg ICAgICAgICAgICAgICBsb29rX2ludCggaXQuZ2V0S2V5SW50KCksIGl0LmdldCgpLCBvcF9pbnNl cnQgKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFB0cktleToKICAg ICAgICAgICAgICAgIGxvb2tfcHRyKCBpdC5nZXRLZXlQdHIoKSwgaXQuZ2V0KCksIG9wX2luc2Vy dCApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgICsraXQ7CiAgICB9 Cn0KCgoKCgoKClFHRGljdDo6flFHRGljdCgpCnsKICAgIGNsZWFyKCk7CiAgICBkZWxldGUgW10g dmVjOwogICAgaWYgKCAhaXRlcmF0b3JzICkKICAgICAgICByZXR1cm47CiAgICBRR0RpY3RJdGVy YXRvciAqaSA9IGl0ZXJhdG9ycy0+Zmlyc3QoKTsKICAgIHdoaWxlICggaSApIHsKICAgICAgICBp LT5kaWN0ID0gMDsKICAgICAgICBpID0gaXRlcmF0b3JzLT5uZXh0KCk7CiAgICB9CiAgICBkZWxl dGUgaXRlcmF0b3JzOwp9CgoKCgoKCgpRR0RpY3QgJlFHRGljdDo6b3BlcmF0b3I9KCBjb25zdCBR R0RpY3QgJmRpY3QgKQp7CiAgICBjbGVhcigpOwogICAgUUdEaWN0SXRlcmF0b3IgaXQoIGRpY3Qg KTsKICAgIHdoaWxlICggaXQuZ2V0KCkgKSB7CiAgICAgICAgc3dpdGNoICgga2V5dHlwZSApIHsK ICAgICAgICAgICAgY2FzZSBTdHJpbmdLZXk6CiAgICAgICAgICAgICAgICBsb29rX3N0cmluZygg aXQuZ2V0S2V5U3RyaW5nKCksIGl0LmdldCgpLCBvcF9pbnNlcnQgKTsKICAgICAgICAgICAgICAg IGJyZWFrOwogICAgICAgICAgICBjYXNlIEFzY2lpS2V5OgogICAgICAgICAgICAgICAgbG9va19h c2NpaSggaXQuZ2V0S2V5QXNjaWkoKSwgaXQuZ2V0KCksIG9wX2luc2VydCApOwogICAgICAgICAg ICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgSW50S2V5OgogICAgICAgICAgICAgICAgbG9v a19pbnQoIGl0LmdldEtleUludCgpLCBpdC5nZXQoKSwgb3BfaW5zZXJ0ICk7CiAgICAgICAgICAg ICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBQdHJLZXk6CiAgICAgICAgICAgICAgICBsb29r X3B0ciggaXQuZ2V0S2V5UHRyKCksIGl0LmdldCgpLCBvcF9pbnNlcnQgKTsKICAgICAgICAgICAg ICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICArK2l0OwogICAgfQogICAgcmV0dXJuICp0aGlz Owp9CiMgMzUzICJxZ2RpY3QuY3BwIgpRQ29sbGVjdGlvbjo6SXRlbSBRR0RpY3Q6Omxvb2tfc3Ry aW5nKCBjb25zdCBRU3RyaW5nICZrZXksIFFDb2xsZWN0aW9uOjpJdGVtIGQsIGludCBvcCApCnsK ICAgIFFTdHJpbmdCdWNrZXQgKm47CiAgICBpbnQgaW5kZXggPSBoYXNoS2V5U3RyaW5nKGtleSkg JSB2bGVuOwogICAgaWYgKCBvcCA9PSBvcF9maW5kICkgewogICAgICAgIGlmICggY2FzZXMgKSB7 CiAgICAgICAgICAgIGZvciAoIG49KFFTdHJpbmdCdWNrZXQqKXZlY1tpbmRleF07IG47CiAgICAg ICAgICAgICAgICAgIG49KFFTdHJpbmdCdWNrZXQqKW4tPmdldE5leHQoKSApIHsKICAgICAgICAg ICAgICAgIGlmICgga2V5ID09IG4tPmdldEtleSgpICkKICAgICAgICAgICAgICAgICAgICByZXR1 cm4gbi0+Z2V0RGF0YSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAg ICAgUVN0cmluZyBrID0ga2V5Lmxvd2VyKCk7CiAgICAgICAgICAgIGZvciAoIG49KFFTdHJpbmdC dWNrZXQqKXZlY1tpbmRleF07IG47CiAgICAgICAgICAgICAgICAgIG49KFFTdHJpbmdCdWNrZXQq KW4tPmdldE5leHQoKSApIHsKICAgICAgICAgICAgICAgIGlmICggayA9PSBuLT5nZXRLZXkoKS5s b3dlcigpICkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi0+Z2V0RGF0YSgpOwogICAgICAg ICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKCBvcCA9PSBv cF9yZXBsYWNlICkgewogICAgICAgIGlmICggdmVjW2luZGV4XSAhPSAwICkKICAgICAgICAgICAg cmVtb3ZlX3N0cmluZygga2V5ICk7CiAgICB9CgogICAgbiA9IG5ldyBRU3RyaW5nQnVja2V0KGtl eSxuZXdJdGVtKGQpLHZlY1tpbmRleF0pOwogICAgKHF0X2NoZWNrX3BvaW50ZXIoKG4pPT0wLCJx Z2RpY3QuY3BwIiwzODApKTsKCiAgICBpZiAoIG4tPmdldERhdGEoKSA9PSAwICkKICAgICAgICBx V2FybmluZyggIlFEaWN0OiBDYW5ub3QgaW5zZXJ0IG51bGwgaXRlbSIgKTsKCiAgICB2ZWNbaW5k ZXhdID0gbjsKICAgIG51bUl0ZW1zKys7CiAgICByZXR1cm4gbi0+Z2V0RGF0YSgpOwp9CgoKCgpR Q29sbGVjdGlvbjo6SXRlbSBRR0RpY3Q6Omxvb2tfYXNjaWkoIGNvbnN0IGNoYXIgKmtleSwgUUNv bGxlY3Rpb246Okl0ZW0gZCwgaW50IG9wICkKewogICAgUUFzY2lpQnVja2V0ICpuOwogICAgaW50 IGluZGV4ID0gaGFzaEtleUFzY2lpKGtleSkgJSB2bGVuOwogICAgaWYgKCBvcCA9PSBvcF9maW5k ICkgewogICAgICAgIGlmICggY2FzZXMgKSB7CiAgICAgICAgICAgIGZvciAoIG49KFFBc2NpaUJ1 Y2tldCopdmVjW2luZGV4XTsgbjsKICAgICAgICAgICAgICAgICAgbj0oUUFzY2lpQnVja2V0Kilu LT5nZXROZXh0KCkgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHFzdHJjbXAobi0+Z2V0S2V5KCks a2V5KSA9PSAwICkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi0+Z2V0RGF0YSgpOwogICAg ICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yICggbj0oUUFzY2lpQnVj a2V0Kil2ZWNbaW5kZXhdOyBuOwogICAgICAgICAgICAgICAgICBuPShRQXNjaWlCdWNrZXQqKW4t PmdldE5leHQoKSApIHsKICAgICAgICAgICAgICAgIGlmICggcXN0cmljbXAobi0+Z2V0S2V5KCks a2V5KSA9PSAwICkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi0+Z2V0RGF0YSgpOwogICAg ICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKCBvcCA9 PSBvcF9yZXBsYWNlICkgewogICAgICAgIGlmICggdmVjW2luZGV4XSAhPSAwICkKICAgICAgICAg ICAgcmVtb3ZlX2FzY2lpKCBrZXkgKTsKICAgIH0KCiAgICBuID0gbmV3IFFBc2NpaUJ1Y2tldChj b3B5ayA/IHFzdHJkdXAoa2V5KSA6IGtleSxuZXdJdGVtKGQpLHZlY1tpbmRleF0pOwogICAgKHF0 X2NoZWNrX3BvaW50ZXIoKG4pPT0wLCJxZ2RpY3QuY3BwIiw0MTkpKTsKCiAgICBpZiAoIG4tPmdl dERhdGEoKSA9PSAwICkKICAgICAgICBxV2FybmluZyggIlFBc2NpaURpY3Q6IENhbm5vdCBpbnNl cnQgbnVsbCBpdGVtIiApOwoKICAgIHZlY1tpbmRleF0gPSBuOwogICAgbnVtSXRlbXMrKzsKICAg IHJldHVybiBuLT5nZXREYXRhKCk7Cn0KCgoKClFDb2xsZWN0aW9uOjpJdGVtIFFHRGljdDo6bG9v a19pbnQoIGxvbmcga2V5LCBRQ29sbGVjdGlvbjo6SXRlbSBkLCBpbnQgb3AgKQp7CiAgICBRSW50 QnVja2V0ICpuOwogICAgaW50IGluZGV4ID0gKGludCkoKHVsb25nKWtleSAlIHZsZW4pOwogICAg aWYgKCBvcCA9PSBvcF9maW5kICkgewogICAgICAgIGZvciAoIG49KFFJbnRCdWNrZXQqKXZlY1tp bmRleF07IG47CiAgICAgICAgICAgICAgbj0oUUludEJ1Y2tldCopbi0+Z2V0TmV4dCgpICkgewog ICAgICAgICAgICBpZiAoIG4tPmdldEtleSgpID09IGtleSApCiAgICAgICAgICAgICAgICByZXR1 cm4gbi0+Z2V0RGF0YSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlm ICggb3AgPT0gb3BfcmVwbGFjZSApIHsKICAgICAgICBpZiAoIHZlY1tpbmRleF0gIT0gMCApCiAg ICAgICAgICAgIHJlbW92ZV9pbnQoIGtleSApOwogICAgfQoKICAgIG4gPSBuZXcgUUludEJ1Y2tl dChrZXksbmV3SXRlbShkKSx2ZWNbaW5kZXhdKTsKICAgIChxdF9jaGVja19wb2ludGVyKChuKT09 MCwicWdkaWN0LmNwcCIsNDUwKSk7CgogICAgaWYgKCBuLT5nZXREYXRhKCkgPT0gMCApCiAgICAg ICAgcVdhcm5pbmcoICJRSW50RGljdDogQ2Fubm90IGluc2VydCBudWxsIGl0ZW0iICk7CgogICAg dmVjW2luZGV4XSA9IG47CiAgICBudW1JdGVtcysrOwogICAgcmV0dXJuIG4tPmdldERhdGEoKTsK fQoKCgoKUUNvbGxlY3Rpb246Okl0ZW0gUUdEaWN0Ojpsb29rX3B0ciggdm9pZCAqa2V5LCBRQ29s bGVjdGlvbjo6SXRlbSBkLCBpbnQgb3AgKQp7CiAgICBRUHRyQnVja2V0ICpuOwogICAgaW50IGlu ZGV4ID0gKGludCkoKHVsb25nKWtleSAlIHZsZW4pOwogICAgaWYgKCBvcCA9PSBvcF9maW5kICkg ewogICAgICAgIGZvciAoIG49KFFQdHJCdWNrZXQqKXZlY1tpbmRleF07IG47CiAgICAgICAgICAg ICAgbj0oUVB0ckJ1Y2tldCopbi0+Z2V0TmV4dCgpICkgewogICAgICAgICAgICBpZiAoIG4tPmdl dEtleSgpID09IGtleSApCiAgICAgICAgICAgICAgICByZXR1cm4gbi0+Z2V0RGF0YSgpOwogICAg ICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmICggb3AgPT0gb3BfcmVwbGFjZSAp IHsKICAgICAgICBpZiAoIHZlY1tpbmRleF0gIT0gMCApCiAgICAgICAgICAgIHJlbW92ZV9wdHIo IGtleSApOwogICAgfQoKICAgIG4gPSBuZXcgUVB0ckJ1Y2tldChrZXksbmV3SXRlbShkKSx2ZWNb aW5kZXhdKTsKICAgIChxdF9jaGVja19wb2ludGVyKChuKT09MCwicWdkaWN0LmNwcCIsNDgxKSk7 CgogICAgaWYgKCBuLT5nZXREYXRhKCkgPT0gMCApCiAgICAgICAgcVdhcm5pbmcoICJRUHRyRGlj dDogQ2Fubm90IGluc2VydCBudWxsIGl0ZW0iICk7CgogICAgdmVjW2luZGV4XSA9IG47CiAgICBu dW1JdGVtcysrOwogICAgcmV0dXJuIG4tPmdldERhdGEoKTsKfQojIDQ5OCAicWdkaWN0LmNwcCIK dm9pZCBRR0RpY3Q6OnJlc2l6ZSggdWludCBuZXdzaXplICkKewoKICAgIFFCYXNlQnVja2V0ICoq b2xkX3ZlYyA9IHZlYzsKICAgIHVpbnQgb2xkX3ZsZW4gPSB2bGVuOwogICAgYm9vbCBvbGRfY29w eWsgPSBjb3B5azsKCiAgICB2ZWMgPSBuZXcgUUJhc2VCdWNrZXQgKlt2bGVuID0gbmV3c2l6ZV07 CiAgICAocXRfY2hlY2tfcG9pbnRlcigodmVjKT09MCwicWdkaWN0LmNwcCIsNTA2KSk7CiAgICBt ZW1zZXQoIChjaGFyKil2ZWMsIDAsIHZsZW4qc2l6ZW9mKFFCYXNlQnVja2V0KikgKTsKICAgIG51 bUl0ZW1zID0gMDsKICAgIGNvcHlrID0gRkFMU0U7CgoKICAgIGZvciAoIHVpbnQgaW5kZXggPSAw OyBpbmRleCA8IG9sZF92bGVuOyBpbmRleCsrICkgewogICAgICAgIHN3aXRjaCAoIGtleXR5cGUg KSB7CiAgICAgICAgICAgIGNhc2UgU3RyaW5nS2V5OgogICAgICAgICAgICAgICAgewogICAgICAg ICAgICAgICAgICAgIFFTdHJpbmdCdWNrZXQgKm49KFFTdHJpbmdCdWNrZXQgKilvbGRfdmVjW2lu ZGV4XTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIG4gKSB7CiAgICAgICAgICAgICAgICAg ICAgICAgIGxvb2tfc3RyaW5nKCBuLT5nZXRLZXkoKSwgbi0+Z2V0RGF0YSgpLCBvcF9pbnNlcnQg KTsKICAgICAgICAgICAgICAgICAgICAgICAgUVN0cmluZ0J1Y2tldCAqdD0oUVN0cmluZ0J1Y2tl dCAqKW4tPmdldE5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG47CiAgICAg ICAgICAgICAgICAgICAgICAgIG4gPSB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAg ICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEFzY2lpS2V5 OgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFFBc2NpaUJ1Y2tldCAqbj0o UUFzY2lpQnVja2V0ICopb2xkX3ZlY1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgd2hpbGUg KCBuICkgewogICAgICAgICAgICAgICAgICAgICAgICBsb29rX2FzY2lpKCBuLT5nZXRLZXkoKSwg bi0+Z2V0RGF0YSgpLCBvcF9pbnNlcnQgKTsKICAgICAgICAgICAgICAgICAgICAgICAgUUFzY2lp QnVja2V0ICp0PShRQXNjaWlCdWNrZXQgKiluLT5nZXROZXh0KCk7CiAgICAgICAgICAgICAgICAg ICAgICAgIGRlbGV0ZSBuOwogICAgICAgICAgICAgICAgICAgICAgICBuID0gdDsKICAgICAgICAg ICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAg ICAgICAgICAgY2FzZSBJbnRLZXk6CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAg ICAgUUludEJ1Y2tldCAqbj0oUUludEJ1Y2tldCAqKW9sZF92ZWNbaW5kZXhdOwogICAgICAgICAg ICAgICAgICAgIHdoaWxlICggbiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9va19pbnQo IG4tPmdldEtleSgpLCBuLT5nZXREYXRhKCksIG9wX2luc2VydCApOwogICAgICAgICAgICAgICAg ICAgICAgICBRSW50QnVja2V0ICp0PShRSW50QnVja2V0ICopbi0+Z2V0TmV4dCgpOwogICAgICAg ICAgICAgICAgICAgICAgICBkZWxldGUgbjsKICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHQ7 CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg YnJlYWs7CiAgICAgICAgICAgIGNhc2UgUHRyS2V5OgogICAgICAgICAgICAgICAgewogICAgICAg ICAgICAgICAgICAgIFFQdHJCdWNrZXQgKm49KFFQdHJCdWNrZXQgKilvbGRfdmVjW2luZGV4XTsK ICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIG4gKSB7CiAgICAgICAgICAgICAgICAgICAgICAg IGxvb2tfcHRyKCBuLT5nZXRLZXkoKSwgbi0+Z2V0RGF0YSgpLCBvcF9pbnNlcnQgKTsKICAgICAg ICAgICAgICAgICAgICAgICAgUVB0ckJ1Y2tldCAqdD0oUVB0ckJ1Y2tldCAqKW4tPmdldE5leHQo KTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG47CiAgICAgICAgICAgICAgICAgICAg ICAgIG4gPSB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAg ICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGRlbGV0ZSBbXSBvbGRfdmVjOwoK CiAgICBjb3B5ayA9IG9sZF9jb3B5azsKCgogICAgaWYgKCBpdGVyYXRvcnMgJiYgaXRlcmF0b3Jz LT5jb3VudCgpICkgewogICAgICAgIFFHRGljdEl0ZXJhdG9yICppID0gaXRlcmF0b3JzLT5maXJz dCgpOwogICAgICAgIHdoaWxlICggaSApIHsKICAgICAgICAgICAgaS0+dG9GaXJzdCgpOwogICAg ICAgICAgICBpID0gaXRlcmF0b3JzLT5uZXh0KCk7CiAgICAgICAgfQogICAgfQp9CgoKCgoKCgp2 b2lkIFFHRGljdDo6dW5saW5rX2NvbW1vbiggaW50IGluZGV4LCBRQmFzZUJ1Y2tldCAqbm9kZSwg UUJhc2VCdWNrZXQgKnByZXYgKQp7CiAgICBpZiAoIGl0ZXJhdG9ycyAmJiBpdGVyYXRvcnMtPmNv dW50KCkgKSB7CiAgICAgICAgUUdEaWN0SXRlcmF0b3IgKmkgPSBpdGVyYXRvcnMtPmZpcnN0KCk7 CiAgICAgICAgd2hpbGUgKCBpICkgewogICAgICAgICAgICBpZiAoIGktPmN1ck5vZGUgPT0gbm9k ZSApCiAgICAgICAgICAgICAgICBpLT5vcGVyYXRvcisrKCk7CiAgICAgICAgICAgIGkgPSBpdGVy YXRvcnMtPm5leHQoKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoIHByZXYgKQogICAgICAgIHBy ZXYtPnNldE5leHQoIG5vZGUtPmdldE5leHQoKSApOwogICAgZWxzZQogICAgICAgIHZlY1tpbmRl eF0gPSBub2RlLT5nZXROZXh0KCk7CiAgICBudW1JdGVtcy0tOwp9CgpRU3RyaW5nQnVja2V0ICpR R0RpY3Q6OnVubGlua19zdHJpbmcoIGNvbnN0IFFTdHJpbmcgJmtleSwgUUNvbGxlY3Rpb246Okl0 ZW0gZCApCnsKICAgIGlmICggbnVtSXRlbXMgPT0gMCApCiAgICAgICAgcmV0dXJuIDA7CiAgICBR U3RyaW5nQnVja2V0ICpuOwogICAgUVN0cmluZ0J1Y2tldCAqcHJldiA9IDA7CiAgICBpbnQgaW5k ZXggPSBoYXNoS2V5U3RyaW5nKGtleSkgJSB2bGVuOwogICAgaWYgKCBjYXNlcyApIHsKICAgICAg ICBmb3IgKCBuPShRU3RyaW5nQnVja2V0Kil2ZWNbaW5kZXhdOyBuOwogICAgICAgICAgICAgIG49 KFFTdHJpbmdCdWNrZXQqKW4tPmdldE5leHQoKSApIHsKICAgICAgICAgICAgYm9vbCBmb3VuZCA9 IChrZXkgPT0gbi0+Z2V0S2V5KCkpOwogICAgICAgICAgICBpZiAoIGZvdW5kICYmIGQgKQogICAg ICAgICAgICAgICAgZm91bmQgPSAobi0+Z2V0RGF0YSgpID09IGQpOwogICAgICAgICAgICBpZiAo IGZvdW5kICkgewogICAgICAgICAgICAgICAgdW5saW5rX2NvbW1vbihpbmRleCxuLHByZXYpOwog ICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJldiA9 IG47CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBRU3RyaW5nIGsgPSBrZXkubG93ZXIo KTsKICAgICAgICBmb3IgKCBuPShRU3RyaW5nQnVja2V0Kil2ZWNbaW5kZXhdOyBuOwogICAgICAg ICAgICAgIG49KFFTdHJpbmdCdWNrZXQqKW4tPmdldE5leHQoKSApIHsKICAgICAgICAgICAgYm9v bCBmb3VuZCA9IChrID09IG4tPmdldEtleSgpLmxvd2VyKCkpOwogICAgICAgICAgICBpZiAoIGZv dW5kICYmIGQgKQogICAgICAgICAgICAgICAgZm91bmQgPSAobi0+Z2V0RGF0YSgpID09IGQpOwog ICAgICAgICAgICBpZiAoIGZvdW5kICkgewogICAgICAgICAgICAgICAgdW5saW5rX2NvbW1vbihp bmRleCxuLHByZXYpOwogICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgIH0KICAg ICAgICAgICAgcHJldiA9IG47CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0KClFBc2Np aUJ1Y2tldCAqUUdEaWN0Ojp1bmxpbmtfYXNjaWkoIGNvbnN0IGNoYXIgKmtleSwgUUNvbGxlY3Rp b246Okl0ZW0gZCApCnsKICAgIGlmICggbnVtSXRlbXMgPT0gMCApCiAgICAgICAgcmV0dXJuIDA7 CiAgICBRQXNjaWlCdWNrZXQgKm47CiAgICBRQXNjaWlCdWNrZXQgKnByZXYgPSAwOwogICAgaW50 IGluZGV4ID0gaGFzaEtleUFzY2lpKGtleSkgJSB2bGVuOwogICAgZm9yICggbj0oUUFzY2lpQnVj a2V0ICopdmVjW2luZGV4XTsgbjsgbj0oUUFzY2lpQnVja2V0ICopbi0+Z2V0TmV4dCgpICkgewog ICAgICAgIGJvb2wgZm91bmQgPSAoY2FzZXMgPyBxc3RyY21wKG4tPmdldEtleSgpLGtleSkKICAg ICAgICAgICAgICAgICAgICAgICA6IHFzdHJpY21wKG4tPmdldEtleSgpLGtleSkpID09IDA7CiAg ICAgICAgaWYgKCBmb3VuZCAmJiBkICkKICAgICAgICAgICAgZm91bmQgPSAobi0+Z2V0RGF0YSgp ID09IGQpOwogICAgICAgIGlmICggZm91bmQgKSB7CiAgICAgICAgICAgIHVubGlua19jb21tb24o aW5kZXgsbixwcmV2KTsKICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgfQogICAgICAgIHBy ZXYgPSBuOwogICAgfQogICAgcmV0dXJuIDA7Cn0KClFJbnRCdWNrZXQgKlFHRGljdDo6dW5saW5r X2ludCggbG9uZyBrZXksIFFDb2xsZWN0aW9uOjpJdGVtIGQgKQp7CiAgICBpZiAoIG51bUl0ZW1z ID09IDAgKQogICAgICAgIHJldHVybiAwOwogICAgUUludEJ1Y2tldCAqbjsKICAgIFFJbnRCdWNr ZXQgKnByZXYgPSAwOwogICAgaW50IGluZGV4ID0gKGludCkoKHVsb25nKWtleSAlIHZsZW4pOwog ICAgZm9yICggbj0oUUludEJ1Y2tldCAqKXZlY1tpbmRleF07IG47IG49KFFJbnRCdWNrZXQgKilu LT5nZXROZXh0KCkgKSB7CiAgICAgICAgYm9vbCBmb3VuZCA9IChuLT5nZXRLZXkoKSA9PSBrZXkp OwogICAgICAgIGlmICggZm91bmQgJiYgZCApCiAgICAgICAgICAgIGZvdW5kID0gKG4tPmdldERh dGEoKSA9PSBkKTsKICAgICAgICBpZiAoIGZvdW5kICkgewogICAgICAgICAgICB1bmxpbmtfY29t bW9uKGluZGV4LG4scHJldik7CiAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0KICAgICAg ICBwcmV2ID0gbjsKICAgIH0KICAgIHJldHVybiAwOwp9CgpRUHRyQnVja2V0ICpRR0RpY3Q6OnVu bGlua19wdHIoIHZvaWQgKmtleSwgUUNvbGxlY3Rpb246Okl0ZW0gZCApCnsKICAgIGlmICggbnVt SXRlbXMgPT0gMCApCiAgICAgICAgcmV0dXJuIDA7CiAgICBRUHRyQnVja2V0ICpuOwogICAgUVB0 ckJ1Y2tldCAqcHJldiA9IDA7CiAgICBpbnQgaW5kZXggPSAoaW50KSgodWxvbmcpa2V5ICUgdmxl bik7CiAgICBmb3IgKCBuPShRUHRyQnVja2V0ICopdmVjW2luZGV4XTsgbjsgbj0oUVB0ckJ1Y2tl dCAqKW4tPmdldE5leHQoKSApIHsKICAgICAgICBib29sIGZvdW5kID0gKG4tPmdldEtleSgpID09 IGtleSk7CiAgICAgICAgaWYgKCBmb3VuZCAmJiBkICkKICAgICAgICAgICAgZm91bmQgPSAobi0+ Z2V0RGF0YSgpID09IGQpOwogICAgICAgIGlmICggZm91bmQgKSB7CiAgICAgICAgICAgIHVubGlu a19jb21tb24oaW5kZXgsbixwcmV2KTsKICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgfQog ICAgICAgIHByZXYgPSBuOwogICAgfQogICAgcmV0dXJuIDA7Cn0KIyA3MDMgInFnZGljdC5jcHAi CmJvb2wgUUdEaWN0OjpyZW1vdmVfc3RyaW5nKCBjb25zdCBRU3RyaW5nICZrZXksIFFDb2xsZWN0 aW9uOjpJdGVtIGl0ZW0gKQp7CiAgICBRU3RyaW5nQnVja2V0ICpuID0gdW5saW5rX3N0cmluZygg a2V5LCBpdGVtICk7CiAgICBpZiAoIG4gKSB7CiAgICAgICAgZGVsZXRlSXRlbSggbi0+Z2V0RGF0 YSgpICk7CiAgICAgICAgZGVsZXRlIG47CiAgICAgICAgcmV0dXJuIFRSVUU7CiAgICB9IGVsc2Ug ewogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KfQoKCgoKYm9vbCBRR0RpY3Q6OnJlbW92ZV9h c2NpaSggY29uc3QgY2hhciAqa2V5LCBRQ29sbGVjdGlvbjo6SXRlbSBpdGVtICkKewogICAgUUFz Y2lpQnVja2V0ICpuID0gdW5saW5rX2FzY2lpKCBrZXksIGl0ZW0gKTsKICAgIGlmICggbiApIHsK ICAgICAgICBpZiAoIGNvcHlrICkKICAgICAgICAgICAgZGVsZXRlIFtdIChjaGFyICopbi0+Z2V0 S2V5KCk7CiAgICAgICAgZGVsZXRlSXRlbSggbi0+Z2V0RGF0YSgpICk7CiAgICAgICAgZGVsZXRl IG47CiAgICB9CiAgICByZXR1cm4gbiAhPSAwOwp9CgoKCgpib29sIFFHRGljdDo6cmVtb3ZlX2lu dCggbG9uZyBrZXksIFFDb2xsZWN0aW9uOjpJdGVtIGl0ZW0gKQp7CiAgICBRSW50QnVja2V0ICpu ID0gdW5saW5rX2ludCgga2V5LCBpdGVtICk7CiAgICBpZiAoIG4gKSB7CiAgICAgICAgZGVsZXRl SXRlbSggbi0+Z2V0RGF0YSgpICk7CiAgICAgICAgZGVsZXRlIG47CiAgICB9CiAgICByZXR1cm4g biAhPSAwOwp9CgoKCgpib29sIFFHRGljdDo6cmVtb3ZlX3B0ciggdm9pZCAqa2V5LCBRQ29sbGVj dGlvbjo6SXRlbSBpdGVtICkKewogICAgUVB0ckJ1Y2tldCAqbiA9IHVubGlua19wdHIoIGtleSwg aXRlbSApOwogICAgaWYgKCBuICkgewogICAgICAgIGRlbGV0ZUl0ZW0oIG4tPmdldERhdGEoKSAp OwogICAgICAgIGRlbGV0ZSBuOwogICAgfQogICAgcmV0dXJuIG4gIT0gMDsKfQoKCgoKUUNvbGxl Y3Rpb246Okl0ZW0gUUdEaWN0Ojp0YWtlX3N0cmluZyggY29uc3QgUVN0cmluZyAma2V5ICkKewog ICAgUVN0cmluZ0J1Y2tldCAqbiA9IHVubGlua19zdHJpbmcoIGtleSApOwogICAgSXRlbSBkOwog ICAgaWYgKCBuICkgewogICAgICAgIGQgPSBuLT5nZXREYXRhKCk7CiAgICAgICAgZGVsZXRlIG47 CiAgICB9IGVsc2UgewogICAgICAgIGQgPSAwOwogICAgfQogICAgcmV0dXJuIGQ7Cn0KCgoKClFD b2xsZWN0aW9uOjpJdGVtIFFHRGljdDo6dGFrZV9hc2NpaSggY29uc3QgY2hhciAqa2V5ICkKewog ICAgUUFzY2lpQnVja2V0ICpuID0gdW5saW5rX2FzY2lpKCBrZXkgKTsKICAgIEl0ZW0gZDsKICAg IGlmICggbiApIHsKICAgICAgICBpZiAoIGNvcHlrICkKICAgICAgICAgICAgZGVsZXRlIFtdIChj aGFyICopbi0+Z2V0S2V5KCk7CiAgICAgICAgZCA9IG4tPmdldERhdGEoKTsKICAgICAgICBkZWxl dGUgbjsKICAgIH0gZWxzZSB7CiAgICAgICAgZCA9IDA7CiAgICB9CiAgICByZXR1cm4gZDsKfQoK CgoKUUNvbGxlY3Rpb246Okl0ZW0gUUdEaWN0Ojp0YWtlX2ludCggbG9uZyBrZXkgKQp7CiAgICBR SW50QnVja2V0ICpuID0gdW5saW5rX2ludCgga2V5ICk7CiAgICBJdGVtIGQ7CiAgICBpZiAoIG4g KSB7CiAgICAgICAgZCA9IG4tPmdldERhdGEoKTsKICAgICAgICBkZWxldGUgbjsKICAgIH0gZWxz ZSB7CiAgICAgICAgZCA9IDA7CiAgICB9CiAgICByZXR1cm4gZDsKfQoKCgoKUUNvbGxlY3Rpb246 Okl0ZW0gUUdEaWN0Ojp0YWtlX3B0ciggdm9pZCAqa2V5ICkKewogICAgUVB0ckJ1Y2tldCAqbiA9 IHVubGlua19wdHIoIGtleSApOwogICAgSXRlbSBkOwogICAgaWYgKCBuICkgewogICAgICAgIGQg PSBuLT5nZXREYXRhKCk7CiAgICAgICAgZGVsZXRlIG47CiAgICB9IGVsc2UgewogICAgICAgIGQg PSAwOwogICAgfQogICAgcmV0dXJuIGQ7Cn0KCgoKCgoKCnZvaWQgUUdEaWN0OjpjbGVhcigpCnsK ICAgIGlmICggIW51bUl0ZW1zICkKICAgICAgICByZXR1cm47CiAgICBudW1JdGVtcyA9IDA7CiAg ICBmb3IgKCB1aW50IGo9MDsgajx2bGVuOyBqKysgKSB7CiAgICAgICAgaWYgKCB2ZWNbal0gKSB7 CiAgICAgICAgICAgIHN3aXRjaCAoIGtleXR5cGUgKSB7CiAgICAgICAgICAgICAgICBjYXNlIFN0 cmluZ0tleToKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFFT dHJpbmdCdWNrZXQgKm49KFFTdHJpbmdCdWNrZXQgKil2ZWNbal07CiAgICAgICAgICAgICAgICAg ICAgICAgIHdoaWxlICggbiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFTdHJpbmdC dWNrZXQgKm5leHQgPSAoUVN0cmluZ0J1Y2tldCopbi0+Z2V0TmV4dCgpOwogICAgICAgICAgICAg ICAgICAgICAgICAgICAgZGVsZXRlSXRlbSggbi0+Z2V0RGF0YSgpICk7CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICBkZWxldGUgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBu ZXh0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAg ICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBBc2NpaUtleToKICAg ICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFFBc2NpaUJ1Y2tldCAq bj0oUUFzY2lpQnVja2V0ICopdmVjW2pdOwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAo IG4gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQXNjaWlCdWNrZXQgKm5leHQgPSAo UUFzY2lpQnVja2V0KiluLT5nZXROZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBp ZiAoIGNvcHlrICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgW10gKGNo YXIgKiluLT5nZXRLZXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW0o IG4tPmdldERhdGEoKSApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG47CiAg ICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbmV4dDsKICAgICAgICAgICAgICAgICAgICAg ICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAg ICAgICAgICAgICAgIGNhc2UgSW50S2V5OgogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAg ICAgICAgICAgICAgICAgUUludEJ1Y2tldCAqbj0oUUludEJ1Y2tldCAqKXZlY1tqXTsKICAgICAg ICAgICAgICAgICAgICAgICAgd2hpbGUgKCBuICkgewogICAgICAgICAgICAgICAgICAgICAgICAg ICAgUUludEJ1Y2tldCAqbmV4dCA9IChRSW50QnVja2V0KiluLT5nZXROZXh0KCk7CiAgICAgICAg ICAgICAgICAgICAgICAgICAgICBkZWxldGVJdGVtKCBuLT5nZXREYXRhKCkgKTsKICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAg biA9IG5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9 CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFB0cktleToK ICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFFQdHJCdWNrZXQg Km49KFFQdHJCdWNrZXQgKil2ZWNbal07CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgg biApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQdHJCdWNrZXQgKm5leHQgPSAoUVB0 ckJ1Y2tldCopbi0+Z2V0TmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRl SXRlbSggbi0+Z2V0RGF0YSgpICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUg bjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBuZXh0OwogICAgICAgICAgICAgICAg ICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFr OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZlY1tqXSA9IDA7CiAgICAgICAgfQogICAgfQog ICAgaWYgKCBpdGVyYXRvcnMgJiYgaXRlcmF0b3JzLT5jb3VudCgpICkgewogICAgICAgIFFHRGlj dEl0ZXJhdG9yICppID0gaXRlcmF0b3JzLT5maXJzdCgpOwogICAgICAgIHdoaWxlICggaSApIHsK ICAgICAgICAgICAgaS0+Y3VyTm9kZSA9IDA7CiAgICAgICAgICAgIGkgPSBpdGVyYXRvcnMtPm5l eHQoKTsKICAgICAgICB9CiAgICB9Cn0KCgoKCgoKCnZvaWQgUUdEaWN0OjpzdGF0aXN0aWNzKCkg Y29uc3QKewoKICAgIFFTdHJpbmcgbGluZTsKICAgIGxpbmUuZmlsbCggJy0nLCA2MCApOwogICAg ZG91YmxlIHJlYWwsIGlkZWFsOwogICAgcURlYnVnKCBsaW5lLmFzY2lpKCkgKTsKICAgIHFEZWJ1 ZyggIkRJQ1RJT05BUlkgU1RBVElTVElDUzoiICk7CiAgICBpZiAoIGNvdW50KCkgPT0gMCApIHsK ICAgICAgICBxRGVidWcoICJFbXB0eSEiICk7CiAgICAgICAgcURlYnVnKCBsaW5lLmFzY2lpKCkg KTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICByZWFsID0gMC4wOwogICAgaWRlYWwgPSAoZmxv YXQpY291bnQoKS8oMi4wKnNpemUoKSkqKGNvdW50KCkrMi4wKnNpemUoKS0xKTsKICAgIHVpbnQg aSA9IDA7CiAgICB3aGlsZSAoIGk8c2l6ZSgpICkgewogICAgICAgIFFCYXNlQnVja2V0ICpuID0g dmVjW2ldOwogICAgICAgIGludCBiID0gMDsKICAgICAgICB3aGlsZSAoIG4gKSB7CiAgICAgICAg ICAgIGIrKzsKICAgICAgICAgICAgbiA9IG4tPmdldE5leHQoKTsKICAgICAgICB9CiAgICAgICAg cmVhbCA9IHJlYWwgKyAoZG91YmxlKWIgKiAoKGRvdWJsZSliKzEuMCkvMi4wOwogICAgICAgIGNo YXIgYnVmWzgwXSwgKnBidWY7CiAgICAgICAgaWYgKCBiID4gNzggKQogICAgICAgICAgICBiID0g Nzg7CiAgICAgICAgcGJ1ZiA9IGJ1ZjsKICAgICAgICB3aGlsZSAoIGItLSApCiAgICAgICAgICAg ICpwYnVmKysgPSAnKic7CiAgICAgICAgKnBidWYgPSAnXDAnOwogICAgICAgIHFEZWJ1ZyggYnVm ICk7CiAgICAgICAgaSsrOwogICAgfQogICAgcURlYnVnKCAiQXJyYXkgc2l6ZSA9ICVkIiwgc2l6 ZSgpICk7CiAgICBxRGVidWcoICIjIGl0ZW1zICAgID0gJWQiLCBjb3VudCgpICk7CiAgICBxRGVi dWcoICJSZWFsIGRpc3QgID0gJWciLCByZWFsICk7CiAgICBxRGVidWcoICJSYW5kIGRpc3QgID0g JWciLCBpZGVhbCApOwogICAgcURlYnVnKCAiUmVhbC9SYW5kICA9ICVnIiwgcmVhbC9pZGVhbCAp OwogICAgcURlYnVnKCBsaW5lLmFzY2lpKCkgKTsKCn0KCgoKCgoKUURhdGFTdHJlYW0gJm9wZXJh dG9yPj4oIFFEYXRhU3RyZWFtICZzLCBRR0RpY3QgJmRpY3QgKQp7CiAgICByZXR1cm4gZGljdC5y ZWFkKCBzICk7Cn0KClFEYXRhU3RyZWFtICZvcGVyYXRvcjw8KCBRRGF0YVN0cmVhbSAmcywgY29u c3QgUUdEaWN0ICZkaWN0ICkKewogICAgcmV0dXJuIGRpY3Qud3JpdGUoIHMgKTsKfQojIDk2OCAi cWdkaWN0LmNwcCIKUURhdGFTdHJlYW0gJlFHRGljdDo6cmVhZCggUURhdGFTdHJlYW0gJnMgKQp7 CiAgICB1aW50IG51bTsKICAgIHMgPj4gbnVtOwogICAgY2xlYXIoKTsKICAgIHdoaWxlICggbnVt LS0gKSB7CiAgICAgICAgSXRlbSBkOwogICAgICAgIHN3aXRjaCAoIGtleXR5cGUgKSB7CiAgICAg ICAgICAgIGNhc2UgU3RyaW5nS2V5OgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAg ICAgIFFTdHJpbmcgazsKICAgICAgICAgICAgICAgICAgICBzID4+IGs7CiAgICAgICAgICAgICAg ICAgICAgcmVhZCggcywgZCApOwogICAgICAgICAgICAgICAgICAgIGxvb2tfc3RyaW5nKCBrLCBk LCBvcF9pbnNlcnQgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwog ICAgICAgICAgICBjYXNlIEFzY2lpS2V5OgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAg ICAgICAgIGNoYXIgKms7CiAgICAgICAgICAgICAgICAgICAgcyA+PiBrOwogICAgICAgICAgICAg ICAgICAgIHJlYWQoIHMsIGQgKTsKICAgICAgICAgICAgICAgICAgICBsb29rX2FzY2lpKCBrLCBk LCBvcF9pbnNlcnQgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIGNvcHlrICkKICAgICAgICAg ICAgICAgICAgICAgICAgZGVsZXRlIFtdIGs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg ICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBJbnRLZXk6CiAgICAgICAgICAgICAgICB7CiAg ICAgICAgICAgICAgICAgICAgUV9VSU5UMzIgazsKICAgICAgICAgICAgICAgICAgICBzID4+IGs7 CiAgICAgICAgICAgICAgICAgICAgcmVhZCggcywgZCApOwogICAgICAgICAgICAgICAgICAgIGxv b2tfaW50KCBrLCBkLCBvcF9pbnNlcnQgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg ICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFB0cktleToKICAgICAgICAgICAgICAgIHsKICAg ICAgICAgICAgICAgICAgICBRX1VJTlQzMiBrOwogICAgICAgICAgICAgICAgICAgIHMgPj4gazsK ICAgICAgICAgICAgICAgICAgICByZWFkKCBzLCBkICk7CgoKCgogICAgICAgICAgICAgICAgICAg IGlmICggayApCiAgICAgICAgICAgICAgICAgICAgICAgIGxvb2tfcHRyKCAodm9pZCAqKWssIGQs IG9wX2luc2VydCApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAg ICAgICAgfQogICAgfQogICAgcmV0dXJuIHM7Cn0KCgoKCgoKUURhdGFTdHJlYW0mIFFHRGljdDo6 d3JpdGUoIFFEYXRhU3RyZWFtICZzICkgY29uc3QKewogICAgcyA8PCBjb3VudCgpOwogICAgdWlu dCBpID0gMDsKICAgIHdoaWxlICggaTxzaXplKCkgKSB7CiAgICAgICAgUUJhc2VCdWNrZXQgKm4g PSB2ZWNbaV07CiAgICAgICAgd2hpbGUgKCBuICkgewogICAgICAgICAgICBzd2l0Y2ggKCBrZXl0 eXBlICkgewogICAgICAgICAgICAgICAgY2FzZSBTdHJpbmdLZXk6CiAgICAgICAgICAgICAgICAg ICAgcyA8PCAoKFFTdHJpbmdCdWNrZXQqKW4pLT5nZXRLZXkoKTsKICAgICAgICAgICAgICAgICAg ICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgQXNjaWlLZXk6CiAgICAgICAgICAgICAgICAg ICAgcyA8PCAoKFFBc2NpaUJ1Y2tldCopbiktPmdldEtleSgpOwogICAgICAgICAgICAgICAgICAg IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBJbnRLZXk6CiAgICAgICAgICAgICAgICAgICAg cyA8PCAoUV9VSU5UMzIpKChRSW50QnVja2V0KiluKS0+Z2V0S2V5KCk7CiAgICAgICAgICAgICAg ICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFB0cktleToKICAgICAgICAgICAgICAg ICAgICBzIDw8IChRX1VJTlQzMikwOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAg ICAgICB9CiAgICAgICAgICAgIHdyaXRlKCBzLCBuLT5nZXREYXRhKCkgKTsKICAgICAgICAgICAg biA9IG4tPmdldE5leHQoKTsKICAgICAgICB9CiAgICAgICAgaSsrOwogICAgfQogICAgcmV0dXJu IHM7Cn0KIyAxMDcyICJxZ2RpY3QuY3BwIgpRR0RpY3RJdGVyYXRvcjo6UUdEaWN0SXRlcmF0b3Io IGNvbnN0IFFHRGljdCAmZCApCnsKICAgIGRpY3QgPSAoUUdEaWN0ICopJmQ7CiAgICB0b0ZpcnN0 KCk7CiAgICBpZiAoICFkaWN0LT5pdGVyYXRvcnMgKSB7CiAgICAgICAgZGljdC0+aXRlcmF0b3Jz ID0gbmV3IFFHREl0TGlzdDsKICAgICAgICAocXRfY2hlY2tfcG9pbnRlcigoZGljdC0+aXRlcmF0 b3JzKT09MCwicWdkaWN0LmNwcCIsMTA3OCkpOwogICAgfQogICAgZGljdC0+aXRlcmF0b3JzLT5h cHBlbmQoIHRoaXMgKTsKfQoKCgoKCgpRR0RpY3RJdGVyYXRvcjo6UUdEaWN0SXRlcmF0b3IoIGNv bnN0IFFHRGljdEl0ZXJhdG9yICZpdCApCnsKICAgIGRpY3QgPSBpdC5kaWN0OwogICAgY3VyTm9k ZSA9IGl0LmN1ck5vZGU7CiAgICBjdXJJbmRleCA9IGl0LmN1ckluZGV4OwogICAgaWYgKCBkaWN0 ICkKICAgICAgICBkaWN0LT5pdGVyYXRvcnMtPmFwcGVuZCggdGhpcyApOwp9CgoKCgoKCgpRR0Rp Y3RJdGVyYXRvciAmUUdEaWN0SXRlcmF0b3I6Om9wZXJhdG9yPSggY29uc3QgUUdEaWN0SXRlcmF0 b3IgJml0ICkKewogICAgaWYgKCBkaWN0ICkKICAgICAgICBkaWN0LT5pdGVyYXRvcnMtPnJlbW92 ZVJlZiggdGhpcyApOwogICAgZGljdCA9IGl0LmRpY3Q7CiAgICBjdXJOb2RlID0gaXQuY3VyTm9k ZTsKICAgIGN1ckluZGV4ID0gaXQuY3VySW5kZXg7CiAgICBpZiAoIGRpY3QgKQogICAgICAgIGRp Y3QtPml0ZXJhdG9ycy0+YXBwZW5kKCB0aGlzICk7CiAgICByZXR1cm4gKnRoaXM7Cn0KCgoKCgoK UUdEaWN0SXRlcmF0b3I6On5RR0RpY3RJdGVyYXRvcigpCnsKICAgIGlmICggZGljdCApCiAgICAg ICAgZGljdC0+aXRlcmF0b3JzLT5yZW1vdmVSZWYoIHRoaXMgKTsKfQoKCgoKCgoKUUNvbGxlY3Rp b246Okl0ZW0gUUdEaWN0SXRlcmF0b3I6OnRvRmlyc3QoKQp7CiAgICBpZiAoICFkaWN0ICkgewoK ICAgICAgICBxV2FybmluZyggIlFHRGljdEl0ZXJhdG9yOjp0b0ZpcnN0OiBEaWN0aW9uYXJ5IGhh cyBiZWVuIGRlbGV0ZWQiICk7CgogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKCBkaWN0 LT5jb3VudCgpID09IDAgKSB7CiAgICAgICAgY3VyTm9kZSA9IDA7CiAgICAgICAgcmV0dXJuIDA7 CiAgICB9CiAgICByZWdpc3RlciB1aW50IGkgPSAwOwogICAgcmVnaXN0ZXIgUUJhc2VCdWNrZXQg Kip2ID0gZGljdC0+dmVjOwogICAgd2hpbGUgKCAhKCp2KyspICkKICAgICAgICBpKys7CiAgICBj dXJOb2RlID0gZGljdC0+dmVjW2ldOwogICAgY3VySW5kZXggPSBpOwogICAgcmV0dXJuIGN1ck5v ZGUtPmdldERhdGEoKTsKfQoKCgoKCgoKUUNvbGxlY3Rpb246Okl0ZW0gUUdEaWN0SXRlcmF0b3I6 Om9wZXJhdG9yKCkoKQp7CiAgICBpZiAoICFkaWN0ICkgewoKICAgICAgICBxV2FybmluZyggIlFH RGljdEl0ZXJhdG9yOjpvcGVyYXRvcigpOiBEaWN0aW9uYXJ5IGhhcyBiZWVuIGRlbGV0ZWQiICk7 CgogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKCAhY3VyTm9kZSApCiAgICAgICAgcmV0 dXJuIDA7CiAgICBRQ29sbGVjdGlvbjo6SXRlbSBkID0gY3VyTm9kZS0+Z2V0RGF0YSgpOwogICAg dGhpcy0+b3BlcmF0b3IrKygpOwogICAgcmV0dXJuIGQ7Cn0KCgoKCgoKUUNvbGxlY3Rpb246Okl0 ZW0gUUdEaWN0SXRlcmF0b3I6Om9wZXJhdG9yKysoKQp7CiAgICBpZiAoICFkaWN0ICkgewoKICAg ICAgICBxV2FybmluZyggIlFHRGljdEl0ZXJhdG9yOjpvcGVyYXRvcisrOiBEaWN0aW9uYXJ5IGhh cyBiZWVuIGRlbGV0ZWQiICk7CgogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKCAhY3Vy Tm9kZSApCiAgICAgICAgcmV0dXJuIDA7CiAgICBjdXJOb2RlID0gY3VyTm9kZS0+Z2V0TmV4dCgp OwogICAgaWYgKCAhY3VyTm9kZSApIHsKICAgICAgICByZWdpc3RlciB1aW50IGkgPSBjdXJJbmRl eCArIDE7CiAgICAgICAgcmVnaXN0ZXIgUUJhc2VCdWNrZXQgKip2ID0gJmRpY3QtPnZlY1tpXTsK ICAgICAgICB3aGlsZSAoIGkgPCBkaWN0LT5zaXplKCkgJiYgISgqdisrKSApCiAgICAgICAgICAg IGkrKzsKICAgICAgICBpZiAoIGkgPT0gZGljdC0+c2l6ZSgpICkgewogICAgICAgICAgICBjdXJO b2RlID0gMDsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGN1ck5vZGUg PSBkaWN0LT52ZWNbaV07CiAgICAgICAgY3VySW5kZXggPSBpOwogICAgfQogICAgcmV0dXJuIGN1 ck5vZGUtPmdldERhdGEoKTsKfQoKCgoKCgpRQ29sbGVjdGlvbjo6SXRlbSBRR0RpY3RJdGVyYXRv cjo6b3BlcmF0b3IrPSggdWludCBqdW1wcyApCnsKICAgIHdoaWxlICggY3VyTm9kZSAmJiBqdW1w cy0tICkKICAgICAgICBvcGVyYXRvcisrKCk7CiAgICByZXR1cm4gY3VyTm9kZSA/IGN1ck5vZGUt PmdldERhdGEoKSA6IDA7Cn0K